phydm_antdiv.c 182 KB

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