phydm_debug.c 140 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527
  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. void phydm_init_debug_setting(struct dm_struct *dm)
  31. {
  32. dm->fw_debug_components = 0;
  33. dm->debug_components =
  34. #if DBG
  35. /*@BB Functions*/
  36. /*@DBG_DIG |*/
  37. /*@DBG_RA_MASK |*/
  38. /*@DBG_DYN_TXPWR |*/
  39. /*@DBG_FA_CNT |*/
  40. /*@DBG_RSSI_MNTR |*/
  41. /*@DBG_CCKPD |*/
  42. /*@DBG_ANT_DIV |*/
  43. /*@DBG_SMT_ANT |*/
  44. /*@DBG_PWR_TRAIN |*/
  45. /*@DBG_RA |*/
  46. /*@DBG_PATH_DIV |*/
  47. /*@DBG_DFS |*/
  48. /*@DBG_DYN_ARFR |*/
  49. /*@DBG_ADPTVTY |*/
  50. /*@DBG_CFO_TRK |*/
  51. /*@DBG_ENV_MNTR |*/
  52. /*@DBG_PRI_CCA |*/
  53. /*@DBG_ADPTV_SOML |*/
  54. /*@DBG_LNA_SAT_CHK |*/
  55. /*@DBG_PHY_STATUS |*/
  56. /*@DBG_TMP |*/
  57. /*@DBG_FW_TRACE |*/
  58. /*@DBG_TXBF |*/
  59. /*@DBG_COMMON_FLOW |*/
  60. /*@ODM_PHY_CONFIG |*/
  61. /*@ODM_COMP_INIT |*/
  62. /*@DBG_CMN |*/
  63. /*@ODM_COMP_API |*/
  64. #endif
  65. 0;
  66. dm->fw_buff_is_enpty = true;
  67. dm->pre_c2h_seq = 0;
  68. dm->c2h_cmd_start = 0;
  69. dm->cmn_dbg_msg_cnt = PHYDM_WATCH_DOG_PERIOD;
  70. dm->cmn_dbg_msg_period = PHYDM_WATCH_DOG_PERIOD;
  71. phydm_reset_rx_rate_distribution(dm);
  72. }
  73. void phydm_bb_dbg_port_header_sel(void *dm_void, u32 header_idx)
  74. {
  75. struct dm_struct *dm = (struct dm_struct *)dm_void;
  76. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  77. odm_set_bb_reg(dm, R_0x8f8, 0x3c00000, header_idx);
  78. /*@
  79. * header_idx:
  80. * (0:) '{ofdm_dbg[31:0]}'
  81. * (1:) '{cca,crc32_fail,dbg_ofdm[29:0]}'
  82. * (2:) '{vbon,crc32_fail,dbg_ofdm[29:0]}'
  83. * (3:) '{cca,crc32_ok,dbg_ofdm[29:0]}'
  84. * (4:) '{vbon,crc32_ok,dbg_ofdm[29:0]}'
  85. * (5:) '{dbg_iqk_anta}'
  86. * (6:) '{cca,ofdm_crc_ok,dbg_dp_anta[29:0]}'
  87. * (7:) '{dbg_iqk_antb}'
  88. * (8:) '{DBGOUT_RFC_b[31:0]}'
  89. * (9:) '{DBGOUT_RFC_a[31:0]}'
  90. * (a:) '{dbg_ofdm}'
  91. * (b:) '{dbg_cck}'
  92. */
  93. }
  94. }
  95. void phydm_bb_dbg_port_clock_en(void *dm_void, u8 enable)
  96. {
  97. struct dm_struct *dm = (struct dm_struct *)dm_void;
  98. u32 reg_value = 0;
  99. if (dm->support_ic_type &
  100. (ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8814A | ODM_RTL8814B)) {
  101. /*@enable/disable debug port clock, for power saving*/
  102. reg_value = enable ? 0x7 : 0;
  103. odm_set_bb_reg(dm, R_0x198c, 0x7, reg_value);
  104. }
  105. }
  106. u8 phydm_set_bb_dbg_port(void *dm_void, u8 curr_dbg_priority, u32 debug_port)
  107. {
  108. struct dm_struct *dm = (struct dm_struct *)dm_void;
  109. u8 dbg_port_result = false;
  110. if (curr_dbg_priority > dm->pre_dbg_priority) {
  111. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  112. phydm_bb_dbg_port_clock_en(dm, true);
  113. odm_set_bb_reg(dm, R_0x8fc, MASKDWORD, debug_port);
  114. } else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
  115. odm_set_bb_reg(dm, R_0x1c3c, 0xfff00, debug_port);
  116. } else { /*@if (dm->support_ic_type & ODM_IC_11N_SERIES)*/
  117. odm_set_bb_reg(dm, R_0x908, MASKDWORD, debug_port);
  118. }
  119. PHYDM_DBG(dm, ODM_COMP_API,
  120. "DbgPort ((0x%x)) set success, Cur_priority=((%d)), Pre_priority=((%d))\n",
  121. debug_port, curr_dbg_priority, dm->pre_dbg_priority);
  122. dm->pre_dbg_priority = curr_dbg_priority;
  123. dbg_port_result = true;
  124. }
  125. return dbg_port_result;
  126. }
  127. void phydm_release_bb_dbg_port(void *dm_void)
  128. {
  129. struct dm_struct *dm = (struct dm_struct *)dm_void;
  130. phydm_bb_dbg_port_clock_en(dm, false);
  131. phydm_bb_dbg_port_header_sel(dm, 0);
  132. dm->pre_dbg_priority = DBGPORT_RELEASE;
  133. PHYDM_DBG(dm, ODM_COMP_API, "Release BB dbg_port\n");
  134. }
  135. u32 phydm_get_bb_dbg_port_val(void *dm_void)
  136. {
  137. struct dm_struct *dm = (struct dm_struct *)dm_void;
  138. u32 dbg_port_value = 0;
  139. if (dm->support_ic_type & ODM_IC_11AC_SERIES)
  140. dbg_port_value = odm_get_bb_reg(dm, R_0xfa0, MASKDWORD);
  141. else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
  142. dbg_port_value = odm_get_bb_reg(dm, R_0x2dbc, MASKDWORD);
  143. else /*@if (dm->support_ic_type & ODM_IC_11N_SERIES)*/
  144. dbg_port_value = odm_get_bb_reg(dm, R_0xdf4, MASKDWORD);
  145. PHYDM_DBG(dm, ODM_COMP_API, "dbg_port_value = 0x%x\n", dbg_port_value);
  146. return dbg_port_value;
  147. }
  148. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  149. #if (ODM_IC_11N_SERIES_SUPPORT)
  150. void phydm_bb_hw_dbg_info_n(void *dm_void, u32 *_used, char *output,
  151. u32 *_out_len)
  152. {
  153. struct dm_struct *dm = (struct dm_struct *)dm_void;
  154. u32 used = *_used;
  155. u32 out_len = *_out_len;
  156. u32 value32 = 0, value32_1 = 0;
  157. u8 rf_gain_a = 0, rf_gain_b = 0, rf_gain_c = 0, rf_gain_d = 0;
  158. u8 rx_snr_a = 0, rx_snr_b = 0, rx_snr_c = 0, rx_snr_d = 0;
  159. s8 rxevm_0 = 0, rxevm_1 = 0;
  160. #if 1
  161. struct phydm_cfo_rpt cfo;
  162. u8 i = 0;
  163. #else
  164. s32 short_cfo_a = 0, short_cfo_b = 0, long_cfo_a = 0, long_cfo_b = 0;
  165. s32 scfo_a = 0, scfo_b = 0, avg_cfo_a = 0, avg_cfo_b = 0;
  166. s32 cfo_end_a = 0, cfo_end_b = 0, acq_cfo_a = 0, acq_cfo_b = 0;
  167. #endif
  168. PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s\n",
  169. "BB Report Info");
  170. /*@AGC result*/
  171. value32 = odm_get_bb_reg(dm, R_0xdd0, MASKDWORD);
  172. rf_gain_a = (u8)(value32 & 0x3f);
  173. rf_gain_a = rf_gain_a << 1;
  174. rf_gain_b = (u8)((value32 >> 8) & 0x3f);
  175. rf_gain_b = rf_gain_b << 1;
  176. rf_gain_c = (u8)((value32 >> 16) & 0x3f);
  177. rf_gain_c = rf_gain_c << 1;
  178. rf_gain_d = (u8)((value32 >> 24) & 0x3f);
  179. rf_gain_d = rf_gain_d << 1;
  180. PDM_SNPF(out_len, used, output + used, out_len - used,
  181. "\r\n %-35s = %d / %d / %d / %d", "OFDM RX RF Gain(A/B/C/D)",
  182. rf_gain_a, rf_gain_b, rf_gain_c, rf_gain_d);
  183. /*SNR report*/
  184. value32 = odm_get_bb_reg(dm, R_0xdd4, MASKDWORD);
  185. rx_snr_a = (u8)(value32 & 0xff);
  186. rx_snr_a = rx_snr_a >> 1;
  187. rx_snr_b = (u8)((value32 >> 8) & 0xff);
  188. rx_snr_b = rx_snr_b >> 1;
  189. rx_snr_c = (u8)((value32 >> 16) & 0xff);
  190. rx_snr_c = rx_snr_c >> 1;
  191. rx_snr_d = (u8)((value32 >> 24) & 0xff);
  192. rx_snr_d = rx_snr_d >> 1;
  193. PDM_SNPF(out_len, used, output + used, out_len - used,
  194. "\r\n %-35s = %d / %d / %d / %d", "RXSNR(A/B/C/D, dB)",
  195. rx_snr_a, rx_snr_b, rx_snr_c, rx_snr_d);
  196. /* PostFFT related info*/
  197. value32 = odm_get_bb_reg(dm, R_0xdd8, MASKDWORD);
  198. rxevm_0 = (s8)((value32 & MASKBYTE2) >> 16);
  199. rxevm_0 /= 2;
  200. if (rxevm_0 < -63)
  201. rxevm_0 = 0;
  202. rxevm_1 = (s8)((value32 & MASKBYTE3) >> 24);
  203. rxevm_1 /= 2;
  204. if (rxevm_1 < -63)
  205. rxevm_1 = 0;
  206. PDM_SNPF(out_len, used, output + used, out_len - used,
  207. "\r\n %-35s = %d / %d", "RXEVM (1ss/2ss)", rxevm_0, rxevm_1);
  208. #if 1
  209. phydm_get_cfo_info(dm, &cfo);
  210. for (i = 0; i < dm->num_rf_path; i++) {
  211. PDM_SNPF(out_len, used, output + used, out_len - used,
  212. "\r\n %s[%d] %-28s = {%d, %d, %d, %d, %d}",
  213. "CFO", i, "{S, L, Sec, Acq, End}",
  214. cfo.cfo_rpt_s[i], cfo.cfo_rpt_l[i], cfo.cfo_rpt_sec[i],
  215. cfo.cfo_rpt_acq[i], cfo.cfo_rpt_end[i]);
  216. }
  217. #else
  218. /*@CFO Report Info*/
  219. odm_set_bb_reg(dm, R_0xd00, BIT(26), 1);
  220. /*Short CFO*/
  221. value32 = odm_get_bb_reg(dm, R_0xdac, MASKDWORD);
  222. value32_1 = odm_get_bb_reg(dm, R_0xdb0, MASKDWORD);
  223. short_cfo_b = (s32)(value32 & 0xfff); /*S(12,11)*/
  224. short_cfo_a = (s32)((value32 & 0x0fff0000) >> 16);
  225. long_cfo_b = (s32)(value32_1 & 0x1fff); /*S(13,12)*/
  226. long_cfo_a = (s32)((value32_1 & 0x1fff0000) >> 16);
  227. /*SFO 2's to dec*/
  228. if (short_cfo_a > 2047)
  229. short_cfo_a = short_cfo_a - 4096;
  230. if (short_cfo_b > 2047)
  231. short_cfo_b = short_cfo_b - 4096;
  232. short_cfo_a = (short_cfo_a * 312500) / 2048;
  233. short_cfo_b = (short_cfo_b * 312500) / 2048;
  234. /*@LFO 2's to dec*/
  235. if (long_cfo_a > 4095)
  236. long_cfo_a = long_cfo_a - 8192;
  237. if (long_cfo_b > 4095)
  238. long_cfo_b = long_cfo_b - 8192;
  239. long_cfo_a = long_cfo_a * 312500 / 4096;
  240. long_cfo_b = long_cfo_b * 312500 / 4096;
  241. PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s",
  242. "CFO Report Info");
  243. PDM_SNPF(out_len, used, output + used, out_len - used,
  244. "\r\n %-35s = %d / %d", "Short CFO(Hz) <A/B>", short_cfo_a,
  245. short_cfo_b);
  246. PDM_SNPF(out_len, used, output + used, out_len - used,
  247. "\r\n %-35s = %d / %d", "Long CFO(Hz) <A/B>", long_cfo_a,
  248. long_cfo_b);
  249. /*SCFO*/
  250. value32 = odm_get_bb_reg(dm, R_0xdb8, MASKDWORD);
  251. value32_1 = odm_get_bb_reg(dm, R_0xdb4, MASKDWORD);
  252. scfo_b = (s32)(value32 & 0x7ff); /*S(11,10)*/
  253. scfo_a = (s32)((value32 & 0x07ff0000) >> 16);
  254. if (scfo_a > 1023)
  255. scfo_a = scfo_a - 2048;
  256. if (scfo_b > 1023)
  257. scfo_b = scfo_b - 2048;
  258. scfo_a = scfo_a * 312500 / 1024;
  259. scfo_b = scfo_b * 312500 / 1024;
  260. avg_cfo_b = (s32)(value32_1 & 0x1fff); /*S(13,12)*/
  261. avg_cfo_a = (s32)((value32_1 & 0x1fff0000) >> 16);
  262. if (avg_cfo_a > 4095)
  263. avg_cfo_a = avg_cfo_a - 8192;
  264. if (avg_cfo_b > 4095)
  265. avg_cfo_b = avg_cfo_b - 8192;
  266. avg_cfo_a = avg_cfo_a * 312500 / 4096;
  267. avg_cfo_b = avg_cfo_b * 312500 / 4096;
  268. PDM_SNPF(out_len, used, output + used, out_len - used,
  269. "\r\n %-35s = %d / %d", "value SCFO(Hz) <A/B>", scfo_a,
  270. scfo_b);
  271. PDM_SNPF(out_len, used, output + used, out_len - used,
  272. "\r\n %-35s = %d / %d", "Avg CFO(Hz) <A/B>", avg_cfo_a,
  273. avg_cfo_b);
  274. value32 = odm_get_bb_reg(dm, R_0xdbc, MASKDWORD);
  275. value32_1 = odm_get_bb_reg(dm, R_0xde0, MASKDWORD);
  276. cfo_end_b = (s32)(value32 & 0x1fff); /*S(13,12)*/
  277. cfo_end_a = (s32)((value32 & 0x1fff0000) >> 16);
  278. if (cfo_end_a > 4095)
  279. cfo_end_a = cfo_end_a - 8192;
  280. if (cfo_end_b > 4095)
  281. cfo_end_b = cfo_end_b - 8192;
  282. cfo_end_a = cfo_end_a * 312500 / 4096;
  283. cfo_end_b = cfo_end_b * 312500 / 4096;
  284. acq_cfo_b = (s32)(value32_1 & 0x1fff); /*S(13,12)*/
  285. acq_cfo_a = (s32)((value32_1 & 0x1fff0000) >> 16);
  286. if (acq_cfo_a > 4095)
  287. acq_cfo_a = acq_cfo_a - 8192;
  288. if (acq_cfo_b > 4095)
  289. acq_cfo_b = acq_cfo_b - 8192;
  290. acq_cfo_a = acq_cfo_a * 312500 / 4096;
  291. acq_cfo_b = acq_cfo_b * 312500 / 4096;
  292. PDM_SNPF(out_len, used, output + used, out_len - used,
  293. "\r\n %-35s = %d / %d", "End CFO(Hz) <A/B>", cfo_end_a,
  294. cfo_end_b);
  295. PDM_SNPF(out_len, used, output + used, out_len - used,
  296. "\r\n %-35s = %d / %d", "ACQ CFO(Hz) <A/B>", acq_cfo_a,
  297. acq_cfo_b);
  298. #endif
  299. }
  300. #endif
  301. #if (ODM_IC_11AC_SERIES_SUPPORT)
  302. #if (RTL8822B_SUPPORT)
  303. void phydm_bb_hw_dbg_info_8822b(void *dm_void, u32 *_used, char *output,
  304. u32 *_out_len)
  305. {
  306. struct dm_struct *dm = (struct dm_struct *)dm_void;
  307. u32 used = *_used;
  308. u32 out_len = *_out_len;
  309. u32 condi_num = 0;
  310. u8 i = 0;
  311. if (!(dm->support_ic_type == ODM_RTL8822B))
  312. return;
  313. condi_num = phydm_get_condi_num_8822b(dm);
  314. phydm_get_condi_num_acc_8822b(dm);
  315. PDM_SNPF(out_len, used, output + used, out_len - used,
  316. "\r\n %-35s = %d.%.4d", "condi_num",
  317. condi_num >> 4, phydm_show_fraction_num(condi_num & 0xf, 4));
  318. for (i = 0; i < CN_CNT_MAX; i++) {
  319. PDM_SNPF(out_len, used, output + used, out_len - used,
  320. "\r\n Tone_num[CN>%d]%-21s = %d",
  321. i, " ", dm->phy_dbg_info.condi_num_cdf[i]);
  322. }
  323. *_used = used;
  324. *_out_len = out_len;
  325. }
  326. #endif
  327. void phydm_bb_hw_dbg_info_ac(void *dm_void, u32 *_used, char *output,
  328. u32 *_out_len)
  329. {
  330. struct dm_struct *dm = (struct dm_struct *)dm_void;
  331. u32 used = *_used;
  332. u32 out_len = *_out_len;
  333. char *tmp_string = NULL;
  334. u8 rx_ht_bw, rx_vht_bw, rxsc, rx_ht, bw_idx = 0;
  335. static u8 v_rx_bw;
  336. u32 value32, value32_1, value32_2, value32_3;
  337. struct phydm_cfo_rpt cfo;
  338. u8 i = 0;
  339. static u8 tail, parity, rsv, vrsv, smooth, htsound, agg;
  340. static u8 stbc, vstbc, fec, fecext, sgi, sgiext, htltf, vgid, v_nsts;
  341. static u8 vtxops, vrsv2, vbrsv, bf, vbcrc;
  342. static u16 h_length, htcrc8, length;
  343. static u16 vpaid;
  344. static u16 v_length, vhtcrc8, v_mcss, v_tail, vb_tail;
  345. static u8 hmcss, hrx_bw;
  346. u8 pwdb;
  347. s8 rxevm_0, rxevm_1, rxevm_2;
  348. u8 rf_gain[4];
  349. u8 rx_snr[4];
  350. s32 sig_power;
  351. PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s\n",
  352. "BB Report Info");
  353. /*@ [BW & Mode] =====================================================*/
  354. value32 = odm_get_bb_reg(dm, R_0xf80, MASKDWORD);
  355. rx_ht = (u8)((value32 & 0x180) >> 7);
  356. if (rx_ht == AD_VHT_MODE) {
  357. tmp_string = "VHT";
  358. bw_idx = (u8)((value32 >> 1) & 0x3);
  359. } else if (rx_ht == AD_HT_MODE) {
  360. tmp_string = "HT";
  361. bw_idx = (u8)(value32 & 0x1);
  362. } else {
  363. tmp_string = "Legacy";
  364. bw_idx = 0;
  365. }
  366. PDM_SNPF(out_len, used, output + used, out_len - used,
  367. "\r\n %-35s %s %dM", "mode", tmp_string, (20 << bw_idx));
  368. if (rx_ht != AD_LEGACY_MODE) {
  369. rxsc = (u8)(value32 & 0x78);
  370. if (rxsc == 0)
  371. tmp_string = "duplicate/full bw";
  372. else if (rxsc == 1)
  373. tmp_string = "usc20-1";
  374. else if (rxsc == 2)
  375. tmp_string = "lsc20-1";
  376. else if (rxsc == 3)
  377. tmp_string = "usc20-2";
  378. else if (rxsc == 4)
  379. tmp_string = "lsc20-2";
  380. else if (rxsc == 9)
  381. tmp_string = "usc40";
  382. else if (rxsc == 10)
  383. tmp_string = "lsc40";
  384. PDM_SNPF(out_len, used, output + used, out_len - used,
  385. " %-35s", tmp_string);
  386. }
  387. /*@ [RX signal power and AGC related info] ==========================*/
  388. pwdb = (u8)odm_get_bb_reg(dm, R_0xf90, MASKBYTE1);
  389. sig_power = -110 + (pwdb >> 1);
  390. PDM_SNPF(out_len, used, output + used, out_len - used,
  391. "\r\n %-35s = %d", "OFDM RX Signal Power(dB)", sig_power);
  392. value32 = odm_get_bb_reg(dm, R_0xd14, MASKDWORD);
  393. rx_snr[RF_PATH_A] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/
  394. rf_gain[RF_PATH_A] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);
  395. value32 = odm_get_bb_reg(dm, R_0xd54, MASKDWORD);
  396. rx_snr[RF_PATH_B] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/
  397. rf_gain[RF_PATH_B] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);
  398. value32 = odm_get_bb_reg(dm, R_0xd94, MASKDWORD);
  399. rx_snr[RF_PATH_C] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/
  400. rf_gain[RF_PATH_C] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);
  401. value32 = odm_get_bb_reg(dm, R_0xdd4, MASKDWORD);
  402. rx_snr[RF_PATH_D] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/
  403. rf_gain[RF_PATH_D] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);
  404. PDM_SNPF(out_len, used, output + used, out_len - used,
  405. "\r\n %-35s = %d / %d / %d / %d", "OFDM RX RF Gain(A/B/C/D)",
  406. rf_gain[RF_PATH_A], rf_gain[RF_PATH_B],
  407. rf_gain[RF_PATH_C], rf_gain[RF_PATH_D]);
  408. /*@ [RX counter Info] ===============================================*/
  409. PDM_SNPF(out_len, used, output + used, out_len - used,
  410. "\r\n %-35s = %d", "OFDM CCA cnt",
  411. odm_get_bb_reg(dm, R_0xf08, 0xFFFF0000));
  412. PDM_SNPF(out_len, used, output + used, out_len - used,
  413. "\r\n %-35s = %d", "OFDM SBD Fail cnt",
  414. odm_get_bb_reg(dm, R_0xfd0, 0xFFFF));
  415. value32 = odm_get_bb_reg(dm, R_0xfc4, MASKDWORD);
  416. PDM_SNPF(out_len, used, output + used, out_len - used,
  417. "\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail cnt",
  418. value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16));
  419. PDM_SNPF(out_len, used, output + used, out_len - used,
  420. "\r\n %-35s = %d", "CCK CCA cnt",
  421. odm_get_bb_reg(dm, R_0xfcc, 0xFFFF));
  422. value32 = odm_get_bb_reg(dm, R_0xfbc, MASKDWORD);
  423. PDM_SNPF(out_len, used, output + used, out_len - used,
  424. "\r\n %-35s = %d / %d",
  425. "LSIG (parity Fail/rate Illegal) cnt", value32 & 0xFFFF,
  426. ((value32 & 0xFFFF0000) >> 16));
  427. PDM_SNPF(out_len, used, output + used, out_len - used,
  428. "\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT cnt",
  429. odm_get_bb_reg(dm, R_0xfc0, (0xFFFF0000 >> 16)),
  430. odm_get_bb_reg(dm, R_0xfc8, 0xFFFF));
  431. /*@ [PostFFT Info] =================================================*/
  432. value32 = odm_get_bb_reg(dm, R_0xf8c, MASKDWORD);
  433. rxevm_0 = (s8)((value32 & MASKBYTE2) >> 16);
  434. rxevm_0 /= 2;
  435. if (rxevm_0 < -63)
  436. rxevm_0 = 0;
  437. rxevm_1 = (s8)((value32 & MASKBYTE3) >> 24);
  438. rxevm_1 /= 2;
  439. value32 = odm_get_bb_reg(dm, R_0xf88, MASKDWORD);
  440. rxevm_2 = (s8)((value32 & MASKBYTE2) >> 16);
  441. rxevm_2 /= 2;
  442. if (rxevm_1 < -63)
  443. rxevm_1 = 0;
  444. if (rxevm_2 < -63)
  445. rxevm_2 = 0;
  446. PDM_SNPF(out_len, used, output + used, out_len - used,
  447. "\r\n %-35s = %d / %d / %d", "RXEVM (1ss/2ss/3ss)", rxevm_0,
  448. rxevm_1, rxevm_2);
  449. PDM_SNPF(out_len, used, output + used, out_len - used,
  450. "\r\n %-35s = %d / %d / %d / %d", "RXSNR(A/B/C/D dB)",
  451. rx_snr[RF_PATH_A], rx_snr[RF_PATH_B],
  452. rx_snr[RF_PATH_C], rx_snr[RF_PATH_D]);
  453. value32 = odm_get_bb_reg(dm, R_0xf8c, MASKDWORD);
  454. PDM_SNPF(out_len, used, output + used, out_len - used,
  455. "\r\n %-35s = %d / %d", "CSI_1st /CSI_2nd", value32 & 0xFFFF,
  456. ((value32 & 0xFFFF0000) >> 16));
  457. /*@ [CFO Report Info] ===============================================*/
  458. phydm_get_cfo_info(dm, &cfo);
  459. for (i = 0; i < dm->num_rf_path; i++) {
  460. PDM_SNPF(out_len, used, output + used, out_len - used,
  461. "\r\n %s[%d] %-28s = {%d, %d, %d, %d, %d}",
  462. "CFO", i, "{S, L, Sec, Acq, End}",
  463. cfo.cfo_rpt_s[i], cfo.cfo_rpt_l[i], cfo.cfo_rpt_sec[i],
  464. cfo.cfo_rpt_acq[i], cfo.cfo_rpt_end[i]);
  465. }
  466. /*@ [L-SIG Content] =================================================*/
  467. value32 = odm_get_bb_reg(dm, R_0xf20, MASKDWORD);
  468. tail = (u8)((value32 & 0xfc0000) >> 18);/*@[23:18]*/
  469. parity = (u8)((value32 & 0x20000) >> 17);/*@[17]*/
  470. length = (u16)((value32 & 0x1ffe0) >> 5);/*@[16:5]*/
  471. rsv = (u8)((value32 & 0x10) >> 4);/*@[4]*/
  472. PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s",
  473. "L-SIG");
  474. PDM_SNPF(out_len, used, output + used, out_len - used,
  475. "\r\n %-35s = %d M", "rate",
  476. phydm_get_l_sig_rate(dm, (u8)(value32 & 0x0f)));
  477. PDM_SNPF(out_len, used, output + used, out_len - used,
  478. "\r\n %-35s = %x / %d / %d", "Rsv/length/parity", rsv, length,
  479. parity);
  480. if (rx_ht == AD_HT_MODE) {
  481. /*@ [HT SIG 1] ======================================================*/
  482. value32 = odm_get_bb_reg(dm, R_0xf2c, MASKDWORD);
  483. hmcss = (u8)(value32 & 0x7F);
  484. hrx_bw = (u8)((value32 & 0x80) >> 7);
  485. h_length = (u16)((value32 & 0x0fff00) >> 8);
  486. PDM_SNPF(out_len, used, output + used, out_len - used,
  487. "\r\n %-35s", "HT-SIG1");
  488. PDM_SNPF(out_len, used, output + used, out_len - used,
  489. "\r\n %-35s = %d / %d / %d", "MCS/BW/length",
  490. hmcss, hrx_bw, h_length);
  491. /*@ [HT SIG 2] ======================================================*/
  492. value32 = odm_get_bb_reg(dm, R_0xf30, MASKDWORD);
  493. smooth = (u8)(value32 & 0x01);
  494. htsound = (u8)((value32 & 0x02) >> 1);
  495. rsv = (u8)((value32 & 0x04) >> 2);
  496. agg = (u8)((value32 & 0x08) >> 3);
  497. stbc = (u8)((value32 & 0x30) >> 4);
  498. fec = (u8)((value32 & 0x40) >> 6);
  499. sgi = (u8)((value32 & 0x80) >> 7);
  500. htltf = (u8)((value32 & 0x300) >> 8);
  501. htcrc8 = (u16)((value32 & 0x3fc00) >> 10);
  502. tail = (u8)((value32 & 0xfc0000) >> 18);
  503. PDM_SNPF(out_len, used, output + used, out_len - used,
  504. "\r\n %-35s",
  505. "HT-SIG2");
  506. PDM_SNPF(out_len, used, output + used, out_len - used,
  507. "\r\n %-35s = %x / %x / %x / %x / %x / %x",
  508. "Smooth/NoSound/Rsv/Aggregate/STBC/LDPC",
  509. smooth, htsound, rsv, agg, stbc, fec);
  510. PDM_SNPF(out_len, used, output + used, out_len - used,
  511. "\r\n %-35s = %x / %x / %x / %x",
  512. "SGI/E-HT-LTFs/CRC/tail",
  513. sgi, htltf, htcrc8, tail);
  514. } else if (rx_ht == AD_VHT_MODE) {
  515. /*@ [VHT SIG A1] ====================================================*/
  516. value32 = odm_get_bb_reg(dm, R_0xf2c, MASKDWORD);
  517. v_rx_bw = (u8)(value32 & 0x03);
  518. vrsv = (u8)((value32 & 0x04) >> 2);
  519. vstbc = (u8)((value32 & 0x08) >> 3);
  520. vgid = (u8)((value32 & 0x3f0) >> 4);
  521. v_nsts = (u8)(((value32 & 0x1c00) >> 10) + 1);
  522. vpaid = (u16)((value32 & 0x3fe000) >> 13);
  523. vtxops = (u8)((value32 & 0x400000) >> 22);
  524. vrsv2 = (u8)((value32 & 0x800000) >> 23);
  525. PDM_SNPF(out_len, used, output + used, out_len - used,
  526. "\r\n %-35s",
  527. "VHT-SIG-A1");
  528. PDM_SNPF(out_len, used, output + used, out_len - used,
  529. "\r\n %-35s = %x / %x / %x / %x / %x / %x / %x / %x",
  530. "BW/Rsv1/STBC/GID/Nsts/PAID/TXOPPS/Rsv2", v_rx_bw,
  531. vrsv, vstbc, vgid, v_nsts, vpaid, vtxops, vrsv2);
  532. /*@ [VHT SIG A2] ====================================================*/
  533. value32 = odm_get_bb_reg(dm, R_0xf30, MASKDWORD);
  534. /* @sgi=(u8)(value32&0x01); */
  535. sgiext = (u8)(value32 & 0x03);
  536. /* @fec = (u8)(value32&0x04); */
  537. fecext = (u8)((value32 & 0x0C) >> 2);
  538. v_mcss = (u8)((value32 & 0xf0) >> 4);
  539. bf = (u8)((value32 & 0x100) >> 8);
  540. vrsv = (u8)((value32 & 0x200) >> 9);
  541. vhtcrc8 = (u16)((value32 & 0x3fc00) >> 10);
  542. v_tail = (u8)((value32 & 0xfc0000) >> 18);
  543. PDM_SNPF(out_len, used, output + used, out_len - used,
  544. "\r\n %-35s", "VHT-SIG-A2");
  545. PDM_SNPF(out_len, used, output + used, out_len - used,
  546. "\r\n %-35s = %x / %x / %x / %x / %x / %x / %x",
  547. "SGI/FEC/MCS/BF/Rsv/CRC/tail",
  548. sgiext, fecext, v_mcss, bf, vrsv, vhtcrc8, v_tail);
  549. /*@ [VHT SIG B] ====================================================*/
  550. value32 = odm_get_bb_reg(dm, R_0xf34, MASKDWORD);
  551. #if 0
  552. v_length = (u16)(value32 & 0x1fffff);
  553. vbrsv = (u8)((value32 & 0x600000) >> 21);
  554. vb_tail = (u16)((value32 & 0x1f800000) >> 23);
  555. vbcrc = (u8)((value32 & 0x80000000) >> 31);
  556. #endif
  557. PDM_SNPF(out_len, used, output + used, out_len - used,
  558. "\r\n %-35s", "VHT-SIG-B");
  559. PDM_SNPF(out_len, used, output + used, out_len - used,
  560. "\r\n %-35s = %x",
  561. "Codeword", value32);
  562. #if 0
  563. PDM_SNPF(out_len, used, output + used, out_len - used,
  564. "\r\n %-35s = %x / %x / %x / %x",
  565. "length/Rsv/tail/CRC",
  566. v_length, vbrsv, vb_tail, vbcrc);
  567. #endif
  568. }
  569. *_used = used;
  570. *_out_len = out_len;
  571. }
  572. #endif
  573. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  574. void phydm_bb_hw_dbg_info_jgr3(void *dm_void, u32 *_used, char *output,
  575. u32 *_out_len)
  576. {
  577. struct dm_struct *dm = (struct dm_struct *)dm_void;
  578. u32 used = *_used;
  579. u32 out_len = *_out_len;
  580. char *tmp_string = NULL;
  581. u8 rx_ht_bw = 0, rx_vht_bw = 0, rx_ht = 0;
  582. static u8 v_rx_bw;
  583. u32 value32 = 0;
  584. u8 i = 0;
  585. static u8 tail, parity, rsv, vrsv, smooth, htsound, agg;
  586. static u8 stbc, vstbc, fec, fecext, sgi, sgiext, htltf, vgid, v_nsts;
  587. static u8 vtxops, vrsv2, vbrsv, bf, vbcrc;
  588. static u16 h_length, htcrc8, length;
  589. static u16 vpaid;
  590. static u16 v_length, vhtcrc8, v_mcss, v_tail, vb_tail;
  591. static u8 hmcss, hrx_bw;
  592. PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s\n",
  593. "BB Report Info");
  594. /*@ [Mode] =====================================================*/
  595. value32 = odm_get_bb_reg(dm, R_0x2c20, MASKDWORD);
  596. rx_ht = (u8)((value32 & 0xC0000) >> 18);
  597. if (rx_ht == AD_VHT_MODE)
  598. tmp_string = "VHT";
  599. else if (rx_ht == AD_HT_MODE)
  600. tmp_string = "HT";
  601. else
  602. tmp_string = "Legacy";
  603. PDM_SNPF(out_len, used, output + used, out_len - used,
  604. "\r\n %-35s %s", "mode", tmp_string);
  605. /*@ [RX counter Info] ===============================================*/
  606. PDM_SNPF(out_len, used, output + used, out_len - used,
  607. "\r\n %-35s = %d", "OFDM CCA cnt",
  608. odm_get_bb_reg(dm, R_0x2c08, 0xFFFF0000));
  609. PDM_SNPF(out_len, used, output + used, out_len - used,
  610. "\r\n %-35s = %d", "OFDM SBD Fail cnt",
  611. odm_get_bb_reg(dm, R_0x2d20, 0xFFFF0000));
  612. value32 = odm_get_bb_reg(dm, R_0x2d0c, MASKDWORD);
  613. PDM_SNPF(out_len, used, output + used, out_len - used,
  614. "\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail cnt",
  615. value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16));
  616. PDM_SNPF(out_len, used, output + used, out_len - used,
  617. "\r\n %-35s = %d", "CCK CCA cnt",
  618. odm_get_bb_reg(dm, R_0x2c08, 0xFFFF));
  619. PDM_SNPF(out_len, used, output + used, out_len - used,
  620. "\r\n %-35s = %d / %d",
  621. "LSIG (parity Fail/rate Illegal) cnt",
  622. odm_get_bb_reg(dm, R_0x2d04, 0xFFFF0000),
  623. odm_get_bb_reg(dm, R_0x2d08, 0xFFFF));
  624. value32 = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);
  625. PDM_SNPF(out_len, used, output + used, out_len - used,
  626. "\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT cnt",
  627. value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16));
  628. /*@ [L-SIG Content] =================================================*/
  629. value32 = odm_get_bb_reg(dm, R_0x2c20, MASKDWORD);
  630. parity = (u8)((value32 & 0x20000) >> 17);/*@[17]*/
  631. length = (u16)((value32 & 0x1ffe0) >> 5);/*@[16:5]*/
  632. rsv = (u8)((value32 & 0x10) >> 4);/*@[4]*/
  633. PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s",
  634. "L-SIG");
  635. PDM_SNPF(out_len, used, output + used, out_len - used,
  636. "\r\n %-35s = %d M", "rate",
  637. phydm_get_l_sig_rate(dm, (u8)(value32 & 0x0f)));
  638. PDM_SNPF(out_len, used, output + used, out_len - used,
  639. "\r\n %-35s = %x / %d / %d", "Rsv/length/parity", rsv, length,
  640. parity);
  641. if (rx_ht == AD_HT_MODE) {
  642. /*@ [HT SIG 1] ======================================================*/
  643. value32 = odm_get_bb_reg(dm, R_0x2c2c, MASKDWORD);
  644. hmcss = (u8)(value32 & 0x7F);
  645. hrx_bw = (u8)((value32 & 0x80) >> 7);
  646. h_length = (u16)((value32 & 0x0fff00) >> 8);
  647. PDM_SNPF(out_len, used, output + used, out_len - used,
  648. "\r\n %-35s", "HT-SIG1");
  649. PDM_SNPF(out_len, used, output + used, out_len - used,
  650. "\r\n %-35s = %d / %d / %d", "MCS/BW/length",
  651. hmcss, hrx_bw, h_length);
  652. /*@ [HT SIG 2] ======================================================*/
  653. value32 = odm_get_bb_reg(dm, R_0x2c30, MASKDWORD);
  654. smooth = (u8)(value32 & 0x01);
  655. htsound = (u8)((value32 & 0x02) >> 1);
  656. rsv = (u8)((value32 & 0x04) >> 2);
  657. agg = (u8)((value32 & 0x08) >> 3);
  658. stbc = (u8)((value32 & 0x30) >> 4);
  659. fec = (u8)((value32 & 0x40) >> 6);
  660. sgi = (u8)((value32 & 0x80) >> 7);
  661. htltf = (u8)((value32 & 0x300) >> 8);
  662. htcrc8 = (u16)((value32 & 0x3fc00) >> 10);
  663. tail = (u8)((value32 & 0xfc0000) >> 18);
  664. PDM_SNPF(out_len, used, output + used, out_len - used,
  665. "\r\n %-35s",
  666. "HT-SIG2");
  667. PDM_SNPF(out_len, used, output + used, out_len - used,
  668. "\r\n %-35s = %x / %x / %x / %x / %x / %x",
  669. "Smooth/NoSound/Rsv/Aggregate/STBC/LDPC",
  670. smooth, htsound, rsv, agg, stbc, fec);
  671. PDM_SNPF(out_len, used, output + used, out_len - used,
  672. "\r\n %-35s = %x / %x / %x / %x",
  673. "SGI/E-HT-LTFs/CRC/tail",
  674. sgi, htltf, htcrc8, tail);
  675. } else if (rx_ht == AD_VHT_MODE) {
  676. /*@ [VHT SIG A1] ====================================================*/
  677. value32 = odm_get_bb_reg(dm, R_0x2c2c, MASKDWORD);
  678. v_rx_bw = (u8)(value32 & 0x03);
  679. vrsv = (u8)((value32 & 0x04) >> 2);
  680. vstbc = (u8)((value32 & 0x08) >> 3);
  681. vgid = (u8)((value32 & 0x3f0) >> 4);
  682. v_nsts = (u8)(((value32 & 0x1c00) >> 10) + 1);
  683. vpaid = (u16)((value32 & 0x3fe000) >> 13);
  684. vtxops = (u8)((value32 & 0x400000) >> 22);
  685. vrsv2 = (u8)((value32 & 0x800000) >> 23);
  686. PDM_SNPF(out_len, used, output + used, out_len - used,
  687. "\r\n %-35s",
  688. "VHT-SIG-A1");
  689. PDM_SNPF(out_len, used, output + used, out_len - used,
  690. "\r\n %-35s = %x / %x / %x / %x / %x / %x / %x / %x",
  691. "BW/Rsv1/STBC/GID/Nsts/PAID/TXOPPS/Rsv2", v_rx_bw,
  692. vrsv, vstbc, vgid, v_nsts, vpaid, vtxops, vrsv2);
  693. /*@ [VHT SIG A2] ====================================================*/
  694. value32 = odm_get_bb_reg(dm, R_0x2c30, MASKDWORD);
  695. /* @sgi=(u8)(value32&0x01); */
  696. sgiext = (u8)(value32 & 0x03);
  697. /* @fec = (u8)(value32&0x04); */
  698. fecext = (u8)((value32 & 0x0C) >> 2);
  699. v_mcss = (u8)((value32 & 0xf0) >> 4);
  700. bf = (u8)((value32 & 0x100) >> 8);
  701. vrsv = (u8)((value32 & 0x200) >> 9);
  702. vhtcrc8 = (u16)((value32 & 0x3fc00) >> 10);
  703. v_tail = (u8)((value32 & 0xfc0000) >> 18);
  704. PDM_SNPF(out_len, used, output + used, out_len - used,
  705. "\r\n %-35s", "VHT-SIG-A2");
  706. PDM_SNPF(out_len, used, output + used, out_len - used,
  707. "\r\n %-35s = %x / %x / %x / %x / %x / %x / %x",
  708. "SGI/FEC/MCS/BF/Rsv/CRC/tail",
  709. sgiext, fecext, v_mcss, bf, vrsv, vhtcrc8, v_tail);
  710. /*@ [VHT SIG B] ====================================================*/
  711. value32 = odm_get_bb_reg(dm, R_0x2c34, MASKDWORD);
  712. PDM_SNPF(out_len, used, output + used, out_len - used,
  713. "\r\n %-35s", "VHT-SIG-B");
  714. PDM_SNPF(out_len, used, output + used, out_len - used,
  715. "\r\n %-35s = %x",
  716. "Codeword", value32);
  717. if (v_rx_bw == 0) {
  718. v_length = (u16)(value32 & 0x1ffff);
  719. vbrsv = (u8)((value32 & 0xE0000) >> 17);
  720. vb_tail = (u16)((value32 & 0x03F00000) >> 20);
  721. } else if (v_rx_bw == 1) {
  722. v_length = (u16)(value32 & 0x7FFFF);
  723. vbrsv = (u8)((value32 & 180000) >> 19);
  724. vb_tail = (u16)((value32 & 0x07E00000) >> 21);
  725. } else if (v_rx_bw == 2) {
  726. v_length = (u16)(value32 & 0x1fffff);
  727. vbrsv = (u8)((value32 & 0x600000) >> 21);
  728. vb_tail = (u16)((value32 & 0x1f800000) >> 23);
  729. }
  730. vbcrc = (u8)((value32 & 0x80000000) >> 31);
  731. PDM_SNPF(out_len, used, output + used, out_len - used,
  732. "\r\n %-35s = %x / %x / %x / %x",
  733. "length/Rsv/tail/CRC",
  734. v_length, vbrsv, vb_tail, vbcrc);
  735. }
  736. *_used = used;
  737. *_out_len = out_len;
  738. }
  739. #endif
  740. u8 phydm_get_l_sig_rate(void *dm_void, u8 rate_idx_l_sig)
  741. {
  742. u8 rate_idx = 0xff;
  743. switch (rate_idx_l_sig) {
  744. case 0x0b:
  745. rate_idx = 6;
  746. break;
  747. case 0x0f:
  748. rate_idx = 9;
  749. break;
  750. case 0x0a:
  751. rate_idx = 12;
  752. break;
  753. case 0x0e:
  754. rate_idx = 18;
  755. break;
  756. case 0x09:
  757. rate_idx = 24;
  758. break;
  759. case 0x0d:
  760. rate_idx = 36;
  761. break;
  762. case 0x08:
  763. rate_idx = 48;
  764. break;
  765. case 0x0c:
  766. rate_idx = 54;
  767. break;
  768. default:
  769. rate_idx = 0xff;
  770. break;
  771. }
  772. return rate_idx;
  773. }
  774. void phydm_bb_hw_dbg_info(void *dm_void, char input[][16], u32 *_used,
  775. char *output, u32 *_out_len)
  776. {
  777. struct dm_struct *dm = (struct dm_struct *)dm_void;
  778. u32 used = *_used;
  779. u32 out_len = *_out_len;
  780. switch (dm->ic_ip_series) {
  781. #if (ODM_IC_11N_SERIES_SUPPORT)
  782. case PHYDM_IC_N:
  783. phydm_bb_hw_dbg_info_n(dm, &used, output, &out_len);
  784. break;
  785. #endif
  786. #if (ODM_IC_11AC_SERIES_SUPPORT)
  787. case PHYDM_IC_AC:
  788. phydm_bb_hw_dbg_info_ac(dm, &used, output, &out_len);
  789. phydm_reset_bb_hw_cnt_ac(dm);
  790. #if (RTL8822B_SUPPORT)
  791. phydm_bb_hw_dbg_info_8822b(dm, &used, output, &out_len);
  792. #endif
  793. break;
  794. #endif
  795. #ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
  796. case PHYDM_IC_JGR3:
  797. phydm_bb_hw_dbg_info_jgr3(dm, &used, output, &out_len);
  798. break;
  799. #endif
  800. default:
  801. break;
  802. }
  803. *_used = used;
  804. *_out_len = out_len;
  805. }
  806. #endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/
  807. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  808. void phydm_basic_dbg_msg_cli_win(void *dm_void, char *buf)
  809. {
  810. struct dm_struct *dm = (struct dm_struct *)dm_void;
  811. struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
  812. struct phydm_cfo_track_struct *cfo_t = &dm->dm_cfo_track;
  813. struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
  814. struct phydm_phystatus_statistic *dbg_s = &dbg->physts_statistic_info;
  815. struct phydm_phystatus_avg *dbg_avg = &dbg->phystatus_statistic_avg;
  816. u16 macid, phydm_macid, client_cnt = 0;
  817. u8 i = 0;
  818. u8 rate_num = dm->num_rf_path;
  819. u8 ss_ofst = 0;
  820. struct cmn_sta_info *entry = NULL;
  821. char dbg_buf[PHYDM_SNPRINT_SIZE] = {0};
  822. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n PHYDM Common Dbg Msg --------->");
  823. RT_PRINT(buf);
  824. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n System up time=%d", dm->phydm_sys_up_time);
  825. RT_PRINT(buf);
  826. if (dm->is_linked) {
  827. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n ID=((%d)), BW=((%d)), fc=((CH-%d))",
  828. dm->curr_station_id, 20 << *dm->band_width, *dm->channel);
  829. RT_PRINT(buf);
  830. if (((*dm->channel <= 14) && (*dm->band_width == CHANNEL_WIDTH_40)) &&
  831. (dm->support_ic_type & ODM_IC_11N_SERIES)) {
  832. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Primary CCA at ((%s SB))",
  833. (*dm->sec_ch_offset == SECOND_CH_AT_LSB) ? "U" : "L");
  834. RT_PRINT(buf);
  835. }
  836. if ((dm->support_ic_type & PHYSTS_2ND_TYPE_IC) || dm->rx_rate > ODM_RATE11M) {
  837. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [AGC Idx] {0x%x, 0x%x, 0x%x, 0x%x}",
  838. dm->ofdm_agc_idx[0], dm->ofdm_agc_idx[1],
  839. dm->ofdm_agc_idx[2], dm->ofdm_agc_idx[3]);
  840. RT_PRINT(buf);
  841. } else {
  842. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [CCK AGC Idx] {LNA,VGA}={0x%x, 0x%x}",
  843. dm->cck_lna_idx, dm->cck_vga_idx);
  844. RT_PRINT(buf);
  845. }
  846. phydm_print_rate_2_buff(dm, dm->rx_rate, dbg_buf, PHYDM_SNPRINT_SIZE);
  847. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n RSSI:{%d, %d, %d, %d}, RxRate:%s (0x%x)",
  848. (dm->rssi_a == 0xff) ? 0 : dm->rssi_a,
  849. (dm->rssi_b == 0xff) ? 0 : dm->rssi_b,
  850. (dm->rssi_c == 0xff) ? 0 : dm->rssi_c,
  851. (dm->rssi_d == 0xff) ? 0 : dm->rssi_d,
  852. dbg_buf, dm->rx_rate);
  853. RT_PRINT(buf);
  854. phydm_print_rate_2_buff(dm, dm->phy_dbg_info.beacon_phy_rate, dbg_buf, PHYDM_SNPRINT_SIZE);
  855. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Beacon_cnt=%d, rate_idx:%s (0x%x)",
  856. dm->phy_dbg_info.beacon_cnt_in_period,
  857. dbg_buf,
  858. dm->phy_dbg_info.beacon_phy_rate);
  859. RT_PRINT(buf);
  860. /*Show phydm_rx_rate_distribution;*/
  861. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [RxRate Cnt] =============>");
  862. RT_PRINT(buf);
  863. /*@======CCK=================================================*/
  864. if (*dm->channel <= 14) {
  865. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * CCK = {%d, %d, %d, %d}",
  866. dbg->num_qry_legacy_pkt[0], dbg->num_qry_legacy_pkt[1],
  867. dbg->num_qry_legacy_pkt[2], dbg->num_qry_legacy_pkt[3]);
  868. RT_PRINT(buf);
  869. }
  870. /*@======OFDM================================================*/
  871. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * OFDM = {%d, %d, %d, %d, %d, %d, %d, %d}",
  872. dbg->num_qry_legacy_pkt[4], dbg->num_qry_legacy_pkt[5],
  873. dbg->num_qry_legacy_pkt[6], dbg->num_qry_legacy_pkt[7],
  874. dbg->num_qry_legacy_pkt[8], dbg->num_qry_legacy_pkt[9],
  875. dbg->num_qry_legacy_pkt[10], dbg->num_qry_legacy_pkt[11]);
  876. RT_PRINT(buf);
  877. /*@======HT==================================================*/
  878. if (dbg->ht_pkt_not_zero) {
  879. for (i = 0; i < rate_num; i++) {
  880. ss_ofst = (i << 3);
  881. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}",
  882. (ss_ofst), (ss_ofst + 7),
  883. dbg->num_qry_ht_pkt[ss_ofst + 0], dbg->num_qry_ht_pkt[ss_ofst + 1],
  884. dbg->num_qry_ht_pkt[ss_ofst + 2], dbg->num_qry_ht_pkt[ss_ofst + 3],
  885. dbg->num_qry_ht_pkt[ss_ofst + 4], dbg->num_qry_ht_pkt[ss_ofst + 5],
  886. dbg->num_qry_ht_pkt[ss_ofst + 6], dbg->num_qry_ht_pkt[ss_ofst + 7]);
  887. RT_PRINT(buf);
  888. }
  889. if (dbg->low_bw_20_occur) {
  890. for (i = 0; i < rate_num; i++) {
  891. ss_ofst = (i << 3);
  892. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * [Low BW 20M] HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}",
  893. (ss_ofst), (ss_ofst + 7),
  894. dbg->num_qry_pkt_sc_20m[ss_ofst + 0], dbg->num_qry_pkt_sc_20m[ss_ofst + 1],
  895. dbg->num_qry_pkt_sc_20m[ss_ofst + 2], dbg->num_qry_pkt_sc_20m[ss_ofst + 3],
  896. dbg->num_qry_pkt_sc_20m[ss_ofst + 4], dbg->num_qry_pkt_sc_20m[ss_ofst + 5],
  897. dbg->num_qry_pkt_sc_20m[ss_ofst + 6], dbg->num_qry_pkt_sc_20m[ss_ofst + 7]);
  898. RT_PRINT(buf);
  899. }
  900. }
  901. }
  902. #if ODM_IC_11AC_SERIES_SUPPORT
  903. /*@======VHT=================================================*/
  904. if (dbg->vht_pkt_not_zero) {
  905. for (i = 0; i < rate_num; i++) {
  906. ss_ofst = 10 * i;
  907. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}",
  908. (i + 1),
  909. dbg->num_qry_vht_pkt[ss_ofst + 0], dbg->num_qry_vht_pkt[ss_ofst + 1],
  910. dbg->num_qry_vht_pkt[ss_ofst + 2], dbg->num_qry_vht_pkt[ss_ofst + 3],
  911. dbg->num_qry_vht_pkt[ss_ofst + 4], dbg->num_qry_vht_pkt[ss_ofst + 5],
  912. dbg->num_qry_vht_pkt[ss_ofst + 6], dbg->num_qry_vht_pkt[ss_ofst + 7],
  913. dbg->num_qry_vht_pkt[ss_ofst + 8], dbg->num_qry_vht_pkt[ss_ofst + 9]);
  914. RT_PRINT(buf);
  915. }
  916. if (dbg->low_bw_20_occur) {
  917. for (i = 0; i < rate_num; i++) {
  918. ss_ofst = 10 * i;
  919. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n *[Low BW 20M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}",
  920. (i + 1),
  921. dbg->num_qry_pkt_sc_20m[ss_ofst + 0], dbg->num_qry_pkt_sc_20m[ss_ofst + 1],
  922. dbg->num_qry_pkt_sc_20m[ss_ofst + 2], dbg->num_qry_pkt_sc_20m[ss_ofst + 3],
  923. dbg->num_qry_pkt_sc_20m[ss_ofst + 4], dbg->num_qry_pkt_sc_20m[ss_ofst + 5],
  924. dbg->num_qry_pkt_sc_20m[ss_ofst + 6], dbg->num_qry_pkt_sc_20m[ss_ofst + 7],
  925. dbg->num_qry_pkt_sc_20m[ss_ofst + 8], dbg->num_qry_pkt_sc_20m[ss_ofst + 9]);
  926. RT_PRINT(buf);
  927. }
  928. }
  929. if (dbg->low_bw_40_occur) {
  930. for (i = 0; i < rate_num; i++) {
  931. ss_ofst = 10 * i;
  932. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n *[Low BW 40M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}",
  933. (i + 1),
  934. dbg->num_qry_pkt_sc_40m[ss_ofst + 0], dbg->num_qry_pkt_sc_40m[ss_ofst + 1],
  935. dbg->num_qry_pkt_sc_40m[ss_ofst + 2], dbg->num_qry_pkt_sc_40m[ss_ofst + 3],
  936. dbg->num_qry_pkt_sc_40m[ss_ofst + 4], dbg->num_qry_pkt_sc_40m[ss_ofst + 5],
  937. dbg->num_qry_pkt_sc_40m[ss_ofst + 6], dbg->num_qry_pkt_sc_40m[ss_ofst + 7],
  938. dbg->num_qry_pkt_sc_40m[ss_ofst + 8], dbg->num_qry_pkt_sc_40m[ss_ofst + 9]);
  939. RT_PRINT(buf);
  940. }
  941. }
  942. }
  943. #endif
  944. phydm_reset_rx_rate_distribution(dm);
  945. //1 Show phydm_avg_phystatus_val
  946. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [Avg PHY Statistic] ==============>");
  947. RT_PRINT(buf);
  948. phydm_reset_phystatus_avg(dm);
  949. /*@CCK*/
  950. dbg_avg->rssi_cck_avg = (u8)((dbg_s->rssi_cck_cnt != 0) ? (dbg_s->rssi_cck_sum / dbg_s->rssi_cck_cnt) : 0);
  951. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * cck Cnt= ((%d)) RSSI:{%d}",
  952. dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg);
  953. RT_PRINT(buf);
  954. /*OFDM*/
  955. if (dbg_s->rssi_ofdm_cnt != 0) {
  956. dbg_avg->rssi_ofdm_avg = (u8)(dbg_s->rssi_ofdm_sum / dbg_s->rssi_ofdm_cnt);
  957. dbg_avg->evm_ofdm_avg = (u8)(dbg_s->evm_ofdm_sum / dbg_s->rssi_ofdm_cnt);
  958. dbg_avg->snr_ofdm_avg = (u8)(dbg_s->snr_ofdm_sum / dbg_s->rssi_ofdm_cnt);
  959. }
  960. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * ofdm Cnt= ((%d)) RSSI:{%d} EVM:{%d} SNR:{%d}",
  961. dbg_s->rssi_ofdm_cnt, dbg_avg->rssi_ofdm_avg,
  962. dbg_avg->evm_ofdm_avg, dbg_avg->snr_ofdm_avg);
  963. RT_PRINT(buf);
  964. if (dbg_s->rssi_1ss_cnt != 0) {
  965. dbg_avg->rssi_1ss_avg = (u8)(dbg_s->rssi_1ss_sum / dbg_s->rssi_1ss_cnt);
  966. dbg_avg->evm_1ss_avg = (u8)(dbg_s->evm_1ss_sum / dbg_s->rssi_1ss_cnt);
  967. dbg_avg->snr_1ss_avg = (u8)(dbg_s->snr_1ss_sum / dbg_s->rssi_1ss_cnt);
  968. }
  969. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 1-ss Cnt= ((%d)) RSSI:{%d} EVM:{%d} SNR:{%d}",
  970. dbg_s->rssi_1ss_cnt, dbg_avg->rssi_1ss_avg,
  971. dbg_avg->evm_1ss_avg, dbg_avg->snr_1ss_avg);
  972. RT_PRINT(buf);
  973. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  974. if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS)) {
  975. if (dbg_s->rssi_2ss_cnt != 0) {
  976. dbg_avg->rssi_2ss_avg[0] = (u8)(dbg_s->rssi_2ss_sum[0] / dbg_s->rssi_2ss_cnt);
  977. dbg_avg->rssi_2ss_avg[1] = (u8)(dbg_s->rssi_2ss_sum[1] / dbg_s->rssi_2ss_cnt);
  978. dbg_avg->evm_2ss_avg[0] = (u8)(dbg_s->evm_2ss_sum[0] / dbg_s->rssi_2ss_cnt);
  979. dbg_avg->evm_2ss_avg[1] = (u8)(dbg_s->evm_2ss_sum[1] / dbg_s->rssi_2ss_cnt);
  980. dbg_avg->snr_2ss_avg[0] = (u8)(dbg_s->snr_2ss_sum[0] / dbg_s->rssi_2ss_cnt);
  981. dbg_avg->snr_2ss_avg[1] = (u8)(dbg_s->snr_2ss_sum[1] / dbg_s->rssi_2ss_cnt);
  982. }
  983. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 2-ss Cnt= ((%d)) RSSI:{%d, %d}, EVM:{%d, %d}, SNR:{%d, %d}",
  984. dbg_s->rssi_2ss_cnt, dbg_avg->rssi_2ss_avg[0],
  985. dbg_avg->rssi_2ss_avg[1], dbg_avg->evm_2ss_avg[0],
  986. dbg_avg->evm_2ss_avg[1], dbg_avg->snr_2ss_avg[0],
  987. dbg_avg->snr_2ss_avg[1]);
  988. RT_PRINT(buf);
  989. }
  990. #endif
  991. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  992. if (dm->support_ic_type & (PHYDM_IC_ABOVE_3SS)) {
  993. if (dbg_s->rssi_3ss_cnt != 0) {
  994. dbg_avg->rssi_3ss_avg[0] = (u8)(dbg_s->rssi_3ss_sum[0] / dbg_s->rssi_3ss_cnt);
  995. dbg_avg->rssi_3ss_avg[1] = (u8)(dbg_s->rssi_3ss_sum[1] / dbg_s->rssi_3ss_cnt);
  996. dbg_avg->rssi_3ss_avg[2] = (u8)(dbg_s->rssi_3ss_sum[2] / dbg_s->rssi_3ss_cnt);
  997. dbg_avg->evm_3ss_avg[0] = (u8)(dbg_s->evm_3ss_sum[0] / dbg_s->rssi_3ss_cnt);
  998. dbg_avg->evm_3ss_avg[1] = (u8)(dbg_s->evm_3ss_sum[1] / dbg_s->rssi_3ss_cnt);
  999. dbg_avg->evm_3ss_avg[2] = (u8)(dbg_s->evm_3ss_sum[2] / dbg_s->rssi_3ss_cnt);
  1000. dbg_avg->snr_3ss_avg[0] = (u8)(dbg_s->snr_3ss_sum[0] / dbg_s->rssi_3ss_cnt);
  1001. dbg_avg->snr_3ss_avg[1] = (u8)(dbg_s->snr_3ss_sum[1] / dbg_s->rssi_3ss_cnt);
  1002. dbg_avg->snr_3ss_avg[2] = (u8)(dbg_s->snr_3ss_sum[2] / dbg_s->rssi_3ss_cnt);
  1003. }
  1004. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 3-ss Cnt= ((%d)) RSSI:{%d, %d, %d} EVM:{%d, %d, %d} SNR:{%d, %d, %d}",
  1005. dbg_s->rssi_3ss_cnt, dbg_avg->rssi_3ss_avg[0],
  1006. dbg_avg->rssi_3ss_avg[1], dbg_avg->rssi_3ss_avg[2],
  1007. dbg_avg->evm_3ss_avg[0], dbg_avg->evm_3ss_avg[1],
  1008. dbg_avg->evm_3ss_avg[2], dbg_avg->snr_3ss_avg[0],
  1009. dbg_avg->snr_3ss_avg[1], dbg_avg->snr_3ss_avg[2]);
  1010. RT_PRINT(buf);
  1011. }
  1012. #endif
  1013. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  1014. if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
  1015. if (dbg_s->rssi_4ss_cnt != 0) {
  1016. dbg_avg->rssi_4ss_avg[0] = (u8)(dbg_s->rssi_4ss_sum[0] / dbg_s->rssi_4ss_cnt);
  1017. dbg_avg->rssi_4ss_avg[1] = (u8)(dbg_s->rssi_4ss_sum[1] / dbg_s->rssi_4ss_cnt);
  1018. dbg_avg->rssi_4ss_avg[2] = (u8)(dbg_s->rssi_4ss_sum[2] / dbg_s->rssi_4ss_cnt);
  1019. dbg_avg->rssi_4ss_avg[3] = (u8)(dbg_s->rssi_4ss_sum[3] / dbg_s->rssi_4ss_cnt);
  1020. dbg_avg->evm_4ss_avg[0] = (u8)(dbg_s->evm_4ss_sum[0] / dbg_s->rssi_4ss_cnt);
  1021. dbg_avg->evm_4ss_avg[1] = (u8)(dbg_s->evm_4ss_sum[1] / dbg_s->rssi_4ss_cnt);
  1022. dbg_avg->evm_4ss_avg[2] = (u8)(dbg_s->evm_4ss_sum[2] / dbg_s->rssi_4ss_cnt);
  1023. dbg_avg->evm_4ss_avg[3] = (u8)(dbg_s->evm_4ss_sum[3] / dbg_s->rssi_4ss_cnt);
  1024. dbg_avg->snr_4ss_avg[0] = (u8)(dbg_s->snr_4ss_sum[0] / dbg_s->rssi_4ss_cnt);
  1025. dbg_avg->snr_4ss_avg[1] = (u8)(dbg_s->snr_4ss_sum[1] / dbg_s->rssi_4ss_cnt);
  1026. dbg_avg->snr_4ss_avg[2] = (u8)(dbg_s->snr_4ss_sum[2] / dbg_s->rssi_4ss_cnt);
  1027. dbg_avg->snr_4ss_avg[3] = (u8)(dbg_s->snr_4ss_sum[3] / dbg_s->rssi_4ss_cnt);
  1028. }
  1029. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 4-ss Cnt= ((%d)) RSSI:{%d, %d, %d, %d} EVM:{%d, %d, %d, %d} SNR:{%d, %d, %d, %d}",
  1030. dbg_s->rssi_4ss_cnt, dbg_avg->rssi_4ss_avg[0],
  1031. dbg_avg->rssi_4ss_avg[1], dbg_avg->rssi_4ss_avg[2],
  1032. dbg_avg->rssi_4ss_avg[3], dbg_avg->evm_4ss_avg[0],
  1033. dbg_avg->evm_4ss_avg[1], dbg_avg->evm_4ss_avg[2],
  1034. dbg_avg->evm_4ss_avg[3], dbg_avg->snr_4ss_avg[0],
  1035. dbg_avg->snr_4ss_avg[1], dbg_avg->snr_4ss_avg[2],
  1036. dbg_avg->snr_4ss_avg[3]);
  1037. RT_PRINT(buf);
  1038. }
  1039. #endif
  1040. phydm_reset_phystatus_statistic(dm);
  1041. /*@----------------------------------------------------------*/
  1042. /*Print TX rate*/
  1043. for (macid = 0; macid < ODM_ASSOCIATE_ENTRY_NUM; macid++) {
  1044. entry = dm->phydm_sta_info[macid];
  1045. if (!is_sta_active(entry))
  1046. continue;
  1047. phydm_macid = (dm->phydm_macid_table[macid]);
  1048. phydm_print_rate_2_buff(dm, entry->ra_info.curr_tx_rate, dbg_buf, PHYDM_SNPRINT_SIZE);
  1049. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n TxRate[%d]=%s (0x%x)", macid, dbg_buf, entry->ra_info.curr_tx_rate);
  1050. RT_PRINT(buf);
  1051. client_cnt++;
  1052. if (client_cnt >= dm->number_linked_client)
  1053. break;
  1054. }
  1055. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,
  1056. "\r\n TP {Tx, Rx, Total} = {%d, %d, %d}Mbps, Traffic_Load=(%d))",
  1057. dm->tx_tp, dm->rx_tp, dm->total_tp, dm->traffic_load);
  1058. RT_PRINT(buf);
  1059. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n CFO_avg=((%d kHz)), CFO_traking = ((%s%d))",
  1060. cfo_t->CFO_ave_pre,
  1061. ((cfo_t->crystal_cap > cfo_t->def_x_cap) ? "+" : "-"),
  1062. DIFF_2(cfo_t->crystal_cap, cfo_t->def_x_cap));
  1063. RT_PRINT(buf);
  1064. /* @Condition number */
  1065. #if (RTL8822B_SUPPORT)
  1066. if (dm->support_ic_type == ODM_RTL8822B) {
  1067. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Condi_Num=((%d.%.4d))",
  1068. dm->phy_dbg_info.condi_num >> 4,
  1069. phydm_show_fraction_num(dm->phy_dbg_info.condi_num & 0xf, 4));
  1070. RT_PRINT(buf);
  1071. }
  1072. #endif
  1073. #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
  1074. /*STBC or LDPC pkt*/
  1075. if (dm->support_ic_type & PHYSTS_2ND_TYPE_IC)
  1076. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Coding: LDPC=((%s)), STBC=((%s))",
  1077. (dm->phy_dbg_info.is_ldpc_pkt) ? "Y" : "N",
  1078. (dm->phy_dbg_info.is_stbc_pkt) ? "Y" : "N");
  1079. RT_PRINT(buf);
  1080. #endif
  1081. } else {
  1082. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n No Link !!!");
  1083. RT_PRINT(buf);
  1084. }
  1085. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}",
  1086. fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all);
  1087. RT_PRINT(buf);
  1088. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}",
  1089. fa_t->cnt_cck_fail, fa_t->cnt_ofdm_fail, fa_t->cnt_all);
  1090. RT_PRINT(buf);
  1091. #if (ODM_IC_11N_SERIES_SUPPORT)
  1092. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  1093. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,
  1094. "\r\n [OFDM FA Detail] Parity_Fail=%d, Rate_Illegal=%d, CRC8=%d, MCS_fail=%d, Fast_sync=%d, SB_Search_fail=%d",
  1095. fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
  1096. fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail,
  1097. fa_t->cnt_fast_fsync, fa_t->cnt_sb_search_fail);
  1098. RT_PRINT(buf);
  1099. }
  1100. #endif
  1101. RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,
  1102. "\r\n is_linked = %d, Num_client = %d, rssi_min = %d, IGI = 0x%x, bNoisy=%d",
  1103. dm->is_linked, dm->number_linked_client, dm->rssi_min,
  1104. dm->dm_dig_table.cur_ig_value, dm->noisy_decision);
  1105. RT_PRINT(buf);
  1106. }
  1107. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  1108. void phydm_sbd_check(
  1109. struct dm_struct *dm)
  1110. {
  1111. static u32 pkt_cnt;
  1112. static boolean sbd_state;
  1113. u32 sym_count, count, value32;
  1114. if (sbd_state == 0) {
  1115. pkt_cnt++;
  1116. /*read SBD conter once every 5 packets*/
  1117. if (pkt_cnt % 5 == 0) {
  1118. odm_set_timer(dm, &dm->sbdcnt_timer, 0); /*@ms*/
  1119. sbd_state = 1;
  1120. }
  1121. } else { /*read counter*/
  1122. value32 = odm_get_bb_reg(dm, R_0xf98, MASKDWORD);
  1123. sym_count = (value32 & 0x7C000000) >> 26;
  1124. count = (value32 & 0x3F00000) >> 20;
  1125. pr_debug("#SBD# sym_count %d count %d\n", sym_count, count);
  1126. sbd_state = 0;
  1127. }
  1128. }
  1129. #endif
  1130. void phydm_sbd_callback(
  1131. struct phydm_timer_list *timer)
  1132. {
  1133. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  1134. void *adapter = timer->Adapter;
  1135. HAL_DATA_TYPE *hal_data = GET_HAL_DATA((PADAPTER)adapter);
  1136. struct dm_struct *dm = &hal_data->DM_OutSrc;
  1137. #if USE_WORKITEM
  1138. odm_schedule_work_item(&dm->sbdcnt_workitem);
  1139. #else
  1140. phydm_sbd_check(dm);
  1141. #endif
  1142. #endif
  1143. }
  1144. void phydm_sbd_workitem_callback(
  1145. void *context)
  1146. {
  1147. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  1148. void *adapter = (void *)context;
  1149. HAL_DATA_TYPE *hal_data = GET_HAL_DATA((PADAPTER)adapter);
  1150. struct dm_struct *dm = &hal_data->DM_OutSrc;
  1151. phydm_sbd_check(dm);
  1152. #endif
  1153. }
  1154. #endif
  1155. void phydm_reset_rx_rate_distribution(struct dm_struct *dm)
  1156. {
  1157. struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
  1158. odm_memory_set(dm, &dbg->num_qry_legacy_pkt[0], 0,
  1159. (LEGACY_RATE_NUM * 2));
  1160. odm_memory_set(dm, &dbg->num_qry_ht_pkt[0], 0,
  1161. (HT_RATE_NUM * 2));
  1162. odm_memory_set(dm, &dbg->num_qry_pkt_sc_20m[0], 0,
  1163. (LOW_BW_RATE_NUM * 2));
  1164. dbg->ht_pkt_not_zero = false;
  1165. dbg->low_bw_20_occur = false;
  1166. #if ODM_IC_11AC_SERIES_SUPPORT
  1167. odm_memory_set(dm, &dbg->num_qry_vht_pkt[0], 0, VHT_RATE_NUM * 2);
  1168. odm_memory_set(dm, &dbg->num_qry_pkt_sc_40m[0], 0, LOW_BW_RATE_NUM * 2);
  1169. #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) || (defined(PHYSTS_3RD_TYPE_SUPPORT))
  1170. odm_memory_set(dm, &dbg->num_mu_vht_pkt[0], 0, VHT_RATE_NUM * 2);
  1171. #endif
  1172. dbg->vht_pkt_not_zero = false;
  1173. dbg->low_bw_40_occur = false;
  1174. #endif
  1175. }
  1176. void phydm_rx_rate_distribution(void *dm_void)
  1177. {
  1178. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1179. struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
  1180. u8 i = 0;
  1181. u8 rate_num = dm->num_rf_path, ss_ofst = 0;
  1182. PHYDM_DBG(dm, DBG_CMN, "[RxRate Cnt] =============>\n");
  1183. /*@======CCK=========================================================*/
  1184. if (*dm->channel <= 14) {
  1185. PHYDM_DBG(dm, DBG_CMN, "* CCK = {%d, %d, %d, %d}\n",
  1186. dbg->num_qry_legacy_pkt[0],
  1187. dbg->num_qry_legacy_pkt[1],
  1188. dbg->num_qry_legacy_pkt[2],
  1189. dbg->num_qry_legacy_pkt[3]);
  1190. }
  1191. /*@======OFDM========================================================*/
  1192. PHYDM_DBG(dm, DBG_CMN, "* OFDM = {%d, %d, %d, %d, %d, %d, %d, %d}\n",
  1193. dbg->num_qry_legacy_pkt[4], dbg->num_qry_legacy_pkt[5],
  1194. dbg->num_qry_legacy_pkt[6], dbg->num_qry_legacy_pkt[7],
  1195. dbg->num_qry_legacy_pkt[8], dbg->num_qry_legacy_pkt[9],
  1196. dbg->num_qry_legacy_pkt[10], dbg->num_qry_legacy_pkt[11]);
  1197. /*@======HT==========================================================*/
  1198. if (dbg->ht_pkt_not_zero) {
  1199. for (i = 0; i < rate_num; i++) {
  1200. ss_ofst = (i << 3);
  1201. PHYDM_DBG(dm, DBG_CMN,
  1202. "* HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",
  1203. (ss_ofst), (ss_ofst + 7),
  1204. dbg->num_qry_ht_pkt[ss_ofst + 0],
  1205. dbg->num_qry_ht_pkt[ss_ofst + 1],
  1206. dbg->num_qry_ht_pkt[ss_ofst + 2],
  1207. dbg->num_qry_ht_pkt[ss_ofst + 3],
  1208. dbg->num_qry_ht_pkt[ss_ofst + 4],
  1209. dbg->num_qry_ht_pkt[ss_ofst + 5],
  1210. dbg->num_qry_ht_pkt[ss_ofst + 6],
  1211. dbg->num_qry_ht_pkt[ss_ofst + 7]);
  1212. }
  1213. if (dbg->low_bw_20_occur) {
  1214. for (i = 0; i < rate_num; i++) {
  1215. ss_ofst = (i << 3);
  1216. PHYDM_DBG(dm, DBG_CMN,
  1217. "* [Low BW 20M] HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",
  1218. (ss_ofst), (ss_ofst + 7),
  1219. dbg->num_qry_pkt_sc_20m[ss_ofst + 0],
  1220. dbg->num_qry_pkt_sc_20m[ss_ofst + 1],
  1221. dbg->num_qry_pkt_sc_20m[ss_ofst + 2],
  1222. dbg->num_qry_pkt_sc_20m[ss_ofst + 3],
  1223. dbg->num_qry_pkt_sc_20m[ss_ofst + 4],
  1224. dbg->num_qry_pkt_sc_20m[ss_ofst + 5],
  1225. dbg->num_qry_pkt_sc_20m[ss_ofst + 6],
  1226. dbg->num_qry_pkt_sc_20m[ss_ofst + 7]);
  1227. }
  1228. }
  1229. }
  1230. #if ODM_IC_11AC_SERIES_SUPPORT
  1231. /*@======VHT==========================================================*/
  1232. if (dbg->vht_pkt_not_zero) {
  1233. for (i = 0; i < rate_num; i++) {
  1234. ss_ofst = 10 * i;
  1235. PHYDM_DBG(dm, DBG_CMN,
  1236. "* VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}\n",
  1237. (i + 1),
  1238. dbg->num_qry_vht_pkt[ss_ofst + 0],
  1239. dbg->num_qry_vht_pkt[ss_ofst + 1],
  1240. dbg->num_qry_vht_pkt[ss_ofst + 2],
  1241. dbg->num_qry_vht_pkt[ss_ofst + 3],
  1242. dbg->num_qry_vht_pkt[ss_ofst + 4],
  1243. dbg->num_qry_vht_pkt[ss_ofst + 5],
  1244. dbg->num_qry_vht_pkt[ss_ofst + 6],
  1245. dbg->num_qry_vht_pkt[ss_ofst + 7],
  1246. dbg->num_qry_vht_pkt[ss_ofst + 8],
  1247. dbg->num_qry_vht_pkt[ss_ofst + 9]);
  1248. }
  1249. if (dbg->low_bw_20_occur) {
  1250. for (i = 0; i < rate_num; i++) {
  1251. ss_ofst = 10 * i;
  1252. PHYDM_DBG(dm, DBG_CMN,
  1253. "*[Low BW 20M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}\n",
  1254. (i + 1),
  1255. dbg->num_qry_pkt_sc_20m[ss_ofst + 0],
  1256. dbg->num_qry_pkt_sc_20m[ss_ofst + 1],
  1257. dbg->num_qry_pkt_sc_20m[ss_ofst + 2],
  1258. dbg->num_qry_pkt_sc_20m[ss_ofst + 3],
  1259. dbg->num_qry_pkt_sc_20m[ss_ofst + 4],
  1260. dbg->num_qry_pkt_sc_20m[ss_ofst + 5],
  1261. dbg->num_qry_pkt_sc_20m[ss_ofst + 6],
  1262. dbg->num_qry_pkt_sc_20m[ss_ofst + 7],
  1263. dbg->num_qry_pkt_sc_20m[ss_ofst + 8],
  1264. dbg->num_qry_pkt_sc_20m[ss_ofst + 9]);
  1265. }
  1266. }
  1267. if (dbg->low_bw_40_occur) {
  1268. for (i = 0; i < rate_num; i++) {
  1269. ss_ofst = 10 * i;
  1270. PHYDM_DBG(dm, DBG_CMN,
  1271. "*[Low BW 40M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}\n",
  1272. (i + 1),
  1273. dbg->num_qry_pkt_sc_40m[ss_ofst + 0],
  1274. dbg->num_qry_pkt_sc_40m[ss_ofst + 1],
  1275. dbg->num_qry_pkt_sc_40m[ss_ofst + 2],
  1276. dbg->num_qry_pkt_sc_40m[ss_ofst + 3],
  1277. dbg->num_qry_pkt_sc_40m[ss_ofst + 4],
  1278. dbg->num_qry_pkt_sc_40m[ss_ofst + 5],
  1279. dbg->num_qry_pkt_sc_40m[ss_ofst + 6],
  1280. dbg->num_qry_pkt_sc_40m[ss_ofst + 7],
  1281. dbg->num_qry_pkt_sc_40m[ss_ofst + 8],
  1282. dbg->num_qry_pkt_sc_40m[ss_ofst + 9]);
  1283. }
  1284. }
  1285. }
  1286. #endif
  1287. }
  1288. void phydm_print_hist_2_buf(void *dm_void, u16 *val, u16 len, char *buf,
  1289. u16 buf_size)
  1290. {
  1291. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1292. if (len == PHY_HIST_SIZE) {
  1293. PHYDM_SNPRINTF(buf, buf_size,
  1294. "[%.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d]",
  1295. val[0], val[1], val[2], val[3], val[4],
  1296. val[5], val[6], val[7], val[8], val[9],
  1297. val[10], val[11]);
  1298. } else if (len == (PHY_HIST_SIZE - 1)) {
  1299. PHYDM_SNPRINTF(buf, buf_size,
  1300. "[%.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d]",
  1301. val[0], val[1], val[2], val[3], val[4],
  1302. val[5], val[6], val[7], val[8], val[9],
  1303. val[10]);
  1304. }
  1305. }
  1306. void phydm_nss_hitogram(void *dm_void, enum PDM_RATE_TYPE rate_type)
  1307. {
  1308. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1309. struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
  1310. struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;
  1311. char buf[PHYDM_SNPRINT_SIZE] = {0};
  1312. u16 buf_size = PHYDM_SNPRINT_SIZE;
  1313. u16 h_size = PHY_HIST_SIZE;
  1314. u16 *evm_hist = NULL, *snr_hist = NULL;
  1315. u8 i = 0;
  1316. u8 ss = phydm_rate_type_2_num_ss(dm, rate_type);
  1317. for (i = 0; i < ss; i++) {
  1318. if (rate_type == PDM_1SS) {
  1319. evm_hist = &dbg_s->evm_1ss_hist[0];
  1320. snr_hist = &dbg_s->snr_1ss_hist[0];
  1321. } else if (rate_type == PDM_2SS) {
  1322. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  1323. evm_hist = &dbg_s->evm_2ss_hist[i][0];
  1324. snr_hist = &dbg_s->snr_2ss_hist[i][0];
  1325. #endif
  1326. } else if (rate_type == PDM_3SS) {
  1327. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  1328. evm_hist = &dbg_s->evm_3ss_hist[i][0];
  1329. snr_hist = &dbg_s->snr_3ss_hist[i][0];
  1330. #endif
  1331. } else if (rate_type == PDM_4SS) {
  1332. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  1333. evm_hist = &dbg_s->evm_4ss_hist[i][0];
  1334. snr_hist = &dbg_s->snr_4ss_hist[i][0];
  1335. #endif
  1336. }
  1337. phydm_print_hist_2_buf(dm, evm_hist, h_size, buf, buf_size);
  1338. PHYDM_DBG(dm, DBG_CMN, "[%d-SS][EVM][%d]=%s\n", ss, i, buf);
  1339. phydm_print_hist_2_buf(dm, snr_hist, h_size, buf, buf_size);
  1340. PHYDM_DBG(dm, DBG_CMN, "[%d-SS][SNR][%d]=%s\n", ss, i, buf);
  1341. }
  1342. }
  1343. void phydm_show_phy_hitogram(void *dm_void)
  1344. {
  1345. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1346. struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
  1347. struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;
  1348. char buf[PHYDM_SNPRINT_SIZE] = {0};
  1349. u16 buf_size = PHYDM_SNPRINT_SIZE;
  1350. u16 th_size = PHY_HIST_SIZE - 1;
  1351. u8 i = 0;
  1352. PHYDM_DBG(dm, DBG_CMN, "[PHY Histogram] ==============>\n");
  1353. /*@===[Threshold]=============================================================*/
  1354. phydm_print_hist_2_buf(dm, dbg_i->evm_hist_th, th_size, buf, buf_size);
  1355. PHYDM_DBG(dm, DBG_CMN, "%-16s=%s\n", "[EVM_TH]", buf);
  1356. phydm_print_hist_2_buf(dm, dbg_i->snr_hist_th, th_size, buf, buf_size);
  1357. PHYDM_DBG(dm, DBG_CMN, "%-16s=%s\n", "[SNR_TH]", buf);
  1358. /*@===[OFDM]==================================================================*/
  1359. if (dbg_s->rssi_ofdm_cnt) {
  1360. phydm_print_hist_2_buf(dm, dbg_s->evm_ofdm_hist, PHY_HIST_SIZE,
  1361. buf, buf_size);
  1362. PHYDM_DBG(dm, DBG_CMN, "%-14s=%s\n", "[OFDM][EVM]", buf);
  1363. phydm_print_hist_2_buf(dm, dbg_s->snr_ofdm_hist, PHY_HIST_SIZE,
  1364. buf, buf_size);
  1365. PHYDM_DBG(dm, DBG_CMN, "%-14s=%s\n", "[OFDM][SNR]", buf);
  1366. }
  1367. /*@===[1-SS]==================================================================*/
  1368. if (dbg_s->rssi_1ss_cnt)
  1369. phydm_nss_hitogram(dm, PDM_1SS);
  1370. /*@===[2-SS]==================================================================*/
  1371. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  1372. if ((dm->support_ic_type & PHYDM_IC_ABOVE_2SS) && dbg_s->rssi_2ss_cnt)
  1373. phydm_nss_hitogram(dm, PDM_2SS);
  1374. #endif
  1375. /*@===[3-SS]==================================================================*/
  1376. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  1377. if ((dm->support_ic_type & PHYDM_IC_ABOVE_3SS) && dbg_s->rssi_3ss_cnt)
  1378. phydm_nss_hitogram(dm, PDM_3SS);
  1379. #endif
  1380. /*@===[4-SS]==================================================================*/
  1381. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  1382. if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS && dbg_s->rssi_4ss_cnt)
  1383. phydm_nss_hitogram(dm, PDM_4SS);
  1384. #endif
  1385. }
  1386. void phydm_get_avg_phystatus_val(void *dm_void)
  1387. {
  1388. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1389. struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;
  1390. struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;
  1391. struct phydm_phystatus_avg *dbg_avg = &dbg_i->phystatus_statistic_avg;
  1392. PHYDM_DBG(dm, DBG_CMN, "[PHY Avg] ==============>\n");
  1393. phydm_reset_phystatus_avg(dm);
  1394. /*@===[CCK]===================================================================*/
  1395. if (dbg_s->rssi_cck_cnt != 0)
  1396. dbg_avg->rssi_cck_avg = (u8)(dbg_s->rssi_cck_sum /
  1397. dbg_s->rssi_cck_cnt);
  1398. else
  1399. dbg_avg->rssi_cck_avg = 0;
  1400. PHYDM_DBG(dm, DBG_CMN, "* cck Cnt= ((%d)) RSSI:{%d}\n",
  1401. dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg);
  1402. /*@===[OFDM]==================================================================*/
  1403. if (dbg_s->rssi_ofdm_cnt != 0) {
  1404. dbg_avg->rssi_ofdm_avg = (u8)(dbg_s->rssi_ofdm_sum /
  1405. dbg_s->rssi_ofdm_cnt);
  1406. dbg_avg->evm_ofdm_avg = (u8)(dbg_s->evm_ofdm_sum /
  1407. dbg_s->rssi_ofdm_cnt);
  1408. dbg_avg->snr_ofdm_avg = (u8)(dbg_s->snr_ofdm_sum /
  1409. dbg_s->rssi_ofdm_cnt);
  1410. }
  1411. PHYDM_DBG(dm, DBG_CMN,
  1412. "* ofdm Cnt= ((%d)) RSSI:{%d} EVM:{%d} SNR:{%d}\n",
  1413. dbg_s->rssi_ofdm_cnt, dbg_avg->rssi_ofdm_avg,
  1414. dbg_avg->evm_ofdm_avg, dbg_avg->snr_ofdm_avg);
  1415. /*@===[1-SS]==================================================================*/
  1416. if (dbg_s->rssi_1ss_cnt != 0) {
  1417. dbg_avg->rssi_1ss_avg = (u8)(dbg_s->rssi_1ss_sum /
  1418. dbg_s->rssi_1ss_cnt);
  1419. dbg_avg->evm_1ss_avg = (u8)(dbg_s->evm_1ss_sum /
  1420. dbg_s->rssi_1ss_cnt);
  1421. dbg_avg->snr_1ss_avg = (u8)(dbg_s->snr_1ss_sum /
  1422. dbg_s->rssi_1ss_cnt);
  1423. }
  1424. PHYDM_DBG(dm, DBG_CMN,
  1425. "* 1-ss Cnt= ((%d)) RSSI:{%d} EVM:{%d} SNR:{%d}\n",
  1426. dbg_s->rssi_1ss_cnt, dbg_avg->rssi_1ss_avg,
  1427. dbg_avg->evm_1ss_avg, dbg_avg->snr_1ss_avg);
  1428. /*@===[2-SS]==================================================================*/
  1429. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  1430. if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS)) {
  1431. if (dbg_s->rssi_2ss_cnt != 0) {
  1432. dbg_avg->rssi_2ss_avg[0] = (u8)(dbg_s->rssi_2ss_sum[0] /
  1433. dbg_s->rssi_2ss_cnt);
  1434. dbg_avg->rssi_2ss_avg[1] = (u8)(dbg_s->rssi_2ss_sum[1] /
  1435. dbg_s->rssi_2ss_cnt);
  1436. dbg_avg->evm_2ss_avg[0] = (u8)(dbg_s->evm_2ss_sum[0] /
  1437. dbg_s->rssi_2ss_cnt);
  1438. dbg_avg->evm_2ss_avg[1] = (u8)(dbg_s->evm_2ss_sum[1] /
  1439. dbg_s->rssi_2ss_cnt);
  1440. dbg_avg->snr_2ss_avg[0] = (u8)(dbg_s->snr_2ss_sum[0] /
  1441. dbg_s->rssi_2ss_cnt);
  1442. dbg_avg->snr_2ss_avg[1] = (u8)(dbg_s->snr_2ss_sum[1] /
  1443. dbg_s->rssi_2ss_cnt);
  1444. }
  1445. PHYDM_DBG(dm, DBG_CMN,
  1446. "* 2-ss Cnt= ((%d)) RSSI:{%d, %d}, EVM:{%d, %d}, SNR:{%d, %d}\n",
  1447. dbg_s->rssi_2ss_cnt, dbg_avg->rssi_2ss_avg[0],
  1448. dbg_avg->rssi_2ss_avg[1], dbg_avg->evm_2ss_avg[0],
  1449. dbg_avg->evm_2ss_avg[1], dbg_avg->snr_2ss_avg[0],
  1450. dbg_avg->snr_2ss_avg[1]);
  1451. }
  1452. #endif
  1453. /*@===[3-SS]==================================================================*/
  1454. #if (defined(PHYDM_COMPILE_ABOVE_3SS))
  1455. if (dm->support_ic_type & (PHYDM_IC_ABOVE_3SS)) {
  1456. if (dbg_s->rssi_3ss_cnt != 0) {
  1457. dbg_avg->rssi_3ss_avg[0] = (u8)(dbg_s->rssi_3ss_sum[0] /
  1458. dbg_s->rssi_3ss_cnt);
  1459. dbg_avg->rssi_3ss_avg[1] = (u8)(dbg_s->rssi_3ss_sum[1] /
  1460. dbg_s->rssi_3ss_cnt);
  1461. dbg_avg->rssi_3ss_avg[2] = (u8)(dbg_s->rssi_3ss_sum[2] /
  1462. dbg_s->rssi_3ss_cnt);
  1463. dbg_avg->evm_3ss_avg[0] = (u8)(dbg_s->evm_3ss_sum[0] /
  1464. dbg_s->rssi_3ss_cnt);
  1465. dbg_avg->evm_3ss_avg[1] = (u8)(dbg_s->evm_3ss_sum[1] /
  1466. dbg_s->rssi_3ss_cnt);
  1467. dbg_avg->evm_3ss_avg[2] = (u8)(dbg_s->evm_3ss_sum[2] /
  1468. dbg_s->rssi_3ss_cnt);
  1469. dbg_avg->snr_3ss_avg[0] = (u8)(dbg_s->snr_3ss_sum[0] /
  1470. dbg_s->rssi_3ss_cnt);
  1471. dbg_avg->snr_3ss_avg[1] = (u8)(dbg_s->snr_3ss_sum[1] /
  1472. dbg_s->rssi_3ss_cnt);
  1473. dbg_avg->snr_3ss_avg[2] = (u8)(dbg_s->snr_3ss_sum[2] /
  1474. dbg_s->rssi_3ss_cnt);
  1475. }
  1476. PHYDM_DBG(dm, DBG_CMN,
  1477. "* 3-ss Cnt= ((%d)) RSSI:{%d, %d, %d} EVM:{%d, %d, %d} SNR:{%d, %d, %d}\n",
  1478. dbg_s->rssi_3ss_cnt, dbg_avg->rssi_3ss_avg[0],
  1479. dbg_avg->rssi_3ss_avg[1], dbg_avg->rssi_3ss_avg[2],
  1480. dbg_avg->evm_3ss_avg[0], dbg_avg->evm_3ss_avg[1],
  1481. dbg_avg->evm_3ss_avg[2], dbg_avg->snr_3ss_avg[0],
  1482. dbg_avg->snr_3ss_avg[1], dbg_avg->snr_3ss_avg[2]);
  1483. }
  1484. #endif
  1485. /*@===[4-SS]==================================================================*/
  1486. #if (defined(PHYDM_COMPILE_ABOVE_4SS))
  1487. if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
  1488. if (dbg_s->rssi_4ss_cnt != 0) {
  1489. dbg_avg->rssi_4ss_avg[0] = (u8)(dbg_s->rssi_4ss_sum[0] /
  1490. dbg_s->rssi_4ss_cnt);
  1491. dbg_avg->rssi_4ss_avg[1] = (u8)(dbg_s->rssi_4ss_sum[1] /
  1492. dbg_s->rssi_4ss_cnt);
  1493. dbg_avg->rssi_4ss_avg[2] = (u8)(dbg_s->rssi_4ss_sum[2] /
  1494. dbg_s->rssi_4ss_cnt);
  1495. dbg_avg->rssi_4ss_avg[3] = (u8)(dbg_s->rssi_4ss_sum[3] /
  1496. dbg_s->rssi_4ss_cnt);
  1497. dbg_avg->evm_4ss_avg[0] = (u8)(dbg_s->evm_4ss_sum[0] /
  1498. dbg_s->rssi_4ss_cnt);
  1499. dbg_avg->evm_4ss_avg[1] = (u8)(dbg_s->evm_4ss_sum[1] /
  1500. dbg_s->rssi_4ss_cnt);
  1501. dbg_avg->evm_4ss_avg[2] = (u8)(dbg_s->evm_4ss_sum[2] /
  1502. dbg_s->rssi_4ss_cnt);
  1503. dbg_avg->evm_4ss_avg[3] = (u8)(dbg_s->evm_4ss_sum[3] /
  1504. dbg_s->rssi_4ss_cnt);
  1505. dbg_avg->snr_4ss_avg[0] = (u8)(dbg_s->snr_4ss_sum[0] /
  1506. dbg_s->rssi_4ss_cnt);
  1507. dbg_avg->snr_4ss_avg[1] = (u8)(dbg_s->snr_4ss_sum[1] /
  1508. dbg_s->rssi_4ss_cnt);
  1509. dbg_avg->snr_4ss_avg[2] = (u8)(dbg_s->snr_4ss_sum[2] /
  1510. dbg_s->rssi_4ss_cnt);
  1511. dbg_avg->snr_4ss_avg[3] = (u8)(dbg_s->snr_4ss_sum[3] /
  1512. dbg_s->rssi_4ss_cnt);
  1513. }
  1514. PHYDM_DBG(dm, DBG_CMN,
  1515. "* 4-ss Cnt= ((%d)) RSSI:{%d, %d, %d, %d} EVM:{%d, %d, %d, %d} SNR:{%d, %d, %d, %d}\n",
  1516. dbg_s->rssi_4ss_cnt, dbg_avg->rssi_4ss_avg[0],
  1517. dbg_avg->rssi_4ss_avg[1], dbg_avg->rssi_4ss_avg[2],
  1518. dbg_avg->rssi_4ss_avg[3], dbg_avg->evm_4ss_avg[0],
  1519. dbg_avg->evm_4ss_avg[1], dbg_avg->evm_4ss_avg[2],
  1520. dbg_avg->evm_4ss_avg[3], dbg_avg->snr_4ss_avg[0],
  1521. dbg_avg->snr_4ss_avg[1], dbg_avg->snr_4ss_avg[2],
  1522. dbg_avg->snr_4ss_avg[3]);
  1523. }
  1524. #endif
  1525. }
  1526. void phydm_get_phy_statistic(void *dm_void)
  1527. {
  1528. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1529. phydm_rx_rate_distribution(dm);
  1530. phydm_reset_rx_rate_distribution(dm);
  1531. phydm_show_phy_hitogram(dm);
  1532. phydm_get_avg_phystatus_val(dm);
  1533. phydm_reset_phystatus_statistic(dm);
  1534. };
  1535. void phydm_basic_dbg_msg_linked(void *dm_void)
  1536. {
  1537. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1538. struct phydm_cfo_track_struct *cfo_t = &dm->dm_cfo_track;
  1539. struct odm_phy_dbg_info *dbg_t = &dm->phy_dbg_info;
  1540. u16 macid, phydm_macid, client_cnt = 0;
  1541. u8 rate = 0;
  1542. struct cmn_sta_info *entry = NULL;
  1543. char dbg_buf[PHYDM_SNPRINT_SIZE] = {0};
  1544. struct phydm_cfo_rpt cfo;
  1545. u8 i = 0;
  1546. PHYDM_DBG(dm, DBG_CMN, "ID=((%d)), BW=((%d)), fc=((CH-%d))\n",
  1547. dm->curr_station_id, 20 << *dm->band_width, *dm->channel);
  1548. #ifdef ODM_IC_11N_SERIES_SUPPORT
  1549. #ifdef PHYDM_PRIMARY_CCA
  1550. if (((*dm->channel <= 14) && (*dm->band_width == CHANNEL_WIDTH_40)) &&
  1551. (dm->support_ic_type & ODM_IC_11N_SERIES)) {
  1552. PHYDM_DBG(dm, DBG_CMN, "Primary CCA at ((%s SB))\n",
  1553. ((*dm->sec_ch_offset == SECOND_CH_AT_LSB) ? "U" :
  1554. "L"));
  1555. }
  1556. #endif
  1557. #endif
  1558. if ((dm->support_ic_type & PHYSTS_2ND_TYPE_IC) ||
  1559. dm->rx_rate > ODM_RATE11M) {
  1560. PHYDM_DBG(dm, DBG_CMN, "[AGC Idx] {0x%x, 0x%x, 0x%x, 0x%x}\n",
  1561. dm->ofdm_agc_idx[0], dm->ofdm_agc_idx[1],
  1562. dm->ofdm_agc_idx[2], dm->ofdm_agc_idx[3]);
  1563. } else {
  1564. PHYDM_DBG(dm, DBG_CMN, "[CCK AGC Idx] {LNA,VGA}={0x%x, 0x%x}\n",
  1565. dm->cck_lna_idx, dm->cck_vga_idx);
  1566. }
  1567. phydm_print_rate_2_buff(dm, dm->rx_rate, dbg_buf, PHYDM_SNPRINT_SIZE);
  1568. PHYDM_DBG(dm, DBG_CMN, "RSSI:{%d, %d, %d, %d}, RxRate:%s (0x%x)\n",
  1569. (dm->rssi_a == 0xff) ? 0 : dm->rssi_a,
  1570. (dm->rssi_b == 0xff) ? 0 : dm->rssi_b,
  1571. (dm->rssi_c == 0xff) ? 0 : dm->rssi_c,
  1572. (dm->rssi_d == 0xff) ? 0 : dm->rssi_d,
  1573. dbg_buf, dm->rx_rate);
  1574. rate = dbg_t->beacon_phy_rate;
  1575. phydm_print_rate_2_buff(dm, rate, dbg_buf, PHYDM_SNPRINT_SIZE);
  1576. PHYDM_DBG(dm, DBG_CMN, "Beacon_cnt=%d, rate_idx=%s (0x%x)\n",
  1577. dbg_t->num_qry_beacon_pkt,
  1578. dbg_buf,
  1579. dbg_t->beacon_phy_rate);
  1580. phydm_get_phy_statistic(dm);
  1581. PHYDM_DBG(dm, DBG_CMN,
  1582. "rxsc_idx {Legacy, 20, 40, 80} = {%d, %d, %d, %d}\n",
  1583. dm->rxsc_l, dm->rxsc_20, dm->rxsc_40, dm->rxsc_80);
  1584. /*Print TX rate*/
  1585. for (macid = 0; macid < ODM_ASSOCIATE_ENTRY_NUM; macid++) {
  1586. entry = dm->phydm_sta_info[macid];
  1587. if (!is_sta_active(entry))
  1588. continue;
  1589. phydm_macid = (dm->phydm_macid_table[macid]);
  1590. rate = entry->ra_info.curr_tx_rate;
  1591. phydm_print_rate_2_buff(dm, rate, dbg_buf, PHYDM_SNPRINT_SIZE);
  1592. PHYDM_DBG(dm, DBG_CMN, "TxRate[%d]=%s (0x%x)\n",
  1593. macid, dbg_buf, entry->ra_info.curr_tx_rate);
  1594. client_cnt++;
  1595. if (client_cnt >= dm->number_linked_client)
  1596. break;
  1597. }
  1598. PHYDM_DBG(dm, DBG_CMN,
  1599. "TP {Tx, Rx, Total} = {%d, %d, %d}Mbps, Traffic_Load=(%d))\n",
  1600. dm->tx_tp, dm->rx_tp, dm->total_tp, dm->traffic_load);
  1601. PHYDM_DBG(dm, DBG_CMN, "CFO_avg=((%d kHz)), CFO_traking = ((%s%d))\n",
  1602. cfo_t->CFO_ave_pre,
  1603. ((cfo_t->crystal_cap > cfo_t->def_x_cap) ? "+" : "-"),
  1604. DIFF_2(cfo_t->crystal_cap, cfo_t->def_x_cap));
  1605. phydm_get_cfo_info(dm, &cfo);
  1606. for (i = 0; i < dm->num_rf_path; i++) {
  1607. PHYDM_DBG(dm, DBG_CMN,
  1608. "CFO[%d] {S, L, Sec, Acq, End} = {%d, %d, %d, %d, %d}\n",
  1609. i, cfo.cfo_rpt_s[i], cfo.cfo_rpt_l[i],
  1610. cfo.cfo_rpt_sec[i], cfo.cfo_rpt_acq[i],
  1611. cfo.cfo_rpt_end[i]);
  1612. }
  1613. /* @Condition number */
  1614. #if (RTL8822B_SUPPORT)
  1615. if (dm->support_ic_type == ODM_RTL8822B) {
  1616. PHYDM_DBG(dm, DBG_CMN, "Condi_Num=((%d.%.4d)), %d\n",
  1617. dbg_t->condi_num >> 4,
  1618. phydm_show_fraction_num(dbg_t->condi_num & 0xf, 4),
  1619. dbg_t->condi_num);
  1620. }
  1621. #endif
  1622. #ifdef PHYSTS_3RD_TYPE_SUPPORT
  1623. if (dm->support_ic_type == ODM_RTL8198F) {
  1624. PHYDM_DBG(dm, DBG_CMN, "Condi_Num=((%d.%4d dB))\n",
  1625. dbg_t->condi_num >> 1,
  1626. phydm_show_fraction_num(dbg_t->condi_num & 0x1, 1));
  1627. }
  1628. #endif
  1629. #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
  1630. /*STBC or LDPC pkt*/
  1631. if (dm->support_ic_type & PHYSTS_2ND_TYPE_IC)
  1632. PHYDM_DBG(dm, DBG_CMN, "Coding: LDPC=((%s)), STBC=((%s))\n",
  1633. (dbg_t->is_ldpc_pkt) ? "Y" : "N",
  1634. (dbg_t->is_stbc_pkt) ? "Y" : "N");
  1635. #endif
  1636. }
  1637. void phydm_dm_summary(void *dm_void, u8 macid)
  1638. {
  1639. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1640. struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
  1641. struct phydm_cfo_track_struct *cfo_t = &dm->dm_cfo_track;
  1642. struct cmn_sta_info *sta = NULL;
  1643. struct ra_sta_info *ra = NULL;
  1644. struct dtp_info *dtp = NULL;
  1645. u64 comp = dm->support_ability;
  1646. u64 pause_comp = dm->pause_ability;
  1647. if (!(dm->debug_components & DBG_DM_SUMMARY))
  1648. return;
  1649. if (!dm->is_linked) {
  1650. pr_debug("[%s]No Link !!!\n", __func__);
  1651. return;
  1652. }
  1653. sta = dm->phydm_sta_info[macid];
  1654. if (!is_sta_active(sta)) {
  1655. pr_debug("[Warning] %s invalid STA, macid=%d\n",
  1656. __func__, macid);
  1657. return;
  1658. }
  1659. ra = &sta->ra_info;
  1660. dtp = &sta->dtp_stat;
  1661. pr_debug("[%s]===========>\n", __func__);
  1662. pr_debug("00.(%s) %-12s: IGI=0x%x, Dyn_Rng=0x%x~0x%x, FA_th={%d,%d,%d}\n",
  1663. ((comp & ODM_BB_DIG) ?
  1664. ((pause_comp & ODM_BB_DIG) ? "P" : "V") : "."),
  1665. "DIG",
  1666. dig_t->cur_ig_value,
  1667. dig_t->rx_gain_range_min, dig_t->rx_gain_range_max,
  1668. dig_t->fa_th[0], dig_t->fa_th[1], dig_t->fa_th[2]);
  1669. pr_debug("01.(%s) %-12s: rssi_lv=%d, mask=0x%llx\n",
  1670. ((comp & ODM_BB_RA_MASK) ?
  1671. ((pause_comp & ODM_BB_RA_MASK) ? "P" : "V") : "."),
  1672. "RaMask",
  1673. ra->rssi_level, ra->ramask);
  1674. #ifdef CONFIG_DYNAMIC_TX_TWR
  1675. pr_debug("02.(%s) %-12s: pwr_lv=%d\n",
  1676. ((comp & ODM_BB_DYNAMIC_TXPWR) ?
  1677. ((pause_comp & ODM_BB_DYNAMIC_TXPWR) ? "P" : "V") : "."),
  1678. "DynTxPwr",
  1679. dtp->sta_tx_high_power_lvl);
  1680. #endif
  1681. pr_debug("05.(%s) %-12s: cck_pd_lv=%d\n",
  1682. ((comp & ODM_BB_CCK_PD) ?
  1683. ((pause_comp & ODM_BB_CCK_PD) ? "P" : "V") : "."),
  1684. "CCK_PD", dm->dm_cckpd_table.cck_pd_lv);
  1685. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1686. pr_debug("06.(%s) %-12s: div_type=%d, curr_ant=%s\n",
  1687. ((comp & ODM_BB_ANT_DIV) ?
  1688. ((pause_comp & ODM_BB_ANT_DIV) ? "P" : "V") : "."),
  1689. "ANT_DIV",
  1690. dm->ant_div_type,
  1691. (dm->dm_fat_table.rx_idle_ant == MAIN_ANT) ? "MAIN" : "AUX");
  1692. #endif
  1693. #ifdef PHYDM_POWER_TRAINING_SUPPORT
  1694. pr_debug("08.(%s) %-12s: PT_score=%d, disable_PT=%d\n",
  1695. ((comp & ODM_BB_PWR_TRAIN) ?
  1696. ((pause_comp & ODM_BB_PWR_TRAIN) ? "P" : "V") : "."),
  1697. "PwrTrain",
  1698. dm->pow_train_table.pow_train_score,
  1699. dm->is_disable_power_training);
  1700. #endif
  1701. #ifdef CONFIG_PHYDM_DFS_MASTER
  1702. pr_debug("11.(%s) %-12s: dbg_mode=%d, region_domain=%d\n",
  1703. ((comp & ODM_BB_DFS) ?
  1704. ((pause_comp & ODM_BB_DFS) ? "P" : "V") : "."),
  1705. "DFS",
  1706. dm->dfs.dbg_mode, dm->dfs_region_domain);
  1707. #endif
  1708. #ifdef PHYDM_SUPPORT_ADAPTIVITY
  1709. pr_debug("13.(%s) %-12s: th{l2h, h2l}={%d, %d}, edcca_flag=%d\n",
  1710. ((comp & ODM_BB_ADAPTIVITY) ?
  1711. ((pause_comp & ODM_BB_ADAPTIVITY) ? "P" : "V") : "."),
  1712. "Adaptivity",
  1713. dm->adaptivity.th_l2h, dm->adaptivity.th_h2l,
  1714. dm->false_alm_cnt.edcca_flag);
  1715. #endif
  1716. pr_debug("14.(%s) %-12s: CFO_avg=%d kHz, CFO_traking=%s%d\n",
  1717. ((comp & ODM_BB_CFO_TRACKING) ?
  1718. ((pause_comp & ODM_BB_CFO_TRACKING) ? "P" : "V") : "."),
  1719. "CfoTrack",
  1720. cfo_t->CFO_ave_pre,
  1721. ((cfo_t->crystal_cap > cfo_t->def_x_cap) ? "+" : "-"),
  1722. DIFF_2(cfo_t->crystal_cap, cfo_t->def_x_cap));
  1723. pr_debug("15.(%s) %-12s: ratio{nhm, clm}={%d, %d}\n",
  1724. ((comp & ODM_BB_ENV_MONITOR) ?
  1725. ((pause_comp & ODM_BB_ENV_MONITOR) ? "P" : "V") : "."),
  1726. "EnvMntr",
  1727. dm->dm_ccx_info.nhm_ratio, dm->dm_ccx_info.clm_ratio);
  1728. #ifdef PHYDM_PRIMARY_CCA
  1729. pr_debug("16.(%s) %-12s: CCA @ (%s SB)\n",
  1730. ((comp & ODM_BB_PRIMARY_CCA) ?
  1731. ((pause_comp & ODM_BB_PRIMARY_CCA) ? "P" : "V") : "."),
  1732. "PriCCA",
  1733. ((dm->dm_pri_cca.mf_state == MF_USC_LSC) ? "D" :
  1734. ((dm->dm_pri_cca.mf_state == MF_LSC) ? "L" : "U")));
  1735. #endif
  1736. #ifdef CONFIG_ADAPTIVE_SOML
  1737. pr_debug("17.(%s) %-12s: soml_en = %s\n",
  1738. ((comp & ODM_BB_ADAPTIVE_SOML) ?
  1739. ((pause_comp & ODM_BB_ADAPTIVE_SOML) ? "P" : "V") : "."),
  1740. "A-SOML",
  1741. (dm->dm_soml_table.soml_last_state == SOML_ON) ?
  1742. "ON" : "OFF");
  1743. #endif
  1744. #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
  1745. pr_debug("18.(%s) %-12s:\n",
  1746. ((comp & ODM_BB_LNA_SAT_CHK) ?
  1747. ((pause_comp & ODM_BB_LNA_SAT_CHK) ? "P" : "V") : "."),
  1748. "LNA_SAT_CHK");
  1749. #endif
  1750. }
  1751. void phydm_basic_dbg_message(void *dm_void)
  1752. {
  1753. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1754. struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
  1755. if (!(dm->debug_components & DBG_CMN))
  1756. return;
  1757. if (dm->cmn_dbg_msg_cnt >= dm->cmn_dbg_msg_period) {
  1758. dm->cmn_dbg_msg_cnt = PHYDM_WATCH_DOG_PERIOD;
  1759. } else {
  1760. dm->cmn_dbg_msg_cnt += PHYDM_WATCH_DOG_PERIOD;
  1761. return;
  1762. }
  1763. PHYDM_DBG(dm, DBG_CMN, "[%s] System up time: ((%d sec))---->\n",
  1764. __func__, dm->phydm_sys_up_time);
  1765. if (dm->is_linked)
  1766. phydm_basic_dbg_msg_linked(dm);
  1767. else
  1768. PHYDM_DBG(dm, DBG_CMN, "No Link !!!\n");
  1769. PHYDM_DBG(dm, DBG_CMN, "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
  1770. fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all);
  1771. PHYDM_DBG(dm, DBG_CMN, "[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
  1772. fa_t->cnt_cck_fail, fa_t->cnt_ofdm_fail, fa_t->cnt_all);
  1773. PHYDM_DBG(dm, DBG_CMN,
  1774. "[OFDM FA Detail] Parity_Fail=%d, Rate_Illegal=%d, CRC8=%d, MCS_fail=%d, Fast_sync=%d, SB_Search_fail=%d\n",
  1775. fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
  1776. fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail,
  1777. fa_t->cnt_fast_fsync, fa_t->cnt_sb_search_fail);
  1778. #if (ODM_IC_11AC_SERIES_SUPPORT)
  1779. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  1780. PHYDM_DBG(dm, DBG_CMN,
  1781. "[OFDM FA Detail VHT] CRC8_VHT=%d, MCS_Fail_VHT=%d\n",
  1782. fa_t->cnt_crc8_fail_vht, fa_t->cnt_mcs_fail_vht);
  1783. }
  1784. #endif
  1785. PHYDM_DBG(dm, DBG_CMN,
  1786. "is_linked = %d, Num_client = %d, rssi_min = %d, IGI = 0x%x, bNoisy=%d\n\n",
  1787. dm->is_linked, dm->number_linked_client, dm->rssi_min,
  1788. dm->dm_dig_table.cur_ig_value, dm->noisy_decision);
  1789. }
  1790. void phydm_basic_profile(void *dm_void, u32 *_used, char *output, u32 *_out_len)
  1791. {
  1792. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  1793. struct dm_struct *dm = (struct dm_struct *)dm_void;
  1794. char *cut = NULL;
  1795. char *ic_type = NULL;
  1796. u32 used = *_used;
  1797. u32 out_len = *_out_len;
  1798. u32 date = 0;
  1799. char *commit_by = NULL;
  1800. u32 release_ver = 0;
  1801. PDM_SNPF(out_len, used, output + used, out_len - used, "%-35s\n",
  1802. "% Basic Profile %");
  1803. if (dm->support_ic_type == ODM_RTL8188E) {
  1804. #if (RTL8188E_SUPPORT)
  1805. ic_type = "RTL8188E";
  1806. date = RELEASE_DATE_8188E;
  1807. commit_by = COMMIT_BY_8188E;
  1808. release_ver = RELEASE_VERSION_8188E;
  1809. #endif
  1810. #if (RTL8812A_SUPPORT)
  1811. } else if (dm->support_ic_type == ODM_RTL8812) {
  1812. ic_type = "RTL8812A";
  1813. date = RELEASE_DATE_8812A;
  1814. commit_by = COMMIT_BY_8812A;
  1815. release_ver = RELEASE_VERSION_8812A;
  1816. #endif
  1817. #if (RTL8821A_SUPPORT)
  1818. } else if (dm->support_ic_type == ODM_RTL8821) {
  1819. ic_type = "RTL8821A";
  1820. date = RELEASE_DATE_8821A;
  1821. commit_by = COMMIT_BY_8821A;
  1822. release_ver = RELEASE_VERSION_8821A;
  1823. #endif
  1824. #if (RTL8192E_SUPPORT)
  1825. } else if (dm->support_ic_type == ODM_RTL8192E) {
  1826. ic_type = "RTL8192E";
  1827. date = RELEASE_DATE_8192E;
  1828. commit_by = COMMIT_BY_8192E;
  1829. release_ver = RELEASE_VERSION_8192E;
  1830. #endif
  1831. #if (RTL8723B_SUPPORT)
  1832. } else if (dm->support_ic_type == ODM_RTL8723B) {
  1833. ic_type = "RTL8723B";
  1834. date = RELEASE_DATE_8723B;
  1835. commit_by = COMMIT_BY_8723B;
  1836. release_ver = RELEASE_VERSION_8723B;
  1837. #endif
  1838. #if (RTL8814A_SUPPORT)
  1839. } else if (dm->support_ic_type == ODM_RTL8814A) {
  1840. ic_type = "RTL8814A";
  1841. date = RELEASE_DATE_8814A;
  1842. commit_by = COMMIT_BY_8814A;
  1843. release_ver = RELEASE_VERSION_8814A;
  1844. #endif
  1845. #if (RTL8881A_SUPPORT)
  1846. } else if (dm->support_ic_type == ODM_RTL8881A) {
  1847. ic_type = "RTL8881A";
  1848. #endif
  1849. #if (RTL8822B_SUPPORT)
  1850. } else if (dm->support_ic_type == ODM_RTL8822B) {
  1851. ic_type = "RTL8822B";
  1852. date = RELEASE_DATE_8822B;
  1853. commit_by = COMMIT_BY_8822B;
  1854. release_ver = RELEASE_VERSION_8822B;
  1855. #endif
  1856. #if (RTL8197F_SUPPORT)
  1857. } else if (dm->support_ic_type == ODM_RTL8197F) {
  1858. ic_type = "RTL8197F";
  1859. date = RELEASE_DATE_8197F;
  1860. commit_by = COMMIT_BY_8197F;
  1861. release_ver = RELEASE_VERSION_8197F;
  1862. #endif
  1863. #if (RTL8703B_SUPPORT)
  1864. } else if (dm->support_ic_type == ODM_RTL8703B) {
  1865. ic_type = "RTL8703B";
  1866. date = RELEASE_DATE_8703B;
  1867. commit_by = COMMIT_BY_8703B;
  1868. release_ver = RELEASE_VERSION_8703B;
  1869. #endif
  1870. #if (RTL8195A_SUPPORT)
  1871. } else if (dm->support_ic_type == ODM_RTL8195A) {
  1872. ic_type = "RTL8195A";
  1873. #endif
  1874. #if (RTL8188F_SUPPORT)
  1875. } else if (dm->support_ic_type == ODM_RTL8188F) {
  1876. ic_type = "RTL8188F";
  1877. date = RELEASE_DATE_8188F;
  1878. commit_by = COMMIT_BY_8188F;
  1879. release_ver = RELEASE_VERSION_8188F;
  1880. #endif
  1881. #if (RTL8723D_SUPPORT)
  1882. } else if (dm->support_ic_type == ODM_RTL8723D) {
  1883. ic_type = "RTL8723D";
  1884. date = RELEASE_DATE_8723D;
  1885. commit_by = COMMIT_BY_8723D;
  1886. release_ver = RELEASE_VERSION_8723D;
  1887. #endif
  1888. }
  1889. /* @JJ ADD 20161014 */
  1890. #if (RTL8710B_SUPPORT)
  1891. else if (dm->support_ic_type == ODM_RTL8710B) {
  1892. ic_type = "RTL8710B";
  1893. date = RELEASE_DATE_8710B;
  1894. commit_by = COMMIT_BY_8710B;
  1895. release_ver = RELEASE_VERSION_8710B;
  1896. }
  1897. #endif
  1898. #if (RTL8821C_SUPPORT)
  1899. else if (dm->support_ic_type == ODM_RTL8821C) {
  1900. ic_type = "RTL8821C";
  1901. date = RELEASE_DATE_8821C;
  1902. commit_by = COMMIT_BY_8821C;
  1903. release_ver = RELEASE_VERSION_8821C;
  1904. }
  1905. #endif
  1906. /*@jj add 20170822*/
  1907. #if (RTL8192F_SUPPORT)
  1908. else if (dm->support_ic_type == ODM_RTL8192F) {
  1909. ic_type = "RTL8192F";
  1910. date = RELEASE_DATE_8192F;
  1911. commit_by = COMMIT_BY_8192F;
  1912. release_ver = RELEASE_VERSION_8192F;
  1913. }
  1914. #endif
  1915. #if (RTL8198F_SUPPORT)
  1916. else if (dm->support_ic_type == ODM_RTL8198F) {
  1917. ic_type = "RTL8198F";
  1918. date = RELEASE_DATE_8198F;
  1919. commit_by = COMMIT_BY_8198F;
  1920. release_ver = RELEASE_VERSION_8198F;
  1921. }
  1922. #endif
  1923. #if (RTL8822C_SUPPORT)
  1924. else if (dm->support_ic_type == ODM_RTL8822C) {
  1925. ic_type = "RTL8822C";
  1926. date = RELEASE_DATE_8822C;
  1927. commit_by = COMMIT_BY_8822C;
  1928. release_ver = RELEASE_VERSION_8822C;
  1929. }
  1930. #endif
  1931. PDM_SNPF(out_len, used, output + used, out_len - used,
  1932. " %-35s: %s (MP Chip: %s)\n", "IC type", ic_type,
  1933. dm->is_mp_chip ? "Yes" : "No");
  1934. if (dm->cut_version == ODM_CUT_A)
  1935. cut = "A";
  1936. else if (dm->cut_version == ODM_CUT_B)
  1937. cut = "B";
  1938. else if (dm->cut_version == ODM_CUT_C)
  1939. cut = "C";
  1940. else if (dm->cut_version == ODM_CUT_D)
  1941. cut = "D";
  1942. else if (dm->cut_version == ODM_CUT_E)
  1943. cut = "E";
  1944. else if (dm->cut_version == ODM_CUT_F)
  1945. cut = "F";
  1946. else if (dm->cut_version == ODM_CUT_I)
  1947. cut = "I";
  1948. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",
  1949. "RFE type", dm->rfe_type);
  1950. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1951. "Cut Ver", cut);
  1952. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",
  1953. "PHY Para Ver", odm_get_hw_img_version(dm));
  1954. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",
  1955. "PHY Para Commit date", date);
  1956. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1957. "PHY Para Commit by", commit_by);
  1958. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",
  1959. "PHY Para Release Ver", release_ver);
  1960. PDM_SNPF(out_len, used, output + used, out_len - used,
  1961. " %-35s: %d (Subversion: %d)\n", "FW Ver", dm->fw_version,
  1962. dm->fw_sub_version);
  1963. /* @1 PHY DM version List */
  1964. PDM_SNPF(out_len, used, output + used, out_len - used, "%-35s\n",
  1965. "% PHYDM version %");
  1966. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1967. "Code base", PHYDM_CODE_BASE);
  1968. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1969. "Release Date", PHYDM_RELEASE_DATE);
  1970. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1971. "Adaptivity", ADAPTIVITY_VERSION);
  1972. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1973. "DIG", DIG_VERSION);
  1974. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1975. "CFO Tracking", CFO_TRACKING_VERSION);
  1976. #ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
  1977. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1978. "AntDiv", ANTDIV_VERSION);
  1979. #endif
  1980. #ifdef CONFIG_DYNAMIC_TX_TWR
  1981. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1982. "Dynamic TxPower", DYNAMIC_TXPWR_VERSION);
  1983. #endif
  1984. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1985. "RA Info", RAINFO_VERSION);
  1986. #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
  1987. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1988. "AntDetect", ANTDECT_VERSION);
  1989. #endif
  1990. #ifdef CONFIG_PATH_DIVERSITY
  1991. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1992. "PathDiv", PATHDIV_VERSION);
  1993. #endif
  1994. #ifdef CONFIG_ADAPTIVE_SOML
  1995. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  1996. "Adaptive SOML", ADAPTIVE_SOML_VERSION);
  1997. #endif
  1998. #if (PHYDM_LA_MODE_SUPPORT)
  1999. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  2000. "LA mode", DYNAMIC_LA_MODE);
  2001. #endif
  2002. #ifdef PHYDM_PRIMARY_CCA
  2003. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  2004. "Primary CCA", PRIMARYCCA_VERSION);
  2005. #endif
  2006. PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",
  2007. "DFS", DFS_VERSION);
  2008. #if (RTL8822B_SUPPORT)
  2009. if (dm->support_ic_type & ODM_RTL8822B)
  2010. PDM_SNPF(out_len, used, output + used, out_len - used,
  2011. " %-35s: %s\n", "PHY config 8822B",
  2012. PHY_CONFIG_VERSION_8822B);
  2013. #endif
  2014. #if (RTL8197F_SUPPORT)
  2015. if (dm->support_ic_type & ODM_RTL8197F)
  2016. PDM_SNPF(out_len, used, output + used, out_len - used,
  2017. " %-35s: %s\n", "PHY config 8197F",
  2018. PHY_CONFIG_VERSION_8197F);
  2019. #endif
  2020. /*@jj add 20170822*/
  2021. #if (RTL8192F_SUPPORT)
  2022. if (dm->support_ic_type & ODM_RTL8192F)
  2023. PDM_SNPF(out_len, used, output + used, out_len - used,
  2024. " %-35s: %s\n", "PHY config 8192F",
  2025. PHY_CONFIG_VERSION_8192F);
  2026. #endif
  2027. *_used = used;
  2028. *_out_len = out_len;
  2029. #endif /*@#if CONFIG_PHYDM_DEBUG_FUNCTION*/
  2030. }
  2031. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  2032. void phydm_fw_trace_en_h2c(void *dm_void, boolean enable,
  2033. u32 fw_dbg_comp, u32 monitor_mode, u32 macid)
  2034. {
  2035. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2036. u8 h2c_parameter[7] = {0};
  2037. u8 cmd_length;
  2038. if (dm->support_ic_type & PHYDM_IC_3081_SERIES) {
  2039. h2c_parameter[0] = enable;
  2040. h2c_parameter[1] = (u8)(fw_dbg_comp & MASKBYTE0);
  2041. h2c_parameter[2] = (u8)((fw_dbg_comp & MASKBYTE1) >> 8);
  2042. h2c_parameter[3] = (u8)((fw_dbg_comp & MASKBYTE2) >> 16);
  2043. h2c_parameter[4] = (u8)((fw_dbg_comp & MASKBYTE3) >> 24);
  2044. h2c_parameter[5] = (u8)monitor_mode;
  2045. h2c_parameter[6] = (u8)macid;
  2046. cmd_length = 7;
  2047. } else {
  2048. h2c_parameter[0] = enable;
  2049. h2c_parameter[1] = (u8)monitor_mode;
  2050. h2c_parameter[2] = (u8)macid;
  2051. cmd_length = 3;
  2052. }
  2053. PHYDM_DBG(dm, DBG_FW_TRACE, "---->\n");
  2054. if (monitor_mode == 0)
  2055. PHYDM_DBG(dm, DBG_FW_TRACE, "[H2C] FW_debug_en: (( %d ))\n",
  2056. enable);
  2057. else
  2058. PHYDM_DBG(dm, DBG_FW_TRACE,
  2059. "[H2C] FW_debug_en: (( %d )), mode: (( %d )), macid: (( %d ))\n",
  2060. enable, monitor_mode, macid);
  2061. odm_fill_h2c_cmd(dm, PHYDM_H2C_FW_TRACE_EN, cmd_length, h2c_parameter);
  2062. }
  2063. void phydm_get_per_path_txagc(void *dm_void, u8 path, u32 *_used, char *output,
  2064. u32 *_out_len)
  2065. {
  2066. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2067. u8 rate_idx;
  2068. u8 txagc;
  2069. u32 used = *_used;
  2070. u32 out_len = *_out_len;
  2071. #ifdef PHYDM_COMMON_API_SUPPORT
  2072. if (!(dm->support_ic_type & CMN_API_SUPPORT_IC))
  2073. return;
  2074. if (dm->num_rf_path == 1 && path > RF_PATH_A)
  2075. return;
  2076. else if (dm->num_rf_path == 2 && path > RF_PATH_B)
  2077. return;
  2078. else if (dm->num_rf_path == 3 && path > RF_PATH_C)
  2079. return;
  2080. else if (dm->num_rf_path == 4 && path > RF_PATH_D)
  2081. return;
  2082. for (rate_idx = 0; rate_idx <= 0x53; rate_idx++) {
  2083. if (rate_idx == ODM_RATE1M)
  2084. PDM_SNPF(out_len, used, output + used, out_len - used,
  2085. " %-35s\n", "CCK====>");
  2086. else if (rate_idx == ODM_RATE6M)
  2087. PDM_SNPF(out_len, used, output + used, out_len - used,
  2088. "\n %-35s\n", "OFDM====>");
  2089. else if (rate_idx == ODM_RATEMCS0)
  2090. PDM_SNPF(out_len, used, output + used, out_len - used,
  2091. "\n %-35s\n", "HT 1ss====>");
  2092. else if (rate_idx == ODM_RATEMCS8)
  2093. PDM_SNPF(out_len, used, output + used, out_len - used,
  2094. "\n %-35s\n", "HT 2ss====>");
  2095. else if (rate_idx == ODM_RATEMCS16)
  2096. PDM_SNPF(out_len, used, output + used, out_len - used,
  2097. "\n %-35s\n", "HT 3ss====>");
  2098. else if (rate_idx == ODM_RATEMCS24)
  2099. PDM_SNPF(out_len, used, output + used, out_len - used,
  2100. "\n %-35s\n", "HT 4ss====>");
  2101. else if (rate_idx == ODM_RATEVHTSS1MCS0)
  2102. PDM_SNPF(out_len, used, output + used, out_len - used,
  2103. "\n %-35s\n", "VHT 1ss====>");
  2104. else if (rate_idx == ODM_RATEVHTSS2MCS0)
  2105. PDM_SNPF(out_len, used, output + used, out_len - used,
  2106. "\n %-35s\n", "VHT 2ss====>");
  2107. else if (rate_idx == ODM_RATEVHTSS3MCS0)
  2108. PDM_SNPF(out_len, used, output + used, out_len - used,
  2109. "\n %-35s\n", "VHT 3ss====>");
  2110. else if (rate_idx == ODM_RATEVHTSS4MCS0)
  2111. PDM_SNPF(out_len, used, output + used, out_len - used,
  2112. "\n %-35s\n", "VHT 4ss====>");
  2113. txagc = phydm_api_get_txagc(dm, (enum rf_path)path, rate_idx);
  2114. if (config_phydm_read_txagc_check(txagc))
  2115. PDM_SNPF(out_len, used, output + used,
  2116. out_len - used, " 0x%02x ", txagc);
  2117. else
  2118. PDM_SNPF(out_len, used, output + used,
  2119. out_len - used, " 0x%s ", "xx");
  2120. }
  2121. #endif
  2122. *_used = used;
  2123. *_out_len = out_len;
  2124. }
  2125. void phydm_get_txagc(void *dm_void, u32 *_used, char *output, u32 *_out_len)
  2126. {
  2127. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2128. u32 used = *_used;
  2129. u32 out_len = *_out_len;
  2130. /* path-A */
  2131. PDM_SNPF(out_len, used, output + used, out_len - used, "%-35s\n",
  2132. "path-A====================");
  2133. phydm_get_per_path_txagc(dm, RF_PATH_A, &used, output, &out_len);
  2134. /* path-B */
  2135. PDM_SNPF(out_len, used, output + used, out_len - used, "\n%-35s\n",
  2136. "path-B====================");
  2137. phydm_get_per_path_txagc(dm, RF_PATH_B, &used, output, &out_len);
  2138. /* path-C */
  2139. PDM_SNPF(out_len, used, output + used, out_len - used, "\n%-35s\n",
  2140. "path-C====================");
  2141. phydm_get_per_path_txagc(dm, RF_PATH_C, &used, output, &out_len);
  2142. /* path-D */
  2143. PDM_SNPF(out_len, used, output + used, out_len - used, "\n%-35s\n",
  2144. "path-D====================");
  2145. phydm_get_per_path_txagc(dm, RF_PATH_D, &used, output, &out_len);
  2146. *_used = used;
  2147. *_out_len = out_len;
  2148. }
  2149. void phydm_set_txagc(void *dm_void, u32 *const val, u32 *_used,
  2150. char *output, u32 *_out_len)
  2151. {
  2152. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2153. u32 used = *_used;
  2154. u32 out_len = *_out_len;
  2155. u8 i = 0;
  2156. u32 pow = 0; /*power index*/
  2157. u8 vht_start_rate = ODM_RATEVHTSS1MCS0;
  2158. boolean rpt = true;
  2159. enum rf_path path = RF_PATH_A;
  2160. /*@val[1] = path*/
  2161. /*@val[2] = hw_rate*/
  2162. /*@val[3] = power_index*/
  2163. #ifdef PHYDM_COMMON_API_SUPPORT
  2164. if (!(dm->support_ic_type & CMN_API_SUPPORT_IC))
  2165. return;
  2166. path = (enum rf_path)val[1];
  2167. if (val[1] >= dm->num_rf_path) {
  2168. PDM_SNPF(out_len, used, output + used, out_len - used,
  2169. "Write path-%d rate_idx-0x%x fail\n", val[1], val[2]);
  2170. } else if ((u8)val[2] != 0xff) {
  2171. if (phydm_api_set_txagc(dm, val[3], path, (u8)val[2], true))
  2172. PDM_SNPF(out_len, used, output + used, out_len - used,
  2173. "Write path-%d rate_idx-0x%x = 0x%x\n",
  2174. val[1], val[2], val[3]);
  2175. else
  2176. PDM_SNPF(out_len, used, output + used, out_len - used,
  2177. "Write path-%d rate index-0x%x fail\n",
  2178. val[1], val[2]);
  2179. } else {
  2180. if (dm->support_ic_type &
  2181. (ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8195B)) {
  2182. pow = (val[3] & 0x3f);
  2183. pow = BYTE_DUPLICATE_2_DWORD(pow);
  2184. for (i = 0; i < ODM_RATEVHTSS2MCS9; i += 4)
  2185. rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);
  2186. } else if (dm->support_ic_type &
  2187. (ODM_RTL8197F | ODM_RTL8192F)) {
  2188. pow = (val[3] & 0x3f);
  2189. for (i = 0; i <= ODM_RATEMCS15; i++)
  2190. rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);
  2191. } else if (dm->support_ic_type & ODM_RTL8198F) {
  2192. pow = (val[3] & 0x7f);
  2193. for (i = 0; i <= ODM_RATEVHTSS4MCS9; i++)
  2194. rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);
  2195. } else if (dm->support_ic_type & ODM_RTL8822C) {
  2196. pow = (val[3] & 0x7f);
  2197. for (i = 0; i <= ODM_RATEMCS15; i++)
  2198. rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);
  2199. for (i = vht_start_rate; i <= ODM_RATEVHTSS2MCS9; i++)
  2200. rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);
  2201. }
  2202. if (rpt)
  2203. PDM_SNPF(out_len, used, output + used, out_len - used,
  2204. "Write all TXAGC of path-%d = 0x%x\n",
  2205. val[1], val[3]);
  2206. else
  2207. PDM_SNPF(out_len, used, output + used, out_len - used,
  2208. "Write all TXAGC of path-%d fail\n", val[1]);
  2209. }
  2210. #endif
  2211. *_used = used;
  2212. *_out_len = out_len;
  2213. }
  2214. void phydm_shift_txagc(void *dm_void, u32 *const val, u32 *_used, char *output,
  2215. u32 *_out_len)
  2216. {
  2217. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2218. u32 used = *_used;
  2219. u32 out_len = *_out_len;
  2220. u8 i = 0;
  2221. u32 pow = 0; /*Power index*/
  2222. boolean rpt = true;
  2223. u8 vht_start_rate = ODM_RATEVHTSS1MCS0;
  2224. enum rf_path path = RF_PATH_A;
  2225. #ifdef PHYDM_COMMON_API_SUPPORT
  2226. if (!(dm->support_ic_type & CMN_API_SUPPORT_IC))
  2227. return;
  2228. if (val[1] >= dm->num_rf_path) {
  2229. PDM_SNPF(out_len, used, output + used, out_len - used,
  2230. "Write path-%d fail\n", val[1]);
  2231. return;
  2232. }
  2233. path = (enum rf_path)val[1];
  2234. if ((u8)val[2] == 0) {
  2235. /*@{0:-, 1:+} {Pwr Offset}*/
  2236. if (dm->support_ic_type & (ODM_RTL8195B | ODM_RTL8821C)) {
  2237. for (i = 0; i <= ODM_RATEMCS7; i++) {
  2238. pow = phydm_api_get_txagc(dm, path, i) - val[3];
  2239. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2240. }
  2241. for (i = vht_start_rate; i <= ODM_RATEVHTSS1MCS9; i++) {
  2242. pow = phydm_api_get_txagc(dm, path, i) - val[3];
  2243. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2244. }
  2245. } else if (dm->support_ic_type & (ODM_RTL8822B)) {
  2246. for (i = 0; i <= ODM_RATEMCS15; i++) {
  2247. pow = phydm_api_get_txagc(dm, path, i) - val[3];
  2248. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2249. }
  2250. for (i = vht_start_rate; i <= ODM_RATEVHTSS2MCS9; i++) {
  2251. pow = phydm_api_get_txagc(dm, path, i) - val[3];
  2252. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2253. }
  2254. } else if (dm->support_ic_type &
  2255. (ODM_RTL8197F | ODM_RTL8192F)) {
  2256. for (i = 0; i <= ODM_RATEMCS15; i++) {
  2257. pow = phydm_api_get_txagc(dm, path, i) - val[3];
  2258. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2259. }
  2260. } else if (dm->support_ic_type & (ODM_RTL8822C)) {
  2261. rpt &= phydm_api_shift_txagc(dm, val[3], path, 0);
  2262. }
  2263. } else if ((u8)val[2] == 1) {
  2264. /*@{0:-, 1:+} {Pwr Offset}*/
  2265. if (dm->support_ic_type & (ODM_RTL8195B | ODM_RTL8821C)) {
  2266. for (i = 0; i <= ODM_RATEMCS7; i++) {
  2267. pow = phydm_api_get_txagc(dm, path, i) + val[3];
  2268. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2269. }
  2270. for (i = vht_start_rate; i <= ODM_RATEVHTSS1MCS9; i++) {
  2271. pow = phydm_api_get_txagc(dm, path, i) + val[3];
  2272. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2273. }
  2274. } else if (dm->support_ic_type & (ODM_RTL8822B)) {
  2275. for (i = 0; i <= ODM_RATEMCS15; i++) {
  2276. pow = phydm_api_get_txagc(dm, path, i) + val[3];
  2277. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2278. }
  2279. for (i = vht_start_rate; i <= ODM_RATEVHTSS2MCS9; i++) {
  2280. pow = phydm_api_get_txagc(dm, path, i) + val[3];
  2281. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2282. }
  2283. } else if (dm->support_ic_type &
  2284. (ODM_RTL8197F | ODM_RTL8192F)) {
  2285. for (i = 0; i <= ODM_RATEMCS15; i++) {
  2286. pow = phydm_api_get_txagc(dm, path, i) + val[3];
  2287. rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);
  2288. }
  2289. } else if (dm->support_ic_type & (ODM_RTL8822C)) {
  2290. rpt &= phydm_api_shift_txagc(dm, val[3], path, 1);
  2291. }
  2292. }
  2293. PDM_SNPF(out_len, used, output + used, out_len - used,
  2294. "[All rate] Set Path-%d Pow_idx: %s %d(%d.%s dB)\n",
  2295. val[1], (val[2] ? "+" : "-"), val[3], val[3] >> 1,
  2296. ((val[3] & 1) ? "5" : "0"));
  2297. #endif
  2298. *_used = used;
  2299. *_out_len = out_len;
  2300. }
  2301. void phydm_set_txagc_dbg(void *dm_void, char input[][16], u32 *_used,
  2302. char *output, u32 *_out_len)
  2303. {
  2304. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2305. u32 used = *_used;
  2306. u32 out_len = *_out_len;
  2307. u32 var1[10] = {0};
  2308. char help[] = "-h";
  2309. u8 i = 0, input_idx = 0;
  2310. for (i = 0; i < 5; i++) {
  2311. if (input[i + 1]) {
  2312. PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);
  2313. input_idx++;
  2314. }
  2315. }
  2316. if ((strcmp(input[1], help) == 0)) {
  2317. PDM_SNPF(out_len, used, output + used, out_len - used,
  2318. "{Dis:0, En:1} {pathA~D(0~3)} {rate_idx(Hex), All_rate:0xff} {txagc_idx (Hex)}\n");
  2319. PDM_SNPF(out_len, used, output + used, out_len - used,
  2320. "{Pwr Shift(All rate):2} {pathA~D(0~3)} {0:-, 1:+} {Pwr Offset(dec)}\n");
  2321. } else if (var1[0] == 0) {
  2322. dm->is_disable_phy_api = true;
  2323. PDM_SNPF(out_len, used, output + used, out_len - used,
  2324. "Disable API debug mode\n");
  2325. } else if (var1[0] == 1) {
  2326. dm->is_disable_phy_api = false;
  2327. phydm_set_txagc(dm, (u32 *)var1, &used, output, &out_len);
  2328. dm->is_disable_phy_api = true;
  2329. } else if (var1[0] == 2) {
  2330. PHYDM_SSCANF(input[4], DCMD_HEX, &var1[3]);
  2331. dm->is_disable_phy_api = false;
  2332. phydm_shift_txagc(dm, (u32 *)var1, &used, output, &out_len);
  2333. dm->is_disable_phy_api = true;
  2334. }
  2335. *_used = used;
  2336. *_out_len = out_len;
  2337. }
  2338. void phydm_debug_trace(void *dm_void, char input[][16], u32 *_used,
  2339. char *output, u32 *_out_len)
  2340. {
  2341. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2342. u64 pre_debug_components, one = 1;
  2343. u64 comp = 0;
  2344. u32 used = *_used;
  2345. u32 out_len = *_out_len;
  2346. u32 val[10] = {0};
  2347. u8 i;
  2348. for (i = 0; i < 5; i++) {
  2349. if (input[i + 1])
  2350. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);
  2351. }
  2352. comp = dm->debug_components;
  2353. pre_debug_components = dm->debug_components;
  2354. PDM_SNPF(out_len, used, output + used, out_len - used,
  2355. "\n================================\n");
  2356. if (val[0] == 100) {
  2357. PDM_SNPF(out_len, used, output + used, out_len - used,
  2358. "[DBG MSG] Component Selection\n");
  2359. PDM_SNPF(out_len, used, output + used, out_len - used,
  2360. "================================\n");
  2361. PDM_SNPF(out_len, used, output + used, out_len - used,
  2362. "00. (( %s ))DIG\n",
  2363. ((comp & DBG_DIG) ? ("V") : (".")));
  2364. PDM_SNPF(out_len, used, output + used, out_len - used,
  2365. "01. (( %s ))RA_MASK\n",
  2366. ((comp & DBG_RA_MASK) ? ("V") : (".")));
  2367. PDM_SNPF(out_len, used, output + used, out_len - used,
  2368. "02. (( %s ))DYN_TXPWR\n",
  2369. ((comp & DBG_DYN_TXPWR) ? ("V") : (".")));
  2370. PDM_SNPF(out_len, used, output + used, out_len - used,
  2371. "03. (( %s ))FA_CNT\n",
  2372. ((comp & DBG_FA_CNT) ? ("V") : (".")));
  2373. PDM_SNPF(out_len, used, output + used, out_len - used,
  2374. "04. (( %s ))RSSI_MNTR\n",
  2375. ((comp & DBG_RSSI_MNTR) ? ("V") : (".")));
  2376. PDM_SNPF(out_len, used, output + used, out_len - used,
  2377. "05. (( %s ))CCKPD\n",
  2378. ((comp & DBG_CCKPD) ? ("V") : (".")));
  2379. PDM_SNPF(out_len, used, output + used, out_len - used,
  2380. "06. (( %s ))ANT_DIV\n",
  2381. ((comp & DBG_ANT_DIV) ? ("V") : (".")));
  2382. PDM_SNPF(out_len, used, output + used, out_len - used,
  2383. "07. (( %s ))SMT_ANT\n",
  2384. ((comp & DBG_SMT_ANT) ? ("V") : (".")));
  2385. PDM_SNPF(out_len, used, output + used, out_len - used,
  2386. "08. (( %s ))PWR_TRAIN\n",
  2387. ((comp & DBG_PWR_TRAIN) ? ("V") : (".")));
  2388. PDM_SNPF(out_len, used, output + used, out_len - used,
  2389. "09. (( %s ))RA\n",
  2390. ((comp & DBG_RA) ? ("V") : (".")));
  2391. PDM_SNPF(out_len, used, output + used, out_len - used,
  2392. "10. (( %s ))PATH_DIV\n",
  2393. ((comp & DBG_PATH_DIV) ? ("V") : (".")));
  2394. PDM_SNPF(out_len, used, output + used, out_len - used,
  2395. "11. (( %s ))DFS\n",
  2396. ((comp & DBG_DFS) ? ("V") : (".")));
  2397. PDM_SNPF(out_len, used, output + used, out_len - used,
  2398. "12. (( %s ))DYN_ARFR\n",
  2399. ((comp & DBG_DYN_ARFR) ? ("V") : (".")));
  2400. PDM_SNPF(out_len, used, output + used, out_len - used,
  2401. "13. (( %s ))ADAPTIVITY\n",
  2402. ((comp & DBG_ADPTVTY) ? ("V") : (".")));
  2403. PDM_SNPF(out_len, used, output + used, out_len - used,
  2404. "14. (( %s ))CFO_TRK\n",
  2405. ((comp & DBG_CFO_TRK) ? ("V") : (".")));
  2406. PDM_SNPF(out_len, used, output + used, out_len - used,
  2407. "15. (( %s ))ENV_MNTR\n",
  2408. ((comp & DBG_ENV_MNTR) ? ("V") : (".")));
  2409. PDM_SNPF(out_len, used, output + used, out_len - used,
  2410. "16. (( %s ))PRI_CCA\n",
  2411. ((comp & DBG_PRI_CCA) ? ("V") : (".")));
  2412. PDM_SNPF(out_len, used, output + used, out_len - used,
  2413. "17. (( %s ))ADPTV_SOML\n",
  2414. ((comp & DBG_ADPTV_SOML) ? ("V") : (".")));
  2415. PDM_SNPF(out_len, used, output + used, out_len - used,
  2416. "18. (( %s ))LNA_SAT_CHK\n",
  2417. ((comp & DBG_LNA_SAT_CHK) ? ("V") : (".")));
  2418. PDM_SNPF(out_len, used, output + used, out_len - used,
  2419. "20. (( %s ))PHY_STATUS\n",
  2420. ((comp & DBG_PHY_STATUS) ? ("V") : (".")));
  2421. PDM_SNPF(out_len, used, output + used, out_len - used,
  2422. "21. (( %s ))TMP\n",
  2423. ((comp & DBG_TMP) ? ("V") : (".")));
  2424. PDM_SNPF(out_len, used, output + used, out_len - used,
  2425. "22. (( %s ))FW_DBG_TRACE\n",
  2426. ((comp & DBG_FW_TRACE) ? ("V") : (".")));
  2427. PDM_SNPF(out_len, used, output + used, out_len - used,
  2428. "23. (( %s ))TXBF\n",
  2429. ((comp & DBG_TXBF) ? ("V") : (".")));
  2430. PDM_SNPF(out_len, used, output + used, out_len - used,
  2431. "24. (( %s ))COMMON_FLOW\n",
  2432. ((comp & DBG_COMMON_FLOW) ? ("V") : (".")));
  2433. PDM_SNPF(out_len, used, output + used, out_len - used,
  2434. "28. (( %s ))PHY_CONFIG\n",
  2435. ((comp & ODM_PHY_CONFIG) ? ("V") : (".")));
  2436. PDM_SNPF(out_len, used, output + used, out_len - used,
  2437. "29. (( %s ))INIT\n",
  2438. ((comp & ODM_COMP_INIT) ? ("V") : (".")));
  2439. PDM_SNPF(out_len, used, output + used, out_len - used,
  2440. "30. (( %s ))COMMON\n",
  2441. ((comp & DBG_CMN) ? ("V") : (".")));
  2442. PDM_SNPF(out_len, used, output + used, out_len - used,
  2443. "31. (( %s ))API\n",
  2444. ((comp & ODM_COMP_API) ? ("V") : (".")));
  2445. PDM_SNPF(out_len, used, output + used, out_len - used,
  2446. "================================\n");
  2447. } else if (val[0] == 101) {
  2448. dm->debug_components = 0;
  2449. PDM_SNPF(out_len, used, output + used, out_len - used,
  2450. "Disable all debug components\n");
  2451. } else {
  2452. if (val[1] == 1) /*@enable*/
  2453. dm->debug_components |= (one << val[0]);
  2454. else if (val[1] == 2) /*@disable*/
  2455. dm->debug_components &= ~(one << val[0]);
  2456. else
  2457. PDM_SNPF(out_len, used, output + used, out_len - used,
  2458. "[Warning] 1:on, 2:off\n");
  2459. if ((BIT(val[0]) == DBG_PHY_STATUS) && val[1] == 1) {
  2460. dm->phy_dbg_info.show_phy_sts_all_pkt = (u8)val[2];
  2461. dm->phy_dbg_info.show_phy_sts_max_cnt = (u16)val[3];
  2462. PDM_SNPF(out_len, used, output + used, out_len - used,
  2463. "show_all_pkt=%d, show_max_num=%d\n\n",
  2464. dm->phy_dbg_info.show_phy_sts_all_pkt,
  2465. dm->phy_dbg_info.show_phy_sts_max_cnt);
  2466. } else if ((BIT(val[0]) == DBG_CMN) && (val[1] == 1)) {
  2467. dm->cmn_dbg_msg_period = (u8)val[2];
  2468. if (dm->cmn_dbg_msg_period < PHYDM_WATCH_DOG_PERIOD)
  2469. dm->cmn_dbg_msg_period = PHYDM_WATCH_DOG_PERIOD;
  2470. PDM_SNPF(out_len, used, output + used, out_len - used,
  2471. "cmn_dbg_msg_period=%d\n",
  2472. dm->cmn_dbg_msg_period);
  2473. }
  2474. }
  2475. PDM_SNPF(out_len, used, output + used, out_len - used,
  2476. "pre-DbgComponents = 0x%llx\n", pre_debug_components);
  2477. PDM_SNPF(out_len, used, output + used, out_len - used,
  2478. "Curr-DbgComponents = 0x%llx\n", dm->debug_components);
  2479. PDM_SNPF(out_len, used, output + used, out_len - used,
  2480. "================================\n");
  2481. *_used = used;
  2482. *_out_len = out_len;
  2483. }
  2484. void phydm_fw_debug_trace(void *dm_void, char input[][16], u32 *_used,
  2485. char *output, u32 *_out_len)
  2486. {
  2487. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2488. u32 used = *_used;
  2489. u32 out_len = *_out_len;
  2490. u32 val[10] = {0};
  2491. u8 i, input_idx = 0;
  2492. u32 pre_fw_debug_components = 0, one = 1;
  2493. u32 comp = 0;
  2494. for (i = 0; i < 5; i++) {
  2495. if (input[i + 1]) {
  2496. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);
  2497. input_idx++;
  2498. }
  2499. }
  2500. if (input_idx == 0)
  2501. return;
  2502. pre_fw_debug_components = dm->fw_debug_components;
  2503. comp = dm->fw_debug_components;
  2504. PDM_SNPF(out_len, used, output + used, out_len - used, "\n%s\n",
  2505. "================================");
  2506. if (val[0] == 100) {
  2507. PDM_SNPF(out_len, used, output + used, out_len - used, "%s\n",
  2508. "[FW Debug Component]");
  2509. PDM_SNPF(out_len, used, output + used, out_len - used, "%s\n",
  2510. "================================");
  2511. PDM_SNPF(out_len, used, output + used, out_len - used,
  2512. "00. (( %s ))RA\n",
  2513. ((comp & PHYDM_FW_COMP_RA) ? ("V") : (".")));
  2514. if (dm->support_ic_type & PHYDM_IC_3081_SERIES) {
  2515. PDM_SNPF(out_len, used, output + used, out_len - used,
  2516. "01. (( %s ))MU\n",
  2517. ((comp & PHYDM_FW_COMP_MU) ? ("V") : (".")));
  2518. PDM_SNPF(out_len, used, output + used, out_len - used,
  2519. "02. (( %s ))path Div\n",
  2520. ((comp &
  2521. PHYDM_FW_COMP_PATH_DIV) ? ("V") : (".")));
  2522. PDM_SNPF(out_len, used, output + used, out_len - used,
  2523. "03. (( %s ))Power training\n",
  2524. ((comp & PHYDM_FW_COMP_PT) ? ("V") : (".")));
  2525. }
  2526. PDM_SNPF(out_len, used, output + used, out_len - used, "%s\n",
  2527. "================================");
  2528. } else {
  2529. if (val[0] == 101) {
  2530. dm->fw_debug_components = 0;
  2531. PDM_SNPF(out_len, used, output + used, out_len - used,
  2532. "%s\n", "Clear all fw debug components");
  2533. } else {
  2534. if (val[1] == 1) /*@enable*/
  2535. dm->fw_debug_components |= (one << val[0]);
  2536. else if (val[1] == 2) /*@disable*/
  2537. dm->fw_debug_components &= ~(one << val[0]);
  2538. else
  2539. PDM_SNPF(out_len, used, output + used,
  2540. out_len - used, "%s\n",
  2541. "[Warning!!!] 1:enable, 2:disable");
  2542. }
  2543. comp = dm->fw_debug_components;
  2544. if (comp == 0) {
  2545. dm->debug_components &= ~DBG_FW_TRACE;
  2546. /*@H2C to enable C2H Msg*/
  2547. phydm_fw_trace_en_h2c(dm, false, comp, val[2], val[3]);
  2548. } else {
  2549. dm->debug_components |= DBG_FW_TRACE;
  2550. /*@H2C to enable C2H Msg*/
  2551. phydm_fw_trace_en_h2c(dm, true, comp, val[2], val[3]);
  2552. }
  2553. }
  2554. }
  2555. #if (ODM_IC_11N_SERIES_SUPPORT)
  2556. void phydm_dump_bb_reg_n(void *dm_void, u32 *_used, char *output, u32 *_out_len)
  2557. {
  2558. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2559. u32 addr = 0;
  2560. u32 used = *_used;
  2561. u32 out_len = *_out_len;
  2562. /*@For Nseries IC we only need to dump page8 to pageF using 3 digits*/
  2563. for (addr = 0x800; addr < 0xfff; addr += 4) {
  2564. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2565. "0x%03x 0x%08x\n",
  2566. addr, odm_get_bb_reg(dm, addr, MASKDWORD));
  2567. }
  2568. *_used = used;
  2569. *_out_len = out_len;
  2570. }
  2571. #endif
  2572. #if (ODM_IC_11AC_SERIES_SUPPORT)
  2573. void phydm_dump_bb_reg_ac(void *dm_void, u32 *_used, char *output,
  2574. u32 *_out_len)
  2575. {
  2576. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2577. u32 addr = 0;
  2578. u32 used = *_used;
  2579. u32 out_len = *_out_len;
  2580. for (addr = 0x800; addr < 0xfff; addr += 4) {
  2581. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2582. "0x%04x 0x%08x\n",
  2583. addr, odm_get_bb_reg(dm, addr, MASKDWORD));
  2584. }
  2585. if (!(dm->support_ic_type &
  2586. (ODM_RTL8822B | ODM_RTL8814A | ODM_RTL8821C)))
  2587. goto rpt_reg;
  2588. if (dm->rf_type > RF_2T2R) {
  2589. for (addr = 0x1800; addr < 0x18ff; addr += 4)
  2590. PDM_VAST_SNPF(out_len, used, output + used,
  2591. out_len - used, "0x%04x 0x%08x\n",
  2592. addr,
  2593. odm_get_bb_reg(dm, addr, MASKDWORD));
  2594. }
  2595. if (dm->rf_type > RF_3T3R) {
  2596. for (addr = 0x1a00; addr < 0x1aff; addr += 4)
  2597. PDM_VAST_SNPF(out_len, used, output + used,
  2598. out_len - used, "0x%04x 0x%08x\n",
  2599. addr,
  2600. odm_get_bb_reg(dm, addr, MASKDWORD));
  2601. }
  2602. for (addr = 0x1900; addr < 0x19ff; addr += 4)
  2603. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2604. "0x%04x 0x%08x\n",
  2605. addr, odm_get_bb_reg(dm, addr, MASKDWORD));
  2606. for (addr = 0x1c00; addr < 0x1cff; addr += 4)
  2607. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2608. "0x%04x 0x%08x\n",
  2609. addr, odm_get_bb_reg(dm, addr, MASKDWORD));
  2610. for (addr = 0x1f00; addr < 0x1fff; addr += 4)
  2611. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2612. "0x%04x 0x%08x\n",
  2613. addr, odm_get_bb_reg(dm, addr, MASKDWORD));
  2614. rpt_reg:
  2615. *_used = used;
  2616. *_out_len = out_len;
  2617. }
  2618. #endif
  2619. void phydm_dump_bb_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len)
  2620. {
  2621. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2622. u32 used = *_used;
  2623. u32 out_len = *_out_len;
  2624. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2625. "BB==========\n");
  2626. if (dm->support_ic_type & ODM_IC_11N_SERIES)
  2627. #if (ODM_IC_11N_SERIES_SUPPORT)
  2628. phydm_dump_bb_reg_n(dm, &used, output, &out_len);
  2629. #else
  2630. ;
  2631. #endif
  2632. else
  2633. #if (ODM_IC_11AC_SERIES_SUPPORT)
  2634. phydm_dump_bb_reg_ac(dm, &used, output, &out_len);
  2635. #else
  2636. ;
  2637. #endif
  2638. *_used = used;
  2639. *_out_len = out_len;
  2640. }
  2641. void phydm_dump_rf_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len)
  2642. {
  2643. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2644. u32 addr = 0;
  2645. u32 used = *_used;
  2646. u32 out_len = *_out_len;
  2647. u32 reg = 0;
  2648. /* @dump RF register */
  2649. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2650. "RF-A==========\n");
  2651. for (addr = 0; addr < 0xFF; addr++) {
  2652. reg = odm_get_rf_reg(dm, RF_PATH_A, addr, RFREG_MASK);
  2653. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2654. "0x%02x 0x%05x\n", addr, reg);
  2655. }
  2656. #ifdef PHYDM_COMPILE_ABOVE_2SS
  2657. if (dm->rf_type > RF_1T1R) {
  2658. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2659. "RF-B==========\n");
  2660. for (addr = 0; addr < 0xFF; addr++) {
  2661. reg = odm_get_rf_reg(dm, RF_PATH_B, addr, RFREG_MASK);
  2662. PDM_VAST_SNPF(out_len, used, output + used,
  2663. out_len - used, "0x%02x 0x%05x\n",
  2664. addr, reg);
  2665. }
  2666. }
  2667. #endif
  2668. #ifdef PHYDM_COMPILE_ABOVE_3SS
  2669. if (dm->rf_type > RF_2T2R) {
  2670. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2671. "RF-C==========\n");
  2672. for (addr = 0; addr < 0xFF; addr++) {
  2673. reg = odm_get_rf_reg(dm, RF_PATH_C, addr, RFREG_MASK);
  2674. PDM_VAST_SNPF(out_len, used, output + used,
  2675. out_len - used, "0x%02x 0x%05x\n",
  2676. addr, reg);
  2677. }
  2678. }
  2679. #endif
  2680. #ifdef PHYDM_COMPILE_ABOVE_4SS
  2681. if (dm->rf_type > RF_3T3R) {
  2682. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2683. "RF-D==========\n");
  2684. for (addr = 0; addr < 0xFF; addr++) {
  2685. reg = odm_get_rf_reg(dm, RF_PATH_D, addr, RFREG_MASK);
  2686. PDM_VAST_SNPF(out_len, used, output + used,
  2687. out_len - used, "0x%02x 0x%05x\n",
  2688. addr, reg);
  2689. }
  2690. }
  2691. #endif
  2692. *_used = used;
  2693. *_out_len = out_len;
  2694. }
  2695. void phydm_dump_mac_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len)
  2696. {
  2697. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2698. u32 addr = 0;
  2699. u32 used = *_used;
  2700. u32 out_len = *_out_len;
  2701. /* @dump MAC register */
  2702. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2703. "MAC==========\n");
  2704. for (addr = 0; addr < 0x7ff; addr += 4)
  2705. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2706. "0x%04x 0x%08x\n",
  2707. addr, odm_get_bb_reg(dm, addr, MASKDWORD));
  2708. for (addr = 0x1000; addr < 0x17ff; addr += 4)
  2709. PDM_VAST_SNPF(out_len, used, output + used, out_len - used,
  2710. "0x%04x 0x%08x\n",
  2711. addr, odm_get_bb_reg(dm, addr, MASKDWORD));
  2712. *_used = used;
  2713. *_out_len = out_len;
  2714. }
  2715. void phydm_dump_reg(void *dm_void, char input[][16], u32 *_used, char *output,
  2716. u32 *_out_len)
  2717. {
  2718. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2719. char help[] = "-h";
  2720. u32 var1[10] = {0};
  2721. u32 used = *_used;
  2722. u32 out_len = *_out_len;
  2723. if (input[1])
  2724. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  2725. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  2726. if ((strcmp(input[1], help) == 0)) {
  2727. PDM_SNPF(out_len, used, output + used, out_len - used,
  2728. "dumpreg {0:all, 1:BB, 2:RF, 3:MAC}\n");
  2729. } else if (var1[0] == 0) {
  2730. phydm_dump_mac_reg(dm, &used, output, &out_len);
  2731. phydm_dump_bb_reg(dm, &used, output, &out_len);
  2732. phydm_dump_rf_reg(dm, &used, output, &out_len);
  2733. } else if (var1[0] == 1) {
  2734. phydm_dump_bb_reg(dm, &used, output, &out_len);
  2735. } else if (var1[0] == 2) {
  2736. phydm_dump_rf_reg(dm, &used, output, &out_len);
  2737. } else if (var1[0] == 3) {
  2738. phydm_dump_mac_reg(dm, &used, output, &out_len);
  2739. }
  2740. *_used = used;
  2741. *_out_len = out_len;
  2742. }
  2743. void phydm_enable_big_jump(void *dm_void, char input[][16], u32 *_used,
  2744. char *output, u32 *_out_len)
  2745. {
  2746. #if (RTL8822B_SUPPORT)
  2747. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2748. struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
  2749. u32 dm_value[10] = {0};
  2750. u8 i, input_idx = 0;
  2751. u32 val;
  2752. if (!(dm->support_ic_type & ODM_RTL8822B))
  2753. return;
  2754. for (i = 0; i < 5; i++) {
  2755. if (input[i + 1]) {
  2756. PHYDM_SSCANF(input[i + 1], DCMD_HEX, &dm_value[i]);
  2757. input_idx++;
  2758. }
  2759. }
  2760. if (input_idx == 0)
  2761. return;
  2762. if (dm_value[0] == 0) {
  2763. dm->dm_dig_table.enable_adjust_big_jump = false;
  2764. val = (dig_t->big_jump_step3 << 5) |
  2765. (dig_t->big_jump_step2 << 3) |
  2766. dig_t->big_jump_step1;
  2767. odm_set_bb_reg(dm, R_0x8c8, 0xfe, val);
  2768. } else {
  2769. dm->dm_dig_table.enable_adjust_big_jump = true;
  2770. }
  2771. #endif
  2772. }
  2773. void phydm_show_rx_rate(void *dm_void, char input[][16], u32 *_used,
  2774. char *output, u32 *_out_len)
  2775. {
  2776. #if (RTL8822B_SUPPORT | RTL8821C_SUPPORT | RTL8814B_SUPPORT | RTL8195B_SUPPORT)
  2777. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2778. struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;
  2779. u32 used = *_used;
  2780. u32 out_len = *_out_len;
  2781. u32 var1[10] = {0};
  2782. char help[] = "-h";
  2783. u8 i, input_idx = 0;
  2784. for (i = 0; i < 5; i++) {
  2785. if (input[i + 1]) {
  2786. PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);
  2787. input_idx++;
  2788. }
  2789. }
  2790. if (input_idx == 0)
  2791. return;
  2792. if ((strcmp(input[1], help) == 0)) {
  2793. PDM_SNPF(out_len, used, output + used, out_len - used,
  2794. "{1: show Rx rate, 0:reset counter}\n");
  2795. *_used = used;
  2796. *_out_len = out_len;
  2797. return;
  2798. } else if (var1[0] == 0) {
  2799. phydm_reset_rx_rate_distribution(dm);
  2800. *_used = used;
  2801. *_out_len = out_len;
  2802. return;
  2803. }
  2804. /* @==Show SU Rate====================================================*/
  2805. PDM_SNPF(out_len, used, output + used, out_len - used,
  2806. "=====Rx SU rate Statistics=====\n");
  2807. PDM_SNPF(out_len, used, output + used, out_len - used,
  2808. "[SU][1SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",
  2809. dbg->num_qry_vht_pkt[0], dbg->num_qry_vht_pkt[1],
  2810. dbg->num_qry_vht_pkt[2], dbg->num_qry_vht_pkt[3],
  2811. dbg->num_qry_vht_pkt[4], dbg->num_qry_vht_pkt[5],
  2812. dbg->num_qry_vht_pkt[6], dbg->num_qry_vht_pkt[7],
  2813. dbg->num_qry_vht_pkt[8], dbg->num_qry_vht_pkt[9]);
  2814. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  2815. if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS)) {
  2816. PDM_SNPF(out_len, used, output + used, out_len - used,
  2817. "[SU][2SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",
  2818. dbg->num_qry_vht_pkt[10], dbg->num_qry_vht_pkt[11],
  2819. dbg->num_qry_vht_pkt[12], dbg->num_qry_vht_pkt[13],
  2820. dbg->num_qry_vht_pkt[14], dbg->num_qry_vht_pkt[15],
  2821. dbg->num_qry_vht_pkt[16], dbg->num_qry_vht_pkt[17],
  2822. dbg->num_qry_vht_pkt[18], dbg->num_qry_vht_pkt[19]);
  2823. }
  2824. #endif
  2825. /* @==Show MU Rate====================================================*/
  2826. #if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT) || (defined(PHYSTS_3RD_TYPE_SUPPORT))
  2827. PDM_SNPF(out_len, used, output + used, out_len - used,
  2828. "=====Rx MU rate Statistics=====\n");
  2829. PDM_SNPF(out_len, used, output + used, out_len - used,
  2830. "[MU][1SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",
  2831. dbg->num_mu_vht_pkt[0], dbg->num_mu_vht_pkt[1],
  2832. dbg->num_mu_vht_pkt[2], dbg->num_mu_vht_pkt[3],
  2833. dbg->num_mu_vht_pkt[4], dbg->num_mu_vht_pkt[5],
  2834. dbg->num_mu_vht_pkt[6], dbg->num_mu_vht_pkt[7],
  2835. dbg->num_mu_vht_pkt[8], dbg->num_mu_vht_pkt[9]);
  2836. #if (defined(PHYDM_COMPILE_ABOVE_2SS))
  2837. if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS)) {
  2838. PDM_SNPF(out_len, used, output + used, out_len - used,
  2839. "[MU][2SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",
  2840. dbg->num_mu_vht_pkt[10], dbg->num_mu_vht_pkt[11],
  2841. dbg->num_mu_vht_pkt[12], dbg->num_mu_vht_pkt[13],
  2842. dbg->num_mu_vht_pkt[14], dbg->num_mu_vht_pkt[15],
  2843. dbg->num_mu_vht_pkt[16], dbg->num_mu_vht_pkt[17],
  2844. dbg->num_mu_vht_pkt[18], dbg->num_mu_vht_pkt[19]);
  2845. }
  2846. #endif
  2847. #endif
  2848. *_used = used;
  2849. *_out_len = out_len;
  2850. #endif
  2851. }
  2852. void phydm_per_tone_evm(void *dm_void, char input[][16], u32 *_used,
  2853. char *output, u32 *_out_len)
  2854. {
  2855. struct dm_struct *dm = (struct dm_struct *)dm_void;
  2856. u8 i, j;
  2857. u32 used = *_used;
  2858. u32 out_len = *_out_len;
  2859. u32 var1[4] = {0};
  2860. u32 val, tone_num, round;
  2861. s8 rxevm_0, rxevm_1;
  2862. s32 avg_num, evm_tone_0[256] = {0}, evm_tone_1[256] = {0};
  2863. s32 rxevm_sum_0, rxevm_sum_1;
  2864. if (dm->support_ic_type & ODM_IC_11N_SERIES) {
  2865. pr_debug("n series not support yet !\n");
  2866. return;
  2867. }
  2868. for (i = 0; i < 4; i++) {
  2869. if (input[i + 1])
  2870. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);
  2871. }
  2872. avg_num = var1[0];
  2873. round = var1[1];
  2874. if (!dm->is_linked) {
  2875. PDM_SNPF(out_len, used, output + used, out_len - used,
  2876. "No Link !!\n");
  2877. *_used = used;
  2878. *_out_len = out_len;
  2879. return;
  2880. }
  2881. pr_debug("ID=((%d)), BW=((%d)), fc=((CH-%d))\n", dm->curr_station_id,
  2882. 20 << *dm->band_width, *dm->channel);
  2883. pr_debug("avg_num =((%d)), round =((%d))\n", avg_num, round);
  2884. #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
  2885. watchdog_stop(dm->priv);
  2886. #endif
  2887. for (j = 0; j < round; j++) {
  2888. pr_debug("\nround((%d))\n", (j + 1));
  2889. if (*dm->band_width == CHANNEL_WIDTH_20) {
  2890. for (tone_num = 228; tone_num <= 255; tone_num++) {
  2891. odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);
  2892. rxevm_sum_0 = 0;
  2893. rxevm_sum_1 = 0;
  2894. for (i = 0; i < avg_num; i++) {
  2895. val = odm_read_4byte(dm, R_0xf8c);
  2896. rxevm_0 = (s8)((val & MASKBYTE2) >> 16);
  2897. rxevm_0 = (rxevm_0 / 2);
  2898. if (rxevm_0 < -63)
  2899. rxevm_0 = 0;
  2900. rxevm_1 = (s8)((val & MASKBYTE3) >> 24);
  2901. rxevm_1 = (rxevm_1 / 2);
  2902. if (rxevm_1 < -63)
  2903. rxevm_1 = 0;
  2904. rxevm_sum_0 += rxevm_0;
  2905. rxevm_sum_1 += rxevm_1;
  2906. ODM_delay_ms(1);
  2907. }
  2908. evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);
  2909. evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);
  2910. pr_debug("Tone(-%-3d) RXEVM(1ss/2ss)=%d, %d\n",
  2911. (256 - tone_num), evm_tone_0[tone_num],
  2912. evm_tone_1[tone_num]);
  2913. }
  2914. for (tone_num = 1; tone_num <= 28; tone_num++) {
  2915. odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);
  2916. rxevm_sum_0 = 0;
  2917. rxevm_sum_1 = 0;
  2918. for (i = 0; i < avg_num; i++) {
  2919. val = odm_read_4byte(dm, R_0xf8c);
  2920. rxevm_0 = (s8)((val & MASKBYTE2) >> 16);
  2921. rxevm_0 = (rxevm_0 / 2);
  2922. if (rxevm_0 < -63)
  2923. rxevm_0 = 0;
  2924. rxevm_1 = (s8)((val & MASKBYTE3) >> 24);
  2925. rxevm_1 = (rxevm_1 / 2);
  2926. if (rxevm_1 < -63)
  2927. rxevm_1 = 0;
  2928. rxevm_sum_0 += rxevm_0;
  2929. rxevm_sum_1 += rxevm_1;
  2930. ODM_delay_ms(1);
  2931. }
  2932. evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);
  2933. evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);
  2934. pr_debug("Tone(%-3d) RXEVM(1ss/2ss)=%d, %d\n",
  2935. tone_num, evm_tone_0[tone_num],
  2936. evm_tone_1[tone_num]);
  2937. }
  2938. } else if (*dm->band_width == CHANNEL_WIDTH_40) {
  2939. for (tone_num = 198; tone_num <= 254; tone_num++) {
  2940. odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);
  2941. rxevm_sum_0 = 0;
  2942. rxevm_sum_1 = 0;
  2943. for (i = 0; i < avg_num; i++) {
  2944. val = odm_read_4byte(dm, R_0xf8c);
  2945. rxevm_0 = (s8)((val & MASKBYTE2) >> 16);
  2946. rxevm_0 = (rxevm_0 / 2);
  2947. if (rxevm_0 < -63)
  2948. rxevm_0 = 0;
  2949. rxevm_1 = (s8)((val & MASKBYTE3) >> 24);
  2950. rxevm_1 = (rxevm_1 / 2);
  2951. if (rxevm_1 < -63)
  2952. rxevm_1 = 0;
  2953. rxevm_sum_0 += rxevm_0;
  2954. rxevm_sum_1 += rxevm_1;
  2955. ODM_delay_ms(1);
  2956. }
  2957. evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);
  2958. evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);
  2959. pr_debug("Tone(-%-3d) RXEVM(1ss/2ss)=%d, %d\n",
  2960. (256 - tone_num), evm_tone_0[tone_num],
  2961. evm_tone_1[tone_num]);
  2962. }
  2963. for (tone_num = 2; tone_num <= 58; tone_num++) {
  2964. odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);
  2965. rxevm_sum_0 = 0;
  2966. rxevm_sum_1 = 0;
  2967. for (i = 0; i < avg_num; i++) {
  2968. val = odm_read_4byte(dm, R_0xf8c);
  2969. rxevm_0 = (s8)((val & MASKBYTE2) >> 16);
  2970. rxevm_0 = (rxevm_0 / 2);
  2971. if (rxevm_0 < -63)
  2972. rxevm_0 = 0;
  2973. rxevm_1 = (s8)((val & MASKBYTE3) >> 24);
  2974. rxevm_1 = (rxevm_1 / 2);
  2975. if (rxevm_1 < -63)
  2976. rxevm_1 = 0;
  2977. rxevm_sum_0 += rxevm_0;
  2978. rxevm_sum_1 += rxevm_1;
  2979. ODM_delay_ms(1);
  2980. }
  2981. evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);
  2982. evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);
  2983. pr_debug("Tone(%-3d) RXEVM(1ss/2ss)=%d, %d\n",
  2984. tone_num, evm_tone_0[tone_num],
  2985. evm_tone_1[tone_num]);
  2986. }
  2987. } else if (*dm->band_width == CHANNEL_WIDTH_80) {
  2988. for (tone_num = 134; tone_num <= 254; tone_num++) {
  2989. odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);
  2990. rxevm_sum_0 = 0;
  2991. rxevm_sum_1 = 0;
  2992. for (i = 0; i < avg_num; i++) {
  2993. val = odm_read_4byte(dm, R_0xf8c);
  2994. rxevm_0 = (s8)((val & MASKBYTE2) >> 16);
  2995. rxevm_0 = (rxevm_0 / 2);
  2996. if (rxevm_0 < -63)
  2997. rxevm_0 = 0;
  2998. rxevm_1 = (s8)((val & MASKBYTE3) >> 24);
  2999. rxevm_1 = (rxevm_1 / 2);
  3000. if (rxevm_1 < -63)
  3001. rxevm_1 = 0;
  3002. rxevm_sum_0 += rxevm_0;
  3003. rxevm_sum_1 += rxevm_1;
  3004. ODM_delay_ms(1);
  3005. }
  3006. evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);
  3007. evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);
  3008. pr_debug("Tone(-%-3d) RXEVM(1ss/2ss)=%d, %d\n",
  3009. (256 - tone_num), evm_tone_0[tone_num],
  3010. evm_tone_1[tone_num]);
  3011. }
  3012. for (tone_num = 2; tone_num <= 122; tone_num++) {
  3013. odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);
  3014. rxevm_sum_0 = 0;
  3015. rxevm_sum_1 = 0;
  3016. for (i = 0; i < avg_num; i++) {
  3017. val = odm_read_4byte(dm, R_0xf8c);
  3018. rxevm_0 = (s8)((val & MASKBYTE2) >> 16);
  3019. rxevm_0 = (rxevm_0 / 2);
  3020. if (rxevm_0 < -63)
  3021. rxevm_0 = 0;
  3022. rxevm_1 = (s8)((val & MASKBYTE3) >> 24);
  3023. rxevm_1 = (rxevm_1 / 2);
  3024. if (rxevm_1 < -63)
  3025. rxevm_1 = 0;
  3026. rxevm_sum_0 += rxevm_0;
  3027. rxevm_sum_1 += rxevm_1;
  3028. ODM_delay_ms(1);
  3029. }
  3030. evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);
  3031. evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);
  3032. pr_debug("Tone(%-3d) RXEVM (1ss/2ss)=%d, %d\n",
  3033. tone_num, evm_tone_0[tone_num],
  3034. evm_tone_1[tone_num]);
  3035. }
  3036. }
  3037. }
  3038. *_used = used;
  3039. *_out_len = out_len;
  3040. }
  3041. void phydm_api_adjust(void *dm_void, char input[][16], u32 *_used, char *output,
  3042. u32 *_out_len)
  3043. {
  3044. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3045. char help[] = "-h";
  3046. u32 var1[10] = {0};
  3047. u32 used = *_used;
  3048. u32 out_len = *_out_len;
  3049. u8 i;
  3050. boolean is_enable_dbg_mode;
  3051. u8 central_ch, primary_ch_idx;
  3052. enum channel_width bw;
  3053. #ifdef PHYDM_COMMON_API_SUPPORT
  3054. if ((strcmp(input[1], help) == 0)) {
  3055. PDM_SNPF(out_len, used, output + used, out_len - used,
  3056. "{en} {CH} {pr_ch 1/2/3/4/9/10} {0:20M,1:40M,2:80M}\n");
  3057. goto out;
  3058. }
  3059. if (!(dm->support_ic_type & CMN_API_SUPPORT_IC)) {
  3060. PDM_SNPF(out_len, used, output + used, out_len - used,
  3061. "This IC doesn't support PHYDM API function\n");
  3062. goto out;
  3063. }
  3064. for (i = 0; i < 4; i++) {
  3065. if (input[i + 1])
  3066. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);
  3067. }
  3068. is_enable_dbg_mode = (boolean)var1[0];
  3069. central_ch = (u8)var1[1];
  3070. primary_ch_idx = (u8)var1[2];
  3071. bw = (enum channel_width)var1[3];
  3072. if (is_enable_dbg_mode) {
  3073. dm->is_disable_phy_api = false;
  3074. phydm_api_switch_bw_channel(dm, central_ch, primary_ch_idx, bw);
  3075. dm->is_disable_phy_api = true;
  3076. PDM_SNPF(out_len, used, output + used, out_len - used,
  3077. "central_ch = %d, primary_ch_idx = %d, bw = %d\n",
  3078. central_ch, primary_ch_idx, bw);
  3079. } else {
  3080. dm->is_disable_phy_api = false;
  3081. PDM_SNPF(out_len, used, output + used, out_len - used,
  3082. "Disable API debug mode\n");
  3083. }
  3084. out:
  3085. #else
  3086. PDM_SNPF(out_len, used, output + used, out_len - used,
  3087. "This IC doesn't support PHYDM API function\n");
  3088. #endif
  3089. *_used = used;
  3090. *_out_len = out_len;
  3091. }
  3092. void phydm_parameter_adjust(void *dm_void, char input[][16], u32 *_used,
  3093. char *output, u32 *_out_len)
  3094. {
  3095. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3096. struct phydm_cfo_track_struct *cfo_track = &dm->dm_cfo_track;
  3097. char help[] = "-h";
  3098. u32 var1[10] = {0};
  3099. u32 used = *_used;
  3100. u32 out_len = *_out_len;
  3101. if ((strcmp(input[1], help) == 0)) {
  3102. PDM_SNPF(out_len, used, output + used, out_len - used,
  3103. "1. X_cap = ((0x%x))\n", cfo_track->crystal_cap);
  3104. } else {
  3105. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  3106. if (var1[0] == 0) {
  3107. PHYDM_SSCANF(input[2], DCMD_HEX, &var1[1]);
  3108. phydm_set_crystal_cap(dm, (u8)var1[1]);
  3109. PDM_SNPF(out_len, used, output + used, out_len - used,
  3110. "X_cap = ((0x%x))\n", cfo_track->crystal_cap);
  3111. }
  3112. }
  3113. *_used = used;
  3114. *_out_len = out_len;
  3115. }
  3116. void phydm_ext_rf_element_ctrl(void *dm_void, char input[][16], u32 *_used,
  3117. char *output, u32 *_out_len)
  3118. {
  3119. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3120. u32 val[10] = {0};
  3121. u8 i = 0, input_idx = 0;
  3122. for (i = 0; i < 5; i++) {
  3123. if (input[i + 1]) {
  3124. PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);
  3125. input_idx++;
  3126. }
  3127. }
  3128. if (input_idx == 0)
  3129. return;
  3130. if (val[0] == 1) /*@ext switch*/ {
  3131. phydm_set_ext_switch(dm, val[1]);
  3132. }
  3133. }
  3134. void phydm_print_dbgport(void *dm_void, char input[][16], u32 *_used,
  3135. char *output, u32 *_out_len)
  3136. {
  3137. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3138. char help[] = "-h";
  3139. u32 var1[10] = {0};
  3140. u32 used = *_used;
  3141. u32 out_len = *_out_len;
  3142. u32 dbg_port_value = 0;
  3143. u8 val[32];
  3144. u8 tmp = 0;
  3145. u8 i;
  3146. if (strcmp(input[1], help) == 0) {
  3147. PDM_SNPF(out_len, used, output + used, out_len - used,
  3148. "{dbg_port_idx}\n");
  3149. goto out;
  3150. }
  3151. PHYDM_SSCANF(input[1], DCMD_HEX, &var1[0]);
  3152. dm->debug_components |= ODM_COMP_API;
  3153. if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, var1[0])) {
  3154. dbg_port_value = phydm_get_bb_dbg_port_val(dm);
  3155. phydm_release_bb_dbg_port(dm);
  3156. for (i = 0; i < 32; i++)
  3157. val[i] = (u8)((dbg_port_value & BIT(i)) >> i);
  3158. PDM_SNPF(out_len, used, output + used, out_len - used,
  3159. "Dbg Port[0x%x] = ((0x%x))\n", var1[0],
  3160. dbg_port_value);
  3161. for (i = 4; i != 0; i--) {
  3162. tmp = 8 * (i - 1);
  3163. PDM_SNPF(out_len, used, output + used, out_len - used,
  3164. "val[%d:%d] = 8b'%d %d %d %d %d %d %d %d\n",
  3165. tmp + 7, tmp, val[tmp + 7], val[tmp + 6],
  3166. val[tmp + 5], val[tmp + 4], val[tmp + 3],
  3167. val[tmp + 2], val[tmp + 1], val[tmp + 0]);
  3168. }
  3169. }
  3170. dm->debug_components &= (~ODM_COMP_API);
  3171. out:
  3172. *_used = used;
  3173. *_out_len = out_len;
  3174. }
  3175. struct phydm_command {
  3176. char name[16];
  3177. u8 id;
  3178. };
  3179. enum PHYDM_CMD_ID {
  3180. PHYDM_HELP,
  3181. PHYDM_DEMO,
  3182. PHYDM_RF_CMD,
  3183. PHYDM_DIG,
  3184. PHYDM_RA,
  3185. PHYDM_PROFILE,
  3186. PHYDM_ANTDIV,
  3187. PHYDM_PATHDIV,
  3188. PHYDM_DEBUG,
  3189. PHYDM_FW_DEBUG,
  3190. PHYDM_SUPPORT_ABILITY,
  3191. PHYDM_GET_TXAGC,
  3192. PHYDM_SET_TXAGC,
  3193. PHYDM_SMART_ANT,
  3194. PHYDM_API,
  3195. PHYDM_TRX_PATH,
  3196. PHYDM_LA_MODE,
  3197. PHYDM_DUMP_REG,
  3198. PHYDM_AUTO_DBG,
  3199. PHYDM_BIG_JUMP,
  3200. PHYDM_SHOW_RXRATE,
  3201. PHYDM_NBI_EN,
  3202. PHYDM_CSI_MASK_EN,
  3203. PHYDM_DFS_DEBUG,
  3204. PHYDM_NHM,
  3205. PHYDM_CLM,
  3206. PHYDM_FAHM,
  3207. PHYDM_ENV_MNTR,
  3208. PHYDM_BB_INFO,
  3209. PHYDM_TXBF,
  3210. PHYDM_H2C,
  3211. PHYDM_EXT_RF_E_CTRL,
  3212. PHYDM_ADAPTIVE_SOML,
  3213. PHYDM_PSD,
  3214. PHYDM_DEBUG_PORT,
  3215. PHYDM_DIS_HTSTF_CONTROL,
  3216. PHYDM_TUNE_PARAMETER,
  3217. PHYDM_ADAPTIVITY_DEBUG,
  3218. PHYDM_DIS_DYM_ANT_WEIGHTING,
  3219. PHYDM_FORECE_PT_STATE,
  3220. PHYDM_DIS_RXHP_CTR,
  3221. PHYDM_STA_INFO,
  3222. PHYDM_PAUSE_FUNC,
  3223. PHYDM_PER_TONE_EVM,
  3224. PHYDM_DYN_TXPWR,
  3225. PHYDM_LNA_SAT
  3226. };
  3227. struct phydm_command phy_dm_ary[] = {
  3228. {"-h", PHYDM_HELP}, /*@do not move this element to other position*/
  3229. {"demo", PHYDM_DEMO}, /*@do not move this element to other position*/
  3230. {"rf", PHYDM_RF_CMD},
  3231. {"dig", PHYDM_DIG},
  3232. {"ra", PHYDM_RA},
  3233. {"profile", PHYDM_PROFILE},
  3234. {"antdiv", PHYDM_ANTDIV},
  3235. {"pathdiv", PHYDM_PATHDIV},
  3236. {"dbg", PHYDM_DEBUG},
  3237. {"fw_dbg", PHYDM_FW_DEBUG},
  3238. {"ability", PHYDM_SUPPORT_ABILITY},
  3239. {"get_txagc", PHYDM_GET_TXAGC},
  3240. {"set_txagc", PHYDM_SET_TXAGC},
  3241. {"smtant", PHYDM_SMART_ANT},
  3242. {"api", PHYDM_API},
  3243. {"trxpath", PHYDM_TRX_PATH},
  3244. {"lamode", PHYDM_LA_MODE},
  3245. {"dumpreg", PHYDM_DUMP_REG},
  3246. {"auto_dbg", PHYDM_AUTO_DBG},
  3247. {"bigjump", PHYDM_BIG_JUMP},
  3248. {"rxrate", PHYDM_SHOW_RXRATE},
  3249. {"nbi", PHYDM_NBI_EN},
  3250. {"csi_mask", PHYDM_CSI_MASK_EN},
  3251. {"dfs", PHYDM_DFS_DEBUG},
  3252. {"nhm", PHYDM_NHM},
  3253. {"clm", PHYDM_CLM},
  3254. {"fahm", PHYDM_FAHM},
  3255. {"env_mntr", PHYDM_ENV_MNTR},
  3256. {"bbinfo", PHYDM_BB_INFO},
  3257. {"txbf", PHYDM_TXBF},
  3258. {"h2c", PHYDM_H2C},
  3259. {"ext_rfe", PHYDM_EXT_RF_E_CTRL},
  3260. {"soml", PHYDM_ADAPTIVE_SOML},
  3261. {"psd", PHYDM_PSD},
  3262. {"dbgport", PHYDM_DEBUG_PORT},
  3263. {"dis_htstf", PHYDM_DIS_HTSTF_CONTROL},
  3264. {"tune_para", PHYDM_TUNE_PARAMETER},
  3265. {"adapt_debug", PHYDM_ADAPTIVITY_DEBUG},
  3266. {"dis_dym_ant_wgt", PHYDM_DIS_DYM_ANT_WEIGHTING},
  3267. {"force_pt_state", PHYDM_FORECE_PT_STATE},
  3268. {"dis_drxhp", PHYDM_DIS_RXHP_CTR},
  3269. {"sta_info", PHYDM_STA_INFO},
  3270. {"pause", PHYDM_PAUSE_FUNC},
  3271. {"evm", PHYDM_PER_TONE_EVM},
  3272. {"dyn_txpwr", PHYDM_DYN_TXPWR},
  3273. {"lna_sat", PHYDM_LNA_SAT} };
  3274. #endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/
  3275. void phydm_cmd_parser(struct dm_struct *dm, char input[][MAX_ARGV],
  3276. u32 input_num, u8 flag, char *output, u32 out_len)
  3277. {
  3278. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  3279. u32 used = 0;
  3280. u8 id = 0;
  3281. u32 var1[10] = {0};
  3282. u32 i;
  3283. u32 phydm_ary_size = sizeof(phy_dm_ary) / sizeof(struct phydm_command);
  3284. if (flag == 0) {
  3285. PDM_SNPF(out_len, used, output + used, out_len - used,
  3286. "GET, nothing to print\n");
  3287. return;
  3288. }
  3289. PDM_SNPF(out_len, used, output + used, out_len - used, "\n");
  3290. /* Parsing Cmd ID */
  3291. if (input_num) {
  3292. for (i = 0; i < phydm_ary_size; i++) {
  3293. if (strcmp(phy_dm_ary[i].name, input[0]) == 0) {
  3294. id = phy_dm_ary[i].id;
  3295. break;
  3296. }
  3297. }
  3298. if (i == phydm_ary_size) {
  3299. PDM_SNPF(out_len, used, output + used, out_len - used,
  3300. "PHYDM command not found!\n");
  3301. return;
  3302. }
  3303. }
  3304. switch (id) {
  3305. case PHYDM_HELP: {
  3306. PDM_SNPF(out_len, used, output + used, out_len - used,
  3307. "BB cmd ==>\n");
  3308. for (i = 0; i < phydm_ary_size - 2; i++)
  3309. PDM_SNPF(out_len, used, output + used, out_len - used,
  3310. " %-5d: %s\n", i, phy_dm_ary[i + 2].name);
  3311. } break;
  3312. case PHYDM_DEMO: { /*@echo demo 10 0x3a z abcde >cmd*/
  3313. u32 directory = 0;
  3314. #if (DM_ODM_SUPPORT_TYPE & (ODM_CE | ODM_AP))
  3315. char char_temp;
  3316. #else
  3317. u32 char_temp = ' ';
  3318. #endif
  3319. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &directory);
  3320. PDM_SNPF(out_len, used, output + used, out_len - used,
  3321. "Decimal value = %d\n", directory);
  3322. PHYDM_SSCANF(input[2], DCMD_HEX, &directory);
  3323. PDM_SNPF(out_len, used, output + used, out_len - used,
  3324. "Hex value = 0x%x\n", directory);
  3325. PHYDM_SSCANF(input[3], DCMD_CHAR, &char_temp);
  3326. PDM_SNPF(out_len, used, output + used, out_len - used,
  3327. "Char = %c\n", char_temp);
  3328. PDM_SNPF(out_len, used, output + used, out_len - used,
  3329. "String = %s\n", input[4]);
  3330. } break;
  3331. case PHYDM_RF_CMD:
  3332. halrf_cmd_parser(dm, input, &used, output, &out_len, input_num);
  3333. break;
  3334. case PHYDM_DIG:
  3335. phydm_dig_debug(dm, input, &used, output, &out_len);
  3336. break;
  3337. case PHYDM_RA:
  3338. phydm_ra_debug(dm, input, &used, output, &out_len);
  3339. break;
  3340. case PHYDM_ANTDIV:
  3341. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  3342. phydm_antdiv_debug(dm, input, &used, output, &out_len);
  3343. #endif
  3344. break;
  3345. case PHYDM_PATHDIV:
  3346. #if (defined(CONFIG_PATH_DIVERSITY))
  3347. phydm_pathdiv_debug(dm, input, &used, output, &out_len);
  3348. #endif
  3349. break;
  3350. case PHYDM_DEBUG:
  3351. phydm_debug_trace(dm, input, &used, output, &out_len);
  3352. break;
  3353. case PHYDM_FW_DEBUG:
  3354. phydm_fw_debug_trace(dm, input, &used, output, &out_len);
  3355. break;
  3356. case PHYDM_SUPPORT_ABILITY:
  3357. phydm_supportability_en(dm, input, &used, output, &out_len);
  3358. break;
  3359. case PHYDM_SMART_ANT:
  3360. #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))
  3361. #ifdef CONFIG_HL_SMART_ANTENNA_TYPE2
  3362. phydm_hl_smt_ant_dbg_type2(dm, input, &used, output, &out_len);
  3363. #elif (defined(CONFIG_HL_SMART_ANTENNA_TYPE1))
  3364. phydm_hl_smart_ant_debug(dm, input, &used, output, &out_len);
  3365. #endif
  3366. #elif (defined(CONFIG_CUMITEK_SMART_ANTENNA))
  3367. phydm_cumitek_smt_ant_debug(dm, input, &used, output, &out_len);
  3368. #endif
  3369. break;
  3370. case PHYDM_API:
  3371. phydm_api_adjust(dm, input, &used, output, &out_len);
  3372. break;
  3373. case PHYDM_PROFILE:
  3374. phydm_basic_profile(dm, &used, output, &out_len);
  3375. break;
  3376. case PHYDM_GET_TXAGC:
  3377. phydm_get_txagc(dm, &used, output, &out_len);
  3378. break;
  3379. case PHYDM_SET_TXAGC:
  3380. phydm_set_txagc_dbg(dm, input, &used, output, &out_len);
  3381. break;
  3382. case PHYDM_TRX_PATH:
  3383. phydm_config_trx_path(dm, input, &used, output, &out_len);
  3384. break;
  3385. case PHYDM_LA_MODE:
  3386. #if (PHYDM_LA_MODE_SUPPORT)
  3387. phydm_lamode_trigger_cmd(dm, input, &used, output, &out_len);
  3388. #endif
  3389. break;
  3390. case PHYDM_DUMP_REG:
  3391. phydm_dump_reg(dm, input, &used, output, &out_len);
  3392. break;
  3393. case PHYDM_BIG_JUMP:
  3394. phydm_enable_big_jump(dm, input, &used, output, &out_len);
  3395. break;
  3396. case PHYDM_AUTO_DBG:
  3397. #ifdef PHYDM_AUTO_DEGBUG
  3398. phydm_auto_dbg_console(dm, input, &used, output, &out_len);
  3399. #endif
  3400. break;
  3401. case PHYDM_SHOW_RXRATE:
  3402. phydm_show_rx_rate(dm, input, &used, output, &out_len);
  3403. break;
  3404. case PHYDM_NBI_EN:
  3405. phydm_nbi_debug(dm, input, &used, output, &out_len);
  3406. break;
  3407. case PHYDM_CSI_MASK_EN:
  3408. phydm_csi_debug(dm, input, &used, output, &out_len);
  3409. break;
  3410. case PHYDM_DFS_DEBUG: {
  3411. #ifdef CONFIG_PHYDM_DFS_MASTER
  3412. phydm_dfs_debug(dm, input, &used, output, &out_len);
  3413. #endif
  3414. break;
  3415. }
  3416. case PHYDM_NHM:
  3417. #ifdef NHM_SUPPORT
  3418. phydm_nhm_dbg(dm, input, &used, output, &out_len);
  3419. #endif
  3420. break;
  3421. case PHYDM_CLM:
  3422. #ifdef CLM_SUPPORT
  3423. phydm_clm_dbg(dm, input, &used, output, &out_len);
  3424. #endif
  3425. break;
  3426. #ifdef FAHM_SUPPORT
  3427. case PHYDM_FAHM:
  3428. phydm_fahm_dbg(dm, input, &used, output, &out_len);
  3429. break;
  3430. #endif
  3431. case PHYDM_ENV_MNTR:
  3432. phydm_env_mntr_dbg(dm, input, &used, output, &out_len);
  3433. break;
  3434. case PHYDM_BB_INFO:
  3435. phydm_bb_hw_dbg_info(dm, input, &used, output, &out_len);
  3436. break;
  3437. case PHYDM_TXBF: {
  3438. #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
  3439. #if (BEAMFORMING_SUPPORT)
  3440. struct _RT_BEAMFORMING_INFO *beamforming_info = NULL;
  3441. beamforming_info = &dm->beamforming_info;
  3442. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  3443. if (var1[0] == 0) {
  3444. beamforming_info->apply_v_matrix = false;
  3445. beamforming_info->snding3ss = true;
  3446. PDM_SNPF(out_len, used, output + used, out_len - used,
  3447. "\r\n dont apply V matrix and 3SS 789 snding\n");
  3448. } else if (var1[0] == 1) {
  3449. beamforming_info->apply_v_matrix = true;
  3450. beamforming_info->snding3ss = true;
  3451. PDM_SNPF(out_len, used, output + used, out_len - used,
  3452. "\r\n apply V matrix and 3SS 789 snding\n");
  3453. } else if (var1[0] == 2) {
  3454. beamforming_info->apply_v_matrix = true;
  3455. beamforming_info->snding3ss = false;
  3456. PDM_SNPF(out_len, used, output + used, out_len - used,
  3457. "\r\n default txbf setting\n");
  3458. } else
  3459. PDM_SNPF(out_len, used, output + used, out_len - used,
  3460. "\r\n unknown cmd!!\n");
  3461. #endif
  3462. #endif
  3463. } break;
  3464. case PHYDM_H2C:
  3465. phydm_h2C_debug(dm, input, &used, output, &out_len);
  3466. break;
  3467. case PHYDM_EXT_RF_E_CTRL:
  3468. phydm_ext_rf_element_ctrl(dm, input, &used, output, &out_len);
  3469. break;
  3470. case PHYDM_ADAPTIVE_SOML:
  3471. #ifdef CONFIG_ADAPTIVE_SOML
  3472. phydm_soml_debug(dm, input, &used, output, &out_len);
  3473. #endif
  3474. break;
  3475. case PHYDM_PSD:
  3476. #ifdef CONFIG_PSD_TOOL
  3477. phydm_psd_debug(dm, input, &used, output, &out_len);
  3478. #endif
  3479. break;
  3480. case PHYDM_DEBUG_PORT:
  3481. phydm_print_dbgport(dm, input, &used, output, &out_len);
  3482. break;
  3483. case PHYDM_DIS_HTSTF_CONTROL: {
  3484. if (input[1])
  3485. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  3486. if (var1[0] == 1) {
  3487. /* setting being false is for debug */
  3488. dm->bhtstfdisabled = true;
  3489. PDM_SNPF(out_len, used, output + used, out_len - used,
  3490. "Dynamic HT-STF Gain Control is Disable\n");
  3491. } else {
  3492. /* @default setting should be true,
  3493. * always be dynamic control
  3494. */
  3495. dm->bhtstfdisabled = false;
  3496. PDM_SNPF(out_len, used, output + used, out_len - used,
  3497. "Dynamic HT-STF Gain Control is Enable\n");
  3498. }
  3499. } break;
  3500. case PHYDM_TUNE_PARAMETER:
  3501. phydm_parameter_adjust(dm, input, &used, output, &out_len);
  3502. break;
  3503. case PHYDM_ADAPTIVITY_DEBUG:
  3504. #ifdef PHYDM_SUPPORT_ADAPTIVITY
  3505. phydm_adaptivity_debug(dm, input, &used, output, &out_len);
  3506. #endif
  3507. break;
  3508. case PHYDM_DIS_DYM_ANT_WEIGHTING:
  3509. #ifdef DYN_ANT_WEIGHTING_SUPPORT
  3510. phydm_ant_weight_dbg(dm, input, &used, output, &out_len);
  3511. #endif
  3512. break;
  3513. case PHYDM_FORECE_PT_STATE: {
  3514. #ifdef PHYDM_POWER_TRAINING_SUPPORT
  3515. phydm_pow_train_debug(dm, input, &used, output, &out_len);
  3516. #endif
  3517. break;
  3518. }
  3519. case PHYDM_DIS_RXHP_CTR: {
  3520. if (input[1])
  3521. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  3522. if (var1[0] == 1) {
  3523. /* the setting being on is at debug mode to disconnect
  3524. * RxHP seeting with SoML on/odd
  3525. */
  3526. dm->disrxhpsoml = true;
  3527. PDM_SNPF(out_len, used, output + used, out_len - used,
  3528. "Dynamic RxHP Control with SoML on/off is Disable\n");
  3529. } else if (var1[0] == 0) {
  3530. /* @default setting,
  3531. * RxHP setting will follow SoML on/off setting
  3532. */
  3533. dm->disrxhpsoml = false;
  3534. PDM_SNPF(out_len, used, output + used, out_len - used,
  3535. "Dynamic RxHP Control with SoML on/off is Enable\n");
  3536. } else {
  3537. dm->disrxhpsoml = false;
  3538. PDM_SNPF(out_len, used, output + used, out_len - used,
  3539. "Default Setting, Dynamic RxHP Control with SoML on/off is Enable\n");
  3540. }
  3541. } break;
  3542. case PHYDM_STA_INFO:
  3543. phydm_show_sta_info(dm, input, &used, output, &out_len);
  3544. break;
  3545. case PHYDM_PAUSE_FUNC:
  3546. phydm_pause_func_console(dm, input, &used, output, &out_len);
  3547. break;
  3548. case PHYDM_PER_TONE_EVM:
  3549. phydm_per_tone_evm(dm, input, &used, output, &out_len);
  3550. break;
  3551. #ifdef CONFIG_DYNAMIC_TX_TWR
  3552. case PHYDM_DYN_TXPWR:
  3553. phydm_dtp_debug(dm, input, &used, output, &out_len);
  3554. break;
  3555. #endif
  3556. case PHYDM_LNA_SAT:
  3557. #ifdef PHYDM_LNA_SAT_CHK_SUPPORT
  3558. phydm_lna_sat_debug(dm, input, &used, output, &out_len);
  3559. #endif
  3560. break;
  3561. default:
  3562. PDM_SNPF(out_len, used, output + used, out_len - used,
  3563. "Do not support this command\n");
  3564. break;
  3565. }
  3566. #endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/
  3567. }
  3568. #if defined __ECOS || defined __ICCARM__
  3569. char *strsep(char **s, const char *ct)
  3570. {
  3571. char *sbegin = *s;
  3572. char *end;
  3573. if (!sbegin)
  3574. return NULL;
  3575. end = strpbrk(sbegin, ct);
  3576. if (end)
  3577. *end++ = '\0';
  3578. *s = end;
  3579. return sbegin;
  3580. }
  3581. #endif
  3582. #if (DM_ODM_SUPPORT_TYPE & (ODM_CE | ODM_AP | ODM_IOT))
  3583. s32 phydm_cmd(struct dm_struct *dm, char *input, u32 in_len, u8 flag,
  3584. char *output, u32 out_len)
  3585. {
  3586. char *token;
  3587. u32 argc = 0;
  3588. char argv[MAX_ARGC][MAX_ARGV];
  3589. do {
  3590. token = strsep(&input, ", ");
  3591. if (token) {
  3592. strcpy(argv[argc], token);
  3593. argc++;
  3594. } else {
  3595. break;
  3596. }
  3597. } while (argc < MAX_ARGC);
  3598. if (argc == 1)
  3599. argv[0][strlen(argv[0]) - 1] = '\0';
  3600. phydm_cmd_parser(dm, argv, argc, flag, output, out_len);
  3601. return 0;
  3602. }
  3603. #endif
  3604. void phydm_fw_trace_handler(void *dm_void, u8 *cmd_buf, u8 cmd_len)
  3605. {
  3606. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  3607. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3608. /*@u8 debug_trace_11byte[60];*/
  3609. u8 freg_num, c2h_seq, buf_0 = 0;
  3610. if (!(dm->support_ic_type & PHYDM_IC_3081_SERIES))
  3611. return;
  3612. if (cmd_len > 12 || cmd_len == 0) {
  3613. pr_debug("[Warning] Error C2H cmd_len=%d\n", cmd_len);
  3614. return;
  3615. }
  3616. buf_0 = cmd_buf[0];
  3617. freg_num = (buf_0 & 0xf);
  3618. c2h_seq = (buf_0 & 0xf0) >> 4;
  3619. #if 0
  3620. PHYDM_DBG(dm, DBG_FW_TRACE,
  3621. "[FW debug message] freg_num = (( %d )), c2h_seq=(( %d ))\n",
  3622. freg_num, c2h_seq);
  3623. strncpy(debug_trace_11byte, &cmd_buf[1], (cmd_len - 1));
  3624. debug_trace_11byte[cmd_len - 1] = '\0';
  3625. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW debug message] %s\n",
  3626. debug_trace_11byte);
  3627. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW debug message] cmd_len = (( %d ))\n",
  3628. cmd_len);
  3629. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW debug message] c2h_cmd_start=((%d))\n",
  3630. dm->c2h_cmd_start);
  3631. PHYDM_DBG(dm, DBG_FW_TRACE, "pre_seq = (( %d )), current_seq=((%d))\n",
  3632. dm->pre_c2h_seq, c2h_seq);
  3633. PHYDM_DBG(dm, DBG_FW_TRACE, "fw_buff_is_enpty = (( %d ))\n",
  3634. dm->fw_buff_is_enpty);
  3635. #endif
  3636. if (c2h_seq != dm->pre_c2h_seq && dm->fw_buff_is_enpty == false) {
  3637. dm->fw_debug_trace[dm->c2h_cmd_start] = '\0';
  3638. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW Dbg Queue Overflow] %s\n",
  3639. dm->fw_debug_trace);
  3640. dm->c2h_cmd_start = 0;
  3641. }
  3642. if ((cmd_len - 1) > (60 - dm->c2h_cmd_start)) {
  3643. dm->fw_debug_trace[dm->c2h_cmd_start] = '\0';
  3644. PHYDM_DBG(dm, DBG_FW_TRACE,
  3645. "[FW Dbg Queue error: wrong C2H length] %s\n",
  3646. dm->fw_debug_trace);
  3647. dm->c2h_cmd_start = 0;
  3648. return;
  3649. }
  3650. strncpy((char *)&dm->fw_debug_trace[dm->c2h_cmd_start],
  3651. (char *)&cmd_buf[1], (cmd_len - 1));
  3652. dm->c2h_cmd_start += (cmd_len - 1);
  3653. dm->fw_buff_is_enpty = false;
  3654. if (freg_num == 0 || dm->c2h_cmd_start >= 60) {
  3655. if (dm->c2h_cmd_start < 60)
  3656. dm->fw_debug_trace[dm->c2h_cmd_start] = '\0';
  3657. else
  3658. dm->fw_debug_trace[59] = '\0';
  3659. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s\n",
  3660. dm->fw_debug_trace);
  3661. #if 0
  3662. /*@dbg_print("[FW DBG Msg] %s\n", dm->fw_debug_trace);*/
  3663. #endif
  3664. dm->c2h_cmd_start = 0;
  3665. dm->fw_buff_is_enpty = true;
  3666. }
  3667. dm->pre_c2h_seq = c2h_seq;
  3668. #endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/
  3669. }
  3670. void phydm_fw_trace_handler_code(void *dm_void, u8 *buffer, u8 cmd_len)
  3671. {
  3672. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  3673. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3674. u8 function = buffer[0];
  3675. u8 dbg_num = buffer[1];
  3676. u16 content_0 = (((u16)buffer[3]) << 8) | ((u16)buffer[2]);
  3677. u16 content_1 = (((u16)buffer[5]) << 8) | ((u16)buffer[4]);
  3678. u16 content_2 = (((u16)buffer[7]) << 8) | ((u16)buffer[6]);
  3679. u16 content_3 = (((u16)buffer[9]) << 8) | ((u16)buffer[8]);
  3680. u16 content_4 = (((u16)buffer[11]) << 8) | ((u16)buffer[10]);
  3681. if (cmd_len > 12)
  3682. PHYDM_DBG(dm, DBG_FW_TRACE,
  3683. "[FW Msg] Invalid cmd length (( %d )) >12\n",
  3684. cmd_len);
  3685. /*@--------------------------------------------*/
  3686. #ifdef CONFIG_RA_FW_DBG_CODE
  3687. if (function == RATE_DECISION) {
  3688. if (dbg_num == 0) {
  3689. if (content_0 == 1)
  3690. PHYDM_DBG(dm, DBG_FW_TRACE,
  3691. "[FW] RA_CNT=((%d)) Max_device=((%d))--------------------------->\n",
  3692. content_1, content_2);
  3693. else if (content_0 == 2)
  3694. PHYDM_DBG(dm, DBG_FW_TRACE,
  3695. "[FW] Check RA macid= ((%d)), MediaStatus=((%d)), Dis_RA=((%d)), try_bit=((0x%x))\n",
  3696. content_1, content_2, content_3,
  3697. content_4);
  3698. else if (content_0 == 3)
  3699. PHYDM_DBG(dm, DBG_FW_TRACE,
  3700. "[FW] Check RA total=((%d)), drop=((0x%x)), TXRPT_TRY_bit=((%x)), bNoisy=((%x))\n",
  3701. content_1, content_2, content_3,
  3702. content_4);
  3703. } else if (dbg_num == 1) {
  3704. if (content_0 == 1)
  3705. PHYDM_DBG(dm, DBG_FW_TRACE,
  3706. "[FW] RTY[0,1,2,3]=[ %d , %d , %d , %d ]\n",
  3707. content_1, content_2, content_3,
  3708. content_4);
  3709. else if (content_0 == 2) {
  3710. PHYDM_DBG(dm, DBG_FW_TRACE,
  3711. "[FW] RTY[4]=[ %d ], drop=(( %d )), total=(( %d )), current_rate=((0x %x ))",
  3712. content_1, content_2, content_3,
  3713. content_4);
  3714. phydm_print_rate(dm, (u8)content_4,
  3715. DBG_FW_TRACE);
  3716. } else if (content_0 == 3)
  3717. PHYDM_DBG(dm, DBG_FW_TRACE,
  3718. "[FW] penality_idx=(( %d ))\n",
  3719. content_1);
  3720. else if (content_0 == 4)
  3721. PHYDM_DBG(dm, DBG_FW_TRACE,
  3722. "[FW] RSSI=(( %d )), ra_stage = (( %d ))\n",
  3723. content_1, content_2);
  3724. } else if (dbg_num == 3) {
  3725. if (content_0 == 1)
  3726. PHYDM_DBG(dm, DBG_FW_TRACE,
  3727. "[FW] Fast_RA (( DOWN )) total=((%d)), total>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\n",
  3728. content_1, content_2, content_3,
  3729. content_4);
  3730. else if (content_0 == 2)
  3731. PHYDM_DBG(dm, DBG_FW_TRACE,
  3732. "[FW] Fast_RA (( UP )) total_acc=((%d)), total_acc>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\n",
  3733. content_1, content_2, content_3,
  3734. content_4);
  3735. else if (content_0 == 3)
  3736. PHYDM_DBG(dm, DBG_FW_TRACE,
  3737. "[FW] Fast_RA (( UP )) ((rate Down Hold)) RA_CNT=((%d))\n",
  3738. content_1);
  3739. else if (content_0 == 4)
  3740. PHYDM_DBG(dm, DBG_FW_TRACE,
  3741. "[FW] Fast_RA (( UP )) ((tota_accl<5 skip)) RA_CNT=((%d))\n",
  3742. content_1);
  3743. else if (content_0 == 8)
  3744. PHYDM_DBG(dm, DBG_FW_TRACE,
  3745. "[FW] Fast_RA (( Reset Tx Rpt )) RA_CNT=((%d))\n",
  3746. content_1);
  3747. } else if (dbg_num == 4) {
  3748. if (content_0 == 3)
  3749. PHYDM_DBG(dm, DBG_FW_TRACE,
  3750. "[FW] RER_CNT PCR_ori =(( %d )), ratio_ori =(( %d )), pcr_updown_bitmap =(( 0x%x )), pcr_var_diff =(( %d ))\n",
  3751. content_1, content_2, content_3,
  3752. content_4);
  3753. else if (content_0 == 4)
  3754. PHYDM_DBG(dm, DBG_FW_TRACE,
  3755. "[FW] pcr_shift_value =(( %s%d )), rate_down_threshold =(( %d )), rate_up_threshold =(( %d ))\n",
  3756. ((content_1) ? "+" : "-"), content_2,
  3757. content_3, content_4);
  3758. else if (content_0 == 5)
  3759. PHYDM_DBG(dm, DBG_FW_TRACE,
  3760. "[FW] pcr_mean =(( %d )), PCR_VAR =(( %d )), offset =(( %d )), decision_offset_p =(( %d ))\n",
  3761. content_1, content_2, content_3,
  3762. content_4);
  3763. } else if (dbg_num == 5) {
  3764. if (content_0 == 1)
  3765. PHYDM_DBG(dm, DBG_FW_TRACE,
  3766. "[FW] (( UP)) Nsc=(( %d )), N_High=(( %d )), RateUp_Waiting=(( %d )), RateUp_Fail=(( %d ))\n",
  3767. content_1, content_2, content_3,
  3768. content_4);
  3769. else if (content_0 == 2)
  3770. PHYDM_DBG(dm, DBG_FW_TRACE,
  3771. "[FW] ((DOWN)) Nsc=(( %d )), N_Low=(( %d ))\n",
  3772. content_1, content_2);
  3773. else if (content_0 == 3)
  3774. PHYDM_DBG(dm, DBG_FW_TRACE,
  3775. "[FW] ((HOLD)) Nsc=((%d)), N_High=((%d)), N_Low=((%d)), Reset_CNT=((%d))\n",
  3776. content_1, content_2, content_3,
  3777. content_4);
  3778. } else if (dbg_num == 0x60) {
  3779. if (content_0 == 1)
  3780. PHYDM_DBG(dm, DBG_FW_TRACE,
  3781. "[FW] ((AP RPT)) macid=((%d)), BUPDATE[macid]=((%d))\n",
  3782. content_1, content_2);
  3783. else if (content_0 == 4)
  3784. PHYDM_DBG(dm, DBG_FW_TRACE,
  3785. "[FW] ((AP RPT)) pass=((%d)), rty_num=((%d)), drop=((%d)), total=((%d))\n",
  3786. content_1, content_2, content_3,
  3787. content_4);
  3788. else if (content_0 == 5)
  3789. PHYDM_DBG(dm, DBG_FW_TRACE,
  3790. "[FW] ((AP RPT)) PASS=((%d)), RTY_NUM=((%d)), DROP=((%d)), TOTAL=((%d))\n",
  3791. content_1, content_2, content_3,
  3792. content_4);
  3793. }
  3794. } else if (function == INIT_RA_TABLE) {
  3795. if (dbg_num == 3)
  3796. PHYDM_DBG(dm, DBG_FW_TRACE,
  3797. "[FW][INIT_RA_INFO] Ra_init, RA_SKIP_CNT = (( %d ))\n",
  3798. content_0);
  3799. } else if (function == RATE_UP) {
  3800. if (dbg_num == 2) {
  3801. if (content_0 == 1)
  3802. PHYDM_DBG(dm, DBG_FW_TRACE,
  3803. "[FW][RateUp] ((Highest rate->return)), macid=((%d)) Nsc=((%d))\n",
  3804. content_1, content_2);
  3805. } else if (dbg_num == 5) {
  3806. if (content_0 == 0)
  3807. PHYDM_DBG(dm, DBG_FW_TRACE,
  3808. "[FW][RateUp] ((rate UP)), up_rate_tmp=((0x%x)), rate_idx=((0x%x)), SGI_en=((%d)), SGI=((%d))\n",
  3809. content_1, content_2, content_3,
  3810. content_4);
  3811. else if (content_0 == 1)
  3812. PHYDM_DBG(dm, DBG_FW_TRACE,
  3813. "[FW][RateUp] ((rate UP)), rate_1=((0x%x)), rate_2=((0x%x)), BW=((%d)), Try_Bit=((%d))\n",
  3814. content_1, content_2, content_3,
  3815. content_4);
  3816. }
  3817. } else if (function == RATE_DOWN) {
  3818. if (dbg_num == 5) {
  3819. if (content_0 == 1)
  3820. PHYDM_DBG(dm, DBG_FW_TRACE,
  3821. "[FW][RateDownStep] ((rate Down)), macid=((%d)), rate1=((0x%x)), rate2=((0x%x)), BW=((%d))\n",
  3822. content_1, content_2, content_3,
  3823. content_4);
  3824. }
  3825. } else if (function == TRY_DONE) {
  3826. if (dbg_num == 1) {
  3827. if (content_0 == 1)
  3828. PHYDM_DBG(dm, DBG_FW_TRACE,
  3829. "[FW][Try Done] ((try succsess )) macid=((%d)), Try_Done_cnt=((%d))\n",
  3830. content_1, content_2);
  3831. } else if (dbg_num == 2) {
  3832. if (content_0 == 1)
  3833. PHYDM_DBG(dm, DBG_FW_TRACE,
  3834. "[FW][Try Done] ((try)) macid=((%d)), Try_Done_cnt=((%d)), rate_2=((%d)), try_succes=((%d))\n",
  3835. content_1, content_2, content_3,
  3836. content_4);
  3837. }
  3838. } else if (function == RA_H2C) {
  3839. if (dbg_num == 1) {
  3840. if (content_0 == 0)
  3841. PHYDM_DBG(dm, DBG_FW_TRACE,
  3842. "[FW][H2C=0x49] fw_trace_en=((%d)), mode =((%d)), macid=((%d))\n",
  3843. content_1, content_2, content_3);
  3844. }
  3845. } else if (function == F_RATE_AP_RPT) {
  3846. if (dbg_num == 1) {
  3847. if (content_0 == 1)
  3848. PHYDM_DBG(dm, DBG_FW_TRACE,
  3849. "[FW][AP RPT] ((1)), SPE_STATIS=((0x%x))---------->\n",
  3850. content_3);
  3851. } else if (dbg_num == 2) {
  3852. if (content_0 == 1)
  3853. PHYDM_DBG(dm, DBG_FW_TRACE,
  3854. "[FW][AP RPT] RTY_all=((%d))\n",
  3855. content_1);
  3856. } else if (dbg_num == 3) {
  3857. if (content_0 == 1)
  3858. PHYDM_DBG(dm, DBG_FW_TRACE,
  3859. "[FW][AP RPT] MACID1[%d], TOTAL=((%d)), RTY=((%d))\n",
  3860. content_3, content_1, content_2);
  3861. } else if (dbg_num == 4) {
  3862. if (content_0 == 1)
  3863. PHYDM_DBG(dm, DBG_FW_TRACE,
  3864. "[FW][AP RPT] MACID2[%d], TOTAL=((%d)), RTY=((%d))\n",
  3865. content_3, content_1, content_2);
  3866. } else if (dbg_num == 5) {
  3867. if (content_0 == 1)
  3868. PHYDM_DBG(dm, DBG_FW_TRACE,
  3869. "[FW][AP RPT] MACID1[%d], PASS=((%d)), DROP=((%d))\n",
  3870. content_3, content_1, content_2);
  3871. } else if (dbg_num == 6) {
  3872. if (content_0 == 1)
  3873. PHYDM_DBG(dm, DBG_FW_TRACE,
  3874. "[FW][AP RPT] MACID2[%d],, PASS=((%d)), DROP=((%d))\n",
  3875. content_3, content_1, content_2);
  3876. }
  3877. } else if (function == DBC_FW_CLM) {
  3878. PHYDM_DBG(dm, DBG_FW_TRACE,
  3879. "[FW][CLM][%d, %d] = {%d, %d, %d, %d}\n", dbg_num,
  3880. content_0, content_1, content_2, content_3,
  3881. content_4);
  3882. } else {
  3883. PHYDM_DBG(dm, DBG_FW_TRACE,
  3884. "[FW][general][%d, %d, %d] = {%d, %d, %d, %d}\n",
  3885. function, dbg_num, content_0, content_1, content_2,
  3886. content_3, content_4);
  3887. }
  3888. #else
  3889. PHYDM_DBG(dm, DBG_FW_TRACE,
  3890. "[FW][general][%d, %d, %d] = {%d, %d, %d, %d}\n", function,
  3891. dbg_num, content_0, content_1, content_2, content_3,
  3892. content_4);
  3893. #endif
  3894. /*@--------------------------------------------*/
  3895. #endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/
  3896. }
  3897. void phydm_fw_trace_handler_8051(void *dm_void, u8 *buffer, u8 cmd_len)
  3898. {
  3899. #ifdef CONFIG_PHYDM_DEBUG_FUNCTION
  3900. struct dm_struct *dm = (struct dm_struct *)dm_void;
  3901. #if 0
  3902. if (cmd_len >= 3)
  3903. cmd_buf[cmd_len - 1] = '\0';
  3904. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s\n", &cmd_buf[3]);
  3905. #else
  3906. int i = 0;
  3907. u8 extend_c2h_sub_id = 0, extend_c2h_dbg_len = 0;
  3908. u8 extend_c2h_dbg_seq = 0;
  3909. u8 fw_debug_trace[128];
  3910. u8 *extend_c2h_dbg_content = 0;
  3911. if (cmd_len > 127)
  3912. return;
  3913. extend_c2h_sub_id = buffer[0];
  3914. extend_c2h_dbg_len = buffer[1];
  3915. extend_c2h_dbg_content = buffer + 2; /*@DbgSeq+DbgContent for show HEX*/
  3916. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  3917. RT_DISP(FC2H, C2H_Summary, ("[Extend C2H packet], Extend_c2hSubId=0x%x, extend_c2h_dbg_len=%d\n",
  3918. extend_c2h_sub_id, extend_c2h_dbg_len));
  3919. RT_DISP_DATA(FC2H, C2H_Summary, "[Extend C2H packet], Content Hex:", extend_c2h_dbg_content, cmd_len - 2);
  3920. #endif
  3921. go_backfor_aggre_dbg_pkt:
  3922. i = 0;
  3923. extend_c2h_dbg_seq = buffer[2];
  3924. extend_c2h_dbg_content = buffer + 3;
  3925. #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
  3926. RT_DISP(FC2H, C2H_Summary, ("[RTKFW, SEQ= %d] :", extend_c2h_dbg_seq));
  3927. #endif
  3928. for (;; i++) {
  3929. fw_debug_trace[i] = extend_c2h_dbg_content[i];
  3930. if (extend_c2h_dbg_content[i + 1] == '\0') {
  3931. fw_debug_trace[i + 1] = '\0';
  3932. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s",
  3933. &fw_debug_trace[0]);
  3934. break;
  3935. } else if (extend_c2h_dbg_content[i] == '\n') {
  3936. fw_debug_trace[i + 1] = '\0';
  3937. PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s",
  3938. &fw_debug_trace[0]);
  3939. buffer = extend_c2h_dbg_content + i + 3;
  3940. goto go_backfor_aggre_dbg_pkt;
  3941. }
  3942. }
  3943. #endif
  3944. #endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/
  3945. }