phydm_antdiv.c 227 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
  17. *
  18. *
  19. ******************************************************************************/
  20. /* ************************************************************
  21. * include files
  22. * ************************************************************ */
  23. #include "mp_precomp.h"
  24. #include "phydm_precomp.h"
  25. /* ******************************************************
  26. * when antenna test utility is on or some testing need to disable antenna diversity
  27. * call this function to disable all ODM related mechanisms which will switch antenna.
  28. * ****************************************************** */
  29. void
  30. odm_stop_antenna_switch_dm(
  31. void *p_dm_void
  32. )
  33. {
  34. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  35. /* disable ODM antenna diversity */
  36. p_dm_odm->support_ability &= ~ODM_BB_ANT_DIV;
  37. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("STOP Antenna Diversity\n"));
  38. }
  39. void
  40. phydm_enable_antenna_diversity(
  41. void *p_dm_void
  42. )
  43. {
  44. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  45. p_dm_odm->support_ability |= ODM_BB_ANT_DIV;
  46. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("AntDiv is enabled & Re-Init AntDiv\n"));
  47. odm_antenna_diversity_init(p_dm_odm);
  48. }
  49. void
  50. odm_set_ant_config(
  51. void *p_dm_void,
  52. u8 ant_setting /* 0=A, 1=B, 2=C, .... */
  53. )
  54. {
  55. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  56. if (p_dm_odm->support_ic_type == ODM_RTL8723B) {
  57. if (ant_setting == 0) /* ant A*/
  58. odm_set_bb_reg(p_dm_odm, 0x948, MASKDWORD, 0x00000000);
  59. else if (ant_setting == 1)
  60. odm_set_bb_reg(p_dm_odm, 0x948, MASKDWORD, 0x00000280);
  61. } else if (p_dm_odm->support_ic_type == ODM_RTL8723D) {
  62. if (ant_setting == 0) /* ant A*/
  63. odm_set_bb_reg(p_dm_odm, 0x948, MASKLWORD, 0x0000);
  64. else if (ant_setting == 1)
  65. odm_set_bb_reg(p_dm_odm, 0x948, MASKLWORD, 0x0280);
  66. }
  67. }
  68. /* ****************************************************** */
  69. void
  70. odm_sw_ant_div_rest_after_link(
  71. void *p_dm_void
  72. )
  73. {
  74. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  75. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  76. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  77. u32 i;
  78. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV) {
  79. p_dm_swat_table->try_flag = SWAW_STEP_INIT;
  80. p_dm_swat_table->rssi_trying = 0;
  81. p_dm_swat_table->double_chk_flag = 0;
  82. p_dm_fat_table->rx_idle_ant = MAIN_ANT;
  83. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  84. for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)
  85. phydm_antdiv_reset_statistic(p_dm_odm, i);
  86. #endif
  87. }
  88. }
  89. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  90. void
  91. phydm_antdiv_reset_statistic(
  92. void *p_dm_void,
  93. u32 macid
  94. )
  95. {
  96. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  97. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  98. p_dm_fat_table->main_ant_sum[macid] = 0;
  99. p_dm_fat_table->aux_ant_sum[macid] = 0;
  100. p_dm_fat_table->main_ant_cnt[macid] = 0;
  101. p_dm_fat_table->aux_ant_cnt[macid] = 0;
  102. p_dm_fat_table->main_ant_sum_cck[macid] = 0;
  103. p_dm_fat_table->aux_ant_sum_cck[macid] = 0;
  104. p_dm_fat_table->main_ant_cnt_cck[macid] = 0;
  105. p_dm_fat_table->aux_ant_cnt_cck[macid] = 0;
  106. }
  107. void
  108. odm_ant_div_on_off(
  109. void *p_dm_void,
  110. u8 swch
  111. )
  112. {
  113. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  114. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  115. if (p_dm_fat_table->ant_div_on_off != swch) {
  116. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV)
  117. return;
  118. if (p_dm_odm->support_ic_type & ODM_N_ANTDIV_SUPPORT) {
  119. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) N-Series HW-AntDiv block\n", (swch == ANTDIV_ON) ? "ON" : "OFF"));
  120. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(7), swch);
  121. odm_set_bb_reg(p_dm_odm, 0xa00, BIT(15), swch);
  122. #if (RTL8723D_SUPPORT == 1)
  123. /*Mingzhi 2017-05-08*/
  124. if (p_dm_odm->support_ic_type == ODM_RTL8723D) {
  125. if (swch == ANTDIV_ON) {
  126. odm_set_bb_reg(p_dm_odm, 0xce0, BIT(1), 1);
  127. odm_set_bb_reg(p_dm_odm, 0x948, BIT(6), 1); /*1:HW ctrl 0:SW ctrl*/
  128. } else {
  129. odm_set_bb_reg(p_dm_odm, 0xce0, BIT(1), 0);
  130. odm_set_bb_reg(p_dm_odm, 0x948, BIT(6), 0); /*1:HW ctrl 0:SW ctrl*/
  131. }
  132. }
  133. #endif
  134. } else if (p_dm_odm->support_ic_type & ODM_AC_ANTDIV_SUPPORT) {
  135. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) AC-Series HW-AntDiv block\n", (swch == ANTDIV_ON) ? "ON" : "OFF"));
  136. if (p_dm_odm->support_ic_type & (ODM_RTL8812 | ODM_RTL8822B)) {
  137. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(7), swch); /* OFDM AntDiv function block enable */
  138. odm_set_bb_reg(p_dm_odm, 0xa00, BIT(15), swch); /* CCK AntDiv function block enable */
  139. } else {
  140. odm_set_bb_reg(p_dm_odm, 0x8D4, BIT(24), swch); /* OFDM AntDiv function block enable */
  141. if ((p_dm_odm->cut_version >= ODM_CUT_C) && (p_dm_odm->support_ic_type == ODM_RTL8821) && (p_dm_odm->ant_div_type != S0S1_SW_ANTDIV)) {
  142. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) CCK HW-AntDiv block\n", (swch == ANTDIV_ON) ? "ON" : "OFF"));
  143. odm_set_bb_reg(p_dm_odm, 0x800, BIT(25), swch);
  144. odm_set_bb_reg(p_dm_odm, 0xA00, BIT(15), swch); /* CCK AntDiv function block enable */
  145. } else if (p_dm_odm->support_ic_type == ODM_RTL8821C) {
  146. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) CCK HW-AntDiv block\n", (swch == ANTDIV_ON) ? "ON" : "OFF"));
  147. odm_set_bb_reg(p_dm_odm, 0x800, BIT(25), swch);
  148. odm_set_bb_reg(p_dm_odm, 0xA00, BIT(15), swch); /* CCK AntDiv function block enable */
  149. }
  150. }
  151. }
  152. }
  153. p_dm_fat_table->ant_div_on_off = swch;
  154. }
  155. void
  156. phydm_fast_training_enable(
  157. void *p_dm_void,
  158. u8 swch
  159. )
  160. {
  161. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  162. u8 enable;
  163. if (swch == FAT_ON)
  164. enable = 1;
  165. else
  166. enable = 0;
  167. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Fast ant Training_en = ((%d))\n", enable));
  168. if (p_dm_odm->support_ic_type == ODM_RTL8188E) {
  169. odm_set_bb_reg(p_dm_odm, 0xe08, BIT(16), enable); /*enable fast training*/
  170. /**/
  171. } else if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  172. odm_set_bb_reg(p_dm_odm, 0xB34, BIT(28), enable); /*enable fast training (path-A)*/
  173. /*odm_set_bb_reg(p_dm_odm, 0xB34, BIT(29), enable);*/ /*enable fast training (path-B)*/
  174. } else if (p_dm_odm->support_ic_type & (ODM_RTL8821 | ODM_RTL8822B)) {
  175. odm_set_bb_reg(p_dm_odm, 0x900, BIT(19), enable); /*enable fast training */
  176. /**/
  177. }
  178. }
  179. void
  180. phydm_keep_rx_ack_ant_by_tx_ant_time(
  181. void *p_dm_void,
  182. u32 time
  183. )
  184. {
  185. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  186. /* Timming issue: keep Rx ant after tx for ACK ( time x 3.2 mu sec)*/
  187. if (p_dm_odm->support_ic_type & ODM_N_ANTDIV_SUPPORT) {
  188. odm_set_bb_reg(p_dm_odm, 0xE20, BIT(23) | BIT(22) | BIT(21) | BIT(20), time);
  189. /**/
  190. } else if (p_dm_odm->support_ic_type & ODM_AC_ANTDIV_SUPPORT) {
  191. odm_set_bb_reg(p_dm_odm, 0x818, BIT(23) | BIT(22) | BIT(21) | BIT(20), time);
  192. /**/
  193. }
  194. }
  195. void
  196. odm_tx_by_tx_desc_or_reg(
  197. void *p_dm_void,
  198. u8 swch
  199. )
  200. {
  201. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  202. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  203. u8 enable;
  204. if (p_dm_fat_table->b_fix_tx_ant == NO_FIX_TX_ANT)
  205. enable = (swch == TX_BY_DESC) ? 1 : 0;
  206. else
  207. enable = 0;/*Force TX by Reg*/
  208. if (p_dm_odm->ant_div_type != CGCS_RX_HW_ANTDIV) {
  209. if (p_dm_odm->support_ic_type & ODM_N_ANTDIV_SUPPORT)
  210. odm_set_bb_reg(p_dm_odm, 0x80c, BIT(21), enable);
  211. else if (p_dm_odm->support_ic_type & ODM_AC_ANTDIV_SUPPORT)
  212. odm_set_bb_reg(p_dm_odm, 0x900, BIT(18), enable);
  213. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[AntDiv] TX_Ant_BY (( %s ))\n", (enable == TX_BY_DESC) ? "DESC" : "REG"));
  214. }
  215. }
  216. void
  217. odm_update_rx_idle_ant(
  218. void *p_dm_void,
  219. u8 ant
  220. )
  221. {
  222. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  223. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  224. u32 default_ant, optional_ant, value32, default_tx_ant;
  225. if (p_dm_fat_table->rx_idle_ant != ant) {
  226. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] rx_idle_ant =%s\n", (ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  227. if (!(p_dm_odm->support_ic_type & ODM_RTL8723B))
  228. p_dm_fat_table->rx_idle_ant = ant;
  229. if (ant == MAIN_ANT) {
  230. default_ant = ANT1_2G;
  231. optional_ant = ANT2_2G;
  232. } else {
  233. default_ant = ANT2_2G;
  234. optional_ant = ANT1_2G;
  235. }
  236. if (p_dm_fat_table->b_fix_tx_ant != NO_FIX_TX_ANT)
  237. default_tx_ant = (p_dm_fat_table->b_fix_tx_ant == FIX_TX_AT_MAIN) ? 0 : 1;
  238. else
  239. default_tx_ant = default_ant;
  240. if (p_dm_odm->support_ic_type & ODM_N_ANTDIV_SUPPORT) {
  241. if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  242. odm_set_bb_reg(p_dm_odm, 0xB38, BIT(5) | BIT4 | BIT3, default_ant); /* Default RX */
  243. odm_set_bb_reg(p_dm_odm, 0xB38, BIT(8) | BIT7 | BIT6, optional_ant); /* Optional RX */
  244. odm_set_bb_reg(p_dm_odm, 0x860, BIT(14) | BIT13 | BIT12, default_ant); /* Default TX */
  245. }
  246. #if (RTL8723B_SUPPORT == 1)
  247. else if (p_dm_odm->support_ic_type == ODM_RTL8723B) {
  248. value32 = odm_get_bb_reg(p_dm_odm, 0x948, 0xFFF);
  249. if (value32 != 0x280)
  250. odm_update_rx_idle_ant_8723b(p_dm_odm, ant, default_ant, optional_ant);
  251. else
  252. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to 0x948 = 0x280\n"));
  253. }
  254. #endif
  255. #if (RTL8723D_SUPPORT == 1) /*Mingzhi 2017-05-08*/
  256. else if (p_dm_odm->support_ic_type == ODM_RTL8723D) {
  257. phydm_set_tx_ant_pwr_8723d(p_dm_odm, ant);
  258. odm_update_rx_idle_ant_8723d(p_dm_odm, ant, default_ant, optional_ant);
  259. }
  260. #endif
  261. else { /*8188E & 8188F*/
  262. #if (RTL8188F_SUPPORT == 1)
  263. if (p_dm_odm->support_ic_type == ODM_RTL8188F) {
  264. phydm_update_rx_idle_antenna_8188F(p_dm_odm, default_ant);
  265. }
  266. #endif
  267. odm_set_bb_reg(p_dm_odm, 0x864, BIT(5) | BIT4 | BIT3, default_ant); /*Default RX*/
  268. odm_set_bb_reg(p_dm_odm, 0x864, BIT(8) | BIT7 | BIT6, optional_ant); /*Optional RX*/
  269. odm_set_bb_reg(p_dm_odm, 0x860, BIT(14) | BIT13 | BIT12, default_tx_ant); /*Default TX*/
  270. }
  271. } else if (p_dm_odm->support_ic_type & ODM_AC_ANTDIV_SUPPORT) {
  272. u16 value16 = odm_read_2byte(p_dm_odm, ODM_REG_TRMUX_11AC + 2);
  273. /* */
  274. /* 2014/01/14 MH/Luke.Lee Add direct write for register 0xc0a to prevnt */
  275. /* incorrect 0xc08 bit0-15 .We still not know why it is changed. */
  276. /* */
  277. value16 &= ~(BIT(11) | BIT(10) | BIT(9) | BIT(8) | BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3));
  278. value16 |= ((u16)default_ant << 3);
  279. value16 |= ((u16)optional_ant << 6);
  280. value16 |= ((u16)default_ant << 9);
  281. odm_write_2byte(p_dm_odm, ODM_REG_TRMUX_11AC + 2, value16);
  282. #if 0
  283. odm_set_bb_reg(p_dm_odm, ODM_REG_TRMUX_11AC, BIT(21) | BIT20 | BIT19, default_ant); /* Default RX */
  284. odm_set_bb_reg(p_dm_odm, ODM_REG_TRMUX_11AC, BIT(24) | BIT23 | BIT22, optional_ant); /* Optional RX */
  285. odm_set_bb_reg(p_dm_odm, ODM_REG_TRMUX_11AC, BIT(27) | BIT26 | BIT25, default_ant); /* Default TX */
  286. #endif
  287. }
  288. if (p_dm_odm->support_ic_type == ODM_RTL8188E) {
  289. odm_set_mac_reg(p_dm_odm, 0x6D8, BIT(7) | BIT6, default_tx_ant); /*PathA Resp Tx*/
  290. /**/
  291. } else {
  292. odm_set_mac_reg(p_dm_odm, 0x6D8, BIT(10) | BIT9 | BIT8, default_tx_ant); /*PathA Resp Tx*/
  293. /**/
  294. }
  295. } else { /* p_dm_fat_table->rx_idle_ant == ant */
  296. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Stay in Ori-ant ] rx_idle_ant =%s\n", (ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  297. p_dm_fat_table->rx_idle_ant = ant;
  298. }
  299. }
  300. void
  301. odm_update_tx_ant(
  302. void *p_dm_void,
  303. u8 ant,
  304. u32 mac_id
  305. )
  306. {
  307. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  308. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  309. u8 tx_ant;
  310. if (p_dm_fat_table->b_fix_tx_ant != NO_FIX_TX_ANT)
  311. ant = (p_dm_fat_table->b_fix_tx_ant == FIX_TX_AT_MAIN) ? MAIN_ANT : AUX_ANT;
  312. if (p_dm_odm->ant_div_type == CG_TRX_SMART_ANTDIV)
  313. tx_ant = ant;
  314. else {
  315. if (ant == MAIN_ANT)
  316. tx_ant = ANT1_2G;
  317. else
  318. tx_ant = ANT2_2G;
  319. }
  320. p_dm_fat_table->antsel_a[mac_id] = tx_ant & BIT(0);
  321. p_dm_fat_table->antsel_b[mac_id] = (tx_ant & BIT(1)) >> 1;
  322. p_dm_fat_table->antsel_c[mac_id] = (tx_ant & BIT(2)) >> 2;
  323. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Set TX-DESC value]: mac_id:(( %d )), tx_ant = (( %s ))\n", mac_id, (ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  324. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=(( 3'b%d%d%d ))\n",p_dm_fat_table->antsel_c[mac_id] , p_dm_fat_table->antsel_b[mac_id] , p_dm_fat_table->antsel_a[mac_id] )); */
  325. }
  326. #ifdef BEAMFORMING_SUPPORT
  327. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  328. void
  329. odm_bdc_init(
  330. void *p_dm_void
  331. )
  332. {
  333. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  334. struct _BF_DIV_COEX_ *p_dm_bdc_table = &p_dm_odm->dm_bdc_table;
  335. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[ BDC Initialization......]\n"));
  336. p_dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
  337. p_dm_bdc_table->bdc_mode = BDC_MODE_NULL;
  338. p_dm_bdc_table->bdc_try_flag = 0;
  339. p_dm_bdc_table->bd_ccoex_type_wbfer = 0;
  340. p_dm_odm->bdc_holdstate = 0xff;
  341. if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  342. odm_set_bb_reg(p_dm_odm, 0xd7c, 0x0FFFFFFF, 0x1081008);
  343. odm_set_bb_reg(p_dm_odm, 0xd80, 0x0FFFFFFF, 0);
  344. } else if (p_dm_odm->support_ic_type == ODM_RTL8812) {
  345. odm_set_bb_reg(p_dm_odm, 0x9b0, 0x0FFFFFFF, 0x1081008); /* 0x9b0[30:0] = 01081008 */
  346. odm_set_bb_reg(p_dm_odm, 0x9b4, 0x0FFFFFFF, 0); /* 0x9b4[31:0] = 00000000 */
  347. }
  348. }
  349. void
  350. odm_CSI_on_off(
  351. void *p_dm_void,
  352. u8 CSI_en
  353. )
  354. {
  355. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  356. if (CSI_en == CSI_ON) {
  357. if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  358. odm_set_mac_reg(p_dm_odm, 0xd84, BIT(11), 1); /* 0xd84[11]=1 */
  359. } else if (p_dm_odm->support_ic_type == ODM_RTL8812) {
  360. odm_set_mac_reg(p_dm_odm, 0x9b0, BIT(31), 1); /* 0x9b0[31]=1 */
  361. }
  362. } else if (CSI_en == CSI_OFF) {
  363. if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  364. odm_set_mac_reg(p_dm_odm, 0xd84, BIT(11), 0); /* 0xd84[11]=0 */
  365. } else if (p_dm_odm->support_ic_type == ODM_RTL8812) {
  366. odm_set_mac_reg(p_dm_odm, 0x9b0, BIT(31), 0); /* 0x9b0[31]=0 */
  367. }
  368. }
  369. }
  370. void
  371. odm_bd_ccoex_type_with_bfer_client(
  372. void *p_dm_void,
  373. u8 swch
  374. )
  375. {
  376. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  377. struct _BF_DIV_COEX_ *p_dm_bdc_table = &p_dm_odm->dm_bdc_table;
  378. u8 bd_ccoex_type_wbfer;
  379. if (swch == DIVON_CSIOFF) {
  380. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[BDCcoexType: 1] {DIV,CSI} ={1,0}\n"));
  381. bd_ccoex_type_wbfer = 1;
  382. if (bd_ccoex_type_wbfer != p_dm_bdc_table->bd_ccoex_type_wbfer) {
  383. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON);
  384. odm_CSI_on_off(p_dm_odm, CSI_OFF);
  385. p_dm_bdc_table->bd_ccoex_type_wbfer = 1;
  386. }
  387. } else if (swch == DIVOFF_CSION) {
  388. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[BDCcoexType: 2] {DIV,CSI} ={0,1}\n"));
  389. bd_ccoex_type_wbfer = 2;
  390. if (bd_ccoex_type_wbfer != p_dm_bdc_table->bd_ccoex_type_wbfer) {
  391. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  392. odm_CSI_on_off(p_dm_odm, CSI_ON);
  393. p_dm_bdc_table->bd_ccoex_type_wbfer = 2;
  394. }
  395. }
  396. }
  397. void
  398. odm_bf_ant_div_mode_arbitration(
  399. void *p_dm_void
  400. )
  401. {
  402. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  403. struct _BF_DIV_COEX_ *p_dm_bdc_table = &p_dm_odm->dm_bdc_table;
  404. u8 current_bdc_mode;
  405. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  406. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n"));
  407. /* 2 mode 1 */
  408. if ((p_dm_bdc_table->num_txbfee_client != 0) && (p_dm_bdc_table->num_txbfer_client == 0)) {
  409. current_bdc_mode = BDC_MODE_1;
  410. if (current_bdc_mode != p_dm_bdc_table->bdc_mode) {
  411. p_dm_bdc_table->bdc_mode = BDC_MODE_1;
  412. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  413. p_dm_bdc_table->bdc_rx_idle_update_counter = 1;
  414. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode1 ))\n"));
  415. }
  416. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance mode] : (( Mode1 ))\n"));
  417. }
  418. /* 2 mode 2 */
  419. else if ((p_dm_bdc_table->num_txbfee_client == 0) && (p_dm_bdc_table->num_txbfer_client != 0)) {
  420. current_bdc_mode = BDC_MODE_2;
  421. if (current_bdc_mode != p_dm_bdc_table->bdc_mode) {
  422. p_dm_bdc_table->bdc_mode = BDC_MODE_2;
  423. p_dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
  424. p_dm_bdc_table->bdc_try_flag = 0;
  425. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode2 ))\n"));
  426. }
  427. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance mode] : (( Mode2 ))\n"));
  428. }
  429. /* 2 mode 3 */
  430. else if ((p_dm_bdc_table->num_txbfee_client != 0) && (p_dm_bdc_table->num_txbfer_client != 0)) {
  431. current_bdc_mode = BDC_MODE_3;
  432. if (current_bdc_mode != p_dm_bdc_table->bdc_mode) {
  433. p_dm_bdc_table->bdc_mode = BDC_MODE_3;
  434. p_dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
  435. p_dm_bdc_table->bdc_try_flag = 0;
  436. p_dm_bdc_table->bdc_rx_idle_update_counter = 1;
  437. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode3 ))\n"));
  438. }
  439. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance mode] : (( Mode3 ))\n"));
  440. }
  441. /* 2 mode 4 */
  442. else if ((p_dm_bdc_table->num_txbfee_client == 0) && (p_dm_bdc_table->num_txbfer_client == 0)) {
  443. current_bdc_mode = BDC_MODE_4;
  444. if (current_bdc_mode != p_dm_bdc_table->bdc_mode) {
  445. p_dm_bdc_table->bdc_mode = BDC_MODE_4;
  446. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  447. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to (( Mode4 ))\n"));
  448. }
  449. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Antdiv + BF coextance mode] : (( Mode4 ))\n"));
  450. }
  451. #endif
  452. }
  453. void
  454. odm_div_train_state_setting(
  455. void *p_dm_void
  456. )
  457. {
  458. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  459. struct _BF_DIV_COEX_ *p_dm_bdc_table = &p_dm_odm->dm_bdc_table;
  460. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n*****[S T A R T ]***** [2-0. DIV_TRAIN_STATE]\n"));
  461. p_dm_bdc_table->bdc_try_counter = 2;
  462. p_dm_bdc_table->bdc_try_flag = 1;
  463. p_dm_bdc_table->BDC_state = bdc_bfer_train_state;
  464. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  465. }
  466. void
  467. odm_bd_ccoex_bfee_rx_div_arbitration(
  468. void *p_dm_void
  469. )
  470. {
  471. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  472. struct _BF_DIV_COEX_ *p_dm_bdc_table = &p_dm_odm->dm_bdc_table;
  473. boolean stop_bf_flag;
  474. u8 bdc_active_mode;
  475. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  476. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***{ num_BFee, num_BFer, num_client} = (( %d , %d , %d))\n", p_dm_bdc_table->num_txbfee_client, p_dm_bdc_table->num_txbfer_client, p_dm_bdc_table->num_client));
  477. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***{ num_BF_tars, num_DIV_tars } = (( %d , %d ))\n", p_dm_bdc_table->num_bf_tar, p_dm_bdc_table->num_div_tar));
  478. /* 2 [ MIB control ] */
  479. if (p_dm_odm->bdc_holdstate == 2) {
  480. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVOFF_CSION);
  481. p_dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;
  482. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Force in [ BF STATE]\n"));
  483. return;
  484. } else if (p_dm_odm->bdc_holdstate == 1) {
  485. p_dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
  486. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  487. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Force in [ DIV STATE]\n"));
  488. return;
  489. }
  490. /* ------------------------------------------------------------ */
  491. /* 2 mode 2 & 3 */
  492. if (p_dm_bdc_table->bdc_mode == BDC_MODE_2 || p_dm_bdc_table->bdc_mode == BDC_MODE_3) {
  493. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n{ Try_flag, Try_counter } = { %d , %d }\n", p_dm_bdc_table->bdc_try_flag, p_dm_bdc_table->bdc_try_counter));
  494. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BDCcoexType = (( %d )) \n\n", p_dm_bdc_table->bd_ccoex_type_wbfer));
  495. /* All Client have Bfer-Cap------------------------------- */
  496. if (p_dm_bdc_table->num_txbfer_client == p_dm_bdc_table->num_client) { /* BFer STA Only?: yes */
  497. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BFer STA only? (( Yes ))\n"));
  498. p_dm_bdc_table->bdc_try_flag = 0;
  499. p_dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
  500. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVOFF_CSION);
  501. return;
  502. } else
  503. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BFer STA only? (( No ))\n"));
  504. /* */
  505. if (p_dm_bdc_table->is_all_bf_sta_idle == false && p_dm_bdc_table->is_all_div_sta_idle == true) {
  506. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("All DIV-STA are idle, but BF-STA not\n"));
  507. p_dm_bdc_table->bdc_try_flag = 0;
  508. p_dm_bdc_table->BDC_state = bdc_bfer_train_state;
  509. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVOFF_CSION);
  510. return;
  511. } else if (p_dm_bdc_table->is_all_bf_sta_idle == true && p_dm_bdc_table->is_all_div_sta_idle == false) {
  512. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("All BF-STA are idle, but DIV-STA not\n"));
  513. p_dm_bdc_table->bdc_try_flag = 0;
  514. p_dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
  515. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  516. return;
  517. }
  518. /* Select active mode-------------------------------------- */
  519. if (p_dm_bdc_table->num_bf_tar == 0) { /* Selsect_1, Selsect_2 */
  520. if (p_dm_bdc_table->num_div_tar == 0) { /* Selsect_3 */
  521. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 1 ))\n"));
  522. p_dm_bdc_table->bdc_active_mode = 1;
  523. } else {
  524. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 2 ))\n"));
  525. p_dm_bdc_table->bdc_active_mode = 2;
  526. }
  527. p_dm_bdc_table->bdc_try_flag = 0;
  528. p_dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
  529. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  530. return;
  531. } else { /* num_bf_tar > 0 */
  532. if (p_dm_bdc_table->num_div_tar == 0) { /* Selsect_3 */
  533. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 3 ))\n"));
  534. p_dm_bdc_table->bdc_active_mode = 3;
  535. p_dm_bdc_table->bdc_try_flag = 0;
  536. p_dm_bdc_table->BDC_state = bdc_bfer_train_state;
  537. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVOFF_CSION);
  538. return;
  539. } else { /* Selsect_4 */
  540. bdc_active_mode = 4;
  541. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Select active mode (( 4 ))\n"));
  542. if (bdc_active_mode != p_dm_bdc_table->bdc_active_mode) {
  543. p_dm_bdc_table->bdc_active_mode = 4;
  544. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Change to active mode (( 4 )) & return!!!\n"));
  545. return;
  546. }
  547. }
  548. }
  549. #if 1
  550. if (p_dm_odm->bdc_holdstate == 0xff) {
  551. p_dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
  552. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  553. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Force in [ DIV STATE]\n"));
  554. return;
  555. }
  556. #endif
  557. /* Does Client number changed ? ------------------------------- */
  558. if (p_dm_bdc_table->num_client != p_dm_bdc_table->pre_num_client) {
  559. p_dm_bdc_table->bdc_try_flag = 0;
  560. p_dm_bdc_table->BDC_state = BDC_DIV_TRAIN_STATE;
  561. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ The number of client has been changed !!!] return to (( BDC_DIV_TRAIN_STATE ))\n"));
  562. }
  563. p_dm_bdc_table->pre_num_client = p_dm_bdc_table->num_client;
  564. if (p_dm_bdc_table->bdc_try_flag == 0) {
  565. /* 2 DIV_TRAIN_STATE (mode 2-0) */
  566. if (p_dm_bdc_table->BDC_state == BDC_DIV_TRAIN_STATE)
  567. odm_div_train_state_setting(p_dm_odm);
  568. /* 2 BFer_TRAIN_STATE (mode 2-1) */
  569. else if (p_dm_bdc_table->BDC_state == bdc_bfer_train_state) {
  570. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-1. BFer_TRAIN_STATE ]*****\n"));
  571. /* if(p_dm_bdc_table->num_bf_tar==0) */
  572. /* { */
  573. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( No )), [ bdc_bfer_train_state ] >> [BDC_DIV_TRAIN_STATE]\n")); */
  574. /* odm_div_train_state_setting( p_dm_odm); */
  575. /* } */
  576. /* else */ /* num_bf_tar != 0 */
  577. /* { */
  578. p_dm_bdc_table->bdc_try_counter = 2;
  579. p_dm_bdc_table->bdc_try_flag = 1;
  580. p_dm_bdc_table->BDC_state = BDC_DECISION_STATE;
  581. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVOFF_CSION);
  582. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( Yes )), [ bdc_bfer_train_state ] >> [BDC_DECISION_STATE]\n"));
  583. /* } */
  584. }
  585. /* 2 DECISION_STATE (mode 2-2) */
  586. else if (p_dm_bdc_table->BDC_state == BDC_DECISION_STATE) {
  587. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-2. DECISION_STATE]*****\n"));
  588. /* if(p_dm_bdc_table->num_bf_tar==0) */
  589. /* { */
  590. /* ODM_AntDiv_Printk(("BF_tars exist? : (( No )), [ DECISION_STATE ] >> [BDC_DIV_TRAIN_STATE]\n")); */
  591. /* odm_div_train_state_setting( p_dm_odm); */
  592. /* } */
  593. /* else */ /* num_bf_tar != 0 */
  594. /* { */
  595. if (p_dm_bdc_table->BF_pass == false || p_dm_bdc_table->DIV_pass == false)
  596. stop_bf_flag = true;
  597. else
  598. stop_bf_flag = false;
  599. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( Yes )), {BF_pass, DIV_pass, stop_bf_flag } = { %d, %d, %d }\n", p_dm_bdc_table->BF_pass, p_dm_bdc_table->DIV_pass, stop_bf_flag));
  600. if (stop_bf_flag == true) { /* DIV_en */
  601. p_dm_bdc_table->bdc_hold_counter = 10; /* 20 */
  602. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  603. p_dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
  604. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ stop_bf_flag= ((true)), BDC_DECISION_STATE ] >> [BDC_DIV_HOLD_STATE]\n"));
  605. } else { /* BF_en */
  606. p_dm_bdc_table->bdc_hold_counter = 10; /* 20 */
  607. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVOFF_CSION);
  608. p_dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;
  609. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[stop_bf_flag= ((false)), BDC_DECISION_STATE ] >> [BDC_BF_HOLD_STATE]\n"));
  610. }
  611. /* } */
  612. }
  613. /* 2 BF-HOLD_STATE (mode 2-3) */
  614. else if (p_dm_bdc_table->BDC_state == BDC_BF_HOLD_STATE) {
  615. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-3. BF_HOLD_STATE ]*****\n"));
  616. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("bdc_hold_counter = (( %d ))\n", p_dm_bdc_table->bdc_hold_counter));
  617. if (p_dm_bdc_table->bdc_hold_counter == 1) {
  618. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n"));
  619. odm_div_train_state_setting(p_dm_odm);
  620. } else {
  621. p_dm_bdc_table->bdc_hold_counter--;
  622. /* if(p_dm_bdc_table->num_bf_tar==0) */
  623. /* { */
  624. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( No )), [ BDC_BF_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n")); */
  625. /* odm_div_train_state_setting( p_dm_odm); */
  626. /* } */
  627. /* else */ /* num_bf_tar != 0 */
  628. /* { */
  629. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("BF_tars exist? : (( Yes ))\n")); */
  630. p_dm_bdc_table->BDC_state = BDC_BF_HOLD_STATE;
  631. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVOFF_CSION);
  632. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_BF_HOLD_STATE ] >> [BDC_BF_HOLD_STATE]\n"));
  633. /* } */
  634. }
  635. }
  636. /* 2 DIV-HOLD_STATE (mode 2-4) */
  637. else if (p_dm_bdc_table->BDC_state == BDC_DIV_HOLD_STATE) {
  638. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*****[2-4. DIV_HOLD_STATE ]*****\n"));
  639. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("bdc_hold_counter = (( %d ))\n", p_dm_bdc_table->bdc_hold_counter));
  640. if (p_dm_bdc_table->bdc_hold_counter == 1) {
  641. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_TRAIN_STATE]\n"));
  642. odm_div_train_state_setting(p_dm_odm);
  643. } else {
  644. p_dm_bdc_table->bdc_hold_counter--;
  645. p_dm_bdc_table->BDC_state = BDC_DIV_HOLD_STATE;
  646. odm_bd_ccoex_type_with_bfer_client(p_dm_odm, DIVON_CSIOFF);
  647. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ BDC_DIV_HOLD_STATE ] >> [BDC_DIV_HOLD_STATE]\n"));
  648. }
  649. }
  650. } else if (p_dm_bdc_table->bdc_try_flag == 1) {
  651. /* 2 Set Training counter */
  652. if (p_dm_bdc_table->bdc_try_counter > 1) {
  653. p_dm_bdc_table->bdc_try_counter--;
  654. if (p_dm_bdc_table->bdc_try_counter == 1)
  655. p_dm_bdc_table->bdc_try_flag = 0;
  656. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training !!\n"));
  657. /* return ; */
  658. }
  659. }
  660. }
  661. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[end]\n"));
  662. #endif /* #if(DM_ODM_SUPPORT_TYPE == ODM_AP) */
  663. }
  664. #endif
  665. #endif /* #ifdef BEAMFORMING_SUPPORT */
  666. #if (RTL8188E_SUPPORT == 1)
  667. void
  668. odm_rx_hw_ant_div_init_88e(
  669. void *p_dm_void
  670. )
  671. {
  672. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  673. u32 value32;
  674. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  675. #if 0
  676. if (p_dm_odm->mp_mode == true) {
  677. odm_set_bb_reg(p_dm_odm, ODM_REG_IGI_A_11N, BIT(7), 0); /* disable HW AntDiv */
  678. odm_set_bb_reg(p_dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1); /* 1:CG, 0:CS */
  679. return;
  680. }
  681. #endif
  682. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => ant_div_type=[CGCS_RX_HW_ANTDIV]\n"));
  683. /* MAC setting */
  684. value32 = odm_get_mac_reg(p_dm_odm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD);
  685. odm_set_mac_reg(p_dm_odm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD, value32 | (BIT(23) | BIT25)); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */
  686. /* Pin Settings */
  687. odm_set_bb_reg(p_dm_odm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT8, 0);/* reg870[8]=1'b0, reg870[9]=1'b0 */ /* antsel antselb by HW */
  688. odm_set_bb_reg(p_dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0); /* reg864[10]=1'b0 */ /* antsel2 by HW */
  689. odm_set_bb_reg(p_dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(22), 1); /* regb2c[22]=1'b0 */ /* disable CS/CG switch */
  690. odm_set_bb_reg(p_dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1); /* regb2c[31]=1'b1 */ /* output at CG only */
  691. /* OFDM Settings */
  692. odm_set_bb_reg(p_dm_odm, ODM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
  693. /* CCK Settings */
  694. odm_set_bb_reg(p_dm_odm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1); /* Fix CCK PHY status report issue */
  695. odm_set_bb_reg(p_dm_odm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1); /* CCK complete HW AntDiv within 64 samples */
  696. odm_set_bb_reg(p_dm_odm, ODM_REG_ANT_MAPPING1_11N, 0xFFFF, 0x0001); /* antenna mapping table */
  697. p_dm_fat_table->enable_ctrl_frame_antdiv = 1;
  698. }
  699. void
  700. odm_trx_hw_ant_div_init_88e(
  701. void *p_dm_void
  702. )
  703. {
  704. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  705. u32 value32;
  706. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  707. #if 0
  708. if (p_dm_odm->mp_mode == true) {
  709. odm_set_bb_reg(p_dm_odm, ODM_REG_IGI_A_11N, BIT(7), 0); /* disable HW AntDiv */
  710. odm_set_bb_reg(p_dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(5) | BIT4 | BIT3, 0); /* Default RX (0/1) */
  711. return;
  712. }
  713. #endif
  714. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => ant_div_type=[CG_TRX_HW_ANTDIV (SPDT)]\n"));
  715. /* MAC setting */
  716. value32 = odm_get_mac_reg(p_dm_odm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD);
  717. odm_set_mac_reg(p_dm_odm, ODM_REG_ANTSEL_PIN_11N, MASKDWORD, value32 | (BIT(23) | BIT25)); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */
  718. /* Pin Settings */
  719. odm_set_bb_reg(p_dm_odm, ODM_REG_PIN_CTRL_11N, BIT(9) | BIT8, 0);/* reg870[8]=1'b0, reg870[9]=1'b0 */ /* antsel antselb by HW */
  720. odm_set_bb_reg(p_dm_odm, ODM_REG_RX_ANT_CTRL_11N, BIT(10), 0); /* reg864[10]=1'b0 */ /* antsel2 by HW */
  721. odm_set_bb_reg(p_dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(22), 0); /* regb2c[22]=1'b0 */ /* disable CS/CG switch */
  722. odm_set_bb_reg(p_dm_odm, ODM_REG_LNA_SWITCH_11N, BIT(31), 1); /* regb2c[31]=1'b1 */ /* output at CG only */
  723. /* OFDM Settings */
  724. odm_set_bb_reg(p_dm_odm, ODM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
  725. /* CCK Settings */
  726. odm_set_bb_reg(p_dm_odm, ODM_REG_BB_PWR_SAV4_11N, BIT(7), 1); /* Fix CCK PHY status report issue */
  727. odm_set_bb_reg(p_dm_odm, ODM_REG_CCK_ANTDIV_PARA2_11N, BIT(4), 1); /* CCK complete HW AntDiv within 64 samples */
  728. /* antenna mapping table */
  729. if (!p_dm_odm->is_mp_chip) { /* testchip */
  730. odm_set_bb_reg(p_dm_odm, ODM_REG_RX_DEFUALT_A_11N, BIT(10) | BIT9 | BIT8, 1); /* Reg858[10:8]=3'b001 */
  731. odm_set_bb_reg(p_dm_odm, ODM_REG_RX_DEFUALT_A_11N, BIT(13) | BIT12 | BIT11, 2); /* Reg858[13:11]=3'b010 */
  732. } else /* MPchip */
  733. odm_set_bb_reg(p_dm_odm, ODM_REG_ANT_MAPPING1_11N, MASKDWORD, 0x0201); /*Reg914=3'b010, Reg915=3'b001*/
  734. p_dm_fat_table->enable_ctrl_frame_antdiv = 1;
  735. }
  736. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  737. void
  738. odm_smart_hw_ant_div_init_88e(
  739. void *p_dm_void
  740. )
  741. {
  742. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  743. u32 value32, i;
  744. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  745. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => ant_div_type=[CG_TRX_SMART_ANTDIV]\n"));
  746. #if 0
  747. if (p_dm_odm->mp_mode == true) {
  748. ODM_RT_TRACE(p_dm_odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("p_dm_odm->ant_div_type: %d\n", p_dm_odm->ant_div_type));
  749. return;
  750. }
  751. #endif
  752. p_dm_fat_table->train_idx = 0;
  753. p_dm_fat_table->fat_state = FAT_PREPARE_STATE;
  754. p_dm_odm->fat_comb_a = 5;
  755. p_dm_odm->antdiv_intvl = 0x64; /* 100ms */
  756. for (i = 0; i < 6; i++)
  757. p_dm_fat_table->bssid[i] = 0;
  758. for (i = 0; i < (p_dm_odm->fat_comb_a) ; i++) {
  759. p_dm_fat_table->ant_sum_rssi[i] = 0;
  760. p_dm_fat_table->ant_rssi_cnt[i] = 0;
  761. p_dm_fat_table->ant_ave_rssi[i] = 0;
  762. }
  763. /* MAC setting */
  764. value32 = odm_get_mac_reg(p_dm_odm, 0x4c, MASKDWORD);
  765. odm_set_mac_reg(p_dm_odm, 0x4c, MASKDWORD, value32 | (BIT(23) | BIT25)); /* Reg4C[25]=1, Reg4C[23]=1 for pin output */
  766. value32 = odm_get_mac_reg(p_dm_odm, 0x7B4, MASKDWORD);
  767. odm_set_mac_reg(p_dm_odm, 0x7b4, MASKDWORD, value32 | (BIT(16) | BIT17)); /* Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match */
  768. /* value32 = platform_efio_read_4byte(adapter, 0x7B4); */
  769. /* platform_efio_write_4byte(adapter, 0x7b4, value32|BIT(18)); */ /* append MACID in reponse packet */
  770. /* Match MAC ADDR */
  771. odm_set_mac_reg(p_dm_odm, 0x7b4, 0xFFFF, 0);
  772. odm_set_mac_reg(p_dm_odm, 0x7b0, MASKDWORD, 0);
  773. odm_set_bb_reg(p_dm_odm, 0x870, BIT(9) | BIT8, 0);/* reg870[8]=1'b0, reg870[9]=1'b0 */ /* antsel antselb by HW */
  774. odm_set_bb_reg(p_dm_odm, 0x864, BIT(10), 0); /* reg864[10]=1'b0 */ /* antsel2 by HW */
  775. odm_set_bb_reg(p_dm_odm, 0xb2c, BIT(22), 0); /* regb2c[22]=1'b0 */ /* disable CS/CG switch */
  776. odm_set_bb_reg(p_dm_odm, 0xb2c, BIT(31), 0); /* regb2c[31]=1'b1 */ /* output at CS only */
  777. odm_set_bb_reg(p_dm_odm, 0xca4, MASKDWORD, 0x000000a0);
  778. /* antenna mapping table */
  779. if (p_dm_odm->fat_comb_a == 2) {
  780. if (!p_dm_odm->is_mp_chip) { /* testchip */
  781. odm_set_bb_reg(p_dm_odm, 0x858, BIT(10) | BIT9 | BIT8, 1); /* Reg858[10:8]=3'b001 */
  782. odm_set_bb_reg(p_dm_odm, 0x858, BIT(13) | BIT12 | BIT11, 2); /* Reg858[13:11]=3'b010 */
  783. } else { /* MPchip */
  784. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE0, 1);
  785. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE1, 2);
  786. }
  787. } else {
  788. if (!p_dm_odm->is_mp_chip) { /* testchip */
  789. odm_set_bb_reg(p_dm_odm, 0x858, BIT(10) | BIT9 | BIT8, 0); /* Reg858[10:8]=3'b000 */
  790. odm_set_bb_reg(p_dm_odm, 0x858, BIT(13) | BIT12 | BIT11, 1); /* Reg858[13:11]=3'b001 */
  791. odm_set_bb_reg(p_dm_odm, 0x878, BIT(16), 0);
  792. odm_set_bb_reg(p_dm_odm, 0x858, BIT(15) | BIT14, 2); /* (Reg878[0],Reg858[14:15])=3'b010 */
  793. odm_set_bb_reg(p_dm_odm, 0x878, BIT(19) | BIT18 | BIT17, 3); /* Reg878[3:1]=3b'011 */
  794. odm_set_bb_reg(p_dm_odm, 0x878, BIT(22) | BIT21 | BIT20, 4); /* Reg878[6:4]=3b'100 */
  795. odm_set_bb_reg(p_dm_odm, 0x878, BIT(25) | BIT24 | BIT23, 5); /* Reg878[9:7]=3b'101 */
  796. odm_set_bb_reg(p_dm_odm, 0x878, BIT(28) | BIT27 | BIT26, 6); /* Reg878[12:10]=3b'110 */
  797. odm_set_bb_reg(p_dm_odm, 0x878, BIT(31) | BIT30 | BIT29, 7); /* Reg878[15:13]=3b'111 */
  798. } else { /* MPchip */
  799. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE0, 4); /* 0: 3b'000 */
  800. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE1, 2); /* 1: 3b'001 */
  801. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE2, 0); /* 2: 3b'010 */
  802. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE3, 1); /* 3: 3b'011 */
  803. odm_set_bb_reg(p_dm_odm, 0x918, MASKBYTE0, 3); /* 4: 3b'100 */
  804. odm_set_bb_reg(p_dm_odm, 0x918, MASKBYTE1, 5); /* 5: 3b'101 */
  805. odm_set_bb_reg(p_dm_odm, 0x918, MASKBYTE2, 6); /* 6: 3b'110 */
  806. odm_set_bb_reg(p_dm_odm, 0x918, MASKBYTE3, 255); /* 7: 3b'111 */
  807. }
  808. }
  809. /* Default ant setting when no fast training */
  810. odm_set_bb_reg(p_dm_odm, 0x864, BIT(5) | BIT4 | BIT3, 0); /* Default RX */
  811. odm_set_bb_reg(p_dm_odm, 0x864, BIT(8) | BIT7 | BIT6, 1); /* Optional RX */
  812. odm_set_bb_reg(p_dm_odm, 0x860, BIT(14) | BIT13 | BIT12, 0); /* Default TX */
  813. /* Enter Traing state */
  814. odm_set_bb_reg(p_dm_odm, 0x864, BIT(2) | BIT1 | BIT0, (p_dm_odm->fat_comb_a - 1)); /* reg864[2:0]=3'd6 */ /* ant combination=reg864[2:0]+1 */
  815. /* SW Control */
  816. /* phy_set_bb_reg(adapter, 0x864, BIT10, 1); */
  817. /* phy_set_bb_reg(adapter, 0x870, BIT9, 1); */
  818. /* phy_set_bb_reg(adapter, 0x870, BIT8, 1); */
  819. /* phy_set_bb_reg(adapter, 0x864, BIT11, 1); */
  820. /* phy_set_bb_reg(adapter, 0x860, BIT9, 0); */
  821. /* phy_set_bb_reg(adapter, 0x860, BIT8, 0); */
  822. }
  823. #endif
  824. #endif /* #if (RTL8188E_SUPPORT == 1) */
  825. #if (RTL8192E_SUPPORT == 1)
  826. void
  827. odm_rx_hw_ant_div_init_92e(
  828. void *p_dm_void
  829. )
  830. {
  831. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  832. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  833. #if 0
  834. if (p_dm_odm->mp_mode == true) {
  835. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  836. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(8), 0); /* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */
  837. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(9), 1); /* 1:CG, 0:CS */
  838. return;
  839. }
  840. #endif
  841. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => ant_div_type=[CGCS_RX_HW_ANTDIV]\n"));
  842. /* Pin Settings */
  843. odm_set_bb_reg(p_dm_odm, 0x870, BIT(8), 0);/* reg870[8]=1'b0, */ /* "antsel" is controled by HWs */
  844. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(8), 1); /* regc50[8]=1'b1 */ /* " CS/CG switching" is controled by HWs */
  845. /* Mapping table */
  846. odm_set_bb_reg(p_dm_odm, 0x914, 0xFFFF, 0x0100); /* antenna mapping table */
  847. /* OFDM Settings */
  848. odm_set_bb_reg(p_dm_odm, 0xca4, 0x7FF, 0xA0); /* thershold */
  849. odm_set_bb_reg(p_dm_odm, 0xca4, 0x7FF000, 0x0); /* bias */
  850. /* CCK Settings */
  851. odm_set_bb_reg(p_dm_odm, 0xa04, 0xF000000, 0); /* Select which path to receive for CCK_1 & CCK_2 */
  852. odm_set_bb_reg(p_dm_odm, 0xb34, BIT(30), 0); /* (92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */
  853. odm_set_bb_reg(p_dm_odm, 0xa74, BIT(7), 1); /* Fix CCK PHY status report issue */
  854. odm_set_bb_reg(p_dm_odm, 0xa0c, BIT(4), 1); /* CCK complete HW AntDiv within 64 samples */
  855. #ifdef ODM_EVM_ENHANCE_ANTDIV
  856. /* EVM enhance AntDiv method init---------------------------------------------------------------------- */
  857. p_dm_fat_table->EVM_method_enable = 0;
  858. p_dm_fat_table->fat_state = NORMAL_STATE_MIAN;
  859. p_dm_odm->antdiv_intvl = 0x64;
  860. odm_set_bb_reg(p_dm_odm, 0x910, 0x3f, 0xf);
  861. p_dm_odm->antdiv_evm_en = 1;
  862. /* p_dm_odm->antdiv_period=1; */
  863. p_dm_odm->evm_antdiv_period = 3;
  864. #endif
  865. }
  866. void
  867. odm_trx_hw_ant_div_init_92e(
  868. void *p_dm_void
  869. )
  870. {
  871. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  872. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  873. #if 0
  874. if (p_dm_odm->mp_mode == true) {
  875. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  876. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(8), 0); /* r_rxdiv_enable_anta regc50[8]=1'b0 0: control by c50[9] */
  877. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(9), 1); /* 1:CG, 0:CS */
  878. return;
  879. }
  880. #endif
  881. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => ant_div_type=[ Only for DIR605, CG_TRX_HW_ANTDIV]\n"));
  882. /* 3 --RFE pin setting--------- */
  883. /* [MAC] */
  884. odm_set_mac_reg(p_dm_odm, 0x38, BIT(11), 1); /* DBG PAD Driving control (GPIO 8) */
  885. odm_set_mac_reg(p_dm_odm, 0x4c, BIT(23), 0); /* path-A, RFE_CTRL_3 */
  886. odm_set_mac_reg(p_dm_odm, 0x4c, BIT(29), 1); /* path-A, RFE_CTRL_8 */
  887. /* [BB] */
  888. odm_set_bb_reg(p_dm_odm, 0x944, BIT(3), 1); /* RFE_buffer */
  889. odm_set_bb_reg(p_dm_odm, 0x944, BIT(8), 1);
  890. odm_set_bb_reg(p_dm_odm, 0x940, BIT(7) | BIT6, 0x0); /* r_rfe_path_sel_ (RFE_CTRL_3) */
  891. odm_set_bb_reg(p_dm_odm, 0x940, BIT(17) | BIT16, 0x0); /* r_rfe_path_sel_ (RFE_CTRL_8) */
  892. odm_set_bb_reg(p_dm_odm, 0x944, BIT(31), 0); /* RFE_buffer */
  893. odm_set_bb_reg(p_dm_odm, 0x92C, BIT(3), 0); /* rfe_inv (RFE_CTRL_3) */
  894. odm_set_bb_reg(p_dm_odm, 0x92C, BIT(8), 1); /* rfe_inv (RFE_CTRL_8) */
  895. odm_set_bb_reg(p_dm_odm, 0x930, 0xF000, 0x8); /* path-A, RFE_CTRL_3 */
  896. odm_set_bb_reg(p_dm_odm, 0x934, 0xF, 0x8); /* path-A, RFE_CTRL_8 */
  897. /* 3 ------------------------- */
  898. /* Pin Settings */
  899. odm_set_bb_reg(p_dm_odm, 0xC50, BIT(8), 0); /* path-A */ /* disable CS/CG switch */
  900. #if 0
  901. /* Let it follows PHY_REG for bit9 setting */
  902. if (p_dm_odm->priv->pshare->rf_ft_var.use_ext_pa || p_dm_odm->priv->pshare->rf_ft_var.use_ext_lna)
  903. odm_set_bb_reg(p_dm_odm, 0xC50, BIT(9), 1);/* path-A //output at CS */
  904. else
  905. odm_set_bb_reg(p_dm_odm, 0xC50, BIT(9), 0); /* path-A //output at CG ->normal power */
  906. #endif
  907. odm_set_bb_reg(p_dm_odm, 0x870, BIT(9) | BIT8, 0); /* path-A */ /* antsel antselb by HW */
  908. odm_set_bb_reg(p_dm_odm, 0xB38, BIT(10), 0); /* path-A */ /* antsel2 by HW */
  909. /* Mapping table */
  910. odm_set_bb_reg(p_dm_odm, 0x914, 0xFFFF, 0x0100); /* antenna mapping table */
  911. /* OFDM Settings */
  912. odm_set_bb_reg(p_dm_odm, 0xca4, 0x7FF, 0xA0); /* thershold */
  913. odm_set_bb_reg(p_dm_odm, 0xca4, 0x7FF000, 0x0); /* bias */
  914. /* CCK Settings */
  915. odm_set_bb_reg(p_dm_odm, 0xa04, 0xF000000, 0); /* Select which path to receive for CCK_1 & CCK_2 */
  916. odm_set_bb_reg(p_dm_odm, 0xb34, BIT(30), 0); /* (92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0 */
  917. odm_set_bb_reg(p_dm_odm, 0xa74, BIT(7), 1); /* Fix CCK PHY status report issue */
  918. odm_set_bb_reg(p_dm_odm, 0xa0c, BIT(4), 1); /* CCK complete HW AntDiv within 64 samples */
  919. #ifdef ODM_EVM_ENHANCE_ANTDIV
  920. /* EVM enhance AntDiv method init---------------------------------------------------------------------- */
  921. p_dm_fat_table->EVM_method_enable = 0;
  922. p_dm_fat_table->fat_state = NORMAL_STATE_MIAN;
  923. p_dm_odm->antdiv_intvl = 0x64;
  924. odm_set_bb_reg(p_dm_odm, 0x910, 0x3f, 0xf);
  925. p_dm_odm->antdiv_evm_en = 1;
  926. /* p_dm_odm->antdiv_period=1; */
  927. p_dm_odm->evm_antdiv_period = 3;
  928. #endif
  929. }
  930. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  931. void
  932. odm_smart_hw_ant_div_init_92e(
  933. void *p_dm_void
  934. )
  935. {
  936. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  937. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => ant_div_type=[CG_TRX_SMART_ANTDIV]\n"));
  938. }
  939. #endif
  940. #endif /* #if (RTL8192E_SUPPORT == 1) */
  941. #if (RTL8723D_SUPPORT == 1)
  942. void
  943. odm_trx_hw_ant_div_init_8723d(
  944. void *p_dm_void
  945. )
  946. {
  947. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  948. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8723D] AntDiv_Init => ant_div_type=[S0S1_HW_TRX_AntDiv]\n"));
  949. /*BT Coexistence*/
  950. /*keep antsel_map when GNT_BT = 1*/
  951. odm_set_bb_reg(p_dm_odm, 0x864, BIT(12), 1);
  952. /* Disable hw antsw & fast_train.antsw when GNT_BT=1 */
  953. odm_set_bb_reg(p_dm_odm, 0x874, BIT(23), 0);
  954. /* Disable hw antsw & fast_train.antsw when BT TX/RX */
  955. odm_set_bb_reg(p_dm_odm, 0xE64, 0xFFFF0000, 0x000c);
  956. odm_set_bb_reg(p_dm_odm, 0x870, BIT(9) | BIT(8), 0);
  957. /*PTA setting: WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL)*/
  958. /*odm_set_bb_reg(p_dm_odm, 0x948, BIT6, 0);*/
  959. /*odm_set_bb_reg(p_dm_odm, 0x948, BIT8, 0);*/
  960. /*GNT_WL tx*/
  961. odm_set_bb_reg(p_dm_odm, 0x950, BIT(29), 0);
  962. /*Mapping Table*/
  963. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE0, 0);
  964. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE1, 3);
  965. /* odm_set_bb_reg(p_dm_odm, 0x864, BIT5|BIT4|BIT3, 0); */
  966. /* odm_set_bb_reg(p_dm_odm, 0x864, BIT8|BIT7|BIT6, 1); */
  967. /* Set WLBB_SEL_RF_ON 1 if RXFIR_PWDB > 0xCcc[3:0] */
  968. odm_set_bb_reg(p_dm_odm, 0xCcc, BIT(12), 0);
  969. /* Low-to-High threshold for WLBB_SEL_RF_ON when OFDM enable */
  970. odm_set_bb_reg(p_dm_odm, 0xCcc, 0x0F, 0x01);
  971. /* High-to-Low threshold for WLBB_SEL_RF_ON when OFDM enable */
  972. odm_set_bb_reg(p_dm_odm, 0xCcc, 0xF0, 0x0);
  973. /* b Low-to-High threshold for WLBB_SEL_RF_ON when OFDM disable ( only CCK ) */
  974. odm_set_bb_reg(p_dm_odm, 0xAbc, 0xFF, 0x06);
  975. /* High-to-Low threshold for WLBB_SEL_RF_ON when OFDM disable ( only CCK ) */
  976. odm_set_bb_reg(p_dm_odm, 0xAbc, 0xFF00, 0x00);
  977. /*OFDM HW AntDiv Parameters*/
  978. odm_set_bb_reg(p_dm_odm, 0xCA4, 0x7FF, 0xa0);
  979. odm_set_bb_reg(p_dm_odm, 0xCA4, 0x7FF000, 0x00);
  980. odm_set_bb_reg(p_dm_odm, 0xC5C, BIT(20) | BIT(19) | BIT(18), 0x04);
  981. /*CCK HW AntDiv Parameters*/
  982. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(7), 1);
  983. odm_set_bb_reg(p_dm_odm, 0xA0C, BIT(4), 1);
  984. odm_set_bb_reg(p_dm_odm, 0xAA8, BIT(8), 0);
  985. odm_set_bb_reg(p_dm_odm, 0xA0C, 0x0F, 0xf);
  986. odm_set_bb_reg(p_dm_odm, 0xA14, 0x1F, 0x8);
  987. odm_set_bb_reg(p_dm_odm, 0xA10, BIT(13), 0x1);
  988. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(8), 0x0);
  989. odm_set_bb_reg(p_dm_odm, 0xB34, BIT(30), 0x1);
  990. /*disable antenna training */
  991. odm_set_bb_reg(p_dm_odm, 0xE08, BIT(16), 0);
  992. odm_set_bb_reg(p_dm_odm, 0xc50, BIT(8), 0);
  993. }
  994. /*Mingzhi 2017-05-08*/
  995. void
  996. odm_update_rx_idle_ant_8723d(
  997. void *p_dm_void,
  998. u8 ant,
  999. u32 default_ant,
  1000. u32 optional_ant
  1001. )
  1002. {
  1003. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1004. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1005. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  1006. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  1007. u8 count = 0;
  1008. u8 u1_temp;
  1009. u8 h2c_parameter;
  1010. /* odm_set_bb_reg(p_dm_odm, 0x948, BIT(6), 0x1); */
  1011. odm_set_bb_reg(p_dm_odm, 0x948, BIT(7), default_ant);
  1012. odm_set_bb_reg(p_dm_odm, 0x864, BIT(5) | BIT(4) | BIT(3), default_ant); /*Default RX*/
  1013. odm_set_bb_reg(p_dm_odm, 0x864, BIT(8) | BIT(7) | BIT(6), optional_ant); /*Optional RX*/
  1014. odm_set_bb_reg(p_dm_odm, 0x860, BIT(14) | BIT(13) | BIT(12), default_ant); /*Default TX*/
  1015. p_dm_fat_table->rx_idle_ant = ant;
  1016. }
  1017. void
  1018. phydm_set_tx_ant_pwr_8723d(
  1019. void *p_dm_void,
  1020. u8 ant
  1021. )
  1022. {
  1023. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1024. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1025. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  1026. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  1027. p_dm_fat_table->rx_idle_ant = ant;
  1028. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  1029. p_adapter->HalFunc.SetTxPowerLevelHandler(p_adapter, *p_dm_odm->p_channel);
  1030. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
  1031. rtw_hal_set_tx_power_level(p_adapter, *p_dm_odm->p_channel);
  1032. #endif
  1033. }
  1034. #endif
  1035. #if (RTL8723B_SUPPORT == 1)
  1036. void
  1037. odm_trx_hw_ant_div_init_8723b(
  1038. void *p_dm_void
  1039. )
  1040. {
  1041. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1042. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => ant_div_type=[CG_TRX_HW_ANTDIV(DPDT)]\n"));
  1043. /* Mapping Table */
  1044. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE0, 0);
  1045. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE1, 1);
  1046. /* OFDM HW AntDiv Parameters */
  1047. odm_set_bb_reg(p_dm_odm, 0xCA4, 0x7FF, 0xa0); /* thershold */
  1048. odm_set_bb_reg(p_dm_odm, 0xCA4, 0x7FF000, 0x00); /* bias */
  1049. /* CCK HW AntDiv Parameters */
  1050. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(7), 1); /* patch for clk from 88M to 80M */
  1051. odm_set_bb_reg(p_dm_odm, 0xA0C, BIT(4), 1); /* do 64 samples */
  1052. /* BT Coexistence */
  1053. odm_set_bb_reg(p_dm_odm, 0x864, BIT(12), 0); /* keep antsel_map when GNT_BT = 1 */
  1054. odm_set_bb_reg(p_dm_odm, 0x874, BIT(23), 0); /* Disable hw antsw & fast_train.antsw when GNT_BT=1 */
  1055. /* Output Pin Settings */
  1056. odm_set_bb_reg(p_dm_odm, 0x870, BIT(8), 0);
  1057. odm_set_bb_reg(p_dm_odm, 0x948, BIT(6), 0); /* WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL) */
  1058. odm_set_bb_reg(p_dm_odm, 0x948, BIT(7), 0);
  1059. odm_set_mac_reg(p_dm_odm, 0x40, BIT(3), 1);
  1060. odm_set_mac_reg(p_dm_odm, 0x38, BIT(11), 1);
  1061. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(24) | BIT23, 2); /* select DPDT_P and DPDT_N as output pin */
  1062. odm_set_bb_reg(p_dm_odm, 0x944, BIT(0) | BIT1, 3); /* in/out */
  1063. odm_set_bb_reg(p_dm_odm, 0x944, BIT(31), 0);
  1064. odm_set_bb_reg(p_dm_odm, 0x92C, BIT(1), 0); /* DPDT_P non-inverse */
  1065. odm_set_bb_reg(p_dm_odm, 0x92C, BIT(0), 1); /* DPDT_N inverse */
  1066. odm_set_bb_reg(p_dm_odm, 0x930, 0xF0, 8); /* DPDT_P = ANTSEL[0] */
  1067. odm_set_bb_reg(p_dm_odm, 0x930, 0xF, 8); /* DPDT_N = ANTSEL[0] */
  1068. /* 2 [--For HW Bug setting] */
  1069. if (p_dm_odm->ant_type == ODM_AUTO_ANT)
  1070. odm_set_bb_reg(p_dm_odm, 0xA00, BIT(15), 0); /* CCK AntDiv function block enable */
  1071. }
  1072. void
  1073. odm_s0s1_sw_ant_div_init_8723b(
  1074. void *p_dm_void
  1075. )
  1076. {
  1077. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1078. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  1079. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1080. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => ant_div_type=[ S0S1_SW_AntDiv]\n"));
  1081. /* Mapping Table */
  1082. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE0, 0);
  1083. odm_set_bb_reg(p_dm_odm, 0x914, MASKBYTE1, 1);
  1084. /* Output Pin Settings */
  1085. /* odm_set_bb_reg(p_dm_odm, 0x948, BIT6, 0x1); */
  1086. odm_set_bb_reg(p_dm_odm, 0x870, BIT(9) | BIT(8), 0);
  1087. p_dm_fat_table->is_become_linked = false;
  1088. p_dm_swat_table->try_flag = SWAW_STEP_INIT;
  1089. p_dm_swat_table->double_chk_flag = 0;
  1090. /* 2 [--For HW Bug setting] */
  1091. odm_set_bb_reg(p_dm_odm, 0x80C, BIT(21), 0); /* TX ant by Reg */
  1092. }
  1093. void
  1094. odm_update_rx_idle_ant_8723b(
  1095. void *p_dm_void,
  1096. u8 ant,
  1097. u32 default_ant,
  1098. u32 optional_ant
  1099. )
  1100. {
  1101. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1102. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1103. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  1104. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  1105. u8 count = 0;
  1106. u8 u1_temp;
  1107. u8 h2c_parameter;
  1108. if ((!p_dm_odm->is_linked) && (p_dm_odm->ant_type == ODM_AUTO_ANT)) {
  1109. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to no link\n"));
  1110. return;
  1111. }
  1112. #if 0
  1113. /* Send H2C command to FW */
  1114. /* Enable wifi calibration */
  1115. h2c_parameter = true;
  1116. odm_fill_h2c_cmd(p_dm_odm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);
  1117. /* Check if H2C command sucess or not (0x1e6) */
  1118. u1_temp = odm_read_1byte(p_dm_odm, 0x1e6);
  1119. while ((u1_temp != 0x1) && (count < 100)) {
  1120. ODM_delay_us(10);
  1121. u1_temp = odm_read_1byte(p_dm_odm, 0x1e6);
  1122. count++;
  1123. }
  1124. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: H2C command status = %d, count = %d\n", u1_temp, count));
  1125. if (u1_temp == 0x1) {
  1126. /* Check if BT is doing IQK (0x1e7) */
  1127. count = 0;
  1128. u1_temp = odm_read_1byte(p_dm_odm, 0x1e7);
  1129. while ((!(u1_temp & BIT(0))) && (count < 100)) {
  1130. ODM_delay_us(50);
  1131. u1_temp = odm_read_1byte(p_dm_odm, 0x1e7);
  1132. count++;
  1133. }
  1134. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: BT IQK status = %d, count = %d\n", u1_temp, count));
  1135. if (u1_temp & BIT(0)) {
  1136. odm_set_bb_reg(p_dm_odm, 0x948, BIT(6), 0x1);
  1137. odm_set_bb_reg(p_dm_odm, 0x948, BIT(9), default_ant);
  1138. odm_set_bb_reg(p_dm_odm, 0x864, BIT(5) | BIT4 | BIT3, default_ant); /* Default RX */
  1139. odm_set_bb_reg(p_dm_odm, 0x864, BIT(8) | BIT7 | BIT6, optional_ant); /* Optional RX */
  1140. odm_set_bb_reg(p_dm_odm, 0x860, BIT(14) | BIT13 | BIT12, default_ant); /* Default TX */
  1141. p_dm_fat_table->rx_idle_ant = ant;
  1142. /* Set TX AGC by S0/S1 */
  1143. /* Need to consider Linux driver */
  1144. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  1145. p_adapter->hal_func.set_tx_power_level_handler(p_adapter, *p_dm_odm->p_channel);
  1146. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
  1147. rtw_hal_set_tx_power_level(p_adapter, *p_dm_odm->p_channel);
  1148. #endif
  1149. /* Set IQC by S0/S1 */
  1150. odm_set_iqc_by_rfpath(p_dm_odm, default_ant);
  1151. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: Sucess to set RX antenna\n"));
  1152. } else
  1153. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to BT IQK\n"));
  1154. } else
  1155. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: Fail to set RX antenna due to H2C command fail\n"));
  1156. /* Send H2C command to FW */
  1157. /* Disable wifi calibration */
  1158. h2c_parameter = false;
  1159. odm_fill_h2c_cmd(p_dm_odm, ODM_H2C_WIFI_CALIBRATION, 1, &h2c_parameter);
  1160. #else
  1161. odm_set_bb_reg(p_dm_odm, 0x948, BIT(6), 0x1);
  1162. odm_set_bb_reg(p_dm_odm, 0x948, BIT(9), default_ant);
  1163. odm_set_bb_reg(p_dm_odm, 0x864, BIT(5) | BIT4 | BIT3, default_ant); /*Default RX*/
  1164. odm_set_bb_reg(p_dm_odm, 0x864, BIT(8) | BIT7 | BIT6, optional_ant); /*Optional RX*/
  1165. odm_set_bb_reg(p_dm_odm, 0x860, BIT(14) | BIT13 | BIT12, default_ant); /*Default TX*/
  1166. p_dm_fat_table->rx_idle_ant = ant;
  1167. /* Set TX AGC by S0/S1 */
  1168. /* Need to consider Linux driver */
  1169. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  1170. p_adapter->HalFunc.SetTxPowerLevelHandler(p_adapter, *p_dm_odm->p_channel);
  1171. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
  1172. rtw_hal_set_tx_power_level(p_adapter, *p_dm_odm->p_channel);
  1173. #endif
  1174. /* Set IQC by S0/S1 */
  1175. odm_set_iqc_by_rfpath(p_dm_odm, default_ant);
  1176. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-ant ] 8723B: Success to set RX antenna\n"));
  1177. #endif
  1178. }
  1179. boolean
  1180. phydm_is_bt_enable_8723b(
  1181. void *p_dm_void
  1182. )
  1183. {
  1184. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1185. u32 bt_state;
  1186. /*u32 reg75;*/
  1187. /*reg75 = odm_get_bb_reg(p_dm_odm, 0x74, BIT8);*/
  1188. /*odm_set_bb_reg(p_dm_odm, 0x74, BIT8, 0x0);*/
  1189. odm_set_bb_reg(p_dm_odm, 0xa0, BIT(24) | BIT(25) | BIT(26), 0x5);
  1190. bt_state = odm_get_bb_reg(p_dm_odm, 0xa0, (BIT(3) | BIT(2) | BIT(1) | BIT(0)));
  1191. /*odm_set_bb_reg(p_dm_odm, 0x74, BIT8, reg75);*/
  1192. if ((bt_state == 4) || (bt_state == 7) || (bt_state == 9) || (bt_state == 13))
  1193. return true;
  1194. else
  1195. return false;
  1196. }
  1197. #endif /* #if (RTL8723B_SUPPORT == 1) */
  1198. #if (RTL8821A_SUPPORT == 1)
  1199. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
  1200. void
  1201. phydm_hl_smart_ant_type1_init_8821a(
  1202. void *p_dm_void
  1203. )
  1204. {
  1205. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1206. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  1207. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1208. u32 value32;
  1209. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A SmartAnt_Init => ant_div_type=[Hong-Lin Smart ant Type1]\n"));
  1210. #if 0
  1211. /* ---------------------------------------- */
  1212. /* GPIO 2-3 for Beam control */
  1213. /* reg0x66[2]=0 */
  1214. /* reg0x44[27:26] = 0 */
  1215. /* reg0x44[23:16] enable_output for P_GPIO[7:0] */
  1216. /* reg0x44[15:8] output_value for P_GPIO[7:0] */
  1217. /* reg0x40[1:0] = 0 GPIO function */
  1218. /* ------------------------------------------ */
  1219. #endif
  1220. /*GPIO setting*/
  1221. odm_set_mac_reg(p_dm_odm, 0x64, BIT(18), 0);
  1222. odm_set_mac_reg(p_dm_odm, 0x44, BIT(27) | BIT(26), 0);
  1223. odm_set_mac_reg(p_dm_odm, 0x44, BIT(19) | BIT18, 0x3); /*enable_output for P_GPIO[3:2]*/
  1224. /*odm_set_mac_reg(p_dm_odm, 0x44, BIT(11)|BIT10, 0);*/ /*output value*/
  1225. odm_set_mac_reg(p_dm_odm, 0x40, BIT(1) | BIT0, 0); /*GPIO function*/
  1226. /*Hong_lin smart antenna HW setting*/
  1227. pdm_sat_table->rfu_codeword_total_bit_num = 24;/*max=32*/
  1228. pdm_sat_table->rfu_each_ant_bit_num = 4;
  1229. pdm_sat_table->beam_patten_num_each_ant = 4;
  1230. #if DEV_BUS_TYPE == RT_SDIO_INTERFACE
  1231. pdm_sat_table->latch_time = 100; /*mu sec*/
  1232. #elif DEV_BUS_TYPE == RT_USB_INTERFACE
  1233. pdm_sat_table->latch_time = 100; /*mu sec*/
  1234. #endif
  1235. pdm_sat_table->pkt_skip_statistic_en = 0;
  1236. pdm_sat_table->ant_num = 1;/*max=8*/
  1237. pdm_sat_table->ant_num_total = NUM_ANTENNA_8821A;
  1238. pdm_sat_table->first_train_ant = MAIN_ANT;
  1239. pdm_sat_table->rfu_codeword_table[0] = 0x0;
  1240. pdm_sat_table->rfu_codeword_table[1] = 0x4;
  1241. pdm_sat_table->rfu_codeword_table[2] = 0x8;
  1242. pdm_sat_table->rfu_codeword_table[3] = 0xc;
  1243. pdm_sat_table->rfu_codeword_table_5g[0] = 0x1;
  1244. pdm_sat_table->rfu_codeword_table_5g[1] = 0x2;
  1245. pdm_sat_table->rfu_codeword_table_5g[2] = 0x4;
  1246. pdm_sat_table->rfu_codeword_table_5g[3] = 0x8;
  1247. pdm_sat_table->fix_beam_pattern_en = 0;
  1248. pdm_sat_table->decision_holding_period = 0;
  1249. /*beam training setting*/
  1250. pdm_sat_table->pkt_counter = 0;
  1251. pdm_sat_table->per_beam_training_pkt_num = 10;
  1252. /*set default beam*/
  1253. pdm_sat_table->fast_training_beam_num = 0;
  1254. pdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;
  1255. phydm_set_all_ant_same_beam_num(p_dm_odm);
  1256. p_dm_fat_table->fat_state = FAT_BEFORE_LINK_STATE;
  1257. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKDWORD, 0x01000100);
  1258. odm_set_bb_reg(p_dm_odm, 0xCA8, MASKDWORD, 0x01000100);
  1259. /*[BB] FAT setting*/
  1260. odm_set_bb_reg(p_dm_odm, 0xc08, BIT(18) | BIT(17) | BIT(16), pdm_sat_table->ant_num);
  1261. odm_set_bb_reg(p_dm_odm, 0xc08, BIT(31), 0); /*increase ant num every FAT period 0:+1, 1+2*/
  1262. odm_set_bb_reg(p_dm_odm, 0x8c4, BIT(2) | BIT1, 1); /*change cca antenna timming threshold if no CCA occurred: 0:200ms / 1:100ms / 2:no use / 3: 300*/
  1263. odm_set_bb_reg(p_dm_odm, 0x8c4, BIT(0), 1); /*FAT_watchdog_en*/
  1264. value32 = odm_get_mac_reg(p_dm_odm, 0x7B4, MASKDWORD);
  1265. odm_set_mac_reg(p_dm_odm, 0x7b4, MASKDWORD, value32 | (BIT(16) | BIT17)); /*Reg7B4[16]=1 enable antenna training */
  1266. /*Reg7B4[17]=1 enable match MAC addr*/
  1267. odm_set_mac_reg(p_dm_odm, 0x7b4, 0xFFFF, 0);/*Match MAC ADDR*/
  1268. odm_set_mac_reg(p_dm_odm, 0x7b0, MASKDWORD, 0);
  1269. }
  1270. #endif
  1271. void
  1272. odm_trx_hw_ant_div_init_8821a(
  1273. void *p_dm_void
  1274. )
  1275. {
  1276. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1277. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => ant_div_type=[ CG_TRX_HW_ANTDIV (DPDT)]\n"));
  1278. /* Output Pin Settings */
  1279. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(25), 0);
  1280. odm_set_mac_reg(p_dm_odm, 0x64, BIT(29), 1); /* PAPE by WLAN control */
  1281. odm_set_mac_reg(p_dm_odm, 0x64, BIT(28), 1); /* LNAON by WLAN control */
  1282. odm_set_bb_reg(p_dm_odm, 0xCB0, MASKDWORD, 0x77775745);
  1283. odm_set_bb_reg(p_dm_odm, 0xCB8, BIT(16), 0);
  1284. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(23), 0); /* select DPDT_P and DPDT_N as output pin */
  1285. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(24), 1); /* by WLAN control */
  1286. odm_set_bb_reg(p_dm_odm, 0xCB4, 0xF, 8); /* DPDT_P = ANTSEL[0] */
  1287. odm_set_bb_reg(p_dm_odm, 0xCB4, 0xF0, 8); /* DPDT_N = ANTSEL[0] */
  1288. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(29), 0); /* DPDT_P non-inverse */
  1289. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(28), 1); /* DPDT_N inverse */
  1290. /* Mapping Table */
  1291. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE0, 0);
  1292. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE1, 1);
  1293. /* OFDM HW AntDiv Parameters */
  1294. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF, 0xA0); /* thershold */
  1295. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF000, 0x10); /* bias */
  1296. /* CCK HW AntDiv Parameters */
  1297. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(7), 1); /* patch for clk from 88M to 80M */
  1298. odm_set_bb_reg(p_dm_odm, 0xA0C, BIT(4), 1); /* do 64 samples */
  1299. odm_set_bb_reg(p_dm_odm, 0x800, BIT(25), 0); /* ANTSEL_CCK sent to the smart_antenna circuit */
  1300. odm_set_bb_reg(p_dm_odm, 0xA00, BIT(15), 0); /* CCK AntDiv function block enable */
  1301. /* BT Coexistence */
  1302. odm_set_bb_reg(p_dm_odm, 0xCAC, BIT(9), 1); /* keep antsel_map when GNT_BT = 1 */
  1303. odm_set_bb_reg(p_dm_odm, 0x804, BIT(4), 1); /* Disable hw antsw & fast_train.antsw when GNT_BT=1 */
  1304. odm_set_bb_reg(p_dm_odm, 0x8CC, BIT(20) | BIT19 | BIT18, 3); /* settling time of antdiv by RF LNA = 100ns */
  1305. /* response TX ant by RX ant */
  1306. odm_set_mac_reg(p_dm_odm, 0x668, BIT(3), 1);
  1307. }
  1308. void
  1309. odm_s0s1_sw_ant_div_init_8821a(
  1310. void *p_dm_void
  1311. )
  1312. {
  1313. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1314. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  1315. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => ant_div_type=[ S0S1_SW_AntDiv]\n"));
  1316. /* Output Pin Settings */
  1317. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(25), 0);
  1318. odm_set_mac_reg(p_dm_odm, 0x64, BIT(29), 1); /* PAPE by WLAN control */
  1319. odm_set_mac_reg(p_dm_odm, 0x64, BIT(28), 1); /* LNAON by WLAN control */
  1320. odm_set_bb_reg(p_dm_odm, 0xCB0, MASKDWORD, 0x77775745);
  1321. odm_set_bb_reg(p_dm_odm, 0xCB8, BIT(16), 0);
  1322. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(23), 0); /* select DPDT_P and DPDT_N as output pin */
  1323. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(24), 1); /* by WLAN control */
  1324. odm_set_bb_reg(p_dm_odm, 0xCB4, 0xF, 8); /* DPDT_P = ANTSEL[0] */
  1325. odm_set_bb_reg(p_dm_odm, 0xCB4, 0xF0, 8); /* DPDT_N = ANTSEL[0] */
  1326. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(29), 0); /* DPDT_P non-inverse */
  1327. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(28), 1); /* DPDT_N inverse */
  1328. /* Mapping Table */
  1329. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE0, 0);
  1330. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE1, 1);
  1331. /* OFDM HW AntDiv Parameters */
  1332. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF, 0xA0); /* thershold */
  1333. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF000, 0x10); /* bias */
  1334. /* CCK HW AntDiv Parameters */
  1335. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(7), 1); /* patch for clk from 88M to 80M */
  1336. odm_set_bb_reg(p_dm_odm, 0xA0C, BIT(4), 1); /* do 64 samples */
  1337. odm_set_bb_reg(p_dm_odm, 0x800, BIT(25), 0); /* ANTSEL_CCK sent to the smart_antenna circuit */
  1338. odm_set_bb_reg(p_dm_odm, 0xA00, BIT(15), 0); /* CCK AntDiv function block enable */
  1339. /* BT Coexistence */
  1340. odm_set_bb_reg(p_dm_odm, 0xCAC, BIT(9), 1); /* keep antsel_map when GNT_BT = 1 */
  1341. odm_set_bb_reg(p_dm_odm, 0x804, BIT(4), 1); /* Disable hw antsw & fast_train.antsw when GNT_BT=1 */
  1342. odm_set_bb_reg(p_dm_odm, 0x8CC, BIT(20) | BIT19 | BIT18, 3); /* settling time of antdiv by RF LNA = 100ns */
  1343. /* response TX ant by RX ant */
  1344. odm_set_mac_reg(p_dm_odm, 0x668, BIT(3), 1);
  1345. odm_set_bb_reg(p_dm_odm, 0x900, BIT(18), 0);
  1346. p_dm_swat_table->try_flag = SWAW_STEP_INIT;
  1347. p_dm_swat_table->double_chk_flag = 0;
  1348. p_dm_swat_table->cur_antenna = MAIN_ANT;
  1349. p_dm_swat_table->pre_antenna = MAIN_ANT;
  1350. p_dm_swat_table->swas_no_link_state = 0;
  1351. }
  1352. #endif /* #if (RTL8821A_SUPPORT == 1) */
  1353. #if (RTL8822B_SUPPORT == 1)
  1354. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  1355. void
  1356. phydm_hl_smart_ant_type2_init_8822b(
  1357. void *p_dm_void
  1358. )
  1359. {
  1360. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1361. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  1362. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1363. u8 j;
  1364. u8 rfu_codeword_table_init_2g[SUPPORT_BEAM_SET_PATTERN_NUM][MAX_PATH_NUM_8822B] = {
  1365. {1, 1},/*0*/
  1366. {1, 2},
  1367. {2, 1},
  1368. {2, 2},
  1369. {4, 0},
  1370. {5, 0},
  1371. {6, 0},
  1372. {7, 0},
  1373. {8, 0},/*8*/
  1374. {9, 0},
  1375. {0xa, 0},
  1376. {0xb, 0},
  1377. {0xc, 0},
  1378. {0xd, 0},
  1379. {0xe, 0},
  1380. {0xf, 0}
  1381. };
  1382. u8 rfu_codeword_table_init_5g[SUPPORT_BEAM_SET_PATTERN_NUM][MAX_PATH_NUM_8822B] ={
  1383. #if 1
  1384. {9, 1},/*0*/
  1385. {9, 9},
  1386. {1, 9},
  1387. {9, 6},
  1388. {2, 1},
  1389. {2, 9},
  1390. {9, 2},
  1391. {2, 2},/*8*/
  1392. {6, 1},
  1393. {6, 9},
  1394. {2, 9},
  1395. {2, 2},
  1396. {6, 2},
  1397. {6, 6},
  1398. {2, 6},
  1399. {1, 1}
  1400. #else
  1401. {1, 1},/*0*/
  1402. {9, 1},
  1403. {9, 9},
  1404. {1, 9},
  1405. {1, 2},
  1406. {9, 2},
  1407. {9, 6},
  1408. {1, 6},
  1409. {2, 1},/*8*/
  1410. {6, 1},
  1411. {6, 9},
  1412. {2, 9},
  1413. {2, 2},
  1414. {6, 2},
  1415. {6, 6},
  1416. {2, 6}
  1417. #endif
  1418. };
  1419. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***RTK 8822B SmartAnt_Init: Hong-Bo SmrtAnt Type2]\n"));
  1420. /* ---------------------------------------- */
  1421. /* GPIO 0-1 for Beam control */
  1422. /* reg0x66[2:0]=0 */
  1423. /* reg0x44[25:24] = 0 */
  1424. /* reg0x44[23:16] enable_output for P_GPIO[7:0] */
  1425. /* reg0x44[15:8] output_value for P_GPIO[7:0] */
  1426. /* reg0x40[1:0] = 0 GPIO function */
  1427. /* ------------------------------------------ */
  1428. odm_move_memory(p_dm_odm, pdm_sat_table->rfu_codeword_table_2g, rfu_codeword_table_init_2g, (SUPPORT_BEAM_SET_PATTERN_NUM * MAX_PATH_NUM_8822B));
  1429. odm_move_memory(p_dm_odm, pdm_sat_table->rfu_codeword_table_5g, rfu_codeword_table_init_5g, (SUPPORT_BEAM_SET_PATTERN_NUM * MAX_PATH_NUM_8822B));
  1430. /*GPIO setting*/
  1431. odm_set_mac_reg(p_dm_odm, 0x64, (BIT(18) | BIT(17) | BIT(16)), 0);
  1432. odm_set_mac_reg(p_dm_odm, 0x44, BIT(25) | BIT24, 0); /*config P_GPIO[3:2] to data port*/
  1433. odm_set_mac_reg(p_dm_odm, 0x44, BIT(17) | BIT16, 0x3); /*enable_output for P_GPIO[3:2]*/
  1434. /*odm_set_mac_reg(p_dm_odm, 0x44, BIT(9)|BIT8, 0);*/ /*P_GPIO[3:2] output value*/
  1435. odm_set_mac_reg(p_dm_odm, 0x40, BIT(1) | BIT0, 0); /*GPIO function*/
  1436. /*Hong_lin smart antenna HW setting*/
  1437. pdm_sat_table->rfu_protocol_type = 2;
  1438. pdm_sat_table->rfu_protocol_delay_time = 45;
  1439. pdm_sat_table->rfu_codeword_total_bit_num = 16;/*max=32bit*/
  1440. pdm_sat_table->rfu_each_ant_bit_num = 4;
  1441. pdm_sat_table->total_beam_set_num = 4;
  1442. pdm_sat_table->total_beam_set_num_2g = 4;
  1443. pdm_sat_table->total_beam_set_num_5g = 8;
  1444. #if DEV_BUS_TYPE == RT_SDIO_INTERFACE
  1445. pdm_sat_table->latch_time = 100; /*mu sec*/
  1446. #elif DEV_BUS_TYPE == RT_USB_INTERFACE
  1447. pdm_sat_table->latch_time = 100; /*mu sec*/
  1448. #endif
  1449. pdm_sat_table->pkt_skip_statistic_en = 0;
  1450. pdm_sat_table->ant_num = 2;
  1451. pdm_sat_table->ant_num_total = MAX_PATH_NUM_8822B;
  1452. pdm_sat_table->first_train_ant = MAIN_ANT;
  1453. pdm_sat_table->fix_beam_pattern_en = 0;
  1454. pdm_sat_table->decision_holding_period = 0;
  1455. /*beam training setting*/
  1456. pdm_sat_table->pkt_counter = 0;
  1457. pdm_sat_table->per_beam_training_pkt_num = 10;
  1458. /*set default beam*/
  1459. pdm_sat_table->fast_training_beam_num = 0;
  1460. pdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;
  1461. for (j = 0; j < SUPPORT_BEAM_SET_PATTERN_NUM; j++) {
  1462. pdm_sat_table->beam_set_avg_rssi_pre[j] = 0;
  1463. pdm_sat_table->beam_set_train_rssi_diff[j] = 0;
  1464. pdm_sat_table->beam_set_train_cnt[j] = 0;
  1465. }
  1466. phydm_set_rfu_beam_pattern_type2(p_dm_odm);
  1467. p_dm_fat_table->fat_state = FAT_BEFORE_LINK_STATE;
  1468. }
  1469. #endif
  1470. #endif
  1471. #if (RTL8821C_SUPPORT == 1)
  1472. void
  1473. odm_trx_hw_ant_div_init_8821c(
  1474. void *p_dm_void
  1475. )
  1476. {
  1477. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1478. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821C AntDiv_Init => ant_div_type=[ CG_TRX_HW_ANTDIV (DPDT)]\n"));
  1479. /* Output Pin Settings */
  1480. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(25), 0);
  1481. odm_set_mac_reg(p_dm_odm, 0x64, BIT(29), 1); /* PAPE by WLAN control */
  1482. odm_set_mac_reg(p_dm_odm, 0x64, BIT(28), 1); /* LNAON by WLAN control */
  1483. odm_set_bb_reg(p_dm_odm, 0xCB0, MASKDWORD, 0x77775745);
  1484. odm_set_bb_reg(p_dm_odm, 0xCB8, BIT(16), 0);
  1485. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(23), 0); /* select DPDT_P and DPDT_N as output pin */
  1486. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(24), 1); /* by WLAN control */
  1487. odm_set_bb_reg(p_dm_odm, 0xCB4, 0xF, 8); /* DPDT_P = ANTSEL[0] */
  1488. odm_set_bb_reg(p_dm_odm, 0xCB4, 0xF0, 8); /* DPDT_N = ANTSEL[0] */
  1489. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(29), 0); /* DPDT_P non-inverse */
  1490. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(28), 1); /* DPDT_N inverse */
  1491. /* Mapping Table */
  1492. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE0, 0);
  1493. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE1, 1);
  1494. /* OFDM HW AntDiv Parameters */
  1495. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF, 0xA0); /* thershold */
  1496. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF000, 0x10); /* bias */
  1497. /* CCK HW AntDiv Parameters */
  1498. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(7), 1); /* patch for clk from 88M to 80M */
  1499. odm_set_bb_reg(p_dm_odm, 0xA0C, BIT(4), 1); /* do 64 samples */
  1500. odm_set_bb_reg(p_dm_odm, 0x800, BIT(25), 0); /* ANTSEL_CCK sent to the smart_antenna circuit */
  1501. odm_set_bb_reg(p_dm_odm, 0xA00, BIT(15), 0); /* CCK AntDiv function block enable */
  1502. /* BT Coexistence */
  1503. odm_set_bb_reg(p_dm_odm, 0xCAC, BIT(9), 1); /* keep antsel_map when GNT_BT = 1 */
  1504. odm_set_bb_reg(p_dm_odm, 0x804, BIT(4), 1); /* Disable hw antsw & fast_train.antsw when GNT_BT=1 */
  1505. /* Timming issue */
  1506. odm_set_bb_reg(p_dm_odm, 0x818, BIT(23) | BIT22 | BIT21 | BIT20, 0); /*keep antidx after tx for ACK ( unit x 3.2 mu sec)*/
  1507. odm_set_bb_reg(p_dm_odm, 0x8CC, BIT(20) | BIT19 | BIT18, 3); /* settling time of antdiv by RF LNA = 100ns */
  1508. /* response TX ant by RX ant */
  1509. odm_set_mac_reg(p_dm_odm, 0x668, BIT(3), 1);
  1510. }
  1511. #endif /* #if (RTL8821C_SUPPORT == 1) */
  1512. #if (RTL8881A_SUPPORT == 1)
  1513. void
  1514. odm_trx_hw_ant_div_init_8881a(
  1515. void *p_dm_void
  1516. )
  1517. {
  1518. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1519. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => ant_div_type=[ CG_TRX_HW_ANTDIV (SPDT)]\n"));
  1520. /* Output Pin Settings */
  1521. /* [SPDT related] */
  1522. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(25), 0);
  1523. odm_set_mac_reg(p_dm_odm, 0x4C, BIT(26), 0);
  1524. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(31), 0); /* delay buffer */
  1525. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(22), 0);
  1526. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(24), 1);
  1527. odm_set_bb_reg(p_dm_odm, 0xCB0, 0xF00, 8); /* DPDT_P = ANTSEL[0] */
  1528. odm_set_bb_reg(p_dm_odm, 0xCB0, 0xF0000, 8); /* DPDT_N = ANTSEL[0] */
  1529. /* Mapping Table */
  1530. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE0, 0);
  1531. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE1, 1);
  1532. /* OFDM HW AntDiv Parameters */
  1533. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF, 0xA0); /* thershold */
  1534. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF000, 0x0); /* bias */
  1535. odm_set_bb_reg(p_dm_odm, 0x8CC, BIT(20) | BIT19 | BIT18, 3); /* settling time of antdiv by RF LNA = 100ns */
  1536. /* CCK HW AntDiv Parameters */
  1537. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(7), 1); /* patch for clk from 88M to 80M */
  1538. odm_set_bb_reg(p_dm_odm, 0xA0C, BIT(4), 1); /* do 64 samples */
  1539. /* 2 [--For HW Bug setting] */
  1540. odm_set_bb_reg(p_dm_odm, 0x900, BIT(18), 0); /* TX ant by Reg */ /* A-cut bug */
  1541. }
  1542. #endif /* #if (RTL8881A_SUPPORT == 1) */
  1543. #if (RTL8812A_SUPPORT == 1)
  1544. void
  1545. odm_trx_hw_ant_div_init_8812a(
  1546. void *p_dm_void
  1547. )
  1548. {
  1549. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1550. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8812A AntDiv_Init => ant_div_type=[ CG_TRX_HW_ANTDIV (SPDT)]\n"));
  1551. /* 3 */ /* 3 --RFE pin setting--------- */
  1552. /* [BB] */
  1553. odm_set_bb_reg(p_dm_odm, 0x900, BIT(10) | BIT9 | BIT8, 0x0); /* disable SW switch */
  1554. odm_set_bb_reg(p_dm_odm, 0x900, BIT(17) | BIT(16), 0x0);
  1555. odm_set_bb_reg(p_dm_odm, 0x974, BIT(7) | BIT6, 0x3); /* in/out */
  1556. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(31), 0); /* delay buffer */
  1557. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(26), 0);
  1558. odm_set_bb_reg(p_dm_odm, 0xCB4, BIT(27), 1);
  1559. odm_set_bb_reg(p_dm_odm, 0xCB0, 0xF000000, 8); /* DPDT_P = ANTSEL[0] */
  1560. odm_set_bb_reg(p_dm_odm, 0xCB0, 0xF0000000, 8); /* DPDT_N = ANTSEL[0] */
  1561. /* 3 ------------------------- */
  1562. /* Mapping Table */
  1563. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE0, 0);
  1564. odm_set_bb_reg(p_dm_odm, 0xCA4, MASKBYTE1, 1);
  1565. /* OFDM HW AntDiv Parameters */
  1566. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF, 0xA0); /* thershold */
  1567. odm_set_bb_reg(p_dm_odm, 0x8D4, 0x7FF000, 0x0); /* bias */
  1568. odm_set_bb_reg(p_dm_odm, 0x8CC, BIT(20) | BIT19 | BIT18, 3); /* settling time of antdiv by RF LNA = 100ns */
  1569. /* CCK HW AntDiv Parameters */
  1570. odm_set_bb_reg(p_dm_odm, 0xA74, BIT(7), 1); /* patch for clk from 88M to 80M */
  1571. odm_set_bb_reg(p_dm_odm, 0xA0C, BIT(4), 1); /* do 64 samples */
  1572. /* 2 [--For HW Bug setting] */
  1573. odm_set_bb_reg(p_dm_odm, 0x900, BIT(18), 0); /* TX ant by Reg */ /* A-cut bug */
  1574. }
  1575. #endif /* #if (RTL8812A_SUPPORT == 1) */
  1576. #if (RTL8188F_SUPPORT == 1)
  1577. void
  1578. odm_s0s1_sw_ant_div_init_8188f(
  1579. void *p_dm_void
  1580. )
  1581. {
  1582. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1583. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  1584. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1585. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188F AntDiv_Init => ant_div_type=[ S0S1_SW_AntDiv]\n"));
  1586. /*GPIO setting*/
  1587. /*odm_set_mac_reg(p_dm_odm, 0x64, BIT18, 0); */
  1588. /*odm_set_mac_reg(p_dm_odm, 0x44, BIT28|BIT27, 0);*/
  1589. odm_set_mac_reg(p_dm_odm, 0x44, BIT(20) | BIT19, 0x3); /*enable_output for P_GPIO[4:3]*/
  1590. /*odm_set_mac_reg(p_dm_odm, 0x44, BIT(12)|BIT11, 0);*/ /*output value*/
  1591. /*odm_set_mac_reg(p_dm_odm, 0x40, BIT(1)|BIT0, 0);*/ /*GPIO function*/
  1592. p_dm_fat_table->is_become_linked = false;
  1593. p_dm_swat_table->try_flag = SWAW_STEP_INIT;
  1594. p_dm_swat_table->double_chk_flag = 0;
  1595. }
  1596. void
  1597. phydm_update_rx_idle_antenna_8188F(
  1598. void *p_dm_void,
  1599. u32 default_ant
  1600. )
  1601. {
  1602. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1603. u8 codeword;
  1604. if (default_ant == ANT1_2G)
  1605. codeword = 1; /*2'b01*/
  1606. else
  1607. codeword = 2;/*2'b10*/
  1608. odm_set_mac_reg(p_dm_odm, 0x44, (BIT(12) | BIT11), codeword); /*GPIO[4:3] output value*/
  1609. }
  1610. #endif
  1611. #ifdef ODM_EVM_ENHANCE_ANTDIV
  1612. void
  1613. odm_evm_fast_ant_reset(
  1614. void *p_dm_void
  1615. )
  1616. {
  1617. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1618. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1619. p_dm_fat_table->EVM_method_enable = 0;
  1620. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON);
  1621. p_dm_fat_table->fat_state = NORMAL_STATE_MIAN;
  1622. p_dm_odm->antdiv_period = 0;
  1623. odm_set_mac_reg(p_dm_odm, 0x608, BIT(8), 0);
  1624. }
  1625. void
  1626. odm_evm_enhance_ant_div(
  1627. void *p_dm_void
  1628. )
  1629. {
  1630. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1631. u32 main_rssi, aux_rssi ;
  1632. u32 main_crc_utility = 0, aux_crc_utility = 0, utility_ratio = 1;
  1633. u32 main_evm, aux_evm, diff_rssi = 0, diff_EVM = 0;
  1634. u8 score_EVM = 0, score_CRC = 0;
  1635. u8 rssi_larger_ant = 0;
  1636. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1637. u32 value32, i;
  1638. boolean main_above1 = false, aux_above1 = false;
  1639. boolean force_antenna = false;
  1640. struct sta_info *p_entry;
  1641. p_dm_fat_table->target_ant_enhance = 0xFF;
  1642. if ((p_dm_odm->support_ic_type & ODM_EVM_ENHANCE_ANTDIV_SUPPORT_IC)) {
  1643. if (p_dm_odm->is_one_entry_only) {
  1644. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[One Client only]\n")); */
  1645. i = p_dm_odm->one_entry_macid;
  1646. main_rssi = (p_dm_fat_table->main_ant_cnt[i] != 0) ? (p_dm_fat_table->main_ant_sum[i] / p_dm_fat_table->main_ant_cnt[i]) : 0;
  1647. aux_rssi = (p_dm_fat_table->aux_ant_cnt[i] != 0) ? (p_dm_fat_table->aux_ant_sum[i] / p_dm_fat_table->aux_ant_cnt[i]) : 0;
  1648. if ((main_rssi == 0 && aux_rssi != 0 && aux_rssi >= FORCE_RSSI_DIFF) || (main_rssi != 0 && aux_rssi == 0 && main_rssi >= FORCE_RSSI_DIFF))
  1649. diff_rssi = FORCE_RSSI_DIFF;
  1650. else if (main_rssi != 0 && aux_rssi != 0)
  1651. diff_rssi = (main_rssi >= aux_rssi) ? (main_rssi - aux_rssi) : (aux_rssi - main_rssi);
  1652. if (main_rssi >= aux_rssi)
  1653. rssi_larger_ant = MAIN_ANT;
  1654. else
  1655. rssi_larger_ant = AUX_ANT;
  1656. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" Main_Cnt = (( %d )) , main_rssi= (( %d ))\n", p_dm_fat_table->main_ant_cnt[i], main_rssi));
  1657. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" Aux_Cnt = (( %d )) , aux_rssi = (( %d ))\n", p_dm_fat_table->aux_ant_cnt[i], aux_rssi));
  1658. if (((main_rssi >= evm_rssi_th_high || aux_rssi >= evm_rssi_th_high) || (p_dm_fat_table->EVM_method_enable == 1))
  1659. /* && (diff_rssi <= FORCE_RSSI_DIFF + 1) */
  1660. ) {
  1661. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[> TH_H || EVM_method_enable==1] && "));
  1662. if (((main_rssi >= evm_rssi_th_low) || (aux_rssi >= evm_rssi_th_low))) {
  1663. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[> TH_L ]\n"));
  1664. /* 2 [ Normal state Main] */
  1665. if (p_dm_fat_table->fat_state == NORMAL_STATE_MIAN) {
  1666. p_dm_fat_table->EVM_method_enable = 1;
  1667. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  1668. p_dm_odm->antdiv_period = p_dm_odm->evm_antdiv_period;
  1669. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ start training: MIAN]\n"));
  1670. p_dm_fat_table->main_ant_evm_sum[i] = 0;
  1671. p_dm_fat_table->aux_ant_evm_sum[i] = 0;
  1672. p_dm_fat_table->main_ant_evm_cnt[i] = 0;
  1673. p_dm_fat_table->aux_ant_evm_cnt[i] = 0;
  1674. p_dm_fat_table->fat_state = NORMAL_STATE_AUX;
  1675. odm_set_mac_reg(p_dm_odm, 0x608, BIT(8), 1); /* Accept CRC32 Error packets. */
  1676. odm_update_rx_idle_ant(p_dm_odm, MAIN_ANT);
  1677. p_dm_fat_table->crc32_ok_cnt = 0;
  1678. p_dm_fat_table->crc32_fail_cnt = 0;
  1679. odm_set_timer(p_dm_odm, &p_dm_odm->evm_fast_ant_training_timer, p_dm_odm->antdiv_intvl); /* m */
  1680. }
  1681. /* 2 [ Normal state Aux ] */
  1682. else if (p_dm_fat_table->fat_state == NORMAL_STATE_AUX) {
  1683. p_dm_fat_table->main_crc32_ok_cnt = p_dm_fat_table->crc32_ok_cnt;
  1684. p_dm_fat_table->main_crc32_fail_cnt = p_dm_fat_table->crc32_fail_cnt;
  1685. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ start training: AUX]\n"));
  1686. p_dm_fat_table->fat_state = TRAINING_STATE;
  1687. odm_update_rx_idle_ant(p_dm_odm, AUX_ANT);
  1688. p_dm_fat_table->crc32_ok_cnt = 0;
  1689. p_dm_fat_table->crc32_fail_cnt = 0;
  1690. odm_set_timer(p_dm_odm, &p_dm_odm->evm_fast_ant_training_timer, p_dm_odm->antdiv_intvl); /* ms */
  1691. } else if (p_dm_fat_table->fat_state == TRAINING_STATE) {
  1692. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Training state ]\n"));
  1693. p_dm_fat_table->fat_state = NORMAL_STATE_MIAN;
  1694. /* 3 [CRC32 statistic] */
  1695. p_dm_fat_table->aux_crc32_ok_cnt = p_dm_fat_table->crc32_ok_cnt;
  1696. p_dm_fat_table->aux_crc32_fail_cnt = p_dm_fat_table->crc32_fail_cnt;
  1697. if ((p_dm_fat_table->main_crc32_ok_cnt > ((p_dm_fat_table->aux_crc32_ok_cnt) << 1)) || ((diff_rssi >= 20) && (rssi_larger_ant == MAIN_ANT))) {
  1698. p_dm_fat_table->target_ant_crc32 = MAIN_ANT;
  1699. force_antenna = true;
  1700. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CRC32 Force Main\n"));
  1701. } else if ((p_dm_fat_table->aux_crc32_ok_cnt > ((p_dm_fat_table->main_crc32_ok_cnt) << 1)) || ((diff_rssi >= 20) && (rssi_larger_ant == AUX_ANT))) {
  1702. p_dm_fat_table->target_ant_crc32 = AUX_ANT;
  1703. force_antenna = true;
  1704. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CRC32 Force Aux\n"));
  1705. } else {
  1706. if (p_dm_fat_table->main_crc32_fail_cnt <= 5)
  1707. p_dm_fat_table->main_crc32_fail_cnt = 5;
  1708. if (p_dm_fat_table->aux_crc32_fail_cnt <= 5)
  1709. p_dm_fat_table->aux_crc32_fail_cnt = 5;
  1710. if (p_dm_fat_table->main_crc32_ok_cnt > p_dm_fat_table->main_crc32_fail_cnt)
  1711. main_above1 = true;
  1712. if (p_dm_fat_table->aux_crc32_ok_cnt > p_dm_fat_table->aux_crc32_fail_cnt)
  1713. aux_above1 = true;
  1714. if (main_above1 == true && aux_above1 == false) {
  1715. force_antenna = true;
  1716. p_dm_fat_table->target_ant_crc32 = MAIN_ANT;
  1717. } else if (main_above1 == false && aux_above1 == true) {
  1718. force_antenna = true;
  1719. p_dm_fat_table->target_ant_crc32 = AUX_ANT;
  1720. } else if (main_above1 == true && aux_above1 == true) {
  1721. main_crc_utility = ((p_dm_fat_table->main_crc32_ok_cnt) << 7) / p_dm_fat_table->main_crc32_fail_cnt;
  1722. aux_crc_utility = ((p_dm_fat_table->aux_crc32_ok_cnt) << 7) / p_dm_fat_table->aux_crc32_fail_cnt;
  1723. p_dm_fat_table->target_ant_crc32 = (main_crc_utility == aux_crc_utility) ? (p_dm_fat_table->pre_target_ant_enhance) : ((main_crc_utility >= aux_crc_utility) ? MAIN_ANT : AUX_ANT);
  1724. if (main_crc_utility != 0 && aux_crc_utility != 0) {
  1725. if (main_crc_utility >= aux_crc_utility)
  1726. utility_ratio = (main_crc_utility << 1) / aux_crc_utility;
  1727. else
  1728. utility_ratio = (aux_crc_utility << 1) / main_crc_utility;
  1729. }
  1730. } else if (main_above1 == false && aux_above1 == false) {
  1731. if (p_dm_fat_table->main_crc32_ok_cnt == 0)
  1732. p_dm_fat_table->main_crc32_ok_cnt = 1;
  1733. if (p_dm_fat_table->aux_crc32_ok_cnt == 0)
  1734. p_dm_fat_table->aux_crc32_ok_cnt = 1;
  1735. main_crc_utility = ((p_dm_fat_table->main_crc32_fail_cnt) << 7) / p_dm_fat_table->main_crc32_ok_cnt;
  1736. aux_crc_utility = ((p_dm_fat_table->aux_crc32_fail_cnt) << 7) / p_dm_fat_table->aux_crc32_ok_cnt;
  1737. p_dm_fat_table->target_ant_crc32 = (main_crc_utility == aux_crc_utility) ? (p_dm_fat_table->pre_target_ant_enhance) : ((main_crc_utility <= aux_crc_utility) ? MAIN_ANT : AUX_ANT);
  1738. if (main_crc_utility != 0 && aux_crc_utility != 0) {
  1739. if (main_crc_utility >= aux_crc_utility)
  1740. utility_ratio = (main_crc_utility << 1) / (aux_crc_utility);
  1741. else
  1742. utility_ratio = (aux_crc_utility << 1) / (main_crc_utility);
  1743. }
  1744. }
  1745. }
  1746. odm_set_mac_reg(p_dm_odm, 0x608, BIT(8), 0);/* NOT Accept CRC32 Error packets. */
  1747. /* 3 [EVM statistic] */
  1748. main_evm = (p_dm_fat_table->main_ant_evm_cnt[i] != 0) ? (p_dm_fat_table->main_ant_evm_sum[i] / p_dm_fat_table->main_ant_evm_cnt[i]) : 0;
  1749. aux_evm = (p_dm_fat_table->aux_ant_evm_cnt[i] != 0) ? (p_dm_fat_table->aux_ant_evm_sum[i] / p_dm_fat_table->aux_ant_evm_cnt[i]) : 0;
  1750. p_dm_fat_table->target_ant_evm = (main_evm == aux_evm) ? (p_dm_fat_table->pre_target_ant_enhance) : ((main_evm >= aux_evm) ? MAIN_ANT : AUX_ANT);
  1751. if ((main_evm == 0 || aux_evm == 0))
  1752. diff_EVM = 0;
  1753. else if (main_evm >= aux_evm)
  1754. diff_EVM = main_evm - aux_evm;
  1755. else
  1756. diff_EVM = aux_evm - main_evm;
  1757. /* 2 [ Decision state ] */
  1758. if (p_dm_fat_table->target_ant_evm == p_dm_fat_table->target_ant_crc32) {
  1759. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Decision type 1, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM));
  1760. if ((utility_ratio < 2 && force_antenna == false) && diff_EVM <= 30)
  1761. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->pre_target_ant_enhance;
  1762. else
  1763. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->target_ant_evm;
  1764. } else if ((diff_EVM <= 50 && (utility_ratio > 4 && force_antenna == false)) || (force_antenna == true)) {
  1765. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Decision type 2, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM));
  1766. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->target_ant_crc32;
  1767. } else if (diff_EVM >= 100) {
  1768. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Decision type 3, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM));
  1769. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->target_ant_evm;
  1770. } else if (utility_ratio >= 6 && force_antenna == false) {
  1771. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Decision type 4, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM));
  1772. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->target_ant_crc32;
  1773. } else {
  1774. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Decision type 5, CRC_utility = ((%d)), EVM_diff = ((%d))\n", utility_ratio, diff_EVM));
  1775. if (force_antenna == true)
  1776. score_CRC = 3;
  1777. else if (utility_ratio >= 3) /*>0.5*/
  1778. score_CRC = 2;
  1779. else if (utility_ratio >= 2) /*>1*/
  1780. score_CRC = 1;
  1781. else
  1782. score_CRC = 0;
  1783. if (diff_EVM >= 100)
  1784. score_EVM = 2;
  1785. else if (diff_EVM >= 50)
  1786. score_EVM = 1;
  1787. else
  1788. score_EVM = 0;
  1789. if (score_CRC > score_EVM)
  1790. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->target_ant_crc32;
  1791. else if (score_CRC < score_EVM)
  1792. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->target_ant_evm;
  1793. else
  1794. p_dm_fat_table->target_ant_enhance = p_dm_fat_table->pre_target_ant_enhance;
  1795. }
  1796. p_dm_fat_table->pre_target_ant_enhance = p_dm_fat_table->target_ant_enhance;
  1797. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : MainEVM_Cnt = (( %d )) , main_evm= (( %d ))\n", i, p_dm_fat_table->main_ant_evm_cnt[i], main_evm));
  1798. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : AuxEVM_Cnt = (( %d )) , aux_evm = (( %d ))\n", i, p_dm_fat_table->aux_ant_evm_cnt[i], aux_evm));
  1799. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** target_ant_evm = (( %s ))\n", (p_dm_fat_table->target_ant_evm == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  1800. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("M_CRC_Ok = (( %d )) , M_CRC_Fail = (( %d )), main_crc_utility = (( %d ))\n", p_dm_fat_table->main_crc32_ok_cnt, p_dm_fat_table->main_crc32_fail_cnt, main_crc_utility));
  1801. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("A_CRC_Ok = (( %d )) , A_CRC_Fail = (( %d )), aux_crc_utility = (( %d ))\n", p_dm_fat_table->aux_crc32_ok_cnt, p_dm_fat_table->aux_crc32_fail_cnt, aux_crc_utility));
  1802. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** target_ant_crc32 = (( %s ))\n", (p_dm_fat_table->target_ant_crc32 == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  1803. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("****** target_ant_enhance = (( %s ))******\n", (p_dm_fat_table->target_ant_enhance == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  1804. }
  1805. } else { /* RSSI< = evm_rssi_th_low */
  1806. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ <TH_L: escape from > TH_L ]\n"));
  1807. odm_evm_fast_ant_reset(p_dm_odm);
  1808. }
  1809. } else {
  1810. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[escape from> TH_H || EVM_method_enable==1]\n"));
  1811. odm_evm_fast_ant_reset(p_dm_odm);
  1812. }
  1813. } else {
  1814. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[multi-Client]\n"));
  1815. odm_evm_fast_ant_reset(p_dm_odm);
  1816. }
  1817. }
  1818. }
  1819. void
  1820. odm_evm_fast_ant_training_callback(
  1821. void *p_dm_void
  1822. )
  1823. {
  1824. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1825. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("******odm_evm_fast_ant_training_callback******\n"));
  1826. odm_hw_ant_div(p_dm_odm);
  1827. }
  1828. #endif
  1829. void
  1830. odm_hw_ant_div(
  1831. void *p_dm_void
  1832. )
  1833. {
  1834. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  1835. u32 i, min_max_rssi = 0xFF, ant_div_max_rssi = 0, max_rssi = 0, local_max_rssi;
  1836. u32 main_rssi, aux_rssi, mian_cnt, aux_cnt;
  1837. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  1838. u8 rx_idle_ant = p_dm_fat_table->rx_idle_ant, target_ant = 7;
  1839. struct _dynamic_initial_gain_threshold_ *p_dm_dig_table = &p_dm_odm->dm_dig_table;
  1840. struct sta_info *p_entry;
  1841. #if (BEAMFORMING_SUPPORT == 1)
  1842. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  1843. struct _BF_DIV_COEX_ *p_dm_bdc_table = &p_dm_odm->dm_bdc_table;
  1844. u32 TH1 = 500000;
  1845. u32 TH2 = 10000000;
  1846. u32 ma_rx_temp, degrade_TP_temp, improve_TP_temp;
  1847. u8 monitor_rssi_threshold = 30;
  1848. p_dm_bdc_table->BF_pass = true;
  1849. p_dm_bdc_table->DIV_pass = true;
  1850. p_dm_bdc_table->is_all_div_sta_idle = true;
  1851. p_dm_bdc_table->is_all_bf_sta_idle = true;
  1852. p_dm_bdc_table->num_bf_tar = 0 ;
  1853. p_dm_bdc_table->num_div_tar = 0;
  1854. p_dm_bdc_table->num_client = 0;
  1855. #endif
  1856. #endif
  1857. if (!p_dm_odm->is_linked) { /* is_linked==False */
  1858. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
  1859. if (p_dm_fat_table->is_become_linked == true) {
  1860. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  1861. odm_update_rx_idle_ant(p_dm_odm, MAIN_ANT);
  1862. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  1863. p_dm_odm->antdiv_period = 0;
  1864. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  1865. }
  1866. return;
  1867. } else {
  1868. if (p_dm_fat_table->is_become_linked == false) {
  1869. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));
  1870. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON);
  1871. /*odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_DESC);*/
  1872. /* if(p_dm_odm->support_ic_type == ODM_RTL8821 ) */
  1873. /* odm_set_bb_reg(p_dm_odm, 0x800, BIT(25), 0); */ /* CCK AntDiv function disable */
  1874. /* #if(DM_ODM_SUPPORT_TYPE == ODM_AP) */
  1875. /* else if(p_dm_odm->support_ic_type == ODM_RTL8881A) */
  1876. /* odm_set_bb_reg(p_dm_odm, 0x800, BIT(25), 0); */ /* CCK AntDiv function disable */
  1877. /* #endif */
  1878. /* else if(p_dm_odm->support_ic_type == ODM_RTL8723B ||p_dm_odm->support_ic_type == ODM_RTL8812) */
  1879. /* odm_set_bb_reg(p_dm_odm, 0xA00, BIT(15), 0); */ /* CCK AntDiv function disable */
  1880. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  1881. if (p_dm_odm->support_ic_type == ODM_RTL8723B && p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV) {
  1882. odm_set_bb_reg(p_dm_odm, 0x930, 0xF0, 8); /* DPDT_P = ANTSEL[0] */ /* for 8723B AntDiv function patch. BB Dino 130412 */
  1883. odm_set_bb_reg(p_dm_odm, 0x930, 0xF, 8); /* DPDT_N = ANTSEL[0] */
  1884. }
  1885. /* 2 BDC Init */
  1886. #if (BEAMFORMING_SUPPORT == 1)
  1887. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  1888. odm_bdc_init(p_dm_odm);
  1889. #endif
  1890. #endif
  1891. #ifdef ODM_EVM_ENHANCE_ANTDIV
  1892. odm_evm_fast_ant_reset(p_dm_odm);
  1893. #endif
  1894. }
  1895. }
  1896. if (*(p_dm_fat_table->p_force_tx_ant_by_desc) == false) {
  1897. if (p_dm_odm->is_one_entry_only == true)
  1898. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  1899. else
  1900. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_DESC);
  1901. }
  1902. #ifdef ODM_EVM_ENHANCE_ANTDIV
  1903. if (p_dm_odm->antdiv_evm_en == 1) {
  1904. odm_evm_enhance_ant_div(p_dm_odm);
  1905. if (p_dm_fat_table->fat_state != NORMAL_STATE_MIAN)
  1906. return;
  1907. } else
  1908. odm_evm_fast_ant_reset(p_dm_odm);
  1909. #endif
  1910. /* 2 BDC mode Arbitration */
  1911. #if (BEAMFORMING_SUPPORT == 1)
  1912. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  1913. if (p_dm_odm->antdiv_evm_en == 0 || p_dm_fat_table->EVM_method_enable == 0)
  1914. odm_bf_ant_div_mode_arbitration(p_dm_odm);
  1915. #endif
  1916. #endif
  1917. for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
  1918. p_entry = p_dm_odm->p_odm_sta_info[i];
  1919. if (IS_STA_VALID(p_entry)) {
  1920. /* 2 Caculate RSSI per Antenna */
  1921. if ((p_dm_fat_table->main_ant_cnt[i] != 0) || (p_dm_fat_table->aux_ant_cnt[i] != 0)) {
  1922. mian_cnt = p_dm_fat_table->main_ant_cnt[i];
  1923. aux_cnt = p_dm_fat_table->aux_ant_cnt[i];
  1924. main_rssi = (mian_cnt != 0) ? (p_dm_fat_table->main_ant_sum[i] / mian_cnt) : 0;
  1925. aux_rssi = (aux_cnt != 0) ? (p_dm_fat_table->aux_ant_sum[i] / aux_cnt) : 0;
  1926. target_ant = (mian_cnt == aux_cnt) ? p_dm_fat_table->rx_idle_ant : ((mian_cnt >= aux_cnt) ? MAIN_ANT : AUX_ANT); /*Use counter number for OFDM*/
  1927. } else { /*CCK only case*/
  1928. mian_cnt = p_dm_fat_table->main_ant_cnt_cck[i];
  1929. aux_cnt = p_dm_fat_table->aux_ant_cnt_cck[i];
  1930. main_rssi = (mian_cnt != 0) ? (p_dm_fat_table->main_ant_sum_cck[i] / mian_cnt) : 0;
  1931. aux_rssi = (aux_cnt != 0) ? (p_dm_fat_table->aux_ant_sum_cck[i] / aux_cnt) : 0;
  1932. target_ant = (main_rssi == aux_rssi) ? p_dm_fat_table->rx_idle_ant : ((main_rssi >= aux_rssi) ? MAIN_ANT : AUX_ANT); /*Use RSSI for CCK only case*/
  1933. }
  1934. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : Main_Cnt = (( %d )) , CCK_Main_Cnt = (( %d )) , main_rssi= (( %d ))\n", i, p_dm_fat_table->main_ant_cnt[i], p_dm_fat_table->main_ant_cnt_cck[i], main_rssi));
  1935. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : Aux_Cnt = (( %d )) , CCK_Aux_Cnt = (( %d )) , aux_rssi = (( %d ))\n", i, p_dm_fat_table->aux_ant_cnt[i], p_dm_fat_table->aux_ant_cnt_cck[i], aux_rssi));
  1936. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** MAC ID:[ %d ] , target_ant = (( %s ))\n", i ,( target_ant ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT")); */
  1937. local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi;
  1938. /* 2 Select max_rssi for DIG */
  1939. if ((local_max_rssi > ant_div_max_rssi) && (local_max_rssi < 40))
  1940. ant_div_max_rssi = local_max_rssi;
  1941. if (local_max_rssi > max_rssi)
  1942. max_rssi = local_max_rssi;
  1943. /* 2 Select RX Idle Antenna */
  1944. if ((local_max_rssi != 0) && (local_max_rssi < min_max_rssi)) {
  1945. rx_idle_ant = target_ant;
  1946. min_max_rssi = local_max_rssi;
  1947. }
  1948. #ifdef ODM_EVM_ENHANCE_ANTDIV
  1949. if (p_dm_odm->antdiv_evm_en == 1) {
  1950. if (p_dm_fat_table->target_ant_enhance != 0xFF) {
  1951. target_ant = p_dm_fat_table->target_ant_enhance;
  1952. rx_idle_ant = p_dm_fat_table->target_ant_enhance;
  1953. }
  1954. }
  1955. #endif
  1956. /* 2 Select TX Antenna */
  1957. if (p_dm_odm->ant_div_type != CGCS_RX_HW_ANTDIV) {
  1958. #if (BEAMFORMING_SUPPORT == 1)
  1959. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  1960. if (p_dm_bdc_table->w_bfee_client[i] == 0)
  1961. #endif
  1962. #endif
  1963. {
  1964. odm_update_tx_ant(p_dm_odm, target_ant, i);
  1965. }
  1966. }
  1967. /* ------------------------------------------------------------ */
  1968. #if (BEAMFORMING_SUPPORT == 1)
  1969. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  1970. p_dm_bdc_table->num_client++;
  1971. if (p_dm_bdc_table->bdc_mode == BDC_MODE_2 || p_dm_bdc_table->bdc_mode == BDC_MODE_3) {
  1972. /* 2 Byte counter */
  1973. ma_rx_temp = (p_entry->rx_byte_cnt_low_maw) << 3 ; /* RX TP ( bit /sec) */
  1974. if (p_dm_bdc_table->BDC_state == bdc_bfer_train_state)
  1975. p_dm_bdc_table->MA_rx_TP_DIV[i] = ma_rx_temp ;
  1976. else
  1977. p_dm_bdc_table->MA_rx_TP[i] = ma_rx_temp ;
  1978. if ((ma_rx_temp < TH2) && (ma_rx_temp > TH1) && (local_max_rssi <= monitor_rssi_threshold)) {
  1979. if (p_dm_bdc_table->w_bfer_client[i] == 1) { /* Bfer_Target */
  1980. p_dm_bdc_table->num_bf_tar++;
  1981. if (p_dm_bdc_table->BDC_state == BDC_DECISION_STATE && p_dm_bdc_table->bdc_try_flag == 0) {
  1982. improve_TP_temp = (p_dm_bdc_table->MA_rx_TP_DIV[i] * 9) >> 3 ; /* * 1.125 */
  1983. p_dm_bdc_table->BF_pass = (p_dm_bdc_table->MA_rx_TP[i] > improve_TP_temp) ? true : false;
  1984. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : { MA_rx_TP,improve_TP_temp, MA_rx_TP_DIV, BF_pass}={ %d, %d, %d , %d }\n", i, p_dm_bdc_table->MA_rx_TP[i], improve_TP_temp, p_dm_bdc_table->MA_rx_TP_DIV[i], p_dm_bdc_table->BF_pass));
  1985. }
  1986. } else { /* DIV_Target */
  1987. p_dm_bdc_table->num_div_tar++;
  1988. if (p_dm_bdc_table->BDC_state == BDC_DECISION_STATE && p_dm_bdc_table->bdc_try_flag == 0) {
  1989. degrade_TP_temp = (p_dm_bdc_table->MA_rx_TP_DIV[i] * 5) >> 3; /* * 0.625 */
  1990. p_dm_bdc_table->DIV_pass = (p_dm_bdc_table->MA_rx_TP[i] > degrade_TP_temp) ? true : false;
  1991. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : { MA_rx_TP, degrade_TP_temp, MA_rx_TP_DIV, DIV_pass}=\n{ %d, %d, %d , %d }\n", i, p_dm_bdc_table->MA_rx_TP[i], degrade_TP_temp, p_dm_bdc_table->MA_rx_TP_DIV[i], p_dm_bdc_table->DIV_pass));
  1992. }
  1993. }
  1994. }
  1995. if (ma_rx_temp > TH1) {
  1996. if (p_dm_bdc_table->w_bfer_client[i] == 1) /* Bfer_Target */
  1997. p_dm_bdc_table->is_all_bf_sta_idle = false;
  1998. else/* DIV_Target */
  1999. p_dm_bdc_table->is_all_div_sta_idle = false;
  2000. }
  2001. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : { BFmeeCap, BFmerCap} = { %d , %d }\n", i, p_dm_bdc_table->w_bfee_client[i], p_dm_bdc_table->w_bfer_client[i]));
  2002. if (p_dm_bdc_table->BDC_state == bdc_bfer_train_state)
  2003. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : MA_rx_TP_DIV = (( %d ))\n", i, p_dm_bdc_table->MA_rx_TP_DIV[i]));
  2004. else
  2005. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Client[ %d ] : MA_rx_TP = (( %d ))\n", i, p_dm_bdc_table->MA_rx_TP[i]));
  2006. }
  2007. #endif
  2008. #endif
  2009. }
  2010. #if (BEAMFORMING_SUPPORT == 1)
  2011. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  2012. if (p_dm_bdc_table->bdc_try_flag == 0)
  2013. #endif
  2014. #endif
  2015. {
  2016. phydm_antdiv_reset_statistic(p_dm_odm, i);
  2017. }
  2018. }
  2019. /* 2 Set RX Idle Antenna & TX Antenna(Because of HW Bug ) */
  2020. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  2021. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** rx_idle_ant = (( %s ))\n\n", (rx_idle_ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  2022. #if (BEAMFORMING_SUPPORT == 1)
  2023. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  2024. if (p_dm_bdc_table->bdc_mode == BDC_MODE_1 || p_dm_bdc_table->bdc_mode == BDC_MODE_3) {
  2025. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** bdc_rx_idle_update_counter = (( %d ))\n", p_dm_bdc_table->bdc_rx_idle_update_counter));
  2026. if (p_dm_bdc_table->bdc_rx_idle_update_counter == 1) {
  2027. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***Update RxIdle Antenna!!!\n"));
  2028. p_dm_bdc_table->bdc_rx_idle_update_counter = 30;
  2029. odm_update_rx_idle_ant(p_dm_odm, rx_idle_ant);
  2030. } else {
  2031. p_dm_bdc_table->bdc_rx_idle_update_counter--;
  2032. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***NOT update RxIdle Antenna because of BF ( need to fix TX-ant)\n"));
  2033. }
  2034. } else
  2035. #endif
  2036. #endif
  2037. odm_update_rx_idle_ant(p_dm_odm, rx_idle_ant);
  2038. #else
  2039. odm_update_rx_idle_ant(p_dm_odm, rx_idle_ant);
  2040. #endif/* #if(DM_ODM_SUPPORT_TYPE == ODM_AP) */
  2041. /* 2 BDC Main Algorithm */
  2042. #if (BEAMFORMING_SUPPORT == 1)
  2043. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  2044. if (p_dm_odm->antdiv_evm_en == 0 || p_dm_fat_table->EVM_method_enable == 0)
  2045. odm_bd_ccoex_bfee_rx_div_arbitration(p_dm_odm);
  2046. #endif
  2047. #endif
  2048. if (ant_div_max_rssi == 0)
  2049. p_dm_dig_table->ant_div_rssi_max = p_dm_odm->rssi_min;
  2050. else
  2051. p_dm_dig_table->ant_div_rssi_max = ant_div_max_rssi;
  2052. p_dm_dig_table->RSSI_max = max_rssi;
  2053. }
  2054. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  2055. void
  2056. odm_s0s1_sw_ant_div_reset(
  2057. void *p_dm_void
  2058. )
  2059. {
  2060. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2061. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  2062. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2063. p_dm_fat_table->is_become_linked = false;
  2064. p_dm_swat_table->try_flag = SWAW_STEP_INIT;
  2065. p_dm_swat_table->double_chk_flag = 0;
  2066. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_s0s1_sw_ant_div_reset(): p_dm_fat_table->is_become_linked = %d\n", p_dm_fat_table->is_become_linked));
  2067. }
  2068. void
  2069. odm_s0s1_sw_ant_div(
  2070. void *p_dm_void,
  2071. u8 step
  2072. )
  2073. {
  2074. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2075. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  2076. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2077. u32 i, min_max_rssi = 0xFF, local_max_rssi, local_min_rssi;
  2078. u32 main_rssi, aux_rssi;
  2079. u8 high_traffic_train_time_u = 0x32, high_traffic_train_time_l = 0, train_time_temp;
  2080. u8 low_traffic_train_time_u = 200, low_traffic_train_time_l = 0;
  2081. u8 rx_idle_ant = p_dm_swat_table->pre_antenna, target_ant, next_ant = 0;
  2082. struct sta_info *p_entry = NULL;
  2083. u32 value32;
  2084. u32 main_ant_sum;
  2085. u32 aux_ant_sum;
  2086. u32 main_ant_cnt;
  2087. u32 aux_ant_cnt;
  2088. if (!p_dm_odm->is_linked) { /* is_linked==False */
  2089. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
  2090. if (p_dm_fat_table->is_become_linked == true) {
  2091. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  2092. if (p_dm_odm->support_ic_type == ODM_RTL8723B) {
  2093. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[9:6]=0x0\n"));
  2094. odm_set_bb_reg(p_dm_odm, 0x948, (BIT(9) | BIT(8) | BIT(7) | BIT(6)), 0x0);
  2095. }
  2096. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  2097. }
  2098. return;
  2099. } else {
  2100. if (p_dm_fat_table->is_become_linked == false) {
  2101. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));
  2102. if (p_dm_odm->support_ic_type == ODM_RTL8723B) {
  2103. value32 = odm_get_bb_reg(p_dm_odm, 0x864, BIT(5) | BIT(4) | BIT(3));
  2104. #if (RTL8723B_SUPPORT == 1)
  2105. if (value32 == 0x0)
  2106. odm_update_rx_idle_ant_8723b(p_dm_odm, MAIN_ANT, ANT1_2G, ANT2_2G);
  2107. else if (value32 == 0x1)
  2108. odm_update_rx_idle_ant_8723b(p_dm_odm, AUX_ANT, ANT2_2G, ANT1_2G);
  2109. #endif
  2110. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("8723B: First link! Force antenna to %s\n", (value32 == 0x0 ? "MAIN" : "AUX")));
  2111. }
  2112. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  2113. }
  2114. }
  2115. if (*(p_dm_fat_table->p_force_tx_ant_by_desc) == false) {
  2116. if (p_dm_odm->is_one_entry_only == true)
  2117. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  2118. else
  2119. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_DESC);
  2120. }
  2121. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[%d] { try_flag=(( %d )), step=(( %d )), double_chk_flag = (( %d )) }\n",
  2122. __LINE__, p_dm_swat_table->try_flag, step, p_dm_swat_table->double_chk_flag));
  2123. /* Handling step mismatch condition. */
  2124. /* Peak step is not finished at last time. Recover the variable and check again. */
  2125. if (step != p_dm_swat_table->try_flag) {
  2126. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[step != try_flag] Need to Reset After Link\n"));
  2127. odm_sw_ant_div_rest_after_link(p_dm_odm);
  2128. }
  2129. if (p_dm_swat_table->try_flag == SWAW_STEP_INIT) {
  2130. p_dm_swat_table->try_flag = SWAW_STEP_PEEK;
  2131. p_dm_swat_table->train_time_flag = 0;
  2132. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[set try_flag = 0] Prepare for peek!\n\n"));
  2133. return;
  2134. } else {
  2135. /* 1 Normal state (Begin Trying) */
  2136. if (p_dm_swat_table->try_flag == SWAW_STEP_PEEK) {
  2137. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TxOkCnt=(( %llu )), RxOkCnt=(( %llu )), traffic_load = (%d))\n", p_dm_odm->cur_tx_ok_cnt, p_dm_odm->cur_rx_ok_cnt, p_dm_odm->traffic_load));
  2138. if (p_dm_odm->traffic_load == TRAFFIC_HIGH) {
  2139. train_time_temp = p_dm_swat_table->train_time ;
  2140. if (p_dm_swat_table->train_time_flag == 3) {
  2141. high_traffic_train_time_l = 0xa;
  2142. if (train_time_temp <= 16)
  2143. train_time_temp = high_traffic_train_time_l;
  2144. else
  2145. train_time_temp -= 16;
  2146. } else if (p_dm_swat_table->train_time_flag == 2) {
  2147. train_time_temp -= 8;
  2148. high_traffic_train_time_l = 0xf;
  2149. } else if (p_dm_swat_table->train_time_flag == 1) {
  2150. train_time_temp -= 4;
  2151. high_traffic_train_time_l = 0x1e;
  2152. } else if (p_dm_swat_table->train_time_flag == 0) {
  2153. train_time_temp += 8;
  2154. high_traffic_train_time_l = 0x28;
  2155. }
  2156. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** train_time_temp = ((%d))\n",train_time_temp)); */
  2157. /* -- */
  2158. if (train_time_temp > high_traffic_train_time_u)
  2159. train_time_temp = high_traffic_train_time_u;
  2160. else if (train_time_temp < high_traffic_train_time_l)
  2161. train_time_temp = high_traffic_train_time_l;
  2162. p_dm_swat_table->train_time = train_time_temp; /*10ms~200ms*/
  2163. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("train_time_flag=((%d)), train_time=((%d))\n", p_dm_swat_table->train_time_flag, p_dm_swat_table->train_time));
  2164. } else if ((p_dm_odm->traffic_load == TRAFFIC_MID) || (p_dm_odm->traffic_load == TRAFFIC_LOW)) {
  2165. train_time_temp = p_dm_swat_table->train_time ;
  2166. if (p_dm_swat_table->train_time_flag == 3) {
  2167. low_traffic_train_time_l = 10;
  2168. if (train_time_temp < 50)
  2169. train_time_temp = low_traffic_train_time_l;
  2170. else
  2171. train_time_temp -= 50;
  2172. } else if (p_dm_swat_table->train_time_flag == 2) {
  2173. train_time_temp -= 30;
  2174. low_traffic_train_time_l = 36;
  2175. } else if (p_dm_swat_table->train_time_flag == 1) {
  2176. train_time_temp -= 10;
  2177. low_traffic_train_time_l = 40;
  2178. } else {
  2179. train_time_temp += 10;
  2180. low_traffic_train_time_l = 50;
  2181. }
  2182. /* -- */
  2183. if (train_time_temp >= low_traffic_train_time_u)
  2184. train_time_temp = low_traffic_train_time_u;
  2185. else if (train_time_temp <= low_traffic_train_time_l)
  2186. train_time_temp = low_traffic_train_time_l;
  2187. p_dm_swat_table->train_time = train_time_temp; /*10ms~200ms*/
  2188. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("train_time_flag=((%d)) , train_time=((%d))\n", p_dm_swat_table->train_time_flag, p_dm_swat_table->train_time));
  2189. } else {
  2190. p_dm_swat_table->train_time = 0xc8; /*200ms*/
  2191. }
  2192. /* ----------------- */
  2193. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Current min_max_rssi is ((%d))\n", p_dm_fat_table->min_max_rssi));
  2194. /* ---reset index--- */
  2195. if (p_dm_swat_table->reset_idx >= RSSI_CHECK_RESET_PERIOD) {
  2196. p_dm_fat_table->min_max_rssi = 0;
  2197. p_dm_swat_table->reset_idx = 0;
  2198. }
  2199. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reset_idx = (( %d ))\n", p_dm_swat_table->reset_idx));
  2200. p_dm_swat_table->reset_idx++;
  2201. /* ---double check flag--- */
  2202. if ((p_dm_fat_table->min_max_rssi > RSSI_CHECK_THRESHOLD) && (p_dm_swat_table->double_chk_flag == 0)) {
  2203. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" min_max_rssi is ((%d)), and > %d\n",
  2204. p_dm_fat_table->min_max_rssi, RSSI_CHECK_THRESHOLD));
  2205. p_dm_swat_table->double_chk_flag = 1;
  2206. p_dm_swat_table->try_flag = SWAW_STEP_DETERMINE;
  2207. p_dm_swat_table->rssi_trying = 0;
  2208. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Test the current ant for (( %d )) ms again\n", p_dm_swat_table->train_time));
  2209. odm_update_rx_idle_ant(p_dm_odm, p_dm_fat_table->rx_idle_ant);
  2210. odm_set_timer(p_dm_odm, &(p_dm_swat_table->phydm_sw_antenna_switch_timer), p_dm_swat_table->train_time); /*ms*/
  2211. return;
  2212. }
  2213. next_ant = (p_dm_fat_table->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
  2214. p_dm_swat_table->try_flag = SWAW_STEP_DETERMINE;
  2215. if (p_dm_swat_table->reset_idx <= 1)
  2216. p_dm_swat_table->rssi_trying = 2;
  2217. else
  2218. p_dm_swat_table->rssi_trying = 1;
  2219. odm_s0s1_sw_ant_div_by_ctrl_frame(p_dm_odm, SWAW_STEP_PEEK);
  2220. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[set try_flag=1] Normal state: Begin Trying!!\n"));
  2221. } else if ((p_dm_swat_table->try_flag == SWAW_STEP_DETERMINE) && (p_dm_swat_table->double_chk_flag == 0)) {
  2222. next_ant = (p_dm_fat_table->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
  2223. p_dm_swat_table->rssi_trying--;
  2224. }
  2225. /* 1 Decision state */
  2226. if ((p_dm_swat_table->try_flag == SWAW_STEP_DETERMINE) && (p_dm_swat_table->rssi_trying == 0)) {
  2227. boolean is_by_ctrl_frame = false;
  2228. u64 pkt_cnt_total = 0;
  2229. for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
  2230. p_entry = p_dm_odm->p_odm_sta_info[i];
  2231. if (IS_STA_VALID(p_entry)) {
  2232. /* 2 Caculate RSSI per Antenna */
  2233. main_ant_sum = (u32)p_dm_fat_table->main_ant_sum[i] + (u32)p_dm_fat_table->main_ant_sum_cck[i];
  2234. aux_ant_sum = (u32)p_dm_fat_table->aux_ant_sum[i] + (u32)p_dm_fat_table->aux_ant_sum_cck[i];
  2235. main_ant_cnt = (u32)p_dm_fat_table->main_ant_cnt[i] + (u32)p_dm_fat_table->main_ant_cnt_cck[i];
  2236. aux_ant_cnt = (u32)p_dm_fat_table->aux_ant_cnt[i] + (u32)p_dm_fat_table->aux_ant_cnt_cck[i];
  2237. main_rssi = (main_ant_cnt != 0) ? (main_ant_sum / main_ant_cnt) : 0;
  2238. aux_rssi = (aux_ant_cnt != 0) ? (aux_ant_sum / aux_ant_cnt) : 0;
  2239. if (p_dm_fat_table->main_ant_cnt[i] <= 1 && p_dm_fat_table->main_ant_cnt_cck[i] >= 1)
  2240. main_rssi = 0;
  2241. if (p_dm_fat_table->aux_ant_cnt[i] <= 1 && p_dm_fat_table->aux_ant_cnt_cck[i] >= 1)
  2242. aux_rssi = 0;
  2243. target_ant = (main_rssi == aux_rssi) ? p_dm_swat_table->pre_antenna : ((main_rssi >= aux_rssi) ? MAIN_ANT : AUX_ANT);
  2244. local_max_rssi = (main_rssi >= aux_rssi) ? main_rssi : aux_rssi;
  2245. local_min_rssi = (main_rssi >= aux_rssi) ? aux_rssi : main_rssi;
  2246. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** CCK_counter_main = (( %d )) , CCK_counter_aux= (( %d ))\n", p_dm_fat_table->main_ant_cnt_cck[i], p_dm_fat_table->aux_ant_cnt_cck[i]));
  2247. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** OFDM_counter_main = (( %d )) , OFDM_counter_aux= (( %d ))\n", p_dm_fat_table->main_ant_cnt[i], p_dm_fat_table->aux_ant_cnt[i]));
  2248. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Main_Cnt = (( %d )) , main_rssi= (( %d ))\n", main_ant_cnt, main_rssi));
  2249. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Aux_Cnt = (( %d )) , aux_rssi = (( %d ))\n", aux_ant_cnt, aux_rssi));
  2250. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** MAC ID:[ %d ] , target_ant = (( %s ))\n", i, (target_ant == MAIN_ANT) ? "MAIN_ANT" : "AUX_ANT"));
  2251. /* 2 Select RX Idle Antenna */
  2252. if (local_max_rssi != 0 && local_max_rssi < min_max_rssi) {
  2253. rx_idle_ant = target_ant;
  2254. min_max_rssi = local_max_rssi;
  2255. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** local_max_rssi-local_min_rssi = ((%d))\n", (local_max_rssi - local_min_rssi)));
  2256. if ((local_max_rssi - local_min_rssi) > 8) {
  2257. if (local_min_rssi != 0)
  2258. p_dm_swat_table->train_time_flag = 3;
  2259. else {
  2260. if (min_max_rssi > RSSI_CHECK_THRESHOLD)
  2261. p_dm_swat_table->train_time_flag = 0;
  2262. else
  2263. p_dm_swat_table->train_time_flag = 3;
  2264. }
  2265. } else if ((local_max_rssi - local_min_rssi) > 5)
  2266. p_dm_swat_table->train_time_flag = 2;
  2267. else if ((local_max_rssi - local_min_rssi) > 2)
  2268. p_dm_swat_table->train_time_flag = 1;
  2269. else
  2270. p_dm_swat_table->train_time_flag = 0;
  2271. }
  2272. /* 2 Select TX Antenna */
  2273. if (target_ant == MAIN_ANT)
  2274. p_dm_fat_table->antsel_a[i] = ANT1_2G;
  2275. else
  2276. p_dm_fat_table->antsel_a[i] = ANT2_2G;
  2277. }
  2278. phydm_antdiv_reset_statistic(p_dm_odm, i);
  2279. pkt_cnt_total += (main_ant_cnt + aux_ant_cnt);
  2280. }
  2281. if (p_dm_swat_table->is_sw_ant_div_by_ctrl_frame) {
  2282. odm_s0s1_sw_ant_div_by_ctrl_frame(p_dm_odm, SWAW_STEP_DETERMINE);
  2283. is_by_ctrl_frame = true;
  2284. }
  2285. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Control frame packet counter = %d, data frame packet counter = %llu\n",
  2286. p_dm_swat_table->pkt_cnt_sw_ant_div_by_ctrl_frame, pkt_cnt_total));
  2287. if (min_max_rssi == 0xff || ((pkt_cnt_total < (p_dm_swat_table->pkt_cnt_sw_ant_div_by_ctrl_frame >> 1)) && p_dm_odm->phy_dbg_info.num_qry_beacon_pkt < 2)) {
  2288. min_max_rssi = 0;
  2289. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Check RSSI of control frame because min_max_rssi == 0xff\n"));
  2290. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("is_by_ctrl_frame = %d\n", is_by_ctrl_frame));
  2291. if (is_by_ctrl_frame) {
  2292. main_rssi = (p_dm_fat_table->main_ant_ctrl_frame_cnt != 0) ? (p_dm_fat_table->main_ant_ctrl_frame_sum / p_dm_fat_table->main_ant_ctrl_frame_cnt) : 0;
  2293. aux_rssi = (p_dm_fat_table->aux_ant_ctrl_frame_cnt != 0) ? (p_dm_fat_table->aux_ant_ctrl_frame_sum / p_dm_fat_table->aux_ant_ctrl_frame_cnt) : 0;
  2294. if (p_dm_fat_table->main_ant_ctrl_frame_cnt <= 1 && p_dm_fat_table->cck_ctrl_frame_cnt_main >= 1)
  2295. main_rssi = 0;
  2296. if (p_dm_fat_table->aux_ant_ctrl_frame_cnt <= 1 && p_dm_fat_table->cck_ctrl_frame_cnt_aux >= 1)
  2297. aux_rssi = 0;
  2298. if (main_rssi != 0 || aux_rssi != 0) {
  2299. rx_idle_ant = (main_rssi == aux_rssi) ? p_dm_swat_table->pre_antenna : ((main_rssi >= aux_rssi) ? MAIN_ANT : AUX_ANT);
  2300. local_max_rssi = (main_rssi >= aux_rssi) ? main_rssi : aux_rssi;
  2301. local_min_rssi = (main_rssi >= aux_rssi) ? aux_rssi : main_rssi;
  2302. if ((local_max_rssi - local_min_rssi) > 8)
  2303. p_dm_swat_table->train_time_flag = 3;
  2304. else if ((local_max_rssi - local_min_rssi) > 5)
  2305. p_dm_swat_table->train_time_flag = 2;
  2306. else if ((local_max_rssi - local_min_rssi) > 2)
  2307. p_dm_swat_table->train_time_flag = 1;
  2308. else
  2309. p_dm_swat_table->train_time_flag = 0;
  2310. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Control frame: main_rssi = %d, aux_rssi = %d\n", main_rssi, aux_rssi));
  2311. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("rx_idle_ant decided by control frame = %s\n", (rx_idle_ant == MAIN_ANT ? "MAIN" : "AUX")));
  2312. }
  2313. }
  2314. }
  2315. p_dm_fat_table->min_max_rssi = min_max_rssi;
  2316. p_dm_swat_table->try_flag = SWAW_STEP_PEEK;
  2317. if (p_dm_swat_table->double_chk_flag == 1) {
  2318. p_dm_swat_table->double_chk_flag = 0;
  2319. if (p_dm_fat_table->min_max_rssi > RSSI_CHECK_THRESHOLD) {
  2320. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [Double check] min_max_rssi ((%d)) > %d again!!\n",
  2321. p_dm_fat_table->min_max_rssi, RSSI_CHECK_THRESHOLD));
  2322. odm_update_rx_idle_ant(p_dm_odm, rx_idle_ant);
  2323. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[reset try_flag = 0] Training accomplished !!!]\n\n\n"));
  2324. return;
  2325. } else {
  2326. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [Double check] min_max_rssi ((%d)) <= %d !!\n",
  2327. p_dm_fat_table->min_max_rssi, RSSI_CHECK_THRESHOLD));
  2328. next_ant = (p_dm_fat_table->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
  2329. p_dm_swat_table->try_flag = SWAW_STEP_PEEK;
  2330. p_dm_swat_table->reset_idx = RSSI_CHECK_RESET_PERIOD;
  2331. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[set try_flag=0] Normal state: Need to tryg again!!\n\n\n"));
  2332. return;
  2333. }
  2334. } else {
  2335. if (p_dm_fat_table->min_max_rssi < RSSI_CHECK_THRESHOLD)
  2336. p_dm_swat_table->reset_idx = RSSI_CHECK_RESET_PERIOD;
  2337. p_dm_swat_table->pre_antenna = rx_idle_ant;
  2338. odm_update_rx_idle_ant(p_dm_odm, rx_idle_ant);
  2339. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[reset try_flag = 0] Training accomplished !!!] \n\n\n"));
  2340. return;
  2341. }
  2342. }
  2343. }
  2344. /* 1 4.Change TRX antenna */
  2345. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("rssi_trying = (( %d )), ant: (( %s )) >>> (( %s ))\n",
  2346. p_dm_swat_table->rssi_trying, (p_dm_fat_table->rx_idle_ant == MAIN_ANT ? "MAIN" : "AUX"), (next_ant == MAIN_ANT ? "MAIN" : "AUX")));
  2347. odm_update_rx_idle_ant(p_dm_odm, next_ant);
  2348. /* 1 5.Reset Statistics */
  2349. p_dm_fat_table->rx_idle_ant = next_ant;
  2350. /* 1 6.Set next timer (Trying state) */
  2351. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" Test ((%s)) ant for (( %d )) ms\n", (next_ant == MAIN_ANT ? "MAIN" : "AUX"), p_dm_swat_table->train_time));
  2352. odm_set_timer(p_dm_odm, &(p_dm_swat_table->phydm_sw_antenna_switch_timer), p_dm_swat_table->train_time); /*ms*/
  2353. }
  2354. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  2355. void
  2356. odm_sw_antdiv_callback(
  2357. struct timer_list *p_timer
  2358. )
  2359. {
  2360. struct _ADAPTER *adapter = (struct _ADAPTER *)p_timer->Adapter;
  2361. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(adapter);
  2362. struct _sw_antenna_switch_ *p_dm_swat_table = &p_hal_data->DM_OutSrc.dm_swat_table;
  2363. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  2364. #if USE_WORKITEM
  2365. odm_schedule_work_item(&p_dm_swat_table->phydm_sw_antenna_switch_workitem);
  2366. #else
  2367. {
  2368. /* dbg_print("SW_antdiv_Callback"); */
  2369. odm_s0s1_sw_ant_div(&p_hal_data->DM_OutSrc, SWAW_STEP_DETERMINE);
  2370. }
  2371. #endif
  2372. #else
  2373. odm_schedule_work_item(&p_dm_swat_table->phydm_sw_antenna_switch_workitem);
  2374. #endif
  2375. }
  2376. void
  2377. odm_sw_antdiv_workitem_callback(
  2378. void *p_context
  2379. )
  2380. {
  2381. struct _ADAPTER *p_adapter = (struct _ADAPTER *)p_context;
  2382. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  2383. /* dbg_print("SW_antdiv_Workitem_Callback"); */
  2384. odm_s0s1_sw_ant_div(&p_hal_data->DM_OutSrc, SWAW_STEP_DETERMINE);
  2385. }
  2386. #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
  2387. void
  2388. odm_sw_antdiv_workitem_callback(
  2389. void *p_context
  2390. )
  2391. {
  2392. struct _ADAPTER *
  2393. p_adapter = (struct _ADAPTER *)p_context;
  2394. HAL_DATA_TYPE
  2395. *p_hal_data = GET_HAL_DATA(p_adapter);
  2396. /*dbg_print("SW_antdiv_Workitem_Callback");*/
  2397. odm_s0s1_sw_ant_div(&p_hal_data->odmpriv, SWAW_STEP_DETERMINE);
  2398. }
  2399. void
  2400. odm_sw_antdiv_callback(void *function_context)
  2401. {
  2402. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)function_context;
  2403. struct _ADAPTER *padapter = p_dm_odm->adapter;
  2404. if (padapter->net_closed == _TRUE)
  2405. return;
  2406. #if 0 /* Can't do I/O in timer callback*/
  2407. odm_s0s1_sw_ant_div(p_dm_odm, SWAW_STEP_DETERMINE);
  2408. #else
  2409. rtw_run_in_thread_cmd(padapter, odm_sw_antdiv_workitem_callback, padapter);
  2410. #endif
  2411. }
  2412. #endif
  2413. void
  2414. odm_s0s1_sw_ant_div_by_ctrl_frame(
  2415. void *p_dm_void,
  2416. u8 step
  2417. )
  2418. {
  2419. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2420. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  2421. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2422. switch (step) {
  2423. case SWAW_STEP_PEEK:
  2424. p_dm_swat_table->pkt_cnt_sw_ant_div_by_ctrl_frame = 0;
  2425. p_dm_swat_table->is_sw_ant_div_by_ctrl_frame = true;
  2426. p_dm_fat_table->main_ant_ctrl_frame_cnt = 0;
  2427. p_dm_fat_table->aux_ant_ctrl_frame_cnt = 0;
  2428. p_dm_fat_table->main_ant_ctrl_frame_sum = 0;
  2429. p_dm_fat_table->aux_ant_ctrl_frame_sum = 0;
  2430. p_dm_fat_table->cck_ctrl_frame_cnt_main = 0;
  2431. p_dm_fat_table->cck_ctrl_frame_cnt_aux = 0;
  2432. p_dm_fat_table->ofdm_ctrl_frame_cnt_main = 0;
  2433. p_dm_fat_table->ofdm_ctrl_frame_cnt_aux = 0;
  2434. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_S0S1_SwAntDivForAPMode(): Start peek and reset counter\n"));
  2435. break;
  2436. case SWAW_STEP_DETERMINE:
  2437. p_dm_swat_table->is_sw_ant_div_by_ctrl_frame = false;
  2438. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_S0S1_SwAntDivForAPMode(): Stop peek\n"));
  2439. break;
  2440. default:
  2441. p_dm_swat_table->is_sw_ant_div_by_ctrl_frame = false;
  2442. break;
  2443. }
  2444. }
  2445. void
  2446. odm_antsel_statistics_of_ctrl_frame(
  2447. void *p_dm_void,
  2448. u8 antsel_tr_mux,
  2449. u32 rx_pwdb_all
  2450. )
  2451. {
  2452. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2453. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2454. if (antsel_tr_mux == ANT1_2G) {
  2455. p_dm_fat_table->main_ant_ctrl_frame_sum += rx_pwdb_all;
  2456. p_dm_fat_table->main_ant_ctrl_frame_cnt++;
  2457. } else {
  2458. p_dm_fat_table->aux_ant_ctrl_frame_sum += rx_pwdb_all;
  2459. p_dm_fat_table->aux_ant_ctrl_frame_cnt++;
  2460. }
  2461. }
  2462. void
  2463. odm_s0s1_sw_ant_div_by_ctrl_frame_process_rssi(
  2464. void *p_dm_void,
  2465. void *p_phy_info_void,
  2466. void *p_pkt_info_void
  2467. /* struct _odm_phy_status_info_* p_phy_info, */
  2468. /* struct _odm_per_pkt_info_* p_pktinfo */
  2469. )
  2470. {
  2471. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2472. struct _odm_phy_status_info_ *p_phy_info = (struct _odm_phy_status_info_ *)p_phy_info_void;
  2473. struct _odm_per_pkt_info_ *p_pktinfo = (struct _odm_per_pkt_info_ *)p_pkt_info_void;
  2474. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  2475. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2476. boolean is_cck_rate;
  2477. if (!(p_dm_odm->support_ability & ODM_BB_ANT_DIV))
  2478. return;
  2479. if (p_dm_odm->ant_div_type != S0S1_SW_ANTDIV)
  2480. return;
  2481. /* In try state */
  2482. if (!p_dm_swat_table->is_sw_ant_div_by_ctrl_frame)
  2483. return;
  2484. /* No HW error and match receiver address */
  2485. if (!p_pktinfo->is_to_self)
  2486. return;
  2487. p_dm_swat_table->pkt_cnt_sw_ant_div_by_ctrl_frame++;
  2488. is_cck_rate = ((p_pktinfo->data_rate >= DESC_RATE1M) && (p_pktinfo->data_rate <= DESC_RATE11M)) ? true : false;
  2489. if (is_cck_rate) {
  2490. p_dm_fat_table->antsel_rx_keep_0 = (p_dm_fat_table->rx_idle_ant == MAIN_ANT) ? ANT1_2G : ANT2_2G;
  2491. if (p_dm_fat_table->antsel_rx_keep_0 == ANT1_2G)
  2492. p_dm_fat_table->cck_ctrl_frame_cnt_main++;
  2493. else
  2494. p_dm_fat_table->cck_ctrl_frame_cnt_aux++;
  2495. odm_antsel_statistics_of_ctrl_frame(p_dm_odm, p_dm_fat_table->antsel_rx_keep_0, p_phy_info->rx_mimo_signal_strength[ODM_RF_PATH_A]);
  2496. } else {
  2497. if (p_dm_fat_table->antsel_rx_keep_0 == ANT1_2G)
  2498. p_dm_fat_table->ofdm_ctrl_frame_cnt_main++;
  2499. else
  2500. p_dm_fat_table->ofdm_ctrl_frame_cnt_aux++;
  2501. odm_antsel_statistics_of_ctrl_frame(p_dm_odm, p_dm_fat_table->antsel_rx_keep_0, p_phy_info->rx_pwdb_all);
  2502. }
  2503. }
  2504. #endif /* #if (RTL8723B_SUPPORT == 1) || (RTL8821A_SUPPORT == 1) */
  2505. void
  2506. odm_set_next_mac_addr_target(
  2507. void *p_dm_void
  2508. )
  2509. {
  2510. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2511. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2512. struct sta_info *p_entry;
  2513. u32 value32, i;
  2514. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_set_next_mac_addr_target() ==>\n"));
  2515. if (p_dm_odm->is_linked) {
  2516. for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {
  2517. if ((p_dm_fat_table->train_idx + 1) == ODM_ASSOCIATE_ENTRY_NUM)
  2518. p_dm_fat_table->train_idx = 0;
  2519. else
  2520. p_dm_fat_table->train_idx++;
  2521. p_entry = p_dm_odm->p_odm_sta_info[p_dm_fat_table->train_idx];
  2522. if (IS_STA_VALID(p_entry)) {
  2523. /*Match MAC ADDR*/
  2524. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP | ODM_CE))
  2525. value32 = (p_entry->hwaddr[5] << 8) | p_entry->hwaddr[4];
  2526. #else
  2527. value32 = (p_entry->MacAddr[5] << 8) | p_entry->MacAddr[4];
  2528. #endif
  2529. odm_set_mac_reg(p_dm_odm, 0x7b4, 0xFFFF, value32);/*0x7b4~0x7b5*/
  2530. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP | ODM_CE))
  2531. value32 = (p_entry->hwaddr[3] << 24) | (p_entry->hwaddr[2] << 16) | (p_entry->hwaddr[1] << 8) | p_entry->hwaddr[0];
  2532. #else
  2533. value32 = (p_entry->MacAddr[3] << 24) | (p_entry->MacAddr[2] << 16) | (p_entry->MacAddr[1] << 8) | p_entry->MacAddr[0];
  2534. #endif
  2535. odm_set_mac_reg(p_dm_odm, 0x7b0, MASKDWORD, value32);/*0x7b0~0x7b3*/
  2536. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("p_dm_fat_table->train_idx=%d\n", p_dm_fat_table->train_idx));
  2537. #if (DM_ODM_SUPPORT_TYPE & (ODM_AP | ODM_CE))
  2538. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC addr = %x:%x:%x:%x:%x:%x\n",
  2539. p_entry->hwaddr[5], p_entry->hwaddr[4], p_entry->hwaddr[3], p_entry->hwaddr[2], p_entry->hwaddr[1], p_entry->hwaddr[0]));
  2540. #else
  2541. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC addr = %x:%x:%x:%x:%x:%x\n",
  2542. p_entry->MacAddr[5], p_entry->MacAddr[4], p_entry->MacAddr[3], p_entry->MacAddr[2], p_entry->MacAddr[1], p_entry->MacAddr[0]));
  2543. #endif
  2544. break;
  2545. }
  2546. }
  2547. }
  2548. #if 0
  2549. /* */
  2550. /* 2012.03.26 LukeLee: This should be removed later, the MAC address is changed according to MACID in turn */
  2551. /* */
  2552. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  2553. {
  2554. struct _ADAPTER *adapter = p_dm_odm->adapter;
  2555. PMGNT_INFO p_mgnt_info = &adapter->MgntInfo;
  2556. for (i = 0; i < 6; i++) {
  2557. bssid[i] = p_mgnt_info->bssid[i];
  2558. /* dbg_print("bssid[%d]=%x\n", i, bssid[i]); */
  2559. }
  2560. }
  2561. #endif
  2562. /* odm_set_next_mac_addr_target(p_dm_odm); */
  2563. /* 1 Select MAC Address Filter */
  2564. for (i = 0; i < 6; i++) {
  2565. if (bssid[i] != p_dm_fat_table->bssid[i]) {
  2566. is_match_bssid = false;
  2567. break;
  2568. }
  2569. }
  2570. if (is_match_bssid == false) {
  2571. /* Match MAC ADDR */
  2572. value32 = (bssid[5] << 8) | bssid[4];
  2573. odm_set_mac_reg(p_dm_odm, 0x7b4, 0xFFFF, value32);
  2574. value32 = (bssid[3] << 24) | (bssid[2] << 16) | (bssid[1] << 8) | bssid[0];
  2575. odm_set_mac_reg(p_dm_odm, 0x7b0, MASKDWORD, value32);
  2576. }
  2577. return is_match_bssid;
  2578. #endif
  2579. }
  2580. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  2581. void
  2582. odm_fast_ant_training(
  2583. void *p_dm_void
  2584. )
  2585. {
  2586. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2587. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2588. u32 max_rssi_path_a = 0, pckcnt_path_a = 0;
  2589. u8 i, target_ant_path_a = 0;
  2590. boolean is_pkt_filter_macth_path_a = false;
  2591. #if (RTL8192E_SUPPORT == 1)
  2592. u32 max_rssi_path_b = 0, pckcnt_path_b = 0;
  2593. u8 target_ant_path_b = 0;
  2594. boolean is_pkt_filter_macth_path_b = false;
  2595. #endif
  2596. if (!p_dm_odm->is_linked) { /* is_linked==False */
  2597. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
  2598. if (p_dm_fat_table->is_become_linked == true) {
  2599. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  2600. phydm_fast_training_enable(p_dm_odm, FAT_OFF);
  2601. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  2602. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  2603. }
  2604. return;
  2605. } else {
  2606. if (p_dm_fat_table->is_become_linked == false) {
  2607. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked!!!]\n"));
  2608. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  2609. }
  2610. }
  2611. if (*(p_dm_fat_table->p_force_tx_ant_by_desc) == false) {
  2612. if (p_dm_odm->is_one_entry_only == true)
  2613. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  2614. else
  2615. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_DESC);
  2616. }
  2617. if (p_dm_odm->support_ic_type == ODM_RTL8188E)
  2618. odm_set_bb_reg(p_dm_odm, 0x864, BIT(2) | BIT(1) | BIT(0), ((p_dm_odm->fat_comb_a) - 1));
  2619. #if (RTL8192E_SUPPORT == 1)
  2620. else if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  2621. odm_set_bb_reg(p_dm_odm, 0xB38, BIT(2) | BIT1 | BIT0, ((p_dm_odm->fat_comb_a) - 1)); /* path-A */ /* ant combination=regB38[2:0]+1 */
  2622. odm_set_bb_reg(p_dm_odm, 0xB38, BIT(18) | BIT17 | BIT16, ((p_dm_odm->fat_comb_b) - 1)); /* path-B */ /* ant combination=regB38[18:16]+1 */
  2623. }
  2624. #endif
  2625. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("==>odm_fast_ant_training()\n"));
  2626. /* 1 TRAINING STATE */
  2627. if (p_dm_fat_table->fat_state == FAT_TRAINING_STATE) {
  2628. /* 2 Caculate RSSI per Antenna */
  2629. /* 3 [path-A]--------------------------- */
  2630. for (i = 0; i < (p_dm_odm->fat_comb_a); i++) { /* i : antenna index */
  2631. if (p_dm_fat_table->ant_rssi_cnt[i] == 0)
  2632. p_dm_fat_table->ant_ave_rssi[i] = 0;
  2633. else {
  2634. p_dm_fat_table->ant_ave_rssi[i] = p_dm_fat_table->ant_sum_rssi[i] / p_dm_fat_table->ant_rssi_cnt[i];
  2635. is_pkt_filter_macth_path_a = true;
  2636. }
  2637. if (p_dm_fat_table->ant_ave_rssi[i] > max_rssi_path_a) {
  2638. max_rssi_path_a = p_dm_fat_table->ant_ave_rssi[i];
  2639. pckcnt_path_a = p_dm_fat_table->ant_rssi_cnt[i];
  2640. target_ant_path_a = i ;
  2641. } else if (p_dm_fat_table->ant_ave_rssi[i] == max_rssi_path_a) {
  2642. if ((p_dm_fat_table->ant_rssi_cnt[i]) > pckcnt_path_a) {
  2643. max_rssi_path_a = p_dm_fat_table->ant_ave_rssi[i];
  2644. pckcnt_path_a = p_dm_fat_table->ant_rssi_cnt[i];
  2645. target_ant_path_a = i ;
  2646. }
  2647. }
  2648. ODM_RT_TRACE("*** ant-index : [ %d ], counter = (( %d )), Avg RSSI = (( %d ))\n", i, p_dm_fat_table->ant_rssi_cnt[i], p_dm_fat_table->ant_ave_rssi[i]);
  2649. }
  2650. #if 0
  2651. #if (RTL8192E_SUPPORT == 1)
  2652. /* 3 [path-B]--------------------------- */
  2653. for (i = 0; i < (p_dm_odm->fat_comb_b); i++) {
  2654. if (p_dm_fat_table->antRSSIcnt_pathB[i] == 0)
  2655. p_dm_fat_table->antAveRSSI_pathB[i] = 0;
  2656. else { /* (ant_rssi_cnt[i] != 0) */
  2657. p_dm_fat_table->antAveRSSI_pathB[i] = p_dm_fat_table->antSumRSSI_pathB[i] / p_dm_fat_table->antRSSIcnt_pathB[i];
  2658. is_pkt_filter_macth_path_b = true;
  2659. }
  2660. if (p_dm_fat_table->antAveRSSI_pathB[i] > max_rssi_path_b) {
  2661. max_rssi_path_b = p_dm_fat_table->antAveRSSI_pathB[i];
  2662. pckcnt_path_b = p_dm_fat_table->antRSSIcnt_pathB[i];
  2663. target_ant_path_b = (u8) i;
  2664. }
  2665. if (p_dm_fat_table->antAveRSSI_pathB[i] == max_rssi_path_b) {
  2666. if (p_dm_fat_table->antRSSIcnt_pathB > pckcnt_path_b) {
  2667. max_rssi_path_b = p_dm_fat_table->antAveRSSI_pathB[i];
  2668. target_ant_path_b = (u8) i;
  2669. }
  2670. }
  2671. if (p_dm_odm->fat_print_rssi == 1) {
  2672. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***{path-B}: Sum RSSI[%d] = (( %d )), cnt RSSI [%d] = (( %d )), Avg RSSI[%d] = (( %d ))\n",
  2673. i, p_dm_fat_table->antSumRSSI_pathB[i], i, p_dm_fat_table->antRSSIcnt_pathB[i], i, p_dm_fat_table->antAveRSSI_pathB[i]));
  2674. }
  2675. }
  2676. #endif
  2677. #endif
  2678. /* 1 DECISION STATE */
  2679. /* 2 Select TRX Antenna */
  2680. phydm_fast_training_enable(p_dm_odm, FAT_OFF);
  2681. /* 3 [path-A]--------------------------- */
  2682. if (is_pkt_filter_macth_path_a == false) {
  2683. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("{path-A}: None Packet is matched\n")); */
  2684. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("{path-A}: None Packet is matched\n"));
  2685. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  2686. } else {
  2687. ODM_RT_TRACE("target_ant_path_a = (( %d )) , max_rssi_path_a = (( %d ))\n", target_ant_path_a, max_rssi_path_a);
  2688. /* 3 [ update RX-optional ant ] Default RX is Omni, Optional RX is the best decision by FAT */
  2689. if (p_dm_odm->support_ic_type == ODM_RTL8188E)
  2690. odm_set_bb_reg(p_dm_odm, 0x864, BIT(8) | BIT(7) | BIT(6), target_ant_path_a);
  2691. else if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  2692. odm_set_bb_reg(p_dm_odm, 0xB38, BIT(8) | BIT7 | BIT6, target_ant_path_a); /* Optional RX [pth-A] */
  2693. }
  2694. /* 3 [ update TX ant ] */
  2695. odm_update_tx_ant(p_dm_odm, target_ant_path_a, (p_dm_fat_table->train_idx));
  2696. if (target_ant_path_a == 0)
  2697. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  2698. }
  2699. #if 0
  2700. #if (RTL8192E_SUPPORT == 1)
  2701. /* 3 [path-B]--------------------------- */
  2702. if (is_pkt_filter_macth_path_b == false) {
  2703. if (p_dm_odm->fat_print_rssi == 1)
  2704. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***[%d]{path-B}: None Packet is matched\n\n\n", __LINE__));
  2705. } else {
  2706. if (p_dm_odm->fat_print_rssi == 1) {
  2707. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,
  2708. (" ***target_ant_path_b = (( %d )) *** max_rssi = (( %d ))***\n\n\n", target_ant_path_b, max_rssi_path_b));
  2709. }
  2710. odm_set_bb_reg(p_dm_odm, 0xB38, BIT(21) | BIT20 | BIT19, target_ant_path_b); /* Default RX is Omni, Optional RX is the best decision by FAT */
  2711. odm_set_bb_reg(p_dm_odm, 0x80c, BIT(21), 1); /* Reg80c[21]=1'b1 //from TX Info */
  2712. p_dm_fat_table->antsel_pathB[p_dm_fat_table->train_idx] = target_ant_path_b;
  2713. }
  2714. #endif
  2715. #endif
  2716. /* 2 Reset counter */
  2717. for (i = 0; i < (p_dm_odm->fat_comb_a); i++) {
  2718. p_dm_fat_table->ant_sum_rssi[i] = 0;
  2719. p_dm_fat_table->ant_rssi_cnt[i] = 0;
  2720. }
  2721. /*
  2722. #if (RTL8192E_SUPPORT == 1)
  2723. for(i=0; i<=(p_dm_odm->fat_comb_b); i++)
  2724. {
  2725. p_dm_fat_table->antSumRSSI_pathB[i] = 0;
  2726. p_dm_fat_table->antRSSIcnt_pathB[i] = 0;
  2727. }
  2728. #endif
  2729. */
  2730. p_dm_fat_table->fat_state = FAT_PREPARE_STATE;
  2731. return;
  2732. }
  2733. /* 1 NORMAL STATE */
  2734. if (p_dm_fat_table->fat_state == FAT_PREPARE_STATE) {
  2735. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Start Prepare state ]\n"));
  2736. odm_set_next_mac_addr_target(p_dm_odm);
  2737. /* 2 Prepare Training */
  2738. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  2739. phydm_fast_training_enable(p_dm_odm, FAT_ON);
  2740. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON); /* enable HW AntDiv */
  2741. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Start Training state]\n"));
  2742. odm_set_timer(p_dm_odm, &p_dm_odm->fast_ant_training_timer, p_dm_odm->antdiv_intvl); /* ms */
  2743. }
  2744. }
  2745. void
  2746. odm_fast_ant_training_callback(
  2747. void *p_dm_void
  2748. )
  2749. {
  2750. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2751. #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
  2752. struct _ADAPTER *padapter = p_dm_odm->adapter;
  2753. if (padapter->net_closed == _TRUE)
  2754. return;
  2755. /* if(*p_dm_odm->p_is_net_closed == true) */
  2756. /* return; */
  2757. #endif
  2758. #if USE_WORKITEM
  2759. odm_schedule_work_item(&p_dm_odm->fast_ant_training_workitem);
  2760. #else
  2761. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("******odm_fast_ant_training_callback******\n"));
  2762. odm_fast_ant_training(p_dm_odm);
  2763. #endif
  2764. }
  2765. void
  2766. odm_fast_ant_training_work_item_callback(
  2767. void *p_dm_void
  2768. )
  2769. {
  2770. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2771. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("******odm_fast_ant_training_work_item_callback******\n"));
  2772. odm_fast_ant_training(p_dm_odm);
  2773. }
  2774. #endif
  2775. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  2776. u32
  2777. phydm_construct_hb_rfu_codeword_type2(
  2778. void *p_dm_void,
  2779. u32 beam_set_idx
  2780. )
  2781. {
  2782. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2783. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  2784. u32 sync_codeword = 0x7f;
  2785. u32 codeword = 0;
  2786. u32 data_tmp = 0;
  2787. u32 i;
  2788. for (i = 0; i < pdm_sat_table->ant_num_total; i++) {
  2789. if (*p_dm_odm->p_band_type == ODM_BAND_5G)
  2790. data_tmp = pdm_sat_table->rfu_codeword_table_5g[beam_set_idx][i];
  2791. else
  2792. data_tmp = pdm_sat_table->rfu_codeword_table_2g[beam_set_idx][i];
  2793. codeword |= (data_tmp << (i * pdm_sat_table->rfu_each_ant_bit_num));
  2794. }
  2795. codeword = (codeword<<8) | sync_codeword;
  2796. return codeword;
  2797. }
  2798. void
  2799. phydm_update_beam_pattern_type2(
  2800. void *p_dm_void,
  2801. u32 codeword,
  2802. u32 codeword_length
  2803. )
  2804. {
  2805. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2806. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  2807. u8 i;
  2808. boolean beam_ctrl_signal;
  2809. u32 one = 0x1;
  2810. u32 reg44_tmp_p, reg44_tmp_n, reg44_ori;
  2811. u8 devide_num = 4;
  2812. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set codeword = ((0x%x))\n", codeword));
  2813. reg44_ori = odm_get_mac_reg(p_dm_odm, 0x44, MASKDWORD);
  2814. reg44_tmp_p = reg44_ori;
  2815. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44_ori =0x%x\n", reg44_ori));*/
  2816. /*devide_num = (pdm_sat_table->rfu_protocol_type == 2) ? 8 : 4;*/
  2817. for (i = 0; i <= (codeword_length - 1); i++) {
  2818. beam_ctrl_signal = (boolean)((codeword & BIT(i)) >> i);
  2819. #if 1
  2820. if (p_dm_odm->debug_components & ODM_COMP_ANT_DIV) {
  2821. if (i == (codeword_length - 1)) {
  2822. dbg_print("%d ]\n", beam_ctrl_signal);
  2823. /**/
  2824. } else if (i == 0) {
  2825. dbg_print("Start sending codeword[1:%d] ---> [ %d ", codeword_length, beam_ctrl_signal);
  2826. /**/
  2827. } else if ((i % devide_num) == (devide_num-1)) {
  2828. dbg_print("%d | ", beam_ctrl_signal);
  2829. /**/
  2830. } else {
  2831. dbg_print("%d ", beam_ctrl_signal);
  2832. /**/
  2833. }
  2834. }
  2835. #endif
  2836. if (p_dm_odm->support_ic_type == ODM_RTL8821) {
  2837. #if (RTL8821A_SUPPORT == 1)
  2838. reg44_tmp_p = reg44_ori & (~(BIT(11) | BIT10)); /*clean bit 10 & 11*/
  2839. reg44_tmp_p |= ((1 << 11) | (beam_ctrl_signal << 10));
  2840. reg44_tmp_n = reg44_ori & (~(BIT(11) | BIT(10)));
  2841. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n));*/
  2842. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_p);
  2843. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_n);
  2844. #endif
  2845. }
  2846. #if (RTL8822B_SUPPORT == 1)
  2847. else if (p_dm_odm->support_ic_type == ODM_RTL8822B) {
  2848. if (pdm_sat_table->rfu_protocol_type == 2) {
  2849. reg44_tmp_p = reg44_tmp_p & ~(BIT(8)); /*clean bit 8*/
  2850. reg44_tmp_p = reg44_tmp_p ^ BIT(9); /*get new clk high/low, exclusive-or*/
  2851. reg44_tmp_p |= (beam_ctrl_signal << 8);
  2852. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_p);
  2853. ODM_delay_us(pdm_sat_table->rfu_protocol_delay_time);
  2854. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44 =(( 0x%x )), reg44[9:8] = ((%x)), beam_ctrl_signal =((%x))\n", reg44_tmp_p, ((reg44_tmp_p & 0x300)>>8), beam_ctrl_signal));*/
  2855. } else {
  2856. reg44_tmp_p = reg44_ori & (~(BIT(9) | BIT8)); /*clean bit 9 & 8*/
  2857. reg44_tmp_p |= ((1 << 9) | (beam_ctrl_signal << 8));
  2858. reg44_tmp_n = reg44_ori & (~(BIT(9) | BIT(8)));
  2859. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n)); */
  2860. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_p);
  2861. ODM_delay_us(10);
  2862. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_n);
  2863. ODM_delay_us(10);
  2864. }
  2865. }
  2866. #endif
  2867. }
  2868. }
  2869. void
  2870. phydm_update_rx_idle_beam_type2(
  2871. void *p_dm_void
  2872. )
  2873. {
  2874. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2875. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  2876. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  2877. u32 i;
  2878. pdm_sat_table->update_beam_codeword = phydm_construct_hb_rfu_codeword_type2(p_dm_odm, pdm_sat_table->rx_idle_beam_set_idx);
  2879. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Beam ] BeamSet idx = ((%d))\n", pdm_sat_table->rx_idle_beam_set_idx));
  2880. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  2881. phydm_update_beam_pattern_type2(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  2882. #else
  2883. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_workitem);
  2884. /*odm_stall_execution(1);*/
  2885. #endif
  2886. pdm_sat_table->pre_codeword = pdm_sat_table->update_beam_codeword;
  2887. }
  2888. void
  2889. phydm_hl_smart_ant_debug_type2(
  2890. void *p_dm_void,
  2891. char input[][16],
  2892. u32 *_used,
  2893. char *output,
  2894. u32 *_out_len,
  2895. u32 input_num
  2896. )
  2897. {
  2898. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  2899. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  2900. u32 used = *_used;
  2901. u32 out_len = *_out_len;
  2902. u32 one = 0x1;
  2903. u32 codeword_length = pdm_sat_table->rfu_codeword_total_bit_num;
  2904. u32 beam_ctrl_signal, i;
  2905. u8 devide_num = 4;
  2906. char help[] = "-h";
  2907. u32 dm_value[10] = {0};
  2908. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &dm_value[0]);
  2909. PHYDM_SSCANF(input[2], DCMD_DECIMAL, &dm_value[1]);
  2910. PHYDM_SSCANF(input[3], DCMD_DECIMAL, &dm_value[2]);
  2911. PHYDM_SSCANF(input[4], DCMD_DECIMAL, &dm_value[3]);
  2912. PHYDM_SSCANF(input[5], DCMD_DECIMAL, &dm_value[4]);
  2913. if (strcmp(input[1], help) == 0) {
  2914. PHYDM_SNPRINTF((output + used, out_len - used, " 1 {fix_en} {codeword(Hex)}\n"));
  2915. PHYDM_SNPRINTF((output + used, out_len - used, " 3 {Fix_training_num_en} {Per_beam_training_pkt_num} {Decision_holding_period}\n"));
  2916. PHYDM_SNPRINTF((output + used, out_len - used, " 5 {0:show, 1:2G, 2:5G} {beam_num} {idxA(Hex)} {idxB(Hex)}\n"));
  2917. PHYDM_SNPRINTF((output + used, out_len - used, " 7 {0:show, 1:2G, 2:5G} {total_beam_set_num}\n"));
  2918. PHYDM_SNPRINTF((output + used, out_len - used, " 8 {0:show, 1:set} {RFU delay time(us)}\n"));
  2919. } else if (dm_value[0] == 1) { /*fix beam pattern*/
  2920. pdm_sat_table->fix_beam_pattern_en = dm_value[1];
  2921. if (pdm_sat_table->fix_beam_pattern_en == 1) {
  2922. PHYDM_SSCANF(input[3], DCMD_HEX, &dm_value[2]);
  2923. pdm_sat_table->fix_beam_pattern_codeword = dm_value[2];
  2924. if (pdm_sat_table->fix_beam_pattern_codeword > (one << codeword_length)) {
  2925. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Codeword overflow, Current codeword is ((0x%x)), and should be less than ((%d))bit\n",
  2926. pdm_sat_table->fix_beam_pattern_codeword, codeword_length));
  2927. (pdm_sat_table->fix_beam_pattern_codeword) &= 0xffffff;
  2928. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Auto modify to (0x%x)\n", pdm_sat_table->fix_beam_pattern_codeword));
  2929. }
  2930. pdm_sat_table->update_beam_codeword = pdm_sat_table->fix_beam_pattern_codeword;
  2931. /*---------------------------------------------------------*/
  2932. PHYDM_SNPRINTF((output + used, out_len - used, "Fix Beam Pattern\n"));
  2933. /*devide_num = (pdm_sat_table->rfu_protocol_type == 2) ? 8 : 4;*/
  2934. for (i = 0; i <= (codeword_length - 1); i++) {
  2935. beam_ctrl_signal = (boolean)((pdm_sat_table->update_beam_codeword & BIT(i)) >> i);
  2936. if (i == (codeword_length - 1)) {
  2937. PHYDM_SNPRINTF((output + used, out_len - used, "%d]\n", beam_ctrl_signal));
  2938. /**/
  2939. } else if (i == 0) {
  2940. PHYDM_SNPRINTF((output + used, out_len - used, "Send Codeword[1:%d] to RFU -> [%d", pdm_sat_table->rfu_codeword_total_bit_num, beam_ctrl_signal));
  2941. /**/
  2942. } else if ((i % devide_num) == (devide_num-1)) {
  2943. PHYDM_SNPRINTF((output + used, out_len - used, "%d|", beam_ctrl_signal));
  2944. /**/
  2945. } else {
  2946. PHYDM_SNPRINTF((output + used, out_len - used, "%d", beam_ctrl_signal));
  2947. /**/
  2948. }
  2949. }
  2950. /*---------------------------------------------------------*/
  2951. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  2952. phydm_update_beam_pattern_type2(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  2953. #else
  2954. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_workitem);
  2955. /*odm_stall_execution(1);*/
  2956. #endif
  2957. } else if (pdm_sat_table->fix_beam_pattern_en == 0)
  2958. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Smart Antenna: Enable\n"));
  2959. } else if (dm_value[0] == 2) { /*set latch time*/
  2960. pdm_sat_table->latch_time = dm_value[1];
  2961. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] latch_time =0x%x\n", pdm_sat_table->latch_time));
  2962. } else if (dm_value[0] == 3) {
  2963. pdm_sat_table->fix_training_num_en = dm_value[1];
  2964. if (pdm_sat_table->fix_training_num_en == 1) {
  2965. pdm_sat_table->per_beam_training_pkt_num = (u8)dm_value[2];
  2966. pdm_sat_table->decision_holding_period = (u8)dm_value[3];
  2967. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] Fix_train_en = (( %d )), train_pkt_num = (( %d )), holding_period = (( %d )),\n",
  2968. pdm_sat_table->fix_training_num_en, pdm_sat_table->per_beam_training_pkt_num, pdm_sat_table->decision_holding_period));
  2969. } else if (pdm_sat_table->fix_training_num_en == 0) {
  2970. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] AUTO per_beam_training_pkt_num\n"));
  2971. /**/
  2972. }
  2973. } else if (dm_value[0] == 4) {
  2974. #if 0
  2975. if (dm_value[1] == 1) {
  2976. pdm_sat_table->ant_num = 1;
  2977. pdm_sat_table->first_train_ant = MAIN_ANT;
  2978. } else if (dm_value[1] == 2) {
  2979. pdm_sat_table->ant_num = 1;
  2980. pdm_sat_table->first_train_ant = AUX_ANT;
  2981. } else if (dm_value[1] == 3) {
  2982. pdm_sat_table->ant_num = 2;
  2983. pdm_sat_table->first_train_ant = MAIN_ANT;
  2984. }
  2985. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Set ant Num = (( %d )), first_train_ant = (( %d ))\n",
  2986. pdm_sat_table->ant_num, (pdm_sat_table->first_train_ant - 1)));
  2987. #endif
  2988. } else if (dm_value[0] == 5) { /*set beam set table*/
  2989. PHYDM_SSCANF(input[4], DCMD_HEX, &dm_value[3]);
  2990. PHYDM_SSCANF(input[5], DCMD_HEX, &dm_value[4]);
  2991. if (dm_value[1] == 1) { /*2G*/
  2992. if (dm_value[2] < SUPPORT_BEAM_SET_PATTERN_NUM) {
  2993. pdm_sat_table->rfu_codeword_table_2g[dm_value[2] ][0] = (u8)dm_value[3];
  2994. pdm_sat_table->rfu_codeword_table_2g[dm_value[2] ][1] = (u8)dm_value[4];
  2995. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] Set 2G Table[%d] = [A:0x%x, B:0x%x]\n",dm_value[2], dm_value[3], dm_value[4]));
  2996. }
  2997. } else if (dm_value[1] == 2) { /*5G*/
  2998. if (dm_value[2] < SUPPORT_BEAM_SET_PATTERN_NUM) {
  2999. pdm_sat_table->rfu_codeword_table_5g[dm_value[2] ][0] = (u8)dm_value[3];
  3000. pdm_sat_table->rfu_codeword_table_5g[dm_value[2] ][1] = (u8)dm_value[4];
  3001. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] Set5G Table[%d] = [A:0x%x, B:0x%x]\n",dm_value[2], dm_value[3], dm_value[4]));
  3002. }
  3003. } else if (dm_value[1] == 0) {
  3004. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] 2G Beam Table==============>\n"));
  3005. for (i = 0; i < pdm_sat_table->total_beam_set_num_2g; i++) {
  3006. PHYDM_SNPRINTF((output + used, out_len - used, "2G Table[%d] = [A:0x%x, B:0x%x]\n",
  3007. i, pdm_sat_table->rfu_codeword_table_2g[i][0], pdm_sat_table->rfu_codeword_table_2g[i][1]));
  3008. }
  3009. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] 5G Beam Table==============>\n"));
  3010. for (i = 0; i < pdm_sat_table->total_beam_set_num_5g; i++) {
  3011. PHYDM_SNPRINTF((output + used, out_len - used, "5G Table[%d] = [A:0x%x, B:0x%x]\n",
  3012. i, pdm_sat_table->rfu_codeword_table_5g[i][0], pdm_sat_table->rfu_codeword_table_5g[i][1]));
  3013. }
  3014. }
  3015. } else if (dm_value[0] == 6) {
  3016. #if 0
  3017. if (dm_value[1] == 0) {
  3018. if (dm_value[2] < SUPPORT_BEAM_SET_PATTERN_NUM) {
  3019. pdm_sat_table->rfu_codeword_table_5g[dm_value[2] ][0] = (u8)dm_value[3];
  3020. pdm_sat_table->rfu_codeword_table_5g[dm_value[2] ][1] = (u8)dm_value[4];
  3021. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] Set5G Table[%d] = [A:0x%x, B:0x%x]\n",dm_value[2], dm_value[3], dm_value[4]));
  3022. }
  3023. } else {
  3024. for (i = 0; i < pdm_sat_table->total_beam_set_num_5g; i++) {
  3025. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] Read 5G Table[%d] = [A:0x%x, B:0x%x]\n",
  3026. i, pdm_sat_table->rfu_codeword_table_5g[i][0], pdm_sat_table->rfu_codeword_table_5g[i][1]));
  3027. }
  3028. }
  3029. #endif
  3030. } else if (dm_value[0] == 7) {
  3031. if (dm_value[1] == 1) {
  3032. pdm_sat_table->total_beam_set_num_2g = (u8)(dm_value[2]);
  3033. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] total_beam_set_num_2g = ((%d))\n", pdm_sat_table->total_beam_set_num_2g));
  3034. } else if (dm_value[1] == 2) {
  3035. pdm_sat_table->total_beam_set_num_5g = (u8)(dm_value[2]);
  3036. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] total_beam_set_num_5g = ((%d))\n", pdm_sat_table->total_beam_set_num_5g));
  3037. } else if (dm_value[1] == 0) {
  3038. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Show total_beam_set_num{2g,5g} = {%d,%d}\n",
  3039. pdm_sat_table->total_beam_set_num_2g, pdm_sat_table->total_beam_set_num_5g));
  3040. }
  3041. } else if (dm_value[0] == 8) {
  3042. if (dm_value[1] == 1) {
  3043. pdm_sat_table->rfu_protocol_delay_time = (u16)(dm_value[2]);
  3044. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] Set rfu_protocol_delay_time = ((%d))\n", pdm_sat_table->rfu_protocol_delay_time));
  3045. } else if (dm_value[1] == 0) {
  3046. PHYDM_SNPRINTF((output + used, out_len - used, "[SmtAnt] Read rfu_protocol_delay_time = ((%d))\n", pdm_sat_table->rfu_protocol_delay_time));
  3047. }
  3048. }
  3049. }
  3050. void
  3051. phydm_set_rfu_beam_pattern_type2(
  3052. void *p_dm_void
  3053. )
  3054. {
  3055. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3056. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3057. if (p_dm_odm->ant_div_type != HL_SW_SMART_ANT_TYPE2)
  3058. return;
  3059. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training beam_set index = (( 0x%x ))\n", pdm_sat_table->fast_training_beam_num));
  3060. pdm_sat_table->update_beam_codeword = phydm_construct_hb_rfu_codeword_type2(p_dm_odm, pdm_sat_table->fast_training_beam_num);
  3061. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  3062. phydm_update_beam_pattern_type2(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  3063. #else
  3064. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_workitem);
  3065. /*odm_stall_execution(1);*/
  3066. #endif
  3067. }
  3068. void
  3069. phydm_fast_ant_training_hl_smart_antenna_type2(
  3070. void *p_dm_void
  3071. )
  3072. {
  3073. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3074. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3075. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &(p_dm_odm->dm_fat_table);
  3076. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  3077. u32 codeword = 0;
  3078. u8 i = 0, j=0;
  3079. u8 avg_rssi_tmp;
  3080. u8 avg_rssi_tmp_ma;
  3081. u8 max_beam_ant_rssi = 0;
  3082. u8 rssi_target_beam = 0, target_beam_max_rssi = 0;
  3083. u8 evm1ss_target_beam = 0, evm2ss_target_beam = 0;
  3084. u32 target_beam_max_evm1ss = 0, target_beam_max_evm2ss = 0;
  3085. u32 beam_tmp;
  3086. u8 per_beam_rssi_diff_tmp = 0, training_pkt_num_offset;
  3087. u32 avg_evm2ss[2] = {0}, avg_evm2ss_sum = 0;
  3088. u32 avg_evm1ss = 0;
  3089. u32 beam_path_evm_2ss_cnt_all = 0; /*sum of all 2SS-pattern cnt*/
  3090. u32 beam_path_evm_1ss_cnt_all = 0; /*sum of all 1SS-pattern cnt*/
  3091. u8 decision_type;
  3092. if (!p_dm_odm->is_linked) {
  3093. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
  3094. if (p_dm_fat_table->is_become_linked == true) {
  3095. pdm_sat_table->decision_holding_period = 0;
  3096. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Link->no Link\n"));
  3097. p_dm_fat_table->fat_state = FAT_BEFORE_LINK_STATE;
  3098. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("change to (( %d )) FAT_state\n", p_dm_fat_table->fat_state));
  3099. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  3100. }
  3101. return;
  3102. } else {
  3103. if (p_dm_fat_table->is_become_linked == false) {
  3104. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));
  3105. p_dm_fat_table->fat_state = FAT_PREPARE_STATE;
  3106. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("change to (( %d )) FAT_state\n", p_dm_fat_table->fat_state));
  3107. /*pdm_sat_table->fast_training_beam_num = 0;*/
  3108. /*phydm_set_rfu_beam_pattern_type2(p_dm_odm);*/
  3109. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  3110. }
  3111. }
  3112. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("HL Smart ant Training: state (( %d ))\n", p_dm_fat_table->fat_state));*/
  3113. /* [DECISION STATE] */
  3114. /*=======================================================================================*/
  3115. if (p_dm_fat_table->fat_state == FAT_DECISION_STATE) {
  3116. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 3. In Decision state]\n"));
  3117. /*compute target beam in each antenna*/
  3118. for (j = 0; j < (pdm_sat_table->total_beam_set_num); j++) {
  3119. /*[Decision1: RSSI]-------------------------------------------------------------------*/
  3120. if (pdm_sat_table->statistic_pkt_cnt[j] == 0) { /*if new RSSI = 0 -> MA_RSSI-=2*/
  3121. avg_rssi_tmp = pdm_sat_table->beam_set_avg_rssi_pre[j];
  3122. avg_rssi_tmp = (avg_rssi_tmp >= 2) ? (avg_rssi_tmp - 2) : avg_rssi_tmp;
  3123. avg_rssi_tmp_ma = avg_rssi_tmp;
  3124. } else {
  3125. avg_rssi_tmp = (u8)((pdm_sat_table->beam_set_rssi_avg_sum[j]) / (pdm_sat_table->statistic_pkt_cnt[j]));
  3126. avg_rssi_tmp_ma = (avg_rssi_tmp + pdm_sat_table->beam_set_avg_rssi_pre[j]) >> 1;
  3127. }
  3128. pdm_sat_table->beam_set_avg_rssi_pre[j] = avg_rssi_tmp;
  3129. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Beam_Set[%d]: pkt_cnt=(( %d )), avg_rssi_MA=(( %d )), avg_rssi=(( %d ))\n",
  3130. j, pdm_sat_table->statistic_pkt_cnt[j], avg_rssi_tmp_ma, avg_rssi_tmp));
  3131. if (avg_rssi_tmp > target_beam_max_rssi) {
  3132. rssi_target_beam = j;
  3133. target_beam_max_rssi = avg_rssi_tmp;
  3134. }
  3135. /*[Decision2: EVM 2ss]-------------------------------------------------------------------*/
  3136. if (pdm_sat_table->beam_path_evm_2ss_cnt[j] != 0) {
  3137. avg_evm2ss[0] = pdm_sat_table->beam_path_evm_2ss_sum[j][0] / pdm_sat_table->beam_path_evm_2ss_cnt[j];
  3138. avg_evm2ss[1] = pdm_sat_table->beam_path_evm_2ss_sum[j][1] / pdm_sat_table->beam_path_evm_2ss_cnt[j];
  3139. avg_evm2ss_sum = avg_evm2ss[0] + avg_evm2ss[1];
  3140. beam_path_evm_2ss_cnt_all += pdm_sat_table->beam_path_evm_2ss_cnt[j];
  3141. }
  3142. if (avg_evm2ss_sum > target_beam_max_evm2ss) {
  3143. evm2ss_target_beam = j;
  3144. target_beam_max_evm2ss = avg_evm2ss_sum;
  3145. }
  3146. /*[Decision3: EVM 1ss]-------------------------------------------------------------------*/
  3147. if (pdm_sat_table->beam_path_evm_1ss_cnt[j] != 0) {
  3148. avg_evm1ss = pdm_sat_table->beam_path_evm_1ss_sum[j] / pdm_sat_table->beam_path_evm_1ss_cnt[j];
  3149. beam_path_evm_1ss_cnt_all += pdm_sat_table->beam_path_evm_1ss_cnt[j];
  3150. }
  3151. if (avg_evm1ss > target_beam_max_evm1ss) {
  3152. evm1ss_target_beam = j;
  3153. target_beam_max_evm1ss = avg_evm1ss;
  3154. }
  3155. /*reset counter value*/
  3156. pdm_sat_table->beam_set_rssi_avg_sum[j] = 0;
  3157. pdm_sat_table->beam_path_rssi_sum[j][0] = 0;
  3158. pdm_sat_table->beam_path_rssi_sum[j][1] = 0;
  3159. pdm_sat_table->statistic_pkt_cnt[j] = 0;
  3160. pdm_sat_table->beam_path_evm_2ss_sum[j][0] = 0;
  3161. pdm_sat_table->beam_path_evm_2ss_sum[j][1] = 0;
  3162. pdm_sat_table->beam_path_evm_2ss_cnt[j] = 0;
  3163. pdm_sat_table->beam_path_evm_1ss_sum[j] = 0;
  3164. pdm_sat_table->beam_path_evm_1ss_cnt[j] = 0;
  3165. }
  3166. if (pdm_sat_table->beam_path_evm_1ss_cnt[j] != 0) {
  3167. avg_evm1ss = pdm_sat_table->beam_path_evm_1ss_sum[j] / pdm_sat_table->beam_path_evm_1ss_cnt[j];
  3168. }
  3169. /*[Joint Decision]-------------------------------------------------------------------*/
  3170. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("---> [RSSI] Target Beam(( %d )) RSSI_max=((%d))\n", rssi_target_beam, target_beam_max_rssi));
  3171. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("---> [EVM 2SS] Target Beam(( %d )) EVM2SS_max=((%d))\n", evm2ss_target_beam, target_beam_max_evm2ss));
  3172. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("---> [EVM 1SS] Target Beam(( %d )) EVM1SS_max=((%d))\n", evm1ss_target_beam, target_beam_max_evm1ss));
  3173. if (target_beam_max_rssi <= 20) {
  3174. pdm_sat_table->rx_idle_beam_set_idx = rssi_target_beam;
  3175. decision_type = 1;
  3176. } else {
  3177. if (((beam_path_evm_2ss_cnt_all<<2) > (beam_path_evm_1ss_cnt_all)) && (beam_path_evm_2ss_cnt_all != 0)) {
  3178. pdm_sat_table->rx_idle_beam_set_idx = evm2ss_target_beam;
  3179. decision_type = 2;
  3180. } else if (beam_path_evm_1ss_cnt_all != 0) {
  3181. pdm_sat_table->rx_idle_beam_set_idx = evm1ss_target_beam;
  3182. decision_type = 3;
  3183. } else {
  3184. pdm_sat_table->rx_idle_beam_set_idx = rssi_target_beam;
  3185. decision_type = 4;
  3186. }
  3187. }
  3188. /*Calculate packet counter offset*/
  3189. for (j = 0; j < (pdm_sat_table->total_beam_set_num); j++) {
  3190. per_beam_rssi_diff_tmp = target_beam_max_rssi - pdm_sat_table->beam_set_avg_rssi_pre[j];
  3191. pdm_sat_table->beam_set_train_rssi_diff[j] = per_beam_rssi_diff_tmp;
  3192. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Beam_Set[%d]: RSSI_diff= ((%d))\n", j, per_beam_rssi_diff_tmp));
  3193. }
  3194. /*set beam in each antenna*/
  3195. phydm_update_rx_idle_beam_type2(p_dm_odm);
  3196. p_dm_fat_table->fat_state = FAT_PREPARE_STATE;
  3197. }
  3198. /* [TRAINING STATE] */
  3199. else if (p_dm_fat_table->fat_state == FAT_TRAINING_STATE) {
  3200. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2. In Training state]\n"));
  3201. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("curr_beam_idx = (( %d )), pre_beam_idx = (( %d ))\n",
  3202. pdm_sat_table->fast_training_beam_num, pdm_sat_table->pre_fast_training_beam_num));
  3203. if (pdm_sat_table->fast_training_beam_num > pdm_sat_table->pre_fast_training_beam_num)
  3204. pdm_sat_table->force_update_beam_en = 0;
  3205. else {
  3206. pdm_sat_table->force_update_beam_en = 1;
  3207. pdm_sat_table->pkt_counter = 0;
  3208. beam_tmp = pdm_sat_table->fast_training_beam_num;
  3209. if (pdm_sat_table->fast_training_beam_num >= ((u32)pdm_sat_table->total_beam_set_num - 1)) {
  3210. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Timeout Update] Beam_num (( %d )) -> (( decision ))\n", pdm_sat_table->fast_training_beam_num));
  3211. p_dm_fat_table->fat_state = FAT_DECISION_STATE;
  3212. phydm_fast_ant_training_hl_smart_antenna_type2(p_dm_odm);
  3213. } else {
  3214. pdm_sat_table->fast_training_beam_num++;
  3215. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Timeout Update] Beam_num (( %d )) -> (( %d ))\n", beam_tmp, pdm_sat_table->fast_training_beam_num));
  3216. phydm_set_rfu_beam_pattern_type2(p_dm_odm);
  3217. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  3218. }
  3219. }
  3220. pdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;
  3221. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Update Pre_Beam =(( %d ))\n", pdm_sat_table->pre_fast_training_beam_num));
  3222. }
  3223. /* [Prepare state] */
  3224. /*=======================================================================================*/
  3225. else if (p_dm_fat_table->fat_state == FAT_PREPARE_STATE) {
  3226. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n\n[ 1. In Prepare state]\n"));
  3227. if (p_dm_odm->pre_traffic_load == (p_dm_odm->traffic_load)) {
  3228. if (pdm_sat_table->decision_holding_period != 0) {
  3229. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Holding_period = (( %d )), return!!!\n", pdm_sat_table->decision_holding_period));
  3230. pdm_sat_table->decision_holding_period--;
  3231. return;
  3232. }
  3233. }
  3234. /* Set training packet number*/
  3235. if (pdm_sat_table->fix_training_num_en == 0) {
  3236. switch (p_dm_odm->traffic_load) {
  3237. case TRAFFIC_HIGH:
  3238. pdm_sat_table->per_beam_training_pkt_num = 8;
  3239. pdm_sat_table->decision_holding_period = 2;
  3240. break;
  3241. case TRAFFIC_MID:
  3242. pdm_sat_table->per_beam_training_pkt_num = 6;
  3243. pdm_sat_table->decision_holding_period = 3;
  3244. break;
  3245. case TRAFFIC_LOW:
  3246. pdm_sat_table->per_beam_training_pkt_num = 3; /*ping 60000*/
  3247. pdm_sat_table->decision_holding_period = 4;
  3248. break;
  3249. case TRAFFIC_ULTRA_LOW:
  3250. pdm_sat_table->per_beam_training_pkt_num = 1;
  3251. pdm_sat_table->decision_holding_period = 6;
  3252. break;
  3253. default:
  3254. break;
  3255. }
  3256. }
  3257. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TrafficLoad = (( %d )), Fix_beam = (( %d )), per_beam_training_pkt_num = (( %d )), decision_holding_period = ((%d))\n",
  3258. p_dm_odm->traffic_load, pdm_sat_table->fix_training_num_en, pdm_sat_table->per_beam_training_pkt_num, pdm_sat_table->decision_holding_period));
  3259. /*Beam_set number*/
  3260. if (*p_dm_odm->p_band_type == ODM_BAND_5G) {
  3261. pdm_sat_table->total_beam_set_num = pdm_sat_table->total_beam_set_num_5g;
  3262. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("5G beam_set num = ((%d))\n", pdm_sat_table->total_beam_set_num));
  3263. } else {
  3264. pdm_sat_table->total_beam_set_num = pdm_sat_table->total_beam_set_num_2g;
  3265. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("2G beam_set num = ((%d))\n", pdm_sat_table->total_beam_set_num));
  3266. }
  3267. for (j = 0; j < (pdm_sat_table->total_beam_set_num); j++) {
  3268. training_pkt_num_offset = pdm_sat_table->beam_set_train_rssi_diff[j];
  3269. if ((pdm_sat_table->per_beam_training_pkt_num) > training_pkt_num_offset)
  3270. pdm_sat_table->beam_set_train_cnt[j] = pdm_sat_table->per_beam_training_pkt_num - training_pkt_num_offset;
  3271. else
  3272. pdm_sat_table->beam_set_train_cnt[j] = 1;
  3273. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Beam_Set[ %d ] training_pkt_offset = ((%d)), training_pkt_num = ((%d))\n",
  3274. j, pdm_sat_table->beam_set_train_rssi_diff[j], pdm_sat_table->beam_set_train_cnt[j]));
  3275. }
  3276. pdm_sat_table->pre_beacon_counter = pdm_sat_table->beacon_counter;
  3277. pdm_sat_table->update_beam_idx = 0;
  3278. pdm_sat_table->pkt_counter = 0;
  3279. pdm_sat_table->fast_training_beam_num = 0;
  3280. phydm_set_rfu_beam_pattern_type2(p_dm_odm);
  3281. pdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;
  3282. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  3283. }
  3284. }
  3285. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  3286. void
  3287. phydm_beam_switch_workitem_callback(
  3288. void *p_context
  3289. )
  3290. {
  3291. struct _ADAPTER *p_adapter = (struct _ADAPTER *)p_context;
  3292. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  3293. struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
  3294. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3295. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  3296. pdm_sat_table->pkt_skip_statistic_en = 1;
  3297. #endif
  3298. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Beam Switch Workitem Callback, pkt_skip_statistic_en = (( %d ))\n", pdm_sat_table->pkt_skip_statistic_en));
  3299. phydm_update_beam_pattern_type2(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  3300. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  3301. /*odm_stall_execution(pdm_sat_table->latch_time);*/
  3302. pdm_sat_table->pkt_skip_statistic_en = 0;
  3303. #endif
  3304. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pkt_skip_statistic_en = (( %d )), latch_time = (( %d ))\n", pdm_sat_table->pkt_skip_statistic_en, pdm_sat_table->latch_time));
  3305. }
  3306. void
  3307. phydm_beam_decision_workitem_callback(
  3308. void *p_context
  3309. )
  3310. {
  3311. struct _ADAPTER *p_adapter = (struct _ADAPTER *)p_context;
  3312. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  3313. struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
  3314. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Beam decision Workitem Callback\n"));
  3315. phydm_fast_ant_training_hl_smart_antenna_type2(p_dm_odm);
  3316. }
  3317. #endif
  3318. #elif (defined(CONFIG_HL_SMART_ANTENNA_TYPE1))
  3319. u32
  3320. phydm_construct_hl_beam_codeword(
  3321. void *p_dm_void,
  3322. u32 *beam_pattern_idx,
  3323. u32 ant_num
  3324. )
  3325. {
  3326. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3327. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3328. u32 codeword = 0;
  3329. u32 data_tmp;
  3330. u32 i;
  3331. u32 break_counter = 0;
  3332. if (ant_num < 8) {
  3333. for (i = 0; i < (pdm_sat_table->ant_num_total); i++) {
  3334. /*ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("beam_pattern_num[%x] = %x\n",i,beam_pattern_num[i] ));*/
  3335. if ((i < (pdm_sat_table->first_train_ant - 1)) || (break_counter >= (pdm_sat_table->ant_num))) {
  3336. data_tmp = 0;
  3337. /**/
  3338. } else {
  3339. break_counter++;
  3340. if (beam_pattern_idx[i] == 0) {
  3341. if (*p_dm_odm->p_band_type == ODM_BAND_5G)
  3342. data_tmp = pdm_sat_table->rfu_codeword_table_5g[0];
  3343. else
  3344. data_tmp = pdm_sat_table->rfu_codeword_table[0];
  3345. } else if (beam_pattern_idx[i] == 1) {
  3346. if (*p_dm_odm->p_band_type == ODM_BAND_5G)
  3347. data_tmp = pdm_sat_table->rfu_codeword_table_5g[1];
  3348. else
  3349. data_tmp = pdm_sat_table->rfu_codeword_table[1];
  3350. } else if (beam_pattern_idx[i] == 2) {
  3351. if (*p_dm_odm->p_band_type == ODM_BAND_5G)
  3352. data_tmp = pdm_sat_table->rfu_codeword_table_5g[2];
  3353. else
  3354. data_tmp = pdm_sat_table->rfu_codeword_table[2];
  3355. } else if (beam_pattern_idx[i] == 3) {
  3356. if (*p_dm_odm->p_band_type == ODM_BAND_5G)
  3357. data_tmp = pdm_sat_table->rfu_codeword_table_5g[3];
  3358. else
  3359. data_tmp = pdm_sat_table->rfu_codeword_table[3];
  3360. }
  3361. }
  3362. codeword |= (data_tmp << (i * 4));
  3363. }
  3364. }
  3365. return codeword;
  3366. }
  3367. void
  3368. phydm_update_beam_pattern(
  3369. void *p_dm_void,
  3370. u32 codeword,
  3371. u32 codeword_length
  3372. )
  3373. {
  3374. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3375. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3376. u8 i;
  3377. boolean beam_ctrl_signal;
  3378. u32 one = 0x1;
  3379. u32 reg44_tmp_p, reg44_tmp_n, reg44_ori;
  3380. u8 devide_num = 4;
  3381. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Set Beam Pattern =0x%x\n", codeword));
  3382. reg44_ori = odm_get_mac_reg(p_dm_odm, 0x44, MASKDWORD);
  3383. reg44_tmp_p = reg44_ori;
  3384. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44_ori =0x%x\n", reg44_ori));*/
  3385. devide_num = (pdm_sat_table->rfu_protocol_type == 2) ? 6 : 4;
  3386. for (i = 0; i <= (codeword_length - 1); i++) {
  3387. beam_ctrl_signal = (boolean)((codeword & BIT(i)) >> i);
  3388. if (p_dm_odm->debug_components & ODM_COMP_ANT_DIV) {
  3389. if (i == (codeword_length - 1)) {
  3390. dbg_print("%d ]\n", beam_ctrl_signal);
  3391. /**/
  3392. } else if (i == 0) {
  3393. dbg_print("Send codeword[1:%d] ---> [ %d ", codeword_length, beam_ctrl_signal);
  3394. /**/
  3395. } else if ((i % devide_num) == (devide_num-1)) {
  3396. dbg_print("%d | ", beam_ctrl_signal);
  3397. /**/
  3398. } else {
  3399. dbg_print("%d ", beam_ctrl_signal);
  3400. /**/
  3401. }
  3402. }
  3403. if (p_dm_odm->support_ic_type == ODM_RTL8821) {
  3404. #if (RTL8821A_SUPPORT == 1)
  3405. reg44_tmp_p = reg44_ori & (~(BIT(11) | BIT10)); /*clean bit 10 & 11*/
  3406. reg44_tmp_p |= ((1 << 11) | (beam_ctrl_signal << 10));
  3407. reg44_tmp_n = reg44_ori & (~(BIT(11) | BIT(10)));
  3408. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n));*/
  3409. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_p);
  3410. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_n);
  3411. #endif
  3412. }
  3413. #if (RTL8822B_SUPPORT == 1)
  3414. else if (p_dm_odm->support_ic_type == ODM_RTL8822B) {
  3415. if (pdm_sat_table->rfu_protocol_type == 2) {
  3416. reg44_tmp_p = reg44_tmp_p & ~(BIT(8)); /*clean bit 8*/
  3417. reg44_tmp_p = reg44_tmp_p ^ BIT(9); /*get new clk high/low, exclusive-or*/
  3418. reg44_tmp_p |= (beam_ctrl_signal << 8);
  3419. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_p);
  3420. ODM_delay_us(10);
  3421. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44 =(( 0x%x )), reg44[9:8] = ((%x)), beam_ctrl_signal =((%x))\n", reg44_tmp_p, ((reg44_tmp_p & 0x300)>>8), beam_ctrl_signal));*/
  3422. } else {
  3423. reg44_tmp_p = reg44_ori & (~(BIT(9) | BIT8)); /*clean bit 9 & 8*/
  3424. reg44_tmp_p |= ((1 << 9) | (beam_ctrl_signal << 8));
  3425. reg44_tmp_n = reg44_ori & (~(BIT(9) | BIT(8)));
  3426. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reg44_tmp_p =(( 0x%x )), reg44_tmp_n = (( 0x%x ))\n", reg44_tmp_p, reg44_tmp_n)); */
  3427. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_p);
  3428. ODM_delay_us(10);
  3429. odm_set_mac_reg(p_dm_odm, 0x44, MASKDWORD, reg44_tmp_n);
  3430. ODM_delay_us(10);
  3431. }
  3432. }
  3433. #endif
  3434. }
  3435. }
  3436. void
  3437. phydm_update_rx_idle_beam(
  3438. void *p_dm_void
  3439. )
  3440. {
  3441. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3442. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  3443. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3444. u32 i;
  3445. pdm_sat_table->update_beam_codeword = phydm_construct_hl_beam_codeword(p_dm_odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);
  3446. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set target beam_pattern codeword = (( 0x%x ))\n", pdm_sat_table->update_beam_codeword));
  3447. for (i = 0; i < (pdm_sat_table->ant_num); i++) {
  3448. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Beam ] RxIdleBeam[%d] =%d\n", i, pdm_sat_table->rx_idle_beam[i]));
  3449. /**/
  3450. }
  3451. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  3452. phydm_update_beam_pattern(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  3453. #else
  3454. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_workitem);
  3455. /*odm_stall_execution(1);*/
  3456. #endif
  3457. pdm_sat_table->pre_codeword = pdm_sat_table->update_beam_codeword;
  3458. }
  3459. void
  3460. phydm_hl_smart_ant_debug(
  3461. void *p_dm_void,
  3462. char input[][16],
  3463. u32 *_used,
  3464. char *output,
  3465. u32 *_out_len,
  3466. u32 input_num
  3467. )
  3468. {
  3469. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3470. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3471. u32 used = *_used;
  3472. u32 out_len = *_out_len;
  3473. u32 one = 0x1;
  3474. u32 codeword_length = pdm_sat_table->rfu_codeword_total_bit_num;
  3475. u32 beam_ctrl_signal, i;
  3476. u8 devide_num = 4;
  3477. if (dm_value[0] == 1) { /*fix beam pattern*/
  3478. pdm_sat_table->fix_beam_pattern_en = dm_value[1];
  3479. if (pdm_sat_table->fix_beam_pattern_en == 1) {
  3480. pdm_sat_table->fix_beam_pattern_codeword = dm_value[2];
  3481. if (pdm_sat_table->fix_beam_pattern_codeword > (one << codeword_length)) {
  3482. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Codeword overflow, Current codeword is ((0x%x)), and should be less than ((%d))bit\n",
  3483. pdm_sat_table->fix_beam_pattern_codeword, codeword_length));
  3484. (pdm_sat_table->fix_beam_pattern_codeword) &= 0xffffff;
  3485. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Auto modify to (0x%x)\n", pdm_sat_table->fix_beam_pattern_codeword));
  3486. }
  3487. pdm_sat_table->update_beam_codeword = pdm_sat_table->fix_beam_pattern_codeword;
  3488. /*---------------------------------------------------------*/
  3489. PHYDM_SNPRINTF((output + used, out_len - used, "Fix Beam Pattern\n"));
  3490. devide_num = (pdm_sat_table->rfu_protocol_type == 2) ? 6 : 4;
  3491. for (i = 0; i <= (codeword_length - 1); i++) {
  3492. beam_ctrl_signal = (boolean)((pdm_sat_table->update_beam_codeword & BIT(i)) >> i);
  3493. if (i == (codeword_length - 1)) {
  3494. PHYDM_SNPRINTF((output + used, out_len - used, "%d]\n", beam_ctrl_signal));
  3495. /**/
  3496. } else if (i == 0) {
  3497. PHYDM_SNPRINTF((output + used, out_len - used, "Send Codeword[1:24] to RFU -> [%d", beam_ctrl_signal));
  3498. /**/
  3499. } else if ((i % devide_num) == (devide_num-1)) {
  3500. PHYDM_SNPRINTF((output + used, out_len - used, "%d|", beam_ctrl_signal));
  3501. /**/
  3502. } else {
  3503. PHYDM_SNPRINTF((output + used, out_len - used, "%d", beam_ctrl_signal));
  3504. /**/
  3505. }
  3506. }
  3507. /*---------------------------------------------------------*/
  3508. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  3509. phydm_update_beam_pattern(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  3510. #else
  3511. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_workitem);
  3512. /*odm_stall_execution(1);*/
  3513. #endif
  3514. } else if (pdm_sat_table->fix_beam_pattern_en == 0)
  3515. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Smart Antenna: Enable\n"));
  3516. } else if (dm_value[0] == 2) { /*set latch time*/
  3517. pdm_sat_table->latch_time = dm_value[1];
  3518. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] latch_time =0x%x\n", pdm_sat_table->latch_time));
  3519. } else if (dm_value[0] == 3) {
  3520. pdm_sat_table->fix_training_num_en = dm_value[1];
  3521. if (pdm_sat_table->fix_training_num_en == 1) {
  3522. pdm_sat_table->per_beam_training_pkt_num = (u8)dm_value[2];
  3523. pdm_sat_table->decision_holding_period = (u8)dm_value[3];
  3524. PHYDM_SNPRINTF((output + used, out_len - used, "[SmartAnt][Dbg] Fix_train_en = (( %d )), train_pkt_num = (( %d )), holding_period = (( %d )),\n",
  3525. pdm_sat_table->fix_training_num_en, pdm_sat_table->per_beam_training_pkt_num, pdm_sat_table->decision_holding_period));
  3526. } else if (pdm_sat_table->fix_training_num_en == 0) {
  3527. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] AUTO per_beam_training_pkt_num\n"));
  3528. /**/
  3529. }
  3530. } else if (dm_value[0] == 4) {
  3531. if (dm_value[1] == 1) {
  3532. pdm_sat_table->ant_num = 1;
  3533. pdm_sat_table->first_train_ant = MAIN_ANT;
  3534. } else if (dm_value[1] == 2) {
  3535. pdm_sat_table->ant_num = 1;
  3536. pdm_sat_table->first_train_ant = AUX_ANT;
  3537. } else if (dm_value[1] == 3) {
  3538. pdm_sat_table->ant_num = 2;
  3539. pdm_sat_table->first_train_ant = MAIN_ANT;
  3540. }
  3541. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Set ant Num = (( %d )), first_train_ant = (( %d ))\n",
  3542. pdm_sat_table->ant_num, (pdm_sat_table->first_train_ant - 1)));
  3543. } else if (dm_value[0] == 5) {
  3544. if (dm_value[1] <= 3) {
  3545. pdm_sat_table->rfu_codeword_table[dm_value[1]] = dm_value[2];
  3546. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Set Beam_2G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  3547. dm_value[1], dm_value[2]));
  3548. } else {
  3549. for (i = 0; i < 4; i++) {
  3550. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Show Beam_2G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  3551. i, pdm_sat_table->rfu_codeword_table[i]));
  3552. }
  3553. }
  3554. } else if (dm_value[0] == 6) {
  3555. if (dm_value[1] <= 3) {
  3556. pdm_sat_table->rfu_codeword_table_5g[dm_value[1]] = dm_value[2];
  3557. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Set Beam_5G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  3558. dm_value[1], dm_value[2]));
  3559. } else {
  3560. for (i = 0; i < 4; i++) {
  3561. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Show Beam_5G: (( %d )), RFU codeword table = (( 0x%x ))\n",
  3562. i, pdm_sat_table->rfu_codeword_table_5g[i]));
  3563. }
  3564. }
  3565. } else if (dm_value[0] == 7) {
  3566. if (dm_value[1] <= 4) {
  3567. pdm_sat_table->beam_patten_num_each_ant = dm_value[1];
  3568. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Set Beam number = (( %d ))\n",
  3569. pdm_sat_table->beam_patten_num_each_ant));
  3570. } else {
  3571. PHYDM_SNPRINTF((output + used, out_len - used, "[ SmartAnt ] Show Beam number = (( %d ))\n",
  3572. pdm_sat_table->beam_patten_num_each_ant));
  3573. }
  3574. }
  3575. }
  3576. void
  3577. phydm_set_all_ant_same_beam_num(
  3578. void *p_dm_void
  3579. )
  3580. {
  3581. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3582. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3583. if (p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE1) { /*2ant for 8821A*/
  3584. pdm_sat_table->rx_idle_beam[0] = pdm_sat_table->fast_training_beam_num;
  3585. pdm_sat_table->rx_idle_beam[1] = pdm_sat_table->fast_training_beam_num;
  3586. }
  3587. pdm_sat_table->update_beam_codeword = phydm_construct_hl_beam_codeword(p_dm_odm, &(pdm_sat_table->rx_idle_beam[0]), pdm_sat_table->ant_num);
  3588. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Set all ant beam_pattern: codeword = (( 0x%x ))\n", pdm_sat_table->update_beam_codeword));
  3589. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  3590. phydm_update_beam_pattern(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  3591. #else
  3592. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_workitem);
  3593. /*odm_stall_execution(1);*/
  3594. #endif
  3595. }
  3596. void
  3597. odm_fast_ant_training_hl_smart_antenna_type1(
  3598. void *p_dm_void
  3599. )
  3600. {
  3601. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3602. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3603. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &(p_dm_odm->dm_fat_table);
  3604. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  3605. u32 codeword = 0, i, j;
  3606. u32 target_ant;
  3607. u32 avg_rssi_tmp, avg_rssi_tmp_ma;
  3608. u32 target_ant_beam_max_rssi[SUPPORT_RF_PATH_NUM] = {0};
  3609. u32 max_beam_ant_rssi = 0;
  3610. u32 target_ant_beam[SUPPORT_RF_PATH_NUM] = {0};
  3611. u32 beam_tmp;
  3612. u8 next_ant;
  3613. u32 rssi_sorting_seq[SUPPORT_BEAM_PATTERN_NUM] = {0};
  3614. u32 rank_idx_seq[SUPPORT_BEAM_PATTERN_NUM] = {0};
  3615. u32 rank_idx_out[SUPPORT_BEAM_PATTERN_NUM] = {0};
  3616. u8 per_beam_rssi_diff_tmp = 0, training_pkt_num_offset;
  3617. u32 break_counter = 0;
  3618. u32 used_ant;
  3619. if (!p_dm_odm->is_linked) {
  3620. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
  3621. if (p_dm_fat_table->is_become_linked == true) {
  3622. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Link->no Link\n"));
  3623. p_dm_fat_table->fat_state = FAT_BEFORE_LINK_STATE;
  3624. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  3625. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  3626. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("change to (( %d )) FAT_state\n", p_dm_fat_table->fat_state));
  3627. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  3628. }
  3629. return;
  3630. } else {
  3631. if (p_dm_fat_table->is_become_linked == false) {
  3632. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));
  3633. p_dm_fat_table->fat_state = FAT_PREPARE_STATE;
  3634. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("change to (( %d )) FAT_state\n", p_dm_fat_table->fat_state));
  3635. /*pdm_sat_table->fast_training_beam_num = 0;*/
  3636. /*phydm_set_all_ant_same_beam_num(p_dm_odm);*/
  3637. p_dm_fat_table->is_become_linked = p_dm_odm->is_linked;
  3638. }
  3639. }
  3640. if (*(p_dm_fat_table->p_force_tx_ant_by_desc) == false) {
  3641. if (p_dm_odm->is_one_entry_only == true)
  3642. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  3643. else
  3644. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_DESC);
  3645. }
  3646. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("HL Smart ant Training: state (( %d ))\n", p_dm_fat_table->fat_state));*/
  3647. /* [DECISION STATE] */
  3648. /*=======================================================================================*/
  3649. if (p_dm_fat_table->fat_state == FAT_DECISION_STATE) {
  3650. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 3. In Decision state]\n"));
  3651. phydm_fast_training_enable(p_dm_odm, FAT_OFF);
  3652. break_counter = 0;
  3653. /*compute target beam in each antenna*/
  3654. for (i = (pdm_sat_table->first_train_ant - 1); i < pdm_sat_table->ant_num_total; i++) {
  3655. for (j = 0; j < (pdm_sat_table->beam_patten_num_each_ant); j++) {
  3656. if (pdm_sat_table->pkt_rssi_cnt[i][j] == 0) {
  3657. avg_rssi_tmp = pdm_sat_table->pkt_rssi_pre[i][j];
  3658. avg_rssi_tmp = (avg_rssi_tmp >= 2) ? (avg_rssi_tmp - 2) : avg_rssi_tmp;
  3659. avg_rssi_tmp_ma = avg_rssi_tmp;
  3660. } else {
  3661. avg_rssi_tmp = (pdm_sat_table->pkt_rssi_sum[i][j]) / (pdm_sat_table->pkt_rssi_cnt[i][j]);
  3662. avg_rssi_tmp_ma = (avg_rssi_tmp + pdm_sat_table->pkt_rssi_pre[i][j]) >> 1;
  3663. }
  3664. rssi_sorting_seq[j] = avg_rssi_tmp;
  3665. pdm_sat_table->pkt_rssi_pre[i][j] = avg_rssi_tmp;
  3666. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ant[%d], Beam[%d]: pkt_cnt=(( %d )), avg_rssi_MA=(( %d )), avg_rssi=(( %d ))\n",
  3667. i, j, pdm_sat_table->pkt_rssi_cnt[i][j], avg_rssi_tmp_ma, avg_rssi_tmp));
  3668. if (avg_rssi_tmp > target_ant_beam_max_rssi[i]) {
  3669. target_ant_beam[i] = j;
  3670. target_ant_beam_max_rssi[i] = avg_rssi_tmp;
  3671. }
  3672. /*reset counter value*/
  3673. pdm_sat_table->pkt_rssi_sum[i][j] = 0;
  3674. pdm_sat_table->pkt_rssi_cnt[i][j] = 0;
  3675. }
  3676. pdm_sat_table->rx_idle_beam[i] = target_ant_beam[i];
  3677. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("---------> Target of ant[%d]: Beam_num-(( %d )) RSSI= ((%d))\n",
  3678. i, target_ant_beam[i], target_ant_beam_max_rssi[i]));
  3679. /*sorting*/
  3680. /*
  3681. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Pre]rssi_sorting_seq = [%d, %d, %d, %d]\n", rssi_sorting_seq[0], rssi_sorting_seq[1], rssi_sorting_seq[2], rssi_sorting_seq[3]));
  3682. */
  3683. /*phydm_seq_sorting(p_dm_odm, &rssi_sorting_seq[0], &rank_idx_seq[0], &rank_idx_out[0], SUPPORT_BEAM_PATTERN_NUM);*/
  3684. /*
  3685. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Post]rssi_sorting_seq = [%d, %d, %d, %d]\n", rssi_sorting_seq[0], rssi_sorting_seq[1], rssi_sorting_seq[2], rssi_sorting_seq[3]));
  3686. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Post]rank_idx_seq = [%d, %d, %d, %d]\n", rank_idx_seq[0], rank_idx_seq[1], rank_idx_seq[2], rank_idx_seq[3]));
  3687. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Post]rank_idx_out = [%d, %d, %d, %d]\n", rank_idx_out[0], rank_idx_out[1], rank_idx_out[2], rank_idx_out[3]));
  3688. */
  3689. if (target_ant_beam_max_rssi[i] > max_beam_ant_rssi) {
  3690. target_ant = i;
  3691. max_beam_ant_rssi = target_ant_beam_max_rssi[i];
  3692. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Target of ant = (( %d )) max_beam_ant_rssi = (( %d ))\n",
  3693. target_ant, max_beam_ant_rssi));*/
  3694. }
  3695. break_counter++;
  3696. if (break_counter >= (pdm_sat_table->ant_num))
  3697. break;
  3698. }
  3699. #ifdef CONFIG_FAT_PATCH
  3700. break_counter = 0;
  3701. for (i = (pdm_sat_table->first_train_ant - 1); i < pdm_sat_table->ant_num_total; i++) {
  3702. for (j = 0; j < (pdm_sat_table->beam_patten_num_each_ant); j++) {
  3703. per_beam_rssi_diff_tmp = (u8)(max_beam_ant_rssi - pdm_sat_table->pkt_rssi_pre[i][j]);
  3704. pdm_sat_table->beam_train_rssi_diff[i][j] = per_beam_rssi_diff_tmp;
  3705. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ant[%d], Beam[%d]: RSSI_diff= ((%d))\n",
  3706. i, j, per_beam_rssi_diff_tmp));
  3707. }
  3708. break_counter++;
  3709. if (break_counter >= (pdm_sat_table->ant_num))
  3710. break;
  3711. }
  3712. #endif
  3713. if (target_ant == 0)
  3714. target_ant = MAIN_ANT;
  3715. else if (target_ant == 1)
  3716. target_ant = AUX_ANT;
  3717. if (pdm_sat_table->ant_num > 1) {
  3718. /* [ update RX ant ]*/
  3719. odm_update_rx_idle_ant(p_dm_odm, (u8)target_ant);
  3720. /* [ update TX ant ]*/
  3721. odm_update_tx_ant(p_dm_odm, (u8)target_ant, (p_dm_fat_table->train_idx));
  3722. }
  3723. /*set beam in each antenna*/
  3724. phydm_update_rx_idle_beam(p_dm_odm);
  3725. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON);
  3726. p_dm_fat_table->fat_state = FAT_PREPARE_STATE;
  3727. return;
  3728. }
  3729. /* [TRAINING STATE] */
  3730. else if (p_dm_fat_table->fat_state == FAT_TRAINING_STATE) {
  3731. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2. In Training state]\n"));
  3732. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("fat_beam_n = (( %d )), pre_fat_beam_n = (( %d ))\n",
  3733. pdm_sat_table->fast_training_beam_num, pdm_sat_table->pre_fast_training_beam_num));
  3734. if (pdm_sat_table->fast_training_beam_num > pdm_sat_table->pre_fast_training_beam_num)
  3735. pdm_sat_table->force_update_beam_en = 0;
  3736. else {
  3737. pdm_sat_table->force_update_beam_en = 1;
  3738. pdm_sat_table->pkt_counter = 0;
  3739. beam_tmp = pdm_sat_table->fast_training_beam_num;
  3740. if (pdm_sat_table->fast_training_beam_num >= (pdm_sat_table->beam_patten_num_each_ant - 1)) {
  3741. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Timeout Update] Beam_num (( %d )) -> (( decision ))\n", pdm_sat_table->fast_training_beam_num));
  3742. p_dm_fat_table->fat_state = FAT_DECISION_STATE;
  3743. odm_fast_ant_training_hl_smart_antenna_type1(p_dm_odm);
  3744. } else {
  3745. pdm_sat_table->fast_training_beam_num++;
  3746. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Timeout Update] Beam_num (( %d )) -> (( %d ))\n", beam_tmp, pdm_sat_table->fast_training_beam_num));
  3747. phydm_set_all_ant_same_beam_num(p_dm_odm);
  3748. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  3749. }
  3750. }
  3751. pdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;
  3752. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[prepare state] Update Pre_Beam =(( %d ))\n", pdm_sat_table->pre_fast_training_beam_num));
  3753. }
  3754. /* [Prepare state] */
  3755. /*=======================================================================================*/
  3756. else if (p_dm_fat_table->fat_state == FAT_PREPARE_STATE) {
  3757. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n\n[ 1. In Prepare state]\n"));
  3758. if (p_dm_odm->pre_traffic_load == (p_dm_odm->traffic_load)) {
  3759. if (pdm_sat_table->decision_holding_period != 0) {
  3760. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Holding_period = (( %d )), return!!!\n", pdm_sat_table->decision_holding_period));
  3761. pdm_sat_table->decision_holding_period--;
  3762. return;
  3763. }
  3764. }
  3765. /* Set training packet number*/
  3766. if (pdm_sat_table->fix_training_num_en == 0) {
  3767. switch (p_dm_odm->traffic_load) {
  3768. case TRAFFIC_HIGH:
  3769. pdm_sat_table->per_beam_training_pkt_num = 8;
  3770. pdm_sat_table->decision_holding_period = 2;
  3771. break;
  3772. case TRAFFIC_MID:
  3773. pdm_sat_table->per_beam_training_pkt_num = 6;
  3774. pdm_sat_table->decision_holding_period = 3;
  3775. break;
  3776. case TRAFFIC_LOW:
  3777. pdm_sat_table->per_beam_training_pkt_num = 3; /*ping 60000*/
  3778. pdm_sat_table->decision_holding_period = 4;
  3779. break;
  3780. case TRAFFIC_ULTRA_LOW:
  3781. pdm_sat_table->per_beam_training_pkt_num = 1;
  3782. pdm_sat_table->decision_holding_period = 6;
  3783. break;
  3784. default:
  3785. break;
  3786. }
  3787. }
  3788. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Fix_training_en = (( %d )), training_pkt_num_base = (( %d )), holding_period = ((%d))\n",
  3789. pdm_sat_table->fix_training_num_en, pdm_sat_table->per_beam_training_pkt_num, pdm_sat_table->decision_holding_period));
  3790. #ifdef CONFIG_FAT_PATCH
  3791. break_counter = 0;
  3792. for (i = (pdm_sat_table->first_train_ant - 1); i < pdm_sat_table->ant_num_total; i++) {
  3793. for (j = 0; j < (pdm_sat_table->beam_patten_num_each_ant); j++) {
  3794. per_beam_rssi_diff_tmp = pdm_sat_table->beam_train_rssi_diff[i][j];
  3795. training_pkt_num_offset = per_beam_rssi_diff_tmp;
  3796. if ((pdm_sat_table->per_beam_training_pkt_num) > training_pkt_num_offset)
  3797. pdm_sat_table->beam_train_cnt[i][j] = pdm_sat_table->per_beam_training_pkt_num - training_pkt_num_offset;
  3798. else
  3799. pdm_sat_table->beam_train_cnt[i][j] = 1;
  3800. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ant[%d]: Beam_num-(( %d )) training_pkt_num = ((%d))\n",
  3801. i, j, pdm_sat_table->beam_train_cnt[i][j]));
  3802. }
  3803. break_counter++;
  3804. if (break_counter >= (pdm_sat_table->ant_num))
  3805. break;
  3806. }
  3807. phydm_fast_training_enable(p_dm_odm, FAT_OFF);
  3808. pdm_sat_table->pre_beacon_counter = pdm_sat_table->beacon_counter;
  3809. pdm_sat_table->update_beam_idx = 0;
  3810. if (*p_dm_odm->p_band_type == ODM_BAND_5G) {
  3811. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set 5G ant\n"));
  3812. /*used_ant = (pdm_sat_table->first_train_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;*/
  3813. used_ant = pdm_sat_table->first_train_ant;
  3814. } else {
  3815. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set 2.4G ant\n"));
  3816. used_ant = pdm_sat_table->first_train_ant;
  3817. }
  3818. odm_update_rx_idle_ant(p_dm_odm, (u8)used_ant);
  3819. #else
  3820. /* Set training MAC addr. of target */
  3821. odm_set_next_mac_addr_target(p_dm_odm);
  3822. phydm_fast_training_enable(p_dm_odm, FAT_ON);
  3823. #endif
  3824. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  3825. pdm_sat_table->pkt_counter = 0;
  3826. pdm_sat_table->fast_training_beam_num = 0;
  3827. phydm_set_all_ant_same_beam_num(p_dm_odm);
  3828. pdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;
  3829. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  3830. }
  3831. }
  3832. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  3833. void
  3834. phydm_beam_switch_workitem_callback(
  3835. void *p_context
  3836. )
  3837. {
  3838. struct _ADAPTER *p_adapter = (struct _ADAPTER *)p_context;
  3839. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  3840. struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
  3841. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  3842. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  3843. pdm_sat_table->pkt_skip_statistic_en = 1;
  3844. #endif
  3845. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Beam Switch Workitem Callback, pkt_skip_statistic_en = (( %d ))\n", pdm_sat_table->pkt_skip_statistic_en));
  3846. phydm_update_beam_pattern(p_dm_odm, pdm_sat_table->update_beam_codeword, pdm_sat_table->rfu_codeword_total_bit_num);
  3847. #if DEV_BUS_TYPE != RT_PCI_INTERFACE
  3848. /*odm_stall_execution(pdm_sat_table->latch_time);*/
  3849. pdm_sat_table->pkt_skip_statistic_en = 0;
  3850. #endif
  3851. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pkt_skip_statistic_en = (( %d )), latch_time = (( %d ))\n", pdm_sat_table->pkt_skip_statistic_en, pdm_sat_table->latch_time));
  3852. }
  3853. void
  3854. phydm_beam_decision_workitem_callback(
  3855. void *p_context
  3856. )
  3857. {
  3858. struct _ADAPTER *p_adapter = (struct _ADAPTER *)p_context;
  3859. HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
  3860. struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
  3861. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] Beam decision Workitem Callback\n"));
  3862. odm_fast_ant_training_hl_smart_antenna_type1(p_dm_odm);
  3863. }
  3864. #endif
  3865. #endif /*#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1*/
  3866. void
  3867. odm_ant_div_init(
  3868. void *p_dm_void
  3869. )
  3870. {
  3871. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  3872. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  3873. struct _sw_antenna_switch_ *p_dm_swat_table = &p_dm_odm->dm_swat_table;
  3874. if (!(p_dm_odm->support_ability & ODM_BB_ANT_DIV)) {
  3875. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] Not Support Antenna Diversity Function\n"));
  3876. return;
  3877. }
  3878. /* --- */
  3879. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  3880. if (p_dm_fat_table->ant_div_2g_5g == ODM_ANTDIV_2G) {
  3881. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[2G AntDiv Init]: Only Support 2G Antenna Diversity Function\n"));
  3882. if (!(p_dm_odm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC))
  3883. return;
  3884. } else if (p_dm_fat_table->ant_div_2g_5g == ODM_ANTDIV_5G) {
  3885. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[5G AntDiv Init]: Only Support 5G Antenna Diversity Function\n"));
  3886. if (!(p_dm_odm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC))
  3887. return;
  3888. } else if (p_dm_fat_table->ant_div_2g_5g == (ODM_ANTDIV_2G | ODM_ANTDIV_5G))
  3889. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\n"));
  3890. #endif
  3891. /* --- */
  3892. /* 2 [--General---] */
  3893. p_dm_odm->antdiv_period = 0;
  3894. p_dm_fat_table->is_become_linked = false;
  3895. p_dm_fat_table->ant_div_on_off = 0xff;
  3896. /* 3 - AP - */
  3897. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  3898. #if (BEAMFORMING_SUPPORT == 1)
  3899. #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
  3900. odm_bdc_init(p_dm_odm);
  3901. #endif
  3902. #endif
  3903. /* 3 - WIN - */
  3904. #elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  3905. p_dm_swat_table->ant_5g = MAIN_ANT;
  3906. p_dm_swat_table->ant_2g = MAIN_ANT;
  3907. #endif
  3908. /* 2 [---Set MAIN_ANT as default antenna if Auto-ant enable---] */
  3909. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  3910. p_dm_odm->ant_type = ODM_AUTO_ANT;
  3911. p_dm_fat_table->rx_idle_ant = 0xff; /*to make RX-idle-antenna will be updated absolutly*/
  3912. odm_update_rx_idle_ant(p_dm_odm, MAIN_ANT);
  3913. phydm_keep_rx_ack_ant_by_tx_ant_time(p_dm_odm, 0); /* Timming issue: keep Rx ant after tx for ACK ( 5 x 3.2 mu = 16mu sec)*/
  3914. /* 2 [---Set TX Antenna---] */
  3915. if (p_dm_fat_table->p_force_tx_ant_by_desc == NULL) {
  3916. p_dm_fat_table->force_tx_ant_by_desc = 0;
  3917. p_dm_fat_table->p_force_tx_ant_by_desc = &(p_dm_fat_table->force_tx_ant_by_desc);
  3918. }
  3919. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("p_force_tx_ant_by_desc = %d\n", *p_dm_fat_table->p_force_tx_ant_by_desc));
  3920. if (*(p_dm_fat_table->p_force_tx_ant_by_desc) == true)
  3921. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_DESC);
  3922. else
  3923. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  3924. /* 2 [--88E---] */
  3925. if (p_dm_odm->support_ic_type == ODM_RTL8188E) {
  3926. #if (RTL8188E_SUPPORT == 1)
  3927. /* p_dm_odm->ant_div_type = CGCS_RX_HW_ANTDIV; */
  3928. /* p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV; */
  3929. /* p_dm_odm->ant_div_type = CG_TRX_SMART_ANTDIV; */
  3930. if ((p_dm_odm->ant_div_type != CGCS_RX_HW_ANTDIV) && (p_dm_odm->ant_div_type != CG_TRX_HW_ANTDIV) && (p_dm_odm->ant_div_type != CG_TRX_SMART_ANTDIV)) {
  3931. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 88E Not Supprrt This AntDiv type\n"));
  3932. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  3933. return;
  3934. }
  3935. if (p_dm_odm->ant_div_type == CGCS_RX_HW_ANTDIV)
  3936. odm_rx_hw_ant_div_init_88e(p_dm_odm);
  3937. else if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV)
  3938. odm_trx_hw_ant_div_init_88e(p_dm_odm);
  3939. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  3940. else if (p_dm_odm->ant_div_type == CG_TRX_SMART_ANTDIV)
  3941. odm_smart_hw_ant_div_init_88e(p_dm_odm);
  3942. #endif
  3943. #endif
  3944. }
  3945. /* 2 [--92E---] */
  3946. #if (RTL8192E_SUPPORT == 1)
  3947. else if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  3948. /* p_dm_odm->ant_div_type = CGCS_RX_HW_ANTDIV; */
  3949. /* p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV; */
  3950. /* p_dm_odm->ant_div_type = CG_TRX_SMART_ANTDIV; */
  3951. if ((p_dm_odm->ant_div_type != CGCS_RX_HW_ANTDIV) && (p_dm_odm->ant_div_type != CG_TRX_HW_ANTDIV) && (p_dm_odm->ant_div_type != CG_TRX_SMART_ANTDIV)) {
  3952. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 8192E Not Supprrt This AntDiv type\n"));
  3953. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  3954. return;
  3955. }
  3956. if (p_dm_odm->ant_div_type == CGCS_RX_HW_ANTDIV)
  3957. odm_rx_hw_ant_div_init_92e(p_dm_odm);
  3958. else if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV)
  3959. odm_trx_hw_ant_div_init_92e(p_dm_odm);
  3960. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  3961. else if (p_dm_odm->ant_div_type == CG_TRX_SMART_ANTDIV)
  3962. odm_smart_hw_ant_div_init_92e(p_dm_odm);
  3963. #endif
  3964. }
  3965. #endif
  3966. /* 2 [--8723B---] */
  3967. #if (RTL8723B_SUPPORT == 1)
  3968. else if (p_dm_odm->support_ic_type == ODM_RTL8723B) {
  3969. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  3970. /* p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV; */
  3971. if (p_dm_odm->ant_div_type != S0S1_SW_ANTDIV && p_dm_odm->ant_div_type != CG_TRX_HW_ANTDIV) {
  3972. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 8723B Not Supprrt This AntDiv type\n"));
  3973. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  3974. return;
  3975. }
  3976. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV)
  3977. odm_s0s1_sw_ant_div_init_8723b(p_dm_odm);
  3978. else if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV)
  3979. odm_trx_hw_ant_div_init_8723b(p_dm_odm);
  3980. }
  3981. #endif
  3982. /*2 [--8723D---]*/
  3983. #if (RTL8723D_SUPPORT == 1)
  3984. else if (p_dm_odm->support_ic_type == ODM_RTL8723D) {
  3985. if (p_dm_fat_table->p_default_s0_s1 == NULL) {
  3986. p_dm_fat_table->default_s0_s1 = 1;
  3987. p_dm_fat_table->p_default_s0_s1 = &(p_dm_fat_table->default_s0_s1);
  3988. }
  3989. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("default_s0_s1 = %d\n", *p_dm_fat_table->p_default_s0_s1));
  3990. if (*(p_dm_fat_table->p_default_s0_s1) == true)
  3991. odm_update_rx_idle_ant(p_dm_odm, MAIN_ANT);
  3992. else
  3993. odm_update_rx_idle_ant(p_dm_odm, AUX_ANT);
  3994. if (p_dm_odm->ant_div_type == S0S1_TRX_HW_ANTDIV)
  3995. odm_trx_hw_ant_div_init_8723d(p_dm_odm);
  3996. else {
  3997. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 8723D Not Supprrt This AntDiv type\n"));
  3998. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  3999. return;
  4000. }
  4001. }
  4002. #endif
  4003. /* 2 [--8811A 8821A---] */
  4004. #if (RTL8821A_SUPPORT == 1)
  4005. else if (p_dm_odm->support_ic_type == ODM_RTL8821) {
  4006. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
  4007. p_dm_odm->ant_div_type = HL_SW_SMART_ANT_TYPE1;
  4008. if (p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {
  4009. odm_trx_hw_ant_div_init_8821a(p_dm_odm);
  4010. phydm_hl_smart_ant_type1_init_8821a(p_dm_odm);
  4011. } else
  4012. #endif
  4013. {
  4014. /*p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV;*/
  4015. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4016. if (p_dm_odm->ant_div_type != CG_TRX_HW_ANTDIV && p_dm_odm->ant_div_type != S0S1_SW_ANTDIV) {
  4017. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 8821A & 8811A Not Supprrt This AntDiv type\n"));
  4018. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4019. return;
  4020. }
  4021. if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV)
  4022. odm_trx_hw_ant_div_init_8821a(p_dm_odm);
  4023. else if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV)
  4024. odm_s0s1_sw_ant_div_init_8821a(p_dm_odm);
  4025. }
  4026. }
  4027. #endif
  4028. /* 2 [--8821C---] */
  4029. #if (RTL8821C_SUPPORT == 1)
  4030. else if (p_dm_odm->support_ic_type == ODM_RTL8821C) {
  4031. p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV;
  4032. if (p_dm_odm->ant_div_type != CG_TRX_HW_ANTDIV) {
  4033. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 8821C Not Supprrt This AntDiv type\n"));
  4034. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4035. return;
  4036. }
  4037. odm_trx_hw_ant_div_init_8821c(p_dm_odm);
  4038. }
  4039. #endif
  4040. /* 2 [--8881A---] */
  4041. #if (RTL8881A_SUPPORT == 1)
  4042. else if (p_dm_odm->support_ic_type == ODM_RTL8881A) {
  4043. /* p_dm_odm->ant_div_type = CGCS_RX_HW_ANTDIV; */
  4044. /* p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV; */
  4045. if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV) {
  4046. odm_trx_hw_ant_div_init_8881a(p_dm_odm);
  4047. /**/
  4048. } else {
  4049. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 8881A Not Supprrt This AntDiv type\n"));
  4050. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4051. return;
  4052. }
  4053. odm_trx_hw_ant_div_init_8881a(p_dm_odm);
  4054. }
  4055. #endif
  4056. /* 2 [--8812---] */
  4057. #if (RTL8812A_SUPPORT == 1)
  4058. else if (p_dm_odm->support_ic_type == ODM_RTL8812) {
  4059. /* p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV; */
  4060. if (p_dm_odm->ant_div_type != CG_TRX_HW_ANTDIV) {
  4061. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] 8812A Not Supprrt This AntDiv type\n"));
  4062. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4063. return;
  4064. }
  4065. odm_trx_hw_ant_div_init_8812a(p_dm_odm);
  4066. }
  4067. #endif
  4068. /*[--8188F---]*/
  4069. #if (RTL8188F_SUPPORT == 1)
  4070. else if (p_dm_odm->support_ic_type == ODM_RTL8188F) {
  4071. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4072. odm_s0s1_sw_ant_div_init_8188f(p_dm_odm);
  4073. }
  4074. #endif
  4075. /*[--8822B---]*/
  4076. #if (RTL8822B_SUPPORT == 1)
  4077. else if (p_dm_odm->support_ic_type == ODM_RTL8822B) {
  4078. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  4079. p_dm_odm->ant_div_type = HL_SW_SMART_ANT_TYPE2;
  4080. if (p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE2)
  4081. phydm_hl_smart_ant_type2_init_8822b(p_dm_odm);
  4082. #endif
  4083. }
  4084. #endif
  4085. /*
  4086. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** support_ic_type=[%lu]\n",p_dm_odm->support_ic_type));
  4087. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** AntDiv support_ability=[%lu]\n",(p_dm_odm->support_ability & ODM_BB_ANT_DIV)>>6));
  4088. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** AntDiv type=[%d]\n",p_dm_odm->ant_div_type));
  4089. */
  4090. }
  4091. void
  4092. odm_ant_div(
  4093. void *p_dm_void
  4094. )
  4095. {
  4096. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4097. struct _ADAPTER *p_adapter = p_dm_odm->adapter;
  4098. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  4099. #if (defined(CONFIG_HL_SMART_ANTENNA_TYPE1)) || (defined(CONFIG_HL_SMART_ANTENNA_TYPE2))
  4100. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  4101. #endif
  4102. if (*p_dm_odm->p_band_type == ODM_BAND_5G) {
  4103. if (p_dm_fat_table->idx_ant_div_counter_5g < p_dm_odm->antdiv_period) {
  4104. p_dm_fat_table->idx_ant_div_counter_5g++;
  4105. return;
  4106. } else
  4107. p_dm_fat_table->idx_ant_div_counter_5g = 0;
  4108. } else if (*p_dm_odm->p_band_type == ODM_BAND_2_4G) {
  4109. if (p_dm_fat_table->idx_ant_div_counter_2g < p_dm_odm->antdiv_period) {
  4110. p_dm_fat_table->idx_ant_div_counter_2g++;
  4111. return;
  4112. } else
  4113. p_dm_fat_table->idx_ant_div_counter_2g = 0;
  4114. }
  4115. /* ---------- */
  4116. if (!(p_dm_odm->support_ability & ODM_BB_ANT_DIV)) {
  4117. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Return!!!] Not Support Antenna Diversity Function\n"));
  4118. return;
  4119. }
  4120. /* ---------- */
  4121. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  4122. if (p_dm_fat_table->enable_ctrl_frame_antdiv) {
  4123. if ((p_dm_odm->data_frame_num <= 10) && (p_dm_odm->is_linked))
  4124. p_dm_fat_table->use_ctrl_frame_antdiv = 1;
  4125. else
  4126. p_dm_fat_table->use_ctrl_frame_antdiv = 0;
  4127. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("use_ctrl_frame_antdiv = (( %d )), data_frame_num = (( %d ))\n", p_dm_fat_table->use_ctrl_frame_antdiv, p_dm_odm->data_frame_num));
  4128. p_dm_odm->data_frame_num = 0;
  4129. }
  4130. if (p_adapter->MgntInfo.AntennaTest)
  4131. return;
  4132. {
  4133. #if (BEAMFORMING_SUPPORT == 1)
  4134. enum beamforming_cap beamform_cap = (p_dm_odm->beamforming_info.beamform_cap);
  4135. if (beamform_cap & BEAMFORMEE_CAP) { /* BFmee On && Div On->Div Off */
  4136. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ AntDiv : OFF ] BFmee ==1\n"));
  4137. if (p_dm_fat_table->fix_ant_bfee == 0) {
  4138. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  4139. p_dm_fat_table->fix_ant_bfee = 1;
  4140. }
  4141. return;
  4142. } else { /* BFmee Off && Div Off->Div On */
  4143. if ((p_dm_fat_table->fix_ant_bfee == 1) && p_dm_odm->is_linked) {
  4144. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ AntDiv : ON ] BFmee ==0\n"));
  4145. if ((p_dm_odm->ant_div_type != S0S1_SW_ANTDIV))
  4146. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON);
  4147. p_dm_fat_table->fix_ant_bfee = 0;
  4148. }
  4149. }
  4150. #endif
  4151. }
  4152. #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
  4153. /* ----------just for fool proof */
  4154. if (p_dm_odm->antdiv_rssi)
  4155. p_dm_odm->debug_components |= ODM_COMP_ANT_DIV;
  4156. else
  4157. p_dm_odm->debug_components &= ~ODM_COMP_ANT_DIV;
  4158. if (p_dm_fat_table->ant_div_2g_5g == ODM_ANTDIV_2G) {
  4159. /* ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G AntDiv Running ]\n")); */
  4160. if (!(p_dm_odm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC))
  4161. return;
  4162. } else if (p_dm_fat_table->ant_div_2g_5g == ODM_ANTDIV_5G) {
  4163. /* ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 5G AntDiv Running ]\n")); */
  4164. if (!(p_dm_odm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC))
  4165. return;
  4166. }
  4167. /* else if(p_dm_fat_table->ant_div_2g_5g == (ODM_ANTDIV_2G|ODM_ANTDIV_5G)) */
  4168. /* { */
  4169. /* ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G & 5G AntDiv Running ]\n")); */
  4170. /* } */
  4171. #endif
  4172. /* ---------- */
  4173. if (p_dm_odm->antdiv_select == 1)
  4174. p_dm_odm->ant_type = ODM_FIX_MAIN_ANT;
  4175. else if (p_dm_odm->antdiv_select == 2)
  4176. p_dm_odm->ant_type = ODM_FIX_AUX_ANT;
  4177. else /* if (p_dm_odm->antdiv_select==0) */
  4178. p_dm_odm->ant_type = ODM_AUTO_ANT;
  4179. /* ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("ant_type= (( %d )) , pre_ant_type= (( %d ))\n",p_dm_odm->ant_type,p_dm_odm->pre_ant_type)); */
  4180. if (p_dm_odm->ant_type != ODM_AUTO_ANT) {
  4181. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Fix Antenna at (( %s ))\n", (p_dm_odm->ant_type == ODM_FIX_MAIN_ANT) ? "MAIN" : "AUX"));
  4182. if (p_dm_odm->ant_type != p_dm_odm->pre_ant_type) {
  4183. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  4184. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_REG);
  4185. if (p_dm_odm->ant_type == ODM_FIX_MAIN_ANT)
  4186. odm_update_rx_idle_ant(p_dm_odm, MAIN_ANT);
  4187. else if (p_dm_odm->ant_type == ODM_FIX_AUX_ANT)
  4188. odm_update_rx_idle_ant(p_dm_odm, AUX_ANT);
  4189. }
  4190. p_dm_odm->pre_ant_type = p_dm_odm->ant_type;
  4191. return;
  4192. } else {
  4193. if (p_dm_odm->ant_type != p_dm_odm->pre_ant_type) {
  4194. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON);
  4195. odm_tx_by_tx_desc_or_reg(p_dm_odm, TX_BY_DESC);
  4196. }
  4197. p_dm_odm->pre_ant_type = p_dm_odm->ant_type;
  4198. }
  4199. /* 3 ----------------------------------------------------------------------------------------------------------- */
  4200. /* 2 [--88E---] */
  4201. if (p_dm_odm->support_ic_type == ODM_RTL8188E) {
  4202. #if (RTL8188E_SUPPORT == 1)
  4203. if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV || p_dm_odm->ant_div_type == CGCS_RX_HW_ANTDIV)
  4204. odm_hw_ant_div(p_dm_odm);
  4205. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  4206. else if (p_dm_odm->ant_div_type == CG_TRX_SMART_ANTDIV)
  4207. odm_fast_ant_training(p_dm_odm);
  4208. #endif
  4209. #endif
  4210. }
  4211. /* 2 [--92E---] */
  4212. #if (RTL8192E_SUPPORT == 1)
  4213. else if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  4214. if (p_dm_odm->ant_div_type == CGCS_RX_HW_ANTDIV || p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV)
  4215. odm_hw_ant_div(p_dm_odm);
  4216. #if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  4217. else if (p_dm_odm->ant_div_type == CG_TRX_SMART_ANTDIV)
  4218. odm_fast_ant_training(p_dm_odm);
  4219. #endif
  4220. }
  4221. #endif
  4222. #if (RTL8723B_SUPPORT == 1)
  4223. /* 2 [--8723B---] */
  4224. else if (p_dm_odm->support_ic_type == ODM_RTL8723B) {
  4225. if (phydm_is_bt_enable_8723b(p_dm_odm)) {
  4226. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[BT is enable!!!]\n"));
  4227. if (p_dm_fat_table->is_become_linked == true) {
  4228. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[9:6]=0x0\n"));
  4229. if (p_dm_odm->support_ic_type == ODM_RTL8723B)
  4230. odm_set_bb_reg(p_dm_odm, 0x948, BIT(9) | BIT(8) | BIT(7) | BIT(6), 0x0);
  4231. p_dm_fat_table->is_become_linked = false;
  4232. }
  4233. } else {
  4234. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV) {
  4235. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  4236. odm_s0s1_sw_ant_div(p_dm_odm, SWAW_STEP_PEEK);
  4237. #endif
  4238. } else if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV)
  4239. odm_hw_ant_div(p_dm_odm);
  4240. }
  4241. }
  4242. #endif
  4243. /*8723D*/
  4244. #if (RTL8723D_SUPPORT == 1)
  4245. else if (p_dm_odm->support_ic_type == ODM_RTL8723D) {
  4246. odm_hw_ant_div(p_dm_odm);
  4247. /**/
  4248. }
  4249. #endif
  4250. /* 2 [--8821A---] */
  4251. #if (RTL8821A_SUPPORT == 1)
  4252. else if (p_dm_odm->support_ic_type == ODM_RTL8821) {
  4253. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
  4254. if (p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {
  4255. if (pdm_sat_table->fix_beam_pattern_en != 0) {
  4256. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [ SmartAnt ] Fix SmartAnt Pattern = 0x%x\n", pdm_sat_table->fix_beam_pattern_codeword));
  4257. /*return;*/
  4258. } else {
  4259. /*ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ SmartAnt ] ant_div_type = HL_SW_SMART_ANT_TYPE1\n"));*/
  4260. odm_fast_ant_training_hl_smart_antenna_type1(p_dm_odm);
  4261. }
  4262. } else
  4263. #endif
  4264. {
  4265. if (!p_dm_odm->is_bt_enabled) { /*BT disabled*/
  4266. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV) {
  4267. p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV;
  4268. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [S0S1_SW_ANTDIV] -> [CG_TRX_HW_ANTDIV]\n"));
  4269. /*odm_set_bb_reg(p_dm_odm, 0x8D4, BIT24, 1); */
  4270. if (p_dm_fat_table->is_become_linked == true)
  4271. odm_ant_div_on_off(p_dm_odm, ANTDIV_ON);
  4272. }
  4273. } else { /*BT enabled*/
  4274. if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV) {
  4275. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4276. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [CG_TRX_HW_ANTDIV] -> [S0S1_SW_ANTDIV]\n"));
  4277. /*odm_set_bb_reg(p_dm_odm, 0x8D4, BIT24, 0);*/
  4278. odm_ant_div_on_off(p_dm_odm, ANTDIV_OFF);
  4279. }
  4280. }
  4281. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV) {
  4282. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  4283. odm_s0s1_sw_ant_div(p_dm_odm, SWAW_STEP_PEEK);
  4284. #endif
  4285. } else if (p_dm_odm->ant_div_type == CG_TRX_HW_ANTDIV)
  4286. odm_hw_ant_div(p_dm_odm);
  4287. }
  4288. }
  4289. #endif
  4290. /* 2 [--8821C---] */
  4291. #if (RTL8821C_SUPPORT == 1)
  4292. else if (p_dm_odm->support_ic_type == ODM_RTL8821C)
  4293. odm_hw_ant_div(p_dm_odm);
  4294. #endif
  4295. /* 2 [--8881A---] */
  4296. #if (RTL8881A_SUPPORT == 1)
  4297. else if (p_dm_odm->support_ic_type == ODM_RTL8881A)
  4298. odm_hw_ant_div(p_dm_odm);
  4299. #endif
  4300. /* 2 [--8812A---] */
  4301. #if (RTL8812A_SUPPORT == 1)
  4302. else if (p_dm_odm->support_ic_type == ODM_RTL8812)
  4303. odm_hw_ant_div(p_dm_odm);
  4304. #endif
  4305. #if (RTL8188F_SUPPORT == 1)
  4306. /* [--8188F---]*/
  4307. else if (p_dm_odm->support_ic_type == ODM_RTL8188F) {
  4308. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  4309. odm_s0s1_sw_ant_div(p_dm_odm, SWAW_STEP_PEEK);
  4310. #endif
  4311. }
  4312. #endif
  4313. /* [--8822B---]*/
  4314. #if (RTL8822B_SUPPORT == 1)
  4315. else if (p_dm_odm->support_ic_type == ODM_RTL8822B) {
  4316. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  4317. if (p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE2) {
  4318. if (pdm_sat_table->fix_beam_pattern_en != 0)
  4319. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [ SmartAnt ] Fix SmartAnt Pattern = 0x%x\n", pdm_sat_table->fix_beam_pattern_codeword));
  4320. else
  4321. phydm_fast_ant_training_hl_smart_antenna_type2(p_dm_odm);
  4322. }
  4323. #endif
  4324. }
  4325. #endif
  4326. }
  4327. void
  4328. odm_antsel_statistics(
  4329. void *p_dm_void,
  4330. u8 antsel_tr_mux,
  4331. u32 mac_id,
  4332. u32 utility,
  4333. u8 method,
  4334. u8 is_cck_rate
  4335. )
  4336. {
  4337. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4338. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  4339. if (method == RSSI_METHOD) {
  4340. if (is_cck_rate) {
  4341. if (antsel_tr_mux == ANT1_2G) {
  4342. if (p_dm_fat_table->main_ant_sum_cck[mac_id] > 65435) /*to prevent u16 overflow, max(RSSI)=100, 65435+100 = 65535 (u16)*/
  4343. return;
  4344. p_dm_fat_table->main_ant_sum_cck[mac_id] += (u16)utility;
  4345. p_dm_fat_table->main_ant_cnt_cck[mac_id]++;
  4346. } else {
  4347. if (p_dm_fat_table->aux_ant_sum_cck[mac_id] > 65435)
  4348. return;
  4349. p_dm_fat_table->aux_ant_sum_cck[mac_id] += (u16)utility;
  4350. p_dm_fat_table->aux_ant_cnt_cck[mac_id]++;
  4351. }
  4352. } else { /*ofdm rate*/
  4353. if (antsel_tr_mux == ANT1_2G) {
  4354. if (p_dm_fat_table->main_ant_sum[mac_id] > 65435)
  4355. return;
  4356. p_dm_fat_table->main_ant_sum[mac_id] += (u16)utility;
  4357. p_dm_fat_table->main_ant_cnt[mac_id]++;
  4358. } else {
  4359. if (p_dm_fat_table->aux_ant_sum[mac_id] > 65435)
  4360. return;
  4361. p_dm_fat_table->aux_ant_sum[mac_id] += (u16)utility;
  4362. p_dm_fat_table->aux_ant_cnt[mac_id]++;
  4363. }
  4364. }
  4365. }
  4366. #ifdef ODM_EVM_ENHANCE_ANTDIV
  4367. else if (method == EVM_METHOD) {
  4368. if (antsel_tr_mux == ANT1_2G) {
  4369. p_dm_fat_table->main_ant_evm_sum[mac_id] += (utility << 5);
  4370. p_dm_fat_table->main_ant_evm_cnt[mac_id]++;
  4371. } else {
  4372. p_dm_fat_table->aux_ant_evm_sum[mac_id] += (utility << 5);
  4373. p_dm_fat_table->aux_ant_evm_cnt[mac_id]++;
  4374. }
  4375. } else if (method == CRC32_METHOD) {
  4376. if (utility == 0)
  4377. p_dm_fat_table->crc32_fail_cnt++;
  4378. else
  4379. p_dm_fat_table->crc32_ok_cnt += utility;
  4380. }
  4381. #endif
  4382. }
  4383. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  4384. void
  4385. phydm_process_rssi_for_hb_smtant_type2(
  4386. void *p_dm_void,
  4387. void *p_phy_info_void,
  4388. void *p_pkt_info_void,
  4389. u8 rssi_avg
  4390. )
  4391. {
  4392. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4393. struct _odm_phy_status_info_ *p_phy_info = (struct _odm_phy_status_info_ *)p_phy_info_void;
  4394. struct _odm_per_pkt_info_ *p_pktinfo = (struct _odm_per_pkt_info_ *)p_pkt_info_void;
  4395. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  4396. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  4397. u8 train_pkt_number;
  4398. u32 beam_tmp;
  4399. u8 is_cck_rate;
  4400. u8 rate_ss = 1; /*spatial stream*/
  4401. u8 rx_power_ant0 = p_phy_info->rx_mimo_signal_strength[0];
  4402. u8 rx_power_ant1 = p_phy_info->rx_mimo_signal_strength[1];
  4403. u8 rx_evm_ant0 = p_phy_info->rx_mimo_evm_dbm[0];
  4404. u8 rx_evm_ant1 = p_phy_info->rx_mimo_evm_dbm[1];
  4405. is_cck_rate = (p_pktinfo->data_rate <= ODM_RATE11M) ? TRUE : FALSE;
  4406. if ((p_pktinfo->data_rate >= ODM_RATEMCS8 && p_pktinfo->data_rate <= ODM_RATEMCS15) ||
  4407. (p_pktinfo->data_rate >= ODM_RATEVHTSS2MCS0 && p_pktinfo->data_rate <= ODM_RATEVHTSS2MCS9)) {
  4408. rate_ss = 2;
  4409. }
  4410. /*[Beacon]*/
  4411. if (p_pktinfo->is_packet_beacon) {
  4412. pdm_sat_table->beacon_counter++;
  4413. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MatchBSSID_beacon_counter = ((%d))\n", pdm_sat_table->beacon_counter));
  4414. if (pdm_sat_table->beacon_counter >= pdm_sat_table->pre_beacon_counter + 2) {
  4415. pdm_sat_table->update_beam_idx++;
  4416. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pre_beacon_counter = ((%d)), pkt_counter = ((%d)), update_beam_idx = ((%d))\n",
  4417. pdm_sat_table->pre_beacon_counter, pdm_sat_table->pkt_counter, pdm_sat_table->update_beam_idx));
  4418. pdm_sat_table->pre_beacon_counter = pdm_sat_table->beacon_counter;
  4419. pdm_sat_table->pkt_counter = 0;
  4420. }
  4421. }
  4422. /*[data]*/
  4423. else if (p_pktinfo->is_packet_to_self) {
  4424. if (pdm_sat_table->pkt_skip_statistic_en == 0) {
  4425. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ID[%d] pkt_cnt=((%d)): Beam_set = ((%d)), RSSI{A,B,avg} = {%d, %d, %d}\n",
  4426. p_pktinfo->station_id, pdm_sat_table->pkt_counter, pdm_sat_table->fast_training_beam_num, rx_power_ant0, rx_power_ant1, rssi_avg));
  4427. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RX Rate = ((0x%x)), rate_ss = ((%d)), EVM{A,B} = {%d, %d}\n", p_pktinfo->data_rate, rate_ss, rx_evm_ant0, rx_evm_ant1));
  4428. if (pdm_sat_table->pkt_counter >= 1) /*packet skip count*/
  4429. {
  4430. pdm_sat_table->beam_set_rssi_avg_sum[pdm_sat_table->fast_training_beam_num] += rssi_avg;
  4431. pdm_sat_table->statistic_pkt_cnt[pdm_sat_table->fast_training_beam_num]++;
  4432. pdm_sat_table->beam_path_rssi_sum[pdm_sat_table->fast_training_beam_num][0] += rx_power_ant0;
  4433. pdm_sat_table->beam_path_rssi_sum[pdm_sat_table->fast_training_beam_num][1] += rx_power_ant1;
  4434. if (rate_ss == 2) {
  4435. pdm_sat_table->beam_path_evm_2ss_sum[pdm_sat_table->fast_training_beam_num][0] += rx_evm_ant0;
  4436. pdm_sat_table->beam_path_evm_2ss_sum[pdm_sat_table->fast_training_beam_num][1] += rx_evm_ant1;
  4437. pdm_sat_table->beam_path_evm_2ss_cnt[pdm_sat_table->fast_training_beam_num]++;
  4438. } else {
  4439. pdm_sat_table->beam_path_evm_1ss_sum[pdm_sat_table->fast_training_beam_num] += rx_evm_ant0;
  4440. pdm_sat_table->beam_path_evm_1ss_cnt[pdm_sat_table->fast_training_beam_num]++;
  4441. }
  4442. }
  4443. pdm_sat_table->pkt_counter++;
  4444. train_pkt_number = pdm_sat_table->beam_set_train_cnt[pdm_sat_table->fast_training_beam_num];
  4445. if (pdm_sat_table->pkt_counter >= train_pkt_number) {
  4446. pdm_sat_table->update_beam_idx++;
  4447. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pre_beacon_counter = ((%d)), Update_new_beam = ((%d))\n",
  4448. pdm_sat_table->pre_beacon_counter, pdm_sat_table->update_beam_idx));
  4449. pdm_sat_table->pre_beacon_counter = pdm_sat_table->beacon_counter;
  4450. pdm_sat_table->pkt_counter = 0;
  4451. }
  4452. }
  4453. }
  4454. if (pdm_sat_table->update_beam_idx > 0) {
  4455. pdm_sat_table->update_beam_idx = 0;
  4456. if (pdm_sat_table->fast_training_beam_num >= ((u32)pdm_sat_table->total_beam_set_num - 1)) {
  4457. p_dm_fat_table->fat_state = FAT_DECISION_STATE;
  4458. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  4459. phydm_fast_ant_training_hl_smart_antenna_type2(p_dm_odm); /*go to make decision*/
  4460. #else
  4461. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_decision_workitem);
  4462. #endif
  4463. } else {
  4464. beam_tmp = pdm_sat_table->fast_training_beam_num;
  4465. pdm_sat_table->fast_training_beam_num++;
  4466. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Update Beam_num (( %d )) -> (( %d ))\n", beam_tmp, pdm_sat_table->fast_training_beam_num));
  4467. phydm_set_rfu_beam_pattern_type2(p_dm_odm);
  4468. pdm_sat_table->pre_fast_training_beam_num = pdm_sat_table->fast_training_beam_num;
  4469. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  4470. }
  4471. }
  4472. }
  4473. #endif
  4474. void
  4475. odm_process_rssi_for_ant_div(
  4476. void *p_dm_void,
  4477. void *p_phy_info_void,
  4478. void *p_pkt_info_void
  4479. )
  4480. {
  4481. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4482. struct _odm_phy_status_info_ *p_phy_info = (struct _odm_phy_status_info_ *)p_phy_info_void;
  4483. struct _odm_per_pkt_info_ *p_pktinfo = (struct _odm_per_pkt_info_ *)p_pkt_info_void;
  4484. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  4485. #if (defined(CONFIG_HL_SMART_ANTENNA_TYPE1)) || (defined(CONFIG_HL_SMART_ANTENNA_TYPE2))
  4486. struct _SMART_ANTENNA_TRAINNING_ *pdm_sat_table = &(p_dm_odm->dm_sat_table);
  4487. u32 beam_tmp;
  4488. u8 next_ant;
  4489. u8 train_pkt_number;
  4490. #endif
  4491. u8 is_cck_rate = FALSE;
  4492. u8 rx_power_ant0 = p_phy_info->rx_mimo_signal_strength[0];
  4493. u8 rx_power_ant1 = p_phy_info->rx_mimo_signal_strength[1];
  4494. u8 rx_evm_ant0 = p_phy_info->rx_mimo_signal_quality[0];
  4495. u8 rx_evm_ant1 = p_phy_info->rx_mimo_signal_quality[1];
  4496. u8 rssi_avg;
  4497. is_cck_rate = (p_pktinfo->data_rate <= ODM_RATE11M) ? TRUE : FALSE;
  4498. if ((p_dm_odm->support_ic_type & ODM_IC_2SS) && (!is_cck_rate)) {
  4499. if (rx_power_ant1 < 100)
  4500. rssi_avg = (u8)odm_convert_to_db((odm_convert_to_linear(rx_power_ant0) + odm_convert_to_linear(rx_power_ant1))>>1); /*averaged PWDB*/
  4501. } else {
  4502. rx_power_ant0 = (u8)p_phy_info->rx_pwdb_all;
  4503. rssi_avg = rx_power_ant0;
  4504. }
  4505. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  4506. if ((p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE2) && (p_dm_fat_table->fat_state == FAT_TRAINING_STATE)) {
  4507. /*for 8822B*/
  4508. phydm_process_rssi_for_hb_smtant_type2(p_dm_odm, p_phy_info, p_pktinfo, rssi_avg);
  4509. } else
  4510. #endif
  4511. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1
  4512. #ifdef CONFIG_FAT_PATCH
  4513. if ((p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE1) && (p_dm_fat_table->fat_state == FAT_TRAINING_STATE)) {
  4514. /*[Beacon]*/
  4515. if (p_pktinfo->is_packet_beacon) {
  4516. pdm_sat_table->beacon_counter++;
  4517. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("MatchBSSID_beacon_counter = ((%d))\n", pdm_sat_table->beacon_counter));
  4518. if (pdm_sat_table->beacon_counter >= pdm_sat_table->pre_beacon_counter + 2) {
  4519. if (pdm_sat_table->ant_num > 1) {
  4520. next_ant = (p_dm_fat_table->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
  4521. odm_update_rx_idle_ant(p_dm_odm, next_ant);
  4522. }
  4523. pdm_sat_table->update_beam_idx++;
  4524. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pre_beacon_counter = ((%d)), pkt_counter = ((%d)), update_beam_idx = ((%d))\n",
  4525. pdm_sat_table->pre_beacon_counter, pdm_sat_table->pkt_counter, pdm_sat_table->update_beam_idx));
  4526. pdm_sat_table->pre_beacon_counter = pdm_sat_table->beacon_counter;
  4527. pdm_sat_table->pkt_counter = 0;
  4528. }
  4529. }
  4530. /*[data]*/
  4531. else if (p_pktinfo->is_packet_to_self) {
  4532. if (pdm_sat_table->pkt_skip_statistic_en == 0) {
  4533. /*
  4534. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("StaID[%d]: antsel_pathA = ((%d)), hw_antsw_occur = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",
  4535. p_pktinfo->station_id, p_dm_fat_table->antsel_rx_keep_0, p_dm_fat_table->hw_antsw_occur, pdm_sat_table->fast_training_beam_num, rx_power_ant0));
  4536. */
  4537. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("ID[%d][pkt_cnt = %d]: {ANT, Beam} = {%d, %d}, RSSI = ((%d))\n",
  4538. p_pktinfo->station_id, pdm_sat_table->pkt_counter, p_dm_fat_table->antsel_rx_keep_0, pdm_sat_table->fast_training_beam_num, rx_power_ant0));
  4539. pdm_sat_table->pkt_rssi_sum[p_dm_fat_table->antsel_rx_keep_0][pdm_sat_table->fast_training_beam_num] += rx_power_ant0;
  4540. pdm_sat_table->pkt_rssi_cnt[p_dm_fat_table->antsel_rx_keep_0][pdm_sat_table->fast_training_beam_num]++;
  4541. pdm_sat_table->pkt_counter++;
  4542. #if 1
  4543. train_pkt_number = pdm_sat_table->beam_train_cnt[p_dm_fat_table->rx_idle_ant - 1][pdm_sat_table->fast_training_beam_num];
  4544. #else
  4545. train_pkt_number = pdm_sat_table->per_beam_training_pkt_num;
  4546. #endif
  4547. /*Swich Antenna erery N pkts*/
  4548. if (pdm_sat_table->pkt_counter == train_pkt_number) {
  4549. if (pdm_sat_table->ant_num > 1) {
  4550. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("packet enugh ((%d ))pkts ---> Switch antenna\n", train_pkt_number));
  4551. next_ant = (p_dm_fat_table->rx_idle_ant == MAIN_ANT) ? AUX_ANT : MAIN_ANT;
  4552. odm_update_rx_idle_ant(p_dm_odm, next_ant);
  4553. }
  4554. pdm_sat_table->update_beam_idx++;
  4555. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pre_beacon_counter = ((%d)), update_beam_idx_counter = ((%d))\n",
  4556. pdm_sat_table->pre_beacon_counter, pdm_sat_table->update_beam_idx));
  4557. pdm_sat_table->pre_beacon_counter = pdm_sat_table->beacon_counter;
  4558. pdm_sat_table->pkt_counter = 0;
  4559. }
  4560. }
  4561. }
  4562. /*Swich Beam after switch "pdm_sat_table->ant_num" antennas*/
  4563. if (pdm_sat_table->update_beam_idx == pdm_sat_table->ant_num) {
  4564. pdm_sat_table->update_beam_idx = 0;
  4565. pdm_sat_table->pkt_counter = 0;
  4566. beam_tmp = pdm_sat_table->fast_training_beam_num;
  4567. if (pdm_sat_table->fast_training_beam_num >= (pdm_sat_table->beam_patten_num_each_ant - 1)) {
  4568. p_dm_fat_table->fat_state = FAT_DECISION_STATE;
  4569. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  4570. odm_fast_ant_training_hl_smart_antenna_type1(p_dm_odm);
  4571. #else
  4572. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_decision_workitem);
  4573. #endif
  4574. } else {
  4575. pdm_sat_table->fast_training_beam_num++;
  4576. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Update Beam_num (( %d )) -> (( %d ))\n", beam_tmp, pdm_sat_table->fast_training_beam_num));
  4577. phydm_set_all_ant_same_beam_num(p_dm_odm);
  4578. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  4579. }
  4580. }
  4581. }
  4582. #else
  4583. if (p_dm_odm->ant_div_type == HL_SW_SMART_ANT_TYPE1) {
  4584. if ((p_dm_odm->support_ic_type & ODM_HL_SMART_ANT_TYPE1_SUPPORT) &&
  4585. (p_pktinfo->is_packet_to_self) &&
  4586. (p_dm_fat_table->fat_state == FAT_TRAINING_STATE)
  4587. ) {
  4588. if (pdm_sat_table->pkt_skip_statistic_en == 0) {
  4589. /*
  4590. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("StaID[%d]: antsel_pathA = ((%d)), hw_antsw_occur = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",
  4591. p_pktinfo->station_id, p_dm_fat_table->antsel_rx_keep_0, p_dm_fat_table->hw_antsw_occur, pdm_sat_table->fast_training_beam_num, rx_power_ant0));
  4592. */
  4593. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("StaID[%d]: antsel_pathA = ((%d)), is_packet_to_self = ((%d)), Beam_num = ((%d)), RSSI = ((%d))\n",
  4594. p_pktinfo->station_id, p_dm_fat_table->antsel_rx_keep_0, p_pktinfo->is_packet_to_self, pdm_sat_table->fast_training_beam_num, rx_power_ant0));
  4595. pdm_sat_table->pkt_rssi_sum[p_dm_fat_table->antsel_rx_keep_0][pdm_sat_table->fast_training_beam_num] += rx_power_ant0;
  4596. pdm_sat_table->pkt_rssi_cnt[p_dm_fat_table->antsel_rx_keep_0][pdm_sat_table->fast_training_beam_num]++;
  4597. pdm_sat_table->pkt_counter++;
  4598. /*swich beam every N pkt*/
  4599. if ((pdm_sat_table->pkt_counter) >= (pdm_sat_table->per_beam_training_pkt_num)) {
  4600. pdm_sat_table->pkt_counter = 0;
  4601. beam_tmp = pdm_sat_table->fast_training_beam_num;
  4602. if (pdm_sat_table->fast_training_beam_num >= (pdm_sat_table->beam_patten_num_each_ant - 1)) {
  4603. p_dm_fat_table->fat_state = FAT_DECISION_STATE;
  4604. #if DEV_BUS_TYPE == RT_PCI_INTERFACE
  4605. odm_fast_ant_training_hl_smart_antenna_type1(p_dm_odm);
  4606. #else
  4607. odm_schedule_work_item(&pdm_sat_table->hl_smart_antenna_decision_workitem);
  4608. #endif
  4609. } else {
  4610. pdm_sat_table->fast_training_beam_num++;
  4611. phydm_set_all_ant_same_beam_num(p_dm_odm);
  4612. p_dm_fat_table->fat_state = FAT_TRAINING_STATE;
  4613. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Update Beam_num (( %d )) -> (( %d ))\n", beam_tmp, pdm_sat_table->fast_training_beam_num));
  4614. }
  4615. }
  4616. }
  4617. }
  4618. }
  4619. #endif
  4620. else
  4621. #endif
  4622. if (p_dm_odm->ant_div_type == CG_TRX_SMART_ANTDIV) {
  4623. if ((p_dm_odm->support_ic_type & ODM_SMART_ANT_SUPPORT) && (p_pktinfo->is_packet_to_self) && (p_dm_fat_table->fat_state == FAT_TRAINING_STATE)) { /* (p_pktinfo->is_packet_match_bssid && (!p_pktinfo->is_packet_beacon)) */
  4624. u8 antsel_tr_mux;
  4625. antsel_tr_mux = (p_dm_fat_table->antsel_rx_keep_2 << 2) | (p_dm_fat_table->antsel_rx_keep_1 << 1) | p_dm_fat_table->antsel_rx_keep_0;
  4626. p_dm_fat_table->ant_sum_rssi[antsel_tr_mux] += rx_power_ant0;
  4627. p_dm_fat_table->ant_rssi_cnt[antsel_tr_mux]++;
  4628. }
  4629. } else { /* ant_div_type != CG_TRX_SMART_ANTDIV */
  4630. if ((p_dm_odm->support_ic_type & ODM_ANTDIV_SUPPORT) && (p_pktinfo->is_packet_to_self || p_dm_fat_table->use_ctrl_frame_antdiv)) {
  4631. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV) {
  4632. if (is_cck_rate || (p_dm_odm->support_ic_type == ODM_RTL8188F))
  4633. p_dm_fat_table->antsel_rx_keep_0 = (p_dm_fat_table->rx_idle_ant == MAIN_ANT) ? ANT1_2G : ANT2_2G;
  4634. odm_antsel_statistics(p_dm_odm, p_dm_fat_table->antsel_rx_keep_0, p_pktinfo->station_id, rx_power_ant0, RSSI_METHOD, is_cck_rate);
  4635. } else {
  4636. odm_antsel_statistics(p_dm_odm, p_dm_fat_table->antsel_rx_keep_0, p_pktinfo->station_id, rx_power_ant0, RSSI_METHOD, is_cck_rate);
  4637. #ifdef ODM_EVM_ENHANCE_ANTDIV
  4638. if (p_dm_odm->support_ic_type == ODM_RTL8192E) {
  4639. if (!is_cck_rate)
  4640. odm_antsel_statistics(p_dm_odm, p_dm_fat_table->antsel_rx_keep_0, p_pktinfo->station_id, rx_evm_ant0, EVM_METHOD, is_cck_rate);
  4641. }
  4642. #endif
  4643. }
  4644. }
  4645. }
  4646. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("is_cck_rate=%d, PWDB_ALL=%d\n",is_cck_rate, p_phy_info->rx_pwdb_all)); */
  4647. /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n",p_dm_fat_table->antsel_rx_keep_2, p_dm_fat_table->antsel_rx_keep_1, p_dm_fat_table->antsel_rx_keep_0)); */
  4648. }
  4649. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  4650. void
  4651. odm_set_tx_ant_by_tx_info(
  4652. void *p_dm_void,
  4653. u8 *p_desc,
  4654. u8 mac_id
  4655. )
  4656. {
  4657. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4658. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  4659. if (!(p_dm_odm->support_ability & ODM_BB_ANT_DIV))
  4660. return;
  4661. if (p_dm_odm->ant_div_type == CGCS_RX_HW_ANTDIV)
  4662. return;
  4663. if (p_dm_odm->support_ic_type == ODM_RTL8723B) {
  4664. #if (RTL8723B_SUPPORT == 1)
  4665. SET_TX_DESC_ANTSEL_A_8723B(p_desc, p_dm_fat_table->antsel_a[mac_id]);
  4666. /*ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8723B] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
  4667. mac_id, p_dm_fat_table->antsel_c[mac_id], p_dm_fat_table->antsel_b[mac_id], p_dm_fat_table->antsel_a[mac_id]));*/
  4668. #endif
  4669. } else if (p_dm_odm->support_ic_type == ODM_RTL8821) {
  4670. #if (RTL8821A_SUPPORT == 1)
  4671. SET_TX_DESC_ANTSEL_A_8812(p_desc, p_dm_fat_table->antsel_a[mac_id]);
  4672. /*ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8821A] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
  4673. mac_id, p_dm_fat_table->antsel_c[mac_id], p_dm_fat_table->antsel_b[mac_id], p_dm_fat_table->antsel_a[mac_id]));*/
  4674. #endif
  4675. } else if (p_dm_odm->support_ic_type == ODM_RTL8188E) {
  4676. #if (RTL8188E_SUPPORT == 1)
  4677. SET_TX_DESC_ANTSEL_A_88E(p_desc, p_dm_fat_table->antsel_a[mac_id]);
  4678. SET_TX_DESC_ANTSEL_B_88E(p_desc, p_dm_fat_table->antsel_b[mac_id]);
  4679. SET_TX_DESC_ANTSEL_C_88E(p_desc, p_dm_fat_table->antsel_c[mac_id]);
  4680. /*ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8188E] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
  4681. mac_id, p_dm_fat_table->antsel_c[mac_id], p_dm_fat_table->antsel_b[mac_id], p_dm_fat_table->antsel_a[mac_id]));*/
  4682. #endif
  4683. } else if (p_dm_odm->support_ic_type == ODM_RTL8821C) {
  4684. #if (RTL8821C_SUPPORT == 1)
  4685. SET_TX_DESC_ANTSEL_A_8821C(p_desc, p_dm_fat_table->antsel_a[mac_id]);
  4686. /*ODM_RT_TRACE(p_dm_odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8821C] SetTxAntByTxInfo_WIN: mac_id=%d, antsel_tr_mux=3'b%d%d%d\n",
  4687. mac_id, p_dm_fat_table->antsel_c[mac_id], p_dm_fat_table->antsel_b[mac_id], p_dm_fat_table->antsel_a[mac_id]));*/
  4688. #endif
  4689. }
  4690. }
  4691. #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)
  4692. void
  4693. odm_set_tx_ant_by_tx_info(
  4694. struct rtl8192cd_priv *priv,
  4695. struct tx_desc *pdesc,
  4696. unsigned short aid
  4697. )
  4698. {
  4699. struct PHY_DM_STRUCT *p_dm_odm = &(priv->pshare->_dmodm);
  4700. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &priv->pshare->_dmodm.dm_fat_table;
  4701. u32 support_ic_type = priv->pshare->_dmodm.support_ic_type;
  4702. if (!(p_dm_odm->support_ability & ODM_BB_ANT_DIV))
  4703. return;
  4704. if (p_dm_odm->ant_div_type == CGCS_RX_HW_ANTDIV)
  4705. return;
  4706. if (support_ic_type == ODM_RTL8881A) {
  4707. /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__); */
  4708. pdesc->dword6 &= set_desc(~(BIT(18) | BIT(17) | BIT(16)));
  4709. pdesc->dword6 |= set_desc(p_dm_fat_table->antsel_a[aid] << 16);
  4710. } else if (support_ic_type == ODM_RTL8192E) {
  4711. /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E******\n",__FUNCTION__,__LINE__); */
  4712. pdesc->dword6 &= set_desc(~(BIT(18) | BIT(17) | BIT(16)));
  4713. pdesc->dword6 |= set_desc(p_dm_fat_table->antsel_a[aid] << 16);
  4714. } else if (support_ic_type == ODM_RTL8188E) {
  4715. /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8188E******\n",__FUNCTION__,__LINE__);*/
  4716. pdesc->dword2 &= set_desc(~BIT(24));
  4717. pdesc->dword2 &= set_desc(~BIT(25));
  4718. pdesc->dword7 &= set_desc(~BIT(29));
  4719. pdesc->dword2 |= set_desc(p_dm_fat_table->antsel_a[aid] << 24);
  4720. pdesc->dword2 |= set_desc(p_dm_fat_table->antsel_b[aid] << 25);
  4721. pdesc->dword7 |= set_desc(p_dm_fat_table->antsel_c[aid] << 29);
  4722. } else if (support_ic_type == ODM_RTL8812) {
  4723. /*[path-A]*/
  4724. /*panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E******\n",__FUNCTION__,__LINE__);*/
  4725. pdesc->dword6 &= set_desc(~BIT(16));
  4726. pdesc->dword6 &= set_desc(~BIT(17));
  4727. pdesc->dword6 &= set_desc(~BIT(18));
  4728. pdesc->dword6 |= set_desc(p_dm_fat_table->antsel_a[aid] << 16);
  4729. pdesc->dword6 |= set_desc(p_dm_fat_table->antsel_b[aid] << 17);
  4730. pdesc->dword6 |= set_desc(p_dm_fat_table->antsel_c[aid] << 18);
  4731. }
  4732. }
  4733. #if 1 /*def CONFIG_WLAN_HAL*/
  4734. void
  4735. odm_set_tx_ant_by_tx_info_hal(
  4736. struct rtl8192cd_priv *priv,
  4737. void *pdesc_data,
  4738. u16 aid
  4739. )
  4740. {
  4741. struct PHY_DM_STRUCT *p_dm_odm = &(priv->pshare->_dmodm);
  4742. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &priv->pshare->_dmodm.dm_fat_table;
  4743. u32 support_ic_type = priv->pshare->_dmodm.support_ic_type;
  4744. PTX_DESC_DATA_88XX pdescdata = (PTX_DESC_DATA_88XX)pdesc_data;
  4745. if (!(p_dm_odm->support_ability & ODM_BB_ANT_DIV))
  4746. return;
  4747. if (p_dm_odm->ant_div_type == CGCS_RX_HW_ANTDIV)
  4748. return;
  4749. if (support_ic_type == ODM_RTL8881A || support_ic_type == ODM_RTL8192E || support_ic_type == ODM_RTL8814A) {
  4750. /*panic_printk("[%s] [%d] ******odm_set_tx_ant_by_tx_info_hal******\n",__FUNCTION__,__LINE__);*/
  4751. pdescdata->ant_sel = 1;
  4752. pdescdata->ant_sel_a = p_dm_fat_table->antsel_a[aid];
  4753. }
  4754. }
  4755. #endif /*#ifdef CONFIG_WLAN_HAL*/
  4756. #endif
  4757. void
  4758. odm_ant_div_config(
  4759. void *p_dm_void
  4760. )
  4761. {
  4762. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4763. struct _FAST_ANTENNA_TRAINNING_ *p_dm_fat_table = &p_dm_odm->dm_fat_table;
  4764. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
  4765. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("WIN Config Antenna Diversity\n"));
  4766. /*
  4767. if(p_dm_odm->support_ic_type==ODM_RTL8723B)
  4768. {
  4769. if((!p_dm_odm->dm_swat_table.ANTA_ON || !p_dm_odm->dm_swat_table.ANTB_ON))
  4770. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4771. }
  4772. */
  4773. if (p_dm_odm->support_ic_type == ODM_RTL8723D) {
  4774. p_dm_odm->ant_div_type = S0S1_TRX_HW_ANTDIV;
  4775. /**/
  4776. }
  4777. #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
  4778. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("CE Config Antenna Diversity\n"));
  4779. if (p_dm_odm->support_ic_type == ODM_RTL8723B)
  4780. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4781. #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))
  4782. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("AP Config Antenna Diversity\n"));
  4783. /* 2 [ NOT_SUPPORT_ANTDIV ] */
  4784. #if (defined(CONFIG_NOT_SUPPORT_ANTDIV))
  4785. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4786. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Disable AntDiv function] : Not Support 2.4G & 5G Antenna Diversity\n"));
  4787. /* 2 [ 2G&5G_SUPPORT_ANTDIV ] */
  4788. #elif (defined(CONFIG_2G5G_SUPPORT_ANTDIV))
  4789. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : 2.4G & 5G Support Antenna Diversity Simultaneously\n"));
  4790. p_dm_fat_table->ant_div_2g_5g = (ODM_ANTDIV_2G | ODM_ANTDIV_5G);
  4791. if (p_dm_odm->support_ic_type & ODM_ANTDIV_SUPPORT)
  4792. p_dm_odm->support_ability |= ODM_BB_ANT_DIV;
  4793. if (*p_dm_odm->p_band_type == ODM_BAND_5G) {
  4794. #if (defined(CONFIG_5G_CGCS_RX_DIVERSITY))
  4795. p_dm_odm->ant_div_type = CGCS_RX_HW_ANTDIV;
  4796. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n"));
  4797. panic_printk("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
  4798. #elif (defined(CONFIG_5G_CG_TRX_DIVERSITY) || defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))
  4799. p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV;
  4800. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n"));
  4801. panic_printk("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
  4802. #elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))
  4803. p_dm_odm->ant_div_type = CG_TRX_SMART_ANTDIV;
  4804. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = CG_SMART_ANTDIV\n"));
  4805. #elif (defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY))
  4806. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4807. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = S0S1_SW_ANTDIV\n"));
  4808. #endif
  4809. } else if (*p_dm_odm->p_band_type == ODM_BAND_2_4G) {
  4810. #if (defined(CONFIG_2G_CGCS_RX_DIVERSITY))
  4811. p_dm_odm->ant_div_type = CGCS_RX_HW_ANTDIV;
  4812. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = CGCS_RX_HW_ANTDIV\n"));
  4813. #elif (defined(CONFIG_2G_CG_TRX_DIVERSITY) || defined(CONFIG_2G5G_CG_TRX_DIVERSITY_8881A))
  4814. p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV;
  4815. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = CG_TRX_HW_ANTDIV\n"));
  4816. #elif (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  4817. p_dm_odm->ant_div_type = CG_TRX_SMART_ANTDIV;
  4818. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = CG_SMART_ANTDIV\n"));
  4819. #elif (defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY))
  4820. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4821. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = S0S1_SW_ANTDIV\n"));
  4822. #endif
  4823. }
  4824. /* 2 [ 5G_SUPPORT_ANTDIV ] */
  4825. #elif (defined(CONFIG_5G_SUPPORT_ANTDIV))
  4826. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n"));
  4827. panic_printk("[ Enable AntDiv function] : Only 5G Support Antenna Diversity\n");
  4828. p_dm_fat_table->ant_div_2g_5g = (ODM_ANTDIV_5G);
  4829. if (*p_dm_odm->p_band_type == ODM_BAND_5G) {
  4830. if (p_dm_odm->support_ic_type & ODM_ANTDIV_5G_SUPPORT_IC)
  4831. p_dm_odm->support_ability |= ODM_BB_ANT_DIV;
  4832. #if (defined(CONFIG_5G_CGCS_RX_DIVERSITY))
  4833. p_dm_odm->ant_div_type = CGCS_RX_HW_ANTDIV;
  4834. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n"));
  4835. panic_printk("[ 5G] : AntDiv type = CGCS_RX_HW_ANTDIV\n");
  4836. #elif (defined(CONFIG_5G_CG_TRX_DIVERSITY))
  4837. p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV;
  4838. panic_printk("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n");
  4839. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = CG_TRX_HW_ANTDIV\n"));
  4840. #elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY))
  4841. p_dm_odm->ant_div_type = CG_TRX_SMART_ANTDIV;
  4842. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = CG_SMART_ANTDIV\n"));
  4843. #elif (defined(CONFIG_5G_S0S1_SW_ANT_DIVERSITY))
  4844. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4845. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 5G] : AntDiv type = S0S1_SW_ANTDIV\n"));
  4846. #endif
  4847. } else if (*p_dm_odm->p_band_type == ODM_BAND_2_4G) {
  4848. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Not Support 2G ant_div_type\n"));
  4849. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4850. }
  4851. /* 2 [ 2G_SUPPORT_ANTDIV ] */
  4852. #elif (defined(CONFIG_2G_SUPPORT_ANTDIV))
  4853. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Enable AntDiv function] : Only 2.4G Support Antenna Diversity\n"));
  4854. p_dm_fat_table->ant_div_2g_5g = (ODM_ANTDIV_2G);
  4855. if (*p_dm_odm->p_band_type == ODM_BAND_2_4G) {
  4856. if (p_dm_odm->support_ic_type & ODM_ANTDIV_2G_SUPPORT_IC)
  4857. p_dm_odm->support_ability |= ODM_BB_ANT_DIV;
  4858. #if (defined(CONFIG_2G_CGCS_RX_DIVERSITY))
  4859. p_dm_odm->ant_div_type = CGCS_RX_HW_ANTDIV;
  4860. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = CGCS_RX_HW_ANTDIV\n"));
  4861. #elif (defined(CONFIG_2G_CG_TRX_DIVERSITY))
  4862. p_dm_odm->ant_div_type = CG_TRX_HW_ANTDIV;
  4863. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = CG_TRX_HW_ANTDIV\n"));
  4864. #elif (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  4865. p_dm_odm->ant_div_type = CG_TRX_SMART_ANTDIV;
  4866. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = CG_SMART_ANTDIV\n"));
  4867. #elif (defined(CONFIG_2G_S0S1_SW_ANT_DIVERSITY))
  4868. p_dm_odm->ant_div_type = S0S1_SW_ANTDIV;
  4869. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ 2.4G] : AntDiv type = S0S1_SW_ANTDIV\n"));
  4870. #endif
  4871. } else if (*p_dm_odm->p_band_type == ODM_BAND_5G) {
  4872. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Not Support 5G ant_div_type\n"));
  4873. p_dm_odm->support_ability &= ~(ODM_BB_ANT_DIV);
  4874. }
  4875. #endif
  4876. #endif
  4877. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[AntDiv Config Info] AntDiv_SupportAbility = (( %x ))\n", ((p_dm_odm->support_ability & ODM_BB_ANT_DIV) ? 1 : 0)));
  4878. ODM_RT_TRACE(p_dm_odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[AntDiv Config Info] be_fix_tx_ant = ((%d))\n", p_dm_odm->dm_fat_table.b_fix_tx_ant));
  4879. }
  4880. void
  4881. odm_ant_div_timers(
  4882. void *p_dm_void,
  4883. u8 state
  4884. )
  4885. {
  4886. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4887. if (state == INIT_ANTDIV_TIMMER) {
  4888. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  4889. odm_initialize_timer(p_dm_odm, &(p_dm_odm->dm_swat_table.phydm_sw_antenna_switch_timer),
  4890. (void *)odm_sw_antdiv_callback, NULL, "phydm_sw_antenna_switch_timer");
  4891. #elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  4892. odm_initialize_timer(p_dm_odm, &p_dm_odm->fast_ant_training_timer,
  4893. (void *)odm_fast_ant_training_callback, NULL, "fast_ant_training_timer");
  4894. #endif
  4895. #ifdef ODM_EVM_ENHANCE_ANTDIV
  4896. odm_initialize_timer(p_dm_odm, &p_dm_odm->evm_fast_ant_training_timer,
  4897. (void *)odm_evm_fast_ant_training_callback, NULL, "evm_fast_ant_training_timer");
  4898. #endif
  4899. } else if (state == CANCEL_ANTDIV_TIMMER) {
  4900. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  4901. odm_cancel_timer(p_dm_odm, &(p_dm_odm->dm_swat_table.phydm_sw_antenna_switch_timer));
  4902. #elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  4903. odm_cancel_timer(p_dm_odm, &p_dm_odm->fast_ant_training_timer);
  4904. #endif
  4905. #ifdef ODM_EVM_ENHANCE_ANTDIV
  4906. odm_cancel_timer(p_dm_odm, &p_dm_odm->evm_fast_ant_training_timer);
  4907. #endif
  4908. } else if (state == RELEASE_ANTDIV_TIMMER) {
  4909. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  4910. odm_release_timer(p_dm_odm, &(p_dm_odm->dm_swat_table.phydm_sw_antenna_switch_timer));
  4911. #elif (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))
  4912. odm_release_timer(p_dm_odm, &p_dm_odm->fast_ant_training_timer);
  4913. #endif
  4914. #ifdef ODM_EVM_ENHANCE_ANTDIV
  4915. odm_release_timer(p_dm_odm, &p_dm_odm->evm_fast_ant_training_timer);
  4916. #endif
  4917. }
  4918. }
  4919. void
  4920. phydm_antdiv_debug(
  4921. void *p_dm_void,
  4922. u32 *const dm_value,
  4923. u32 *_used,
  4924. char *output,
  4925. u32 *_out_len
  4926. )
  4927. {
  4928. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4929. /*struct _FAST_ANTENNA_TRAINNING_* p_dm_fat_table = &p_dm_odm->dm_fat_table;*/
  4930. u32 used = *_used;
  4931. u32 out_len = *_out_len;
  4932. if (dm_value[0] == 1) { /*fixed or auto antenna*/
  4933. if (dm_value[1] == 0) {
  4934. p_dm_odm->antdiv_select = 0;
  4935. PHYDM_SNPRINTF((output + used, out_len - used, "AntDiv: Auto\n"));
  4936. } else if (dm_value[1] == 1) {
  4937. p_dm_odm->antdiv_select = 1;
  4938. PHYDM_SNPRINTF((output + used, out_len - used, "AntDiv: Fix MAin\n"));
  4939. } else if (dm_value[1] == 2) {
  4940. p_dm_odm->antdiv_select = 2;
  4941. PHYDM_SNPRINTF((output + used, out_len - used, "AntDiv: Fix Aux\n"));
  4942. }
  4943. } else if (dm_value[0] == 2) { /*dynamic period for AntDiv*/
  4944. p_dm_odm->antdiv_period = (u8)dm_value[1];
  4945. PHYDM_SNPRINTF((output + used, out_len - used, "AntDiv_period = ((%d))\n", p_dm_odm->antdiv_period));
  4946. }
  4947. }
  4948. #endif /*#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))*/
  4949. void
  4950. odm_ant_div_reset(
  4951. void *p_dm_void
  4952. )
  4953. {
  4954. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4955. if (p_dm_odm->ant_div_type == S0S1_SW_ANTDIV) {
  4956. #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY
  4957. odm_s0s1_sw_ant_div_reset(p_dm_odm);
  4958. #endif
  4959. }
  4960. }
  4961. void
  4962. odm_antenna_diversity_init(
  4963. void *p_dm_void
  4964. )
  4965. {
  4966. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4967. #if 0
  4968. if (p_dm_odm->mp_mode == true)
  4969. return;
  4970. #endif
  4971. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  4972. odm_ant_div_config(p_dm_odm);
  4973. odm_ant_div_init(p_dm_odm);
  4974. #endif
  4975. }
  4976. void
  4977. odm_antenna_diversity(
  4978. void *p_dm_void
  4979. )
  4980. {
  4981. struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
  4982. if (p_dm_odm->mp_mode == true)
  4983. return;
  4984. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  4985. odm_ant_div(p_dm_odm);
  4986. #endif
  4987. }