dp_stats.c 139 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458
  1. /*
  2. * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #include "qdf_types.h"
  19. #include "dp_peer.h"
  20. #include "dp_types.h"
  21. #include "dp_internal.h"
  22. #include "htt_stats.h"
  23. #include "htt_ppdu_stats.h"
  24. #include "dp_htt.h"
  25. #define DP_MAX_STRING_LEN 500
  26. #define DP_HTT_HW_INTR_NAME_LEN HTT_STATS_MAX_HW_INTR_NAME_LEN
  27. #define DP_HTT_HW_MODULE_NAME_LEN HTT_STATS_MAX_HW_MODULE_NAME_LEN
  28. #define DP_HTT_COUNTER_NAME_LEN HTT_MAX_COUNTER_NAME
  29. #define DP_HTT_LOW_WM_HIT_COUNT_LEN HTT_STATS_LOW_WM_BINS
  30. #define DP_HTT_HIGH_WM_HIT_COUNT_LEN HTT_STATS_HIGH_WM_BINS
  31. #define DP_HTT_TX_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  32. #define DP_HTT_TX_SU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  33. #define DP_HTT_TX_MU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  34. #define DP_HTT_TX_NSS_LEN HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS
  35. #define DP_HTT_TX_BW_LEN HTT_TX_PDEV_STATS_NUM_BW_COUNTERS
  36. #define DP_HTT_TX_PREAM_LEN HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES
  37. #define DP_HTT_TX_PDEV_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
  38. #define DP_HTT_TX_DCM_LEN HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS
  39. #define DP_HTT_RX_MCS_LEN HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
  40. #define DP_HTT_RX_NSS_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
  41. #define DP_HTT_RX_DCM_LEN HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS
  42. #define DP_HTT_RX_BW_LEN HTT_RX_PDEV_STATS_NUM_BW_COUNTERS
  43. #define DP_HTT_RX_PREAM_LEN HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES
  44. #define DP_HTT_RSSI_CHAIN_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
  45. #define DP_HTT_RX_GI_LEN HTT_RX_PDEV_STATS_NUM_GI_COUNTERS
  46. #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX
  47. #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX
  48. #define DP_HTT_FW_RING_MPDU_ERR_LEN HTT_RX_STATS_RXDMA_MAX_ERR
  49. #define DP_HTT_TID_NAME_LEN MAX_HTT_TID_NAME
  50. #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS
  51. #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
  52. #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS)
  53. #ifdef CONFIG_WIN
  54. const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  55. "0 to 10 ms", "11 to 20 ms",
  56. "21 to 30 ms", "31 to 40 ms",
  57. "41 to 50 ms", "51 to 60 ms",
  58. "61 to 70 ms", "71 to 80 ms",
  59. "81 to 90 ms", "91 to 100 ms",
  60. "101 to 250 ms", "251 to 500 ms", "500+ ms"
  61. };
  62. const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  63. "0 to 1 ms", "1 to 2 ms",
  64. "2 to 3 ms", "3 to 4 ms",
  65. "4 to 5 ms", "5 to 6 ms",
  66. "6 to 7 ms", "7 to 8 ms",
  67. "8 to 9 ms", "9 to 10 ms",
  68. "10 to 11 ms", "11 to 12 ms", "12+ ms"
  69. };
  70. const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  71. "0 to 5 ms", "6 to 10 ms",
  72. "11 to 15 ms", "16 to 20 ms",
  73. "21 to 25 ms", "26 to 30 ms",
  74. "31 to 35 ms", "36 to 40 ms",
  75. "41 to 45 ms", "46 to 50 ms",
  76. "51 to 55 ms", "56 to 60 ms", "60+ ms"
  77. };
  78. #endif
  79. #ifdef WLAN_TX_PKT_CAPTURE_ENH
  80. #include "dp_tx_capture.h"
  81. #endif
  82. /*
  83. * dp_print_stats_string_tlv: display htt_stats_string_tlv
  84. * @tag_buf: buffer containing the tlv htt_stats_string_tlv
  85. *
  86. * return:void
  87. */
  88. static inline void dp_print_stats_string_tlv(uint32_t *tag_buf)
  89. {
  90. htt_stats_string_tlv *dp_stats_buf =
  91. (htt_stats_string_tlv *)tag_buf;
  92. uint8_t i;
  93. uint16_t index = 0;
  94. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  95. char *data = qdf_mem_malloc(DP_MAX_STRING_LEN);
  96. if (!data) {
  97. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  98. FL("Output buffer not allocated"));
  99. return;
  100. }
  101. DP_PRINT_STATS("HTT_STATS_STRING_TLV:");
  102. for (i = 0; i < tag_len; i++) {
  103. index += qdf_snprint(&data[index],
  104. DP_MAX_STRING_LEN - index,
  105. " %u:%u,", i, dp_stats_buf->data[i]);
  106. }
  107. DP_PRINT_STATS("data = %s\n", data);
  108. qdf_mem_free(data);
  109. }
  110. /*
  111. * dp_print_tx_pdev_stats_cmn_tlv: display htt_tx_pdev_stats_cmn_tlv
  112. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv
  113. *
  114. * return:void
  115. */
  116. static inline void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf)
  117. {
  118. htt_tx_pdev_stats_cmn_tlv *dp_stats_buf =
  119. (htt_tx_pdev_stats_cmn_tlv *)tag_buf;
  120. DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:");
  121. DP_PRINT_STATS("mac_id__word = %u",
  122. dp_stats_buf->mac_id__word);
  123. DP_PRINT_STATS("hw_queued = %u",
  124. dp_stats_buf->hw_queued);
  125. DP_PRINT_STATS("hw_reaped = %u",
  126. dp_stats_buf->hw_reaped);
  127. DP_PRINT_STATS("underrun = %u",
  128. dp_stats_buf->underrun);
  129. DP_PRINT_STATS("hw_paused = %u",
  130. dp_stats_buf->hw_paused);
  131. DP_PRINT_STATS("hw_flush = %u",
  132. dp_stats_buf->hw_flush);
  133. DP_PRINT_STATS("hw_filt = %u",
  134. dp_stats_buf->hw_filt);
  135. DP_PRINT_STATS("tx_abort = %u",
  136. dp_stats_buf->tx_abort);
  137. DP_PRINT_STATS("mpdu_requeued = %u",
  138. dp_stats_buf->mpdu_requed);
  139. DP_PRINT_STATS("tx_xretry = %u",
  140. dp_stats_buf->tx_xretry);
  141. DP_PRINT_STATS("data_rc = %u",
  142. dp_stats_buf->data_rc);
  143. DP_PRINT_STATS("mpdu_dropped_xretry = %u",
  144. dp_stats_buf->mpdu_dropped_xretry);
  145. DP_PRINT_STATS("illegal_rate_phy_err = %u",
  146. dp_stats_buf->illgl_rate_phy_err);
  147. DP_PRINT_STATS("cont_xretry = %u",
  148. dp_stats_buf->cont_xretry);
  149. DP_PRINT_STATS("tx_timeout = %u",
  150. dp_stats_buf->tx_timeout);
  151. DP_PRINT_STATS("pdev_resets = %u",
  152. dp_stats_buf->pdev_resets);
  153. DP_PRINT_STATS("phy_underrun = %u",
  154. dp_stats_buf->phy_underrun);
  155. DP_PRINT_STATS("txop_ovf = %u",
  156. dp_stats_buf->txop_ovf);
  157. DP_PRINT_STATS("seq_posted = %u",
  158. dp_stats_buf->seq_posted);
  159. DP_PRINT_STATS("seq_failed_queueing = %u",
  160. dp_stats_buf->seq_failed_queueing);
  161. DP_PRINT_STATS("seq_completed = %u",
  162. dp_stats_buf->seq_completed);
  163. DP_PRINT_STATS("seq_restarted = %u",
  164. dp_stats_buf->seq_restarted);
  165. DP_PRINT_STATS("mu_seq_posted = %u",
  166. dp_stats_buf->mu_seq_posted);
  167. DP_PRINT_STATS("seq_switch_hw_paused = %u",
  168. dp_stats_buf->seq_switch_hw_paused);
  169. DP_PRINT_STATS("next_seq_posted_dsr = %u",
  170. dp_stats_buf->next_seq_posted_dsr);
  171. DP_PRINT_STATS("seq_posted_isr = %u",
  172. dp_stats_buf->seq_posted_isr);
  173. DP_PRINT_STATS("seq_ctrl_cached = %u",
  174. dp_stats_buf->seq_ctrl_cached);
  175. DP_PRINT_STATS("mpdu_count_tqm = %u",
  176. dp_stats_buf->mpdu_count_tqm);
  177. DP_PRINT_STATS("msdu_count_tqm = %u",
  178. dp_stats_buf->msdu_count_tqm);
  179. DP_PRINT_STATS("mpdu_removed_tqm = %u",
  180. dp_stats_buf->mpdu_removed_tqm);
  181. DP_PRINT_STATS("msdu_removed_tqm = %u",
  182. dp_stats_buf->msdu_removed_tqm);
  183. DP_PRINT_STATS("mpdus_sw_flush = %u",
  184. dp_stats_buf->mpdus_sw_flush);
  185. DP_PRINT_STATS("mpdus_hw_filter = %u",
  186. dp_stats_buf->mpdus_hw_filter);
  187. DP_PRINT_STATS("mpdus_truncated = %u",
  188. dp_stats_buf->mpdus_truncated);
  189. DP_PRINT_STATS("mpdus_ack_failed = %u",
  190. dp_stats_buf->mpdus_ack_failed);
  191. DP_PRINT_STATS("mpdus_expired = %u",
  192. dp_stats_buf->mpdus_expired);
  193. DP_PRINT_STATS("mpdus_seq_hw_retry = %u",
  194. dp_stats_buf->mpdus_seq_hw_retry);
  195. DP_PRINT_STATS("ack_tlv_proc = %u",
  196. dp_stats_buf->ack_tlv_proc);
  197. DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u",
  198. dp_stats_buf->coex_abort_mpdu_cnt_valid);
  199. DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n",
  200. dp_stats_buf->coex_abort_mpdu_cnt);
  201. }
  202. /*
  203. * dp_print_tx_pdev_stats_urrn_tlv_v: display htt_tx_pdev_stats_urrn_tlv_v
  204. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v
  205. *
  206. * return:void
  207. */
  208. static inline void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf)
  209. {
  210. htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf =
  211. (htt_tx_pdev_stats_urrn_tlv_v *)tag_buf;
  212. uint8_t i;
  213. uint16_t index = 0;
  214. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  215. char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN);
  216. if (!urrn_stats) {
  217. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  218. FL("Output buffer not allocated"));
  219. return;
  220. }
  221. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
  222. DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:");
  223. for (i = 0; i < tag_len; i++) {
  224. index += qdf_snprint(&urrn_stats[index],
  225. DP_MAX_STRING_LEN - index,
  226. " %u:%u,", i, dp_stats_buf->urrn_stats[i]);
  227. }
  228. DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats);
  229. qdf_mem_free(urrn_stats);
  230. }
  231. /*
  232. * dp_print_tx_pdev_stats_flush_tlv_v: display htt_tx_pdev_stats_flush_tlv_v
  233. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v
  234. *
  235. * return:void
  236. */
  237. static inline void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf)
  238. {
  239. htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf =
  240. (htt_tx_pdev_stats_flush_tlv_v *)tag_buf;
  241. uint8_t i;
  242. uint16_t index = 0;
  243. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  244. char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
  245. if (!flush_errs) {
  246. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  247. FL("Output buffer not allocated"));
  248. return;
  249. }
  250. tag_len = qdf_min(tag_len,
  251. (uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
  252. DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:");
  253. for (i = 0; i < tag_len; i++) {
  254. index += qdf_snprint(&flush_errs[index],
  255. DP_MAX_STRING_LEN - index,
  256. " %u:%u,", i, dp_stats_buf->flush_errs[i]);
  257. }
  258. DP_PRINT_STATS("flush_errs = %s\n", flush_errs);
  259. qdf_mem_free(flush_errs);
  260. }
  261. /*
  262. * dp_print_tx_pdev_stats_sifs_tlv_v: display htt_tx_pdev_stats_sifs_tlv_v
  263. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v
  264. *
  265. * return:void
  266. */
  267. static inline void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf)
  268. {
  269. htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf =
  270. (htt_tx_pdev_stats_sifs_tlv_v *)tag_buf;
  271. uint8_t i;
  272. uint16_t index = 0;
  273. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  274. char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
  275. if (!sifs_status) {
  276. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  277. FL("Output buffer not allocated"));
  278. return;
  279. }
  280. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
  281. DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:");
  282. for (i = 0; i < tag_len; i++) {
  283. index += qdf_snprint(&sifs_status[index],
  284. DP_MAX_STRING_LEN - index,
  285. " %u:%u,", i, dp_stats_buf->sifs_status[i]);
  286. }
  287. DP_PRINT_STATS("sifs_status = %s\n", sifs_status);
  288. qdf_mem_free(sifs_status);
  289. }
  290. /*
  291. * dp_print_tx_pdev_stats_phy_err_tlv_v: display htt_tx_pdev_stats_phy_err_tlv_v
  292. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v
  293. *
  294. * return:void
  295. */
  296. static inline void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf)
  297. {
  298. htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf =
  299. (htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf;
  300. uint8_t i;
  301. uint16_t index = 0;
  302. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  303. char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
  304. if (!phy_errs) {
  305. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  306. FL("Output buffer not allocated"));
  307. return;
  308. }
  309. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS);
  310. DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:");
  311. for (i = 0; i < tag_len; i++) {
  312. index += qdf_snprint(&phy_errs[index],
  313. DP_MAX_STRING_LEN - index,
  314. " %u:%u,", i, dp_stats_buf->phy_errs[i]);
  315. }
  316. DP_PRINT_STATS("phy_errs = %s\n", phy_errs);
  317. qdf_mem_free(phy_errs);
  318. }
  319. /*
  320. * dp_print_hw_stats_intr_misc_tlv: display htt_hw_stats_intr_misc_tlv
  321. * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv
  322. *
  323. * return:void
  324. */
  325. static inline void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf)
  326. {
  327. htt_hw_stats_intr_misc_tlv *dp_stats_buf =
  328. (htt_hw_stats_intr_misc_tlv *)tag_buf;
  329. uint8_t i;
  330. uint16_t index = 0;
  331. char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  332. if (!hw_intr_name) {
  333. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  334. FL("Output buffer not allocated"));
  335. return;
  336. }
  337. DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:");
  338. for (i = 0; i < DP_HTT_HW_INTR_NAME_LEN; i++) {
  339. index += qdf_snprint(&hw_intr_name[index],
  340. DP_MAX_STRING_LEN - index,
  341. " %u:%u,", i, dp_stats_buf->hw_intr_name[i]);
  342. }
  343. DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name);
  344. DP_PRINT_STATS("mask = %u",
  345. dp_stats_buf->mask);
  346. DP_PRINT_STATS("count = %u\n",
  347. dp_stats_buf->count);
  348. qdf_mem_free(hw_intr_name);
  349. }
  350. /*
  351. * dp_print_hw_stats_wd_timeout_tlv: display htt_hw_stats_wd_timeout_tlv
  352. * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv
  353. *
  354. * return:void
  355. */
  356. static inline void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf)
  357. {
  358. htt_hw_stats_wd_timeout_tlv *dp_stats_buf =
  359. (htt_hw_stats_wd_timeout_tlv *)tag_buf;
  360. uint8_t i;
  361. uint16_t index = 0;
  362. char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  363. if (!hw_module_name) {
  364. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  365. FL("Output buffer not allocated"));
  366. return;
  367. }
  368. DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:");
  369. for (i = 0; i < DP_HTT_HW_MODULE_NAME_LEN; i++) {
  370. index += qdf_snprint(&hw_module_name[index],
  371. DP_MAX_STRING_LEN - index,
  372. " %u:%u,", i, dp_stats_buf->hw_module_name[i]);
  373. }
  374. DP_PRINT_STATS("hw_module_name = %s ", hw_module_name);
  375. DP_PRINT_STATS("count = %u",
  376. dp_stats_buf->count);
  377. qdf_mem_free(hw_module_name);
  378. }
  379. /*
  380. * dp_print_hw_stats_pdev_errs_tlv: display htt_hw_stats_pdev_errs_tlv
  381. * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv
  382. *
  383. * return:void
  384. */
  385. static inline void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf)
  386. {
  387. htt_hw_stats_pdev_errs_tlv *dp_stats_buf =
  388. (htt_hw_stats_pdev_errs_tlv *)tag_buf;
  389. DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:");
  390. DP_PRINT_STATS("mac_id__word = %u",
  391. dp_stats_buf->mac_id__word);
  392. DP_PRINT_STATS("tx_abort = %u",
  393. dp_stats_buf->tx_abort);
  394. DP_PRINT_STATS("tx_abort_fail_count = %u",
  395. dp_stats_buf->tx_abort_fail_count);
  396. DP_PRINT_STATS("rx_abort = %u",
  397. dp_stats_buf->rx_abort);
  398. DP_PRINT_STATS("rx_abort_fail_count = %u",
  399. dp_stats_buf->rx_abort_fail_count);
  400. DP_PRINT_STATS("warm_reset = %u",
  401. dp_stats_buf->warm_reset);
  402. DP_PRINT_STATS("cold_reset = %u",
  403. dp_stats_buf->cold_reset);
  404. DP_PRINT_STATS("tx_flush = %u",
  405. dp_stats_buf->tx_flush);
  406. DP_PRINT_STATS("tx_glb_reset = %u",
  407. dp_stats_buf->tx_glb_reset);
  408. DP_PRINT_STATS("tx_txq_reset = %u",
  409. dp_stats_buf->tx_txq_reset);
  410. DP_PRINT_STATS("rx_timeout_reset = %u\n",
  411. dp_stats_buf->rx_timeout_reset);
  412. }
  413. /*
  414. * dp_print_msdu_flow_stats_tlv: display htt_msdu_flow_stats_tlv
  415. * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv
  416. *
  417. * return:void
  418. */
  419. static inline void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf)
  420. {
  421. htt_msdu_flow_stats_tlv *dp_stats_buf =
  422. (htt_msdu_flow_stats_tlv *)tag_buf;
  423. DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:");
  424. DP_PRINT_STATS("last_update_timestamp = %u",
  425. dp_stats_buf->last_update_timestamp);
  426. DP_PRINT_STATS("last_add_timestamp = %u",
  427. dp_stats_buf->last_add_timestamp);
  428. DP_PRINT_STATS("last_remove_timestamp = %u",
  429. dp_stats_buf->last_remove_timestamp);
  430. DP_PRINT_STATS("total_processed_msdu_count = %u",
  431. dp_stats_buf->total_processed_msdu_count);
  432. DP_PRINT_STATS("cur_msdu_count_in_flowq = %u",
  433. dp_stats_buf->cur_msdu_count_in_flowq);
  434. DP_PRINT_STATS("sw_peer_id = %u",
  435. dp_stats_buf->sw_peer_id);
  436. DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n",
  437. dp_stats_buf->tx_flow_no__tid_num__drop_rule);
  438. }
  439. /*
  440. * dp_print_tx_tid_stats_tlv: display htt_tx_tid_stats_tlv
  441. * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv
  442. *
  443. * return:void
  444. */
  445. static inline void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf)
  446. {
  447. htt_tx_tid_stats_tlv *dp_stats_buf =
  448. (htt_tx_tid_stats_tlv *)tag_buf;
  449. uint8_t i;
  450. uint16_t index = 0;
  451. char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  452. if (!tid_name) {
  453. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  454. FL("Output buffer not allocated"));
  455. return;
  456. }
  457. DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:");
  458. for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) {
  459. index += qdf_snprint(&tid_name[index],
  460. DP_MAX_STRING_LEN - index,
  461. " %u:%u,", i, dp_stats_buf->tid_name[i]);
  462. }
  463. DP_PRINT_STATS("tid_name = %s ", tid_name);
  464. DP_PRINT_STATS("sw_peer_id__tid_num = %u",
  465. dp_stats_buf->sw_peer_id__tid_num);
  466. DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
  467. dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
  468. DP_PRINT_STATS("tid_flags = %u",
  469. dp_stats_buf->tid_flags);
  470. DP_PRINT_STATS("hw_queued = %u",
  471. dp_stats_buf->hw_queued);
  472. DP_PRINT_STATS("hw_reaped = %u",
  473. dp_stats_buf->hw_reaped);
  474. DP_PRINT_STATS("mpdus_hw_filter = %u",
  475. dp_stats_buf->mpdus_hw_filter);
  476. DP_PRINT_STATS("qdepth_bytes = %u",
  477. dp_stats_buf->qdepth_bytes);
  478. DP_PRINT_STATS("qdepth_num_msdu = %u",
  479. dp_stats_buf->qdepth_num_msdu);
  480. DP_PRINT_STATS("qdepth_num_mpdu = %u",
  481. dp_stats_buf->qdepth_num_mpdu);
  482. DP_PRINT_STATS("last_scheduled_tsmp = %u",
  483. dp_stats_buf->last_scheduled_tsmp);
  484. DP_PRINT_STATS("pause_module_id = %u",
  485. dp_stats_buf->pause_module_id);
  486. DP_PRINT_STATS("block_module_id = %u\n",
  487. dp_stats_buf->block_module_id);
  488. DP_PRINT_STATS("tid_tx_airtime = %u\n",
  489. dp_stats_buf->tid_tx_airtime);
  490. qdf_mem_free(tid_name);
  491. }
  492. #ifdef CONFIG_WIN
  493. /*
  494. * dp_print_tx_tid_stats_v1_tlv: display htt_tx_tid_stats_v1_tlv
  495. * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv
  496. *
  497. * return:void
  498. */
  499. static inline void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf)
  500. {
  501. htt_tx_tid_stats_v1_tlv *dp_stats_buf =
  502. (htt_tx_tid_stats_v1_tlv *)tag_buf;
  503. uint8_t i;
  504. uint16_t index = 0;
  505. char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  506. if (!tid_name) {
  507. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  508. FL("Output buffer not allocated"));
  509. return;
  510. }
  511. DP_TRACE_STATS(FATAL, "HTT_TX_TID_STATS_V1_TLV:");
  512. for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) {
  513. index += qdf_snprint(&tid_name[index],
  514. DP_MAX_STRING_LEN - index,
  515. " %u:%u,", i, dp_stats_buf->tid_name[i]);
  516. }
  517. DP_TRACE_STATS(FATAL, "tid_name = %s ", tid_name);
  518. DP_TRACE_STATS(FATAL, "sw_peer_id__tid_num = %u",
  519. dp_stats_buf->sw_peer_id__tid_num);
  520. DP_TRACE_STATS(FATAL, "num_sched_pending__num_ppdu_in_hwq = %u",
  521. dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
  522. DP_TRACE_STATS(FATAL, "tid_flags = %u",
  523. dp_stats_buf->tid_flags);
  524. DP_TRACE_STATS(FATAL, "max_qdepth_bytes = %u",
  525. dp_stats_buf->max_qdepth_bytes);
  526. DP_TRACE_STATS(FATAL, "max_qdepth_n_msdus = %u",
  527. dp_stats_buf->max_qdepth_n_msdus);
  528. DP_TRACE_STATS(FATAL, "rsvd = %u",
  529. dp_stats_buf->rsvd);
  530. DP_TRACE_STATS(FATAL, "qdepth_bytes = %u",
  531. dp_stats_buf->qdepth_bytes);
  532. DP_TRACE_STATS(FATAL, "qdepth_num_msdu = %u",
  533. dp_stats_buf->qdepth_num_msdu);
  534. DP_TRACE_STATS(FATAL, "qdepth_num_mpdu = %u",
  535. dp_stats_buf->qdepth_num_mpdu);
  536. DP_TRACE_STATS(FATAL, "last_scheduled_tsmp = %u",
  537. dp_stats_buf->last_scheduled_tsmp);
  538. DP_TRACE_STATS(FATAL, "pause_module_id = %u",
  539. dp_stats_buf->pause_module_id);
  540. DP_TRACE_STATS(FATAL, "block_module_id = %u\n",
  541. dp_stats_buf->block_module_id);
  542. DP_TRACE_STATS(FATAL, "tid_tx_airtime = %u\n",
  543. dp_stats_buf->tid_tx_airtime);
  544. qdf_mem_free(tid_name);
  545. }
  546. #endif
  547. /*
  548. * dp_print_rx_tid_stats_tlv: display htt_rx_tid_stats_tlv
  549. * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv
  550. *
  551. * return:void
  552. */
  553. static inline void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf)
  554. {
  555. htt_rx_tid_stats_tlv *dp_stats_buf =
  556. (htt_rx_tid_stats_tlv *)tag_buf;
  557. uint8_t i;
  558. uint16_t index = 0;
  559. char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  560. if (!tid_name) {
  561. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  562. FL("Output buffer not allocated"));
  563. return;
  564. }
  565. DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:");
  566. DP_PRINT_STATS("sw_peer_id__tid_num = %u",
  567. dp_stats_buf->sw_peer_id__tid_num);
  568. for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) {
  569. index += qdf_snprint(&tid_name[index],
  570. DP_MAX_STRING_LEN - index,
  571. " %u:%u,", i, dp_stats_buf->tid_name[i]);
  572. }
  573. DP_PRINT_STATS("tid_name = %s ", tid_name);
  574. DP_PRINT_STATS("dup_in_reorder = %u",
  575. dp_stats_buf->dup_in_reorder);
  576. DP_PRINT_STATS("dup_past_outside_window = %u",
  577. dp_stats_buf->dup_past_outside_window);
  578. DP_PRINT_STATS("dup_past_within_window = %u",
  579. dp_stats_buf->dup_past_within_window);
  580. DP_PRINT_STATS("rxdesc_err_decrypt = %u\n",
  581. dp_stats_buf->rxdesc_err_decrypt);
  582. qdf_mem_free(tid_name);
  583. }
  584. /*
  585. * dp_print_counter_tlv: display htt_counter_tlv
  586. * @tag_buf: buffer containing the tlv htt_counter_tlv
  587. *
  588. * return:void
  589. */
  590. static inline void dp_print_counter_tlv(uint32_t *tag_buf)
  591. {
  592. htt_counter_tlv *dp_stats_buf =
  593. (htt_counter_tlv *)tag_buf;
  594. uint8_t i;
  595. uint16_t index = 0;
  596. char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  597. if (!counter_name) {
  598. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  599. FL("Output buffer not allocated"));
  600. return;
  601. }
  602. DP_PRINT_STATS("HTT_COUNTER_TLV:");
  603. for (i = 0; i < DP_HTT_COUNTER_NAME_LEN; i++) {
  604. index += qdf_snprint(&counter_name[index],
  605. DP_MAX_STRING_LEN - index,
  606. " %u:%u,", i, dp_stats_buf->counter_name[i]);
  607. }
  608. DP_PRINT_STATS("counter_name = %s ", counter_name);
  609. DP_PRINT_STATS("count = %u\n",
  610. dp_stats_buf->count);
  611. qdf_mem_free(counter_name);
  612. }
  613. /*
  614. * dp_print_peer_stats_cmn_tlv: display htt_peer_stats_cmn_tlv
  615. * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv
  616. *
  617. * return:void
  618. */
  619. static inline void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf)
  620. {
  621. htt_peer_stats_cmn_tlv *dp_stats_buf =
  622. (htt_peer_stats_cmn_tlv *)tag_buf;
  623. DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:");
  624. DP_PRINT_STATS("ppdu_cnt = %u",
  625. dp_stats_buf->ppdu_cnt);
  626. DP_PRINT_STATS("mpdu_cnt = %u",
  627. dp_stats_buf->mpdu_cnt);
  628. DP_PRINT_STATS("msdu_cnt = %u",
  629. dp_stats_buf->msdu_cnt);
  630. DP_PRINT_STATS("pause_bitmap = %u",
  631. dp_stats_buf->pause_bitmap);
  632. DP_PRINT_STATS("block_bitmap = %u",
  633. dp_stats_buf->block_bitmap);
  634. DP_PRINT_STATS("current_timestamp = %u\n",
  635. dp_stats_buf->current_timestamp);
  636. DP_PRINT_STATS("inactive_time = %u",
  637. dp_stats_buf->inactive_time);
  638. }
  639. /*
  640. * dp_print_peer_details_tlv: display htt_peer_details_tlv
  641. * @tag_buf: buffer containing the tlv htt_peer_details_tlv
  642. *
  643. * return:void
  644. */
  645. static inline void dp_print_peer_details_tlv(uint32_t *tag_buf)
  646. {
  647. htt_peer_details_tlv *dp_stats_buf =
  648. (htt_peer_details_tlv *)tag_buf;
  649. DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:");
  650. DP_PRINT_STATS("peer_type = %u",
  651. dp_stats_buf->peer_type);
  652. DP_PRINT_STATS("sw_peer_id = %u",
  653. dp_stats_buf->sw_peer_id);
  654. DP_PRINT_STATS("vdev_pdev_ast_idx = %u",
  655. dp_stats_buf->vdev_pdev_ast_idx);
  656. DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u",
  657. dp_stats_buf->mac_addr.mac_addr31to0);
  658. DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u",
  659. dp_stats_buf->mac_addr.mac_addr47to32);
  660. DP_PRINT_STATS("peer_flags = %u",
  661. dp_stats_buf->peer_flags);
  662. DP_PRINT_STATS("qpeer_flags = %u\n",
  663. dp_stats_buf->qpeer_flags);
  664. }
  665. /*
  666. * dp_print_tx_peer_rate_stats_tlv: display htt_tx_peer_rate_stats_tlv
  667. * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv
  668. *
  669. * return:void
  670. */
  671. static inline void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf)
  672. {
  673. htt_tx_peer_rate_stats_tlv *dp_stats_buf =
  674. (htt_tx_peer_rate_stats_tlv *)tag_buf;
  675. uint8_t i, j;
  676. uint16_t index = 0;
  677. char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS];
  678. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  679. if (!str_buf) {
  680. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  681. FL("Output buffer not allocated"));
  682. return;
  683. }
  684. for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++)
  685. tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  686. DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:");
  687. DP_PRINT_STATS("tx_ldpc = %u",
  688. dp_stats_buf->tx_ldpc);
  689. DP_PRINT_STATS("rts_cnt = %u",
  690. dp_stats_buf->rts_cnt);
  691. DP_PRINT_STATS("ack_rssi = %u",
  692. dp_stats_buf->ack_rssi);
  693. index = 0;
  694. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  695. for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) {
  696. index += qdf_snprint(&str_buf[index],
  697. DP_MAX_STRING_LEN - index,
  698. " %u:%u,", i, dp_stats_buf->tx_mcs[i]);
  699. }
  700. DP_PRINT_STATS("tx_mcs = %s ", str_buf);
  701. index = 0;
  702. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  703. for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) {
  704. index += qdf_snprint(&str_buf[index],
  705. DP_MAX_STRING_LEN - index,
  706. " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
  707. }
  708. DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
  709. index = 0;
  710. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  711. for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) {
  712. index += qdf_snprint(&str_buf[index],
  713. DP_MAX_STRING_LEN - index,
  714. " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
  715. }
  716. DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
  717. index = 0;
  718. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  719. for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) {
  720. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  721. index += qdf_snprint(&str_buf[index],
  722. DP_MAX_STRING_LEN - index,
  723. " %u:%u,", (i + 1),
  724. dp_stats_buf->tx_nss[i]);
  725. }
  726. DP_PRINT_STATS("tx_nss = %s ", str_buf);
  727. index = 0;
  728. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  729. for (i = 0; i < DP_HTT_TX_BW_LEN; i++) {
  730. index += qdf_snprint(&str_buf[index],
  731. DP_MAX_STRING_LEN - index,
  732. " %u:%u,", i, dp_stats_buf->tx_bw[i]);
  733. }
  734. DP_PRINT_STATS("tx_bw = %s ", str_buf);
  735. index = 0;
  736. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  737. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  738. index += qdf_snprint(&str_buf[index],
  739. DP_MAX_STRING_LEN - index,
  740. " %u:%u,", i, dp_stats_buf->tx_stbc[i]);
  741. }
  742. DP_PRINT_STATS("tx_stbc = %s ", str_buf);
  743. index = 0;
  744. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  745. for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) {
  746. index += qdf_snprint(&str_buf[index],
  747. DP_MAX_STRING_LEN - index,
  748. " %u:%u,", i, dp_stats_buf->tx_pream[i]);
  749. }
  750. DP_PRINT_STATS("tx_pream = %s ", str_buf);
  751. for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
  752. index = 0;
  753. for (i = 0; i < HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) {
  754. index += qdf_snprint(&tx_gi[j][index],
  755. DP_MAX_STRING_LEN - index,
  756. " %u:%u,", i,
  757. dp_stats_buf->tx_gi[j][i]);
  758. }
  759. DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
  760. }
  761. index = 0;
  762. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  763. for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) {
  764. index += qdf_snprint(&str_buf[index],
  765. DP_MAX_STRING_LEN - index,
  766. " %u:%u,", i, dp_stats_buf->tx_dcm[i]);
  767. }
  768. DP_PRINT_STATS("tx_dcm = %s\n", str_buf);
  769. for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++)
  770. qdf_mem_free(tx_gi[i]);
  771. qdf_mem_free(str_buf);
  772. }
  773. /*
  774. * dp_print_rx_peer_rate_stats_tlv: display htt_rx_peer_rate_stats_tlv
  775. * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv
  776. *
  777. * return:void
  778. */
  779. static inline void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf)
  780. {
  781. htt_rx_peer_rate_stats_tlv *dp_stats_buf =
  782. (htt_rx_peer_rate_stats_tlv *)tag_buf;
  783. uint8_t i, j;
  784. uint16_t index = 0;
  785. char *rssi_chain[DP_HTT_PEER_NUM_SS];
  786. char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS];
  787. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  788. if (!str_buf) {
  789. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  790. FL("Output buffer not allocated"));
  791. return;
  792. }
  793. for (i = 0; i < DP_HTT_PEER_NUM_SS; i++)
  794. rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  795. for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++)
  796. rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  797. DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:");
  798. DP_PRINT_STATS("nsts = %u",
  799. dp_stats_buf->nsts);
  800. DP_PRINT_STATS("rx_ldpc = %u",
  801. dp_stats_buf->rx_ldpc);
  802. DP_PRINT_STATS("rts_cnt = %u",
  803. dp_stats_buf->rts_cnt);
  804. DP_PRINT_STATS("rssi_mgmt = %u",
  805. dp_stats_buf->rssi_mgmt);
  806. DP_PRINT_STATS("rssi_data = %u",
  807. dp_stats_buf->rssi_data);
  808. DP_PRINT_STATS("rssi_comb = %u",
  809. dp_stats_buf->rssi_comb);
  810. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  811. for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) {
  812. index += qdf_snprint(&str_buf[index],
  813. DP_MAX_STRING_LEN - index,
  814. " %u:%u,", i, dp_stats_buf->rx_mcs[i]);
  815. }
  816. DP_PRINT_STATS("rx_mcs = %s ", str_buf);
  817. index = 0;
  818. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  819. for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) {
  820. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  821. index += qdf_snprint(&str_buf[index],
  822. DP_MAX_STRING_LEN - index,
  823. " %u:%u,", (i + 1),
  824. dp_stats_buf->rx_nss[i]);
  825. }
  826. DP_PRINT_STATS("rx_nss = %s ", str_buf);
  827. index = 0;
  828. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  829. for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) {
  830. index += qdf_snprint(&str_buf[index],
  831. DP_MAX_STRING_LEN - index,
  832. " %u:%u,", i, dp_stats_buf->rx_dcm[i]);
  833. }
  834. DP_PRINT_STATS("rx_dcm = %s ", str_buf);
  835. index = 0;
  836. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  837. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  838. index += qdf_snprint(&str_buf[index],
  839. DP_MAX_STRING_LEN - index,
  840. " %u:%u,", i, dp_stats_buf->rx_stbc[i]);
  841. }
  842. DP_PRINT_STATS("rx_stbc = %s ", str_buf);
  843. index = 0;
  844. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  845. for (i = 0; i < DP_HTT_RX_BW_LEN; i++) {
  846. index += qdf_snprint(&str_buf[index],
  847. DP_MAX_STRING_LEN - index,
  848. " %u:%u,", i, dp_stats_buf->rx_bw[i]);
  849. }
  850. DP_PRINT_STATS("rx_bw = %s ", str_buf);
  851. for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) {
  852. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  853. index = 0;
  854. for (i = 0; i < HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) {
  855. index += qdf_snprint(&rssi_chain[j][index],
  856. DP_MAX_STRING_LEN - index,
  857. " %u:%u,", i,
  858. dp_stats_buf->rssi_chain[j][i]);
  859. }
  860. DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
  861. }
  862. for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
  863. index = 0;
  864. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  865. index += qdf_snprint(&rx_gi[j][index],
  866. DP_MAX_STRING_LEN - index,
  867. " %u:%u,", i,
  868. dp_stats_buf->rx_gi[j][i]);
  869. }
  870. DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
  871. }
  872. index = 0;
  873. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  874. for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) {
  875. index += qdf_snprint(&str_buf[index],
  876. DP_MAX_STRING_LEN - index,
  877. " %u:%u,", i, dp_stats_buf->rx_pream[i]);
  878. }
  879. DP_PRINT_STATS("rx_pream = %s\n", str_buf);
  880. for (i = 0; i < DP_HTT_PEER_NUM_SS; i++)
  881. qdf_mem_free(rssi_chain[i]);
  882. for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++)
  883. qdf_mem_free(rx_gi[i]);
  884. qdf_mem_free(str_buf);
  885. }
  886. /*
  887. * dp_print_tx_hwq_mu_mimo_sch_stats_tlv: display htt_tx_hwq_mu_mimo_sch_stats
  888. * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv
  889. *
  890. * return:void
  891. */
  892. static inline void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
  893. {
  894. htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf =
  895. (htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf;
  896. DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:");
  897. DP_PRINT_STATS("mu_mimo_sch_posted = %u",
  898. dp_stats_buf->mu_mimo_sch_posted);
  899. DP_PRINT_STATS("mu_mimo_sch_failed = %u",
  900. dp_stats_buf->mu_mimo_sch_failed);
  901. DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
  902. dp_stats_buf->mu_mimo_ppdu_posted);
  903. }
  904. /*
  905. * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv: display htt_tx_hwq_mu_mimo_mpdu_stats
  906. * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv
  907. *
  908. * return:void
  909. */
  910. static inline void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
  911. {
  912. htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf =
  913. (htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf;
  914. DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:");
  915. DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u",
  916. dp_stats_buf->mu_mimo_mpdus_queued_usr);
  917. DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u",
  918. dp_stats_buf->mu_mimo_mpdus_tried_usr);
  919. DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u",
  920. dp_stats_buf->mu_mimo_mpdus_failed_usr);
  921. DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u",
  922. dp_stats_buf->mu_mimo_mpdus_requeued_usr);
  923. DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u",
  924. dp_stats_buf->mu_mimo_err_no_ba_usr);
  925. DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u",
  926. dp_stats_buf->mu_mimo_mpdu_underrun_usr);
  927. DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n",
  928. dp_stats_buf->mu_mimo_ampdu_underrun_usr);
  929. }
  930. /*
  931. * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv: display htt_tx_hwq_mu_mimo_cmn_stats
  932. * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv
  933. *
  934. * return:void
  935. */
  936. static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf)
  937. {
  938. htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf =
  939. (htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf;
  940. DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:");
  941. DP_PRINT_STATS("mac_id__hwq_id__word = %u\n",
  942. dp_stats_buf->mac_id__hwq_id__word);
  943. }
  944. /*
  945. * dp_print_tx_hwq_stats_cmn_tlv: display htt_tx_hwq_stats_cmn_tlv
  946. * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv
  947. *
  948. * return:void
  949. */
  950. static inline void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf)
  951. {
  952. htt_tx_hwq_stats_cmn_tlv *dp_stats_buf =
  953. (htt_tx_hwq_stats_cmn_tlv *)tag_buf;
  954. DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:");
  955. DP_PRINT_STATS("mac_id__hwq_id__word = %u",
  956. dp_stats_buf->mac_id__hwq_id__word);
  957. DP_PRINT_STATS("xretry = %u",
  958. dp_stats_buf->xretry);
  959. DP_PRINT_STATS("underrun_cnt = %u",
  960. dp_stats_buf->underrun_cnt);
  961. DP_PRINT_STATS("flush_cnt = %u",
  962. dp_stats_buf->flush_cnt);
  963. DP_PRINT_STATS("filt_cnt = %u",
  964. dp_stats_buf->filt_cnt);
  965. DP_PRINT_STATS("null_mpdu_bmap = %u",
  966. dp_stats_buf->null_mpdu_bmap);
  967. DP_PRINT_STATS("user_ack_failure = %u",
  968. dp_stats_buf->user_ack_failure);
  969. DP_PRINT_STATS("ack_tlv_proc = %u",
  970. dp_stats_buf->ack_tlv_proc);
  971. DP_PRINT_STATS("sched_id_proc = %u",
  972. dp_stats_buf->sched_id_proc);
  973. DP_PRINT_STATS("null_mpdu_tx_count = %u",
  974. dp_stats_buf->null_mpdu_tx_count);
  975. DP_PRINT_STATS("mpdu_bmap_not_recvd = %u",
  976. dp_stats_buf->mpdu_bmap_not_recvd);
  977. DP_PRINT_STATS("num_bar = %u",
  978. dp_stats_buf->num_bar);
  979. DP_PRINT_STATS("rts = %u",
  980. dp_stats_buf->rts);
  981. DP_PRINT_STATS("cts2self = %u",
  982. dp_stats_buf->cts2self);
  983. DP_PRINT_STATS("qos_null = %u",
  984. dp_stats_buf->qos_null);
  985. DP_PRINT_STATS("mpdu_tried_cnt = %u",
  986. dp_stats_buf->mpdu_tried_cnt);
  987. DP_PRINT_STATS("mpdu_queued_cnt = %u",
  988. dp_stats_buf->mpdu_queued_cnt);
  989. DP_PRINT_STATS("mpdu_ack_fail_cnt = %u",
  990. dp_stats_buf->mpdu_ack_fail_cnt);
  991. DP_PRINT_STATS("mpdu_filt_cnt = %u",
  992. dp_stats_buf->mpdu_filt_cnt);
  993. DP_PRINT_STATS("false_mpdu_ack_count = %u\n",
  994. dp_stats_buf->false_mpdu_ack_count);
  995. }
  996. /*
  997. * dp_print_tx_hwq_difs_latency_stats_tlv_v: display
  998. * htt_tx_hwq_difs_latency_stats_tlv_v
  999. * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v
  1000. *
  1001. *return:void
  1002. */
  1003. static inline void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf)
  1004. {
  1005. htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf =
  1006. (htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf;
  1007. uint8_t i;
  1008. uint16_t index = 0;
  1009. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1010. char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1011. if (!difs_latency_hist) {
  1012. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1013. FL("Output buffer not allocated"));
  1014. return;
  1015. }
  1016. tag_len = qdf_min(tag_len,
  1017. (uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);
  1018. DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:");
  1019. DP_PRINT_STATS("hist_intvl = %u",
  1020. dp_stats_buf->hist_intvl);
  1021. for (i = 0; i < tag_len; i++) {
  1022. index += qdf_snprint(&difs_latency_hist[index],
  1023. DP_MAX_STRING_LEN - index,
  1024. " %u:%u,", i,
  1025. dp_stats_buf->difs_latency_hist[i]);
  1026. }
  1027. DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist);
  1028. qdf_mem_free(difs_latency_hist);
  1029. }
  1030. /*
  1031. * dp_print_tx_hwq_cmd_result_stats_tlv_v: display htt_tx_hwq_cmd_result_stats
  1032. * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v
  1033. *
  1034. * return:void
  1035. */
  1036. static inline void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf)
  1037. {
  1038. htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf =
  1039. (htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf;
  1040. uint8_t i;
  1041. uint16_t index = 0;
  1042. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1043. char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1044. if (!cmd_result) {
  1045. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1046. FL("Output buffer not allocated"));
  1047. return;
  1048. }
  1049. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS);
  1050. DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:");
  1051. for (i = 0; i < tag_len; i++) {
  1052. index += qdf_snprint(&cmd_result[index],
  1053. DP_MAX_STRING_LEN - index,
  1054. " %u:%u,", i, dp_stats_buf->cmd_result[i]);
  1055. }
  1056. DP_PRINT_STATS("cmd_result = %s ", cmd_result);
  1057. qdf_mem_free(cmd_result);
  1058. }
  1059. /*
  1060. * dp_print_tx_hwq_cmd_stall_stats_tlv_v: display htt_tx_hwq_cmd_stall_stats_tlv
  1061. * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v
  1062. *
  1063. * return:void
  1064. */
  1065. static inline void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf)
  1066. {
  1067. htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf =
  1068. (htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf;
  1069. uint8_t i;
  1070. uint16_t index = 0;
  1071. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1072. char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1073. if (!cmd_stall_status) {
  1074. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1075. FL("Output buffer not allocated"));
  1076. return;
  1077. }
  1078. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS);
  1079. DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:");
  1080. for (i = 0; i < tag_len; i++) {
  1081. index += qdf_snprint(&cmd_stall_status[index],
  1082. DP_MAX_STRING_LEN - index,
  1083. " %u:%u,", i,
  1084. dp_stats_buf->cmd_stall_status[i]);
  1085. }
  1086. DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status);
  1087. qdf_mem_free(cmd_stall_status);
  1088. }
  1089. /*
  1090. * dp_print_tx_hwq_fes_result_stats_tlv_v: display htt_tx_hwq_fes_result_stats
  1091. * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v
  1092. *
  1093. * return:void
  1094. */
  1095. static inline void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf)
  1096. {
  1097. htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf =
  1098. (htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf;
  1099. uint8_t i;
  1100. uint16_t index = 0;
  1101. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1102. char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1103. if (!fes_result) {
  1104. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1105. FL("Output buffer not allocated"));
  1106. return;
  1107. }
  1108. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS);
  1109. DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:");
  1110. for (i = 0; i < tag_len; i++) {
  1111. index += qdf_snprint(&fes_result[index],
  1112. DP_MAX_STRING_LEN - index,
  1113. " %u:%u,", i, dp_stats_buf->fes_result[i]);
  1114. }
  1115. DP_PRINT_STATS("fes_result = %s ", fes_result);
  1116. qdf_mem_free(fes_result);
  1117. }
  1118. /*
  1119. * dp_print_tx_selfgen_cmn_stats_tlv: display htt_tx_selfgen_cmn_stats_tlv
  1120. * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv
  1121. *
  1122. * return:void
  1123. */
  1124. static inline void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf)
  1125. {
  1126. htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf =
  1127. (htt_tx_selfgen_cmn_stats_tlv *)tag_buf;
  1128. DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:");
  1129. DP_PRINT_STATS("mac_id__word = %u",
  1130. dp_stats_buf->mac_id__word);
  1131. DP_PRINT_STATS("su_bar = %u",
  1132. dp_stats_buf->su_bar);
  1133. DP_PRINT_STATS("rts = %u",
  1134. dp_stats_buf->rts);
  1135. DP_PRINT_STATS("cts2self = %u",
  1136. dp_stats_buf->cts2self);
  1137. DP_PRINT_STATS("qos_null = %u",
  1138. dp_stats_buf->qos_null);
  1139. DP_PRINT_STATS("delayed_bar_1 = %u",
  1140. dp_stats_buf->delayed_bar_1);
  1141. DP_PRINT_STATS("delayed_bar_2 = %u",
  1142. dp_stats_buf->delayed_bar_2);
  1143. DP_PRINT_STATS("delayed_bar_3 = %u",
  1144. dp_stats_buf->delayed_bar_3);
  1145. DP_PRINT_STATS("delayed_bar_4 = %u",
  1146. dp_stats_buf->delayed_bar_4);
  1147. DP_PRINT_STATS("delayed_bar_5 = %u",
  1148. dp_stats_buf->delayed_bar_5);
  1149. DP_PRINT_STATS("delayed_bar_6 = %u",
  1150. dp_stats_buf->delayed_bar_6);
  1151. DP_PRINT_STATS("delayed_bar_7 = %u\n",
  1152. dp_stats_buf->delayed_bar_7);
  1153. }
  1154. /*
  1155. * dp_print_tx_selfgen_ac_stats_tlv: display htt_tx_selfgen_ac_stats_tlv
  1156. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv
  1157. *
  1158. * return:void
  1159. */
  1160. static inline void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf)
  1161. {
  1162. htt_tx_selfgen_ac_stats_tlv *dp_stats_buf =
  1163. (htt_tx_selfgen_ac_stats_tlv *)tag_buf;
  1164. DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:");
  1165. DP_PRINT_STATS("ac_su_ndpa = %u",
  1166. dp_stats_buf->ac_su_ndpa);
  1167. DP_PRINT_STATS("ac_su_ndp = %u",
  1168. dp_stats_buf->ac_su_ndp);
  1169. DP_PRINT_STATS("ac_mu_mimo_ndpa = %u",
  1170. dp_stats_buf->ac_mu_mimo_ndpa);
  1171. DP_PRINT_STATS("ac_mu_mimo_ndp = %u",
  1172. dp_stats_buf->ac_mu_mimo_ndp);
  1173. DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u",
  1174. dp_stats_buf->ac_mu_mimo_brpoll_1);
  1175. DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u",
  1176. dp_stats_buf->ac_mu_mimo_brpoll_2);
  1177. DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n",
  1178. dp_stats_buf->ac_mu_mimo_brpoll_3);
  1179. }
  1180. /*
  1181. * dp_print_tx_selfgen_ax_stats_tlv: display htt_tx_selfgen_ax_stats_tlv
  1182. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv
  1183. *
  1184. * return:void
  1185. */
  1186. static inline void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf)
  1187. {
  1188. htt_tx_selfgen_ax_stats_tlv *dp_stats_buf =
  1189. (htt_tx_selfgen_ax_stats_tlv *)tag_buf;
  1190. DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:");
  1191. DP_PRINT_STATS("ax_su_ndpa = %u",
  1192. dp_stats_buf->ax_su_ndpa);
  1193. DP_PRINT_STATS("ax_su_ndp = %u",
  1194. dp_stats_buf->ax_su_ndp);
  1195. DP_PRINT_STATS("ax_mu_mimo_ndpa = %u",
  1196. dp_stats_buf->ax_mu_mimo_ndpa);
  1197. DP_PRINT_STATS("ax_mu_mimo_ndp = %u",
  1198. dp_stats_buf->ax_mu_mimo_ndp);
  1199. DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u",
  1200. dp_stats_buf->ax_mu_mimo_brpoll_1);
  1201. DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u",
  1202. dp_stats_buf->ax_mu_mimo_brpoll_2);
  1203. DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u",
  1204. dp_stats_buf->ax_mu_mimo_brpoll_3);
  1205. DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u",
  1206. dp_stats_buf->ax_mu_mimo_brpoll_4);
  1207. DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u",
  1208. dp_stats_buf->ax_mu_mimo_brpoll_5);
  1209. DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u",
  1210. dp_stats_buf->ax_mu_mimo_brpoll_6);
  1211. DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u",
  1212. dp_stats_buf->ax_mu_mimo_brpoll_7);
  1213. DP_PRINT_STATS("ax_basic_trigger = %u",
  1214. dp_stats_buf->ax_basic_trigger);
  1215. DP_PRINT_STATS("ax_bsr_trigger = %u",
  1216. dp_stats_buf->ax_bsr_trigger);
  1217. DP_PRINT_STATS("ax_mu_bar_trigger = %u",
  1218. dp_stats_buf->ax_mu_bar_trigger);
  1219. DP_PRINT_STATS("ax_mu_rts_trigger = %u\n",
  1220. dp_stats_buf->ax_mu_rts_trigger);
  1221. }
  1222. /*
  1223. * dp_print_tx_selfgen_ac_err_stats_tlv: display htt_tx_selfgen_ac_err_stats_tlv
  1224. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv
  1225. *
  1226. * return:void
  1227. */
  1228. static inline void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf)
  1229. {
  1230. htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf =
  1231. (htt_tx_selfgen_ac_err_stats_tlv *)tag_buf;
  1232. DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:");
  1233. DP_PRINT_STATS("ac_su_ndp_err = %u",
  1234. dp_stats_buf->ac_su_ndp_err);
  1235. DP_PRINT_STATS("ac_su_ndpa_err = %u",
  1236. dp_stats_buf->ac_su_ndpa_err);
  1237. DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u",
  1238. dp_stats_buf->ac_mu_mimo_ndpa_err);
  1239. DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u",
  1240. dp_stats_buf->ac_mu_mimo_ndp_err);
  1241. DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u",
  1242. dp_stats_buf->ac_mu_mimo_brp1_err);
  1243. DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u",
  1244. dp_stats_buf->ac_mu_mimo_brp2_err);
  1245. DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n",
  1246. dp_stats_buf->ac_mu_mimo_brp3_err);
  1247. }
  1248. /*
  1249. * dp_print_tx_selfgen_ax_err_stats_tlv: display htt_tx_selfgen_ax_err_stats_tlv
  1250. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv
  1251. *
  1252. * return:void
  1253. */
  1254. static inline void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf)
  1255. {
  1256. htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf =
  1257. (htt_tx_selfgen_ax_err_stats_tlv *)tag_buf;
  1258. DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:");
  1259. DP_PRINT_STATS("ax_su_ndp_err = %u",
  1260. dp_stats_buf->ax_su_ndp_err);
  1261. DP_PRINT_STATS("ax_su_ndpa_err = %u",
  1262. dp_stats_buf->ax_su_ndpa_err);
  1263. DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u",
  1264. dp_stats_buf->ax_mu_mimo_ndpa_err);
  1265. DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u",
  1266. dp_stats_buf->ax_mu_mimo_ndp_err);
  1267. DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u",
  1268. dp_stats_buf->ax_mu_mimo_brp1_err);
  1269. DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u",
  1270. dp_stats_buf->ax_mu_mimo_brp2_err);
  1271. DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u",
  1272. dp_stats_buf->ax_mu_mimo_brp3_err);
  1273. DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u",
  1274. dp_stats_buf->ax_mu_mimo_brp4_err);
  1275. DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u",
  1276. dp_stats_buf->ax_mu_mimo_brp5_err);
  1277. DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u",
  1278. dp_stats_buf->ax_mu_mimo_brp6_err);
  1279. DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u",
  1280. dp_stats_buf->ax_mu_mimo_brp7_err);
  1281. DP_PRINT_STATS("ax_basic_trigger_err = %u",
  1282. dp_stats_buf->ax_basic_trigger_err);
  1283. DP_PRINT_STATS("ax_bsr_trigger_err = %u",
  1284. dp_stats_buf->ax_bsr_trigger_err);
  1285. DP_PRINT_STATS("ax_mu_bar_trigger_err = %u",
  1286. dp_stats_buf->ax_mu_bar_trigger_err);
  1287. DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n",
  1288. dp_stats_buf->ax_mu_rts_trigger_err);
  1289. }
  1290. /*
  1291. * dp_print_tx_pdev_mu_mimo_sch_stats_tlv: display htt_tx_pdev_mu_mimo_sch_stats
  1292. * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv
  1293. *
  1294. * return:void
  1295. */
  1296. static inline void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
  1297. {
  1298. uint8_t i;
  1299. htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf =
  1300. (htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf;
  1301. DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:");
  1302. DP_PRINT_STATS("mu_mimo_sch_posted = %u",
  1303. dp_stats_buf->mu_mimo_sch_posted);
  1304. DP_PRINT_STATS("mu_mimo_sch_failed = %u",
  1305. dp_stats_buf->mu_mimo_sch_failed);
  1306. DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
  1307. dp_stats_buf->mu_mimo_ppdu_posted);
  1308. DP_PRINT_STATS("11ac MU_MIMO SCH STATS:");
  1309. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {
  1310. DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i,
  1311. dp_stats_buf->ac_mu_mimo_sch_nusers[i]);
  1312. }
  1313. DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:");
  1314. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
  1315. DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i,
  1316. dp_stats_buf->ax_mu_mimo_sch_nusers[i]);
  1317. }
  1318. DP_PRINT_STATS("\n11ax OFDMA SCH STATS:");
  1319. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
  1320. DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i,
  1321. dp_stats_buf->ax_ofdma_sch_nusers[i]);
  1322. }
  1323. }
  1324. /*
  1325. * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv: display
  1326. * htt_tx_pdev_mu_mimo_mpdu_stats_tlv
  1327. * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv
  1328. *
  1329. * return:void
  1330. */
  1331. static inline void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
  1332. {
  1333. htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf =
  1334. (htt_tx_pdev_mpdu_stats_tlv *)tag_buf;
  1335. if (dp_stats_buf->tx_sched_mode ==
  1336. HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
  1337. if (!dp_stats_buf->user_index)
  1338. DP_TRACE_STATS(FATAL,
  1339. "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
  1340. if (dp_stats_buf->user_index <
  1341. HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {
  1342. DP_TRACE_STATS(FATAL,
  1343. "ac_mu_mimo_mpdus_queued_usr_%u = %u",
  1344. dp_stats_buf->user_index,
  1345. dp_stats_buf->mpdus_queued_usr);
  1346. DP_TRACE_STATS(FATAL,
  1347. "ac_mu_mimo_mpdus_tried_usr_%u = %u",
  1348. dp_stats_buf->user_index,
  1349. dp_stats_buf->mpdus_tried_usr);
  1350. DP_TRACE_STATS(FATAL,
  1351. "ac_mu_mimo_mpdus_failed_usr_%u = %u",
  1352. dp_stats_buf->user_index,
  1353. dp_stats_buf->mpdus_failed_usr);
  1354. DP_TRACE_STATS(FATAL,
  1355. "ac_mu_mimo_mpdus_requeued_usr_%u = %u",
  1356. dp_stats_buf->user_index,
  1357. dp_stats_buf->mpdus_requeued_usr);
  1358. DP_TRACE_STATS(FATAL,
  1359. "ac_mu_mimo_err_no_ba_usr_%u = %u",
  1360. dp_stats_buf->user_index,
  1361. dp_stats_buf->err_no_ba_usr);
  1362. DP_TRACE_STATS(FATAL,
  1363. "ac_mu_mimo_mpdu_underrun_usr_%u = %u",
  1364. dp_stats_buf->user_index,
  1365. dp_stats_buf->mpdu_underrun_usr);
  1366. DP_TRACE_STATS(FATAL,
  1367. "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n",
  1368. dp_stats_buf->user_index,
  1369. dp_stats_buf->ampdu_underrun_usr);
  1370. }
  1371. }
  1372. if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
  1373. if (!dp_stats_buf->user_index)
  1374. DP_TRACE_STATS(FATAL,
  1375. "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
  1376. if (dp_stats_buf->user_index <
  1377. HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {
  1378. DP_TRACE_STATS(FATAL,
  1379. "ax_mu_mimo_mpdus_queued_usr_%u = %u",
  1380. dp_stats_buf->user_index,
  1381. dp_stats_buf->mpdus_queued_usr);
  1382. DP_TRACE_STATS(FATAL,
  1383. "ax_mu_mimo_mpdus_tried_usr_%u = %u",
  1384. dp_stats_buf->user_index,
  1385. dp_stats_buf->mpdus_tried_usr);
  1386. DP_TRACE_STATS(FATAL,
  1387. "ax_mu_mimo_mpdus_failed_usr_%u = %u",
  1388. dp_stats_buf->user_index,
  1389. dp_stats_buf->mpdus_failed_usr);
  1390. DP_TRACE_STATS(FATAL,
  1391. "ax_mu_mimo_mpdus_requeued_usr_%u = %u",
  1392. dp_stats_buf->user_index,
  1393. dp_stats_buf->mpdus_requeued_usr);
  1394. DP_TRACE_STATS(FATAL,
  1395. "ax_mu_mimo_err_no_ba_usr_%u = %u",
  1396. dp_stats_buf->user_index,
  1397. dp_stats_buf->err_no_ba_usr);
  1398. DP_TRACE_STATS(FATAL,
  1399. "ax_mu_mimo_mpdu_underrun_usr_%u = %u",
  1400. dp_stats_buf->user_index,
  1401. dp_stats_buf->mpdu_underrun_usr);
  1402. DP_TRACE_STATS(FATAL,
  1403. "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n",
  1404. dp_stats_buf->user_index,
  1405. dp_stats_buf->ampdu_underrun_usr);
  1406. }
  1407. }
  1408. if (dp_stats_buf->tx_sched_mode ==
  1409. HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
  1410. if (!dp_stats_buf->user_index)
  1411. DP_TRACE_STATS(FATAL,
  1412. "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
  1413. if (dp_stats_buf->user_index <
  1414. HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {
  1415. DP_TRACE_STATS(FATAL,
  1416. "ax_mu_ofdma_mpdus_queued_usr_%u = %u",
  1417. dp_stats_buf->user_index,
  1418. dp_stats_buf->mpdus_queued_usr);
  1419. DP_TRACE_STATS(FATAL,
  1420. "ax_mu_ofdma_mpdus_tried_usr_%u = %u",
  1421. dp_stats_buf->user_index,
  1422. dp_stats_buf->mpdus_tried_usr);
  1423. DP_TRACE_STATS(FATAL,
  1424. "ax_mu_ofdma_mpdus_failed_usr_%u = %u",
  1425. dp_stats_buf->user_index,
  1426. dp_stats_buf->mpdus_failed_usr);
  1427. DP_TRACE_STATS(FATAL,
  1428. "ax_mu_ofdma_mpdus_requeued_usr_%u = %u",
  1429. dp_stats_buf->user_index,
  1430. dp_stats_buf->mpdus_requeued_usr);
  1431. DP_TRACE_STATS(FATAL,
  1432. "ax_mu_ofdma_err_no_ba_usr_%u = %u",
  1433. dp_stats_buf->user_index,
  1434. dp_stats_buf->err_no_ba_usr);
  1435. DP_TRACE_STATS(FATAL,
  1436. "ax_mu_ofdma_mpdu_underrun_usr_%u = %u",
  1437. dp_stats_buf->user_index,
  1438. dp_stats_buf->mpdu_underrun_usr);
  1439. DP_TRACE_STATS(FATAL,
  1440. "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n",
  1441. dp_stats_buf->user_index,
  1442. dp_stats_buf->ampdu_underrun_usr);
  1443. }
  1444. }
  1445. }
  1446. /*
  1447. * dp_print_sched_txq_cmd_posted_tlv_v: display htt_sched_txq_cmd_posted_tlv_v
  1448. * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v
  1449. *
  1450. * return:void
  1451. */
  1452. static inline void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf)
  1453. {
  1454. htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf =
  1455. (htt_sched_txq_cmd_posted_tlv_v *)tag_buf;
  1456. uint8_t i;
  1457. uint16_t index = 0;
  1458. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1459. char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1460. if (!sched_cmd_posted) {
  1461. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1462. FL("Output buffer not allocated"));
  1463. return;
  1464. }
  1465. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
  1466. DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:");
  1467. for (i = 0; i < tag_len; i++) {
  1468. index += qdf_snprint(&sched_cmd_posted[index],
  1469. DP_MAX_STRING_LEN - index,
  1470. " %u:%u,", i,
  1471. dp_stats_buf->sched_cmd_posted[i]);
  1472. }
  1473. DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted);
  1474. qdf_mem_free(sched_cmd_posted);
  1475. }
  1476. /*
  1477. * dp_print_sched_txq_cmd_reaped_tlv_v: display htt_sched_txq_cmd_reaped_tlv_v
  1478. * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v
  1479. *
  1480. * return:void
  1481. */
  1482. static inline void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf)
  1483. {
  1484. htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf =
  1485. (htt_sched_txq_cmd_reaped_tlv_v *)tag_buf;
  1486. uint8_t i;
  1487. uint16_t index = 0;
  1488. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1489. char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1490. if (!sched_cmd_reaped) {
  1491. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1492. FL("Output buffer not allocated"));
  1493. return;
  1494. }
  1495. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
  1496. DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:");
  1497. for (i = 0; i < tag_len; i++) {
  1498. index += qdf_snprint(&sched_cmd_reaped[index],
  1499. DP_MAX_STRING_LEN - index,
  1500. " %u:%u,", i,
  1501. dp_stats_buf->sched_cmd_reaped[i]);
  1502. }
  1503. DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped);
  1504. qdf_mem_free(sched_cmd_reaped);
  1505. }
  1506. /*
  1507. * dp_print_tx_pdev_stats_sched_per_txq_tlv: display
  1508. * htt_tx_pdev_stats_sched_per_txq_tlv
  1509. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv
  1510. *
  1511. * return:void
  1512. */
  1513. static inline void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf)
  1514. {
  1515. htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf =
  1516. (htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf;
  1517. DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:");
  1518. DP_PRINT_STATS("mac_id__txq_id__word = %u",
  1519. dp_stats_buf->mac_id__txq_id__word);
  1520. DP_PRINT_STATS("sched_policy = %u",
  1521. dp_stats_buf->sched_policy);
  1522. DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u",
  1523. dp_stats_buf->last_sched_cmd_posted_timestamp);
  1524. DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u",
  1525. dp_stats_buf->last_sched_cmd_compl_timestamp);
  1526. DP_PRINT_STATS("sched_2_tac_lwm_count = %u",
  1527. dp_stats_buf->sched_2_tac_lwm_count);
  1528. DP_PRINT_STATS("sched_2_tac_ring_full = %u",
  1529. dp_stats_buf->sched_2_tac_ring_full);
  1530. DP_PRINT_STATS("sched_cmd_post_failure = %u",
  1531. dp_stats_buf->sched_cmd_post_failure);
  1532. DP_PRINT_STATS("num_active_tids = %u",
  1533. dp_stats_buf->num_active_tids);
  1534. DP_PRINT_STATS("num_ps_schedules = %u",
  1535. dp_stats_buf->num_ps_schedules);
  1536. DP_PRINT_STATS("sched_cmds_pending = %u",
  1537. dp_stats_buf->sched_cmds_pending);
  1538. DP_PRINT_STATS("num_tid_register = %u",
  1539. dp_stats_buf->num_tid_register);
  1540. DP_PRINT_STATS("num_tid_unregister = %u",
  1541. dp_stats_buf->num_tid_unregister);
  1542. DP_PRINT_STATS("num_qstats_queried = %u",
  1543. dp_stats_buf->num_qstats_queried);
  1544. DP_PRINT_STATS("qstats_update_pending = %u",
  1545. dp_stats_buf->qstats_update_pending);
  1546. DP_PRINT_STATS("last_qstats_query_timestamp = %u",
  1547. dp_stats_buf->last_qstats_query_timestamp);
  1548. DP_PRINT_STATS("num_tqm_cmdq_full = %u",
  1549. dp_stats_buf->num_tqm_cmdq_full);
  1550. DP_PRINT_STATS("num_de_sched_algo_trigger = %u",
  1551. dp_stats_buf->num_de_sched_algo_trigger);
  1552. DP_PRINT_STATS("num_rt_sched_algo_trigger = %u",
  1553. dp_stats_buf->num_rt_sched_algo_trigger);
  1554. DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u",
  1555. dp_stats_buf->num_tqm_sched_algo_trigger);
  1556. DP_PRINT_STATS("notify_sched = %u\n",
  1557. dp_stats_buf->notify_sched);
  1558. }
  1559. /*
  1560. * dp_print_stats_tx_sched_cmn_tlv: display htt_stats_tx_sched_cmn_tlv
  1561. * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv
  1562. *
  1563. * return:void
  1564. */
  1565. static inline void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf)
  1566. {
  1567. htt_stats_tx_sched_cmn_tlv *dp_stats_buf =
  1568. (htt_stats_tx_sched_cmn_tlv *)tag_buf;
  1569. DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:");
  1570. DP_PRINT_STATS("mac_id__word = %u",
  1571. dp_stats_buf->mac_id__word);
  1572. DP_PRINT_STATS("current_timestamp = %u\n",
  1573. dp_stats_buf->current_timestamp);
  1574. }
  1575. /*
  1576. * dp_print_tx_tqm_gen_mpdu_stats_tlv_v: display htt_tx_tqm_gen_mpdu_stats_tlv_v
  1577. * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v
  1578. *
  1579. * return:void
  1580. */
  1581. static inline void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf)
  1582. {
  1583. htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf =
  1584. (htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf;
  1585. uint8_t i;
  1586. uint16_t index = 0;
  1587. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1588. char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1589. if (!gen_mpdu_end_reason) {
  1590. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1591. FL("Output buffer not allocated"));
  1592. return;
  1593. }
  1594. tag_len = qdf_min(tag_len,
  1595. (uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON);
  1596. DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:");
  1597. for (i = 0; i < tag_len; i++) {
  1598. index += qdf_snprint(&gen_mpdu_end_reason[index],
  1599. DP_MAX_STRING_LEN - index,
  1600. " %u:%u,", i,
  1601. dp_stats_buf->gen_mpdu_end_reason[i]);
  1602. }
  1603. DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason);
  1604. qdf_mem_free(gen_mpdu_end_reason);
  1605. }
  1606. /*
  1607. * dp_print_tx_tqm_list_mpdu_stats_tlv_v: display htt_tx_tqm_list_mpdu_stats_tlv
  1608. * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v
  1609. *
  1610. * return:void
  1611. */
  1612. static inline void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf)
  1613. {
  1614. htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf =
  1615. (htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf;
  1616. uint8_t i;
  1617. uint16_t index = 0;
  1618. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1619. char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1620. if (!list_mpdu_end_reason) {
  1621. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1622. FL("Output buffer not allocated"));
  1623. return;
  1624. }
  1625. tag_len = qdf_min(tag_len,
  1626. (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
  1627. DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:");
  1628. for (i = 0; i < tag_len; i++) {
  1629. index += qdf_snprint(&list_mpdu_end_reason[index],
  1630. DP_MAX_STRING_LEN - index,
  1631. " %u:%u,", i,
  1632. dp_stats_buf->list_mpdu_end_reason[i]);
  1633. }
  1634. DP_PRINT_STATS("list_mpdu_end_reason = %s\n",
  1635. list_mpdu_end_reason);
  1636. qdf_mem_free(list_mpdu_end_reason);
  1637. }
  1638. /*
  1639. * dp_print_tx_tqm_list_mpdu_cnt_tlv_v: display htt_tx_tqm_list_mpdu_cnt_tlv_v
  1640. * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v
  1641. *
  1642. * return:void
  1643. */
  1644. static inline void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf)
  1645. {
  1646. htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf =
  1647. (htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf;
  1648. uint8_t i;
  1649. uint16_t index = 0;
  1650. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1651. char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1652. if (!list_mpdu_cnt_hist) {
  1653. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  1654. FL("Output buffer not allocated"));
  1655. return;
  1656. }
  1657. tag_len = qdf_min(tag_len,
  1658. (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
  1659. DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:");
  1660. for (i = 0; i < tag_len; i++) {
  1661. index += qdf_snprint(&list_mpdu_cnt_hist[index],
  1662. DP_MAX_STRING_LEN - index,
  1663. " %u:%u,", i,
  1664. dp_stats_buf->list_mpdu_cnt_hist[i]);
  1665. }
  1666. DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist);
  1667. qdf_mem_free(list_mpdu_cnt_hist);
  1668. }
  1669. /*
  1670. * dp_print_tx_tqm_pdev_stats_tlv_v: display htt_tx_tqm_pdev_stats_tlv_v
  1671. * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v
  1672. *
  1673. * return:void
  1674. */
  1675. static inline void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf)
  1676. {
  1677. htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf =
  1678. (htt_tx_tqm_pdev_stats_tlv_v *)tag_buf;
  1679. DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:");
  1680. DP_PRINT_STATS("msdu_count = %u",
  1681. dp_stats_buf->msdu_count);
  1682. DP_PRINT_STATS("mpdu_count = %u",
  1683. dp_stats_buf->mpdu_count);
  1684. DP_PRINT_STATS("remove_msdu = %u",
  1685. dp_stats_buf->remove_msdu);
  1686. DP_PRINT_STATS("remove_mpdu = %u",
  1687. dp_stats_buf->remove_mpdu);
  1688. DP_PRINT_STATS("remove_msdu_ttl = %u",
  1689. dp_stats_buf->remove_msdu_ttl);
  1690. DP_PRINT_STATS("send_bar = %u",
  1691. dp_stats_buf->send_bar);
  1692. DP_PRINT_STATS("bar_sync = %u",
  1693. dp_stats_buf->bar_sync);
  1694. DP_PRINT_STATS("notify_mpdu = %u",
  1695. dp_stats_buf->notify_mpdu);
  1696. DP_PRINT_STATS("sync_cmd = %u",
  1697. dp_stats_buf->sync_cmd);
  1698. DP_PRINT_STATS("write_cmd = %u",
  1699. dp_stats_buf->write_cmd);
  1700. DP_PRINT_STATS("hwsch_trigger = %u",
  1701. dp_stats_buf->hwsch_trigger);
  1702. DP_PRINT_STATS("ack_tlv_proc = %u",
  1703. dp_stats_buf->ack_tlv_proc);
  1704. DP_PRINT_STATS("gen_mpdu_cmd = %u",
  1705. dp_stats_buf->gen_mpdu_cmd);
  1706. DP_PRINT_STATS("gen_list_cmd = %u",
  1707. dp_stats_buf->gen_list_cmd);
  1708. DP_PRINT_STATS("remove_mpdu_cmd = %u",
  1709. dp_stats_buf->remove_mpdu_cmd);
  1710. DP_PRINT_STATS("remove_mpdu_tried_cmd = %u",
  1711. dp_stats_buf->remove_mpdu_tried_cmd);
  1712. DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
  1713. dp_stats_buf->mpdu_queue_stats_cmd);
  1714. DP_PRINT_STATS("mpdu_head_info_cmd = %u",
  1715. dp_stats_buf->mpdu_head_info_cmd);
  1716. DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
  1717. dp_stats_buf->msdu_flow_stats_cmd);
  1718. DP_PRINT_STATS("remove_msdu_cmd = %u",
  1719. dp_stats_buf->remove_msdu_cmd);
  1720. DP_PRINT_STATS("remove_msdu_ttl_cmd = %u",
  1721. dp_stats_buf->remove_msdu_ttl_cmd);
  1722. DP_PRINT_STATS("flush_cache_cmd = %u",
  1723. dp_stats_buf->flush_cache_cmd);
  1724. DP_PRINT_STATS("update_mpduq_cmd = %u",
  1725. dp_stats_buf->update_mpduq_cmd);
  1726. DP_PRINT_STATS("enqueue = %u",
  1727. dp_stats_buf->enqueue);
  1728. DP_PRINT_STATS("enqueue_notify = %u",
  1729. dp_stats_buf->enqueue_notify);
  1730. DP_PRINT_STATS("notify_mpdu_at_head = %u",
  1731. dp_stats_buf->notify_mpdu_at_head);
  1732. DP_PRINT_STATS("notify_mpdu_state_valid = %u\n",
  1733. dp_stats_buf->notify_mpdu_state_valid);
  1734. }
  1735. /*
  1736. * dp_print_tx_tqm_cmn_stats_tlv: display htt_tx_tqm_cmn_stats_tlv
  1737. * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv
  1738. *
  1739. * return:void
  1740. */
  1741. static inline void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf)
  1742. {
  1743. htt_tx_tqm_cmn_stats_tlv *dp_stats_buf =
  1744. (htt_tx_tqm_cmn_stats_tlv *)tag_buf;
  1745. DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:");
  1746. DP_PRINT_STATS("mac_id__word = %u",
  1747. dp_stats_buf->mac_id__word);
  1748. DP_PRINT_STATS("max_cmdq_id = %u",
  1749. dp_stats_buf->max_cmdq_id);
  1750. DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u",
  1751. dp_stats_buf->list_mpdu_cnt_hist_intvl);
  1752. DP_PRINT_STATS("add_msdu = %u",
  1753. dp_stats_buf->add_msdu);
  1754. DP_PRINT_STATS("q_empty = %u",
  1755. dp_stats_buf->q_empty);
  1756. DP_PRINT_STATS("q_not_empty = %u",
  1757. dp_stats_buf->q_not_empty);
  1758. DP_PRINT_STATS("drop_notification = %u",
  1759. dp_stats_buf->drop_notification);
  1760. DP_PRINT_STATS("desc_threshold = %u\n",
  1761. dp_stats_buf->desc_threshold);
  1762. }
  1763. /*
  1764. * dp_print_tx_tqm_error_stats_tlv: display htt_tx_tqm_error_stats_tlv
  1765. * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv
  1766. *
  1767. * return:void
  1768. */
  1769. static inline void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf)
  1770. {
  1771. htt_tx_tqm_error_stats_tlv *dp_stats_buf =
  1772. (htt_tx_tqm_error_stats_tlv *)tag_buf;
  1773. DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:");
  1774. DP_PRINT_STATS("q_empty_failure = %u",
  1775. dp_stats_buf->q_empty_failure);
  1776. DP_PRINT_STATS("q_not_empty_failure = %u",
  1777. dp_stats_buf->q_not_empty_failure);
  1778. DP_PRINT_STATS("add_msdu_failure = %u\n",
  1779. dp_stats_buf->add_msdu_failure);
  1780. }
  1781. /*
  1782. * dp_print_tx_tqm_cmdq_status_tlv: display htt_tx_tqm_cmdq_status_tlv
  1783. * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv
  1784. *
  1785. * return:void
  1786. */
  1787. static inline void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf)
  1788. {
  1789. htt_tx_tqm_cmdq_status_tlv *dp_stats_buf =
  1790. (htt_tx_tqm_cmdq_status_tlv *)tag_buf;
  1791. DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:");
  1792. DP_PRINT_STATS("mac_id__cmdq_id__word = %u",
  1793. dp_stats_buf->mac_id__cmdq_id__word);
  1794. DP_PRINT_STATS("sync_cmd = %u",
  1795. dp_stats_buf->sync_cmd);
  1796. DP_PRINT_STATS("write_cmd = %u",
  1797. dp_stats_buf->write_cmd);
  1798. DP_PRINT_STATS("gen_mpdu_cmd = %u",
  1799. dp_stats_buf->gen_mpdu_cmd);
  1800. DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
  1801. dp_stats_buf->mpdu_queue_stats_cmd);
  1802. DP_PRINT_STATS("mpdu_head_info_cmd = %u",
  1803. dp_stats_buf->mpdu_head_info_cmd);
  1804. DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
  1805. dp_stats_buf->msdu_flow_stats_cmd);
  1806. DP_PRINT_STATS("remove_mpdu_cmd = %u",
  1807. dp_stats_buf->remove_mpdu_cmd);
  1808. DP_PRINT_STATS("remove_msdu_cmd = %u",
  1809. dp_stats_buf->remove_msdu_cmd);
  1810. DP_PRINT_STATS("flush_cache_cmd = %u",
  1811. dp_stats_buf->flush_cache_cmd);
  1812. DP_PRINT_STATS("update_mpduq_cmd = %u",
  1813. dp_stats_buf->update_mpduq_cmd);
  1814. DP_PRINT_STATS("update_msduq_cmd = %u\n",
  1815. dp_stats_buf->update_msduq_cmd);
  1816. }
  1817. /*
  1818. * dp_print_tx_de_eapol_packets_stats_tlv: display htt_tx_de_eapol_packets_stats
  1819. * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv
  1820. *
  1821. * return:void
  1822. */
  1823. static inline void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf)
  1824. {
  1825. htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf =
  1826. (htt_tx_de_eapol_packets_stats_tlv *)tag_buf;
  1827. DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:");
  1828. DP_PRINT_STATS("m1_packets = %u",
  1829. dp_stats_buf->m1_packets);
  1830. DP_PRINT_STATS("m2_packets = %u",
  1831. dp_stats_buf->m2_packets);
  1832. DP_PRINT_STATS("m3_packets = %u",
  1833. dp_stats_buf->m3_packets);
  1834. DP_PRINT_STATS("m4_packets = %u",
  1835. dp_stats_buf->m4_packets);
  1836. DP_PRINT_STATS("g1_packets = %u",
  1837. dp_stats_buf->g1_packets);
  1838. DP_PRINT_STATS("g2_packets = %u\n",
  1839. dp_stats_buf->g2_packets);
  1840. }
  1841. /*
  1842. * dp_print_tx_de_classify_failed_stats_tlv: display
  1843. * htt_tx_de_classify_failed_stats_tlv
  1844. * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv
  1845. *
  1846. * return:void
  1847. */
  1848. static inline void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf)
  1849. {
  1850. htt_tx_de_classify_failed_stats_tlv *dp_stats_buf =
  1851. (htt_tx_de_classify_failed_stats_tlv *)tag_buf;
  1852. DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:");
  1853. DP_PRINT_STATS("ap_bss_peer_not_found = %u",
  1854. dp_stats_buf->ap_bss_peer_not_found);
  1855. DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u",
  1856. dp_stats_buf->ap_bcast_mcast_no_peer);
  1857. DP_PRINT_STATS("sta_delete_in_progress = %u",
  1858. dp_stats_buf->sta_delete_in_progress);
  1859. DP_PRINT_STATS("ibss_no_bss_peer = %u",
  1860. dp_stats_buf->ibss_no_bss_peer);
  1861. DP_PRINT_STATS("invaild_vdev_type = %u",
  1862. dp_stats_buf->invaild_vdev_type);
  1863. DP_PRINT_STATS("invalid_ast_peer_entry = %u",
  1864. dp_stats_buf->invalid_ast_peer_entry);
  1865. DP_PRINT_STATS("peer_entry_invalid = %u",
  1866. dp_stats_buf->peer_entry_invalid);
  1867. DP_PRINT_STATS("ethertype_not_ip = %u",
  1868. dp_stats_buf->ethertype_not_ip);
  1869. DP_PRINT_STATS("eapol_lookup_failed = %u",
  1870. dp_stats_buf->eapol_lookup_failed);
  1871. DP_PRINT_STATS("qpeer_not_allow_data = %u",
  1872. dp_stats_buf->qpeer_not_allow_data);
  1873. DP_PRINT_STATS("fse_tid_override = %u\n",
  1874. dp_stats_buf->fse_tid_override);
  1875. }
  1876. /*
  1877. * dp_print_tx_de_classify_stats_tlv: display htt_tx_de_classify_stats_tlv
  1878. * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv
  1879. *
  1880. * return:void
  1881. */
  1882. static inline void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf)
  1883. {
  1884. htt_tx_de_classify_stats_tlv *dp_stats_buf =
  1885. (htt_tx_de_classify_stats_tlv *)tag_buf;
  1886. DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:");
  1887. DP_PRINT_STATS("arp_packets = %u",
  1888. dp_stats_buf->arp_packets);
  1889. DP_PRINT_STATS("igmp_packets = %u",
  1890. dp_stats_buf->igmp_packets);
  1891. DP_PRINT_STATS("dhcp_packets = %u",
  1892. dp_stats_buf->dhcp_packets);
  1893. DP_PRINT_STATS("host_inspected = %u",
  1894. dp_stats_buf->host_inspected);
  1895. DP_PRINT_STATS("htt_included = %u",
  1896. dp_stats_buf->htt_included);
  1897. DP_PRINT_STATS("htt_valid_mcs = %u",
  1898. dp_stats_buf->htt_valid_mcs);
  1899. DP_PRINT_STATS("htt_valid_nss = %u",
  1900. dp_stats_buf->htt_valid_nss);
  1901. DP_PRINT_STATS("htt_valid_preamble_type = %u",
  1902. dp_stats_buf->htt_valid_preamble_type);
  1903. DP_PRINT_STATS("htt_valid_chainmask = %u",
  1904. dp_stats_buf->htt_valid_chainmask);
  1905. DP_PRINT_STATS("htt_valid_guard_interval = %u",
  1906. dp_stats_buf->htt_valid_guard_interval);
  1907. DP_PRINT_STATS("htt_valid_retries = %u",
  1908. dp_stats_buf->htt_valid_retries);
  1909. DP_PRINT_STATS("htt_valid_bw_info = %u",
  1910. dp_stats_buf->htt_valid_bw_info);
  1911. DP_PRINT_STATS("htt_valid_power = %u",
  1912. dp_stats_buf->htt_valid_power);
  1913. DP_PRINT_STATS("htt_valid_key_flags = %u",
  1914. dp_stats_buf->htt_valid_key_flags);
  1915. DP_PRINT_STATS("htt_valid_no_encryption = %u",
  1916. dp_stats_buf->htt_valid_no_encryption);
  1917. DP_PRINT_STATS("fse_entry_count = %u",
  1918. dp_stats_buf->fse_entry_count);
  1919. DP_PRINT_STATS("fse_priority_be = %u",
  1920. dp_stats_buf->fse_priority_be);
  1921. DP_PRINT_STATS("fse_priority_high = %u",
  1922. dp_stats_buf->fse_priority_high);
  1923. DP_PRINT_STATS("fse_priority_low = %u",
  1924. dp_stats_buf->fse_priority_low);
  1925. DP_PRINT_STATS("fse_traffic_ptrn_be = %u",
  1926. dp_stats_buf->fse_traffic_ptrn_be);
  1927. DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u",
  1928. dp_stats_buf->fse_traffic_ptrn_over_sub);
  1929. DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u",
  1930. dp_stats_buf->fse_traffic_ptrn_bursty);
  1931. DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u",
  1932. dp_stats_buf->fse_traffic_ptrn_interactive);
  1933. DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u",
  1934. dp_stats_buf->fse_traffic_ptrn_periodic);
  1935. DP_PRINT_STATS("fse_hwqueue_alloc = %u",
  1936. dp_stats_buf->fse_hwqueue_alloc);
  1937. DP_PRINT_STATS("fse_hwqueue_created = %u",
  1938. dp_stats_buf->fse_hwqueue_created);
  1939. DP_PRINT_STATS("fse_hwqueue_send_to_host = %u",
  1940. dp_stats_buf->fse_hwqueue_send_to_host);
  1941. DP_PRINT_STATS("mcast_entry = %u",
  1942. dp_stats_buf->mcast_entry);
  1943. DP_PRINT_STATS("bcast_entry = %u\n",
  1944. dp_stats_buf->bcast_entry);
  1945. }
  1946. /*
  1947. * dp_print_tx_de_classify_status_stats_tlv: display
  1948. * htt_tx_de_classify_status_stats_tlv
  1949. * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv
  1950. *
  1951. * return:void
  1952. */
  1953. static inline void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf)
  1954. {
  1955. htt_tx_de_classify_status_stats_tlv *dp_stats_buf =
  1956. (htt_tx_de_classify_status_stats_tlv *)tag_buf;
  1957. DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:");
  1958. DP_PRINT_STATS("eok = %u",
  1959. dp_stats_buf->eok);
  1960. DP_PRINT_STATS("classify_done = %u",
  1961. dp_stats_buf->classify_done);
  1962. DP_PRINT_STATS("lookup_failed = %u",
  1963. dp_stats_buf->lookup_failed);
  1964. DP_PRINT_STATS("send_host_dhcp = %u",
  1965. dp_stats_buf->send_host_dhcp);
  1966. DP_PRINT_STATS("send_host_mcast = %u",
  1967. dp_stats_buf->send_host_mcast);
  1968. DP_PRINT_STATS("send_host_unknown_dest = %u",
  1969. dp_stats_buf->send_host_unknown_dest);
  1970. DP_PRINT_STATS("send_host = %u",
  1971. dp_stats_buf->send_host);
  1972. DP_PRINT_STATS("status_invalid = %u\n",
  1973. dp_stats_buf->status_invalid);
  1974. }
  1975. /*
  1976. * dp_print_tx_de_enqueue_packets_stats_tlv: display
  1977. * htt_tx_de_enqueue_packets_stats_tlv
  1978. * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv
  1979. *
  1980. * return:void
  1981. */
  1982. static inline void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf)
  1983. {
  1984. htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf =
  1985. (htt_tx_de_enqueue_packets_stats_tlv *)tag_buf;
  1986. DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:");
  1987. DP_PRINT_STATS("enqueued_pkts = %u",
  1988. dp_stats_buf->enqueued_pkts);
  1989. DP_PRINT_STATS("to_tqm = %u",
  1990. dp_stats_buf->to_tqm);
  1991. DP_PRINT_STATS("to_tqm_bypass = %u\n",
  1992. dp_stats_buf->to_tqm_bypass);
  1993. }
  1994. /*
  1995. * dp_print_tx_de_enqueue_discard_stats_tlv: display
  1996. * htt_tx_de_enqueue_discard_stats_tlv
  1997. * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv
  1998. *
  1999. * return:void
  2000. */
  2001. static inline void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf)
  2002. {
  2003. htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf =
  2004. (htt_tx_de_enqueue_discard_stats_tlv *)tag_buf;
  2005. DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:");
  2006. DP_PRINT_STATS("discarded_pkts = %u",
  2007. dp_stats_buf->discarded_pkts);
  2008. DP_PRINT_STATS("local_frames = %u",
  2009. dp_stats_buf->local_frames);
  2010. DP_PRINT_STATS("is_ext_msdu = %u\n",
  2011. dp_stats_buf->is_ext_msdu);
  2012. }
  2013. /*
  2014. * dp_print_tx_de_compl_stats_tlv: display htt_tx_de_compl_stats_tlv
  2015. * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv
  2016. *
  2017. * return:void
  2018. */
  2019. static inline void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf)
  2020. {
  2021. htt_tx_de_compl_stats_tlv *dp_stats_buf =
  2022. (htt_tx_de_compl_stats_tlv *)tag_buf;
  2023. DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:");
  2024. DP_PRINT_STATS("tcl_dummy_frame = %u",
  2025. dp_stats_buf->tcl_dummy_frame);
  2026. DP_PRINT_STATS("tqm_dummy_frame = %u",
  2027. dp_stats_buf->tqm_dummy_frame);
  2028. DP_PRINT_STATS("tqm_notify_frame = %u",
  2029. dp_stats_buf->tqm_notify_frame);
  2030. DP_PRINT_STATS("fw2wbm_enq = %u",
  2031. dp_stats_buf->fw2wbm_enq);
  2032. DP_PRINT_STATS("tqm_bypass_frame = %u\n",
  2033. dp_stats_buf->tqm_bypass_frame);
  2034. }
  2035. /*
  2036. * dp_print_tx_de_cmn_stats_tlv: display htt_tx_de_cmn_stats_tlv
  2037. * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv
  2038. *
  2039. * return:void
  2040. */
  2041. static inline void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf)
  2042. {
  2043. htt_tx_de_cmn_stats_tlv *dp_stats_buf =
  2044. (htt_tx_de_cmn_stats_tlv *)tag_buf;
  2045. DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:");
  2046. DP_PRINT_STATS("mac_id__word = %u",
  2047. dp_stats_buf->mac_id__word);
  2048. DP_PRINT_STATS("tcl2fw_entry_count = %u",
  2049. dp_stats_buf->tcl2fw_entry_count);
  2050. DP_PRINT_STATS("not_to_fw = %u",
  2051. dp_stats_buf->not_to_fw);
  2052. DP_PRINT_STATS("invalid_pdev_vdev_peer = %u",
  2053. dp_stats_buf->invalid_pdev_vdev_peer);
  2054. DP_PRINT_STATS("tcl_res_invalid_addrx = %u",
  2055. dp_stats_buf->tcl_res_invalid_addrx);
  2056. DP_PRINT_STATS("wbm2fw_entry_count = %u",
  2057. dp_stats_buf->wbm2fw_entry_count);
  2058. DP_PRINT_STATS("invalid_pdev = %u\n",
  2059. dp_stats_buf->invalid_pdev);
  2060. }
  2061. /*
  2062. * dp_print_ring_if_stats_tlv: display htt_ring_if_stats_tlv
  2063. * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv
  2064. *
  2065. * return:void
  2066. */
  2067. static inline void dp_print_ring_if_stats_tlv(uint32_t *tag_buf)
  2068. {
  2069. htt_ring_if_stats_tlv *dp_stats_buf =
  2070. (htt_ring_if_stats_tlv *)tag_buf;
  2071. uint8_t i;
  2072. uint16_t index = 0;
  2073. char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2074. if (!wm_hit_count) {
  2075. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  2076. FL("Output buffer not allocated"));
  2077. return;
  2078. }
  2079. DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:");
  2080. DP_PRINT_STATS("base_addr = %u",
  2081. dp_stats_buf->base_addr);
  2082. DP_PRINT_STATS("elem_size = %u",
  2083. dp_stats_buf->elem_size);
  2084. DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u",
  2085. dp_stats_buf->num_elems__prefetch_tail_idx);
  2086. DP_PRINT_STATS("head_idx__tail_idx = %u",
  2087. dp_stats_buf->head_idx__tail_idx);
  2088. DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u",
  2089. dp_stats_buf->shadow_head_idx__shadow_tail_idx);
  2090. DP_PRINT_STATS("num_tail_incr = %u",
  2091. dp_stats_buf->num_tail_incr);
  2092. DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u",
  2093. dp_stats_buf->lwm_thresh__hwm_thresh);
  2094. DP_PRINT_STATS("overrun_hit_count = %u",
  2095. dp_stats_buf->overrun_hit_count);
  2096. DP_PRINT_STATS("underrun_hit_count = %u",
  2097. dp_stats_buf->underrun_hit_count);
  2098. DP_PRINT_STATS("prod_blockwait_count = %u",
  2099. dp_stats_buf->prod_blockwait_count);
  2100. DP_PRINT_STATS("cons_blockwait_count = %u",
  2101. dp_stats_buf->cons_blockwait_count);
  2102. for (i = 0; i < DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) {
  2103. index += qdf_snprint(&wm_hit_count[index],
  2104. DP_MAX_STRING_LEN - index,
  2105. " %u:%u,", i,
  2106. dp_stats_buf->low_wm_hit_count[i]);
  2107. }
  2108. DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count);
  2109. qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN);
  2110. index = 0;
  2111. for (i = 0; i < DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) {
  2112. index += qdf_snprint(&wm_hit_count[index],
  2113. DP_MAX_STRING_LEN - index,
  2114. " %u:%u,", i,
  2115. dp_stats_buf->high_wm_hit_count[i]);
  2116. }
  2117. DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count);
  2118. }
  2119. /*
  2120. * dp_print_ring_if_cmn_tlv: display htt_ring_if_cmn_tlv
  2121. * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv
  2122. *
  2123. * return:void
  2124. */
  2125. static inline void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf)
  2126. {
  2127. htt_ring_if_cmn_tlv *dp_stats_buf =
  2128. (htt_ring_if_cmn_tlv *)tag_buf;
  2129. DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:");
  2130. DP_PRINT_STATS("mac_id__word = %u",
  2131. dp_stats_buf->mac_id__word);
  2132. DP_PRINT_STATS("num_records = %u\n",
  2133. dp_stats_buf->num_records);
  2134. }
  2135. /*
  2136. * dp_print_sfm_client_user_tlv_v: display htt_sfm_client_user_tlv_v
  2137. * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v
  2138. *
  2139. * return:void
  2140. */
  2141. static inline void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf)
  2142. {
  2143. htt_sfm_client_user_tlv_v *dp_stats_buf =
  2144. (htt_sfm_client_user_tlv_v *)tag_buf;
  2145. uint8_t i;
  2146. uint16_t index = 0;
  2147. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2148. char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2149. if (!dwords_used_by_user_n) {
  2150. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  2151. FL("Output buffer not allocated"));
  2152. return;
  2153. }
  2154. DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:");
  2155. for (i = 0; i < tag_len; i++) {
  2156. index += qdf_snprint(&dwords_used_by_user_n[index],
  2157. DP_MAX_STRING_LEN - index,
  2158. " %u:%u,", i,
  2159. dp_stats_buf->dwords_used_by_user_n[i]);
  2160. }
  2161. DP_PRINT_STATS("dwords_used_by_user_n = %s\n",
  2162. dwords_used_by_user_n);
  2163. qdf_mem_free(dwords_used_by_user_n);
  2164. }
  2165. /*
  2166. * dp_print_sfm_client_tlv: display htt_sfm_client_tlv
  2167. * @tag_buf: buffer containing the tlv htt_sfm_client_tlv
  2168. *
  2169. * return:void
  2170. */
  2171. static inline void dp_print_sfm_client_tlv(uint32_t *tag_buf)
  2172. {
  2173. htt_sfm_client_tlv *dp_stats_buf =
  2174. (htt_sfm_client_tlv *)tag_buf;
  2175. DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:");
  2176. DP_PRINT_STATS("client_id = %u",
  2177. dp_stats_buf->client_id);
  2178. DP_PRINT_STATS("buf_min = %u",
  2179. dp_stats_buf->buf_min);
  2180. DP_PRINT_STATS("buf_max = %u",
  2181. dp_stats_buf->buf_max);
  2182. DP_PRINT_STATS("buf_busy = %u",
  2183. dp_stats_buf->buf_busy);
  2184. DP_PRINT_STATS("buf_alloc = %u",
  2185. dp_stats_buf->buf_alloc);
  2186. DP_PRINT_STATS("buf_avail = %u",
  2187. dp_stats_buf->buf_avail);
  2188. DP_PRINT_STATS("num_users = %u\n",
  2189. dp_stats_buf->num_users);
  2190. }
  2191. /*
  2192. * dp_print_sfm_cmn_tlv: display htt_sfm_cmn_tlv
  2193. * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv
  2194. *
  2195. * return:void
  2196. */
  2197. static inline void dp_print_sfm_cmn_tlv(uint32_t *tag_buf)
  2198. {
  2199. htt_sfm_cmn_tlv *dp_stats_buf =
  2200. (htt_sfm_cmn_tlv *)tag_buf;
  2201. DP_PRINT_STATS("HTT_SFM_CMN_TLV:");
  2202. DP_PRINT_STATS("mac_id__word = %u",
  2203. dp_stats_buf->mac_id__word);
  2204. DP_PRINT_STATS("buf_total = %u",
  2205. dp_stats_buf->buf_total);
  2206. DP_PRINT_STATS("mem_empty = %u",
  2207. dp_stats_buf->mem_empty);
  2208. DP_PRINT_STATS("deallocate_bufs = %u",
  2209. dp_stats_buf->deallocate_bufs);
  2210. DP_PRINT_STATS("num_records = %u\n",
  2211. dp_stats_buf->num_records);
  2212. }
  2213. /*
  2214. * dp_print_sring_stats_tlv: display htt_sring_stats_tlv
  2215. * @tag_buf: buffer containing the tlv htt_sring_stats_tlv
  2216. *
  2217. * return:void
  2218. */
  2219. static inline void dp_print_sring_stats_tlv(uint32_t *tag_buf)
  2220. {
  2221. htt_sring_stats_tlv *dp_stats_buf =
  2222. (htt_sring_stats_tlv *)tag_buf;
  2223. DP_PRINT_STATS("HTT_SRING_STATS_TLV:");
  2224. DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u",
  2225. dp_stats_buf->mac_id__ring_id__arena__ep);
  2226. DP_PRINT_STATS("base_addr_lsb = %u",
  2227. dp_stats_buf->base_addr_lsb);
  2228. DP_PRINT_STATS("base_addr_msb = %u",
  2229. dp_stats_buf->base_addr_msb);
  2230. DP_PRINT_STATS("ring_size = %u",
  2231. dp_stats_buf->ring_size);
  2232. DP_PRINT_STATS("elem_size = %u",
  2233. dp_stats_buf->elem_size);
  2234. DP_PRINT_STATS("num_avail_words__num_valid_words = %u",
  2235. dp_stats_buf->num_avail_words__num_valid_words);
  2236. DP_PRINT_STATS("head_ptr__tail_ptr = %u",
  2237. dp_stats_buf->head_ptr__tail_ptr);
  2238. DP_PRINT_STATS("consumer_empty__producer_full = %u",
  2239. dp_stats_buf->consumer_empty__producer_full);
  2240. DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n",
  2241. dp_stats_buf->prefetch_count__internal_tail_ptr);
  2242. }
  2243. /*
  2244. * dp_print_sring_cmn_tlv: display htt_sring_cmn_tlv
  2245. * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv
  2246. *
  2247. * return:void
  2248. */
  2249. static inline void dp_print_sring_cmn_tlv(uint32_t *tag_buf)
  2250. {
  2251. htt_sring_cmn_tlv *dp_stats_buf =
  2252. (htt_sring_cmn_tlv *)tag_buf;
  2253. DP_PRINT_STATS("HTT_SRING_CMN_TLV:");
  2254. DP_PRINT_STATS("num_records = %u\n",
  2255. dp_stats_buf->num_records);
  2256. }
  2257. /*
  2258. * dp_print_tx_pdev_rate_stats_tlv: display htt_tx_pdev_rate_stats_tlv
  2259. * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv
  2260. *
  2261. * return:void
  2262. */
  2263. static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf)
  2264. {
  2265. htt_tx_pdev_rate_stats_tlv *dp_stats_buf =
  2266. (htt_tx_pdev_rate_stats_tlv *)tag_buf;
  2267. uint8_t i, j;
  2268. uint16_t index = 0;
  2269. char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
  2270. char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
  2271. char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
  2272. char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
  2273. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2274. if (!str_buf) {
  2275. dp_err("Output buffer not allocated");
  2276. return;
  2277. }
  2278. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  2279. tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2280. if (!tx_gi[i]) {
  2281. dp_err("Unable to allocate buffer for tx_gi");
  2282. goto fail1;
  2283. }
  2284. ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2285. if (!ac_mu_mimo_tx_gi[i]) {
  2286. dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi");
  2287. goto fail2;
  2288. }
  2289. ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2290. if (!ax_mu_mimo_tx_gi[i]) {
  2291. dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi");
  2292. goto fail3;
  2293. }
  2294. ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2295. if (!ofdma_tx_gi[i]) {
  2296. dp_err("Unable to allocate buffer for ofdma_tx_gi");
  2297. goto fail4;
  2298. }
  2299. }
  2300. DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:");
  2301. DP_PRINT_STATS("mac_id__word = %u",
  2302. dp_stats_buf->mac_id__word);
  2303. DP_PRINT_STATS("tx_ldpc = %u",
  2304. dp_stats_buf->tx_ldpc);
  2305. DP_PRINT_STATS("rts_cnt = %u",
  2306. dp_stats_buf->rts_cnt);
  2307. DP_PRINT_STATS("rts_success = %u",
  2308. dp_stats_buf->rts_success);
  2309. DP_PRINT_STATS("ack_rssi = %u",
  2310. dp_stats_buf->ack_rssi);
  2311. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2312. for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) {
  2313. index += qdf_snprint(&str_buf[index],
  2314. DP_MAX_STRING_LEN - index,
  2315. " %u:%u,", i, dp_stats_buf->tx_mcs[i]);
  2316. }
  2317. DP_PRINT_STATS("tx_mcs = %s ", str_buf);
  2318. index = 0;
  2319. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2320. for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) {
  2321. index += qdf_snprint(&str_buf[index],
  2322. DP_MAX_STRING_LEN - index,
  2323. " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
  2324. }
  2325. DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
  2326. index = 0;
  2327. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2328. for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) {
  2329. index += qdf_snprint(&str_buf[index],
  2330. DP_MAX_STRING_LEN - index,
  2331. " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
  2332. }
  2333. DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
  2334. index = 0;
  2335. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2336. for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) {
  2337. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  2338. index += qdf_snprint(&str_buf[index],
  2339. DP_MAX_STRING_LEN - index,
  2340. " %u:%u,", (i + 1),
  2341. dp_stats_buf->tx_nss[i]);
  2342. }
  2343. DP_PRINT_STATS("tx_nss = %s ", str_buf);
  2344. index = 0;
  2345. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2346. for (i = 0; i < DP_HTT_TX_BW_LEN; i++) {
  2347. index += qdf_snprint(&str_buf[index],
  2348. DP_MAX_STRING_LEN - index,
  2349. " %u:%u,", i, dp_stats_buf->tx_bw[i]);
  2350. }
  2351. DP_PRINT_STATS("tx_bw = %s ", str_buf);
  2352. index = 0;
  2353. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2354. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2355. index += qdf_snprint(&str_buf[index],
  2356. DP_MAX_STRING_LEN - index,
  2357. " %u:%u,", i, dp_stats_buf->tx_stbc[i]);
  2358. }
  2359. DP_PRINT_STATS("tx_stbc = %s ", str_buf);
  2360. index = 0;
  2361. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2362. for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) {
  2363. index += qdf_snprint(&str_buf[index],
  2364. DP_MAX_STRING_LEN - index,
  2365. " %u:%u,", i, dp_stats_buf->tx_pream[i]);
  2366. }
  2367. DP_PRINT_STATS("tx_pream = %s ", str_buf);
  2368. for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
  2369. index = 0;
  2370. qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN);
  2371. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2372. index += qdf_snprint(&tx_gi[j][index],
  2373. DP_MAX_STRING_LEN - index,
  2374. " %u:%u,", i,
  2375. dp_stats_buf->tx_gi[j][i]);
  2376. }
  2377. DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
  2378. }
  2379. index = 0;
  2380. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2381. for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) {
  2382. index += qdf_snprint(&str_buf[index],
  2383. DP_MAX_STRING_LEN - index,
  2384. " %u:%u,", i, dp_stats_buf->tx_dcm[i]);
  2385. }
  2386. DP_PRINT_STATS("tx_dcm = %s\n", str_buf);
  2387. DP_PRINT_STATS("rts_success = %u",
  2388. dp_stats_buf->rts_success);
  2389. DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u",
  2390. dp_stats_buf->ac_mu_mimo_tx_ldpc);
  2391. DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u",
  2392. dp_stats_buf->ax_mu_mimo_tx_ldpc);
  2393. DP_PRINT_STATS("ofdma_tx_ldpc = %u",
  2394. dp_stats_buf->ofdma_tx_ldpc);
  2395. index = 0;
  2396. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2397. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
  2398. index += qdf_snprint(&str_buf[index],
  2399. DP_MAX_STRING_LEN - index,
  2400. " %u:%u,",
  2401. i, dp_stats_buf->tx_legacy_cck_rate[i]);
  2402. }
  2403. DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf);
  2404. index = 0;
  2405. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2406. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
  2407. index += qdf_snprint(&str_buf[index],
  2408. DP_MAX_STRING_LEN - index,
  2409. " %u:%u,", i,
  2410. dp_stats_buf->tx_legacy_ofdm_rate[i]);
  2411. }
  2412. DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf);
  2413. index = 0;
  2414. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2415. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LTF; i++) {
  2416. index += qdf_snprint(&str_buf[index],
  2417. DP_MAX_STRING_LEN - index,
  2418. " %u:%u,",
  2419. i, dp_stats_buf->tx_he_ltf[i]);
  2420. }
  2421. DP_PRINT_STATS("tx_he_ltf = %s ", str_buf);
  2422. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2423. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2424. index += qdf_snprint(&str_buf[index],
  2425. DP_MAX_STRING_LEN - index,
  2426. " %u:%u,",
  2427. i, dp_stats_buf->ofdma_tx_mcs[i]);
  2428. }
  2429. DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
  2430. index = 0;
  2431. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2432. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2433. index += qdf_snprint(&str_buf[index],
  2434. DP_MAX_STRING_LEN - index,
  2435. " %u:%u,",
  2436. i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]);
  2437. }
  2438. DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf);
  2439. index = 0;
  2440. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2441. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2442. index += qdf_snprint(&str_buf[index],
  2443. DP_MAX_STRING_LEN - index,
  2444. " %u:%u,",
  2445. i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]);
  2446. }
  2447. DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf);
  2448. index = 0;
  2449. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2450. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2451. index += qdf_snprint(&str_buf[index],
  2452. DP_MAX_STRING_LEN - index,
  2453. " %u:%u,",
  2454. i, dp_stats_buf->ofdma_tx_mcs[i]);
  2455. }
  2456. DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
  2457. index = 0;
  2458. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2459. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  2460. index += qdf_snprint(&str_buf[index],
  2461. DP_MAX_STRING_LEN - index,
  2462. " %u:%u,",
  2463. i, dp_stats_buf->ac_mu_mimo_tx_nss[i]);
  2464. }
  2465. DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf);
  2466. index = 0;
  2467. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2468. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  2469. index += qdf_snprint(&str_buf[index],
  2470. DP_MAX_STRING_LEN - index,
  2471. " %u:%u,",
  2472. i, dp_stats_buf->ax_mu_mimo_tx_nss[i]);
  2473. }
  2474. DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf);
  2475. index = 0;
  2476. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2477. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  2478. index += qdf_snprint(&str_buf[index],
  2479. DP_MAX_STRING_LEN - index,
  2480. " %u:%u,",
  2481. i, dp_stats_buf->ofdma_tx_nss[i]);
  2482. }
  2483. DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf);
  2484. index = 0;
  2485. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2486. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  2487. index += qdf_snprint(&str_buf[index],
  2488. DP_MAX_STRING_LEN - index,
  2489. " %u:%u,",
  2490. i, dp_stats_buf->ac_mu_mimo_tx_bw[i]);
  2491. }
  2492. DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf);
  2493. index = 0;
  2494. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2495. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  2496. index += qdf_snprint(&str_buf[index],
  2497. DP_MAX_STRING_LEN - index,
  2498. " %u:%u,",
  2499. i, dp_stats_buf->ax_mu_mimo_tx_bw[i]);
  2500. }
  2501. DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf);
  2502. index = 0;
  2503. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2504. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  2505. index += qdf_snprint(&str_buf[index],
  2506. DP_MAX_STRING_LEN - index,
  2507. " %u:%u,",
  2508. i, dp_stats_buf->ofdma_tx_bw[i]);
  2509. }
  2510. DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf);
  2511. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  2512. index = 0;
  2513. qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
  2514. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2515. index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index],
  2516. DP_MAX_STRING_LEN - index,
  2517. " %u:%u,", i,
  2518. dp_stats_buf->
  2519. ac_mu_mimo_tx_gi[j][i]);
  2520. }
  2521. DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ",
  2522. j, ac_mu_mimo_tx_gi[j]);
  2523. }
  2524. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  2525. index = 0;
  2526. qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
  2527. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2528. index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index],
  2529. DP_MAX_STRING_LEN - index,
  2530. " %u:%u,", i,
  2531. dp_stats_buf->ax_mu_mimo_tx_gi[j][i]);
  2532. }
  2533. DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ",
  2534. j, ax_mu_mimo_tx_gi[j]);
  2535. }
  2536. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  2537. index = 0;
  2538. qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN);
  2539. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2540. index += qdf_snprint(&ofdma_tx_gi[j][index],
  2541. DP_MAX_STRING_LEN - index,
  2542. " %u:%u,", i,
  2543. dp_stats_buf->ofdma_tx_gi[j][i]);
  2544. }
  2545. DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ",
  2546. j, ofdma_tx_gi[j]);
  2547. }
  2548. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  2549. qdf_mem_free(ofdma_tx_gi[i]);
  2550. fail4:
  2551. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  2552. qdf_mem_free(ax_mu_mimo_tx_gi[i]);
  2553. fail3:
  2554. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  2555. qdf_mem_free(ac_mu_mimo_tx_gi[i]);
  2556. fail2:
  2557. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  2558. qdf_mem_free(tx_gi[i]);
  2559. fail1:
  2560. qdf_mem_free(str_buf);
  2561. }
  2562. /*
  2563. * dp_print_rx_pdev_rate_stats_tlv: display htt_rx_pdev_rate_stats_tlv
  2564. * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv
  2565. *
  2566. * return:void
  2567. */
  2568. static inline void dp_print_rx_pdev_rate_stats_tlv(uint32_t *tag_buf)
  2569. {
  2570. htt_rx_pdev_rate_stats_tlv *dp_stats_buf =
  2571. (htt_rx_pdev_rate_stats_tlv *)tag_buf;
  2572. uint8_t i, j;
  2573. uint16_t index = 0;
  2574. char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN];
  2575. char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
  2576. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2577. char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
  2578. if (!str_buf) {
  2579. dp_err("Output buffer not allocated");
  2580. return;
  2581. }
  2582. for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) {
  2583. rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2584. if (!rssi_chain[i]) {
  2585. dp_err("Unable to allocate buffer for rssi_chain");
  2586. goto fail1;
  2587. }
  2588. }
  2589. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  2590. rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2591. if (!rx_gi[i]) {
  2592. dp_err("Unable to allocate buffer for rx_gi");
  2593. goto fail2;
  2594. }
  2595. }
  2596. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  2597. ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2598. if (!ul_ofdma_rx_gi[i]) {
  2599. dp_err("Unable to allocate buffer for ul_ofdma_rx_gi");
  2600. goto fail3;
  2601. }
  2602. }
  2603. DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:");
  2604. DP_PRINT_STATS("mac_id__word = %u",
  2605. dp_stats_buf->mac_id__word);
  2606. DP_PRINT_STATS("nsts = %u",
  2607. dp_stats_buf->nsts);
  2608. DP_PRINT_STATS("rx_ldpc = %u",
  2609. dp_stats_buf->rx_ldpc);
  2610. DP_PRINT_STATS("rts_cnt = %u",
  2611. dp_stats_buf->rts_cnt);
  2612. DP_PRINT_STATS("rssi_mgmt = %u",
  2613. dp_stats_buf->rssi_mgmt);
  2614. DP_PRINT_STATS("rssi_data = %u",
  2615. dp_stats_buf->rssi_data);
  2616. DP_PRINT_STATS("rssi_comb = %u",
  2617. dp_stats_buf->rssi_comb);
  2618. DP_PRINT_STATS("rx_in_dbm = %u",
  2619. dp_stats_buf->rssi_in_dbm);
  2620. DP_PRINT_STATS("rx_11ax_su_ext = %u",
  2621. dp_stats_buf->rx_11ax_su_ext);
  2622. DP_PRINT_STATS("rx_11ac_mumimo = %u",
  2623. dp_stats_buf->rx_11ac_mumimo);
  2624. DP_PRINT_STATS("rx_11ax_mumimo = %u",
  2625. dp_stats_buf->rx_11ax_mumimo);
  2626. DP_PRINT_STATS("rx_11ax_ofdma = %u",
  2627. dp_stats_buf->rx_11ax_ofdma);
  2628. DP_PRINT_STATS("txbf = %u",
  2629. dp_stats_buf->txbf);
  2630. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2631. for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) {
  2632. index += qdf_snprint(&str_buf[index],
  2633. DP_MAX_STRING_LEN - index,
  2634. " %u:%u,", i, dp_stats_buf->rx_mcs[i]);
  2635. }
  2636. DP_PRINT_STATS("rx_mcs = %s ", str_buf);
  2637. index = 0;
  2638. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2639. for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) {
  2640. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  2641. index += qdf_snprint(&str_buf[index],
  2642. DP_MAX_STRING_LEN - index,
  2643. " %u:%u,", (i + 1),
  2644. dp_stats_buf->rx_nss[i]);
  2645. }
  2646. DP_PRINT_STATS("rx_nss = %s ", str_buf);
  2647. index = 0;
  2648. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2649. for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) {
  2650. index += qdf_snprint(&str_buf[index],
  2651. DP_MAX_STRING_LEN - index,
  2652. " %u:%u,", i, dp_stats_buf->rx_dcm[i]);
  2653. }
  2654. DP_PRINT_STATS("rx_dcm = %s ", str_buf);
  2655. index = 0;
  2656. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2657. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2658. index += qdf_snprint(&str_buf[index],
  2659. DP_MAX_STRING_LEN - index,
  2660. " %u:%u,", i, dp_stats_buf->rx_stbc[i]);
  2661. }
  2662. DP_PRINT_STATS("rx_stbc = %s ", str_buf);
  2663. index = 0;
  2664. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2665. for (i = 0; i < DP_HTT_RX_BW_LEN; i++) {
  2666. index += qdf_snprint(&str_buf[index],
  2667. DP_MAX_STRING_LEN - index,
  2668. " %u:%u,", i, dp_stats_buf->rx_bw[i]);
  2669. }
  2670. DP_PRINT_STATS("rx_bw = %s ", str_buf);
  2671. for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) {
  2672. index = 0;
  2673. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  2674. index += qdf_snprint(&rssi_chain[j][index],
  2675. DP_MAX_STRING_LEN - index,
  2676. " %u:%u,", i,
  2677. dp_stats_buf->rssi_chain[j][i]);
  2678. }
  2679. DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
  2680. }
  2681. for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
  2682. index = 0;
  2683. qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN);
  2684. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2685. index += qdf_snprint(&rx_gi[j][index],
  2686. DP_MAX_STRING_LEN - index,
  2687. " %u:%u,", i,
  2688. dp_stats_buf->rx_gi[j][i]);
  2689. }
  2690. DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
  2691. }
  2692. index = 0;
  2693. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2694. for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) {
  2695. index += qdf_snprint(&str_buf[index],
  2696. DP_MAX_STRING_LEN - index,
  2697. " %u:%u,",
  2698. i,
  2699. dp_stats_buf->rx_pream[i]);
  2700. }
  2701. DP_PRINT_STATS("rx_pream = %s", str_buf);
  2702. index = 0;
  2703. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2704. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
  2705. index += qdf_snprint(&str_buf[index],
  2706. DP_MAX_STRING_LEN - index,
  2707. " %u:%u,",
  2708. i,
  2709. dp_stats_buf->rx_legacy_cck_rate[i]);
  2710. }
  2711. DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf);
  2712. index = 0;
  2713. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2714. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
  2715. index += qdf_snprint(&str_buf[index],
  2716. DP_MAX_STRING_LEN - index,
  2717. " %u:%u,",
  2718. i,
  2719. dp_stats_buf->rx_legacy_ofdm_rate[i]);
  2720. }
  2721. DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf);
  2722. index = 0;
  2723. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2724. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2725. index += qdf_snprint(&str_buf[index],
  2726. DP_MAX_STRING_LEN - index,
  2727. " %u:%u,",
  2728. i, dp_stats_buf->ul_ofdma_rx_mcs[i]);
  2729. }
  2730. DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf);
  2731. DP_PRINT_STATS("rx_11ax_ul_ofdma = %u",
  2732. dp_stats_buf->rx_11ax_ul_ofdma);
  2733. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  2734. index = 0;
  2735. qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN);
  2736. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  2737. index += qdf_snprint(&ul_ofdma_rx_gi[j][index],
  2738. DP_MAX_STRING_LEN - index,
  2739. " %u:%u,", i,
  2740. dp_stats_buf->
  2741. ul_ofdma_rx_gi[j][i]);
  2742. }
  2743. DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ",
  2744. j, ul_ofdma_rx_gi[j]);
  2745. }
  2746. index = 0;
  2747. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2748. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  2749. index += qdf_snprint(&str_buf[index],
  2750. DP_MAX_STRING_LEN - index,
  2751. " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]);
  2752. }
  2753. DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf);
  2754. index = 0;
  2755. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2756. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  2757. index += qdf_snprint(&str_buf[index],
  2758. DP_MAX_STRING_LEN - index,
  2759. " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]);
  2760. }
  2761. DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf);
  2762. DP_PRINT_STATS("ul_ofdma_rx_stbc = %u",
  2763. dp_stats_buf->ul_ofdma_rx_stbc);
  2764. DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u",
  2765. dp_stats_buf->ul_ofdma_rx_ldpc);
  2766. index = 0;
  2767. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2768. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  2769. index += qdf_snprint(&str_buf[index],
  2770. DP_MAX_STRING_LEN - index,
  2771. " %u:%u,", i,
  2772. dp_stats_buf->rx_ulofdma_non_data_ppdu[i]);
  2773. }
  2774. DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf);
  2775. index = 0;
  2776. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2777. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  2778. index += qdf_snprint(&str_buf[index],
  2779. DP_MAX_STRING_LEN - index,
  2780. " %u:%u,",
  2781. i, dp_stats_buf->rx_ulofdma_data_ppdu[i]);
  2782. }
  2783. DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf);
  2784. index = 0;
  2785. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2786. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  2787. index += qdf_snprint(&str_buf[index],
  2788. DP_MAX_STRING_LEN - index,
  2789. " %u:%u,",
  2790. i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]);
  2791. }
  2792. DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf);
  2793. index = 0;
  2794. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2795. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  2796. index += qdf_snprint(&str_buf[index],
  2797. DP_MAX_STRING_LEN - index,
  2798. " %u:%u,",
  2799. i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]);
  2800. }
  2801. DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf);
  2802. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  2803. qdf_mem_free(ul_ofdma_rx_gi[i]);
  2804. fail3:
  2805. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  2806. qdf_mem_free(rx_gi[i]);
  2807. fail2:
  2808. for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
  2809. qdf_mem_free(rssi_chain[i]);
  2810. fail1:
  2811. qdf_mem_free(str_buf);
  2812. }
  2813. /*
  2814. * dp_print_rx_soc_fw_stats_tlv: display htt_rx_soc_fw_stats_tlv
  2815. * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv
  2816. *
  2817. * return:void
  2818. */
  2819. static inline void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf)
  2820. {
  2821. htt_rx_soc_fw_stats_tlv *dp_stats_buf =
  2822. (htt_rx_soc_fw_stats_tlv *)tag_buf;
  2823. DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:");
  2824. DP_PRINT_STATS("fw_reo_ring_data_msdu = %u",
  2825. dp_stats_buf->fw_reo_ring_data_msdu);
  2826. DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u",
  2827. dp_stats_buf->fw_to_host_data_msdu_bcmc);
  2828. DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u",
  2829. dp_stats_buf->fw_to_host_data_msdu_uc);
  2830. DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u",
  2831. dp_stats_buf->ofld_remote_data_buf_recycle_cnt);
  2832. DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u",
  2833. dp_stats_buf->ofld_remote_free_buf_indication_cnt);
  2834. DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ",
  2835. dp_stats_buf->ofld_buf_to_host_data_msdu_uc);
  2836. DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ",
  2837. dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
  2838. DP_PRINT_STATS("wbm_sw_ring_reap = %u ",
  2839. dp_stats_buf->wbm_sw_ring_reap);
  2840. DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ",
  2841. dp_stats_buf->wbm_forward_to_host_cnt);
  2842. DP_PRINT_STATS("wbm_target_recycle_cnt = %u ",
  2843. dp_stats_buf->wbm_target_recycle_cnt);
  2844. DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u",
  2845. dp_stats_buf->target_refill_ring_recycle_cnt);
  2846. }
  2847. /*
  2848. * dp_print_rx_soc_fw_refill_ring_empty_tlv_v: display
  2849. * htt_rx_soc_fw_refill_ring_empty_tlv_v
  2850. * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v
  2851. *
  2852. * return:void
  2853. */
  2854. static inline void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf)
  2855. {
  2856. htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf =
  2857. (htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf;
  2858. uint8_t i;
  2859. uint16_t index = 0;
  2860. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2861. char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2862. if (!refill_ring_empty_cnt) {
  2863. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  2864. FL("Output buffer not allocated"));
  2865. return;
  2866. }
  2867. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING);
  2868. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:");
  2869. for (i = 0; i < tag_len; i++) {
  2870. index += qdf_snprint(&refill_ring_empty_cnt[index],
  2871. DP_MAX_STRING_LEN - index,
  2872. " %u:%u,", i,
  2873. dp_stats_buf->refill_ring_empty_cnt[i]);
  2874. }
  2875. DP_PRINT_STATS("refill_ring_empty_cnt = %s\n",
  2876. refill_ring_empty_cnt);
  2877. qdf_mem_free(refill_ring_empty_cnt);
  2878. }
  2879. /*
  2880. * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v: display
  2881. * htt_rx_soc_fw_refill_ring_num_refill_tlv_v
  2882. * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv
  2883. *
  2884. * return:void
  2885. */
  2886. static inline void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
  2887. uint32_t *tag_buf)
  2888. {
  2889. htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf =
  2890. (htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf;
  2891. uint8_t i;
  2892. uint16_t index = 0;
  2893. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2894. char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2895. if (!refill_ring_num_refill) {
  2896. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  2897. FL("Output buffer not allocated"));
  2898. return;
  2899. }
  2900. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
  2901. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:");
  2902. for (i = 0; i < tag_len; i++) {
  2903. index += qdf_snprint(&refill_ring_num_refill[index],
  2904. DP_MAX_STRING_LEN - index,
  2905. " %u:%u,", i,
  2906. dp_stats_buf->refill_ring_num_refill[i]);
  2907. }
  2908. DP_PRINT_STATS("refill_ring_num_refill = %s\n",
  2909. refill_ring_num_refill);
  2910. qdf_mem_free(refill_ring_num_refill);
  2911. }
  2912. /*
  2913. * dp_print_rx_pdev_fw_stats_tlv: display htt_rx_pdev_fw_stats_tlv
  2914. * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv
  2915. *
  2916. * return:void
  2917. */
  2918. static inline void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf)
  2919. {
  2920. htt_rx_pdev_fw_stats_tlv *dp_stats_buf =
  2921. (htt_rx_pdev_fw_stats_tlv *)tag_buf;
  2922. uint8_t i;
  2923. uint16_t index = 0;
  2924. char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN];
  2925. char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN];
  2926. DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:");
  2927. DP_PRINT_STATS("mac_id__word = %u",
  2928. dp_stats_buf->mac_id__word);
  2929. DP_PRINT_STATS("ppdu_recvd = %u",
  2930. dp_stats_buf->ppdu_recvd);
  2931. DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u",
  2932. dp_stats_buf->mpdu_cnt_fcs_ok);
  2933. DP_PRINT_STATS("mpdu_cnt_fcs_err = %u",
  2934. dp_stats_buf->mpdu_cnt_fcs_err);
  2935. DP_PRINT_STATS("tcp_msdu_cnt = %u",
  2936. dp_stats_buf->tcp_msdu_cnt);
  2937. DP_PRINT_STATS("tcp_ack_msdu_cnt = %u",
  2938. dp_stats_buf->tcp_ack_msdu_cnt);
  2939. DP_PRINT_STATS("udp_msdu_cnt = %u",
  2940. dp_stats_buf->udp_msdu_cnt);
  2941. DP_PRINT_STATS("other_msdu_cnt = %u",
  2942. dp_stats_buf->other_msdu_cnt);
  2943. DP_PRINT_STATS("fw_ring_mpdu_ind = %u",
  2944. dp_stats_buf->fw_ring_mpdu_ind);
  2945. for (i = 0; i < DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
  2946. index += qdf_snprint(&fw_ring_mgmt_subtype[index],
  2947. DP_MAX_STRING_LEN - index,
  2948. " %u:%u,", i,
  2949. dp_stats_buf->fw_ring_mgmt_subtype[i]);
  2950. }
  2951. DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype);
  2952. index = 0;
  2953. for (i = 0; i < DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
  2954. index += qdf_snprint(&fw_ring_ctrl_subtype[index],
  2955. DP_MAX_STRING_LEN - index,
  2956. " %u:%u,", i,
  2957. dp_stats_buf->fw_ring_ctrl_subtype[i]);
  2958. }
  2959. DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype);
  2960. DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u",
  2961. dp_stats_buf->fw_ring_mcast_data_msdu);
  2962. DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u",
  2963. dp_stats_buf->fw_ring_bcast_data_msdu);
  2964. DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u",
  2965. dp_stats_buf->fw_ring_ucast_data_msdu);
  2966. DP_PRINT_STATS("fw_ring_null_data_msdu = %u",
  2967. dp_stats_buf->fw_ring_null_data_msdu);
  2968. DP_PRINT_STATS("fw_ring_mpdu_drop = %u",
  2969. dp_stats_buf->fw_ring_mpdu_drop);
  2970. DP_PRINT_STATS("ofld_local_data_ind_cnt = %u",
  2971. dp_stats_buf->ofld_local_data_ind_cnt);
  2972. DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u",
  2973. dp_stats_buf->ofld_local_data_buf_recycle_cnt);
  2974. DP_PRINT_STATS("drx_local_data_ind_cnt = %u",
  2975. dp_stats_buf->drx_local_data_ind_cnt);
  2976. DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u",
  2977. dp_stats_buf->drx_local_data_buf_recycle_cnt);
  2978. DP_PRINT_STATS("local_nondata_ind_cnt = %u",
  2979. dp_stats_buf->local_nondata_ind_cnt);
  2980. DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u",
  2981. dp_stats_buf->local_nondata_buf_recycle_cnt);
  2982. DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u",
  2983. dp_stats_buf->fw_status_buf_ring_refill_cnt);
  2984. DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u",
  2985. dp_stats_buf->fw_status_buf_ring_empty_cnt);
  2986. DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u",
  2987. dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
  2988. DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u",
  2989. dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
  2990. DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u",
  2991. dp_stats_buf->fw_link_buf_ring_refill_cnt);
  2992. DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u",
  2993. dp_stats_buf->fw_link_buf_ring_empty_cnt);
  2994. DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u",
  2995. dp_stats_buf->host_pkt_buf_ring_refill_cnt);
  2996. DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u",
  2997. dp_stats_buf->host_pkt_buf_ring_empty_cnt);
  2998. DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u",
  2999. dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
  3000. DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u",
  3001. dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
  3002. DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u",
  3003. dp_stats_buf->mon_status_buf_ring_refill_cnt);
  3004. DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u",
  3005. dp_stats_buf->mon_status_buf_ring_empty_cnt);
  3006. DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u",
  3007. dp_stats_buf->mon_desc_buf_ring_refill_cnt);
  3008. DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u",
  3009. dp_stats_buf->mon_desc_buf_ring_empty_cnt);
  3010. DP_PRINT_STATS("mon_dest_ring_update_cnt = %u",
  3011. dp_stats_buf->mon_dest_ring_update_cnt);
  3012. DP_PRINT_STATS("mon_dest_ring_full_cnt = %u",
  3013. dp_stats_buf->mon_dest_ring_full_cnt);
  3014. DP_PRINT_STATS("rx_suspend_cnt = %u",
  3015. dp_stats_buf->rx_suspend_cnt);
  3016. DP_PRINT_STATS("rx_suspend_fail_cnt = %u",
  3017. dp_stats_buf->rx_suspend_fail_cnt);
  3018. DP_PRINT_STATS("rx_resume_cnt = %u",
  3019. dp_stats_buf->rx_resume_cnt);
  3020. DP_PRINT_STATS("rx_resume_fail_cnt = %u",
  3021. dp_stats_buf->rx_resume_fail_cnt);
  3022. DP_PRINT_STATS("rx_ring_switch_cnt = %u",
  3023. dp_stats_buf->rx_ring_switch_cnt);
  3024. DP_PRINT_STATS("rx_ring_restore_cnt = %u",
  3025. dp_stats_buf->rx_ring_restore_cnt);
  3026. DP_PRINT_STATS("rx_flush_cnt = %u\n",
  3027. dp_stats_buf->rx_flush_cnt);
  3028. }
  3029. /*
  3030. * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v: display
  3031. * htt_rx_pdev_fw_ring_mpdu_err_tlv_v
  3032. * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
  3033. *
  3034. * return:void
  3035. */
  3036. static inline void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
  3037. {
  3038. htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
  3039. (htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
  3040. uint8_t i;
  3041. uint16_t index = 0;
  3042. char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3043. if (!fw_ring_mpdu_err) {
  3044. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  3045. FL("Output buffer not allocated"));
  3046. return;
  3047. }
  3048. DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
  3049. for (i = 0; i < DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
  3050. index += qdf_snprint(&fw_ring_mpdu_err[index],
  3051. DP_MAX_STRING_LEN - index,
  3052. " %u:%u,", i,
  3053. dp_stats_buf->fw_ring_mpdu_err[i]);
  3054. }
  3055. DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
  3056. qdf_mem_free(fw_ring_mpdu_err);
  3057. }
  3058. /*
  3059. * dp_print_rx_pdev_fw_mpdu_drop_tlv_v: display htt_rx_pdev_fw_mpdu_drop_tlv_v
  3060. * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
  3061. *
  3062. * return:void
  3063. */
  3064. static inline void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
  3065. {
  3066. htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
  3067. (htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
  3068. uint8_t i;
  3069. uint16_t index = 0;
  3070. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  3071. char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3072. if (!fw_mpdu_drop) {
  3073. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  3074. FL("Output buffer not allocated"));
  3075. return;
  3076. }
  3077. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
  3078. DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
  3079. for (i = 0; i < tag_len; i++) {
  3080. index += qdf_snprint(&fw_mpdu_drop[index],
  3081. DP_MAX_STRING_LEN - index,
  3082. " %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
  3083. }
  3084. DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop);
  3085. qdf_mem_free(fw_mpdu_drop);
  3086. }
  3087. /*
  3088. * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
  3089. * packets
  3090. *
  3091. * tag_buf - Buffer
  3092. * Return - NULL
  3093. */
  3094. static inline void dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
  3095. {
  3096. htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
  3097. (htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
  3098. uint8_t i;
  3099. uint16_t index = 0;
  3100. char rxdma_err_cnt[DP_MAX_STRING_LEN];
  3101. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  3102. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
  3103. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
  3104. for (i = 0; i < tag_len; i++) {
  3105. index += snprintf(&rxdma_err_cnt[index],
  3106. DP_MAX_STRING_LEN - index,
  3107. " %u:%u,", i,
  3108. dp_stats_buf->rxdma_err[i]);
  3109. }
  3110. DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt);
  3111. }
  3112. /*
  3113. * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
  3114. * packets
  3115. *
  3116. * tag_buf - Buffer
  3117. * Return - NULL
  3118. */
  3119. static inline void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
  3120. {
  3121. htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
  3122. (htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
  3123. uint8_t i;
  3124. uint16_t index = 0;
  3125. char reo_err_cnt[DP_MAX_STRING_LEN];
  3126. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  3127. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
  3128. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
  3129. for (i = 0; i < tag_len; i++) {
  3130. index += snprintf(&reo_err_cnt[index],
  3131. DP_MAX_STRING_LEN - index,
  3132. " %u:%u,", i,
  3133. dp_stats_buf->reo_err[i]);
  3134. }
  3135. DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt);
  3136. }
  3137. /*
  3138. * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
  3139. *
  3140. * tag_buf - Buffer
  3141. * Return - NULL
  3142. */
  3143. static inline void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
  3144. {
  3145. htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
  3146. (htt_rx_reo_resource_stats_tlv_v *)tag_buf;
  3147. DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV");
  3148. DP_PRINT_STATS("sample_id: %u ",
  3149. dp_stats_buf->sample_id);
  3150. DP_PRINT_STATS("total_max: %u ",
  3151. dp_stats_buf->total_max);
  3152. DP_PRINT_STATS("total_avg: %u ",
  3153. dp_stats_buf->total_avg);
  3154. DP_PRINT_STATS("total_sample: %u ",
  3155. dp_stats_buf->total_sample);
  3156. DP_PRINT_STATS("non_zeros_avg: %u ",
  3157. dp_stats_buf->non_zeros_avg);
  3158. DP_PRINT_STATS("non_zeros_sample: %u ",
  3159. dp_stats_buf->non_zeros_sample);
  3160. DP_PRINT_STATS("last_non_zeros_max: %u ",
  3161. dp_stats_buf->last_non_zeros_max);
  3162. DP_PRINT_STATS("last_non_zeros_min: %u ",
  3163. dp_stats_buf->last_non_zeros_min);
  3164. DP_PRINT_STATS("last_non_zeros_avg: %u ",
  3165. dp_stats_buf->last_non_zeros_avg);
  3166. DP_PRINT_STATS("last_non_zeros_sample: %u\n ",
  3167. dp_stats_buf->last_non_zeros_sample);
  3168. }
  3169. /*
  3170. * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
  3171. *
  3172. * tag_buf - Buffer
  3173. * Return - NULL
  3174. */
  3175. static inline void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
  3176. {
  3177. htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
  3178. (htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
  3179. uint8_t i = 0;
  3180. uint16_t index = 0;
  3181. char phy_errs[DP_MAX_STRING_LEN];
  3182. DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
  3183. DP_PRINT_STATS("mac_id_word: %u",
  3184. dp_stats_buf->mac_id__word);
  3185. DP_PRINT_STATS("total_phy_err_cnt: %u",
  3186. dp_stats_buf->total_phy_err_cnt);
  3187. for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
  3188. index += snprintf(&phy_errs[index],
  3189. DP_MAX_STRING_LEN - index,
  3190. " %u:%u,", i, dp_stats_buf->phy_err[i]);
  3191. }
  3192. DP_PRINT_STATS("phy_errs: %s\n", phy_errs);
  3193. }
  3194. /*
  3195. * dp_htt_stats_print_tag: function to select the tag type and
  3196. * print the corresponding tag structure
  3197. * @tag_type: tag type that is to be printed
  3198. * @tag_buf: pointer to the tag structure
  3199. *
  3200. * return: void
  3201. */
  3202. void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf)
  3203. {
  3204. switch (tag_type) {
  3205. case HTT_STATS_TX_PDEV_CMN_TAG:
  3206. dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
  3207. break;
  3208. case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
  3209. dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
  3210. break;
  3211. case HTT_STATS_TX_PDEV_SIFS_TAG:
  3212. dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
  3213. break;
  3214. case HTT_STATS_TX_PDEV_FLUSH_TAG:
  3215. dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
  3216. break;
  3217. case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
  3218. dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
  3219. break;
  3220. case HTT_STATS_STRING_TAG:
  3221. dp_print_stats_string_tlv(tag_buf);
  3222. break;
  3223. case HTT_STATS_TX_HWQ_CMN_TAG:
  3224. dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
  3225. break;
  3226. case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
  3227. dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
  3228. break;
  3229. case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
  3230. dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
  3231. break;
  3232. case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
  3233. dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
  3234. break;
  3235. case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
  3236. dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
  3237. break;
  3238. case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
  3239. dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
  3240. break;
  3241. case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
  3242. dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
  3243. break;
  3244. case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
  3245. dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
  3246. break;
  3247. case HTT_STATS_TX_TQM_CMN_TAG:
  3248. dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
  3249. break;
  3250. case HTT_STATS_TX_TQM_PDEV_TAG:
  3251. dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
  3252. break;
  3253. case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
  3254. dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
  3255. break;
  3256. case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
  3257. dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
  3258. break;
  3259. case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
  3260. dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
  3261. break;
  3262. case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
  3263. dp_print_tx_de_classify_stats_tlv(tag_buf);
  3264. break;
  3265. case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
  3266. dp_print_tx_de_classify_status_stats_tlv(tag_buf);
  3267. break;
  3268. case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
  3269. dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
  3270. break;
  3271. case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
  3272. dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
  3273. break;
  3274. case HTT_STATS_TX_DE_CMN_TAG:
  3275. dp_print_tx_de_cmn_stats_tlv(tag_buf);
  3276. break;
  3277. case HTT_STATS_RING_IF_TAG:
  3278. dp_print_ring_if_stats_tlv(tag_buf);
  3279. break;
  3280. case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
  3281. dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
  3282. break;
  3283. case HTT_STATS_SFM_CMN_TAG:
  3284. dp_print_sfm_cmn_tlv(tag_buf);
  3285. break;
  3286. case HTT_STATS_SRING_STATS_TAG:
  3287. dp_print_sring_stats_tlv(tag_buf);
  3288. break;
  3289. case HTT_STATS_RX_PDEV_FW_STATS_TAG:
  3290. dp_print_rx_pdev_fw_stats_tlv(tag_buf);
  3291. break;
  3292. case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
  3293. dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
  3294. break;
  3295. case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
  3296. dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
  3297. break;
  3298. case HTT_STATS_RX_SOC_FW_STATS_TAG:
  3299. dp_print_rx_soc_fw_stats_tlv(tag_buf);
  3300. break;
  3301. case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
  3302. dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
  3303. break;
  3304. case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
  3305. dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
  3306. tag_buf);
  3307. break;
  3308. case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
  3309. dp_print_tx_pdev_rate_stats_tlv(tag_buf);
  3310. break;
  3311. case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
  3312. dp_print_rx_pdev_rate_stats_tlv(tag_buf);
  3313. break;
  3314. case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
  3315. dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
  3316. break;
  3317. case HTT_STATS_TX_SCHED_CMN_TAG:
  3318. dp_print_stats_tx_sched_cmn_tlv(tag_buf);
  3319. break;
  3320. case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
  3321. dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
  3322. break;
  3323. case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
  3324. dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
  3325. break;
  3326. case HTT_STATS_RING_IF_CMN_TAG:
  3327. dp_print_ring_if_cmn_tlv(tag_buf);
  3328. break;
  3329. case HTT_STATS_SFM_CLIENT_USER_TAG:
  3330. dp_print_sfm_client_user_tlv_v(tag_buf);
  3331. break;
  3332. case HTT_STATS_SFM_CLIENT_TAG:
  3333. dp_print_sfm_client_tlv(tag_buf);
  3334. break;
  3335. case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
  3336. dp_print_tx_tqm_error_stats_tlv(tag_buf);
  3337. break;
  3338. case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
  3339. dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
  3340. break;
  3341. case HTT_STATS_SRING_CMN_TAG:
  3342. dp_print_sring_cmn_tlv(tag_buf);
  3343. break;
  3344. case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
  3345. dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
  3346. break;
  3347. case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
  3348. dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
  3349. break;
  3350. case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
  3351. dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
  3352. break;
  3353. case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
  3354. dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
  3355. break;
  3356. case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
  3357. dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
  3358. break;
  3359. case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
  3360. dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
  3361. break;
  3362. case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
  3363. dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
  3364. break;
  3365. case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
  3366. dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
  3367. break;
  3368. case HTT_STATS_HW_INTR_MISC_TAG:
  3369. dp_print_hw_stats_intr_misc_tlv(tag_buf);
  3370. break;
  3371. case HTT_STATS_HW_WD_TIMEOUT_TAG:
  3372. dp_print_hw_stats_wd_timeout_tlv(tag_buf);
  3373. break;
  3374. case HTT_STATS_HW_PDEV_ERRS_TAG:
  3375. dp_print_hw_stats_pdev_errs_tlv(tag_buf);
  3376. break;
  3377. case HTT_STATS_COUNTER_NAME_TAG:
  3378. dp_print_counter_tlv(tag_buf);
  3379. break;
  3380. case HTT_STATS_TX_TID_DETAILS_TAG:
  3381. dp_print_tx_tid_stats_tlv(tag_buf);
  3382. break;
  3383. #ifdef CONFIG_WIN
  3384. case HTT_STATS_TX_TID_DETAILS_V1_TAG:
  3385. dp_print_tx_tid_stats_v1_tlv(tag_buf);
  3386. break;
  3387. #endif
  3388. case HTT_STATS_RX_TID_DETAILS_TAG:
  3389. dp_print_rx_tid_stats_tlv(tag_buf);
  3390. break;
  3391. case HTT_STATS_PEER_STATS_CMN_TAG:
  3392. dp_print_peer_stats_cmn_tlv(tag_buf);
  3393. break;
  3394. case HTT_STATS_PEER_DETAILS_TAG:
  3395. dp_print_peer_details_tlv(tag_buf);
  3396. break;
  3397. case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
  3398. dp_print_msdu_flow_stats_tlv(tag_buf);
  3399. break;
  3400. case HTT_STATS_PEER_TX_RATE_STATS_TAG:
  3401. dp_print_tx_peer_rate_stats_tlv(tag_buf);
  3402. break;
  3403. case HTT_STATS_PEER_RX_RATE_STATS_TAG:
  3404. dp_print_rx_peer_rate_stats_tlv(tag_buf);
  3405. break;
  3406. case HTT_STATS_TX_DE_COMPL_STATS_TAG:
  3407. dp_print_tx_de_compl_stats_tlv(tag_buf);
  3408. break;
  3409. case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
  3410. dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf);
  3411. break;
  3412. case HTT_STATS_RX_REFILL_REO_ERR_TAG:
  3413. dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf);
  3414. break;
  3415. case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
  3416. dp_print_rx_reo_debug_stats_tlv(tag_buf);
  3417. break;
  3418. case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
  3419. dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf);
  3420. break;
  3421. default:
  3422. break;
  3423. }
  3424. }
  3425. /*
  3426. * dp_htt_stats_copy_tag: function to select the tag type and
  3427. * copy the corresponding tag structure
  3428. * @pdev: DP_PDEV handle
  3429. * @tag_type: tag type that is to be printed
  3430. * @tag_buf: pointer to the tag structure
  3431. *
  3432. * return: void
  3433. */
  3434. void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
  3435. {
  3436. void *dest_ptr = NULL;
  3437. uint32_t size = 0;
  3438. switch (tag_type) {
  3439. case HTT_STATS_TX_PDEV_CMN_TAG:
  3440. dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
  3441. size = sizeof(htt_tx_pdev_stats_cmn_tlv);
  3442. break;
  3443. case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
  3444. dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
  3445. size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
  3446. break;
  3447. case HTT_STATS_TX_PDEV_SIFS_TAG:
  3448. dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
  3449. size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
  3450. break;
  3451. case HTT_STATS_TX_PDEV_FLUSH_TAG:
  3452. dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
  3453. size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
  3454. break;
  3455. case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
  3456. dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
  3457. size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
  3458. break;
  3459. case HTT_STATS_RX_PDEV_FW_STATS_TAG:
  3460. dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
  3461. size = sizeof(htt_rx_pdev_fw_stats_tlv);
  3462. break;
  3463. case HTT_STATS_RX_SOC_FW_STATS_TAG:
  3464. dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
  3465. size = sizeof(htt_rx_soc_fw_stats_tlv);
  3466. break;
  3467. case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
  3468. dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
  3469. size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
  3470. break;
  3471. case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
  3472. dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
  3473. size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
  3474. break;
  3475. case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
  3476. dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
  3477. size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
  3478. break;
  3479. case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
  3480. dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
  3481. size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
  3482. break;
  3483. default:
  3484. break;
  3485. }
  3486. if (dest_ptr)
  3487. qdf_mem_copy(dest_ptr, tag_buf, size);
  3488. }
  3489. #if defined(CONFIG_WIN) && WDI_EVENT_ENABLE
  3490. QDF_STATUS dp_peer_stats_notify(struct dp_peer *peer)
  3491. {
  3492. struct dp_pdev *dp_pdev;
  3493. struct cdp_interface_peer_stats peer_stats_intf;
  3494. struct cdp_peer_stats *peer_stats = &peer->stats;
  3495. if (!peer->vdev)
  3496. return QDF_STATUS_E_FAULT;
  3497. dp_pdev = peer->vdev->pdev;
  3498. qdf_mem_zero(&peer_stats_intf, sizeof(peer_stats_intf));
  3499. if (peer_stats->rx.last_rssi != peer_stats->rx.rssi)
  3500. peer_stats_intf.rssi_changed = true;
  3501. if ((peer_stats->rx.rssi && peer_stats_intf.rssi_changed) ||
  3502. (peer_stats->tx.tx_rate &&
  3503. peer_stats->tx.tx_rate != peer_stats->tx.last_tx_rate)) {
  3504. peer_stats_intf.peer_hdl = peer->ctrl_peer;
  3505. peer_stats_intf.last_peer_tx_rate = peer_stats->tx.last_tx_rate;
  3506. peer_stats_intf.peer_tx_rate = peer_stats->tx.tx_rate;
  3507. peer_stats_intf.peer_rssi = peer_stats->rx.rssi;
  3508. peer_stats_intf.tx_packet_count = peer_stats->tx.ucast.num;
  3509. peer_stats_intf.rx_packet_count = peer_stats->rx.to_stack.num;
  3510. peer_stats_intf.tx_byte_count = peer_stats->tx.tx_success.bytes;
  3511. peer_stats_intf.rx_byte_count = peer_stats->rx.to_stack.bytes;
  3512. peer_stats_intf.per = peer_stats->tx.last_per;
  3513. peer_stats_intf.ack_rssi = peer_stats->tx.last_ack_rssi;
  3514. dp_wdi_event_handler(WDI_EVENT_PEER_STATS, dp_pdev->soc,
  3515. (void *)&peer_stats_intf, 0,
  3516. WDI_NO_VAL, dp_pdev->pdev_id);
  3517. }
  3518. return QDF_STATUS_SUCCESS;
  3519. }
  3520. #endif
  3521. #ifdef CONFIG_WIN
  3522. /**
  3523. * dp_vow_str_fw_to_hw_delay() - Return string for a delay
  3524. * @index: Index of delay
  3525. *
  3526. * Return: char const pointer
  3527. */
  3528. static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
  3529. {
  3530. if (index > CDP_DELAY_BUCKET_MAX) {
  3531. return "Invalid index";
  3532. }
  3533. return fw_to_hw_delay_bucket[index];
  3534. }
  3535. /**
  3536. * dp_vow_str_sw_enq_delay() - Return string for a delay
  3537. * @index: Index of delay
  3538. *
  3539. * Return: char const pointer
  3540. */
  3541. static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
  3542. {
  3543. if (index > CDP_DELAY_BUCKET_MAX) {
  3544. return "Invalid index";
  3545. }
  3546. return sw_enq_delay_bucket[index];
  3547. }
  3548. /**
  3549. * dp_vow_str_intfrm_delay() - Return string for a delay
  3550. * @index: Index of delay
  3551. *
  3552. * Return: char const pointer
  3553. */
  3554. static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
  3555. {
  3556. if (index > CDP_DELAY_BUCKET_MAX) {
  3557. return "Invalid index";
  3558. }
  3559. return intfrm_delay_bucket[index];
  3560. }
  3561. void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
  3562. {
  3563. struct cdp_tid_stats *tid_stats;
  3564. struct cdp_tid_tx_stats *txstats;
  3565. struct cdp_tid_rx_stats *rxstats;
  3566. struct dp_soc *soc = pdev->soc;
  3567. uint8_t tid;
  3568. if (!soc)
  3569. return;
  3570. tid = 0;
  3571. rxstats = NULL;
  3572. txstats = NULL;
  3573. tid_stats = &pdev->stats.tid_stats;
  3574. DP_PRINT_STATS("Packets received in hardstart: %llu ",
  3575. tid_stats->ingress_stack);
  3576. DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
  3577. tid_stats->osif_drop);
  3578. DP_PRINT_STATS("Per TID Video Stats:\n");
  3579. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  3580. txstats = &tid_stats->tid_tx_stats[tid];
  3581. rxstats = &tid_stats->tid_rx_stats[tid];
  3582. DP_PRINT_STATS("----TID: %d----", tid);
  3583. DP_PRINT_STATS("Tx Success Count: %llu", txstats->success_cnt);
  3584. DP_PRINT_STATS("Tx Complete Count: %llu",
  3585. txstats->complete_cnt);
  3586. DP_PRINT_STATS("Tx Firmware Drop Count: %llu",
  3587. txstats->comp_fail_cnt);
  3588. DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
  3589. txstats->swdrop_cnt[TX_HW_ENQUEUE]);
  3590. DP_PRINT_STATS("Tx Software Drop Count: %llu",
  3591. txstats->swdrop_cnt[TX_SW_ENQUEUE]);
  3592. DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
  3593. txstats->swdrop_cnt[TX_DESC_ERR]);
  3594. DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
  3595. txstats->swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
  3596. DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
  3597. txstats->swdrop_cnt[TX_DMA_MAP_ERR]);
  3598. DP_PRINT_STATS("Rx Delievered Count: %llu",
  3599. rxstats->delivered_to_stack);
  3600. DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
  3601. rxstats->fail_cnt[ENQUEUE_DROP]);
  3602. DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
  3603. rxstats->fail_cnt[INTRABSS_DROP]);
  3604. DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
  3605. rxstats->fail_cnt[MSDU_DONE_FAILURE]);
  3606. DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
  3607. rxstats->fail_cnt[INVALID_PEER_VDEV]);
  3608. DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
  3609. rxstats->fail_cnt[POLICY_CHECK_DROP]);
  3610. DP_PRINT_STATS("Rx Mec Drop Count: %llu",
  3611. rxstats->fail_cnt[MEC_DROP]);
  3612. DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
  3613. rxstats->fail_cnt[NAWDS_MCAST_DROP]);
  3614. DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
  3615. rxstats->fail_cnt[MESH_FILTER_DROP]);
  3616. DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
  3617. rxstats->intrabss_cnt);
  3618. DP_PRINT_STATS("Rx MSDU Count: %llu", rxstats->msdu_cnt);
  3619. DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
  3620. rxstats->mcast_msdu_cnt);
  3621. DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
  3622. rxstats->bcast_msdu_cnt);
  3623. }
  3624. }
  3625. void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
  3626. {
  3627. struct dp_soc *soc = pdev->soc;
  3628. struct cdp_tid_tx_stats *txstats = NULL;
  3629. struct cdp_tid_rx_stats *rxstats;
  3630. uint8_t tid, index;
  3631. uint64_t count = 0;
  3632. if (!soc)
  3633. return;
  3634. tid = 0;
  3635. index = 0;
  3636. rxstats = NULL;
  3637. DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
  3638. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  3639. DP_PRINT_STATS("----TID: %d----", tid);
  3640. txstats = &pdev->stats.tid_stats.tid_tx_stats[tid];
  3641. rxstats = &pdev->stats.tid_stats.tid_rx_stats[tid];
  3642. DP_PRINT_STATS("Software Enqueue Delay:");
  3643. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  3644. count = txstats->swq_delay.delay_bucket[index];
  3645. if (count) {
  3646. DP_PRINT_STATS("%s: Packets = %llu",
  3647. dp_vow_str_sw_enq_delay(index),
  3648. count);
  3649. }
  3650. }
  3651. DP_PRINT_STATS("Min = %u", txstats->swq_delay.min_delay);
  3652. DP_PRINT_STATS("Max = %u", txstats->swq_delay.max_delay);
  3653. DP_PRINT_STATS("Avg = %u\n", txstats->swq_delay.avg_delay);
  3654. DP_PRINT_STATS("Hardware Transmission Delay:");
  3655. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  3656. count = txstats->hwtx_delay.delay_bucket[index];
  3657. if (count) {
  3658. DP_PRINT_STATS("%s: Packets = %llu",
  3659. dp_vow_str_fw_to_hw_delay(index),
  3660. count);
  3661. }
  3662. }
  3663. DP_PRINT_STATS("Min = %u", txstats->hwtx_delay.min_delay);
  3664. DP_PRINT_STATS("Max = %u", txstats->hwtx_delay.max_delay);
  3665. DP_PRINT_STATS("Avg = %u\n", txstats->hwtx_delay.avg_delay);
  3666. DP_PRINT_STATS("Tx Interframe Delay:");
  3667. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  3668. count = txstats->intfrm_delay.delay_bucket[index];
  3669. if (count) {
  3670. DP_PRINT_STATS("%s: Packets = %llu",
  3671. dp_vow_str_intfrm_delay(index),
  3672. count);
  3673. }
  3674. }
  3675. DP_PRINT_STATS("Min = %u", txstats->intfrm_delay.min_delay);
  3676. DP_PRINT_STATS("Max = %u", txstats->intfrm_delay.max_delay);
  3677. DP_PRINT_STATS("Avg = %u\n", txstats->intfrm_delay.avg_delay);
  3678. DP_PRINT_STATS("Rx Interframe Delay:");
  3679. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  3680. count = rxstats->intfrm_delay.delay_bucket[index];
  3681. if (count) {
  3682. DP_PRINT_STATS("%s: Packets = %llu",
  3683. dp_vow_str_intfrm_delay(index),
  3684. count);
  3685. }
  3686. }
  3687. DP_PRINT_STATS("Min = %u", rxstats->intfrm_delay.min_delay);
  3688. DP_PRINT_STATS("Max = %u", rxstats->intfrm_delay.max_delay);
  3689. DP_PRINT_STATS("Avg = %u\n", rxstats->intfrm_delay.avg_delay);
  3690. DP_PRINT_STATS("Rx Reap to Stack Delay:");
  3691. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  3692. count = rxstats->to_stack_delay.delay_bucket[index];
  3693. if (count) {
  3694. DP_PRINT_STATS("%s: Packets = %llu",
  3695. dp_vow_str_intfrm_delay(index),
  3696. count);
  3697. }
  3698. }
  3699. DP_PRINT_STATS("Min = %u", rxstats->to_stack_delay.min_delay);
  3700. DP_PRINT_STATS("Max = %u", rxstats->to_stack_delay.max_delay);
  3701. DP_PRINT_STATS("Avg = %u\n", rxstats->to_stack_delay.avg_delay);
  3702. }
  3703. }
  3704. #endif
  3705. void dp_print_soc_cfg_params(struct dp_soc *soc)
  3706. {
  3707. struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
  3708. uint8_t index = 0, i = 0;
  3709. char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH];
  3710. int num_of_int_contexts;
  3711. if (!soc) {
  3712. dp_err("Context is null");
  3713. return;
  3714. }
  3715. soc_cfg_ctx = soc->wlan_cfg_ctx;
  3716. if (!soc_cfg_ctx) {
  3717. dp_err("Context is null");
  3718. return;
  3719. }
  3720. num_of_int_contexts =
  3721. wlan_cfg_get_num_contexts(soc_cfg_ctx);
  3722. DP_PRINT_STATS("No. of interrupt contexts: %u",
  3723. soc_cfg_ctx->num_int_ctxts);
  3724. DP_PRINT_STATS("Max clients: %u",
  3725. soc_cfg_ctx->max_clients);
  3726. DP_PRINT_STATS("Max alloc size: %u ",
  3727. soc_cfg_ctx->max_alloc_size);
  3728. DP_PRINT_STATS("Per pdev tx ring: %u ",
  3729. soc_cfg_ctx->per_pdev_tx_ring);
  3730. DP_PRINT_STATS("Num tcl data rings: %u ",
  3731. soc_cfg_ctx->num_tcl_data_rings);
  3732. DP_PRINT_STATS("Per pdev rx ring: %u ",
  3733. soc_cfg_ctx->per_pdev_rx_ring);
  3734. DP_PRINT_STATS("Per pdev lmac ring: %u ",
  3735. soc_cfg_ctx->per_pdev_lmac_ring);
  3736. DP_PRINT_STATS("Num of reo dest rings: %u ",
  3737. soc_cfg_ctx->num_reo_dest_rings);
  3738. DP_PRINT_STATS("Num tx desc pool: %u ",
  3739. soc_cfg_ctx->num_tx_desc_pool);
  3740. DP_PRINT_STATS("Num tx ext desc pool: %u ",
  3741. soc_cfg_ctx->num_tx_ext_desc_pool);
  3742. DP_PRINT_STATS("Num tx desc: %u ",
  3743. soc_cfg_ctx->num_tx_desc);
  3744. DP_PRINT_STATS("Num tx ext desc: %u ",
  3745. soc_cfg_ctx->num_tx_ext_desc);
  3746. DP_PRINT_STATS("Htt packet type: %u ",
  3747. soc_cfg_ctx->htt_packet_type);
  3748. DP_PRINT_STATS("Max peer_ids: %u ",
  3749. soc_cfg_ctx->max_peer_id);
  3750. DP_PRINT_STATS("Tx ring size: %u ",
  3751. soc_cfg_ctx->tx_ring_size);
  3752. DP_PRINT_STATS("Tx comp ring size: %u ",
  3753. soc_cfg_ctx->tx_comp_ring_size);
  3754. DP_PRINT_STATS("Tx comp ring size nss: %u ",
  3755. soc_cfg_ctx->tx_comp_ring_size_nss);
  3756. DP_PRINT_STATS("Int batch threshold tx: %u ",
  3757. soc_cfg_ctx->int_batch_threshold_tx);
  3758. DP_PRINT_STATS("Int timer threshold tx: %u ",
  3759. soc_cfg_ctx->int_timer_threshold_tx);
  3760. DP_PRINT_STATS("Int batch threshold rx: %u ",
  3761. soc_cfg_ctx->int_batch_threshold_rx);
  3762. DP_PRINT_STATS("Int timer threshold rx: %u ",
  3763. soc_cfg_ctx->int_timer_threshold_rx);
  3764. DP_PRINT_STATS("Int batch threshold other: %u ",
  3765. soc_cfg_ctx->int_batch_threshold_other);
  3766. DP_PRINT_STATS("Int timer threshold other: %u ",
  3767. soc_cfg_ctx->int_timer_threshold_other);
  3768. for (i = 0; i < num_of_int_contexts; i++) {
  3769. index += qdf_snprint(&ring_mask[index],
  3770. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3771. " %d",
  3772. soc_cfg_ctx->int_tx_ring_mask[i]);
  3773. }
  3774. DP_PRINT_STATS("Tx ring mask (0-%d):%s",
  3775. num_of_int_contexts, ring_mask);
  3776. index = 0;
  3777. for (i = 0; i < num_of_int_contexts; i++) {
  3778. index += qdf_snprint(&ring_mask[index],
  3779. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3780. " %d",
  3781. soc_cfg_ctx->int_rx_ring_mask[i]);
  3782. }
  3783. DP_PRINT_STATS("Rx ring mask (0-%d):%s",
  3784. num_of_int_contexts, ring_mask);
  3785. index = 0;
  3786. for (i = 0; i < num_of_int_contexts; i++) {
  3787. index += qdf_snprint(&ring_mask[index],
  3788. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3789. " %d",
  3790. soc_cfg_ctx->int_rx_mon_ring_mask[i]);
  3791. }
  3792. DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
  3793. num_of_int_contexts, ring_mask);
  3794. index = 0;
  3795. for (i = 0; i < num_of_int_contexts; i++) {
  3796. index += qdf_snprint(&ring_mask[index],
  3797. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3798. " %d",
  3799. soc_cfg_ctx->int_rx_err_ring_mask[i]);
  3800. }
  3801. DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
  3802. num_of_int_contexts, ring_mask);
  3803. index = 0;
  3804. for (i = 0; i < num_of_int_contexts; i++) {
  3805. index += qdf_snprint(&ring_mask[index],
  3806. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3807. " %d",
  3808. soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
  3809. }
  3810. DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
  3811. num_of_int_contexts, ring_mask);
  3812. index = 0;
  3813. for (i = 0; i < num_of_int_contexts; i++) {
  3814. index += qdf_snprint(&ring_mask[index],
  3815. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3816. " %d",
  3817. soc_cfg_ctx->int_reo_status_ring_mask[i]);
  3818. }
  3819. DP_PRINT_STATS("Reo ring mask (0-%d):%s",
  3820. num_of_int_contexts, ring_mask);
  3821. index = 0;
  3822. for (i = 0; i < num_of_int_contexts; i++) {
  3823. index += qdf_snprint(&ring_mask[index],
  3824. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3825. " %d",
  3826. soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
  3827. }
  3828. DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
  3829. num_of_int_contexts, ring_mask);
  3830. index = 0;
  3831. for (i = 0; i < num_of_int_contexts; i++) {
  3832. index += qdf_snprint(&ring_mask[index],
  3833. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  3834. " %d",
  3835. soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
  3836. }
  3837. DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
  3838. num_of_int_contexts, ring_mask);
  3839. DP_PRINT_STATS("Rx hash: %u ",
  3840. soc_cfg_ctx->rx_hash);
  3841. DP_PRINT_STATS("Tso enabled: %u ",
  3842. soc_cfg_ctx->tso_enabled);
  3843. DP_PRINT_STATS("Lro enabled: %u ",
  3844. soc_cfg_ctx->lro_enabled);
  3845. DP_PRINT_STATS("Sg enabled: %u ",
  3846. soc_cfg_ctx->sg_enabled);
  3847. DP_PRINT_STATS("Gro enabled: %u ",
  3848. soc_cfg_ctx->gro_enabled);
  3849. DP_PRINT_STATS("rawmode enabled: %u ",
  3850. soc_cfg_ctx->rawmode_enabled);
  3851. DP_PRINT_STATS("peer flow ctrl enabled: %u ",
  3852. soc_cfg_ctx->peer_flow_ctrl_enabled);
  3853. DP_PRINT_STATS("napi enabled: %u ",
  3854. soc_cfg_ctx->napi_enabled);
  3855. DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
  3856. soc_cfg_ctx->tcp_udp_checksumoffload);
  3857. DP_PRINT_STATS("Defrag timeout check: %u ",
  3858. soc_cfg_ctx->defrag_timeout_check);
  3859. DP_PRINT_STATS("Rx defrag min timeout: %u ",
  3860. soc_cfg_ctx->rx_defrag_min_timeout);
  3861. DP_PRINT_STATS("WBM release ring: %u ",
  3862. soc_cfg_ctx->wbm_release_ring);
  3863. DP_PRINT_STATS("TCL CMD ring: %u ",
  3864. soc_cfg_ctx->tcl_cmd_ring);
  3865. DP_PRINT_STATS("TCL Status ring: %u ",
  3866. soc_cfg_ctx->tcl_status_ring);
  3867. DP_PRINT_STATS("REO Reinject ring: %u ",
  3868. soc_cfg_ctx->reo_reinject_ring);
  3869. DP_PRINT_STATS("RX release ring: %u ",
  3870. soc_cfg_ctx->rx_release_ring);
  3871. DP_PRINT_STATS("REO Exception ring: %u ",
  3872. soc_cfg_ctx->reo_exception_ring);
  3873. DP_PRINT_STATS("REO CMD ring: %u ",
  3874. soc_cfg_ctx->reo_cmd_ring);
  3875. DP_PRINT_STATS("REO STATUS ring: %u ",
  3876. soc_cfg_ctx->reo_status_ring);
  3877. DP_PRINT_STATS("RXDMA refill ring: %u ",
  3878. soc_cfg_ctx->rxdma_refill_ring);
  3879. DP_PRINT_STATS("RXDMA err dst ring: %u ",
  3880. soc_cfg_ctx->rxdma_err_dst_ring);
  3881. }
  3882. void
  3883. dp_print_pdev_cfg_params(struct dp_pdev *pdev)
  3884. {
  3885. struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
  3886. if (!pdev) {
  3887. dp_err("Context is null");
  3888. return;
  3889. }
  3890. pdev_cfg_ctx = pdev->wlan_cfg_ctx;
  3891. if (!pdev_cfg_ctx) {
  3892. dp_err("Context is null");
  3893. return;
  3894. }
  3895. DP_PRINT_STATS("Rx dma buf ring size: %d ",
  3896. pdev_cfg_ctx->rx_dma_buf_ring_size);
  3897. DP_PRINT_STATS("DMA Mon buf ring size: %d ",
  3898. pdev_cfg_ctx->dma_mon_buf_ring_size);
  3899. DP_PRINT_STATS("DMA Mon dest ring size: %d ",
  3900. pdev_cfg_ctx->dma_mon_dest_ring_size);
  3901. DP_PRINT_STATS("DMA Mon status ring size: %d ",
  3902. pdev_cfg_ctx->dma_mon_status_ring_size);
  3903. DP_PRINT_STATS("Rxdma monitor desc ring: %d",
  3904. pdev_cfg_ctx->rxdma_monitor_desc_ring);
  3905. DP_PRINT_STATS("Num mac rings: %d ",
  3906. pdev_cfg_ctx->num_mac_rings);
  3907. }
  3908. /**
  3909. * dp_print_ring_stat_from_hal(): Print hal level ring stats
  3910. * @soc: DP_SOC handle
  3911. * @srng: DP_SRNG handle
  3912. * @ring_name: SRNG name
  3913. * @ring_type: srng src/dst ring
  3914. *
  3915. * Return: void
  3916. */
  3917. static void
  3918. dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng,
  3919. enum hal_ring_type ring_type)
  3920. {
  3921. uint32_t tailp;
  3922. uint32_t headp;
  3923. int32_t hw_headp = -1;
  3924. int32_t hw_tailp = -1;
  3925. const char *ring_name;
  3926. struct hal_soc *hal_soc;
  3927. if (soc && srng && srng->hal_srng) {
  3928. hal_soc = (struct hal_soc *)soc->hal_soc;
  3929. ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
  3930. hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
  3931. DP_PRINT_STATS("%s:SW:Head pointer = %d Tail Pointer = %d\n",
  3932. ring_name, headp, tailp);
  3933. hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
  3934. &hw_tailp, ring_type);
  3935. DP_PRINT_STATS("%s:HW:Head pointer = %d Tail Pointer = %d\n",
  3936. ring_name, hw_headp, hw_tailp);
  3937. }
  3938. }
  3939. /**
  3940. * dp_print_mon_ring_stats_from_hal() - Print stat for monitor rings based
  3941. * on target
  3942. * @pdev: physical device handle
  3943. * @mac_id: mac id
  3944. *
  3945. * Return: void
  3946. */
  3947. static inline
  3948. void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
  3949. {
  3950. if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
  3951. dp_print_ring_stat_from_hal(pdev->soc,
  3952. &pdev->rxdma_mon_buf_ring[mac_id],
  3953. RXDMA_MONITOR_BUF);
  3954. dp_print_ring_stat_from_hal(pdev->soc,
  3955. &pdev->rxdma_mon_dst_ring[mac_id],
  3956. RXDMA_MONITOR_DST);
  3957. dp_print_ring_stat_from_hal(pdev->soc,
  3958. &pdev->rxdma_mon_desc_ring[mac_id],
  3959. RXDMA_MONITOR_DESC);
  3960. }
  3961. dp_print_ring_stat_from_hal(pdev->soc,
  3962. &pdev->rxdma_mon_status_ring[mac_id],
  3963. RXDMA_MONITOR_STATUS);
  3964. }
  3965. void
  3966. dp_print_ring_stats(struct dp_pdev *pdev)
  3967. {
  3968. uint32_t i;
  3969. int mac_id;
  3970. dp_print_ring_stat_from_hal(pdev->soc,
  3971. &pdev->soc->reo_exception_ring,
  3972. REO_EXCEPTION);
  3973. dp_print_ring_stat_from_hal(pdev->soc,
  3974. &pdev->soc->reo_reinject_ring,
  3975. REO_REINJECT);
  3976. dp_print_ring_stat_from_hal(pdev->soc,
  3977. &pdev->soc->reo_cmd_ring,
  3978. REO_CMD);
  3979. dp_print_ring_stat_from_hal(pdev->soc,
  3980. &pdev->soc->reo_status_ring,
  3981. REO_STATUS);
  3982. dp_print_ring_stat_from_hal(pdev->soc,
  3983. &pdev->soc->rx_rel_ring,
  3984. WBM2SW_RELEASE);
  3985. dp_print_ring_stat_from_hal(pdev->soc,
  3986. &pdev->soc->tcl_cmd_ring,
  3987. TCL_CMD);
  3988. dp_print_ring_stat_from_hal(pdev->soc,
  3989. &pdev->soc->tcl_status_ring,
  3990. TCL_STATUS);
  3991. dp_print_ring_stat_from_hal(pdev->soc,
  3992. &pdev->soc->wbm_desc_rel_ring,
  3993. SW2WBM_RELEASE);
  3994. for (i = 0; i < MAX_REO_DEST_RINGS; i++)
  3995. dp_print_ring_stat_from_hal(pdev->soc,
  3996. &pdev->soc->reo_dest_ring[i],
  3997. REO_DST);
  3998. for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
  3999. dp_print_ring_stat_from_hal(pdev->soc,
  4000. &pdev->soc->tcl_data_ring[i],
  4001. TCL_DATA);
  4002. for (i = 0; i < MAX_TCL_DATA_RINGS; i++)
  4003. dp_print_ring_stat_from_hal(pdev->soc,
  4004. &pdev->soc->tx_comp_ring[i],
  4005. WBM2SW_RELEASE);
  4006. dp_print_ring_stat_from_hal(pdev->soc,
  4007. &pdev->rx_refill_buf_ring,
  4008. RXDMA_BUF);
  4009. dp_print_ring_stat_from_hal(pdev->soc,
  4010. &pdev->rx_refill_buf_ring2,
  4011. RXDMA_BUF);
  4012. for (i = 0; i < MAX_RX_MAC_RINGS; i++)
  4013. dp_print_ring_stat_from_hal(pdev->soc,
  4014. &pdev->rx_mac_buf_ring[i],
  4015. RXDMA_BUF);
  4016. for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++)
  4017. dp_print_mon_ring_stat_from_hal(pdev, mac_id);
  4018. for (i = 0; i < NUM_RXDMA_RINGS_PER_PDEV; i++)
  4019. dp_print_ring_stat_from_hal(pdev->soc,
  4020. &pdev->rxdma_err_dst_ring[i],
  4021. RXDMA_DST);
  4022. }