dp_stats.c 310 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587758875897590759175927593759475957596759775987599760076017602760376047605760676077608760976107611761276137614761576167617761876197620762176227623762476257626762776287629763076317632763376347635763676377638763976407641764276437644764576467647764876497650765176527653765476557656765776587659766076617662766376647665766676677668766976707671767276737674767576767677767876797680768176827683768476857686768776887689769076917692769376947695769676977698769977007701770277037704770577067707770877097710771177127713771477157716771777187719772077217722772377247725772677277728772977307731773277337734773577367737773877397740774177427743774477457746774777487749775077517752775377547755775677577758775977607761776277637764776577667767776877697770777177727773777477757776777777787779778077817782778377847785778677877788778977907791779277937794779577967797779877997800780178027803780478057806780778087809781078117812781378147815781678177818781978207821782278237824782578267827782878297830783178327833783478357836783778387839784078417842784378447845784678477848784978507851785278537854785578567857785878597860786178627863786478657866786778687869787078717872787378747875787678777878787978807881788278837884788578867887788878897890789178927893789478957896789778987899790079017902790379047905790679077908790979107911791279137914791579167917791879197920792179227923792479257926792779287929793079317932793379347935793679377938793979407941794279437944794579467947794879497950795179527953795479557956795779587959796079617962796379647965796679677968796979707971797279737974797579767977797879797980798179827983798479857986798779887989799079917992799379947995799679977998799980008001800280038004800580068007800880098010801180128013801480158016801780188019802080218022802380248025802680278028802980308031803280338034803580368037803880398040804180428043804480458046804780488049805080518052805380548055805680578058805980608061806280638064806580668067806880698070807180728073807480758076807780788079808080818082808380848085808680878088808980908091809280938094809580968097809880998100810181028103810481058106810781088109811081118112811381148115811681178118811981208121812281238124812581268127812881298130813181328133813481358136813781388139814081418142814381448145814681478148814981508151815281538154815581568157815881598160816181628163816481658166816781688169817081718172817381748175817681778178817981808181818281838184818581868187818881898190819181928193819481958196819781988199820082018202820382048205820682078208820982108211821282138214821582168217821882198220822182228223822482258226822782288229823082318232823382348235823682378238823982408241824282438244824582468247824882498250825182528253825482558256825782588259826082618262826382648265826682678268826982708271827282738274827582768277827882798280828182828283828482858286828782888289829082918292829382948295829682978298829983008301830283038304830583068307830883098310831183128313831483158316831783188319832083218322832383248325832683278328832983308331833283338334833583368337833883398340834183428343834483458346834783488349835083518352835383548355835683578358835983608361836283638364836583668367836883698370837183728373837483758376837783788379838083818382838383848385838683878388838983908391839283938394839583968397839883998400840184028403840484058406840784088409841084118412841384148415841684178418841984208421842284238424842584268427842884298430843184328433843484358436843784388439844084418442844384448445844684478448844984508451845284538454845584568457845884598460846184628463846484658466846784688469847084718472847384748475847684778478847984808481848284838484848584868487848884898490849184928493849484958496849784988499850085018502850385048505850685078508850985108511851285138514851585168517851885198520852185228523852485258526852785288529853085318532853385348535853685378538853985408541854285438544854585468547854885498550855185528553855485558556855785588559856085618562856385648565856685678568856985708571857285738574857585768577857885798580858185828583858485858586858785888589859085918592859385948595859685978598859986008601860286038604860586068607860886098610861186128613861486158616861786188619862086218622862386248625862686278628862986308631863286338634863586368637863886398640864186428643864486458646864786488649865086518652865386548655865686578658865986608661866286638664866586668667866886698670867186728673867486758676867786788679868086818682868386848685868686878688868986908691869286938694869586968697869886998700870187028703870487058706870787088709871087118712871387148715871687178718871987208721872287238724872587268727872887298730873187328733873487358736873787388739874087418742874387448745874687478748874987508751875287538754875587568757875887598760876187628763876487658766876787688769877087718772877387748775877687778778877987808781878287838784878587868787878887898790879187928793879487958796879787988799880088018802880388048805880688078808880988108811881288138814881588168817881888198820882188228823882488258826882788288829883088318832883388348835883688378838883988408841884288438844884588468847884888498850885188528853885488558856885788588859886088618862886388648865886688678868886988708871887288738874887588768877887888798880888188828883888488858886888788888889889088918892889388948895889688978898889989008901890289038904890589068907890889098910891189128913891489158916891789188919892089218922892389248925892689278928892989308931893289338934893589368937893889398940894189428943894489458946894789488949895089518952895389548955895689578958895989608961896289638964896589668967896889698970897189728973897489758976897789788979898089818982898389848985898689878988898989908991899289938994899589968997899889999000900190029003900490059006900790089009901090119012901390149015901690179018901990209021902290239024902590269027902890299030903190329033903490359036903790389039904090419042904390449045904690479048904990509051905290539054905590569057905890599060906190629063906490659066906790689069907090719072907390749075907690779078907990809081908290839084908590869087908890899090909190929093909490959096909790989099910091019102910391049105910691079108910991109111911291139114911591169117911891199120912191229123912491259126912791289129913091319132913391349135913691379138913991409141914291439144914591469147914891499150915191529153915491559156915791589159916091619162916391649165916691679168916991709171917291739174917591769177917891799180918191829183918491859186918791889189919091919192919391949195919691979198919992009201920292039204920592069207920892099210921192129213921492159216921792189219922092219222922392249225922692279228922992309231923292339234923592369237923892399240924192429243924492459246924792489249925092519252925392549255925692579258925992609261926292639264926592669267926892699270927192729273927492759276927792789279928092819282928392849285928692879288928992909291929292939294929592969297929892999300930193029303930493059306930793089309931093119312931393149315931693179318931993209321932293239324932593269327932893299330933193329333933493359336933793389339934093419342934393449345934693479348934993509351935293539354935593569357935893599360936193629363936493659366936793689369937093719372937393749375937693779378937993809381938293839384938593869387938893899390939193929393939493959396939793989399940094019402940394049405940694079408940994109411941294139414941594169417941894199420942194229423942494259426942794289429943094319432943394349435943694379438943994409441944294439444944594469447944894499450945194529453945494559456945794589459946094619462946394649465946694679468946994709471947294739474947594769477947894799480948194829483948494859486948794889489949094919492949394949495949694979498949995009501950295039504950595069507950895099510951195129513951495159516951795189519952095219522952395249525952695279528952995309531953295339534953595369537953895399540
  1. /*
  2. * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. *
  5. * Permission to use, copy, modify, and/or distribute this software for
  6. * any purpose with or without fee is hereby granted, provided that the
  7. * above copyright notice and this permission notice appear in all
  8. * copies.
  9. *
  10. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  11. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  12. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  13. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  14. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  15. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  16. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  17. * PERFORMANCE OF THIS SOFTWARE.
  18. */
  19. #include "qdf_types.h"
  20. #include "qdf_module.h"
  21. #include "dp_peer.h"
  22. #include "dp_types.h"
  23. #include "dp_tx.h"
  24. #include "dp_internal.h"
  25. #include "htt_stats.h"
  26. #include "htt_ppdu_stats.h"
  27. #ifdef QCA_PEER_EXT_STATS
  28. #include <cdp_txrx_hist_struct.h>
  29. #include "dp_hist.h"
  30. #endif
  31. #ifdef WIFI_MONITOR_SUPPORT
  32. #include "dp_htt.h"
  33. #include <dp_mon.h>
  34. #endif
  35. #define DP_MAX_STRING_LEN 500
  36. #define DP_HTT_TX_RX_EXPECTED_TLVS (((uint64_t)1 << HTT_STATS_TX_PDEV_CMN_TAG) |\
  37. ((uint64_t)1 << HTT_STATS_TX_PDEV_UNDERRUN_TAG) |\
  38. ((uint64_t)1 << HTT_STATS_TX_PDEV_SIFS_TAG) |\
  39. ((uint64_t)1 << HTT_STATS_TX_PDEV_FLUSH_TAG) |\
  40. ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_STATS_TAG) |\
  41. ((uint64_t)1 << HTT_STATS_RX_SOC_FW_STATS_TAG) |\
  42. ((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG) |\
  43. ((uint64_t)1 << HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG) |\
  44. ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG) |\
  45. ((uint64_t)1 << HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG))
  46. #define DP_HTT_HW_INTR_NAME_LEN HTT_STATS_MAX_HW_INTR_NAME_LEN
  47. #define DP_HTT_HW_MODULE_NAME_LEN HTT_STATS_MAX_HW_MODULE_NAME_LEN
  48. #define DP_HTT_COUNTER_NAME_LEN HTT_MAX_COUNTER_NAME
  49. #define DP_HTT_LOW_WM_HIT_COUNT_LEN HTT_STATS_LOW_WM_BINS
  50. #define DP_HTT_HIGH_WM_HIT_COUNT_LEN HTT_STATS_HIGH_WM_BINS
  51. #define DP_HTT_TX_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  52. #define DP_HTT_TX_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
  53. #define DP_HTT_TX_MCS_EXT2_LEN HTT_TX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS
  54. #define DP_HTT_TX_SU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  55. #define DP_HTT_TX_SU_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
  56. #define DP_HTT_TX_MU_MCS_LEN HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS
  57. #define DP_HTT_TX_MU_MCS_EXT_LEN HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
  58. #define DP_HTT_TX_NSS_LEN HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS
  59. #define DP_HTT_TX_BW_LEN HTT_TX_PDEV_STATS_NUM_BW_COUNTERS
  60. #define DP_HTT_TX_PREAM_LEN HTT_TX_PDEV_STATS_NUM_PREAMBLE_TYPES
  61. #define DP_HTT_TX_PDEV_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
  62. #define DP_HTT_TX_DCM_LEN HTT_TX_PDEV_STATS_NUM_DCM_COUNTERS
  63. #define DP_HTT_RX_MCS_LEN HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS
  64. #define DP_HTT_RX_MCS_EXT_LEN HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS
  65. #define DP_HTT_RX_PDEV_MCS_LEN_EXT HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS_EXT
  66. #define DP_HTT_RX_PDEV_MCS_LEN_EXT2 HTT_RX_PDEV_STATS_NUM_EXTRA2_MCS_COUNTERS
  67. #define DP_HTT_RX_NSS_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
  68. #define DP_HTT_RX_DCM_LEN HTT_RX_PDEV_STATS_NUM_DCM_COUNTERS
  69. #define DP_HTT_RX_BW_LEN HTT_RX_PDEV_STATS_NUM_BW_COUNTERS
  70. #define DP_HTT_RX_PREAM_LEN HTT_RX_PDEV_STATS_NUM_PREAMBLE_TYPES
  71. #define DP_HTT_RSSI_CHAIN_LEN HTT_RX_PDEV_STATS_NUM_SPATIAL_STREAMS
  72. #define DP_HTT_RX_GI_LEN HTT_RX_PDEV_STATS_NUM_GI_COUNTERS
  73. #define DP_HTT_FW_RING_MGMT_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX
  74. #define DP_HTT_FW_RING_CTRL_SUBTYPE_LEN HTT_STATS_SUBTYPE_MAX
  75. #define DP_HTT_FW_RING_MPDU_ERR_LEN HTT_RX_STATS_RXDMA_MAX_ERR
  76. #define DP_HTT_TID_NAME_LEN MAX_HTT_TID_NAME
  77. #define DP_HTT_PEER_NUM_SS HTT_RX_PEER_STATS_NUM_SPATIAL_STREAMS
  78. #define DP_HTT_PDEV_TX_GI_LEN HTT_TX_PDEV_STATS_NUM_GI_COUNTERS
  79. #define DP_MAX_INT_CONTEXTS_STRING_LENGTH (6 * WLAN_CFG_INT_NUM_CONTEXTS)
  80. #define DP_NSS_LENGTH (6 * SS_COUNT)
  81. #define DP_MU_GROUP_LENGTH (6 * DP_MU_GROUP_SHOW)
  82. #define DP_MU_GROUP_SHOW 16
  83. #define DP_RXDMA_ERR_LENGTH (6 * HAL_RXDMA_ERR_MAX)
  84. #define DP_REO_ERR_LENGTH (6 * HAL_REO_ERR_MAX)
  85. #define STATS_PROC_TIMEOUT (HZ / 1000)
  86. #define dp_stats_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_STATS, params)
  87. #define dp_stats_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_STATS, params)
  88. #define dp_stats_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_STATS, params)
  89. #define dp_stats_info(params...) \
  90. __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_STATS, ## params)
  91. #define dp_stats_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_STATS, params)
  92. #ifdef WLAN_FEATURE_11BE
  93. static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
  94. {
  95. {"HE MCS 0 (BPSK 1/2) ", MCS_VALID},
  96. {"HE MCS 1 (QPSK 1/2) ", MCS_VALID},
  97. {"HE MCS 2 (QPSK 3/4) ", MCS_VALID},
  98. {"HE MCS 3 (16-QAM 1/2) ", MCS_VALID},
  99. {"HE MCS 4 (16-QAM 3/4) ", MCS_VALID},
  100. {"HE MCS 5 (64-QAM 2/3) ", MCS_VALID},
  101. {"HE MCS 6 (64-QAM 3/4) ", MCS_VALID},
  102. {"HE MCS 7 (64-QAM 5/6) ", MCS_VALID},
  103. {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID},
  104. {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID},
  105. {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID},
  106. {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
  107. {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
  108. {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
  109. {"INVALID ", MCS_INVALID},
  110. {"INVALID ", MCS_INVALID},
  111. {"INVALID ", MCS_INVALID},
  112. },
  113. {
  114. {"EHT MCS 0 (BPSK 1/2) ", MCS_VALID},
  115. {"EHT MCS 1 (QPSK 1/2) ", MCS_VALID},
  116. {"EHT MCS 2 (QPSK 3/4) ", MCS_VALID},
  117. {"EHT MCS 3 (16-QAM 1/2) ", MCS_VALID},
  118. {"EHT MCS 4 (16-QAM 3/4) ", MCS_VALID},
  119. {"EHT MCS 5 (64-QAM 2/3) ", MCS_VALID},
  120. {"EHT MCS 6 (64-QAM 3/4) ", MCS_VALID},
  121. {"EHT MCS 7 (64-QAM 5/6) ", MCS_VALID},
  122. {"EHT MCS 8 (256-QAM 3/4) ", MCS_VALID},
  123. {"EHT MCS 9 (256-QAM 5/6) ", MCS_VALID},
  124. {"EHT MCS 10 (1024-QAM 3/4)", MCS_VALID},
  125. {"EHT MCS 11 (1024-QAM 5/6)", MCS_VALID},
  126. {"EHT MCS 12 (4096-QAM 3/4)", MCS_VALID},
  127. {"EHT MCS 13 (4096-QAM 5/6)", MCS_VALID},
  128. {"EHT MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
  129. {"EHT MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
  130. {"INVALID ", MCS_INVALID},
  131. }
  132. };
  133. #else
  134. static const struct cdp_rate_debug dp_ppdu_rate_string[DOT11_MAX][MAX_MCS] = {
  135. {
  136. {"HE MCS 0 (BPSK 1/2) ", MCS_VALID},
  137. {"HE MCS 1 (QPSK 1/2) ", MCS_VALID},
  138. {"HE MCS 2 (QPSK 3/4) ", MCS_VALID},
  139. {"HE MCS 3 (16-QAM 1/2) ", MCS_VALID},
  140. {"HE MCS 4 (16-QAM 3/4) ", MCS_VALID},
  141. {"HE MCS 5 (64-QAM 2/3) ", MCS_VALID},
  142. {"HE MCS 6 (64-QAM 3/4) ", MCS_VALID},
  143. {"HE MCS 7 (64-QAM 5/6) ", MCS_VALID},
  144. {"HE MCS 8 (256-QAM 3/4) ", MCS_VALID},
  145. {"HE MCS 9 (256-QAM 5/6) ", MCS_VALID},
  146. {"HE MCS 10 (1024-QAM 3/4)", MCS_VALID},
  147. {"HE MCS 11 (1024-QAM 5/6)", MCS_VALID},
  148. {"HE MCS 12 (4096-QAM 3/4)", MCS_VALID},
  149. {"HE MCS 13 (4096-QAM 5/6)", MCS_VALID},
  150. {"INVALID ", MCS_INVALID},
  151. }
  152. };
  153. #endif
  154. #ifdef WLAN_FEATURE_11BE
  155. static const struct cdp_rate_debug
  156. dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
  157. {
  158. {"HE MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID},
  159. {"HE MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID},
  160. {"HE MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID},
  161. {"HE MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID},
  162. {"HE MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID},
  163. {"HE MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID},
  164. {"HE MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID},
  165. {"HE MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID},
  166. {"HE MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID},
  167. {"HE MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID},
  168. {"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
  169. {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
  170. {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
  171. {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
  172. {"INVALID ", MCS_INVALID},
  173. {"INVALID ", MCS_INVALID},
  174. {"INVALID ", MCS_INVALID},
  175. },
  176. {
  177. {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID},
  178. {"HE OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID},
  179. {"HE OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID},
  180. {"HE OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID},
  181. {"HE OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID},
  182. {"HE OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID},
  183. {"HE OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID},
  184. {"HE OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID},
  185. {"HE OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID},
  186. {"HE OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID},
  187. {"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
  188. {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
  189. {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
  190. {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
  191. {"INVALID ", MCS_INVALID},
  192. {"INVALID ", MCS_INVALID},
  193. {"INVALID ", MCS_INVALID},
  194. }
  195. };
  196. static const struct cdp_rate_debug
  197. dp_mu_be_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
  198. {
  199. {"EHT MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID},
  200. {"EHT MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID},
  201. {"EHT MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID},
  202. {"EHT MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID},
  203. {"EHT MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID},
  204. {"EHT MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID},
  205. {"EHT MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID},
  206. {"EHT MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID},
  207. {"EHT MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID},
  208. {"EHT MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID},
  209. {"EHT MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
  210. {"EHT MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
  211. {"EHT MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
  212. {"EHT MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
  213. {"EHT MU-MIMO MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
  214. {"EHT MU-MIMO MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
  215. {"INVALID ", MCS_INVALID},
  216. },
  217. {
  218. {"EHT OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID},
  219. {"EHT OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID},
  220. {"EHT OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID},
  221. {"EHT OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID},
  222. {"EHT OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID},
  223. {"EHT OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID},
  224. {"EHT OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID},
  225. {"EHT OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID},
  226. {"EHT OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID},
  227. {"EHT OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID},
  228. {"EHT OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
  229. {"EHT OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
  230. {"EHT OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
  231. {"EHT OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
  232. {"EHT OFDMA MCS 14 (BPSK-DCM 1/2)", MCS_VALID},
  233. {"EHT OFDMA MCS 15 (BPSK-DCM 1/2)", MCS_VALID},
  234. {"INVALID ", MCS_INVALID},
  235. }
  236. };
  237. #else
  238. static const struct cdp_rate_debug
  239. dp_mu_rate_string[TXRX_TYPE_MU_MAX][MAX_MCS] = {
  240. {
  241. {"HE MU-MIMO MCS 0 (BPSK 1/2) ", MCS_VALID},
  242. {"HE MU-MIMO MCS 1 (QPSK 1/2) ", MCS_VALID},
  243. {"HE MU-MIMO MCS 2 (QPSK 3/4) ", MCS_VALID},
  244. {"HE MU-MIMO MCS 3 (16-QAM 1/2) ", MCS_VALID},
  245. {"HE MU-MIMO MCS 4 (16-QAM 3/4) ", MCS_VALID},
  246. {"HE MU-MIMO MCS 5 (64-QAM 2/3) ", MCS_VALID},
  247. {"HE MU-MIMO MCS 6 (64-QAM 3/4) ", MCS_VALID},
  248. {"HE MU-MIMO MCS 7 (64-QAM 5/6) ", MCS_VALID},
  249. {"HE MU-MIMO MCS 8 (256-QAM 3/4) ", MCS_VALID},
  250. {"HE MU-MIMO MCS 9 (256-QAM 5/6) ", MCS_VALID},
  251. {"HE MU-MIMO MCS 10 (1024-QAM 3/4)", MCS_VALID},
  252. {"HE MU-MIMO MCS 11 (1024-QAM 5/6)", MCS_VALID},
  253. {"HE MU-MIMO MCS 12 (4096-QAM 3/4)", MCS_VALID},
  254. {"HE MU-MIMO MCS 13 (4096-QAM 5/6)", MCS_VALID},
  255. {"INVALID ", MCS_INVALID},
  256. },
  257. {
  258. {"HE OFDMA MCS 0 (BPSK 1/2) ", MCS_VALID},
  259. {"HE OFDMA MCS 1 (QPSK 1/2) ", MCS_VALID},
  260. {"HE OFDMA MCS 2 (QPSK 3/4) ", MCS_VALID},
  261. {"HE OFDMA MCS 3 (16-QAM 1/2) ", MCS_VALID},
  262. {"HE OFDMA MCS 4 (16-QAM 3/4) ", MCS_VALID},
  263. {"HE OFDMA MCS 5 (64-QAM 2/3) ", MCS_VALID},
  264. {"HE OFDMA MCS 6 (64-QAM 3/4) ", MCS_VALID},
  265. {"HE OFDMA MCS 7 (64-QAM 5/6) ", MCS_VALID},
  266. {"HE OFDMA MCS 8 (256-QAM 3/4) ", MCS_VALID},
  267. {"HE OFDMA MCS 9 (256-QAM 5/6) ", MCS_VALID},
  268. {"HE OFDMA MCS 10 (1024-QAM 3/4)", MCS_VALID},
  269. {"HE OFDMA MCS 11 (1024-QAM 5/6)", MCS_VALID},
  270. {"HE OFDMA MCS 12 (4096-QAM 3/4)", MCS_VALID},
  271. {"HE OFDMA MCS 13 (4096-QAM 5/6)", MCS_VALID},
  272. {"INVALID ", MCS_INVALID},
  273. }
  274. };
  275. #endif
  276. const char *mu_reception_mode[TXRX_TYPE_MU_MAX] = {
  277. "MU MIMO", "MU OFDMA"
  278. };
  279. #ifdef QCA_ENH_V3_STATS_SUPPORT
  280. #ifndef WLAN_CONFIG_TX_DELAY
  281. const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  282. "0 to 9 ms", "10 to 19 ms",
  283. "20 to 29 ms", "30 to 39 ms",
  284. "40 to 49 ms", "50 to 59 ms",
  285. "60 to 69 ms", "70 to 79 ms",
  286. "80 to 89 ms", "90 to 99 ms",
  287. "101 to 249 ms", "250 to 499 ms", "500+ ms"
  288. };
  289. #else
  290. const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  291. "0 to 250 us", "250 to 500 us",
  292. "500 to 750 us", "750 to 1000 us",
  293. "1000 to 1500 us", "1500 to 2000 us",
  294. "2000 to 2500 us", "2500 to 5000 us",
  295. "5000 to 6000 us", "6000 to 7000 ms",
  296. "7000 to 8000 us", "8000 to 9000 us", "9000+ us"
  297. };
  298. #endif
  299. #elif defined(HW_TX_DELAY_STATS_ENABLE)
  300. const char *fw_to_hw_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  301. "0 to 2 ms", "2 to 4 ms",
  302. "4 to 6 ms", "6 to 8 ms",
  303. "8 to 10 ms", "10 to 20 ms",
  304. "20 to 30 ms", "30 to 40 ms",
  305. "40 to 50 ms", "50 to 100 ms",
  306. "100 to 250 ms", "250 to 500 ms", "500+ ms"
  307. };
  308. #endif
  309. #ifdef QCA_ENH_V3_STATS_SUPPORT
  310. #ifndef WLAN_CONFIG_TX_DELAY
  311. const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  312. "0 to 1 ms", "1 to 2 ms",
  313. "2 to 3 ms", "3 to 4 ms",
  314. "4 to 5 ms", "5 to 6 ms",
  315. "6 to 7 ms", "7 to 8 ms",
  316. "8 to 9 ms", "9 to 10 ms",
  317. "10 to 11 ms", "11 to 12 ms", "12+ ms"
  318. };
  319. #else
  320. const char *sw_enq_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  321. "0 to 250 us", "250 to 500 us",
  322. "500 to 750 us", "750 to 1000 us",
  323. "1000 to 1500 us", "1500 to 2000 us",
  324. "2000 to 2500 us", "2500 to 5000 us",
  325. "5000 to 6000 us", "6000 to 7000 ms",
  326. "7000 to 8000 us", "8000 to 9000 us", "9000+ us"
  327. };
  328. #endif
  329. const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = {
  330. "0 to 4 ms", "5 to 9 ms",
  331. "10 to 14 ms", "15 to 19 ms",
  332. "20 to 24 ms", "25 to 29 ms",
  333. "30 to 34 ms", "35 to 39 ms",
  334. "40 to 44 ms", "45 to 49 ms",
  335. "50 to 54 ms", "55 to 59 ms", "60+ ms"
  336. };
  337. #endif
  338. #define TID_COUNTER_STATS 1 /* Success/drop stats type */
  339. #define TID_DELAY_STATS 2 /* Delay stats type */
  340. #define TID_RX_ERROR_STATS 3 /* Rx Error stats type */
  341. #ifdef WLAN_SYSFS_DP_STATS
  342. void DP_PRINT_STATS(const char *fmt, ...)
  343. {
  344. void *soc_void = NULL;
  345. va_list val;
  346. uint16_t buf_written = 0;
  347. uint16_t curr_len = 0;
  348. uint16_t max_len = 0;
  349. struct dp_soc *soc = NULL;
  350. soc_void = cds_get_context(QDF_MODULE_ID_SOC);
  351. if (!soc_void)
  352. return;
  353. soc = cdp_soc_t_to_dp_soc(soc_void);
  354. va_start(val, fmt);
  355. QDF_VTRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, (char *)fmt, val);
  356. /* writing to the buffer */
  357. if (soc->sysfs_config && soc->sysfs_config->printing_mode == PRINTING_MODE_ENABLED) {
  358. if (soc->sysfs_config->process_id == qdf_get_current_pid()) {
  359. curr_len = soc->sysfs_config->curr_buffer_length;
  360. max_len = soc->sysfs_config->max_buffer_length;
  361. if ((max_len - curr_len) <= 1)
  362. return;
  363. qdf_spinlock_acquire(&soc->sysfs_config->sysfs_write_user_buffer);
  364. if (soc->sysfs_config->buf) {
  365. buf_written = vscnprintf(soc->sysfs_config->buf + curr_len,
  366. max_len - curr_len, fmt, val);
  367. curr_len += buf_written;
  368. if ((max_len - curr_len) <= 1)
  369. return;
  370. buf_written += scnprintf(soc->sysfs_config->buf + curr_len,
  371. max_len - curr_len, "\n");
  372. soc->sysfs_config->curr_buffer_length += buf_written;
  373. }
  374. qdf_spinlock_release(&soc->sysfs_config->sysfs_write_user_buffer);
  375. }
  376. }
  377. va_end(val);
  378. }
  379. #endif /* WLAN_SYSFS_DP_STATS */
  380. /**
  381. * dp_print_stats_string_tlv() - display htt_stats_string_tlv
  382. * @tag_buf: buffer containing the tlv htt_stats_string_tlv
  383. *
  384. * Return: void
  385. */
  386. static void dp_print_stats_string_tlv(uint32_t *tag_buf)
  387. {
  388. htt_stats_string_tlv *dp_stats_buf =
  389. (htt_stats_string_tlv *)tag_buf;
  390. uint8_t i;
  391. uint16_t index = 0;
  392. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  393. char *data = qdf_mem_malloc(DP_MAX_STRING_LEN);
  394. if (!data) {
  395. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  396. FL("Output buffer not allocated"));
  397. return;
  398. }
  399. DP_PRINT_STATS("HTT_STATS_STRING_TLV:");
  400. for (i = 0; i < tag_len; i++) {
  401. index += qdf_snprint(&data[index],
  402. DP_MAX_STRING_LEN - index,
  403. " %u:%u,", i, dp_stats_buf->data[i]);
  404. }
  405. DP_PRINT_STATS("data = %s\n", data);
  406. qdf_mem_free(data);
  407. }
  408. /**
  409. * dp_print_tx_pdev_stats_cmn_tlv() - display htt_tx_pdev_stats_cmn_tlv
  410. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_cmn_tlv
  411. *
  412. * Return: void
  413. */
  414. static void dp_print_tx_pdev_stats_cmn_tlv(uint32_t *tag_buf)
  415. {
  416. htt_tx_pdev_stats_cmn_tlv *dp_stats_buf =
  417. (htt_tx_pdev_stats_cmn_tlv *)tag_buf;
  418. DP_PRINT_STATS("HTT_TX_PDEV_STATS_CMN_TLV:");
  419. DP_PRINT_STATS("mac_id__word = %u",
  420. dp_stats_buf->mac_id__word);
  421. DP_PRINT_STATS("hw_queued = %u",
  422. dp_stats_buf->hw_queued);
  423. DP_PRINT_STATS("hw_reaped = %u",
  424. dp_stats_buf->hw_reaped);
  425. DP_PRINT_STATS("underrun = %u",
  426. dp_stats_buf->underrun);
  427. DP_PRINT_STATS("hw_paused = %u",
  428. dp_stats_buf->hw_paused);
  429. DP_PRINT_STATS("hw_flush = %u",
  430. dp_stats_buf->hw_flush);
  431. DP_PRINT_STATS("hw_filt = %u",
  432. dp_stats_buf->hw_filt);
  433. DP_PRINT_STATS("tx_abort = %u",
  434. dp_stats_buf->tx_abort);
  435. DP_PRINT_STATS("mpdu_requeued = %u",
  436. dp_stats_buf->mpdu_requed);
  437. DP_PRINT_STATS("tx_xretry = %u",
  438. dp_stats_buf->tx_xretry);
  439. DP_PRINT_STATS("data_rc = %u",
  440. dp_stats_buf->data_rc);
  441. DP_PRINT_STATS("mpdu_dropped_xretry = %u",
  442. dp_stats_buf->mpdu_dropped_xretry);
  443. DP_PRINT_STATS("illegal_rate_phy_err = %u",
  444. dp_stats_buf->illgl_rate_phy_err);
  445. DP_PRINT_STATS("cont_xretry = %u",
  446. dp_stats_buf->cont_xretry);
  447. DP_PRINT_STATS("tx_timeout = %u",
  448. dp_stats_buf->tx_timeout);
  449. DP_PRINT_STATS("pdev_resets = %u",
  450. dp_stats_buf->pdev_resets);
  451. DP_PRINT_STATS("phy_underrun = %u",
  452. dp_stats_buf->phy_underrun);
  453. DP_PRINT_STATS("txop_ovf = %u",
  454. dp_stats_buf->txop_ovf);
  455. DP_PRINT_STATS("seq_posted = %u",
  456. dp_stats_buf->seq_posted);
  457. DP_PRINT_STATS("seq_failed_queueing = %u",
  458. dp_stats_buf->seq_failed_queueing);
  459. DP_PRINT_STATS("seq_completed = %u",
  460. dp_stats_buf->seq_completed);
  461. DP_PRINT_STATS("seq_restarted = %u",
  462. dp_stats_buf->seq_restarted);
  463. DP_PRINT_STATS("mu_seq_posted = %u",
  464. dp_stats_buf->mu_seq_posted);
  465. DP_PRINT_STATS("seq_switch_hw_paused = %u",
  466. dp_stats_buf->seq_switch_hw_paused);
  467. DP_PRINT_STATS("next_seq_posted_dsr = %u",
  468. dp_stats_buf->next_seq_posted_dsr);
  469. DP_PRINT_STATS("seq_posted_isr = %u",
  470. dp_stats_buf->seq_posted_isr);
  471. DP_PRINT_STATS("seq_ctrl_cached = %u",
  472. dp_stats_buf->seq_ctrl_cached);
  473. DP_PRINT_STATS("mpdu_count_tqm = %u",
  474. dp_stats_buf->mpdu_count_tqm);
  475. DP_PRINT_STATS("msdu_count_tqm = %u",
  476. dp_stats_buf->msdu_count_tqm);
  477. DP_PRINT_STATS("mpdu_removed_tqm = %u",
  478. dp_stats_buf->mpdu_removed_tqm);
  479. DP_PRINT_STATS("msdu_removed_tqm = %u",
  480. dp_stats_buf->msdu_removed_tqm);
  481. DP_PRINT_STATS("mpdus_sw_flush = %u",
  482. dp_stats_buf->mpdus_sw_flush);
  483. DP_PRINT_STATS("mpdus_hw_filter = %u",
  484. dp_stats_buf->mpdus_hw_filter);
  485. DP_PRINT_STATS("mpdus_truncated = %u",
  486. dp_stats_buf->mpdus_truncated);
  487. DP_PRINT_STATS("mpdus_ack_failed = %u",
  488. dp_stats_buf->mpdus_ack_failed);
  489. DP_PRINT_STATS("mpdus_expired = %u",
  490. dp_stats_buf->mpdus_expired);
  491. DP_PRINT_STATS("mpdus_seq_hw_retry = %u",
  492. dp_stats_buf->mpdus_seq_hw_retry);
  493. DP_PRINT_STATS("ack_tlv_proc = %u",
  494. dp_stats_buf->ack_tlv_proc);
  495. DP_PRINT_STATS("coex_abort_mpdu_cnt_valid = %u",
  496. dp_stats_buf->coex_abort_mpdu_cnt_valid);
  497. DP_PRINT_STATS("coex_abort_mpdu_cnt = %u\n",
  498. dp_stats_buf->coex_abort_mpdu_cnt);
  499. }
  500. /**
  501. * dp_print_tx_pdev_stats_urrn_tlv_v() - display htt_tx_pdev_stats_urrn_tlv_v
  502. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_urrn_tlv_v
  503. *
  504. * Return: void
  505. */
  506. static void dp_print_tx_pdev_stats_urrn_tlv_v(uint32_t *tag_buf)
  507. {
  508. htt_tx_pdev_stats_urrn_tlv_v *dp_stats_buf =
  509. (htt_tx_pdev_stats_urrn_tlv_v *)tag_buf;
  510. uint8_t i;
  511. uint16_t index = 0;
  512. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  513. char *urrn_stats = qdf_mem_malloc(DP_MAX_STRING_LEN);
  514. if (!urrn_stats) {
  515. dp_stats_err("Output buffer not allocated");
  516. return;
  517. }
  518. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
  519. DP_PRINT_STATS("HTT_TX_PDEV_STATS_URRN_TLV_V:");
  520. for (i = 0; i < tag_len; i++) {
  521. index += qdf_snprint(&urrn_stats[index],
  522. DP_MAX_STRING_LEN - index,
  523. " %u:%u,", i, dp_stats_buf->urrn_stats[i]);
  524. }
  525. DP_PRINT_STATS("urrn_stats = %s\n", urrn_stats);
  526. qdf_mem_free(urrn_stats);
  527. }
  528. /**
  529. * dp_print_tx_pdev_stats_flush_tlv_v() - display htt_tx_pdev_stats_flush_tlv_v
  530. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_flush_tlv_v
  531. *
  532. * Return: void
  533. */
  534. static void dp_print_tx_pdev_stats_flush_tlv_v(uint32_t *tag_buf)
  535. {
  536. htt_tx_pdev_stats_flush_tlv_v *dp_stats_buf =
  537. (htt_tx_pdev_stats_flush_tlv_v *)tag_buf;
  538. uint8_t i;
  539. uint16_t index = 0;
  540. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  541. char *flush_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
  542. if (!flush_errs) {
  543. dp_stats_err("Output buffer not allocated");
  544. return;
  545. }
  546. tag_len = qdf_min(tag_len,
  547. (uint32_t)HTT_TX_PDEV_MAX_FLUSH_REASON_STATS);
  548. DP_PRINT_STATS("HTT_TX_PDEV_STATS_FLUSH_TLV_V:");
  549. for (i = 0; i < tag_len; i++) {
  550. index += qdf_snprint(&flush_errs[index],
  551. DP_MAX_STRING_LEN - index,
  552. " %u:%u,", i, dp_stats_buf->flush_errs[i]);
  553. }
  554. DP_PRINT_STATS("flush_errs = %s\n", flush_errs);
  555. qdf_mem_free(flush_errs);
  556. }
  557. /**
  558. * dp_print_tx_pdev_stats_sifs_tlv_v() - display htt_tx_pdev_stats_sifs_tlv_v
  559. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sifs_tlv_v
  560. *
  561. * Return: void
  562. */
  563. static void dp_print_tx_pdev_stats_sifs_tlv_v(uint32_t *tag_buf)
  564. {
  565. htt_tx_pdev_stats_sifs_tlv_v *dp_stats_buf =
  566. (htt_tx_pdev_stats_sifs_tlv_v *)tag_buf;
  567. uint8_t i;
  568. uint16_t index = 0;
  569. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  570. char *sifs_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
  571. if (!sifs_status) {
  572. dp_stats_err("Output buffer not allocated");
  573. return;
  574. }
  575. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_SIFS_BURST_STATS);
  576. DP_PRINT_STATS("HTT_TX_PDEV_STATS_SIFS_TLV_V:");
  577. for (i = 0; i < tag_len; i++) {
  578. index += qdf_snprint(&sifs_status[index],
  579. DP_MAX_STRING_LEN - index,
  580. " %u:%u,", i, dp_stats_buf->sifs_status[i]);
  581. }
  582. DP_PRINT_STATS("sifs_status = %s\n", sifs_status);
  583. qdf_mem_free(sifs_status);
  584. }
  585. /**
  586. * dp_print_tx_pdev_stats_phy_err_tlv_v() - display htt_tx_pdev_stats_phy_err_tlv_v
  587. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_phy_err_tlv_v
  588. *
  589. * Return: void
  590. */
  591. static void dp_print_tx_pdev_stats_phy_err_tlv_v(uint32_t *tag_buf)
  592. {
  593. htt_tx_pdev_stats_phy_err_tlv_v *dp_stats_buf =
  594. (htt_tx_pdev_stats_phy_err_tlv_v *)tag_buf;
  595. uint8_t i;
  596. uint16_t index = 0;
  597. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  598. char *phy_errs = qdf_mem_malloc(DP_MAX_STRING_LEN);
  599. if (!phy_errs) {
  600. dp_stats_err("Output buffer not allocated");
  601. return;
  602. }
  603. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_PHY_ERR_STATS);
  604. DP_PRINT_STATS("HTT_TX_PDEV_STATS_PHY_ERR_TLV_V:");
  605. for (i = 0; i < tag_len; i++) {
  606. index += qdf_snprint(&phy_errs[index],
  607. DP_MAX_STRING_LEN - index,
  608. " %u:%u,", i, dp_stats_buf->phy_errs[i]);
  609. }
  610. DP_PRINT_STATS("phy_errs = %s\n", phy_errs);
  611. qdf_mem_free(phy_errs);
  612. }
  613. /**
  614. * dp_print_hw_stats_intr_misc_tlv() - display htt_hw_stats_intr_misc_tlv
  615. * @tag_buf: buffer containing the tlv htt_hw_stats_intr_misc_tlv
  616. *
  617. * Return: void
  618. */
  619. static void dp_print_hw_stats_intr_misc_tlv(uint32_t *tag_buf)
  620. {
  621. htt_hw_stats_intr_misc_tlv *dp_stats_buf =
  622. (htt_hw_stats_intr_misc_tlv *)tag_buf;
  623. uint8_t i;
  624. uint16_t index = 0;
  625. char *hw_intr_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  626. if (!hw_intr_name) {
  627. dp_stats_err("Output buffer not allocated");
  628. return;
  629. }
  630. DP_PRINT_STATS("HTT_HW_STATS_INTR_MISC_TLV:");
  631. for (i = 0; i < DP_HTT_HW_INTR_NAME_LEN; i++) {
  632. index += qdf_snprint(&hw_intr_name[index],
  633. DP_MAX_STRING_LEN - index,
  634. " %u:%u,", i, dp_stats_buf->hw_intr_name[i]);
  635. }
  636. DP_PRINT_STATS("hw_intr_name = %s ", hw_intr_name);
  637. DP_PRINT_STATS("mask = %u",
  638. dp_stats_buf->mask);
  639. DP_PRINT_STATS("count = %u\n",
  640. dp_stats_buf->count);
  641. qdf_mem_free(hw_intr_name);
  642. }
  643. /**
  644. * dp_print_hw_stats_wd_timeout_tlv() - display htt_hw_stats_wd_timeout_tlv
  645. * @tag_buf: buffer containing the tlv htt_hw_stats_wd_timeout_tlv
  646. *
  647. * Return: void
  648. */
  649. static void dp_print_hw_stats_wd_timeout_tlv(uint32_t *tag_buf)
  650. {
  651. htt_hw_stats_wd_timeout_tlv *dp_stats_buf =
  652. (htt_hw_stats_wd_timeout_tlv *)tag_buf;
  653. uint8_t i;
  654. uint16_t index = 0;
  655. char *hw_module_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  656. if (!hw_module_name) {
  657. dp_stats_err("Output buffer not allocated");
  658. return;
  659. }
  660. DP_PRINT_STATS("HTT_HW_STATS_WD_TIMEOUT_TLV:");
  661. for (i = 0; i < DP_HTT_HW_MODULE_NAME_LEN; i++) {
  662. index += qdf_snprint(&hw_module_name[index],
  663. DP_MAX_STRING_LEN - index,
  664. " %u:%u,", i, dp_stats_buf->hw_module_name[i]);
  665. }
  666. DP_PRINT_STATS("hw_module_name = %s ", hw_module_name);
  667. DP_PRINT_STATS("count = %u",
  668. dp_stats_buf->count);
  669. qdf_mem_free(hw_module_name);
  670. }
  671. /**
  672. * dp_print_hw_stats_pdev_errs_tlv() - display htt_hw_stats_pdev_errs_tlv
  673. * @tag_buf: buffer containing the tlv htt_hw_stats_pdev_errs_tlv
  674. *
  675. * Return: void
  676. */
  677. static void dp_print_hw_stats_pdev_errs_tlv(uint32_t *tag_buf)
  678. {
  679. htt_hw_stats_pdev_errs_tlv *dp_stats_buf =
  680. (htt_hw_stats_pdev_errs_tlv *)tag_buf;
  681. DP_PRINT_STATS("HTT_HW_STATS_PDEV_ERRS_TLV:");
  682. DP_PRINT_STATS("mac_id__word = %u",
  683. dp_stats_buf->mac_id__word);
  684. DP_PRINT_STATS("tx_abort = %u",
  685. dp_stats_buf->tx_abort);
  686. DP_PRINT_STATS("tx_abort_fail_count = %u",
  687. dp_stats_buf->tx_abort_fail_count);
  688. DP_PRINT_STATS("rx_abort = %u",
  689. dp_stats_buf->rx_abort);
  690. DP_PRINT_STATS("rx_abort_fail_count = %u",
  691. dp_stats_buf->rx_abort_fail_count);
  692. DP_PRINT_STATS("warm_reset = %u",
  693. dp_stats_buf->warm_reset);
  694. DP_PRINT_STATS("cold_reset = %u",
  695. dp_stats_buf->cold_reset);
  696. DP_PRINT_STATS("tx_flush = %u",
  697. dp_stats_buf->tx_flush);
  698. DP_PRINT_STATS("tx_glb_reset = %u",
  699. dp_stats_buf->tx_glb_reset);
  700. DP_PRINT_STATS("tx_txq_reset = %u",
  701. dp_stats_buf->tx_txq_reset);
  702. DP_PRINT_STATS("rx_timeout_reset = %u\n",
  703. dp_stats_buf->rx_timeout_reset);
  704. }
  705. /**
  706. * dp_print_msdu_flow_stats_tlv() - display htt_msdu_flow_stats_tlv
  707. * @tag_buf: buffer containing the tlv htt_msdu_flow_stats_tlv
  708. *
  709. * Return: void
  710. */
  711. static void dp_print_msdu_flow_stats_tlv(uint32_t *tag_buf)
  712. {
  713. htt_msdu_flow_stats_tlv *dp_stats_buf =
  714. (htt_msdu_flow_stats_tlv *)tag_buf;
  715. DP_PRINT_STATS("HTT_MSDU_FLOW_STATS_TLV:");
  716. DP_PRINT_STATS("last_update_timestamp = %u",
  717. dp_stats_buf->last_update_timestamp);
  718. DP_PRINT_STATS("last_add_timestamp = %u",
  719. dp_stats_buf->last_add_timestamp);
  720. DP_PRINT_STATS("last_remove_timestamp = %u",
  721. dp_stats_buf->last_remove_timestamp);
  722. DP_PRINT_STATS("total_processed_msdu_count = %u",
  723. dp_stats_buf->total_processed_msdu_count);
  724. DP_PRINT_STATS("cur_msdu_count_in_flowq = %u",
  725. dp_stats_buf->cur_msdu_count_in_flowq);
  726. DP_PRINT_STATS("sw_peer_id = %u",
  727. dp_stats_buf->sw_peer_id);
  728. DP_PRINT_STATS("tx_flow_no__tid_num__drop_rule = %u\n",
  729. dp_stats_buf->tx_flow_no__tid_num__drop_rule);
  730. }
  731. /**
  732. * dp_print_tx_tid_stats_tlv() - display htt_tx_tid_stats_tlv
  733. * @tag_buf: buffer containing the tlv htt_tx_tid_stats_tlv
  734. *
  735. * Return: void
  736. */
  737. static void dp_print_tx_tid_stats_tlv(uint32_t *tag_buf)
  738. {
  739. htt_tx_tid_stats_tlv *dp_stats_buf =
  740. (htt_tx_tid_stats_tlv *)tag_buf;
  741. uint8_t i;
  742. uint16_t index = 0;
  743. char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  744. if (!tid_name) {
  745. dp_stats_err("Output buffer not allocated");
  746. return;
  747. }
  748. DP_PRINT_STATS("HTT_TX_TID_STATS_TLV:");
  749. for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) {
  750. index += qdf_snprint(&tid_name[index],
  751. DP_MAX_STRING_LEN - index,
  752. " %u:%u,", i, dp_stats_buf->tid_name[i]);
  753. }
  754. DP_PRINT_STATS("tid_name = %s ", tid_name);
  755. DP_PRINT_STATS("sw_peer_id__tid_num = %u",
  756. dp_stats_buf->sw_peer_id__tid_num);
  757. DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
  758. dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
  759. DP_PRINT_STATS("tid_flags = %u",
  760. dp_stats_buf->tid_flags);
  761. DP_PRINT_STATS("hw_queued = %u",
  762. dp_stats_buf->hw_queued);
  763. DP_PRINT_STATS("hw_reaped = %u",
  764. dp_stats_buf->hw_reaped);
  765. DP_PRINT_STATS("mpdus_hw_filter = %u",
  766. dp_stats_buf->mpdus_hw_filter);
  767. DP_PRINT_STATS("qdepth_bytes = %u",
  768. dp_stats_buf->qdepth_bytes);
  769. DP_PRINT_STATS("qdepth_num_msdu = %u",
  770. dp_stats_buf->qdepth_num_msdu);
  771. DP_PRINT_STATS("qdepth_num_mpdu = %u",
  772. dp_stats_buf->qdepth_num_mpdu);
  773. DP_PRINT_STATS("last_scheduled_tsmp = %u",
  774. dp_stats_buf->last_scheduled_tsmp);
  775. DP_PRINT_STATS("pause_module_id = %u",
  776. dp_stats_buf->pause_module_id);
  777. DP_PRINT_STATS("block_module_id = %u\n",
  778. dp_stats_buf->block_module_id);
  779. DP_PRINT_STATS("tid_tx_airtime = %u\n",
  780. dp_stats_buf->tid_tx_airtime);
  781. qdf_mem_free(tid_name);
  782. }
  783. /**
  784. * dp_print_tx_tid_stats_v1_tlv() - display htt_tx_tid_stats_v1_tlv
  785. * @tag_buf: buffer containing the tlv htt_tx_tid_stats_v1_tlv
  786. *
  787. * Return: void
  788. */
  789. static void dp_print_tx_tid_stats_v1_tlv(uint32_t *tag_buf)
  790. {
  791. htt_tx_tid_stats_v1_tlv *dp_stats_buf =
  792. (htt_tx_tid_stats_v1_tlv *)tag_buf;
  793. uint8_t i;
  794. uint16_t index = 0;
  795. char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  796. if (!tid_name) {
  797. dp_stats_err("Output buffer not allocated");
  798. return;
  799. }
  800. DP_PRINT_STATS("HTT_TX_TID_STATS_V1_TLV:");
  801. for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) {
  802. index += qdf_snprint(&tid_name[index],
  803. DP_MAX_STRING_LEN - index,
  804. " %u:%u,", i, dp_stats_buf->tid_name[i]);
  805. }
  806. DP_PRINT_STATS("tid_name = %s ", tid_name);
  807. DP_PRINT_STATS("sw_peer_id__tid_num = %u",
  808. dp_stats_buf->sw_peer_id__tid_num);
  809. DP_PRINT_STATS("num_sched_pending__num_ppdu_in_hwq = %u",
  810. dp_stats_buf->num_sched_pending__num_ppdu_in_hwq);
  811. DP_PRINT_STATS("tid_flags = %u",
  812. dp_stats_buf->tid_flags);
  813. DP_PRINT_STATS("max_qdepth_bytes = %u",
  814. dp_stats_buf->max_qdepth_bytes);
  815. DP_PRINT_STATS("max_qdepth_n_msdus = %u",
  816. dp_stats_buf->max_qdepth_n_msdus);
  817. DP_PRINT_STATS("rsvd = %u",
  818. dp_stats_buf->rsvd);
  819. DP_PRINT_STATS("qdepth_bytes = %u",
  820. dp_stats_buf->qdepth_bytes);
  821. DP_PRINT_STATS("qdepth_num_msdu = %u",
  822. dp_stats_buf->qdepth_num_msdu);
  823. DP_PRINT_STATS("qdepth_num_mpdu = %u",
  824. dp_stats_buf->qdepth_num_mpdu);
  825. DP_PRINT_STATS("last_scheduled_tsmp = %u",
  826. dp_stats_buf->last_scheduled_tsmp);
  827. DP_PRINT_STATS("pause_module_id = %u",
  828. dp_stats_buf->pause_module_id);
  829. DP_PRINT_STATS("block_module_id = %u\n",
  830. dp_stats_buf->block_module_id);
  831. DP_PRINT_STATS("tid_tx_airtime = %u\n",
  832. dp_stats_buf->tid_tx_airtime);
  833. qdf_mem_free(tid_name);
  834. }
  835. /**
  836. * dp_print_rx_tid_stats_tlv() - display htt_rx_tid_stats_tlv
  837. * @tag_buf: buffer containing the tlv htt_rx_tid_stats_tlv
  838. *
  839. * Return: void
  840. */
  841. static void dp_print_rx_tid_stats_tlv(uint32_t *tag_buf)
  842. {
  843. htt_rx_tid_stats_tlv *dp_stats_buf =
  844. (htt_rx_tid_stats_tlv *)tag_buf;
  845. uint8_t i;
  846. uint16_t index = 0;
  847. char *tid_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  848. if (!tid_name) {
  849. dp_stats_err("Output buffer not allocated");
  850. return;
  851. }
  852. DP_PRINT_STATS("HTT_RX_TID_STATS_TLV:");
  853. DP_PRINT_STATS("sw_peer_id__tid_num = %u",
  854. dp_stats_buf->sw_peer_id__tid_num);
  855. for (i = 0; i < DP_HTT_TID_NAME_LEN; i++) {
  856. index += qdf_snprint(&tid_name[index],
  857. DP_MAX_STRING_LEN - index,
  858. " %u:%u,", i, dp_stats_buf->tid_name[i]);
  859. }
  860. DP_PRINT_STATS("tid_name = %s ", tid_name);
  861. DP_PRINT_STATS("dup_in_reorder = %u",
  862. dp_stats_buf->dup_in_reorder);
  863. DP_PRINT_STATS("dup_past_outside_window = %u",
  864. dp_stats_buf->dup_past_outside_window);
  865. DP_PRINT_STATS("dup_past_within_window = %u",
  866. dp_stats_buf->dup_past_within_window);
  867. DP_PRINT_STATS("rxdesc_err_decrypt = %u\n",
  868. dp_stats_buf->rxdesc_err_decrypt);
  869. qdf_mem_free(tid_name);
  870. }
  871. /**
  872. * dp_print_counter_tlv() - display htt_counter_tlv
  873. * @tag_buf: buffer containing the tlv htt_counter_tlv
  874. *
  875. * Return: void
  876. */
  877. static void dp_print_counter_tlv(uint32_t *tag_buf)
  878. {
  879. htt_counter_tlv *dp_stats_buf =
  880. (htt_counter_tlv *)tag_buf;
  881. uint8_t i;
  882. uint16_t index = 0;
  883. char *counter_name = qdf_mem_malloc(DP_MAX_STRING_LEN);
  884. if (!counter_name) {
  885. dp_stats_err("Output buffer not allocated");
  886. return;
  887. }
  888. DP_PRINT_STATS("HTT_COUNTER_TLV:");
  889. for (i = 0; i < DP_HTT_COUNTER_NAME_LEN; i++) {
  890. index += qdf_snprint(&counter_name[index],
  891. DP_MAX_STRING_LEN - index,
  892. " %u:%u,", i, dp_stats_buf->counter_name[i]);
  893. }
  894. DP_PRINT_STATS("counter_name = %s ", counter_name);
  895. DP_PRINT_STATS("count = %u\n",
  896. dp_stats_buf->count);
  897. qdf_mem_free(counter_name);
  898. }
  899. /**
  900. * dp_print_peer_stats_cmn_tlv() - display htt_peer_stats_cmn_tlv
  901. * @tag_buf: buffer containing the tlv htt_peer_stats_cmn_tlv
  902. *
  903. * Return: void
  904. */
  905. static void dp_print_peer_stats_cmn_tlv(uint32_t *tag_buf)
  906. {
  907. htt_peer_stats_cmn_tlv *dp_stats_buf =
  908. (htt_peer_stats_cmn_tlv *)tag_buf;
  909. DP_PRINT_STATS("HTT_PEER_STATS_CMN_TLV:");
  910. DP_PRINT_STATS("ppdu_cnt = %u",
  911. dp_stats_buf->ppdu_cnt);
  912. DP_PRINT_STATS("mpdu_cnt = %u",
  913. dp_stats_buf->mpdu_cnt);
  914. DP_PRINT_STATS("msdu_cnt = %u",
  915. dp_stats_buf->msdu_cnt);
  916. DP_PRINT_STATS("pause_bitmap = %u",
  917. dp_stats_buf->pause_bitmap);
  918. DP_PRINT_STATS("block_bitmap = %u",
  919. dp_stats_buf->block_bitmap);
  920. DP_PRINT_STATS("current_timestamp = %u\n",
  921. dp_stats_buf->current_timestamp);
  922. DP_PRINT_STATS("inactive_time = %u",
  923. dp_stats_buf->inactive_time);
  924. }
  925. /**
  926. * dp_print_peer_details_tlv() - display htt_peer_details_tlv
  927. * @tag_buf: buffer containing the tlv htt_peer_details_tlv
  928. *
  929. * Return: void
  930. */
  931. static void dp_print_peer_details_tlv(uint32_t *tag_buf)
  932. {
  933. htt_peer_details_tlv *dp_stats_buf =
  934. (htt_peer_details_tlv *)tag_buf;
  935. DP_PRINT_STATS("HTT_PEER_DETAILS_TLV:");
  936. DP_PRINT_STATS("peer_type = %u",
  937. dp_stats_buf->peer_type);
  938. DP_PRINT_STATS("sw_peer_id = %u",
  939. dp_stats_buf->sw_peer_id);
  940. DP_PRINT_STATS("vdev_pdev_ast_idx = %u",
  941. dp_stats_buf->vdev_pdev_ast_idx);
  942. DP_PRINT_STATS("mac_addr(upper 4 bytes) = %u",
  943. dp_stats_buf->mac_addr.mac_addr31to0);
  944. DP_PRINT_STATS("mac_addr(lower 2 bytes) = %u",
  945. dp_stats_buf->mac_addr.mac_addr47to32);
  946. DP_PRINT_STATS("peer_flags = %u",
  947. dp_stats_buf->peer_flags);
  948. DP_PRINT_STATS("qpeer_flags = %u\n",
  949. dp_stats_buf->qpeer_flags);
  950. }
  951. /**
  952. * dp_print_tx_peer_rate_stats_tlv() - display htt_tx_peer_rate_stats_tlv
  953. * @tag_buf: buffer containing the tlv htt_tx_peer_rate_stats_tlv
  954. *
  955. * Return: void
  956. */
  957. static void dp_print_tx_peer_rate_stats_tlv(uint32_t *tag_buf)
  958. {
  959. htt_tx_peer_rate_stats_tlv *dp_stats_buf =
  960. (htt_tx_peer_rate_stats_tlv *)tag_buf;
  961. uint8_t i, j;
  962. uint16_t index = 0;
  963. char *tx_gi[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0};
  964. char *tx_gi_ext[HTT_TX_PEER_STATS_NUM_GI_COUNTERS] = {0};
  965. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  966. if (!str_buf) {
  967. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  968. FL("Output buffer not allocated"));
  969. return;
  970. }
  971. for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) {
  972. tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  973. tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  974. if (!tx_gi[i] || !tx_gi_ext[i]) {
  975. dp_err("Unable to allocate buffer for tx_gi");
  976. goto fail1;
  977. }
  978. }
  979. DP_PRINT_STATS("HTT_TX_PEER_RATE_STATS_TLV:");
  980. DP_PRINT_STATS("tx_ldpc = %u",
  981. dp_stats_buf->tx_ldpc);
  982. DP_PRINT_STATS("rts_cnt = %u",
  983. dp_stats_buf->rts_cnt);
  984. DP_PRINT_STATS("ack_rssi = %u",
  985. dp_stats_buf->ack_rssi);
  986. index = 0;
  987. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  988. for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) {
  989. index += qdf_snprint(&str_buf[index],
  990. DP_MAX_STRING_LEN - index,
  991. " %u:%u,", i, dp_stats_buf->tx_mcs[i]);
  992. }
  993. for (i = 0; i < DP_HTT_TX_MCS_EXT_LEN; i++) {
  994. index += qdf_snprint(&str_buf[index],
  995. DP_MAX_STRING_LEN - index,
  996. " %u:%u,", i + DP_HTT_TX_MCS_LEN,
  997. dp_stats_buf->tx_mcs_ext[i]);
  998. }
  999. DP_PRINT_STATS("tx_mcs = %s ", str_buf);
  1000. index = 0;
  1001. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1002. for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) {
  1003. index += qdf_snprint(&str_buf[index],
  1004. DP_MAX_STRING_LEN - index,
  1005. " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
  1006. }
  1007. for (i = 0; i < DP_HTT_TX_SU_MCS_EXT_LEN; i++) {
  1008. index += qdf_snprint(&str_buf[index],
  1009. DP_MAX_STRING_LEN - index,
  1010. " %u:%u,", i + DP_HTT_TX_SU_MCS_LEN,
  1011. dp_stats_buf->tx_su_mcs_ext[i]);
  1012. }
  1013. DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
  1014. index = 0;
  1015. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1016. for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) {
  1017. index += qdf_snprint(&str_buf[index],
  1018. DP_MAX_STRING_LEN - index,
  1019. " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
  1020. }
  1021. for (i = 0; i < DP_HTT_TX_MU_MCS_EXT_LEN; i++) {
  1022. index += qdf_snprint(&str_buf[index],
  1023. DP_MAX_STRING_LEN - index,
  1024. " %u:%u,", i + DP_HTT_TX_MU_MCS_LEN,
  1025. dp_stats_buf->tx_mu_mcs_ext[i]);
  1026. }
  1027. DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
  1028. index = 0;
  1029. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1030. for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) {
  1031. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  1032. index += qdf_snprint(&str_buf[index],
  1033. DP_MAX_STRING_LEN - index,
  1034. " %u:%u,", (i + 1),
  1035. dp_stats_buf->tx_nss[i]);
  1036. }
  1037. DP_PRINT_STATS("tx_nss = %s ", str_buf);
  1038. index = 0;
  1039. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1040. for (i = 0; i < DP_HTT_TX_BW_LEN; i++) {
  1041. index += qdf_snprint(&str_buf[index],
  1042. DP_MAX_STRING_LEN - index,
  1043. " %u:%u,", i, dp_stats_buf->tx_bw[i]);
  1044. }
  1045. DP_PRINT_STATS("tx_bw = %s ", str_buf);
  1046. index = 0;
  1047. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1048. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  1049. index += qdf_snprint(&str_buf[index],
  1050. DP_MAX_STRING_LEN - index,
  1051. " %u:%u,", i, dp_stats_buf->tx_stbc[i]);
  1052. }
  1053. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
  1054. index += qdf_snprint(&str_buf[index],
  1055. DP_MAX_STRING_LEN - index,
  1056. " %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
  1057. dp_stats_buf->tx_stbc_ext[i]);
  1058. }
  1059. DP_PRINT_STATS("tx_stbc = %s ", str_buf);
  1060. index = 0;
  1061. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1062. for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) {
  1063. index += qdf_snprint(&str_buf[index],
  1064. DP_MAX_STRING_LEN - index,
  1065. " %u:%u,", i, dp_stats_buf->tx_pream[i]);
  1066. }
  1067. DP_PRINT_STATS("tx_pream = %s ", str_buf);
  1068. for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
  1069. index = 0;
  1070. for (i = 0; i < HTT_TX_PEER_STATS_NUM_MCS_COUNTERS; i++) {
  1071. index += qdf_snprint(&tx_gi[j][index],
  1072. DP_MAX_STRING_LEN - index,
  1073. " %u:%u,", i,
  1074. dp_stats_buf->tx_gi[j][i]);
  1075. }
  1076. DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
  1077. }
  1078. for (j = 0; j < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; j++) {
  1079. index = 0;
  1080. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
  1081. index += qdf_snprint(&tx_gi_ext[j][index],
  1082. DP_MAX_STRING_LEN - index,
  1083. " %u:%u,", i,
  1084. dp_stats_buf->tx_gi_ext[j][i]);
  1085. }
  1086. DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]);
  1087. }
  1088. index = 0;
  1089. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1090. for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) {
  1091. index += qdf_snprint(&str_buf[index],
  1092. DP_MAX_STRING_LEN - index,
  1093. " %u:%u,", i, dp_stats_buf->tx_dcm[i]);
  1094. }
  1095. DP_PRINT_STATS("tx_dcm = %s\n", str_buf);
  1096. fail1:
  1097. for (i = 0; i < HTT_TX_PEER_STATS_NUM_GI_COUNTERS; i++) {
  1098. if (tx_gi[i])
  1099. qdf_mem_free(tx_gi[i]);
  1100. if (tx_gi_ext[i])
  1101. qdf_mem_free(tx_gi_ext[i]);
  1102. }
  1103. qdf_mem_free(str_buf);
  1104. }
  1105. /**
  1106. * dp_print_rx_peer_rate_stats_tlv() - display htt_rx_peer_rate_stats_tlv
  1107. * @tag_buf: buffer containing the tlv htt_rx_peer_rate_stats_tlv
  1108. *
  1109. * Return: void
  1110. */
  1111. static void dp_print_rx_peer_rate_stats_tlv(uint32_t *tag_buf)
  1112. {
  1113. htt_rx_peer_rate_stats_tlv *dp_stats_buf =
  1114. (htt_rx_peer_rate_stats_tlv *)tag_buf;
  1115. uint8_t i, j;
  1116. uint16_t index = 0;
  1117. char *rssi_chain[DP_HTT_PEER_NUM_SS] = {0};
  1118. char *rx_gi[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0};
  1119. char *rx_gi_ext[HTT_RX_PEER_STATS_NUM_GI_COUNTERS] = {0};
  1120. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1121. if (!str_buf) {
  1122. dp_stats_err("Output buffer not allocated");
  1123. return;
  1124. }
  1125. for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) {
  1126. rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1127. if (!rssi_chain[i]) {
  1128. dp_err("Unable to allocate buffer for rssi_chain");
  1129. goto fail1;
  1130. }
  1131. }
  1132. for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) {
  1133. rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1134. rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1135. if (!rx_gi[i] || !rx_gi_ext[i]) {
  1136. dp_err("Unable to allocate buffer for rx_gi");
  1137. goto fail1;
  1138. }
  1139. }
  1140. DP_PRINT_STATS("HTT_RX_PEER_RATE_STATS_TLV:");
  1141. DP_PRINT_STATS("nsts = %u",
  1142. dp_stats_buf->nsts);
  1143. DP_PRINT_STATS("rx_ldpc = %u",
  1144. dp_stats_buf->rx_ldpc);
  1145. DP_PRINT_STATS("rts_cnt = %u",
  1146. dp_stats_buf->rts_cnt);
  1147. DP_PRINT_STATS("rssi_mgmt = %u",
  1148. dp_stats_buf->rssi_mgmt);
  1149. DP_PRINT_STATS("rssi_data = %u",
  1150. dp_stats_buf->rssi_data);
  1151. DP_PRINT_STATS("rssi_comb = %u",
  1152. dp_stats_buf->rssi_comb);
  1153. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1154. for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) {
  1155. index += qdf_snprint(&str_buf[index],
  1156. DP_MAX_STRING_LEN - index,
  1157. " %u:%u,", i, dp_stats_buf->rx_mcs[i]);
  1158. }
  1159. for (i = 0; i < DP_HTT_RX_MCS_EXT_LEN; i++) {
  1160. index += qdf_snprint(&str_buf[index],
  1161. DP_MAX_STRING_LEN - index,
  1162. " %u:%u,", i + DP_HTT_RX_MCS_LEN,
  1163. dp_stats_buf->rx_mcs_ext[i]);
  1164. }
  1165. DP_PRINT_STATS("rx_mcs = %s ", str_buf);
  1166. index = 0;
  1167. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1168. for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) {
  1169. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  1170. index += qdf_snprint(&str_buf[index],
  1171. DP_MAX_STRING_LEN - index,
  1172. " %u:%u,", (i + 1),
  1173. dp_stats_buf->rx_nss[i]);
  1174. }
  1175. DP_PRINT_STATS("rx_nss = %s ", str_buf);
  1176. index = 0;
  1177. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1178. for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) {
  1179. index += qdf_snprint(&str_buf[index],
  1180. DP_MAX_STRING_LEN - index,
  1181. " %u:%u,", i, dp_stats_buf->rx_dcm[i]);
  1182. }
  1183. DP_PRINT_STATS("rx_dcm = %s ", str_buf);
  1184. index = 0;
  1185. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1186. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  1187. index += qdf_snprint(&str_buf[index],
  1188. DP_MAX_STRING_LEN - index,
  1189. " %u:%u,", i, dp_stats_buf->rx_stbc[i]);
  1190. }
  1191. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
  1192. index += qdf_snprint(&str_buf[index],
  1193. DP_MAX_STRING_LEN - index,
  1194. " %u:%u,", i + HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS,
  1195. dp_stats_buf->rx_stbc_ext[i]);
  1196. }
  1197. DP_PRINT_STATS("rx_stbc = %s ", str_buf);
  1198. index = 0;
  1199. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1200. for (i = 0; i < DP_HTT_RX_BW_LEN; i++) {
  1201. index += qdf_snprint(&str_buf[index],
  1202. DP_MAX_STRING_LEN - index,
  1203. " %u:%u,", i, dp_stats_buf->rx_bw[i]);
  1204. }
  1205. DP_PRINT_STATS("rx_bw = %s ", str_buf);
  1206. for (j = 0; j < DP_HTT_PEER_NUM_SS; j++) {
  1207. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1208. index = 0;
  1209. for (i = 0; i < HTT_RX_PEER_STATS_NUM_BW_COUNTERS; i++) {
  1210. index += qdf_snprint(&rssi_chain[j][index],
  1211. DP_MAX_STRING_LEN - index,
  1212. " %u:%u,", i,
  1213. dp_stats_buf->rssi_chain[j][i]);
  1214. }
  1215. DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
  1216. }
  1217. for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
  1218. index = 0;
  1219. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  1220. index += qdf_snprint(&rx_gi[j][index],
  1221. DP_MAX_STRING_LEN - index,
  1222. " %u:%u,", i,
  1223. dp_stats_buf->rx_gi[j][i]);
  1224. }
  1225. DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
  1226. }
  1227. for (j = 0; j < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; j++) {
  1228. index = 0;
  1229. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
  1230. index += qdf_snprint(&rx_gi_ext[j][index],
  1231. DP_MAX_STRING_LEN - index,
  1232. " %u:%u,", i,
  1233. dp_stats_buf->rx_gi_ext[j][i]);
  1234. }
  1235. DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]);
  1236. }
  1237. index = 0;
  1238. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  1239. for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) {
  1240. index += qdf_snprint(&str_buf[index],
  1241. DP_MAX_STRING_LEN - index,
  1242. " %u:%u,", i, dp_stats_buf->rx_pream[i]);
  1243. }
  1244. DP_PRINT_STATS("rx_pream = %s\n", str_buf);
  1245. fail1:
  1246. for (i = 0; i < DP_HTT_PEER_NUM_SS; i++) {
  1247. if (!rssi_chain[i])
  1248. break;
  1249. qdf_mem_free(rssi_chain[i]);
  1250. }
  1251. for (i = 0; i < HTT_RX_PEER_STATS_NUM_GI_COUNTERS; i++) {
  1252. if (rx_gi[i])
  1253. qdf_mem_free(rx_gi[i]);
  1254. if (rx_gi_ext[i])
  1255. qdf_mem_free(rx_gi_ext[i]);
  1256. }
  1257. qdf_mem_free(str_buf);
  1258. }
  1259. /**
  1260. * dp_print_tx_hwq_mu_mimo_sch_stats_tlv() - display htt_tx_hwq_mu_mimo_sch_stats
  1261. * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_sch_stats_tlv
  1262. *
  1263. * Return: void
  1264. */
  1265. static void dp_print_tx_hwq_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
  1266. {
  1267. htt_tx_hwq_mu_mimo_sch_stats_tlv *dp_stats_buf =
  1268. (htt_tx_hwq_mu_mimo_sch_stats_tlv *)tag_buf;
  1269. DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_SCH_STATS_TLV:");
  1270. DP_PRINT_STATS("mu_mimo_sch_posted = %u",
  1271. dp_stats_buf->mu_mimo_sch_posted);
  1272. DP_PRINT_STATS("mu_mimo_sch_failed = %u",
  1273. dp_stats_buf->mu_mimo_sch_failed);
  1274. DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
  1275. dp_stats_buf->mu_mimo_ppdu_posted);
  1276. }
  1277. /**
  1278. * dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv() - display htt_tx_hwq_mu_mimo_mpdu_stats
  1279. * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_mpdu_stats_tlv
  1280. *
  1281. * Return: void
  1282. */
  1283. static void dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
  1284. {
  1285. htt_tx_hwq_mu_mimo_mpdu_stats_tlv *dp_stats_buf =
  1286. (htt_tx_hwq_mu_mimo_mpdu_stats_tlv *)tag_buf;
  1287. DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_MPDU_STATS_TLV:");
  1288. DP_PRINT_STATS("mu_mimo_mpdus_queued_usr = %u",
  1289. dp_stats_buf->mu_mimo_mpdus_queued_usr);
  1290. DP_PRINT_STATS("mu_mimo_mpdus_tried_usr = %u",
  1291. dp_stats_buf->mu_mimo_mpdus_tried_usr);
  1292. DP_PRINT_STATS("mu_mimo_mpdus_failed_usr = %u",
  1293. dp_stats_buf->mu_mimo_mpdus_failed_usr);
  1294. DP_PRINT_STATS("mu_mimo_mpdus_requeued_usr = %u",
  1295. dp_stats_buf->mu_mimo_mpdus_requeued_usr);
  1296. DP_PRINT_STATS("mu_mimo_err_no_ba_usr = %u",
  1297. dp_stats_buf->mu_mimo_err_no_ba_usr);
  1298. DP_PRINT_STATS("mu_mimo_mpdu_underrun_usr = %u",
  1299. dp_stats_buf->mu_mimo_mpdu_underrun_usr);
  1300. DP_PRINT_STATS("mu_mimo_ampdu_underrun_usr = %u\n",
  1301. dp_stats_buf->mu_mimo_ampdu_underrun_usr);
  1302. }
  1303. /**
  1304. * dp_print_tx_hwq_mu_mimo_cmn_stats_tlv() - display htt_tx_hwq_mu_mimo_cmn_stats
  1305. * @tag_buf: buffer containing the tlv htt_tx_hwq_mu_mimo_cmn_stats_tlv
  1306. *
  1307. * Return: void
  1308. */
  1309. static inline void dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(uint32_t *tag_buf)
  1310. {
  1311. htt_tx_hwq_mu_mimo_cmn_stats_tlv *dp_stats_buf =
  1312. (htt_tx_hwq_mu_mimo_cmn_stats_tlv *)tag_buf;
  1313. DP_PRINT_STATS("HTT_TX_HWQ_MU_MIMO_CMN_STATS_TLV:");
  1314. DP_PRINT_STATS("mac_id__hwq_id__word = %u\n",
  1315. dp_stats_buf->mac_id__hwq_id__word);
  1316. }
  1317. /**
  1318. * dp_print_tx_hwq_stats_cmn_tlv() - display htt_tx_hwq_stats_cmn_tlv
  1319. * @tag_buf: buffer containing the tlv htt_tx_hwq_stats_cmn_tlv
  1320. *
  1321. * Return: void
  1322. */
  1323. static void dp_print_tx_hwq_stats_cmn_tlv(uint32_t *tag_buf)
  1324. {
  1325. htt_tx_hwq_stats_cmn_tlv *dp_stats_buf =
  1326. (htt_tx_hwq_stats_cmn_tlv *)tag_buf;
  1327. DP_PRINT_STATS("HTT_TX_HWQ_STATS_CMN_TLV:");
  1328. DP_PRINT_STATS("mac_id__hwq_id__word = %u",
  1329. dp_stats_buf->mac_id__hwq_id__word);
  1330. DP_PRINT_STATS("xretry = %u",
  1331. dp_stats_buf->xretry);
  1332. DP_PRINT_STATS("underrun_cnt = %u",
  1333. dp_stats_buf->underrun_cnt);
  1334. DP_PRINT_STATS("flush_cnt = %u",
  1335. dp_stats_buf->flush_cnt);
  1336. DP_PRINT_STATS("filt_cnt = %u",
  1337. dp_stats_buf->filt_cnt);
  1338. DP_PRINT_STATS("null_mpdu_bmap = %u",
  1339. dp_stats_buf->null_mpdu_bmap);
  1340. DP_PRINT_STATS("user_ack_failure = %u",
  1341. dp_stats_buf->user_ack_failure);
  1342. DP_PRINT_STATS("ack_tlv_proc = %u",
  1343. dp_stats_buf->ack_tlv_proc);
  1344. DP_PRINT_STATS("sched_id_proc = %u",
  1345. dp_stats_buf->sched_id_proc);
  1346. DP_PRINT_STATS("null_mpdu_tx_count = %u",
  1347. dp_stats_buf->null_mpdu_tx_count);
  1348. DP_PRINT_STATS("mpdu_bmap_not_recvd = %u",
  1349. dp_stats_buf->mpdu_bmap_not_recvd);
  1350. DP_PRINT_STATS("num_bar = %u",
  1351. dp_stats_buf->num_bar);
  1352. DP_PRINT_STATS("rts = %u",
  1353. dp_stats_buf->rts);
  1354. DP_PRINT_STATS("cts2self = %u",
  1355. dp_stats_buf->cts2self);
  1356. DP_PRINT_STATS("qos_null = %u",
  1357. dp_stats_buf->qos_null);
  1358. DP_PRINT_STATS("mpdu_tried_cnt = %u",
  1359. dp_stats_buf->mpdu_tried_cnt);
  1360. DP_PRINT_STATS("mpdu_queued_cnt = %u",
  1361. dp_stats_buf->mpdu_queued_cnt);
  1362. DP_PRINT_STATS("mpdu_ack_fail_cnt = %u",
  1363. dp_stats_buf->mpdu_ack_fail_cnt);
  1364. DP_PRINT_STATS("mpdu_filt_cnt = %u",
  1365. dp_stats_buf->mpdu_filt_cnt);
  1366. DP_PRINT_STATS("false_mpdu_ack_count = %u\n",
  1367. dp_stats_buf->false_mpdu_ack_count);
  1368. }
  1369. /**
  1370. * dp_print_tx_hwq_difs_latency_stats_tlv_v() -
  1371. * display htt_tx_hwq_difs_latency_stats_tlv_v
  1372. * @tag_buf: buffer containing the tlv htt_tx_hwq_difs_latency_stats_tlv_v
  1373. *
  1374. * Return: void
  1375. */
  1376. static void dp_print_tx_hwq_difs_latency_stats_tlv_v(uint32_t *tag_buf)
  1377. {
  1378. htt_tx_hwq_difs_latency_stats_tlv_v *dp_stats_buf =
  1379. (htt_tx_hwq_difs_latency_stats_tlv_v *)tag_buf;
  1380. uint8_t i;
  1381. uint16_t index = 0;
  1382. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1383. char *difs_latency_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1384. if (!difs_latency_hist) {
  1385. dp_stats_err("Output buffer not allocated");
  1386. return;
  1387. }
  1388. tag_len = qdf_min(tag_len,
  1389. (uint32_t)HTT_TX_HWQ_MAX_DIFS_LATENCY_BINS);
  1390. DP_PRINT_STATS("HTT_TX_HWQ_DIFS_LATENCY_STATS_TLV_V:");
  1391. DP_PRINT_STATS("hist_intvl = %u",
  1392. dp_stats_buf->hist_intvl);
  1393. for (i = 0; i < tag_len; i++) {
  1394. index += qdf_snprint(&difs_latency_hist[index],
  1395. DP_MAX_STRING_LEN - index,
  1396. " %u:%u,", i,
  1397. dp_stats_buf->difs_latency_hist[i]);
  1398. }
  1399. DP_PRINT_STATS("difs_latency_hist = %s\n", difs_latency_hist);
  1400. qdf_mem_free(difs_latency_hist);
  1401. }
  1402. /**
  1403. * dp_print_tx_hwq_cmd_result_stats_tlv_v() - display htt_tx_hwq_cmd_result_stats
  1404. * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_result_stats_tlv_v
  1405. *
  1406. * Return: void
  1407. */
  1408. static void dp_print_tx_hwq_cmd_result_stats_tlv_v(uint32_t *tag_buf)
  1409. {
  1410. htt_tx_hwq_cmd_result_stats_tlv_v *dp_stats_buf =
  1411. (htt_tx_hwq_cmd_result_stats_tlv_v *)tag_buf;
  1412. uint8_t i;
  1413. uint16_t index = 0;
  1414. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1415. char *cmd_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1416. if (!cmd_result) {
  1417. dp_stats_err("Output buffer not allocated");
  1418. return;
  1419. }
  1420. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_RESULT_STATS);
  1421. DP_PRINT_STATS("HTT_TX_HWQ_CMD_RESULT_STATS_TLV_V:");
  1422. for (i = 0; i < tag_len; i++) {
  1423. index += qdf_snprint(&cmd_result[index],
  1424. DP_MAX_STRING_LEN - index,
  1425. " %u:%u,", i, dp_stats_buf->cmd_result[i]);
  1426. }
  1427. DP_PRINT_STATS("cmd_result = %s ", cmd_result);
  1428. qdf_mem_free(cmd_result);
  1429. }
  1430. /**
  1431. * dp_print_tx_hwq_cmd_stall_stats_tlv_v() - display htt_tx_hwq_cmd_stall_stats_tlv
  1432. * @tag_buf: buffer containing the tlv htt_tx_hwq_cmd_stall_stats_tlv_v
  1433. *
  1434. * Return: void
  1435. */
  1436. static void dp_print_tx_hwq_cmd_stall_stats_tlv_v(uint32_t *tag_buf)
  1437. {
  1438. htt_tx_hwq_cmd_stall_stats_tlv_v *dp_stats_buf =
  1439. (htt_tx_hwq_cmd_stall_stats_tlv_v *)tag_buf;
  1440. uint8_t i;
  1441. uint16_t index = 0;
  1442. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1443. char *cmd_stall_status = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1444. if (!cmd_stall_status) {
  1445. dp_stats_err("Output buffer not allocated");
  1446. return;
  1447. }
  1448. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_CMD_STALL_STATS);
  1449. DP_PRINT_STATS("HTT_TX_HWQ_CMD_STALL_STATS_TLV_V:");
  1450. for (i = 0; i < tag_len; i++) {
  1451. index += qdf_snprint(&cmd_stall_status[index],
  1452. DP_MAX_STRING_LEN - index,
  1453. " %u:%u,", i,
  1454. dp_stats_buf->cmd_stall_status[i]);
  1455. }
  1456. DP_PRINT_STATS("cmd_stall_status = %s\n", cmd_stall_status);
  1457. qdf_mem_free(cmd_stall_status);
  1458. }
  1459. /**
  1460. * dp_print_tx_hwq_fes_result_stats_tlv_v() - display htt_tx_hwq_fes_result_stats
  1461. * @tag_buf: buffer containing the tlv htt_tx_hwq_fes_result_stats_tlv_v
  1462. *
  1463. * Return: void
  1464. */
  1465. static void dp_print_tx_hwq_fes_result_stats_tlv_v(uint32_t *tag_buf)
  1466. {
  1467. htt_tx_hwq_fes_result_stats_tlv_v *dp_stats_buf =
  1468. (htt_tx_hwq_fes_result_stats_tlv_v *)tag_buf;
  1469. uint8_t i;
  1470. uint16_t index = 0;
  1471. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  1472. char *fes_result = qdf_mem_malloc(DP_MAX_STRING_LEN);
  1473. if (!fes_result) {
  1474. dp_stats_err("Output buffer not allocated");
  1475. return;
  1476. }
  1477. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_HWQ_MAX_FES_RESULT_STATS);
  1478. DP_PRINT_STATS("HTT_TX_HWQ_FES_RESULT_STATS_TLV_V:");
  1479. for (i = 0; i < tag_len; i++) {
  1480. index += qdf_snprint(&fes_result[index],
  1481. DP_MAX_STRING_LEN - index,
  1482. " %u:%u,", i, dp_stats_buf->fes_result[i]);
  1483. }
  1484. DP_PRINT_STATS("fes_result = %s ", fes_result);
  1485. qdf_mem_free(fes_result);
  1486. }
  1487. /**
  1488. * dp_print_tx_selfgen_cmn_stats_tlv() - display htt_tx_selfgen_cmn_stats_tlv
  1489. * @tag_buf: buffer containing the tlv htt_tx_selfgen_cmn_stats_tlv
  1490. *
  1491. * Return: void
  1492. */
  1493. static void dp_print_tx_selfgen_cmn_stats_tlv(uint32_t *tag_buf)
  1494. {
  1495. htt_tx_selfgen_cmn_stats_tlv *dp_stats_buf =
  1496. (htt_tx_selfgen_cmn_stats_tlv *)tag_buf;
  1497. DP_PRINT_STATS("HTT_TX_SELFGEN_CMN_STATS_TLV:");
  1498. DP_PRINT_STATS("mac_id__word = %u",
  1499. dp_stats_buf->mac_id__word);
  1500. DP_PRINT_STATS("su_bar = %u",
  1501. dp_stats_buf->su_bar);
  1502. DP_PRINT_STATS("rts = %u",
  1503. dp_stats_buf->rts);
  1504. DP_PRINT_STATS("cts2self = %u",
  1505. dp_stats_buf->cts2self);
  1506. DP_PRINT_STATS("qos_null = %u",
  1507. dp_stats_buf->qos_null);
  1508. DP_PRINT_STATS("delayed_bar_1 = %u",
  1509. dp_stats_buf->delayed_bar_1);
  1510. DP_PRINT_STATS("delayed_bar_2 = %u",
  1511. dp_stats_buf->delayed_bar_2);
  1512. DP_PRINT_STATS("delayed_bar_3 = %u",
  1513. dp_stats_buf->delayed_bar_3);
  1514. DP_PRINT_STATS("delayed_bar_4 = %u",
  1515. dp_stats_buf->delayed_bar_4);
  1516. DP_PRINT_STATS("delayed_bar_5 = %u",
  1517. dp_stats_buf->delayed_bar_5);
  1518. DP_PRINT_STATS("delayed_bar_6 = %u",
  1519. dp_stats_buf->delayed_bar_6);
  1520. DP_PRINT_STATS("delayed_bar_7 = %u\n",
  1521. dp_stats_buf->delayed_bar_7);
  1522. }
  1523. /**
  1524. * dp_print_tx_selfgen_ac_stats_tlv() - display htt_tx_selfgen_ac_stats_tlv
  1525. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_stats_tlv
  1526. *
  1527. * Return: void
  1528. */
  1529. static void dp_print_tx_selfgen_ac_stats_tlv(uint32_t *tag_buf)
  1530. {
  1531. htt_tx_selfgen_ac_stats_tlv *dp_stats_buf =
  1532. (htt_tx_selfgen_ac_stats_tlv *)tag_buf;
  1533. DP_PRINT_STATS("HTT_TX_SELFGEN_AC_STATS_TLV:");
  1534. DP_PRINT_STATS("ac_su_ndpa = %u",
  1535. dp_stats_buf->ac_su_ndpa);
  1536. DP_PRINT_STATS("ac_su_ndp = %u",
  1537. dp_stats_buf->ac_su_ndp);
  1538. DP_PRINT_STATS("ac_mu_mimo_ndpa = %u",
  1539. dp_stats_buf->ac_mu_mimo_ndpa);
  1540. DP_PRINT_STATS("ac_mu_mimo_ndp = %u",
  1541. dp_stats_buf->ac_mu_mimo_ndp);
  1542. DP_PRINT_STATS("ac_mu_mimo_brpoll_1 = %u",
  1543. dp_stats_buf->ac_mu_mimo_brpoll_1);
  1544. DP_PRINT_STATS("ac_mu_mimo_brpoll_2 = %u",
  1545. dp_stats_buf->ac_mu_mimo_brpoll_2);
  1546. DP_PRINT_STATS("ac_mu_mimo_brpoll_3 = %u\n",
  1547. dp_stats_buf->ac_mu_mimo_brpoll_3);
  1548. }
  1549. /**
  1550. * dp_print_tx_selfgen_ax_stats_tlv() - display htt_tx_selfgen_ax_stats_tlv
  1551. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_stats_tlv
  1552. *
  1553. * Return: void
  1554. */
  1555. static void dp_print_tx_selfgen_ax_stats_tlv(uint32_t *tag_buf)
  1556. {
  1557. htt_tx_selfgen_ax_stats_tlv *dp_stats_buf =
  1558. (htt_tx_selfgen_ax_stats_tlv *)tag_buf;
  1559. DP_PRINT_STATS("HTT_TX_SELFGEN_AX_STATS_TLV:");
  1560. DP_PRINT_STATS("ax_su_ndpa = %u",
  1561. dp_stats_buf->ax_su_ndpa);
  1562. DP_PRINT_STATS("ax_su_ndp = %u",
  1563. dp_stats_buf->ax_su_ndp);
  1564. DP_PRINT_STATS("ax_mu_mimo_ndpa = %u",
  1565. dp_stats_buf->ax_mu_mimo_ndpa);
  1566. DP_PRINT_STATS("ax_mu_mimo_ndp = %u",
  1567. dp_stats_buf->ax_mu_mimo_ndp);
  1568. DP_PRINT_STATS("ax_mu_mimo_brpoll_1 = %u",
  1569. dp_stats_buf->ax_mu_mimo_brpoll_1);
  1570. DP_PRINT_STATS("ax_mu_mimo_brpoll_2 = %u",
  1571. dp_stats_buf->ax_mu_mimo_brpoll_2);
  1572. DP_PRINT_STATS("ax_mu_mimo_brpoll_3 = %u",
  1573. dp_stats_buf->ax_mu_mimo_brpoll_3);
  1574. DP_PRINT_STATS("ax_mu_mimo_brpoll_4 = %u",
  1575. dp_stats_buf->ax_mu_mimo_brpoll_4);
  1576. DP_PRINT_STATS("ax_mu_mimo_brpoll_5 = %u",
  1577. dp_stats_buf->ax_mu_mimo_brpoll_5);
  1578. DP_PRINT_STATS("ax_mu_mimo_brpoll_6 = %u",
  1579. dp_stats_buf->ax_mu_mimo_brpoll_6);
  1580. DP_PRINT_STATS("ax_mu_mimo_brpoll_7 = %u",
  1581. dp_stats_buf->ax_mu_mimo_brpoll_7);
  1582. DP_PRINT_STATS("ax_basic_trigger = %u",
  1583. dp_stats_buf->ax_basic_trigger);
  1584. DP_PRINT_STATS("ax_bsr_trigger = %u",
  1585. dp_stats_buf->ax_bsr_trigger);
  1586. DP_PRINT_STATS("ax_mu_bar_trigger = %u",
  1587. dp_stats_buf->ax_mu_bar_trigger);
  1588. DP_PRINT_STATS("ax_mu_rts_trigger = %u\n",
  1589. dp_stats_buf->ax_mu_rts_trigger);
  1590. }
  1591. /**
  1592. * dp_print_tx_selfgen_ac_err_stats_tlv() - display htt_tx_selfgen_ac_err_stats_tlv
  1593. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ac_err_stats_tlv
  1594. *
  1595. * Return: void
  1596. */
  1597. static void dp_print_tx_selfgen_ac_err_stats_tlv(uint32_t *tag_buf)
  1598. {
  1599. htt_tx_selfgen_ac_err_stats_tlv *dp_stats_buf =
  1600. (htt_tx_selfgen_ac_err_stats_tlv *)tag_buf;
  1601. DP_PRINT_STATS("HTT_TX_SELFGEN_AC_ERR_STATS_TLV:");
  1602. DP_PRINT_STATS("ac_su_ndp_err = %u",
  1603. dp_stats_buf->ac_su_ndp_err);
  1604. DP_PRINT_STATS("ac_su_ndpa_err = %u",
  1605. dp_stats_buf->ac_su_ndpa_err);
  1606. DP_PRINT_STATS("ac_mu_mimo_ndpa_err = %u",
  1607. dp_stats_buf->ac_mu_mimo_ndpa_err);
  1608. DP_PRINT_STATS("ac_mu_mimo_ndp_err = %u",
  1609. dp_stats_buf->ac_mu_mimo_ndp_err);
  1610. DP_PRINT_STATS("ac_mu_mimo_brp1_err = %u",
  1611. dp_stats_buf->ac_mu_mimo_brp1_err);
  1612. DP_PRINT_STATS("ac_mu_mimo_brp2_err = %u",
  1613. dp_stats_buf->ac_mu_mimo_brp2_err);
  1614. DP_PRINT_STATS("ac_mu_mimo_brp3_err = %u\n",
  1615. dp_stats_buf->ac_mu_mimo_brp3_err);
  1616. }
  1617. /* dp_print_tx_selfgen_be_err_stats_tlv: display htt_tx_selfgen_be_err_stats_tlv
  1618. * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_err_stats_tlv
  1619. *
  1620. * Return: void
  1621. */
  1622. static void dp_print_tx_selfgen_be_err_stats_tlv(uint32_t *tag_buf)
  1623. {
  1624. htt_tx_selfgen_be_err_stats_tlv *dp_stats_buf =
  1625. (htt_tx_selfgen_be_err_stats_tlv *)tag_buf;
  1626. uint16_t i;
  1627. DP_PRINT_STATS("HTT_TX_SELFGEN_BE_ERR_STATS_TLV:");
  1628. DP_PRINT_STATS("be_su_ndp_err = %u",
  1629. dp_stats_buf->be_su_ndp_err);
  1630. DP_PRINT_STATS("be_su_ndpa_err = %u",
  1631. dp_stats_buf->be_su_ndpa_err);
  1632. DP_PRINT_STATS("be_mu_mimo_ndpa_err = %u",
  1633. dp_stats_buf->be_mu_mimo_ndpa_err);
  1634. DP_PRINT_STATS("be_mu_mimo_ndp_err = %u",
  1635. dp_stats_buf->be_mu_mimo_ndp_err);
  1636. for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
  1637. DP_PRINT_STATS("be_mu_mimo_brp_err_%d: %u",
  1638. i, dp_stats_buf->be_mu_mimo_brp_err[i]);
  1639. DP_PRINT_STATS("be_basic_trigger_err = %u",
  1640. dp_stats_buf->be_basic_trigger_err);
  1641. DP_PRINT_STATS("be_bsr_trigger_err = %u",
  1642. dp_stats_buf->be_bsr_trigger_err);
  1643. DP_PRINT_STATS("be_mu_bar_trigger_err = %u",
  1644. dp_stats_buf->be_mu_bar_trigger_err);
  1645. DP_PRINT_STATS("be_mu_rts_trigger_err = %u",
  1646. dp_stats_buf->be_mu_rts_trigger_err);
  1647. DP_PRINT_STATS("be_ulmumimo_trigger_err = %u",
  1648. dp_stats_buf->be_ulmumimo_trigger_err);
  1649. for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
  1650. DP_PRINT_STATS("be_mu_mimo_brp_err_num_cbf_received _%d: %u", i,
  1651. dp_stats_buf->be_mu_mimo_brp_err_num_cbf_received[i]);
  1652. DP_PRINT_STATS("be_su_ndpa_flushed = %u",
  1653. dp_stats_buf->be_su_ndpa_flushed);
  1654. DP_PRINT_STATS("be_su_ndp_flushed = %u",
  1655. dp_stats_buf->be_su_ndp_flushed);
  1656. DP_PRINT_STATS("be_mu_mimo_ndpa_flushed = %u",
  1657. dp_stats_buf->be_mu_mimo_ndpa_flushed);
  1658. DP_PRINT_STATS("be_mu_mimo_ndp_flushed = %u",
  1659. dp_stats_buf->be_mu_mimo_ndp_flushed);
  1660. for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
  1661. DP_PRINT_STATS("be_mu_mimo_brpoll_flushed_%d: %u",
  1662. i, dp_stats_buf->be_mu_mimo_brpoll_flushed[i]);
  1663. for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
  1664. DP_PRINT_STATS("be_ul_mumimo_trigger_err_%d: %u",
  1665. i, dp_stats_buf->be_ul_mumimo_trigger_err[i]);
  1666. }
  1667. /**
  1668. * dp_print_tx_selfgen_be_stats_tlv() - display htt_tx_selfgen_be_stats_tlv
  1669. * @tag_buf: buffer containing the tlv htt_tx_selfgen_be_stats_tlv
  1670. *
  1671. * Return: void
  1672. */
  1673. static void dp_print_tx_selfgen_be_stats_tlv(uint32_t *tag_buf)
  1674. {
  1675. htt_tx_selfgen_be_stats_tlv *dp_stats_buf =
  1676. (htt_tx_selfgen_be_stats_tlv *)tag_buf;
  1677. uint16_t i;
  1678. DP_PRINT_STATS("HTT_TX_SELFGEN_BE_STATS_TLV:");
  1679. DP_PRINT_STATS("be_su_ndpa = %u",
  1680. dp_stats_buf->be_su_ndpa);
  1681. DP_PRINT_STATS("be_su_ndp = %u",
  1682. dp_stats_buf->be_su_ndp);
  1683. DP_PRINT_STATS("be_mu_mimo_ndpa = %u",
  1684. dp_stats_buf->be_mu_mimo_ndpa);
  1685. DP_PRINT_STATS("be_mu_mimo_ndp = %u",
  1686. dp_stats_buf->be_mu_mimo_ndp);
  1687. for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
  1688. DP_PRINT_STATS("be_mu_mimo_brpoll_%d = %u",
  1689. i, dp_stats_buf->be_mu_mimo_brpoll[i]);
  1690. DP_PRINT_STATS("be_basic_trigger = %u",
  1691. dp_stats_buf->be_basic_trigger);
  1692. DP_PRINT_STATS("be_bsr_trigger = %u",
  1693. dp_stats_buf->be_bsr_trigger);
  1694. DP_PRINT_STATS("be_mu_bar_trigger = %u",
  1695. dp_stats_buf->be_mu_bar_trigger);
  1696. DP_PRINT_STATS("be_mu_rts_trigger = %u",
  1697. dp_stats_buf->be_mu_rts_trigger);
  1698. DP_PRINT_STATS("be_ulmumimo_trigger = %u",
  1699. dp_stats_buf->be_ulmumimo_trigger);
  1700. DP_PRINT_STATS("be_su_ndpa_queued = %u",
  1701. dp_stats_buf->be_su_ndpa_queued);
  1702. DP_PRINT_STATS("be_su_ndp_queued = %u",
  1703. dp_stats_buf->be_su_ndp_queued);
  1704. DP_PRINT_STATS("be_mu_mimo_ndpa_queued = %u",
  1705. dp_stats_buf->be_mu_mimo_ndpa_queued);
  1706. DP_PRINT_STATS("be_mu_mimo_ndp_queued = %u",
  1707. dp_stats_buf->be_mu_mimo_ndp_queued);
  1708. for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
  1709. DP_PRINT_STATS("be_mu_mimo_brpoll_queued_%d = %u",
  1710. i, dp_stats_buf->be_mu_mimo_brpoll_queued[i]);
  1711. for (i = 0; i < (HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS - 1); i++)
  1712. DP_PRINT_STATS("be_ul_mumimo_trigger_%d = %u",
  1713. i, dp_stats_buf->be_ul_mumimo_trigger[i]);
  1714. }
  1715. /**
  1716. * dp_print_tx_selfgen_ax_err_stats_tlv() - display htt_tx_selfgen_ax_err_stats_tlv
  1717. * @tag_buf: buffer containing the tlv htt_tx_selfgen_ax_err_stats_tlv
  1718. *
  1719. * Return: void
  1720. */
  1721. static void dp_print_tx_selfgen_ax_err_stats_tlv(uint32_t *tag_buf)
  1722. {
  1723. htt_tx_selfgen_ax_err_stats_tlv *dp_stats_buf =
  1724. (htt_tx_selfgen_ax_err_stats_tlv *)tag_buf;
  1725. DP_PRINT_STATS("HTT_TX_SELFGEN_AX_ERR_STATS_TLV:");
  1726. DP_PRINT_STATS("ax_su_ndp_err = %u",
  1727. dp_stats_buf->ax_su_ndp_err);
  1728. DP_PRINT_STATS("ax_su_ndpa_err = %u",
  1729. dp_stats_buf->ax_su_ndpa_err);
  1730. DP_PRINT_STATS("ax_mu_mimo_ndpa_err = %u",
  1731. dp_stats_buf->ax_mu_mimo_ndpa_err);
  1732. DP_PRINT_STATS("ax_mu_mimo_ndp_err = %u",
  1733. dp_stats_buf->ax_mu_mimo_ndp_err);
  1734. DP_PRINT_STATS("ax_mu_mimo_brp1_err = %u",
  1735. dp_stats_buf->ax_mu_mimo_brp1_err);
  1736. DP_PRINT_STATS("ax_mu_mimo_brp2_err = %u",
  1737. dp_stats_buf->ax_mu_mimo_brp2_err);
  1738. DP_PRINT_STATS("ax_mu_mimo_brp3_err = %u",
  1739. dp_stats_buf->ax_mu_mimo_brp3_err);
  1740. DP_PRINT_STATS("ax_mu_mimo_brp4_err = %u",
  1741. dp_stats_buf->ax_mu_mimo_brp4_err);
  1742. DP_PRINT_STATS("ax_mu_mimo_brp5_err = %u",
  1743. dp_stats_buf->ax_mu_mimo_brp5_err);
  1744. DP_PRINT_STATS("ax_mu_mimo_brp6_err = %u",
  1745. dp_stats_buf->ax_mu_mimo_brp6_err);
  1746. DP_PRINT_STATS("ax_mu_mimo_brp7_err = %u",
  1747. dp_stats_buf->ax_mu_mimo_brp7_err);
  1748. DP_PRINT_STATS("ax_basic_trigger_err = %u",
  1749. dp_stats_buf->ax_basic_trigger_err);
  1750. DP_PRINT_STATS("ax_bsr_trigger_err = %u",
  1751. dp_stats_buf->ax_bsr_trigger_err);
  1752. DP_PRINT_STATS("ax_mu_bar_trigger_err = %u",
  1753. dp_stats_buf->ax_mu_bar_trigger_err);
  1754. DP_PRINT_STATS("ax_mu_rts_trigger_err = %u\n",
  1755. dp_stats_buf->ax_mu_rts_trigger_err);
  1756. }
  1757. /**
  1758. * dp_print_tx_sounding_stats_tlv() - display htt_tx_sounding_stats_tlv
  1759. * @tag_buf: buffer containing the tlv htt_tx_soundig_stats_tlv
  1760. *
  1761. * Return: void
  1762. */
  1763. static void dp_print_tx_sounding_stats_tlv(uint32_t *tag_buf)
  1764. {
  1765. htt_tx_sounding_stats_tlv *dp_stats_buf =
  1766. (htt_tx_sounding_stats_tlv *)tag_buf;
  1767. uint16_t i;
  1768. uint16_t max_bw = HTT_TX_PDEV_STATS_NUM_BW_COUNTERS;
  1769. switch (dp_stats_buf->tx_sounding_mode) {
  1770. case HTT_TX_AC_SOUNDING_MODE:
  1771. DP_PRINT_STATS("\n HTT_TX_AC_SOUNDING_STATS_TLV: ");
  1772. DP_PRINT_STATS("ac_cbf_20 = IBF : %d, SU_SIFS : %d, "
  1773. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1774. dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
  1775. dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
  1776. dp_stats_buf->cbf_20[4]);
  1777. DP_PRINT_STATS("ac_cbf_40 = IBF : %d, SU_SIFS : %d, "
  1778. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1779. dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
  1780. dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
  1781. dp_stats_buf->cbf_40[4]);
  1782. DP_PRINT_STATS("ac_cbf_80 = IBF : %d, SU_SIFS : %d, "
  1783. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1784. dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
  1785. dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
  1786. dp_stats_buf->cbf_80[4]);
  1787. DP_PRINT_STATS("ac_cbf_160 = IBF : %d, SU_SIFS : %d, "
  1788. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1789. dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
  1790. dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
  1791. dp_stats_buf->cbf_160[4]);
  1792. for (i = 0;
  1793. i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS;
  1794. i++) {
  1795. DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
  1796. "40MHz : %d, 80MHz: %d, 160MHz: %d", i,
  1797. dp_stats_buf->sounding[(i * max_bw) + 0],
  1798. dp_stats_buf->sounding[(i * max_bw) + 1],
  1799. dp_stats_buf->sounding[(i * max_bw) + 2],
  1800. dp_stats_buf->sounding[(i * max_bw) + 3]);
  1801. }
  1802. break;
  1803. case HTT_TX_AX_SOUNDING_MODE:
  1804. DP_PRINT_STATS("\n HTT_TX_AX_SOUNDING_STATS_TLV: ");
  1805. DP_PRINT_STATS("ax_cbf_20 = IBF : %d, SU_SIFS : %d, "
  1806. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1807. dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
  1808. dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
  1809. dp_stats_buf->cbf_20[4]);
  1810. DP_PRINT_STATS("ax_cbf_40 = IBF : %d, SU_SIFS : %d, "
  1811. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1812. dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
  1813. dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
  1814. dp_stats_buf->cbf_40[4]);
  1815. DP_PRINT_STATS("ax_cbf_80 = IBF : %d, SU_SIFS : %d, "
  1816. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1817. dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
  1818. dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
  1819. dp_stats_buf->cbf_80[4]);
  1820. DP_PRINT_STATS("ax_cbf_160 = IBF : %d, SU_SIFS : %d, "
  1821. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1822. dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
  1823. dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
  1824. dp_stats_buf->cbf_160[4]);
  1825. for (i = 0;
  1826. i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS;
  1827. i++) {
  1828. DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
  1829. "40MHz : %d, 80MHz: %d, 160MHz: %d", i,
  1830. dp_stats_buf->sounding[(i * max_bw) + 0],
  1831. dp_stats_buf->sounding[(i * max_bw) + 1],
  1832. dp_stats_buf->sounding[(i * max_bw) + 2],
  1833. dp_stats_buf->sounding[(i * max_bw) + 3]);
  1834. }
  1835. break;
  1836. case HTT_TX_BE_SOUNDING_MODE:
  1837. DP_PRINT_STATS("\n HTT_TX_BE_SOUNDING_STATS_TLV: ");
  1838. DP_PRINT_STATS("be_cbf_20 = IBF : %d, SU_SIFS : %d, "
  1839. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1840. dp_stats_buf->cbf_20[0], dp_stats_buf->cbf_20[1],
  1841. dp_stats_buf->cbf_20[2], dp_stats_buf->cbf_20[3],
  1842. dp_stats_buf->cbf_20[4]);
  1843. DP_PRINT_STATS("be_cbf_40 = IBF : %d, SU_SIFS : %d, "
  1844. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1845. dp_stats_buf->cbf_40[0], dp_stats_buf->cbf_40[1],
  1846. dp_stats_buf->cbf_40[2], dp_stats_buf->cbf_40[3],
  1847. dp_stats_buf->cbf_40[4]);
  1848. DP_PRINT_STATS("be_cbf_80 = IBF : %d, SU_SIFS : %d, "
  1849. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1850. dp_stats_buf->cbf_80[0], dp_stats_buf->cbf_80[1],
  1851. dp_stats_buf->cbf_80[2], dp_stats_buf->cbf_80[3],
  1852. dp_stats_buf->cbf_80[4]);
  1853. DP_PRINT_STATS("be_cbf_160 = IBF : %d, SU_SIFS : %d, "
  1854. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1855. dp_stats_buf->cbf_160[0], dp_stats_buf->cbf_160[1],
  1856. dp_stats_buf->cbf_160[2], dp_stats_buf->cbf_160[3],
  1857. dp_stats_buf->cbf_160[4]);
  1858. DP_PRINT_STATS("be_cbf_320 = IBF : %d, SU_SIFS : %d, "
  1859. "SU_RBO : %d, MU_SIFS : %d, MU_RBO : %d:",
  1860. dp_stats_buf->cbf_320[0], dp_stats_buf->cbf_320[1],
  1861. dp_stats_buf->cbf_320[2], dp_stats_buf->cbf_320[3],
  1862. dp_stats_buf->cbf_320[4]);
  1863. for (i = 0;
  1864. i < HTT_TX_PDEV_STATS_NUM_BE_MUMIMO_USER_STATS;
  1865. i++) {
  1866. DP_PRINT_STATS("Sounding User %d = 20MHz: %d, "
  1867. "40MHz : %d, 80MHz: %d, 160MHz: %d, "
  1868. "320MHz: %d", i,
  1869. dp_stats_buf->sounding[(i * max_bw) + 0],
  1870. dp_stats_buf->sounding[(i * max_bw) + 1],
  1871. dp_stats_buf->sounding[(i * max_bw) + 2],
  1872. dp_stats_buf->sounding[(i * max_bw) + 3],
  1873. dp_stats_buf->sounding_320[i]);
  1874. }
  1875. break;
  1876. case HTT_TX_CMN_SOUNDING_MODE:
  1877. DP_PRINT_STATS("\n CV UPLOAD HANDLER STATS:");
  1878. DP_PRINT_STATS("cv_nc_mismatch_err : %u",
  1879. dp_stats_buf->cv_nc_mismatch_err);
  1880. DP_PRINT_STATS("cv_fcs_err : %u",
  1881. dp_stats_buf->cv_fcs_err);
  1882. DP_PRINT_STATS("cv_frag_idx_mismatch : %u",
  1883. dp_stats_buf->cv_frag_idx_mismatch);
  1884. DP_PRINT_STATS("cv_invalid_peer_id : %u",
  1885. dp_stats_buf->cv_invalid_peer_id);
  1886. DP_PRINT_STATS("cv_no_txbf_setup : %u",
  1887. dp_stats_buf->cv_no_txbf_setup);
  1888. DP_PRINT_STATS("cv_expiry_in_update : %u",
  1889. dp_stats_buf->cv_expiry_in_update);
  1890. DP_PRINT_STATS("cv_pkt_bw_exceed : %u",
  1891. dp_stats_buf->cv_pkt_bw_exceed);
  1892. DP_PRINT_STATS("cv_dma_not_done_err : %u",
  1893. dp_stats_buf->cv_dma_not_done_err);
  1894. DP_PRINT_STATS("cv_update_failed : %u\n",
  1895. dp_stats_buf->cv_update_failed);
  1896. DP_PRINT_STATS("\n CV QUERY STATS:");
  1897. DP_PRINT_STATS("cv_total_query : %u",
  1898. dp_stats_buf->cv_total_query);
  1899. DP_PRINT_STATS("cv_total_pattern_query : %u",
  1900. dp_stats_buf->cv_total_pattern_query);
  1901. DP_PRINT_STATS("cv_total_bw_query : %u",
  1902. dp_stats_buf->cv_total_bw_query);
  1903. DP_PRINT_STATS("cv_total_query : %u",
  1904. dp_stats_buf->cv_total_query);
  1905. DP_PRINT_STATS("cv_invalid_bw_coding : %u",
  1906. dp_stats_buf->cv_invalid_bw_coding);
  1907. DP_PRINT_STATS("cv_forced_sounding : %u",
  1908. dp_stats_buf->cv_forced_sounding);
  1909. DP_PRINT_STATS("cv_standalone_sounding : %u",
  1910. dp_stats_buf->cv_standalone_sounding);
  1911. DP_PRINT_STATS("cv_nc_mismatch : %u",
  1912. dp_stats_buf->cv_nc_mismatch);
  1913. DP_PRINT_STATS("cv_fb_type_mismatch : %u",
  1914. dp_stats_buf->cv_fb_type_mismatch);
  1915. DP_PRINT_STATS("cv_ofdma_bw_mismatch : %u",
  1916. dp_stats_buf->cv_ofdma_bw_mismatch);
  1917. DP_PRINT_STATS("cv_bw_mismatch : %u",
  1918. dp_stats_buf->cv_bw_mismatch);
  1919. DP_PRINT_STATS("cv_pattern_mismatch : %u",
  1920. dp_stats_buf->cv_pattern_mismatch);
  1921. DP_PRINT_STATS("cv_preamble_mismatch : %u",
  1922. dp_stats_buf->cv_preamble_mismatch);
  1923. DP_PRINT_STATS("cv_nr_mismatch : %u",
  1924. dp_stats_buf->cv_nr_mismatch);
  1925. DP_PRINT_STATS("cv_in_use_cnt_exceeded : %u",
  1926. dp_stats_buf->cv_in_use_cnt_exceeded);
  1927. DP_PRINT_STATS("cv_found : %u",
  1928. dp_stats_buf->cv_found);
  1929. DP_PRINT_STATS("cv_not found : %u",
  1930. dp_stats_buf->cv_not_found);
  1931. DP_PRINT_STATS("cv_ntbr_sounding : %u",
  1932. dp_stats_buf->cv_ntbr_sounding);
  1933. DP_PRINT_STATS("cv_found_upload_in_progress: %u",
  1934. dp_stats_buf->cv_found_upload_in_progress);
  1935. DP_PRINT_STATS("cv_expired_during_query : %u\n",
  1936. dp_stats_buf->cv_expired_during_query);
  1937. break;
  1938. default:
  1939. break;
  1940. }
  1941. }
  1942. /**
  1943. * dp_print_tx_pdev_mu_mimo_sch_stats_tlv() - display htt_tx_pdev_mu_mimo_sch_stats
  1944. * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_sch_stats_tlv
  1945. *
  1946. * Return: void
  1947. */
  1948. static void dp_print_tx_pdev_mu_mimo_sch_stats_tlv(uint32_t *tag_buf)
  1949. {
  1950. uint8_t i;
  1951. htt_tx_pdev_mu_mimo_sch_stats_tlv *dp_stats_buf =
  1952. (htt_tx_pdev_mu_mimo_sch_stats_tlv *)tag_buf;
  1953. DP_PRINT_STATS("HTT_TX_PDEV_MU_MIMO_SCH_STATS_TLV:");
  1954. DP_PRINT_STATS("mu_mimo_sch_posted = %u",
  1955. dp_stats_buf->mu_mimo_sch_posted);
  1956. DP_PRINT_STATS("mu_mimo_sch_failed = %u",
  1957. dp_stats_buf->mu_mimo_sch_failed);
  1958. DP_PRINT_STATS("mu_mimo_ppdu_posted = %u\n",
  1959. dp_stats_buf->mu_mimo_ppdu_posted);
  1960. DP_PRINT_STATS("11ac MU_MIMO SCH STATS:");
  1961. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS; i++) {
  1962. DP_PRINT_STATS("ac_mu_mimo_sch_nusers_%u = %u", i,
  1963. dp_stats_buf->ac_mu_mimo_sch_nusers[i]);
  1964. }
  1965. DP_PRINT_STATS("\n11ax MU_MIMO SCH STATS:");
  1966. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
  1967. DP_PRINT_STATS("ax_mu_mimo_sch_nusers_%u = %u", i,
  1968. dp_stats_buf->ax_mu_mimo_sch_nusers[i]);
  1969. }
  1970. DP_PRINT_STATS("\n11ax OFDMA SCH STATS:");
  1971. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS; i++) {
  1972. DP_PRINT_STATS("ax_ofdma_sch_nusers_%u = %u", i,
  1973. dp_stats_buf->ax_ofdma_sch_nusers[i]);
  1974. }
  1975. }
  1976. /**
  1977. * dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv() - display
  1978. * htt_tx_pdev_mu_mimo_mpdu_stats_tlv
  1979. * @tag_buf: buffer containing the tlv htt_tx_pdev_mu_mimo_mpdu_stats_tlv
  1980. *
  1981. * Return: void
  1982. */
  1983. static void dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(uint32_t *tag_buf)
  1984. {
  1985. htt_tx_pdev_mpdu_stats_tlv *dp_stats_buf =
  1986. (htt_tx_pdev_mpdu_stats_tlv *)tag_buf;
  1987. if (dp_stats_buf->tx_sched_mode ==
  1988. HTT_STATS_TX_SCHED_MODE_MU_MIMO_AC) {
  1989. if (!dp_stats_buf->user_index)
  1990. DP_PRINT_STATS(
  1991. "HTT_TX_PDEV_MU_MIMO_AC_MPDU_STATS:\n");
  1992. if (dp_stats_buf->user_index <
  1993. HTT_TX_PDEV_STATS_NUM_AC_MUMIMO_USER_STATS) {
  1994. DP_PRINT_STATS(
  1995. "ac_mu_mimo_mpdus_queued_usr_%u = %u",
  1996. dp_stats_buf->user_index,
  1997. dp_stats_buf->mpdus_queued_usr);
  1998. DP_PRINT_STATS(
  1999. "ac_mu_mimo_mpdus_tried_usr_%u = %u",
  2000. dp_stats_buf->user_index,
  2001. dp_stats_buf->mpdus_tried_usr);
  2002. DP_PRINT_STATS(
  2003. "ac_mu_mimo_mpdus_failed_usr_%u = %u",
  2004. dp_stats_buf->user_index,
  2005. dp_stats_buf->mpdus_failed_usr);
  2006. DP_PRINT_STATS(
  2007. "ac_mu_mimo_mpdus_requeued_usr_%u = %u",
  2008. dp_stats_buf->user_index,
  2009. dp_stats_buf->mpdus_requeued_usr);
  2010. DP_PRINT_STATS(
  2011. "ac_mu_mimo_err_no_ba_usr_%u = %u",
  2012. dp_stats_buf->user_index,
  2013. dp_stats_buf->err_no_ba_usr);
  2014. DP_PRINT_STATS(
  2015. "ac_mu_mimo_mpdu_underrun_usr_%u = %u",
  2016. dp_stats_buf->user_index,
  2017. dp_stats_buf->mpdu_underrun_usr);
  2018. DP_PRINT_STATS(
  2019. "ac_mu_mimo_ampdu_underrun_usr_%u = %u\n",
  2020. dp_stats_buf->user_index,
  2021. dp_stats_buf->ampdu_underrun_usr);
  2022. }
  2023. }
  2024. if (dp_stats_buf->tx_sched_mode == HTT_STATS_TX_SCHED_MODE_MU_MIMO_AX) {
  2025. if (!dp_stats_buf->user_index)
  2026. DP_PRINT_STATS(
  2027. "HTT_TX_PDEV_MU_MIMO_AX_MPDU_STATS:\n");
  2028. if (dp_stats_buf->user_index <
  2029. HTT_TX_PDEV_STATS_NUM_AX_MUMIMO_USER_STATS) {
  2030. DP_PRINT_STATS(
  2031. "ax_mu_mimo_mpdus_queued_usr_%u = %u",
  2032. dp_stats_buf->user_index,
  2033. dp_stats_buf->mpdus_queued_usr);
  2034. DP_PRINT_STATS(
  2035. "ax_mu_mimo_mpdus_tried_usr_%u = %u",
  2036. dp_stats_buf->user_index,
  2037. dp_stats_buf->mpdus_tried_usr);
  2038. DP_PRINT_STATS(
  2039. "ax_mu_mimo_mpdus_failed_usr_%u = %u",
  2040. dp_stats_buf->user_index,
  2041. dp_stats_buf->mpdus_failed_usr);
  2042. DP_PRINT_STATS(
  2043. "ax_mu_mimo_mpdus_requeued_usr_%u = %u",
  2044. dp_stats_buf->user_index,
  2045. dp_stats_buf->mpdus_requeued_usr);
  2046. DP_PRINT_STATS(
  2047. "ax_mu_mimo_err_no_ba_usr_%u = %u",
  2048. dp_stats_buf->user_index,
  2049. dp_stats_buf->err_no_ba_usr);
  2050. DP_PRINT_STATS(
  2051. "ax_mu_mimo_mpdu_underrun_usr_%u = %u",
  2052. dp_stats_buf->user_index,
  2053. dp_stats_buf->mpdu_underrun_usr);
  2054. DP_PRINT_STATS(
  2055. "ax_mu_mimo_ampdu_underrun_usr_%u = %u\n",
  2056. dp_stats_buf->user_index,
  2057. dp_stats_buf->ampdu_underrun_usr);
  2058. }
  2059. }
  2060. if (dp_stats_buf->tx_sched_mode ==
  2061. HTT_STATS_TX_SCHED_MODE_MU_OFDMA_AX) {
  2062. if (!dp_stats_buf->user_index)
  2063. DP_PRINT_STATS(
  2064. "HTT_TX_PDEV_AX_MU_OFDMA_MPDU_STATS:\n");
  2065. if (dp_stats_buf->user_index <
  2066. HTT_TX_PDEV_STATS_NUM_OFDMA_USER_STATS) {
  2067. DP_PRINT_STATS(
  2068. "ax_mu_ofdma_mpdus_queued_usr_%u = %u",
  2069. dp_stats_buf->user_index,
  2070. dp_stats_buf->mpdus_queued_usr);
  2071. DP_PRINT_STATS(
  2072. "ax_mu_ofdma_mpdus_tried_usr_%u = %u",
  2073. dp_stats_buf->user_index,
  2074. dp_stats_buf->mpdus_tried_usr);
  2075. DP_PRINT_STATS(
  2076. "ax_mu_ofdma_mpdus_failed_usr_%u = %u",
  2077. dp_stats_buf->user_index,
  2078. dp_stats_buf->mpdus_failed_usr);
  2079. DP_PRINT_STATS(
  2080. "ax_mu_ofdma_mpdus_requeued_usr_%u = %u",
  2081. dp_stats_buf->user_index,
  2082. dp_stats_buf->mpdus_requeued_usr);
  2083. DP_PRINT_STATS(
  2084. "ax_mu_ofdma_err_no_ba_usr_%u = %u",
  2085. dp_stats_buf->user_index,
  2086. dp_stats_buf->err_no_ba_usr);
  2087. DP_PRINT_STATS(
  2088. "ax_mu_ofdma_mpdu_underrun_usr_%u = %u",
  2089. dp_stats_buf->user_index,
  2090. dp_stats_buf->mpdu_underrun_usr);
  2091. DP_PRINT_STATS(
  2092. "ax_mu_ofdma_ampdu_underrun_usr_%u = %u\n",
  2093. dp_stats_buf->user_index,
  2094. dp_stats_buf->ampdu_underrun_usr);
  2095. }
  2096. }
  2097. }
  2098. /**
  2099. * dp_print_sched_txq_cmd_posted_tlv_v() - display htt_sched_txq_cmd_posted_tlv_v
  2100. * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_posted_tlv_v
  2101. *
  2102. * Return: void
  2103. */
  2104. static void dp_print_sched_txq_cmd_posted_tlv_v(uint32_t *tag_buf)
  2105. {
  2106. htt_sched_txq_cmd_posted_tlv_v *dp_stats_buf =
  2107. (htt_sched_txq_cmd_posted_tlv_v *)tag_buf;
  2108. uint8_t i;
  2109. uint16_t index = 0;
  2110. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2111. char *sched_cmd_posted = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2112. if (!sched_cmd_posted) {
  2113. dp_stats_err("Output buffer not allocated");
  2114. return;
  2115. }
  2116. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
  2117. DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_POSTED_TLV_V:");
  2118. for (i = 0; i < tag_len; i++) {
  2119. index += qdf_snprint(&sched_cmd_posted[index],
  2120. DP_MAX_STRING_LEN - index,
  2121. " %u:%u,", i,
  2122. dp_stats_buf->sched_cmd_posted[i]);
  2123. }
  2124. DP_PRINT_STATS("sched_cmd_posted = %s\n", sched_cmd_posted);
  2125. qdf_mem_free(sched_cmd_posted);
  2126. }
  2127. /**
  2128. * dp_print_sched_txq_cmd_reaped_tlv_v() - display htt_sched_txq_cmd_reaped_tlv_v
  2129. * @tag_buf: buffer containing the tlv htt_sched_txq_cmd_reaped_tlv_v
  2130. *
  2131. * Return: void
  2132. */
  2133. static void dp_print_sched_txq_cmd_reaped_tlv_v(uint32_t *tag_buf)
  2134. {
  2135. htt_sched_txq_cmd_reaped_tlv_v *dp_stats_buf =
  2136. (htt_sched_txq_cmd_reaped_tlv_v *)tag_buf;
  2137. uint8_t i;
  2138. uint16_t index = 0;
  2139. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2140. char *sched_cmd_reaped = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2141. if (!sched_cmd_reaped) {
  2142. dp_stats_err("Output buffer not allocated");
  2143. return;
  2144. }
  2145. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_SCHED_TX_MODE_MAX);
  2146. DP_PRINT_STATS("HTT_SCHED_TXQ_CMD_REAPED_TLV_V:");
  2147. for (i = 0; i < tag_len; i++) {
  2148. index += qdf_snprint(&sched_cmd_reaped[index],
  2149. DP_MAX_STRING_LEN - index,
  2150. " %u:%u,", i,
  2151. dp_stats_buf->sched_cmd_reaped[i]);
  2152. }
  2153. DP_PRINT_STATS("sched_cmd_reaped = %s\n", sched_cmd_reaped);
  2154. qdf_mem_free(sched_cmd_reaped);
  2155. }
  2156. /**
  2157. * dp_print_tx_pdev_stats_sched_per_txq_tlv() - display
  2158. * htt_tx_pdev_stats_sched_per_txq_tlv
  2159. * @tag_buf: buffer containing the tlv htt_tx_pdev_stats_sched_per_txq_tlv
  2160. *
  2161. * Return: void
  2162. */
  2163. static void dp_print_tx_pdev_stats_sched_per_txq_tlv(uint32_t *tag_buf)
  2164. {
  2165. htt_tx_pdev_stats_sched_per_txq_tlv *dp_stats_buf =
  2166. (htt_tx_pdev_stats_sched_per_txq_tlv *)tag_buf;
  2167. DP_PRINT_STATS("HTT_TX_PDEV_STATS_SCHED_PER_TXQ_TLV:");
  2168. DP_PRINT_STATS("mac_id__txq_id__word = %u",
  2169. dp_stats_buf->mac_id__txq_id__word);
  2170. DP_PRINT_STATS("sched_policy = %u",
  2171. dp_stats_buf->sched_policy);
  2172. DP_PRINT_STATS("last_sched_cmd_posted_timestamp = %u",
  2173. dp_stats_buf->last_sched_cmd_posted_timestamp);
  2174. DP_PRINT_STATS("last_sched_cmd_compl_timestamp = %u",
  2175. dp_stats_buf->last_sched_cmd_compl_timestamp);
  2176. DP_PRINT_STATS("sched_2_tac_lwm_count = %u",
  2177. dp_stats_buf->sched_2_tac_lwm_count);
  2178. DP_PRINT_STATS("sched_2_tac_ring_full = %u",
  2179. dp_stats_buf->sched_2_tac_ring_full);
  2180. DP_PRINT_STATS("sched_cmd_post_failure = %u",
  2181. dp_stats_buf->sched_cmd_post_failure);
  2182. DP_PRINT_STATS("num_active_tids = %u",
  2183. dp_stats_buf->num_active_tids);
  2184. DP_PRINT_STATS("num_ps_schedules = %u",
  2185. dp_stats_buf->num_ps_schedules);
  2186. DP_PRINT_STATS("sched_cmds_pending = %u",
  2187. dp_stats_buf->sched_cmds_pending);
  2188. DP_PRINT_STATS("num_tid_register = %u",
  2189. dp_stats_buf->num_tid_register);
  2190. DP_PRINT_STATS("num_tid_unregister = %u",
  2191. dp_stats_buf->num_tid_unregister);
  2192. DP_PRINT_STATS("num_qstats_queried = %u",
  2193. dp_stats_buf->num_qstats_queried);
  2194. DP_PRINT_STATS("qstats_update_pending = %u",
  2195. dp_stats_buf->qstats_update_pending);
  2196. DP_PRINT_STATS("last_qstats_query_timestamp = %u",
  2197. dp_stats_buf->last_qstats_query_timestamp);
  2198. DP_PRINT_STATS("num_tqm_cmdq_full = %u",
  2199. dp_stats_buf->num_tqm_cmdq_full);
  2200. DP_PRINT_STATS("num_de_sched_algo_trigger = %u",
  2201. dp_stats_buf->num_de_sched_algo_trigger);
  2202. DP_PRINT_STATS("num_rt_sched_algo_trigger = %u",
  2203. dp_stats_buf->num_rt_sched_algo_trigger);
  2204. DP_PRINT_STATS("num_tqm_sched_algo_trigger = %u",
  2205. dp_stats_buf->num_tqm_sched_algo_trigger);
  2206. DP_PRINT_STATS("notify_sched = %u\n",
  2207. dp_stats_buf->notify_sched);
  2208. }
  2209. /**
  2210. * dp_print_stats_tx_sched_cmn_tlv() - display htt_stats_tx_sched_cmn_tlv
  2211. * @tag_buf: buffer containing the tlv htt_stats_tx_sched_cmn_tlv
  2212. *
  2213. * Return: void
  2214. */
  2215. static void dp_print_stats_tx_sched_cmn_tlv(uint32_t *tag_buf)
  2216. {
  2217. htt_stats_tx_sched_cmn_tlv *dp_stats_buf =
  2218. (htt_stats_tx_sched_cmn_tlv *)tag_buf;
  2219. DP_PRINT_STATS("HTT_STATS_TX_SCHED_CMN_TLV:");
  2220. DP_PRINT_STATS("mac_id__word = %u",
  2221. dp_stats_buf->mac_id__word);
  2222. DP_PRINT_STATS("current_timestamp = %u\n",
  2223. dp_stats_buf->current_timestamp);
  2224. }
  2225. /**
  2226. * dp_print_tx_tqm_gen_mpdu_stats_tlv_v() - display htt_tx_tqm_gen_mpdu_stats_tlv_v
  2227. * @tag_buf: buffer containing the tlv htt_tx_tqm_gen_mpdu_stats_tlv_v
  2228. *
  2229. * Return: void
  2230. */
  2231. static void dp_print_tx_tqm_gen_mpdu_stats_tlv_v(uint32_t *tag_buf)
  2232. {
  2233. htt_tx_tqm_gen_mpdu_stats_tlv_v *dp_stats_buf =
  2234. (htt_tx_tqm_gen_mpdu_stats_tlv_v *)tag_buf;
  2235. uint8_t i;
  2236. uint16_t index = 0;
  2237. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2238. char *gen_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2239. if (!gen_mpdu_end_reason) {
  2240. dp_stats_err("Output buffer not allocated");
  2241. return;
  2242. }
  2243. tag_len = qdf_min(tag_len,
  2244. (uint32_t)HTT_TX_TQM_MAX_GEN_MPDU_END_REASON);
  2245. DP_PRINT_STATS("HTT_TX_TQM_GEN_MPDU_STATS_TLV_V:");
  2246. for (i = 0; i < tag_len; i++) {
  2247. index += qdf_snprint(&gen_mpdu_end_reason[index],
  2248. DP_MAX_STRING_LEN - index,
  2249. " %u:%u,", i,
  2250. dp_stats_buf->gen_mpdu_end_reason[i]);
  2251. }
  2252. DP_PRINT_STATS("gen_mpdu_end_reason = %s\n", gen_mpdu_end_reason);
  2253. qdf_mem_free(gen_mpdu_end_reason);
  2254. }
  2255. /**
  2256. * dp_print_tx_tqm_list_mpdu_stats_tlv_v() - display htt_tx_tqm_list_mpdu_stats_tlv
  2257. * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_stats_tlv_v
  2258. *
  2259. * Return: void
  2260. */
  2261. static void dp_print_tx_tqm_list_mpdu_stats_tlv_v(uint32_t *tag_buf)
  2262. {
  2263. htt_tx_tqm_list_mpdu_stats_tlv_v *dp_stats_buf =
  2264. (htt_tx_tqm_list_mpdu_stats_tlv_v *)tag_buf;
  2265. uint8_t i;
  2266. uint16_t index = 0;
  2267. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2268. char *list_mpdu_end_reason = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2269. if (!list_mpdu_end_reason) {
  2270. dp_stats_err("Output buffer not allocated");
  2271. return;
  2272. }
  2273. tag_len = qdf_min(tag_len,
  2274. (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_END_REASON);
  2275. DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_STATS_TLV_V:");
  2276. for (i = 0; i < tag_len; i++) {
  2277. index += qdf_snprint(&list_mpdu_end_reason[index],
  2278. DP_MAX_STRING_LEN - index,
  2279. " %u:%u,", i,
  2280. dp_stats_buf->list_mpdu_end_reason[i]);
  2281. }
  2282. DP_PRINT_STATS("list_mpdu_end_reason = %s\n",
  2283. list_mpdu_end_reason);
  2284. qdf_mem_free(list_mpdu_end_reason);
  2285. }
  2286. /**
  2287. * dp_print_tx_tqm_list_mpdu_cnt_tlv_v() - display htt_tx_tqm_list_mpdu_cnt_tlv_v
  2288. * @tag_buf: buffer containing the tlv htt_tx_tqm_list_mpdu_cnt_tlv_v
  2289. *
  2290. * Return: void
  2291. */
  2292. static void dp_print_tx_tqm_list_mpdu_cnt_tlv_v(uint32_t *tag_buf)
  2293. {
  2294. htt_tx_tqm_list_mpdu_cnt_tlv_v *dp_stats_buf =
  2295. (htt_tx_tqm_list_mpdu_cnt_tlv_v *)tag_buf;
  2296. uint8_t i;
  2297. uint16_t index = 0;
  2298. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2299. char *list_mpdu_cnt_hist = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2300. if (!list_mpdu_cnt_hist) {
  2301. dp_stats_err("Output buffer not allocated");
  2302. return;
  2303. }
  2304. tag_len = qdf_min(tag_len,
  2305. (uint32_t)HTT_TX_TQM_MAX_LIST_MPDU_CNT_HISTOGRAM_BINS);
  2306. DP_PRINT_STATS("HTT_TX_TQM_LIST_MPDU_CNT_TLV_V:");
  2307. for (i = 0; i < tag_len; i++) {
  2308. index += qdf_snprint(&list_mpdu_cnt_hist[index],
  2309. DP_MAX_STRING_LEN - index,
  2310. " %u:%u,", i,
  2311. dp_stats_buf->list_mpdu_cnt_hist[i]);
  2312. }
  2313. DP_PRINT_STATS("list_mpdu_cnt_hist = %s\n", list_mpdu_cnt_hist);
  2314. qdf_mem_free(list_mpdu_cnt_hist);
  2315. }
  2316. /**
  2317. * dp_print_tx_tqm_pdev_stats_tlv_v() - display htt_tx_tqm_pdev_stats_tlv_v
  2318. * @tag_buf: buffer containing the tlv htt_tx_tqm_pdev_stats_tlv_v
  2319. *
  2320. * Return: void
  2321. */
  2322. static void dp_print_tx_tqm_pdev_stats_tlv_v(uint32_t *tag_buf)
  2323. {
  2324. htt_tx_tqm_pdev_stats_tlv_v *dp_stats_buf =
  2325. (htt_tx_tqm_pdev_stats_tlv_v *)tag_buf;
  2326. DP_PRINT_STATS("HTT_TX_TQM_PDEV_STATS_TLV_V:");
  2327. DP_PRINT_STATS("msdu_count = %u",
  2328. dp_stats_buf->msdu_count);
  2329. DP_PRINT_STATS("mpdu_count = %u",
  2330. dp_stats_buf->mpdu_count);
  2331. DP_PRINT_STATS("remove_msdu = %u",
  2332. dp_stats_buf->remove_msdu);
  2333. DP_PRINT_STATS("remove_mpdu = %u",
  2334. dp_stats_buf->remove_mpdu);
  2335. DP_PRINT_STATS("remove_msdu_ttl = %u",
  2336. dp_stats_buf->remove_msdu_ttl);
  2337. DP_PRINT_STATS("send_bar = %u",
  2338. dp_stats_buf->send_bar);
  2339. DP_PRINT_STATS("bar_sync = %u",
  2340. dp_stats_buf->bar_sync);
  2341. DP_PRINT_STATS("notify_mpdu = %u",
  2342. dp_stats_buf->notify_mpdu);
  2343. DP_PRINT_STATS("sync_cmd = %u",
  2344. dp_stats_buf->sync_cmd);
  2345. DP_PRINT_STATS("write_cmd = %u",
  2346. dp_stats_buf->write_cmd);
  2347. DP_PRINT_STATS("hwsch_trigger = %u",
  2348. dp_stats_buf->hwsch_trigger);
  2349. DP_PRINT_STATS("ack_tlv_proc = %u",
  2350. dp_stats_buf->ack_tlv_proc);
  2351. DP_PRINT_STATS("gen_mpdu_cmd = %u",
  2352. dp_stats_buf->gen_mpdu_cmd);
  2353. DP_PRINT_STATS("gen_list_cmd = %u",
  2354. dp_stats_buf->gen_list_cmd);
  2355. DP_PRINT_STATS("remove_mpdu_cmd = %u",
  2356. dp_stats_buf->remove_mpdu_cmd);
  2357. DP_PRINT_STATS("remove_mpdu_tried_cmd = %u",
  2358. dp_stats_buf->remove_mpdu_tried_cmd);
  2359. DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
  2360. dp_stats_buf->mpdu_queue_stats_cmd);
  2361. DP_PRINT_STATS("mpdu_head_info_cmd = %u",
  2362. dp_stats_buf->mpdu_head_info_cmd);
  2363. DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
  2364. dp_stats_buf->msdu_flow_stats_cmd);
  2365. DP_PRINT_STATS("remove_msdu_cmd = %u",
  2366. dp_stats_buf->remove_msdu_cmd);
  2367. DP_PRINT_STATS("remove_msdu_ttl_cmd = %u",
  2368. dp_stats_buf->remove_msdu_ttl_cmd);
  2369. DP_PRINT_STATS("flush_cache_cmd = %u",
  2370. dp_stats_buf->flush_cache_cmd);
  2371. DP_PRINT_STATS("update_mpduq_cmd = %u",
  2372. dp_stats_buf->update_mpduq_cmd);
  2373. DP_PRINT_STATS("enqueue = %u",
  2374. dp_stats_buf->enqueue);
  2375. DP_PRINT_STATS("enqueue_notify = %u",
  2376. dp_stats_buf->enqueue_notify);
  2377. DP_PRINT_STATS("notify_mpdu_at_head = %u",
  2378. dp_stats_buf->notify_mpdu_at_head);
  2379. DP_PRINT_STATS("notify_mpdu_state_valid = %u\n",
  2380. dp_stats_buf->notify_mpdu_state_valid);
  2381. }
  2382. /**
  2383. * dp_print_tx_tqm_cmn_stats_tlv() - display htt_tx_tqm_cmn_stats_tlv
  2384. * @tag_buf: buffer containing the tlv htt_tx_tqm_cmn_stats_tlv
  2385. *
  2386. * Return: void
  2387. */
  2388. static void dp_print_tx_tqm_cmn_stats_tlv(uint32_t *tag_buf)
  2389. {
  2390. htt_tx_tqm_cmn_stats_tlv *dp_stats_buf =
  2391. (htt_tx_tqm_cmn_stats_tlv *)tag_buf;
  2392. DP_PRINT_STATS("HTT_TX_TQM_CMN_STATS_TLV:");
  2393. DP_PRINT_STATS("mac_id__word = %u",
  2394. dp_stats_buf->mac_id__word);
  2395. DP_PRINT_STATS("max_cmdq_id = %u",
  2396. dp_stats_buf->max_cmdq_id);
  2397. DP_PRINT_STATS("list_mpdu_cnt_hist_intvl = %u",
  2398. dp_stats_buf->list_mpdu_cnt_hist_intvl);
  2399. DP_PRINT_STATS("add_msdu = %u",
  2400. dp_stats_buf->add_msdu);
  2401. DP_PRINT_STATS("q_empty = %u",
  2402. dp_stats_buf->q_empty);
  2403. DP_PRINT_STATS("q_not_empty = %u",
  2404. dp_stats_buf->q_not_empty);
  2405. DP_PRINT_STATS("drop_notification = %u",
  2406. dp_stats_buf->drop_notification);
  2407. DP_PRINT_STATS("desc_threshold = %u\n",
  2408. dp_stats_buf->desc_threshold);
  2409. }
  2410. /**
  2411. * dp_print_tx_tqm_error_stats_tlv() - display htt_tx_tqm_error_stats_tlv
  2412. * @tag_buf: buffer containing the tlv htt_tx_tqm_error_stats_tlv
  2413. *
  2414. * Return: void
  2415. */
  2416. static void dp_print_tx_tqm_error_stats_tlv(uint32_t *tag_buf)
  2417. {
  2418. htt_tx_tqm_error_stats_tlv *dp_stats_buf =
  2419. (htt_tx_tqm_error_stats_tlv *)tag_buf;
  2420. DP_PRINT_STATS("HTT_TX_TQM_ERROR_STATS_TLV:");
  2421. DP_PRINT_STATS("q_empty_failure = %u",
  2422. dp_stats_buf->q_empty_failure);
  2423. DP_PRINT_STATS("q_not_empty_failure = %u",
  2424. dp_stats_buf->q_not_empty_failure);
  2425. DP_PRINT_STATS("add_msdu_failure = %u\n",
  2426. dp_stats_buf->add_msdu_failure);
  2427. }
  2428. /**
  2429. * dp_print_tx_tqm_cmdq_status_tlv() - display htt_tx_tqm_cmdq_status_tlv
  2430. * @tag_buf: buffer containing the tlv htt_tx_tqm_cmdq_status_tlv
  2431. *
  2432. * Return: void
  2433. */
  2434. static void dp_print_tx_tqm_cmdq_status_tlv(uint32_t *tag_buf)
  2435. {
  2436. htt_tx_tqm_cmdq_status_tlv *dp_stats_buf =
  2437. (htt_tx_tqm_cmdq_status_tlv *)tag_buf;
  2438. DP_PRINT_STATS("HTT_TX_TQM_CMDQ_STATUS_TLV:");
  2439. DP_PRINT_STATS("mac_id__cmdq_id__word = %u",
  2440. dp_stats_buf->mac_id__cmdq_id__word);
  2441. DP_PRINT_STATS("sync_cmd = %u",
  2442. dp_stats_buf->sync_cmd);
  2443. DP_PRINT_STATS("write_cmd = %u",
  2444. dp_stats_buf->write_cmd);
  2445. DP_PRINT_STATS("gen_mpdu_cmd = %u",
  2446. dp_stats_buf->gen_mpdu_cmd);
  2447. DP_PRINT_STATS("mpdu_queue_stats_cmd = %u",
  2448. dp_stats_buf->mpdu_queue_stats_cmd);
  2449. DP_PRINT_STATS("mpdu_head_info_cmd = %u",
  2450. dp_stats_buf->mpdu_head_info_cmd);
  2451. DP_PRINT_STATS("msdu_flow_stats_cmd = %u",
  2452. dp_stats_buf->msdu_flow_stats_cmd);
  2453. DP_PRINT_STATS("remove_mpdu_cmd = %u",
  2454. dp_stats_buf->remove_mpdu_cmd);
  2455. DP_PRINT_STATS("remove_msdu_cmd = %u",
  2456. dp_stats_buf->remove_msdu_cmd);
  2457. DP_PRINT_STATS("flush_cache_cmd = %u",
  2458. dp_stats_buf->flush_cache_cmd);
  2459. DP_PRINT_STATS("update_mpduq_cmd = %u",
  2460. dp_stats_buf->update_mpduq_cmd);
  2461. DP_PRINT_STATS("update_msduq_cmd = %u\n",
  2462. dp_stats_buf->update_msduq_cmd);
  2463. }
  2464. /**
  2465. * dp_print_tx_de_eapol_packets_stats_tlv() - display htt_tx_de_eapol_packets_stats
  2466. * @tag_buf: buffer containing the tlv htt_tx_de_eapol_packets_stats_tlv
  2467. *
  2468. * Return: void
  2469. */
  2470. static void dp_print_tx_de_eapol_packets_stats_tlv(uint32_t *tag_buf)
  2471. {
  2472. htt_tx_de_eapol_packets_stats_tlv *dp_stats_buf =
  2473. (htt_tx_de_eapol_packets_stats_tlv *)tag_buf;
  2474. DP_PRINT_STATS("HTT_TX_DE_EAPOL_PACKETS_STATS_TLV:");
  2475. DP_PRINT_STATS("m1_packets = %u",
  2476. dp_stats_buf->m1_packets);
  2477. DP_PRINT_STATS("m2_packets = %u",
  2478. dp_stats_buf->m2_packets);
  2479. DP_PRINT_STATS("m3_packets = %u",
  2480. dp_stats_buf->m3_packets);
  2481. DP_PRINT_STATS("m4_packets = %u",
  2482. dp_stats_buf->m4_packets);
  2483. DP_PRINT_STATS("g1_packets = %u",
  2484. dp_stats_buf->g1_packets);
  2485. DP_PRINT_STATS("g2_packets = %u\n",
  2486. dp_stats_buf->g2_packets);
  2487. }
  2488. /**
  2489. * dp_print_tx_de_classify_failed_stats_tlv() - display
  2490. * htt_tx_de_classify_failed_stats_tlv
  2491. * @tag_buf: buffer containing the tlv htt_tx_de_classify_failed_stats_tlv
  2492. *
  2493. * Return: void
  2494. */
  2495. static void dp_print_tx_de_classify_failed_stats_tlv(uint32_t *tag_buf)
  2496. {
  2497. htt_tx_de_classify_failed_stats_tlv *dp_stats_buf =
  2498. (htt_tx_de_classify_failed_stats_tlv *)tag_buf;
  2499. DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_FAILED_STATS_TLV:");
  2500. DP_PRINT_STATS("ap_bss_peer_not_found = %u",
  2501. dp_stats_buf->ap_bss_peer_not_found);
  2502. DP_PRINT_STATS("ap_bcast_mcast_no_peer = %u",
  2503. dp_stats_buf->ap_bcast_mcast_no_peer);
  2504. DP_PRINT_STATS("sta_delete_in_progress = %u",
  2505. dp_stats_buf->sta_delete_in_progress);
  2506. DP_PRINT_STATS("ibss_no_bss_peer = %u",
  2507. dp_stats_buf->ibss_no_bss_peer);
  2508. DP_PRINT_STATS("invaild_vdev_type = %u",
  2509. dp_stats_buf->invaild_vdev_type);
  2510. DP_PRINT_STATS("invalid_ast_peer_entry = %u",
  2511. dp_stats_buf->invalid_ast_peer_entry);
  2512. DP_PRINT_STATS("peer_entry_invalid = %u",
  2513. dp_stats_buf->peer_entry_invalid);
  2514. DP_PRINT_STATS("ethertype_not_ip = %u",
  2515. dp_stats_buf->ethertype_not_ip);
  2516. DP_PRINT_STATS("eapol_lookup_failed = %u",
  2517. dp_stats_buf->eapol_lookup_failed);
  2518. DP_PRINT_STATS("qpeer_not_allow_data = %u",
  2519. dp_stats_buf->qpeer_not_allow_data);
  2520. DP_PRINT_STATS("fse_tid_override = %u\n",
  2521. dp_stats_buf->fse_tid_override);
  2522. }
  2523. /**
  2524. * dp_print_tx_de_classify_stats_tlv() - display htt_tx_de_classify_stats_tlv
  2525. * @tag_buf: buffer containing the tlv htt_tx_de_classify_stats_tlv
  2526. *
  2527. * Return: void
  2528. */
  2529. static void dp_print_tx_de_classify_stats_tlv(uint32_t *tag_buf)
  2530. {
  2531. htt_tx_de_classify_stats_tlv *dp_stats_buf =
  2532. (htt_tx_de_classify_stats_tlv *)tag_buf;
  2533. DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATS_TLV:");
  2534. DP_PRINT_STATS("arp_packets = %u",
  2535. dp_stats_buf->arp_packets);
  2536. DP_PRINT_STATS("igmp_packets = %u",
  2537. dp_stats_buf->igmp_packets);
  2538. DP_PRINT_STATS("dhcp_packets = %u",
  2539. dp_stats_buf->dhcp_packets);
  2540. DP_PRINT_STATS("host_inspected = %u",
  2541. dp_stats_buf->host_inspected);
  2542. DP_PRINT_STATS("htt_included = %u",
  2543. dp_stats_buf->htt_included);
  2544. DP_PRINT_STATS("htt_valid_mcs = %u",
  2545. dp_stats_buf->htt_valid_mcs);
  2546. DP_PRINT_STATS("htt_valid_nss = %u",
  2547. dp_stats_buf->htt_valid_nss);
  2548. DP_PRINT_STATS("htt_valid_preamble_type = %u",
  2549. dp_stats_buf->htt_valid_preamble_type);
  2550. DP_PRINT_STATS("htt_valid_chainmask = %u",
  2551. dp_stats_buf->htt_valid_chainmask);
  2552. DP_PRINT_STATS("htt_valid_guard_interval = %u",
  2553. dp_stats_buf->htt_valid_guard_interval);
  2554. DP_PRINT_STATS("htt_valid_retries = %u",
  2555. dp_stats_buf->htt_valid_retries);
  2556. DP_PRINT_STATS("htt_valid_bw_info = %u",
  2557. dp_stats_buf->htt_valid_bw_info);
  2558. DP_PRINT_STATS("htt_valid_power = %u",
  2559. dp_stats_buf->htt_valid_power);
  2560. DP_PRINT_STATS("htt_valid_key_flags = %u",
  2561. dp_stats_buf->htt_valid_key_flags);
  2562. DP_PRINT_STATS("htt_valid_no_encryption = %u",
  2563. dp_stats_buf->htt_valid_no_encryption);
  2564. DP_PRINT_STATS("fse_entry_count = %u",
  2565. dp_stats_buf->fse_entry_count);
  2566. DP_PRINT_STATS("fse_priority_be = %u",
  2567. dp_stats_buf->fse_priority_be);
  2568. DP_PRINT_STATS("fse_priority_high = %u",
  2569. dp_stats_buf->fse_priority_high);
  2570. DP_PRINT_STATS("fse_priority_low = %u",
  2571. dp_stats_buf->fse_priority_low);
  2572. DP_PRINT_STATS("fse_traffic_ptrn_be = %u",
  2573. dp_stats_buf->fse_traffic_ptrn_be);
  2574. DP_PRINT_STATS("fse_traffic_ptrn_over_sub = %u",
  2575. dp_stats_buf->fse_traffic_ptrn_over_sub);
  2576. DP_PRINT_STATS("fse_traffic_ptrn_bursty = %u",
  2577. dp_stats_buf->fse_traffic_ptrn_bursty);
  2578. DP_PRINT_STATS("fse_traffic_ptrn_interactive = %u",
  2579. dp_stats_buf->fse_traffic_ptrn_interactive);
  2580. DP_PRINT_STATS("fse_traffic_ptrn_periodic = %u",
  2581. dp_stats_buf->fse_traffic_ptrn_periodic);
  2582. DP_PRINT_STATS("fse_hwqueue_alloc = %u",
  2583. dp_stats_buf->fse_hwqueue_alloc);
  2584. DP_PRINT_STATS("fse_hwqueue_created = %u",
  2585. dp_stats_buf->fse_hwqueue_created);
  2586. DP_PRINT_STATS("fse_hwqueue_send_to_host = %u",
  2587. dp_stats_buf->fse_hwqueue_send_to_host);
  2588. DP_PRINT_STATS("mcast_entry = %u",
  2589. dp_stats_buf->mcast_entry);
  2590. DP_PRINT_STATS("bcast_entry = %u\n",
  2591. dp_stats_buf->bcast_entry);
  2592. }
  2593. /**
  2594. * dp_print_tx_de_classify_status_stats_tlv() - display
  2595. * htt_tx_de_classify_status_stats_tlv
  2596. * @tag_buf: buffer containing the tlv htt_tx_de_classify_status_stats_tlv
  2597. *
  2598. * Return: void
  2599. */
  2600. static void dp_print_tx_de_classify_status_stats_tlv(uint32_t *tag_buf)
  2601. {
  2602. htt_tx_de_classify_status_stats_tlv *dp_stats_buf =
  2603. (htt_tx_de_classify_status_stats_tlv *)tag_buf;
  2604. DP_PRINT_STATS("HTT_TX_DE_CLASSIFY_STATUS_STATS_TLV:");
  2605. DP_PRINT_STATS("eok = %u",
  2606. dp_stats_buf->eok);
  2607. DP_PRINT_STATS("classify_done = %u",
  2608. dp_stats_buf->classify_done);
  2609. DP_PRINT_STATS("lookup_failed = %u",
  2610. dp_stats_buf->lookup_failed);
  2611. DP_PRINT_STATS("send_host_dhcp = %u",
  2612. dp_stats_buf->send_host_dhcp);
  2613. DP_PRINT_STATS("send_host_mcast = %u",
  2614. dp_stats_buf->send_host_mcast);
  2615. DP_PRINT_STATS("send_host_unknown_dest = %u",
  2616. dp_stats_buf->send_host_unknown_dest);
  2617. DP_PRINT_STATS("send_host = %u",
  2618. dp_stats_buf->send_host);
  2619. DP_PRINT_STATS("status_invalid = %u\n",
  2620. dp_stats_buf->status_invalid);
  2621. }
  2622. /**
  2623. * dp_print_tx_de_enqueue_packets_stats_tlv() - display
  2624. * htt_tx_de_enqueue_packets_stats_tlv
  2625. * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_packets_stats_tlv
  2626. *
  2627. * Return: void
  2628. */
  2629. static void dp_print_tx_de_enqueue_packets_stats_tlv(uint32_t *tag_buf)
  2630. {
  2631. htt_tx_de_enqueue_packets_stats_tlv *dp_stats_buf =
  2632. (htt_tx_de_enqueue_packets_stats_tlv *)tag_buf;
  2633. DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_PACKETS_STATS_TLV:");
  2634. DP_PRINT_STATS("enqueued_pkts = %u",
  2635. dp_stats_buf->enqueued_pkts);
  2636. DP_PRINT_STATS("to_tqm = %u",
  2637. dp_stats_buf->to_tqm);
  2638. DP_PRINT_STATS("to_tqm_bypass = %u\n",
  2639. dp_stats_buf->to_tqm_bypass);
  2640. }
  2641. /**
  2642. * dp_print_tx_de_enqueue_discard_stats_tlv() - display
  2643. * htt_tx_de_enqueue_discard_stats_tlv
  2644. * @tag_buf: buffer containing the tlv htt_tx_de_enqueue_discard_stats_tlv
  2645. *
  2646. * Return: void
  2647. */
  2648. static void dp_print_tx_de_enqueue_discard_stats_tlv(uint32_t *tag_buf)
  2649. {
  2650. htt_tx_de_enqueue_discard_stats_tlv *dp_stats_buf =
  2651. (htt_tx_de_enqueue_discard_stats_tlv *)tag_buf;
  2652. DP_PRINT_STATS("HTT_TX_DE_ENQUEUE_DISCARD_STATS_TLV:");
  2653. DP_PRINT_STATS("discarded_pkts = %u",
  2654. dp_stats_buf->discarded_pkts);
  2655. DP_PRINT_STATS("local_frames = %u",
  2656. dp_stats_buf->local_frames);
  2657. DP_PRINT_STATS("is_ext_msdu = %u\n",
  2658. dp_stats_buf->is_ext_msdu);
  2659. }
  2660. /**
  2661. * dp_print_tx_de_compl_stats_tlv() - display htt_tx_de_compl_stats_tlv
  2662. * @tag_buf: buffer containing the tlv htt_tx_de_compl_stats_tlv
  2663. *
  2664. * Return: void
  2665. */
  2666. static void dp_print_tx_de_compl_stats_tlv(uint32_t *tag_buf)
  2667. {
  2668. htt_tx_de_compl_stats_tlv *dp_stats_buf =
  2669. (htt_tx_de_compl_stats_tlv *)tag_buf;
  2670. DP_PRINT_STATS("HTT_TX_DE_COMPL_STATS_TLV:");
  2671. DP_PRINT_STATS("tcl_dummy_frame = %u",
  2672. dp_stats_buf->tcl_dummy_frame);
  2673. DP_PRINT_STATS("tqm_dummy_frame = %u",
  2674. dp_stats_buf->tqm_dummy_frame);
  2675. DP_PRINT_STATS("tqm_notify_frame = %u",
  2676. dp_stats_buf->tqm_notify_frame);
  2677. DP_PRINT_STATS("fw2wbm_enq = %u",
  2678. dp_stats_buf->fw2wbm_enq);
  2679. DP_PRINT_STATS("tqm_bypass_frame = %u\n",
  2680. dp_stats_buf->tqm_bypass_frame);
  2681. }
  2682. /**
  2683. * dp_print_tx_de_cmn_stats_tlv() - display htt_tx_de_cmn_stats_tlv
  2684. * @tag_buf: buffer containing the tlv htt_tx_de_cmn_stats_tlv
  2685. *
  2686. * Return: void
  2687. */
  2688. static void dp_print_tx_de_cmn_stats_tlv(uint32_t *tag_buf)
  2689. {
  2690. htt_tx_de_cmn_stats_tlv *dp_stats_buf =
  2691. (htt_tx_de_cmn_stats_tlv *)tag_buf;
  2692. DP_PRINT_STATS("HTT_TX_DE_CMN_STATS_TLV:");
  2693. DP_PRINT_STATS("mac_id__word = %u",
  2694. dp_stats_buf->mac_id__word);
  2695. DP_PRINT_STATS("tcl2fw_entry_count = %u",
  2696. dp_stats_buf->tcl2fw_entry_count);
  2697. DP_PRINT_STATS("not_to_fw = %u",
  2698. dp_stats_buf->not_to_fw);
  2699. DP_PRINT_STATS("invalid_pdev_vdev_peer = %u",
  2700. dp_stats_buf->invalid_pdev_vdev_peer);
  2701. DP_PRINT_STATS("tcl_res_invalid_addrx = %u",
  2702. dp_stats_buf->tcl_res_invalid_addrx);
  2703. DP_PRINT_STATS("wbm2fw_entry_count = %u",
  2704. dp_stats_buf->wbm2fw_entry_count);
  2705. DP_PRINT_STATS("invalid_pdev = %u\n",
  2706. dp_stats_buf->invalid_pdev);
  2707. }
  2708. /**
  2709. * dp_print_ring_if_stats_tlv() - display htt_ring_if_stats_tlv
  2710. * @tag_buf: buffer containing the tlv htt_ring_if_stats_tlv
  2711. *
  2712. * Return: void
  2713. */
  2714. static void dp_print_ring_if_stats_tlv(uint32_t *tag_buf)
  2715. {
  2716. htt_ring_if_stats_tlv *dp_stats_buf =
  2717. (htt_ring_if_stats_tlv *)tag_buf;
  2718. uint8_t i;
  2719. uint16_t index = 0;
  2720. char *wm_hit_count = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2721. if (!wm_hit_count) {
  2722. dp_stats_err("Output buffer not allocated");
  2723. return;
  2724. }
  2725. DP_PRINT_STATS("HTT_RING_IF_STATS_TLV:");
  2726. DP_PRINT_STATS("base_addr = %u",
  2727. dp_stats_buf->base_addr);
  2728. DP_PRINT_STATS("elem_size = %u",
  2729. dp_stats_buf->elem_size);
  2730. DP_PRINT_STATS("num_elems__prefetch_tail_idx = %u",
  2731. dp_stats_buf->num_elems__prefetch_tail_idx);
  2732. DP_PRINT_STATS("head_idx__tail_idx = %u",
  2733. dp_stats_buf->head_idx__tail_idx);
  2734. DP_PRINT_STATS("shadow_head_idx__shadow_tail_idx = %u",
  2735. dp_stats_buf->shadow_head_idx__shadow_tail_idx);
  2736. DP_PRINT_STATS("num_tail_incr = %u",
  2737. dp_stats_buf->num_tail_incr);
  2738. DP_PRINT_STATS("lwm_thresh__hwm_thresh = %u",
  2739. dp_stats_buf->lwm_thresh__hwm_thresh);
  2740. DP_PRINT_STATS("overrun_hit_count = %u",
  2741. dp_stats_buf->overrun_hit_count);
  2742. DP_PRINT_STATS("underrun_hit_count = %u",
  2743. dp_stats_buf->underrun_hit_count);
  2744. DP_PRINT_STATS("prod_blockwait_count = %u",
  2745. dp_stats_buf->prod_blockwait_count);
  2746. DP_PRINT_STATS("cons_blockwait_count = %u",
  2747. dp_stats_buf->cons_blockwait_count);
  2748. for (i = 0; i < DP_HTT_LOW_WM_HIT_COUNT_LEN; i++) {
  2749. index += qdf_snprint(&wm_hit_count[index],
  2750. DP_MAX_STRING_LEN - index,
  2751. " %u:%u,", i,
  2752. dp_stats_buf->low_wm_hit_count[i]);
  2753. }
  2754. DP_PRINT_STATS("low_wm_hit_count = %s ", wm_hit_count);
  2755. qdf_mem_zero(wm_hit_count, DP_MAX_STRING_LEN);
  2756. index = 0;
  2757. for (i = 0; i < DP_HTT_HIGH_WM_HIT_COUNT_LEN; i++) {
  2758. index += qdf_snprint(&wm_hit_count[index],
  2759. DP_MAX_STRING_LEN - index,
  2760. " %u:%u,", i,
  2761. dp_stats_buf->high_wm_hit_count[i]);
  2762. }
  2763. DP_PRINT_STATS("high_wm_hit_count = %s\n", wm_hit_count);
  2764. qdf_mem_free(wm_hit_count);
  2765. }
  2766. /**
  2767. * dp_print_ring_if_cmn_tlv() - display htt_ring_if_cmn_tlv
  2768. * @tag_buf: buffer containing the tlv htt_ring_if_cmn_tlv
  2769. *
  2770. * Return: void
  2771. */
  2772. static void dp_print_ring_if_cmn_tlv(uint32_t *tag_buf)
  2773. {
  2774. htt_ring_if_cmn_tlv *dp_stats_buf =
  2775. (htt_ring_if_cmn_tlv *)tag_buf;
  2776. DP_PRINT_STATS("HTT_RING_IF_CMN_TLV:");
  2777. DP_PRINT_STATS("mac_id__word = %u",
  2778. dp_stats_buf->mac_id__word);
  2779. DP_PRINT_STATS("num_records = %u\n",
  2780. dp_stats_buf->num_records);
  2781. }
  2782. /**
  2783. * dp_print_sfm_client_user_tlv_v() - display htt_sfm_client_user_tlv_v
  2784. * @tag_buf: buffer containing the tlv htt_sfm_client_user_tlv_v
  2785. *
  2786. * Return: void
  2787. */
  2788. static void dp_print_sfm_client_user_tlv_v(uint32_t *tag_buf)
  2789. {
  2790. htt_sfm_client_user_tlv_v *dp_stats_buf =
  2791. (htt_sfm_client_user_tlv_v *)tag_buf;
  2792. uint8_t i;
  2793. uint16_t index = 0;
  2794. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  2795. char *dwords_used_by_user_n = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2796. if (!dwords_used_by_user_n) {
  2797. dp_stats_err("Output buffer not allocated");
  2798. return;
  2799. }
  2800. DP_PRINT_STATS("HTT_SFM_CLIENT_USER_TLV_V:");
  2801. for (i = 0; i < tag_len; i++) {
  2802. index += qdf_snprint(&dwords_used_by_user_n[index],
  2803. DP_MAX_STRING_LEN - index,
  2804. " %u:%u,", i,
  2805. dp_stats_buf->dwords_used_by_user_n[i]);
  2806. }
  2807. DP_PRINT_STATS("dwords_used_by_user_n = %s\n",
  2808. dwords_used_by_user_n);
  2809. qdf_mem_free(dwords_used_by_user_n);
  2810. }
  2811. /**
  2812. * dp_print_sfm_client_tlv() - display htt_sfm_client_tlv
  2813. * @tag_buf: buffer containing the tlv htt_sfm_client_tlv
  2814. *
  2815. * Return: void
  2816. */
  2817. static void dp_print_sfm_client_tlv(uint32_t *tag_buf)
  2818. {
  2819. htt_sfm_client_tlv *dp_stats_buf =
  2820. (htt_sfm_client_tlv *)tag_buf;
  2821. DP_PRINT_STATS("HTT_SFM_CLIENT_TLV:");
  2822. DP_PRINT_STATS("client_id = %u",
  2823. dp_stats_buf->client_id);
  2824. DP_PRINT_STATS("buf_min = %u",
  2825. dp_stats_buf->buf_min);
  2826. DP_PRINT_STATS("buf_max = %u",
  2827. dp_stats_buf->buf_max);
  2828. DP_PRINT_STATS("buf_busy = %u",
  2829. dp_stats_buf->buf_busy);
  2830. DP_PRINT_STATS("buf_alloc = %u",
  2831. dp_stats_buf->buf_alloc);
  2832. DP_PRINT_STATS("buf_avail = %u",
  2833. dp_stats_buf->buf_avail);
  2834. DP_PRINT_STATS("num_users = %u\n",
  2835. dp_stats_buf->num_users);
  2836. }
  2837. /**
  2838. * dp_print_sfm_cmn_tlv() - display htt_sfm_cmn_tlv
  2839. * @tag_buf: buffer containing the tlv htt_sfm_cmn_tlv
  2840. *
  2841. * Return: void
  2842. */
  2843. static void dp_print_sfm_cmn_tlv(uint32_t *tag_buf)
  2844. {
  2845. htt_sfm_cmn_tlv *dp_stats_buf =
  2846. (htt_sfm_cmn_tlv *)tag_buf;
  2847. DP_PRINT_STATS("HTT_SFM_CMN_TLV:");
  2848. DP_PRINT_STATS("mac_id__word = %u",
  2849. dp_stats_buf->mac_id__word);
  2850. DP_PRINT_STATS("buf_total = %u",
  2851. dp_stats_buf->buf_total);
  2852. DP_PRINT_STATS("mem_empty = %u",
  2853. dp_stats_buf->mem_empty);
  2854. DP_PRINT_STATS("deallocate_bufs = %u",
  2855. dp_stats_buf->deallocate_bufs);
  2856. DP_PRINT_STATS("num_records = %u\n",
  2857. dp_stats_buf->num_records);
  2858. }
  2859. /**
  2860. * dp_print_sring_stats_tlv() - display htt_sring_stats_tlv
  2861. * @tag_buf: buffer containing the tlv htt_sring_stats_tlv
  2862. *
  2863. * Return: void
  2864. */
  2865. static void dp_print_sring_stats_tlv(uint32_t *tag_buf)
  2866. {
  2867. htt_sring_stats_tlv *dp_stats_buf =
  2868. (htt_sring_stats_tlv *)tag_buf;
  2869. DP_PRINT_STATS("HTT_SRING_STATS_TLV:");
  2870. DP_PRINT_STATS("mac_id__ring_id__arena__ep = %u",
  2871. dp_stats_buf->mac_id__ring_id__arena__ep);
  2872. DP_PRINT_STATS("base_addr_lsb = %u",
  2873. dp_stats_buf->base_addr_lsb);
  2874. DP_PRINT_STATS("base_addr_msb = %u",
  2875. dp_stats_buf->base_addr_msb);
  2876. DP_PRINT_STATS("ring_size = %u",
  2877. dp_stats_buf->ring_size);
  2878. DP_PRINT_STATS("elem_size = %u",
  2879. dp_stats_buf->elem_size);
  2880. DP_PRINT_STATS("num_avail_words__num_valid_words = %u",
  2881. dp_stats_buf->num_avail_words__num_valid_words);
  2882. DP_PRINT_STATS("head_ptr__tail_ptr = %u",
  2883. dp_stats_buf->head_ptr__tail_ptr);
  2884. DP_PRINT_STATS("consumer_empty__producer_full = %u",
  2885. dp_stats_buf->consumer_empty__producer_full);
  2886. DP_PRINT_STATS("prefetch_count__internal_tail_ptr = %u\n",
  2887. dp_stats_buf->prefetch_count__internal_tail_ptr);
  2888. }
  2889. /**
  2890. * dp_print_sring_cmn_tlv() - display htt_sring_cmn_tlv
  2891. * @tag_buf: buffer containing the tlv htt_sring_cmn_tlv
  2892. *
  2893. * Return: void
  2894. */
  2895. static void dp_print_sring_cmn_tlv(uint32_t *tag_buf)
  2896. {
  2897. htt_sring_cmn_tlv *dp_stats_buf =
  2898. (htt_sring_cmn_tlv *)tag_buf;
  2899. DP_PRINT_STATS("HTT_SRING_CMN_TLV:");
  2900. DP_PRINT_STATS("num_records = %u\n",
  2901. dp_stats_buf->num_records);
  2902. }
  2903. /**
  2904. * dp_print_tx_pdev_rate_stats_tlv() - display htt_tx_pdev_rate_stats_tlv
  2905. * @tag_buf: buffer containing the tlv htt_tx_pdev_rate_stats_tlv
  2906. *
  2907. * Return: void
  2908. */
  2909. static void dp_print_tx_pdev_rate_stats_tlv(uint32_t *tag_buf)
  2910. {
  2911. htt_tx_pdev_rate_stats_tlv *dp_stats_buf =
  2912. (htt_tx_pdev_rate_stats_tlv *)tag_buf;
  2913. uint8_t i, j;
  2914. uint16_t index = 0;
  2915. char *tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
  2916. char *tx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
  2917. char *ac_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
  2918. char *ax_mu_mimo_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
  2919. char *ofdma_tx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
  2920. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  2921. if (!str_buf) {
  2922. dp_err("Output buffer not allocated");
  2923. return;
  2924. }
  2925. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  2926. tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2927. tx_gi_ext[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2928. if (!tx_gi[i] || !tx_gi_ext[i]) {
  2929. dp_err("Unable to allocate buffer for tx_gi");
  2930. goto fail1;
  2931. }
  2932. ac_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2933. if (!ac_mu_mimo_tx_gi[i]) {
  2934. dp_err("Unable to allocate buffer for ac_mu_mimo_tx_gi");
  2935. goto fail1;
  2936. }
  2937. ax_mu_mimo_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2938. if (!ax_mu_mimo_tx_gi[i]) {
  2939. dp_err("Unable to allocate buffer for ax_mu_mimo_tx_gi");
  2940. goto fail1;
  2941. }
  2942. ofdma_tx_gi[i] = (char *)qdf_mem_malloc(DP_MAX_STRING_LEN);
  2943. if (!ofdma_tx_gi[i]) {
  2944. dp_err("Unable to allocate buffer for ofdma_tx_gi");
  2945. goto fail1;
  2946. }
  2947. }
  2948. DP_PRINT_STATS("HTT_TX_PDEV_RATE_STATS_TLV:");
  2949. DP_PRINT_STATS("mac_id__word = %u",
  2950. dp_stats_buf->mac_id__word);
  2951. DP_PRINT_STATS("tx_ldpc = %u",
  2952. dp_stats_buf->tx_ldpc);
  2953. DP_PRINT_STATS("rts_cnt = %u",
  2954. dp_stats_buf->rts_cnt);
  2955. DP_PRINT_STATS("rts_success = %u",
  2956. dp_stats_buf->rts_success);
  2957. DP_PRINT_STATS("ack_rssi = %u",
  2958. dp_stats_buf->ack_rssi);
  2959. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2960. for (i = 0; i < DP_HTT_TX_MCS_LEN; i++) {
  2961. index += qdf_snprint(&str_buf[index],
  2962. DP_MAX_STRING_LEN - index,
  2963. " %u:%u,", i, dp_stats_buf->tx_mcs[i]);
  2964. }
  2965. for (i = 0; i < DP_HTT_TX_MCS_EXT_LEN; i++) {
  2966. index += qdf_snprint(&str_buf[index],
  2967. DP_MAX_STRING_LEN - index,
  2968. " %u:%u,", i + DP_HTT_TX_MCS_LEN,
  2969. dp_stats_buf->tx_mcs_ext[i]);
  2970. }
  2971. for (i = 0; i < DP_HTT_TX_MCS_EXT2_LEN; i++) {
  2972. index += qdf_snprint(&str_buf[index],
  2973. DP_MAX_STRING_LEN - index,
  2974. " %u:%u,", i + DP_HTT_TX_MCS_LEN +
  2975. DP_HTT_TX_MCS_EXT_LEN,
  2976. dp_stats_buf->tx_mcs_ext_2[i]);
  2977. }
  2978. DP_PRINT_STATS("tx_mcs = %s ", str_buf);
  2979. index = 0;
  2980. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2981. for (i = 0; i < DP_HTT_TX_SU_MCS_LEN; i++) {
  2982. index += qdf_snprint(&str_buf[index],
  2983. DP_MAX_STRING_LEN - index,
  2984. " %u:%u,", i, dp_stats_buf->tx_su_mcs[i]);
  2985. }
  2986. DP_PRINT_STATS("tx_su_mcs = %s ", str_buf);
  2987. index = 0;
  2988. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2989. for (i = 0; i < DP_HTT_TX_MU_MCS_LEN; i++) {
  2990. index += qdf_snprint(&str_buf[index],
  2991. DP_MAX_STRING_LEN - index,
  2992. " %u:%u,", i, dp_stats_buf->tx_mu_mcs[i]);
  2993. }
  2994. DP_PRINT_STATS("tx_mu_mcs = %s ", str_buf);
  2995. index = 0;
  2996. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  2997. for (i = 0; i < DP_HTT_TX_NSS_LEN; i++) {
  2998. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  2999. index += qdf_snprint(&str_buf[index],
  3000. DP_MAX_STRING_LEN - index,
  3001. " %u:%u,", (i + 1),
  3002. dp_stats_buf->tx_nss[i]);
  3003. }
  3004. DP_PRINT_STATS("tx_nss = %s ", str_buf);
  3005. index = 0;
  3006. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3007. for (i = 0; i < DP_HTT_TX_BW_LEN; i++) {
  3008. index += qdf_snprint(&str_buf[index],
  3009. DP_MAX_STRING_LEN - index,
  3010. " %u:%u,", i, dp_stats_buf->tx_bw[i]);
  3011. }
  3012. DP_PRINT_STATS("tx_bw = %s ", str_buf);
  3013. DP_PRINT_STATS("tx_bw_320mhz = %u ", dp_stats_buf->tx_bw_320mhz);
  3014. index = 0;
  3015. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3016. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3017. index += qdf_snprint(&str_buf[index],
  3018. DP_MAX_STRING_LEN - index,
  3019. " %u:%u,", i, dp_stats_buf->tx_stbc[i]);
  3020. }
  3021. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
  3022. index += qdf_snprint(&str_buf[index],
  3023. DP_MAX_STRING_LEN - index,
  3024. " %u:%u,", i + HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS,
  3025. dp_stats_buf->tx_stbc_ext[i]);
  3026. }
  3027. DP_PRINT_STATS("tx_stbc = %s ", str_buf);
  3028. index = 0;
  3029. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3030. for (i = 0; i < DP_HTT_TX_PREAM_LEN; i++) {
  3031. index += qdf_snprint(&str_buf[index],
  3032. DP_MAX_STRING_LEN - index,
  3033. " %u:%u,", i, dp_stats_buf->tx_pream[i]);
  3034. }
  3035. DP_PRINT_STATS("tx_pream = %s ", str_buf);
  3036. for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
  3037. index = 0;
  3038. qdf_mem_zero(tx_gi[j], DP_MAX_STRING_LEN);
  3039. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3040. index += qdf_snprint(&tx_gi[j][index],
  3041. DP_MAX_STRING_LEN - index,
  3042. " %u:%u,", i,
  3043. dp_stats_buf->tx_gi[j][i]);
  3044. }
  3045. DP_PRINT_STATS("tx_gi[%u] = %s ", j, tx_gi[j]);
  3046. }
  3047. for (j = 0; j < DP_HTT_PDEV_TX_GI_LEN; j++) {
  3048. index = 0;
  3049. qdf_mem_zero(tx_gi_ext[j], DP_MAX_STRING_LEN);
  3050. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_EXTRA_MCS_COUNTERS; i++) {
  3051. index += qdf_snprint(&tx_gi_ext[j][index],
  3052. DP_MAX_STRING_LEN - index,
  3053. " %u:%u,", i,
  3054. dp_stats_buf->tx_gi_ext[j][i]);
  3055. }
  3056. DP_PRINT_STATS("tx_gi_ext[%u] = %s ", j, tx_gi_ext[j]);
  3057. }
  3058. index = 0;
  3059. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3060. for (i = 0; i < DP_HTT_TX_DCM_LEN; i++) {
  3061. index += qdf_snprint(&str_buf[index],
  3062. DP_MAX_STRING_LEN - index,
  3063. " %u:%u,", i, dp_stats_buf->tx_dcm[i]);
  3064. }
  3065. DP_PRINT_STATS("tx_dcm = %s", str_buf);
  3066. index = 0;
  3067. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3068. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) {
  3069. index += qdf_snprint(&str_buf[index],
  3070. DP_MAX_STRING_LEN - index,
  3071. " %u:%u,", i,
  3072. dp_stats_buf->tx_su_punctured_mode[i]);
  3073. }
  3074. DP_PRINT_STATS("tx_su_punctured_mode = %s\n", str_buf);
  3075. DP_PRINT_STATS("rts_success = %u",
  3076. dp_stats_buf->rts_success);
  3077. DP_PRINT_STATS("ac_mu_mimo_tx_ldpc = %u",
  3078. dp_stats_buf->ac_mu_mimo_tx_ldpc);
  3079. DP_PRINT_STATS("ax_mu_mimo_tx_ldpc = %u",
  3080. dp_stats_buf->ax_mu_mimo_tx_ldpc);
  3081. DP_PRINT_STATS("ofdma_tx_ldpc = %u",
  3082. dp_stats_buf->ofdma_tx_ldpc);
  3083. index = 0;
  3084. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3085. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
  3086. index += qdf_snprint(&str_buf[index],
  3087. DP_MAX_STRING_LEN - index,
  3088. " %u:%u,",
  3089. i, dp_stats_buf->tx_legacy_cck_rate[i]);
  3090. }
  3091. DP_PRINT_STATS("tx_legacy_cck_rate = %s ", str_buf);
  3092. index = 0;
  3093. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3094. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
  3095. index += qdf_snprint(&str_buf[index],
  3096. DP_MAX_STRING_LEN - index,
  3097. " %u:%u,", i,
  3098. dp_stats_buf->tx_legacy_ofdm_rate[i]);
  3099. }
  3100. DP_PRINT_STATS("tx_legacy_ofdm_rate = %s ", str_buf);
  3101. index = 0;
  3102. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3103. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_LTF; i++) {
  3104. index += qdf_snprint(&str_buf[index],
  3105. DP_MAX_STRING_LEN - index,
  3106. " %u:%u,",
  3107. i, dp_stats_buf->tx_he_ltf[i]);
  3108. }
  3109. DP_PRINT_STATS("tx_he_ltf = %s ", str_buf);
  3110. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3111. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3112. index += qdf_snprint(&str_buf[index],
  3113. DP_MAX_STRING_LEN - index,
  3114. " %u:%u,",
  3115. i, dp_stats_buf->ofdma_tx_mcs[i]);
  3116. }
  3117. DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
  3118. index = 0;
  3119. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3120. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3121. index += qdf_snprint(&str_buf[index],
  3122. DP_MAX_STRING_LEN - index,
  3123. " %u:%u,",
  3124. i, dp_stats_buf->ac_mu_mimo_tx_mcs[i]);
  3125. }
  3126. DP_PRINT_STATS("ac_mu_mimo_tx_mcs = %s ", str_buf);
  3127. index = 0;
  3128. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3129. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3130. index += qdf_snprint(&str_buf[index],
  3131. DP_MAX_STRING_LEN - index,
  3132. " %u:%u,",
  3133. i, dp_stats_buf->ax_mu_mimo_tx_mcs[i]);
  3134. }
  3135. DP_PRINT_STATS("ax_mu_mimo_tx_mcs = %s ", str_buf);
  3136. index = 0;
  3137. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3138. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3139. index += qdf_snprint(&str_buf[index],
  3140. DP_MAX_STRING_LEN - index,
  3141. " %u:%u,",
  3142. i, dp_stats_buf->ofdma_tx_mcs[i]);
  3143. }
  3144. DP_PRINT_STATS("ofdma_tx_mcs = %s ", str_buf);
  3145. index = 0;
  3146. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3147. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  3148. index += qdf_snprint(&str_buf[index],
  3149. DP_MAX_STRING_LEN - index,
  3150. " %u:%u,",
  3151. i, dp_stats_buf->ac_mu_mimo_tx_nss[i]);
  3152. }
  3153. DP_PRINT_STATS("ac_mu_mimo_tx_nss = %s ", str_buf);
  3154. index = 0;
  3155. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3156. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  3157. index += qdf_snprint(&str_buf[index],
  3158. DP_MAX_STRING_LEN - index,
  3159. " %u:%u,",
  3160. i, dp_stats_buf->ax_mu_mimo_tx_nss[i]);
  3161. }
  3162. DP_PRINT_STATS("ax_mu_mimo_tx_nss = %s ", str_buf);
  3163. index = 0;
  3164. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3165. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  3166. index += qdf_snprint(&str_buf[index],
  3167. DP_MAX_STRING_LEN - index,
  3168. " %u:%u,",
  3169. i, dp_stats_buf->ofdma_tx_nss[i]);
  3170. }
  3171. DP_PRINT_STATS("ofdma_tx_nss = %s ", str_buf);
  3172. index = 0;
  3173. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3174. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  3175. index += qdf_snprint(&str_buf[index],
  3176. DP_MAX_STRING_LEN - index,
  3177. " %u:%u,",
  3178. i, dp_stats_buf->ac_mu_mimo_tx_bw[i]);
  3179. }
  3180. DP_PRINT_STATS("ac_mu_mimo_tx_bw = %s ", str_buf);
  3181. index = 0;
  3182. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3183. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  3184. index += qdf_snprint(&str_buf[index],
  3185. DP_MAX_STRING_LEN - index,
  3186. " %u:%u,",
  3187. i, dp_stats_buf->ax_mu_mimo_tx_bw[i]);
  3188. }
  3189. DP_PRINT_STATS("ax_mu_mimo_tx_bw = %s ", str_buf);
  3190. index = 0;
  3191. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3192. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  3193. index += qdf_snprint(&str_buf[index],
  3194. DP_MAX_STRING_LEN - index,
  3195. " %u:%u,",
  3196. i, dp_stats_buf->ofdma_tx_bw[i]);
  3197. }
  3198. DP_PRINT_STATS("ofdma_tx_bw = %s ", str_buf);
  3199. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  3200. index = 0;
  3201. qdf_mem_zero(ac_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
  3202. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3203. index += qdf_snprint(&ac_mu_mimo_tx_gi[j][index],
  3204. DP_MAX_STRING_LEN - index,
  3205. " %u:%u,", i,
  3206. dp_stats_buf->
  3207. ac_mu_mimo_tx_gi[j][i]);
  3208. }
  3209. DP_PRINT_STATS("ac_mu_mimo_tx_gi[%u] = %s ",
  3210. j, ac_mu_mimo_tx_gi[j]);
  3211. }
  3212. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  3213. index = 0;
  3214. qdf_mem_zero(ax_mu_mimo_tx_gi[j], DP_MAX_STRING_LEN);
  3215. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3216. index += qdf_snprint(&ax_mu_mimo_tx_gi[j][index],
  3217. DP_MAX_STRING_LEN - index,
  3218. " %u:%u,", i,
  3219. dp_stats_buf->ax_mu_mimo_tx_gi[j][i]);
  3220. }
  3221. DP_PRINT_STATS("ax_mu_mimo_tx_gi[%u] = %s ",
  3222. j, ax_mu_mimo_tx_gi[j]);
  3223. }
  3224. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  3225. index = 0;
  3226. qdf_mem_zero(ofdma_tx_gi[j], DP_MAX_STRING_LEN);
  3227. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3228. index += qdf_snprint(&ofdma_tx_gi[j][index],
  3229. DP_MAX_STRING_LEN - index,
  3230. " %u:%u,", i,
  3231. dp_stats_buf->ofdma_tx_gi[j][i]);
  3232. }
  3233. DP_PRINT_STATS("ofdma_tx_gi[%u] = %s ",
  3234. j, ofdma_tx_gi[j]);
  3235. }
  3236. fail1:
  3237. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  3238. if (tx_gi[i])
  3239. qdf_mem_free(tx_gi[i]);
  3240. if (tx_gi_ext[i])
  3241. qdf_mem_free(tx_gi_ext[i]);
  3242. if (ac_mu_mimo_tx_gi[i])
  3243. qdf_mem_free(ac_mu_mimo_tx_gi[i]);
  3244. if (ax_mu_mimo_tx_gi[i])
  3245. qdf_mem_free(ax_mu_mimo_tx_gi[i]);
  3246. if (ofdma_tx_gi[i])
  3247. qdf_mem_free(ofdma_tx_gi[i]);
  3248. }
  3249. qdf_mem_free(str_buf);
  3250. }
  3251. /**
  3252. * dp_print_rx_pdev_rate_ext_stats_tlv() -
  3253. * display htt_rx_pdev_rate_ext_stats_tlv
  3254. * @pdev: pdev pointer
  3255. * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_ext_stats_tlv
  3256. *
  3257. * Return: void
  3258. */
  3259. static void dp_print_rx_pdev_rate_ext_stats_tlv(struct dp_pdev *pdev,
  3260. uint32_t *tag_buf)
  3261. {
  3262. htt_rx_pdev_rate_ext_stats_tlv *dp_stats_buf =
  3263. (htt_rx_pdev_rate_ext_stats_tlv *)tag_buf;
  3264. uint8_t i, j;
  3265. uint16_t index = 0;
  3266. char *rx_gi_ext[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
  3267. char *ul_ofdma_rx_gi_ext[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS] = {0};
  3268. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3269. if (!str_buf) {
  3270. dp_err("Output buffer not allocated");
  3271. return;
  3272. }
  3273. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  3274. rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3275. if (!rx_gi_ext[i]) {
  3276. dp_err("Unable to allocate buffer for rx_gi_ext");
  3277. goto fail1;
  3278. }
  3279. ul_ofdma_rx_gi_ext[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3280. if (!ul_ofdma_rx_gi_ext[i]) {
  3281. dp_err("Unable to allocate buffer for ul_ofdma_rx_gi_ext");
  3282. goto fail1;
  3283. }
  3284. }
  3285. index = 0;
  3286. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3287. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3288. index += qdf_snprint(&str_buf[index],
  3289. DP_MAX_STRING_LEN - index,
  3290. " %u:%u,", i, dp_stats_buf->rx_mcs_ext[i]);
  3291. }
  3292. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT2; i++) {
  3293. index += qdf_snprint(&str_buf[index],
  3294. DP_MAX_STRING_LEN - index,
  3295. " %u:%u,", i + DP_HTT_RX_PDEV_MCS_LEN_EXT,
  3296. dp_stats_buf->rx_mcs_ext_2[i]);
  3297. }
  3298. DP_PRINT_STATS("rx_mcs_ext = %s ", str_buf);
  3299. index = 0;
  3300. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3301. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3302. index += qdf_snprint(&str_buf[index],
  3303. DP_MAX_STRING_LEN - index,
  3304. " %u:%u,", i, dp_stats_buf->rx_stbc_ext[i]);
  3305. }
  3306. DP_PRINT_STATS("rx_stbc_ext = %s ", str_buf);
  3307. for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
  3308. index = 0;
  3309. qdf_mem_zero(rx_gi_ext[j], DP_MAX_STRING_LEN);
  3310. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3311. index += qdf_snprint(&rx_gi_ext[j][index],
  3312. DP_MAX_STRING_LEN - index,
  3313. " %u:%u,", i,
  3314. dp_stats_buf->rx_gi_ext[j][i]);
  3315. }
  3316. DP_PRINT_STATS("rx_gi_ext[%u] = %s ", j, rx_gi_ext[j]);
  3317. }
  3318. index = 0;
  3319. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3320. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3321. index += qdf_snprint(&str_buf[index],
  3322. DP_MAX_STRING_LEN - index,
  3323. " %u:%u,",
  3324. i, dp_stats_buf->ul_ofdma_rx_mcs_ext[i]);
  3325. }
  3326. DP_PRINT_STATS("ul_ofdma_rx_mcs_ext = %s", str_buf);
  3327. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  3328. index = 0;
  3329. qdf_mem_zero(ul_ofdma_rx_gi_ext[j], DP_MAX_STRING_LEN);
  3330. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3331. index += qdf_snprint(&ul_ofdma_rx_gi_ext[j][index],
  3332. DP_MAX_STRING_LEN - index,
  3333. " %u:%u,", i,
  3334. dp_stats_buf->
  3335. ul_ofdma_rx_gi_ext[j][i]);
  3336. }
  3337. DP_PRINT_STATS("ul_ofdma_rx_gi_ext[%u] = %s ",
  3338. j, ul_ofdma_rx_gi_ext[j]);
  3339. }
  3340. index = 0;
  3341. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3342. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3343. index += qdf_snprint(&str_buf[index],
  3344. DP_MAX_STRING_LEN - index,
  3345. " %u:%u,", i,
  3346. dp_stats_buf->rx_11ax_su_txbf_mcs_ext[i]);
  3347. }
  3348. DP_PRINT_STATS("rx_11ax_su_txbf_mcs_ext = %s ", str_buf);
  3349. index = 0;
  3350. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3351. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3352. index += qdf_snprint(&str_buf[index],
  3353. DP_MAX_STRING_LEN - index,
  3354. " %u:%u,", i,
  3355. dp_stats_buf->rx_11ax_mu_txbf_mcs_ext[i]);
  3356. }
  3357. DP_PRINT_STATS("rx_11ax_mu_txbf_mcs_ext = %s ", str_buf);
  3358. index = 0;
  3359. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3360. for (i = 0; i < DP_HTT_RX_PDEV_MCS_LEN_EXT; i++) {
  3361. index += qdf_snprint(&str_buf[index],
  3362. DP_MAX_STRING_LEN - index,
  3363. " %u:%u,", i,
  3364. dp_stats_buf->rx_11ax_dl_ofdma_mcs_ext[i]);
  3365. }
  3366. DP_PRINT_STATS("rx_11ax_dl_ofdma_mcs_ext = %s ", str_buf);
  3367. index = 0;
  3368. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3369. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_EXT2_COUNTERS; i++) {
  3370. index += qdf_snprint(&str_buf[index],
  3371. DP_MAX_STRING_LEN - index,
  3372. " %u:%u,", i,
  3373. dp_stats_buf->rx_bw_ext[i]);
  3374. }
  3375. DP_PRINT_STATS("rx_bw_ext = %s ", str_buf);
  3376. index = 0;
  3377. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3378. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_PUNCTURED_MODE_COUNTERS; i++) {
  3379. index += qdf_snprint(&str_buf[index],
  3380. DP_MAX_STRING_LEN - index,
  3381. " %u:%u,", i,
  3382. dp_stats_buf->rx_su_punctured_mode[i]);
  3383. }
  3384. DP_PRINT_STATS("rx_su_punctured_mode = %s ", str_buf);
  3385. fail1:
  3386. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  3387. if (ul_ofdma_rx_gi_ext[i])
  3388. qdf_mem_free(ul_ofdma_rx_gi_ext[i]);
  3389. if (rx_gi_ext[i])
  3390. qdf_mem_free(rx_gi_ext[i]);
  3391. }
  3392. qdf_mem_free(str_buf);
  3393. }
  3394. /**
  3395. * dp_print_rx_pdev_rate_stats_tlv() - display htt_rx_pdev_rate_stats_tlv
  3396. * @pdev: pdev pointer
  3397. * @tag_buf: buffer containing the tlv htt_rx_pdev_rate_stats_tlv
  3398. *
  3399. * Return: void
  3400. */
  3401. static void dp_print_rx_pdev_rate_stats_tlv(struct dp_pdev *pdev,
  3402. uint32_t *tag_buf)
  3403. {
  3404. htt_rx_pdev_rate_stats_tlv *dp_stats_buf =
  3405. (htt_rx_pdev_rate_stats_tlv *)tag_buf;
  3406. uint8_t i, j;
  3407. uint16_t index = 0;
  3408. char *rssi_chain[DP_HTT_RSSI_CHAIN_LEN];
  3409. char *rx_gi[HTT_RX_PDEV_STATS_NUM_GI_COUNTERS];
  3410. char *str_buf = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3411. char *ul_ofdma_rx_gi[HTT_TX_PDEV_STATS_NUM_GI_COUNTERS];
  3412. if (!str_buf) {
  3413. dp_err("Output buffer not allocated");
  3414. return;
  3415. }
  3416. for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++) {
  3417. rssi_chain[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3418. if (!rssi_chain[i]) {
  3419. dp_err("Unable to allocate buffer for rssi_chain");
  3420. goto fail1;
  3421. }
  3422. }
  3423. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  3424. rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3425. if (!rx_gi[i]) {
  3426. dp_err("Unable to allocate buffer for rx_gi");
  3427. goto fail2;
  3428. }
  3429. }
  3430. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++) {
  3431. ul_ofdma_rx_gi[i] = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3432. if (!ul_ofdma_rx_gi[i]) {
  3433. dp_err("Unable to allocate buffer for ul_ofdma_rx_gi");
  3434. goto fail3;
  3435. }
  3436. }
  3437. DP_PRINT_STATS("ul_ofdma_data_rx_ppdu = %d",
  3438. pdev->stats.ul_ofdma.data_rx_ppdu);
  3439. for (i = 0; i < OFDMA_NUM_USERS; i++) {
  3440. DP_PRINT_STATS("ul_ofdma data %d user = %d",
  3441. i, pdev->stats.ul_ofdma.data_users[i]);
  3442. }
  3443. index = 0;
  3444. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3445. for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
  3446. index += qdf_snprint(&str_buf[index],
  3447. DP_MAX_STRING_LEN - index,
  3448. " %u:%u,", i,
  3449. pdev->stats.ul_ofdma.data_rx_ru_size[i]);
  3450. }
  3451. DP_PRINT_STATS("ul_ofdma_data_rx_ru_size= %s", str_buf);
  3452. index = 0;
  3453. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3454. for (i = 0; i < OFDMA_NUM_RU_SIZE; i++) {
  3455. index += qdf_snprint(&str_buf[index],
  3456. DP_MAX_STRING_LEN - index,
  3457. " %u:%u,", i,
  3458. pdev->stats.ul_ofdma.nondata_rx_ru_size[i]);
  3459. }
  3460. DP_PRINT_STATS("ul_ofdma_nondata_rx_ru_size= %s", str_buf);
  3461. DP_PRINT_STATS("HTT_RX_PDEV_RATE_STATS_TLV:");
  3462. DP_PRINT_STATS("mac_id__word = %u",
  3463. dp_stats_buf->mac_id__word);
  3464. DP_PRINT_STATS("nsts = %u",
  3465. dp_stats_buf->nsts);
  3466. DP_PRINT_STATS("rx_ldpc = %u",
  3467. dp_stats_buf->rx_ldpc);
  3468. DP_PRINT_STATS("rts_cnt = %u",
  3469. dp_stats_buf->rts_cnt);
  3470. DP_PRINT_STATS("rssi_mgmt = %u",
  3471. dp_stats_buf->rssi_mgmt);
  3472. DP_PRINT_STATS("rssi_data = %u",
  3473. dp_stats_buf->rssi_data);
  3474. DP_PRINT_STATS("rssi_comb = %u",
  3475. dp_stats_buf->rssi_comb);
  3476. DP_PRINT_STATS("rssi_in_dbm = %d",
  3477. dp_stats_buf->rssi_in_dbm);
  3478. DP_PRINT_STATS("rx_11ax_su_ext = %u",
  3479. dp_stats_buf->rx_11ax_su_ext);
  3480. DP_PRINT_STATS("rx_11ac_mumimo = %u",
  3481. dp_stats_buf->rx_11ac_mumimo);
  3482. DP_PRINT_STATS("rx_11ax_mumimo = %u",
  3483. dp_stats_buf->rx_11ax_mumimo);
  3484. DP_PRINT_STATS("rx_11ax_ofdma = %u",
  3485. dp_stats_buf->rx_11ax_ofdma);
  3486. DP_PRINT_STATS("txbf = %u",
  3487. dp_stats_buf->txbf);
  3488. DP_PRINT_STATS("rx_su_ndpa = %u",
  3489. dp_stats_buf->rx_su_ndpa);
  3490. DP_PRINT_STATS("rx_br_poll = %u",
  3491. dp_stats_buf->rx_br_poll);
  3492. index = 0;
  3493. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3494. for (i = 0; i < DP_HTT_RX_MCS_LEN; i++) {
  3495. index += qdf_snprint(&str_buf[index],
  3496. DP_MAX_STRING_LEN - index,
  3497. " %u:%u,", i, dp_stats_buf->rx_mcs[i]);
  3498. }
  3499. for (i = 0; i < DP_HTT_RX_MCS_EXT_LEN; i++) {
  3500. index += qdf_snprint(&str_buf[index],
  3501. DP_MAX_STRING_LEN - index,
  3502. " %u:%u,", i + DP_HTT_RX_MCS_LEN,
  3503. dp_stats_buf->rx_mcs_ext[i]);
  3504. }
  3505. DP_PRINT_STATS("rx_mcs = %s ", str_buf);
  3506. index = 0;
  3507. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3508. for (i = 0; i < DP_HTT_RX_NSS_LEN; i++) {
  3509. /* 0 stands for NSS 1, 1 stands for NSS 2, etc. */
  3510. index += qdf_snprint(&str_buf[index],
  3511. DP_MAX_STRING_LEN - index,
  3512. " %u:%u,", (i + 1),
  3513. dp_stats_buf->rx_nss[i]);
  3514. }
  3515. DP_PRINT_STATS("rx_nss = %s ", str_buf);
  3516. index = 0;
  3517. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3518. for (i = 0; i < DP_HTT_RX_DCM_LEN; i++) {
  3519. index += qdf_snprint(&str_buf[index],
  3520. DP_MAX_STRING_LEN - index,
  3521. " %u:%u,", i, dp_stats_buf->rx_dcm[i]);
  3522. }
  3523. DP_PRINT_STATS("rx_dcm = %s ", str_buf);
  3524. index = 0;
  3525. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3526. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3527. index += qdf_snprint(&str_buf[index],
  3528. DP_MAX_STRING_LEN - index,
  3529. " %u:%u,", i, dp_stats_buf->rx_stbc[i]);
  3530. }
  3531. DP_PRINT_STATS("rx_stbc = %s ", str_buf);
  3532. index = 0;
  3533. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3534. for (i = 0; i < DP_HTT_RX_BW_LEN; i++) {
  3535. index += qdf_snprint(&str_buf[index],
  3536. DP_MAX_STRING_LEN - index,
  3537. " %u:%u,", i, dp_stats_buf->rx_bw[i]);
  3538. }
  3539. DP_PRINT_STATS("rx_bw = %s ", str_buf);
  3540. for (j = 0; j < DP_HTT_RSSI_CHAIN_LEN; j++) {
  3541. index = 0;
  3542. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  3543. index += qdf_snprint(&rssi_chain[j][index],
  3544. DP_MAX_STRING_LEN - index,
  3545. " %u:%u,", i,
  3546. dp_stats_buf->rssi_chain[j][i]);
  3547. }
  3548. DP_PRINT_STATS("rssi_chain[%u] = %s ", j, rssi_chain[j]);
  3549. }
  3550. for (j = 0; j < DP_HTT_RX_GI_LEN; j++) {
  3551. index = 0;
  3552. qdf_mem_zero(rx_gi[j], DP_MAX_STRING_LEN);
  3553. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3554. index += qdf_snprint(&rx_gi[j][index],
  3555. DP_MAX_STRING_LEN - index,
  3556. " %u:%u,", i,
  3557. dp_stats_buf->rx_gi[j][i]);
  3558. }
  3559. DP_PRINT_STATS("rx_gi[%u] = %s ", j, rx_gi[j]);
  3560. }
  3561. index = 0;
  3562. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3563. for (i = 0; i < DP_HTT_RX_PREAM_LEN; i++) {
  3564. index += qdf_snprint(&str_buf[index],
  3565. DP_MAX_STRING_LEN - index,
  3566. " %u:%u,",
  3567. i,
  3568. dp_stats_buf->rx_pream[i]);
  3569. }
  3570. DP_PRINT_STATS("rx_pream = %s", str_buf);
  3571. index = 0;
  3572. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3573. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_CCK_STATS; i++) {
  3574. index += qdf_snprint(&str_buf[index],
  3575. DP_MAX_STRING_LEN - index,
  3576. " %u:%u,",
  3577. i,
  3578. dp_stats_buf->rx_legacy_cck_rate[i]);
  3579. }
  3580. DP_PRINT_STATS("rx_legacy_cck_rate = %s", str_buf);
  3581. index = 0;
  3582. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3583. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_LEGACY_OFDM_STATS; i++) {
  3584. index += qdf_snprint(&str_buf[index],
  3585. DP_MAX_STRING_LEN - index,
  3586. " %u:%u,",
  3587. i,
  3588. dp_stats_buf->rx_legacy_ofdm_rate[i]);
  3589. }
  3590. DP_PRINT_STATS("rx_legacy_ofdm_rate = %s", str_buf);
  3591. index = 0;
  3592. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3593. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3594. index += qdf_snprint(&str_buf[index],
  3595. DP_MAX_STRING_LEN - index,
  3596. " %u:%u,",
  3597. i, dp_stats_buf->ul_ofdma_rx_mcs[i]);
  3598. }
  3599. DP_PRINT_STATS("ul_ofdma_rx_mcs = %s", str_buf);
  3600. DP_PRINT_STATS("rx_11ax_ul_ofdma = %u",
  3601. dp_stats_buf->rx_11ax_ul_ofdma);
  3602. for (j = 0; j < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; j++) {
  3603. index = 0;
  3604. qdf_mem_zero(ul_ofdma_rx_gi[j], DP_MAX_STRING_LEN);
  3605. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3606. index += qdf_snprint(&ul_ofdma_rx_gi[j][index],
  3607. DP_MAX_STRING_LEN - index,
  3608. " %u:%u,", i,
  3609. dp_stats_buf->
  3610. ul_ofdma_rx_gi[j][i]);
  3611. }
  3612. DP_PRINT_STATS("ul_ofdma_rx_gi[%u] = %s ",
  3613. j, ul_ofdma_rx_gi[j]);
  3614. }
  3615. index = 0;
  3616. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3617. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_SPATIAL_STREAMS; i++) {
  3618. index += qdf_snprint(&str_buf[index],
  3619. DP_MAX_STRING_LEN - index,
  3620. " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_nss[i]);
  3621. }
  3622. DP_PRINT_STATS("ul_ofdma_rx_nss = %s", str_buf);
  3623. index = 0;
  3624. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3625. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_BW_COUNTERS; i++) {
  3626. index += qdf_snprint(&str_buf[index],
  3627. DP_MAX_STRING_LEN - index,
  3628. " %u:%u,", i, dp_stats_buf->ul_ofdma_rx_bw[i]);
  3629. }
  3630. DP_PRINT_STATS("ul_ofdma_rx_bw = %s", str_buf);
  3631. DP_PRINT_STATS("ul_ofdma_rx_stbc = %u",
  3632. dp_stats_buf->ul_ofdma_rx_stbc);
  3633. DP_PRINT_STATS("ul_ofdma_rx_ldpc = %u",
  3634. dp_stats_buf->ul_ofdma_rx_ldpc);
  3635. index = 0;
  3636. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3637. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  3638. index += qdf_snprint(&str_buf[index],
  3639. DP_MAX_STRING_LEN - index,
  3640. " %u:%u,", i,
  3641. dp_stats_buf->rx_ulofdma_non_data_ppdu[i]);
  3642. }
  3643. DP_PRINT_STATS("rx_ulofdma_non_data_ppdu = %s", str_buf);
  3644. index = 0;
  3645. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3646. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  3647. index += qdf_snprint(&str_buf[index],
  3648. DP_MAX_STRING_LEN - index,
  3649. " %u:%u,",
  3650. i, dp_stats_buf->rx_ulofdma_data_ppdu[i]);
  3651. }
  3652. DP_PRINT_STATS("rx_ulofdma_data_ppdu = %s", str_buf);
  3653. index = 0;
  3654. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3655. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  3656. index += qdf_snprint(&str_buf[index],
  3657. DP_MAX_STRING_LEN - index,
  3658. " %u:%u,",
  3659. i, dp_stats_buf->rx_ulofdma_mpdu_ok[i]);
  3660. }
  3661. DP_PRINT_STATS("rx_ulofdma_mpdu_ok = %s", str_buf);
  3662. index = 0;
  3663. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3664. for (i = 0; i < HTT_RX_PDEV_MAX_OFDMA_NUM_USER; i++) {
  3665. index += qdf_snprint(&str_buf[index],
  3666. DP_MAX_STRING_LEN - index,
  3667. " %u:%u,",
  3668. i, dp_stats_buf->rx_ulofdma_mpdu_fail[i]);
  3669. }
  3670. DP_PRINT_STATS("rx_ulofdma_mpdu_fail = %s", str_buf);
  3671. index = 0;
  3672. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3673. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3674. index += qdf_snprint(&str_buf[index],
  3675. DP_MAX_STRING_LEN - index,
  3676. " %u:%u,",
  3677. i, dp_stats_buf->rx_11ax_su_txbf_mcs[i]);
  3678. }
  3679. DP_PRINT_STATS("rx_11ax_su_txbf_mcs = %s", str_buf);
  3680. index = 0;
  3681. qdf_mem_zero(str_buf, DP_MAX_STRING_LEN);
  3682. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_MCS_COUNTERS; i++) {
  3683. index += qdf_snprint(&str_buf[index],
  3684. DP_MAX_STRING_LEN - index,
  3685. " %u:%u,",
  3686. i, dp_stats_buf->rx_11ax_mu_txbf_mcs[i]);
  3687. }
  3688. DP_PRINT_STATS("rx_11ax_mu_txbf_mcs = %s", str_buf);
  3689. for (i = 0; i < HTT_TX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  3690. qdf_mem_free(ul_ofdma_rx_gi[i]);
  3691. fail3:
  3692. for (i = 0; i < HTT_RX_PDEV_STATS_NUM_GI_COUNTERS; i++)
  3693. qdf_mem_free(rx_gi[i]);
  3694. fail2:
  3695. for (i = 0; i < DP_HTT_RSSI_CHAIN_LEN; i++)
  3696. qdf_mem_free(rssi_chain[i]);
  3697. fail1:
  3698. qdf_mem_free(str_buf);
  3699. }
  3700. /**
  3701. * dp_print_rx_soc_fw_stats_tlv() - display htt_rx_soc_fw_stats_tlv
  3702. * @tag_buf: buffer containing the tlv htt_rx_soc_fw_stats_tlv
  3703. *
  3704. * Return: void
  3705. */
  3706. static void dp_print_rx_soc_fw_stats_tlv(uint32_t *tag_buf)
  3707. {
  3708. htt_rx_soc_fw_stats_tlv *dp_stats_buf =
  3709. (htt_rx_soc_fw_stats_tlv *)tag_buf;
  3710. DP_PRINT_STATS("HTT_RX_SOC_FW_STATS_TLV:");
  3711. DP_PRINT_STATS("fw_reo_ring_data_msdu = %u",
  3712. dp_stats_buf->fw_reo_ring_data_msdu);
  3713. DP_PRINT_STATS("fw_to_host_data_msdu_bcmc = %u",
  3714. dp_stats_buf->fw_to_host_data_msdu_bcmc);
  3715. DP_PRINT_STATS("fw_to_host_data_msdu_uc = %u",
  3716. dp_stats_buf->fw_to_host_data_msdu_uc);
  3717. DP_PRINT_STATS("ofld_remote_data_buf_recycle_cnt = %u",
  3718. dp_stats_buf->ofld_remote_data_buf_recycle_cnt);
  3719. DP_PRINT_STATS("ofld_remote_free_buf_indication_cnt = %u",
  3720. dp_stats_buf->ofld_remote_free_buf_indication_cnt);
  3721. DP_PRINT_STATS("ofld_buf_to_host_data_msdu_uc = %u ",
  3722. dp_stats_buf->ofld_buf_to_host_data_msdu_uc);
  3723. DP_PRINT_STATS("reo_fw_ring_to_host_data_msdu_uc = %u ",
  3724. dp_stats_buf->reo_fw_ring_to_host_data_msdu_uc);
  3725. DP_PRINT_STATS("wbm_sw_ring_reap = %u ",
  3726. dp_stats_buf->wbm_sw_ring_reap);
  3727. DP_PRINT_STATS("wbm_forward_to_host_cnt = %u ",
  3728. dp_stats_buf->wbm_forward_to_host_cnt);
  3729. DP_PRINT_STATS("wbm_target_recycle_cnt = %u ",
  3730. dp_stats_buf->wbm_target_recycle_cnt);
  3731. DP_PRINT_STATS("target_refill_ring_recycle_cnt = %u",
  3732. dp_stats_buf->target_refill_ring_recycle_cnt);
  3733. }
  3734. /**
  3735. * dp_print_rx_soc_fw_refill_ring_empty_tlv_v() - display
  3736. * htt_rx_soc_fw_refill_ring_empty_tlv_v
  3737. * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_empty_tlv_v
  3738. *
  3739. * Return: void
  3740. */
  3741. static void dp_print_rx_soc_fw_refill_ring_empty_tlv_v(uint32_t *tag_buf)
  3742. {
  3743. htt_rx_soc_fw_refill_ring_empty_tlv_v *dp_stats_buf =
  3744. (htt_rx_soc_fw_refill_ring_empty_tlv_v *)tag_buf;
  3745. uint8_t i;
  3746. uint16_t index = 0;
  3747. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  3748. char *refill_ring_empty_cnt = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3749. if (!refill_ring_empty_cnt) {
  3750. dp_stats_err("Output buffer not allocated");
  3751. return;
  3752. }
  3753. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_REFILL_MAX_RING);
  3754. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_EMPTY_TLV_V:");
  3755. for (i = 0; i < tag_len; i++) {
  3756. index += qdf_snprint(&refill_ring_empty_cnt[index],
  3757. DP_MAX_STRING_LEN - index,
  3758. " %u:%u,", i,
  3759. dp_stats_buf->refill_ring_empty_cnt[i]);
  3760. }
  3761. DP_PRINT_STATS("refill_ring_empty_cnt = %s\n",
  3762. refill_ring_empty_cnt);
  3763. qdf_mem_free(refill_ring_empty_cnt);
  3764. }
  3765. /**
  3766. * dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v() - display
  3767. * htt_rx_soc_fw_refill_ring_num_refill_tlv_v
  3768. * @tag_buf: buffer containing the tlv htt_rx_soc_fw_refill_ring_num_refill_tlv
  3769. *
  3770. * Return: void
  3771. */
  3772. static void dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
  3773. uint32_t *tag_buf)
  3774. {
  3775. htt_rx_soc_fw_refill_ring_num_refill_tlv_v *dp_stats_buf =
  3776. (htt_rx_soc_fw_refill_ring_num_refill_tlv_v *)tag_buf;
  3777. uint8_t i;
  3778. uint16_t index = 0;
  3779. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  3780. char *refill_ring_num_refill = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3781. if (!refill_ring_num_refill) {
  3782. dp_stats_err("Output buffer not allocated");
  3783. return;
  3784. }
  3785. tag_len = qdf_min(tag_len, (uint32_t)HTT_TX_PDEV_MAX_URRN_STATS);
  3786. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REFILL_TLV_V:");
  3787. for (i = 0; i < tag_len; i++) {
  3788. index += qdf_snprint(&refill_ring_num_refill[index],
  3789. DP_MAX_STRING_LEN - index,
  3790. " %u:%u,", i,
  3791. dp_stats_buf->refill_ring_num_refill[i]);
  3792. }
  3793. DP_PRINT_STATS("refill_ring_num_refill = %s\n",
  3794. refill_ring_num_refill);
  3795. qdf_mem_free(refill_ring_num_refill);
  3796. }
  3797. /**
  3798. * dp_print_rx_pdev_fw_stats_tlv() - display htt_rx_pdev_fw_stats_tlv
  3799. * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_stats_tlv
  3800. *
  3801. * Return: void
  3802. */
  3803. static void dp_print_rx_pdev_fw_stats_tlv(uint32_t *tag_buf)
  3804. {
  3805. htt_rx_pdev_fw_stats_tlv *dp_stats_buf =
  3806. (htt_rx_pdev_fw_stats_tlv *)tag_buf;
  3807. uint8_t i;
  3808. uint16_t index = 0;
  3809. char fw_ring_mgmt_subtype[DP_MAX_STRING_LEN];
  3810. char fw_ring_ctrl_subtype[DP_MAX_STRING_LEN];
  3811. DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_TLV:");
  3812. DP_PRINT_STATS("mac_id__word = %u",
  3813. dp_stats_buf->mac_id__word);
  3814. DP_PRINT_STATS("ppdu_recvd = %u",
  3815. dp_stats_buf->ppdu_recvd);
  3816. DP_PRINT_STATS("mpdu_cnt_fcs_ok = %u",
  3817. dp_stats_buf->mpdu_cnt_fcs_ok);
  3818. DP_PRINT_STATS("mpdu_cnt_fcs_err = %u",
  3819. dp_stats_buf->mpdu_cnt_fcs_err);
  3820. DP_PRINT_STATS("tcp_msdu_cnt = %u",
  3821. dp_stats_buf->tcp_msdu_cnt);
  3822. DP_PRINT_STATS("tcp_ack_msdu_cnt = %u",
  3823. dp_stats_buf->tcp_ack_msdu_cnt);
  3824. DP_PRINT_STATS("udp_msdu_cnt = %u",
  3825. dp_stats_buf->udp_msdu_cnt);
  3826. DP_PRINT_STATS("other_msdu_cnt = %u",
  3827. dp_stats_buf->other_msdu_cnt);
  3828. DP_PRINT_STATS("fw_ring_mpdu_ind = %u",
  3829. dp_stats_buf->fw_ring_mpdu_ind);
  3830. for (i = 0; i < DP_HTT_FW_RING_MGMT_SUBTYPE_LEN; i++) {
  3831. index += qdf_snprint(&fw_ring_mgmt_subtype[index],
  3832. DP_MAX_STRING_LEN - index,
  3833. " %u:%u,", i,
  3834. dp_stats_buf->fw_ring_mgmt_subtype[i]);
  3835. }
  3836. DP_PRINT_STATS("fw_ring_mgmt_subtype = %s ", fw_ring_mgmt_subtype);
  3837. index = 0;
  3838. for (i = 0; i < DP_HTT_FW_RING_CTRL_SUBTYPE_LEN; i++) {
  3839. index += qdf_snprint(&fw_ring_ctrl_subtype[index],
  3840. DP_MAX_STRING_LEN - index,
  3841. " %u:%u,", i,
  3842. dp_stats_buf->fw_ring_ctrl_subtype[i]);
  3843. }
  3844. DP_PRINT_STATS("fw_ring_ctrl_subtype = %s ", fw_ring_ctrl_subtype);
  3845. DP_PRINT_STATS("fw_ring_mcast_data_msdu = %u",
  3846. dp_stats_buf->fw_ring_mcast_data_msdu);
  3847. DP_PRINT_STATS("fw_ring_bcast_data_msdu = %u",
  3848. dp_stats_buf->fw_ring_bcast_data_msdu);
  3849. DP_PRINT_STATS("fw_ring_ucast_data_msdu = %u",
  3850. dp_stats_buf->fw_ring_ucast_data_msdu);
  3851. DP_PRINT_STATS("fw_ring_null_data_msdu = %u",
  3852. dp_stats_buf->fw_ring_null_data_msdu);
  3853. DP_PRINT_STATS("fw_ring_mpdu_drop = %u",
  3854. dp_stats_buf->fw_ring_mpdu_drop);
  3855. DP_PRINT_STATS("ofld_local_data_ind_cnt = %u",
  3856. dp_stats_buf->ofld_local_data_ind_cnt);
  3857. DP_PRINT_STATS("ofld_local_data_buf_recycle_cnt = %u",
  3858. dp_stats_buf->ofld_local_data_buf_recycle_cnt);
  3859. DP_PRINT_STATS("drx_local_data_ind_cnt = %u",
  3860. dp_stats_buf->drx_local_data_ind_cnt);
  3861. DP_PRINT_STATS("drx_local_data_buf_recycle_cnt = %u",
  3862. dp_stats_buf->drx_local_data_buf_recycle_cnt);
  3863. DP_PRINT_STATS("local_nondata_ind_cnt = %u",
  3864. dp_stats_buf->local_nondata_ind_cnt);
  3865. DP_PRINT_STATS("local_nondata_buf_recycle_cnt = %u",
  3866. dp_stats_buf->local_nondata_buf_recycle_cnt);
  3867. DP_PRINT_STATS("fw_status_buf_ring_refill_cnt = %u",
  3868. dp_stats_buf->fw_status_buf_ring_refill_cnt);
  3869. DP_PRINT_STATS("fw_status_buf_ring_empty_cnt = %u",
  3870. dp_stats_buf->fw_status_buf_ring_empty_cnt);
  3871. DP_PRINT_STATS("fw_pkt_buf_ring_refill_cnt = %u",
  3872. dp_stats_buf->fw_pkt_buf_ring_refill_cnt);
  3873. DP_PRINT_STATS("fw_pkt_buf_ring_empty_cnt = %u",
  3874. dp_stats_buf->fw_pkt_buf_ring_empty_cnt);
  3875. DP_PRINT_STATS("fw_link_buf_ring_refill_cnt = %u",
  3876. dp_stats_buf->fw_link_buf_ring_refill_cnt);
  3877. DP_PRINT_STATS("fw_link_buf_ring_empty_cnt = %u",
  3878. dp_stats_buf->fw_link_buf_ring_empty_cnt);
  3879. DP_PRINT_STATS("host_pkt_buf_ring_refill_cnt = %u",
  3880. dp_stats_buf->host_pkt_buf_ring_refill_cnt);
  3881. DP_PRINT_STATS("host_pkt_buf_ring_empty_cnt = %u",
  3882. dp_stats_buf->host_pkt_buf_ring_empty_cnt);
  3883. DP_PRINT_STATS("mon_pkt_buf_ring_refill_cnt = %u",
  3884. dp_stats_buf->mon_pkt_buf_ring_refill_cnt);
  3885. DP_PRINT_STATS("mon_pkt_buf_ring_empty_cnt = %u",
  3886. dp_stats_buf->mon_pkt_buf_ring_empty_cnt);
  3887. DP_PRINT_STATS("mon_status_buf_ring_refill_cnt = %u",
  3888. dp_stats_buf->mon_status_buf_ring_refill_cnt);
  3889. DP_PRINT_STATS("mon_status_buf_ring_empty_cnt = %u",
  3890. dp_stats_buf->mon_status_buf_ring_empty_cnt);
  3891. DP_PRINT_STATS("mon_desc_buf_ring_refill_cnt = %u",
  3892. dp_stats_buf->mon_desc_buf_ring_refill_cnt);
  3893. DP_PRINT_STATS("mon_desc_buf_ring_empty_cnt = %u",
  3894. dp_stats_buf->mon_desc_buf_ring_empty_cnt);
  3895. DP_PRINT_STATS("mon_dest_ring_update_cnt = %u",
  3896. dp_stats_buf->mon_dest_ring_update_cnt);
  3897. DP_PRINT_STATS("mon_dest_ring_full_cnt = %u",
  3898. dp_stats_buf->mon_dest_ring_full_cnt);
  3899. DP_PRINT_STATS("rx_suspend_cnt = %u",
  3900. dp_stats_buf->rx_suspend_cnt);
  3901. DP_PRINT_STATS("rx_suspend_fail_cnt = %u",
  3902. dp_stats_buf->rx_suspend_fail_cnt);
  3903. DP_PRINT_STATS("rx_resume_cnt = %u",
  3904. dp_stats_buf->rx_resume_cnt);
  3905. DP_PRINT_STATS("rx_resume_fail_cnt = %u",
  3906. dp_stats_buf->rx_resume_fail_cnt);
  3907. DP_PRINT_STATS("rx_ring_switch_cnt = %u",
  3908. dp_stats_buf->rx_ring_switch_cnt);
  3909. DP_PRINT_STATS("rx_ring_restore_cnt = %u",
  3910. dp_stats_buf->rx_ring_restore_cnt);
  3911. DP_PRINT_STATS("rx_flush_cnt = %u\n",
  3912. dp_stats_buf->rx_flush_cnt);
  3913. }
  3914. /**
  3915. * dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v() - display
  3916. * htt_rx_pdev_fw_ring_mpdu_err_tlv_v
  3917. * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_ring_mpdu_err_tlv_v
  3918. *
  3919. * Return: void
  3920. */
  3921. static void dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(uint32_t *tag_buf)
  3922. {
  3923. htt_rx_pdev_fw_ring_mpdu_err_tlv_v *dp_stats_buf =
  3924. (htt_rx_pdev_fw_ring_mpdu_err_tlv_v *)tag_buf;
  3925. uint8_t i;
  3926. uint16_t index = 0;
  3927. char *fw_ring_mpdu_err = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3928. if (!fw_ring_mpdu_err) {
  3929. dp_stats_err("Output buffer not allocated");
  3930. return;
  3931. }
  3932. DP_PRINT_STATS("HTT_RX_PDEV_FW_RING_MPDU_ERR_TLV_V:");
  3933. for (i = 0; i < DP_HTT_FW_RING_MPDU_ERR_LEN; i++) {
  3934. index += qdf_snprint(&fw_ring_mpdu_err[index],
  3935. DP_MAX_STRING_LEN - index,
  3936. " %u:%u,", i,
  3937. dp_stats_buf->fw_ring_mpdu_err[i]);
  3938. }
  3939. DP_PRINT_STATS("fw_ring_mpdu_err = %s\n", fw_ring_mpdu_err);
  3940. qdf_mem_free(fw_ring_mpdu_err);
  3941. }
  3942. /**
  3943. * dp_print_rx_pdev_fw_mpdu_drop_tlv_v() - display htt_rx_pdev_fw_mpdu_drop_tlv_v
  3944. * @tag_buf: buffer containing the tlv htt_rx_pdev_fw_mpdu_drop_tlv_v
  3945. *
  3946. * Return: void
  3947. */
  3948. static void dp_print_rx_pdev_fw_mpdu_drop_tlv_v(uint32_t *tag_buf)
  3949. {
  3950. htt_rx_pdev_fw_mpdu_drop_tlv_v *dp_stats_buf =
  3951. (htt_rx_pdev_fw_mpdu_drop_tlv_v *)tag_buf;
  3952. uint8_t i;
  3953. uint16_t index = 0;
  3954. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  3955. char *fw_mpdu_drop = qdf_mem_malloc(DP_MAX_STRING_LEN);
  3956. if (!fw_mpdu_drop) {
  3957. dp_stats_err("Output buffer not allocated");
  3958. return;
  3959. }
  3960. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_STATS_FW_DROP_REASON_MAX);
  3961. DP_PRINT_STATS("HTT_RX_PDEV_FW_MPDU_DROP_TLV_V:");
  3962. for (i = 0; i < tag_len; i++) {
  3963. index += qdf_snprint(&fw_mpdu_drop[index],
  3964. DP_MAX_STRING_LEN - index,
  3965. " %u:%u,", i, dp_stats_buf->fw_mpdu_drop[i]);
  3966. }
  3967. DP_PRINT_STATS("fw_mpdu_drop = %s\n", fw_mpdu_drop);
  3968. qdf_mem_free(fw_mpdu_drop);
  3969. }
  3970. /**
  3971. * dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv() - Accounts for rxdma error
  3972. * packets
  3973. * @tag_buf: Buffer
  3974. *
  3975. * Return: void
  3976. */
  3977. static uint64_t
  3978. dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(uint32_t *tag_buf)
  3979. {
  3980. htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *dp_stats_buf =
  3981. (htt_rx_soc_fw_refill_ring_num_rxdma_err_tlv_v *)tag_buf;
  3982. uint8_t i;
  3983. uint16_t index = 0;
  3984. char rxdma_err_cnt[DP_MAX_STRING_LEN];
  3985. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  3986. uint64_t total_rxdma_err_cnt = 0;
  3987. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_RXDMA_MAX_ERR_CODE);
  3988. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_RXDMA_ERR_TLV_V");
  3989. for (i = 0; i < tag_len; i++) {
  3990. index += snprintf(&rxdma_err_cnt[index],
  3991. DP_MAX_STRING_LEN - index,
  3992. " %u() -%u,", i,
  3993. dp_stats_buf->rxdma_err[i]);
  3994. total_rxdma_err_cnt += dp_stats_buf->rxdma_err[i];
  3995. }
  3996. DP_PRINT_STATS("rxdma_err = %s\n", rxdma_err_cnt);
  3997. return total_rxdma_err_cnt;
  3998. }
  3999. /**
  4000. * dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv() - Accounts for reo error
  4001. * packets
  4002. * @tag_buf: Buffer
  4003. *
  4004. * Return: void
  4005. */
  4006. static void dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(uint32_t *tag_buf)
  4007. {
  4008. htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *dp_stats_buf =
  4009. (htt_rx_soc_fw_refill_ring_num_reo_err_tlv_v *)tag_buf;
  4010. uint8_t i;
  4011. uint16_t index = 0;
  4012. char reo_err_cnt[DP_MAX_STRING_LEN];
  4013. uint32_t tag_len = (HTT_STATS_TLV_LENGTH_GET(*tag_buf) >> 2);
  4014. tag_len = qdf_min(tag_len, (uint32_t)HTT_RX_REO_MAX_ERR_CODE);
  4015. DP_PRINT_STATS("HTT_RX_SOC_FW_REFILL_RING_NUM_REO_ERR_TLV_V");
  4016. for (i = 0; i < tag_len; i++) {
  4017. index += snprintf(&reo_err_cnt[index],
  4018. DP_MAX_STRING_LEN - index,
  4019. " %u() -%u,", i,
  4020. dp_stats_buf->reo_err[i]);
  4021. }
  4022. DP_PRINT_STATS("reo_err = %s\n", reo_err_cnt);
  4023. }
  4024. /**
  4025. * dp_print_rx_reo_debug_stats_tlv() - REO Statistics
  4026. * @tag_buf: Buffer
  4027. *
  4028. * Return: void
  4029. */
  4030. static void dp_print_rx_reo_debug_stats_tlv(uint32_t *tag_buf)
  4031. {
  4032. htt_rx_reo_resource_stats_tlv_v *dp_stats_buf =
  4033. (htt_rx_reo_resource_stats_tlv_v *)tag_buf;
  4034. DP_PRINT_STATS("HTT_RX_REO_RESOURCE_STATS_TLV");
  4035. DP_PRINT_STATS("sample_id() - %u ",
  4036. dp_stats_buf->sample_id);
  4037. DP_PRINT_STATS("total_max: %u ",
  4038. dp_stats_buf->total_max);
  4039. DP_PRINT_STATS("total_avg: %u ",
  4040. dp_stats_buf->total_avg);
  4041. DP_PRINT_STATS("total_sample: %u ",
  4042. dp_stats_buf->total_sample);
  4043. DP_PRINT_STATS("non_zeros_avg: %u ",
  4044. dp_stats_buf->non_zeros_avg);
  4045. DP_PRINT_STATS("non_zeros_sample: %u ",
  4046. dp_stats_buf->non_zeros_sample);
  4047. DP_PRINT_STATS("last_non_zeros_max: %u ",
  4048. dp_stats_buf->last_non_zeros_max);
  4049. DP_PRINT_STATS("last_non_zeros_min: %u ",
  4050. dp_stats_buf->last_non_zeros_min);
  4051. DP_PRINT_STATS("last_non_zeros_avg: %u ",
  4052. dp_stats_buf->last_non_zeros_avg);
  4053. DP_PRINT_STATS("last_non_zeros_sample: %u\n ",
  4054. dp_stats_buf->last_non_zeros_sample);
  4055. }
  4056. /**
  4057. * dp_print_rx_pdev_fw_stats_phy_err_tlv() - Accounts for phy errors
  4058. * @tag_buf: Buffer
  4059. *
  4060. * Return: void
  4061. */
  4062. static void dp_print_rx_pdev_fw_stats_phy_err_tlv(uint32_t *tag_buf)
  4063. {
  4064. htt_rx_pdev_fw_stats_phy_err_tlv *dp_stats_buf =
  4065. (htt_rx_pdev_fw_stats_phy_err_tlv *)tag_buf;
  4066. uint8_t i = 0;
  4067. uint16_t index = 0;
  4068. char phy_errs[DP_MAX_STRING_LEN];
  4069. DP_PRINT_STATS("HTT_RX_PDEV_FW_STATS_PHY_ERR_TLV");
  4070. DP_PRINT_STATS("mac_id_word() - %u",
  4071. dp_stats_buf->mac_id__word);
  4072. DP_PRINT_STATS("total_phy_err_cnt: %u",
  4073. dp_stats_buf->total_phy_err_cnt);
  4074. for (i = 0; i < HTT_STATS_PHY_ERR_MAX; i++) {
  4075. index += snprintf(&phy_errs[index],
  4076. DP_MAX_STRING_LEN - index,
  4077. " %u:%u,", i, dp_stats_buf->phy_err[i]);
  4078. }
  4079. DP_PRINT_STATS("phy_errs: %s\n", phy_errs);
  4080. }
  4081. void dp_htt_stats_print_tag(struct dp_pdev *pdev,
  4082. uint8_t tag_type, uint32_t *tag_buf)
  4083. {
  4084. switch (tag_type) {
  4085. case HTT_STATS_TX_PDEV_CMN_TAG:
  4086. dp_print_tx_pdev_stats_cmn_tlv(tag_buf);
  4087. break;
  4088. case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
  4089. dp_print_tx_pdev_stats_urrn_tlv_v(tag_buf);
  4090. break;
  4091. case HTT_STATS_TX_PDEV_SIFS_TAG:
  4092. dp_print_tx_pdev_stats_sifs_tlv_v(tag_buf);
  4093. break;
  4094. case HTT_STATS_TX_PDEV_FLUSH_TAG:
  4095. dp_print_tx_pdev_stats_flush_tlv_v(tag_buf);
  4096. break;
  4097. case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
  4098. dp_print_tx_pdev_stats_phy_err_tlv_v(tag_buf);
  4099. break;
  4100. case HTT_STATS_STRING_TAG:
  4101. dp_print_stats_string_tlv(tag_buf);
  4102. break;
  4103. case HTT_STATS_TX_HWQ_CMN_TAG:
  4104. dp_print_tx_hwq_stats_cmn_tlv(tag_buf);
  4105. break;
  4106. case HTT_STATS_TX_HWQ_DIFS_LATENCY_TAG:
  4107. dp_print_tx_hwq_difs_latency_stats_tlv_v(tag_buf);
  4108. break;
  4109. case HTT_STATS_TX_HWQ_CMD_RESULT_TAG:
  4110. dp_print_tx_hwq_cmd_result_stats_tlv_v(tag_buf);
  4111. break;
  4112. case HTT_STATS_TX_HWQ_CMD_STALL_TAG:
  4113. dp_print_tx_hwq_cmd_stall_stats_tlv_v(tag_buf);
  4114. break;
  4115. case HTT_STATS_TX_HWQ_FES_STATUS_TAG:
  4116. dp_print_tx_hwq_fes_result_stats_tlv_v(tag_buf);
  4117. break;
  4118. case HTT_STATS_TX_TQM_GEN_MPDU_TAG:
  4119. dp_print_tx_tqm_gen_mpdu_stats_tlv_v(tag_buf);
  4120. break;
  4121. case HTT_STATS_TX_TQM_LIST_MPDU_TAG:
  4122. dp_print_tx_tqm_list_mpdu_stats_tlv_v(tag_buf);
  4123. break;
  4124. case HTT_STATS_TX_TQM_LIST_MPDU_CNT_TAG:
  4125. dp_print_tx_tqm_list_mpdu_cnt_tlv_v(tag_buf);
  4126. break;
  4127. case HTT_STATS_TX_TQM_CMN_TAG:
  4128. dp_print_tx_tqm_cmn_stats_tlv(tag_buf);
  4129. break;
  4130. case HTT_STATS_TX_TQM_PDEV_TAG:
  4131. dp_print_tx_tqm_pdev_stats_tlv_v(tag_buf);
  4132. break;
  4133. case HTT_STATS_TX_TQM_CMDQ_STATUS_TAG:
  4134. dp_print_tx_tqm_cmdq_status_tlv(tag_buf);
  4135. break;
  4136. case HTT_STATS_TX_DE_EAPOL_PACKETS_TAG:
  4137. dp_print_tx_de_eapol_packets_stats_tlv(tag_buf);
  4138. break;
  4139. case HTT_STATS_TX_DE_CLASSIFY_FAILED_TAG:
  4140. dp_print_tx_de_classify_failed_stats_tlv(tag_buf);
  4141. break;
  4142. case HTT_STATS_TX_DE_CLASSIFY_STATS_TAG:
  4143. dp_print_tx_de_classify_stats_tlv(tag_buf);
  4144. break;
  4145. case HTT_STATS_TX_DE_CLASSIFY_STATUS_TAG:
  4146. dp_print_tx_de_classify_status_stats_tlv(tag_buf);
  4147. break;
  4148. case HTT_STATS_TX_DE_ENQUEUE_PACKETS_TAG:
  4149. dp_print_tx_de_enqueue_packets_stats_tlv(tag_buf);
  4150. break;
  4151. case HTT_STATS_TX_DE_ENQUEUE_DISCARD_TAG:
  4152. dp_print_tx_de_enqueue_discard_stats_tlv(tag_buf);
  4153. break;
  4154. case HTT_STATS_TX_DE_CMN_TAG:
  4155. dp_print_tx_de_cmn_stats_tlv(tag_buf);
  4156. break;
  4157. case HTT_STATS_RING_IF_TAG:
  4158. dp_print_ring_if_stats_tlv(tag_buf);
  4159. break;
  4160. case HTT_STATS_TX_PDEV_MU_MIMO_STATS_TAG:
  4161. dp_print_tx_pdev_mu_mimo_sch_stats_tlv(tag_buf);
  4162. break;
  4163. case HTT_STATS_SFM_CMN_TAG:
  4164. dp_print_sfm_cmn_tlv(tag_buf);
  4165. break;
  4166. case HTT_STATS_SRING_STATS_TAG:
  4167. dp_print_sring_stats_tlv(tag_buf);
  4168. break;
  4169. case HTT_STATS_RX_PDEV_FW_STATS_TAG:
  4170. dp_print_rx_pdev_fw_stats_tlv(tag_buf);
  4171. break;
  4172. case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
  4173. dp_print_rx_pdev_fw_ring_mpdu_err_tlv_v(tag_buf);
  4174. break;
  4175. case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
  4176. dp_print_rx_pdev_fw_mpdu_drop_tlv_v(tag_buf);
  4177. break;
  4178. case HTT_STATS_RX_SOC_FW_STATS_TAG:
  4179. dp_print_rx_soc_fw_stats_tlv(tag_buf);
  4180. break;
  4181. case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
  4182. dp_print_rx_soc_fw_refill_ring_empty_tlv_v(tag_buf);
  4183. break;
  4184. case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
  4185. dp_print_rx_soc_fw_refill_ring_num_refill_tlv_v(
  4186. tag_buf);
  4187. break;
  4188. case HTT_STATS_TX_PDEV_RATE_STATS_TAG:
  4189. dp_print_tx_pdev_rate_stats_tlv(tag_buf);
  4190. break;
  4191. case HTT_STATS_RX_PDEV_RATE_STATS_TAG:
  4192. dp_print_rx_pdev_rate_stats_tlv(pdev, tag_buf);
  4193. break;
  4194. case HTT_STATS_RX_PDEV_RATE_EXT_STATS_TAG:
  4195. dp_print_rx_pdev_rate_ext_stats_tlv(pdev, tag_buf);
  4196. break;
  4197. case HTT_STATS_TX_PDEV_SCHEDULER_TXQ_STATS_TAG:
  4198. dp_print_tx_pdev_stats_sched_per_txq_tlv(tag_buf);
  4199. break;
  4200. case HTT_STATS_TX_SCHED_CMN_TAG:
  4201. dp_print_stats_tx_sched_cmn_tlv(tag_buf);
  4202. break;
  4203. case HTT_STATS_TX_PDEV_MPDU_STATS_TAG:
  4204. dp_print_tx_pdev_mu_mimo_mpdu_stats_tlv(tag_buf);
  4205. break;
  4206. case HTT_STATS_SCHED_TXQ_CMD_POSTED_TAG:
  4207. dp_print_sched_txq_cmd_posted_tlv_v(tag_buf);
  4208. break;
  4209. case HTT_STATS_RING_IF_CMN_TAG:
  4210. dp_print_ring_if_cmn_tlv(tag_buf);
  4211. break;
  4212. case HTT_STATS_SFM_CLIENT_USER_TAG:
  4213. dp_print_sfm_client_user_tlv_v(tag_buf);
  4214. break;
  4215. case HTT_STATS_SFM_CLIENT_TAG:
  4216. dp_print_sfm_client_tlv(tag_buf);
  4217. break;
  4218. case HTT_STATS_TX_TQM_ERROR_STATS_TAG:
  4219. dp_print_tx_tqm_error_stats_tlv(tag_buf);
  4220. break;
  4221. case HTT_STATS_SCHED_TXQ_CMD_REAPED_TAG:
  4222. dp_print_sched_txq_cmd_reaped_tlv_v(tag_buf);
  4223. break;
  4224. case HTT_STATS_SRING_CMN_TAG:
  4225. dp_print_sring_cmn_tlv(tag_buf);
  4226. break;
  4227. case HTT_STATS_TX_SELFGEN_AC_ERR_STATS_TAG:
  4228. dp_print_tx_selfgen_ac_err_stats_tlv(tag_buf);
  4229. break;
  4230. case HTT_STATS_TX_SELFGEN_CMN_STATS_TAG:
  4231. dp_print_tx_selfgen_cmn_stats_tlv(tag_buf);
  4232. break;
  4233. case HTT_STATS_TX_SELFGEN_AC_STATS_TAG:
  4234. dp_print_tx_selfgen_ac_stats_tlv(tag_buf);
  4235. break;
  4236. case HTT_STATS_TX_SELFGEN_AX_STATS_TAG:
  4237. dp_print_tx_selfgen_ax_stats_tlv(tag_buf);
  4238. break;
  4239. case HTT_STATS_TX_SELFGEN_AX_ERR_STATS_TAG:
  4240. dp_print_tx_selfgen_ax_err_stats_tlv(tag_buf);
  4241. break;
  4242. case HTT_STATS_TX_SELFGEN_BE_STATS_TAG:
  4243. dp_print_tx_selfgen_be_stats_tlv(tag_buf);
  4244. break;
  4245. case HTT_STATS_TX_SELFGEN_BE_ERR_STATS_TAG:
  4246. dp_print_tx_selfgen_be_err_stats_tlv(tag_buf);
  4247. break;
  4248. case HTT_STATS_TX_SOUNDING_STATS_TAG:
  4249. dp_print_tx_sounding_stats_tlv(tag_buf);
  4250. break;
  4251. case HTT_STATS_TX_HWQ_MUMIMO_SCH_STATS_TAG:
  4252. dp_print_tx_hwq_mu_mimo_sch_stats_tlv(tag_buf);
  4253. break;
  4254. case HTT_STATS_TX_HWQ_MUMIMO_MPDU_STATS_TAG:
  4255. dp_print_tx_hwq_mu_mimo_mpdu_stats_tlv(tag_buf);
  4256. break;
  4257. case HTT_STATS_TX_HWQ_MUMIMO_CMN_STATS_TAG:
  4258. dp_print_tx_hwq_mu_mimo_cmn_stats_tlv(tag_buf);
  4259. break;
  4260. case HTT_STATS_HW_INTR_MISC_TAG:
  4261. dp_print_hw_stats_intr_misc_tlv(tag_buf);
  4262. break;
  4263. case HTT_STATS_HW_WD_TIMEOUT_TAG:
  4264. dp_print_hw_stats_wd_timeout_tlv(tag_buf);
  4265. break;
  4266. case HTT_STATS_HW_PDEV_ERRS_TAG:
  4267. dp_print_hw_stats_pdev_errs_tlv(tag_buf);
  4268. break;
  4269. case HTT_STATS_COUNTER_NAME_TAG:
  4270. dp_print_counter_tlv(tag_buf);
  4271. break;
  4272. case HTT_STATS_TX_TID_DETAILS_TAG:
  4273. dp_print_tx_tid_stats_tlv(tag_buf);
  4274. break;
  4275. case HTT_STATS_TX_TID_DETAILS_V1_TAG:
  4276. dp_print_tx_tid_stats_v1_tlv(tag_buf);
  4277. break;
  4278. case HTT_STATS_RX_TID_DETAILS_TAG:
  4279. dp_print_rx_tid_stats_tlv(tag_buf);
  4280. break;
  4281. case HTT_STATS_PEER_STATS_CMN_TAG:
  4282. dp_print_peer_stats_cmn_tlv(tag_buf);
  4283. break;
  4284. case HTT_STATS_PEER_DETAILS_TAG:
  4285. dp_print_peer_details_tlv(tag_buf);
  4286. break;
  4287. case HTT_STATS_PEER_MSDU_FLOWQ_TAG:
  4288. dp_print_msdu_flow_stats_tlv(tag_buf);
  4289. break;
  4290. case HTT_STATS_PEER_TX_RATE_STATS_TAG:
  4291. dp_print_tx_peer_rate_stats_tlv(tag_buf);
  4292. break;
  4293. case HTT_STATS_PEER_RX_RATE_STATS_TAG:
  4294. dp_print_rx_peer_rate_stats_tlv(tag_buf);
  4295. break;
  4296. case HTT_STATS_TX_DE_COMPL_STATS_TAG:
  4297. dp_print_tx_de_compl_stats_tlv(tag_buf);
  4298. break;
  4299. case HTT_STATS_RX_REFILL_RXDMA_ERR_TAG:
  4300. pdev->stats.err.fw_reported_rxdma_error =
  4301. dp_print_rx_soc_fw_refill_ring_num_rxdma_err_tlv(tag_buf);
  4302. break;
  4303. case HTT_STATS_RX_REFILL_REO_ERR_TAG:
  4304. dp_print_rx_soc_fw_refill_ring_num_reo_err_tlv(tag_buf);
  4305. break;
  4306. case HTT_STATS_RX_REO_RESOURCE_STATS_TAG:
  4307. dp_print_rx_reo_debug_stats_tlv(tag_buf);
  4308. break;
  4309. case HTT_STATS_RX_PDEV_FW_STATS_PHY_ERR_TAG:
  4310. dp_print_rx_pdev_fw_stats_phy_err_tlv(tag_buf);
  4311. break;
  4312. default:
  4313. break;
  4314. }
  4315. }
  4316. void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf)
  4317. {
  4318. void *dest_ptr = NULL;
  4319. uint32_t size = 0;
  4320. uint32_t size_expected = 0;
  4321. uint64_t val = 1;
  4322. pdev->fw_stats_tlv_bitmap_rcvd |= (val << tag_type);
  4323. switch (tag_type) {
  4324. case HTT_STATS_TX_PDEV_CMN_TAG:
  4325. dest_ptr = &pdev->stats.htt_tx_pdev_stats.cmn_tlv;
  4326. size = sizeof(htt_tx_pdev_stats_cmn_tlv);
  4327. size_expected = sizeof(struct cdp_htt_tx_pdev_stats_cmn_tlv);
  4328. break;
  4329. case HTT_STATS_TX_PDEV_UNDERRUN_TAG:
  4330. dest_ptr = &pdev->stats.htt_tx_pdev_stats.underrun_tlv;
  4331. size = sizeof(htt_tx_pdev_stats_urrn_tlv_v);
  4332. size_expected = sizeof(struct cdp_htt_tx_pdev_stats_urrn_tlv_v);
  4333. break;
  4334. case HTT_STATS_TX_PDEV_SIFS_TAG:
  4335. dest_ptr = &pdev->stats.htt_tx_pdev_stats.sifs_tlv;
  4336. size = sizeof(htt_tx_pdev_stats_sifs_tlv_v);
  4337. size_expected = sizeof(struct cdp_htt_tx_pdev_stats_sifs_tlv_v);
  4338. break;
  4339. case HTT_STATS_TX_PDEV_FLUSH_TAG:
  4340. dest_ptr = &pdev->stats.htt_tx_pdev_stats.flush_tlv;
  4341. size = sizeof(htt_tx_pdev_stats_flush_tlv_v);
  4342. size_expected =
  4343. sizeof(struct cdp_htt_tx_pdev_stats_flush_tlv_v);
  4344. break;
  4345. case HTT_STATS_TX_PDEV_PHY_ERR_TAG:
  4346. dest_ptr = &pdev->stats.htt_tx_pdev_stats.phy_err_tlv;
  4347. size = sizeof(htt_tx_pdev_stats_phy_err_tlv_v);
  4348. size_expected =
  4349. sizeof(struct cdp_htt_tx_pdev_stats_phy_err_tlv_v);
  4350. break;
  4351. case HTT_STATS_RX_PDEV_FW_STATS_TAG:
  4352. dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_stats_tlv;
  4353. size = sizeof(htt_rx_pdev_fw_stats_tlv);
  4354. size_expected = sizeof(struct cdp_htt_rx_pdev_fw_stats_tlv);
  4355. break;
  4356. case HTT_STATS_RX_SOC_FW_STATS_TAG:
  4357. dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_tlv;
  4358. size = sizeof(htt_rx_soc_fw_stats_tlv);
  4359. size_expected = sizeof(struct cdp_htt_rx_soc_fw_stats_tlv);
  4360. break;
  4361. case HTT_STATS_RX_SOC_FW_REFILL_RING_EMPTY_TAG:
  4362. dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_empty_tlv;
  4363. size = sizeof(htt_rx_soc_fw_refill_ring_empty_tlv_v);
  4364. size_expected =
  4365. sizeof(struct cdp_htt_rx_soc_fw_refill_ring_empty_tlv_v);
  4366. break;
  4367. case HTT_STATS_RX_SOC_FW_REFILL_RING_NUM_REFILL_TAG:
  4368. dest_ptr = &pdev->stats.htt_rx_pdev_stats.soc_stats.fw_refill_ring_num_refill_tlv;
  4369. size = sizeof(htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
  4370. size_expected =
  4371. sizeof(struct cdp_htt_rx_soc_fw_refill_ring_num_refill_tlv_v);
  4372. break;
  4373. case HTT_STATS_RX_PDEV_FW_RING_MPDU_ERR_TAG:
  4374. dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_err_tlv;
  4375. size = sizeof(htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
  4376. size_expected =
  4377. sizeof(struct cdp_htt_rx_pdev_fw_ring_mpdu_err_tlv_v);
  4378. break;
  4379. case HTT_STATS_RX_PDEV_FW_MPDU_DROP_TAG:
  4380. dest_ptr = &pdev->stats.htt_rx_pdev_stats.fw_ring_mpdu_drop;
  4381. size = sizeof(htt_rx_pdev_fw_mpdu_drop_tlv_v);
  4382. size_expected =
  4383. sizeof(struct cdp_htt_rx_pdev_fw_mpdu_drop_tlv_v);
  4384. break;
  4385. default:
  4386. break;
  4387. }
  4388. if (size_expected < size)
  4389. dp_warn("Buffer Overflow:FW Struct Size:%d Host Struct Size:%d"
  4390. , size, size_expected);
  4391. if (dest_ptr)
  4392. qdf_mem_copy(dest_ptr, tag_buf, size_expected);
  4393. if (((pdev->fw_stats_tlv_bitmap_rcvd) & DP_HTT_TX_RX_EXPECTED_TLVS)
  4394. == DP_HTT_TX_RX_EXPECTED_TLVS) {
  4395. qdf_event_set(&pdev->fw_stats_event);
  4396. }
  4397. }
  4398. #ifdef VDEV_PEER_PROTOCOL_COUNT
  4399. #ifdef VDEV_PEER_PROTOCOL_COUNT_TESTING
  4400. static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
  4401. bool is_egress,
  4402. bool is_rx)
  4403. {
  4404. int mask;
  4405. if (is_egress)
  4406. if (is_rx)
  4407. mask = VDEV_PEER_PROTOCOL_RX_EGRESS_MASK;
  4408. else
  4409. mask = VDEV_PEER_PROTOCOL_TX_EGRESS_MASK;
  4410. else
  4411. if (is_rx)
  4412. mask = VDEV_PEER_PROTOCOL_RX_INGRESS_MASK;
  4413. else
  4414. mask = VDEV_PEER_PROTOCOL_TX_INGRESS_MASK;
  4415. if (qdf_unlikely(vdev->peer_protocol_count_dropmask & mask)) {
  4416. dp_info("drop mask set %x", vdev->peer_protocol_count_dropmask);
  4417. return QDF_STATUS_SUCCESS;
  4418. }
  4419. return QDF_STATUS_E_FAILURE;
  4420. }
  4421. #else
  4422. static QDF_STATUS dp_peer_stats_update_protocol_test_cnt(struct dp_vdev *vdev,
  4423. bool is_egress,
  4424. bool is_rx)
  4425. {
  4426. return QDF_STATUS_E_FAILURE;
  4427. }
  4428. #endif
  4429. void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
  4430. qdf_nbuf_t nbuf,
  4431. struct dp_txrx_peer *txrx_peer,
  4432. bool is_egress,
  4433. bool is_rx)
  4434. {
  4435. struct dp_peer_per_pkt_stats *per_pkt_stats;
  4436. struct protocol_trace_count *protocol_trace_cnt;
  4437. enum cdp_protocol_trace prot;
  4438. struct dp_soc *soc;
  4439. struct ether_header *eh;
  4440. char *mac;
  4441. bool new_peer_ref = false;
  4442. struct dp_peer *peer = NULL;
  4443. if (qdf_likely(!vdev->peer_protocol_count_track))
  4444. return;
  4445. if (qdf_unlikely(dp_peer_stats_update_protocol_test_cnt(vdev,
  4446. is_egress,
  4447. is_rx) ==
  4448. QDF_STATUS_SUCCESS))
  4449. return;
  4450. soc = vdev->pdev->soc;
  4451. eh = (struct ether_header *)qdf_nbuf_data(nbuf);
  4452. if (is_rx)
  4453. mac = eh->ether_shost;
  4454. else
  4455. mac = eh->ether_dhost;
  4456. if (!txrx_peer) {
  4457. peer = dp_peer_find_hash_find(soc, mac, 0, vdev->vdev_id,
  4458. DP_MOD_ID_GENERIC_STATS);
  4459. new_peer_ref = true;
  4460. if (!peer)
  4461. return;
  4462. txrx_peer = peer->txrx_peer;
  4463. if (!txrx_peer)
  4464. goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
  4465. }
  4466. per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
  4467. if (qdf_nbuf_is_icmp_pkt(nbuf) == true)
  4468. prot = CDP_TRACE_ICMP;
  4469. else if (qdf_nbuf_is_ipv4_arp_pkt(nbuf) == true)
  4470. prot = CDP_TRACE_ARP;
  4471. else if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf) == true)
  4472. prot = CDP_TRACE_EAP;
  4473. else
  4474. goto dp_vdev_peer_stats_update_protocol_cnt_free_peer;
  4475. if (is_rx)
  4476. protocol_trace_cnt = per_pkt_stats->rx.protocol_trace_cnt;
  4477. else
  4478. protocol_trace_cnt = per_pkt_stats->tx.protocol_trace_cnt;
  4479. if (is_egress)
  4480. protocol_trace_cnt[prot].egress_cnt++;
  4481. else
  4482. protocol_trace_cnt[prot].ingress_cnt++;
  4483. dp_vdev_peer_stats_update_protocol_cnt_free_peer:
  4484. if (new_peer_ref)
  4485. dp_peer_unref_delete(peer, DP_MOD_ID_GENERIC_STATS);
  4486. }
  4487. void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc_hdl,
  4488. int8_t vdev_id,
  4489. qdf_nbuf_t nbuf,
  4490. bool is_egress,
  4491. bool is_rx)
  4492. {
  4493. struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
  4494. struct dp_vdev *vdev;
  4495. vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_GENERIC_STATS);
  4496. if (!vdev)
  4497. return;
  4498. if (qdf_likely(vdev->peer_protocol_count_track))
  4499. dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, NULL,
  4500. is_egress, is_rx);
  4501. dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
  4502. }
  4503. #endif
  4504. #if defined(QCA_ENH_V3_STATS_SUPPORT) || defined(HW_TX_DELAY_STATS_ENABLE)
  4505. /**
  4506. * dp_vow_str_fw_to_hw_delay() - Return string for a delay
  4507. * @index: Index of delay
  4508. *
  4509. * Return: char const pointer
  4510. */
  4511. static inline const char *dp_vow_str_fw_to_hw_delay(uint8_t index)
  4512. {
  4513. if (index > CDP_DELAY_BUCKET_MAX) {
  4514. return "Invalid index";
  4515. }
  4516. return fw_to_hw_delay_bucket[index];
  4517. }
  4518. /**
  4519. * dp_accumulate_delay_stats() - Update delay stats members
  4520. * @total: Update stats total structure
  4521. * @per_ring: per ring structures from where stats need to be accumulated
  4522. *
  4523. * Return: void
  4524. */
  4525. static void
  4526. dp_accumulate_delay_stats(struct cdp_delay_stats *total,
  4527. struct cdp_delay_stats *per_ring)
  4528. {
  4529. uint8_t index;
  4530. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++)
  4531. total->delay_bucket[index] += per_ring->delay_bucket[index];
  4532. total->min_delay = QDF_MIN(total->min_delay, per_ring->min_delay);
  4533. total->max_delay = QDF_MAX(total->max_delay, per_ring->max_delay);
  4534. total->avg_delay = ((total->avg_delay + per_ring->avg_delay) >> 1);
  4535. }
  4536. #endif
  4537. #ifdef QCA_ENH_V3_STATS_SUPPORT
  4538. /**
  4539. * dp_vow_str_sw_enq_delay() - Return string for a delay
  4540. * @index: Index of delay
  4541. *
  4542. * Return: char const pointer
  4543. */
  4544. static inline const char *dp_vow_str_sw_enq_delay(uint8_t index)
  4545. {
  4546. if (index > CDP_DELAY_BUCKET_MAX) {
  4547. return "Invalid index";
  4548. }
  4549. return sw_enq_delay_bucket[index];
  4550. }
  4551. /**
  4552. * dp_vow_str_intfrm_delay() - Return string for a delay
  4553. * @index: Index of delay
  4554. *
  4555. * Return: char const pointer
  4556. */
  4557. static inline const char *dp_vow_str_intfrm_delay(uint8_t index)
  4558. {
  4559. if (index > CDP_DELAY_BUCKET_MAX) {
  4560. return "Invalid index";
  4561. }
  4562. return intfrm_delay_bucket[index];
  4563. }
  4564. /**
  4565. * dp_accumulate_tid_stats() - Accumulate TID stats from each ring
  4566. * @pdev: pdev handle
  4567. * @tid: traffic ID
  4568. * @total_tx: fill this tx structure to get stats from all wbm rings
  4569. * @total_rx: fill this rx structure to get stats from all reo rings
  4570. * @type: delay stats or regular frame counters
  4571. *
  4572. * Return: void
  4573. */
  4574. static void
  4575. dp_accumulate_tid_stats(struct dp_pdev *pdev, uint8_t tid,
  4576. struct cdp_tid_tx_stats *total_tx,
  4577. struct cdp_tid_rx_stats *total_rx, uint8_t type)
  4578. {
  4579. uint8_t i = 0, ring_id = 0, drop = 0, tqm_status_idx = 0, htt_status_idx = 0;
  4580. struct cdp_tid_stats *tid_stats = &pdev->stats.tid_stats;
  4581. struct cdp_tid_tx_stats *per_ring_tx = NULL;
  4582. struct cdp_tid_rx_stats *per_ring_rx = NULL;
  4583. if (wlan_cfg_get_dp_soc_nss_cfg(pdev->soc->wlan_cfg_ctx)) {
  4584. qdf_mem_copy(total_tx, &tid_stats->tid_tx_stats[0][tid],
  4585. sizeof(struct cdp_tid_tx_stats));
  4586. qdf_mem_copy(total_rx, &tid_stats->tid_rx_stats[0][tid],
  4587. sizeof(struct cdp_tid_rx_stats));
  4588. return;
  4589. } else {
  4590. qdf_mem_zero(total_tx, sizeof(struct cdp_tid_tx_stats));
  4591. qdf_mem_zero(total_rx, sizeof(struct cdp_tid_rx_stats));
  4592. }
  4593. switch (type) {
  4594. case TID_COUNTER_STATS:
  4595. {
  4596. for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
  4597. per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
  4598. total_tx->success_cnt += per_ring_tx->success_cnt;
  4599. total_tx->comp_fail_cnt += per_ring_tx->comp_fail_cnt;
  4600. for (tqm_status_idx = 0; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
  4601. total_tx->tqm_status_cnt[tqm_status_idx] +=
  4602. per_ring_tx->tqm_status_cnt[tqm_status_idx];
  4603. }
  4604. for (htt_status_idx = 0; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
  4605. total_tx->htt_status_cnt[htt_status_idx] +=
  4606. per_ring_tx->htt_status_cnt[htt_status_idx];
  4607. }
  4608. for (drop = 0; drop < TX_MAX_DROP; drop++)
  4609. total_tx->swdrop_cnt[drop] +=
  4610. per_ring_tx->swdrop_cnt[drop];
  4611. }
  4612. for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
  4613. per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
  4614. total_rx->delivered_to_stack +=
  4615. per_ring_rx->delivered_to_stack;
  4616. total_rx->intrabss_cnt += per_ring_rx->intrabss_cnt;
  4617. total_rx->msdu_cnt += per_ring_rx->msdu_cnt;
  4618. total_rx->mcast_msdu_cnt += per_ring_rx->mcast_msdu_cnt;
  4619. total_rx->bcast_msdu_cnt += per_ring_rx->bcast_msdu_cnt;
  4620. for (drop = 0; drop < RX_MAX_DROP; drop++)
  4621. total_rx->fail_cnt[drop] +=
  4622. per_ring_rx->fail_cnt[drop];
  4623. }
  4624. break;
  4625. }
  4626. case TID_DELAY_STATS:
  4627. {
  4628. for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
  4629. per_ring_tx = &tid_stats->tid_tx_stats[ring_id][tid];
  4630. dp_accumulate_delay_stats(&total_tx->swq_delay,
  4631. &per_ring_tx->swq_delay);
  4632. dp_accumulate_delay_stats(&total_tx->hwtx_delay,
  4633. &per_ring_tx->hwtx_delay);
  4634. dp_accumulate_delay_stats(&total_tx->intfrm_delay,
  4635. &per_ring_tx->intfrm_delay);
  4636. }
  4637. for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
  4638. per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
  4639. dp_accumulate_delay_stats(&total_rx->intfrm_delay,
  4640. &per_ring_rx->intfrm_delay);
  4641. dp_accumulate_delay_stats(&total_rx->to_stack_delay,
  4642. &per_ring_rx->to_stack_delay);
  4643. }
  4644. break;
  4645. }
  4646. case TID_RX_ERROR_STATS:
  4647. {
  4648. for (ring_id = 0; ring_id < CDP_MAX_RX_RINGS; ring_id++) {
  4649. per_ring_rx = &tid_stats->tid_rx_stats[ring_id][tid];
  4650. total_rx->reo_err.err_src_reo_code_inv += per_ring_rx->reo_err.err_src_reo_code_inv;
  4651. for (i = 0; i < CDP_REO_CODE_MAX; i++) {
  4652. total_rx->reo_err.err_reo_codes[i] += per_ring_rx->reo_err.err_reo_codes[i];
  4653. }
  4654. total_rx->rxdma_err.err_src_rxdma_code_inv += per_ring_rx->rxdma_err.err_src_rxdma_code_inv;
  4655. for (i = 0; i < CDP_DMA_CODE_MAX; i++) {
  4656. total_rx->rxdma_err.err_dma_codes[i] += per_ring_rx->rxdma_err.err_dma_codes[i];
  4657. }
  4658. }
  4659. break;
  4660. }
  4661. default:
  4662. qdf_err("Invalid stats type");
  4663. break;
  4664. }
  4665. }
  4666. void dp_pdev_print_tid_stats(struct dp_pdev *pdev)
  4667. {
  4668. struct cdp_tid_tx_stats total_tx;
  4669. struct cdp_tid_rx_stats total_rx;
  4670. uint8_t tid, tqm_status_idx, htt_status_idx;
  4671. struct cdp_tid_rx_stats *rx_wbm_stats = NULL;
  4672. DP_PRINT_STATS("Packets received in hardstart: %llu ",
  4673. pdev->stats.tid_stats.ingress_stack);
  4674. DP_PRINT_STATS("Packets dropped in osif layer: %llu ",
  4675. pdev->stats.tid_stats.osif_drop);
  4676. DP_PRINT_STATS("Per TID Video Stats:\n");
  4677. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  4678. rx_wbm_stats = &pdev->stats.tid_stats.tid_rx_wbm_stats[0][tid];
  4679. dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
  4680. TID_COUNTER_STATS);
  4681. DP_PRINT_STATS("----TID: %d----", tid);
  4682. DP_PRINT_STATS("Tx TQM Success Count: %llu",
  4683. total_tx.tqm_status_cnt[HAL_TX_TQM_RR_FRAME_ACKED]);
  4684. DP_PRINT_STATS("Tx HTT Success Count: %llu",
  4685. total_tx.htt_status_cnt[HTT_TX_FW2WBM_TX_STATUS_OK]);
  4686. for (tqm_status_idx = 1; tqm_status_idx < CDP_MAX_TX_TQM_STATUS; tqm_status_idx++) {
  4687. if (total_tx.tqm_status_cnt[tqm_status_idx]) {
  4688. DP_PRINT_STATS("Tx TQM Drop Count[%d]: %llu",
  4689. tqm_status_idx, total_tx.tqm_status_cnt[tqm_status_idx]);
  4690. }
  4691. }
  4692. for (htt_status_idx = 1; htt_status_idx < CDP_MAX_TX_HTT_STATUS; htt_status_idx++) {
  4693. if (total_tx.htt_status_cnt[htt_status_idx]) {
  4694. DP_PRINT_STATS("Tx HTT Drop Count[%d]: %llu",
  4695. htt_status_idx, total_tx.htt_status_cnt[htt_status_idx]);
  4696. }
  4697. }
  4698. DP_PRINT_STATS("Tx Hardware Drop Count: %llu",
  4699. total_tx.swdrop_cnt[TX_HW_ENQUEUE]);
  4700. DP_PRINT_STATS("Tx Software Drop Count: %llu",
  4701. total_tx.swdrop_cnt[TX_SW_ENQUEUE]);
  4702. DP_PRINT_STATS("Tx Descriptor Error Count: %llu",
  4703. total_tx.swdrop_cnt[TX_DESC_ERR]);
  4704. DP_PRINT_STATS("Tx HAL Ring Error Count: %llu",
  4705. total_tx.swdrop_cnt[TX_HAL_RING_ACCESS_ERR]);
  4706. DP_PRINT_STATS("Tx Dma Map Error Count: %llu",
  4707. total_tx.swdrop_cnt[TX_DMA_MAP_ERR]);
  4708. DP_PRINT_STATS("Rx Delievered Count: %llu",
  4709. total_rx.delivered_to_stack);
  4710. DP_PRINT_STATS("Rx Software Enqueue Drop Count: %llu",
  4711. total_rx.fail_cnt[ENQUEUE_DROP]);
  4712. DP_PRINT_STATS("Rx Intrabss Drop Count: %llu",
  4713. total_rx.fail_cnt[INTRABSS_DROP]);
  4714. DP_PRINT_STATS("Rx Msdu Done Failure Count: %llu",
  4715. total_rx.fail_cnt[MSDU_DONE_FAILURE]);
  4716. DP_PRINT_STATS("Rx Invalid Peer Count: %llu",
  4717. total_rx.fail_cnt[INVALID_PEER_VDEV]);
  4718. DP_PRINT_STATS("Rx Policy Check Drop Count: %llu",
  4719. total_rx.fail_cnt[POLICY_CHECK_DROP]);
  4720. DP_PRINT_STATS("Rx Mec Drop Count: %llu",
  4721. total_rx.fail_cnt[MEC_DROP]);
  4722. DP_PRINT_STATS("Rx Nawds Mcast Drop Count: %llu",
  4723. total_rx.fail_cnt[NAWDS_MCAST_DROP]);
  4724. DP_PRINT_STATS("Rx Mesh Filter Drop Count: %llu",
  4725. total_rx.fail_cnt[MESH_FILTER_DROP]);
  4726. DP_PRINT_STATS("Rx Intra Bss Deliver Count: %llu",
  4727. total_rx.intrabss_cnt);
  4728. DP_PRINT_STATS("Rx MSDU Count: %llu", total_rx.msdu_cnt);
  4729. DP_PRINT_STATS("Rx Multicast MSDU Count: %llu",
  4730. total_rx.mcast_msdu_cnt);
  4731. DP_PRINT_STATS("Rx Broadcast MSDU Count: %llu\n",
  4732. total_rx.bcast_msdu_cnt);
  4733. DP_PRINT_STATS("Rx WBM Intra Bss Deliver Count: %llu",
  4734. rx_wbm_stats->intrabss_cnt);
  4735. DP_PRINT_STATS("Rx WBM Intrabss Drop Count: %llu",
  4736. rx_wbm_stats->fail_cnt[INTRABSS_DROP]);
  4737. }
  4738. }
  4739. void dp_pdev_print_delay_stats(struct dp_pdev *pdev)
  4740. {
  4741. struct dp_soc *soc = pdev->soc;
  4742. struct cdp_tid_tx_stats total_tx;
  4743. struct cdp_tid_rx_stats total_rx;
  4744. uint8_t tid, index;
  4745. uint64_t count = 0;
  4746. if (!soc)
  4747. return;
  4748. tid = 0;
  4749. index = 0;
  4750. DP_PRINT_STATS("Per TID Delay Non-Zero Stats:\n");
  4751. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  4752. dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
  4753. TID_DELAY_STATS);
  4754. DP_PRINT_STATS("----TID: %d----", tid);
  4755. DP_PRINT_STATS("Software Enqueue Delay:");
  4756. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  4757. count = total_tx.swq_delay.delay_bucket[index];
  4758. if (count) {
  4759. DP_PRINT_STATS("%s: Packets = %llu",
  4760. dp_vow_str_sw_enq_delay(index),
  4761. count);
  4762. }
  4763. }
  4764. DP_PRINT_STATS("Min = %u", total_tx.swq_delay.min_delay);
  4765. DP_PRINT_STATS("Max = %u", total_tx.swq_delay.max_delay);
  4766. DP_PRINT_STATS("Avg = %u\n", total_tx.swq_delay.avg_delay);
  4767. DP_PRINT_STATS("Hardware Transmission Delay:");
  4768. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  4769. count = total_tx.hwtx_delay.delay_bucket[index];
  4770. if (count) {
  4771. DP_PRINT_STATS("%s: Packets = %llu",
  4772. dp_vow_str_fw_to_hw_delay(index),
  4773. count);
  4774. }
  4775. }
  4776. DP_PRINT_STATS("Min = %u", total_tx.hwtx_delay.min_delay);
  4777. DP_PRINT_STATS("Max = %u", total_tx.hwtx_delay.max_delay);
  4778. DP_PRINT_STATS("Avg = %u\n", total_tx.hwtx_delay.avg_delay);
  4779. DP_PRINT_STATS("Tx Interframe Delay:");
  4780. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  4781. count = total_tx.intfrm_delay.delay_bucket[index];
  4782. if (count) {
  4783. DP_PRINT_STATS("%s: Packets = %llu",
  4784. dp_vow_str_intfrm_delay(index),
  4785. count);
  4786. }
  4787. }
  4788. DP_PRINT_STATS("Min = %u", total_tx.intfrm_delay.min_delay);
  4789. DP_PRINT_STATS("Max = %u", total_tx.intfrm_delay.max_delay);
  4790. DP_PRINT_STATS("Avg = %u\n", total_tx.intfrm_delay.avg_delay);
  4791. DP_PRINT_STATS("Rx Interframe Delay:");
  4792. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  4793. count = total_rx.intfrm_delay.delay_bucket[index];
  4794. if (count) {
  4795. DP_PRINT_STATS("%s: Packets = %llu",
  4796. dp_vow_str_intfrm_delay(index),
  4797. count);
  4798. }
  4799. }
  4800. DP_PRINT_STATS("Min = %u", total_rx.intfrm_delay.min_delay);
  4801. DP_PRINT_STATS("Max = %u", total_rx.intfrm_delay.max_delay);
  4802. DP_PRINT_STATS("Avg = %u\n", total_rx.intfrm_delay.avg_delay);
  4803. DP_PRINT_STATS("Rx Reap to Stack Delay:");
  4804. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  4805. count = total_rx.to_stack_delay.delay_bucket[index];
  4806. if (count) {
  4807. DP_PRINT_STATS("%s: Packets = %llu",
  4808. dp_vow_str_intfrm_delay(index),
  4809. count);
  4810. }
  4811. }
  4812. DP_PRINT_STATS("Min = %u", total_rx.to_stack_delay.min_delay);
  4813. DP_PRINT_STATS("Max = %u", total_rx.to_stack_delay.max_delay);
  4814. DP_PRINT_STATS("Avg = %u\n", total_rx.to_stack_delay.avg_delay);
  4815. }
  4816. }
  4817. void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev)
  4818. {
  4819. struct dp_soc *soc = pdev->soc;
  4820. struct cdp_tid_rx_stats total_rx;
  4821. struct cdp_tid_tx_stats total_tx;
  4822. uint8_t tid, index;
  4823. if (!soc)
  4824. return;
  4825. DP_PRINT_STATS("Per TID RX Error Stats:\n");
  4826. for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
  4827. dp_accumulate_tid_stats(pdev, tid, &total_tx, &total_rx,
  4828. TID_RX_ERROR_STATS);
  4829. DP_PRINT_STATS("----TID: %d----", tid + 4);
  4830. DP_PRINT_STATS("Rx REO Error stats:");
  4831. DP_PRINT_STATS("err_src_reo_code_inv = %llu", total_rx.reo_err.err_src_reo_code_inv);
  4832. for (index = 0; index < CDP_REO_CODE_MAX; index++) {
  4833. DP_PRINT_STATS("err src reo codes: %d = %llu", index, total_rx.reo_err.err_reo_codes[index]);
  4834. }
  4835. DP_PRINT_STATS("Rx Rxdma Error stats:");
  4836. DP_PRINT_STATS("err_src_rxdma_code_inv = %llu", total_rx.rxdma_err.err_src_rxdma_code_inv);
  4837. for (index = 0; index < CDP_DMA_CODE_MAX; index++) {
  4838. DP_PRINT_STATS("err src dma codes: %d = %llu", index, total_rx.rxdma_err.err_dma_codes[index]);
  4839. }
  4840. }
  4841. }
  4842. QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  4843. struct cdp_tid_stats_intf *tid_stats)
  4844. {
  4845. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  4846. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
  4847. struct cdp_tid_rx_stats rx;
  4848. struct cdp_tid_tx_stats tx;
  4849. uint8_t tid;
  4850. uint32_t size;
  4851. if (!pdev)
  4852. return QDF_STATUS_E_INVAL;
  4853. size = sizeof(struct cdp_delay_stats);
  4854. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  4855. dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_COUNTER_STATS);
  4856. /* Copy specific accumulated Tx tid stats */
  4857. tid_stats->tx_total[tid].success_cnt = tx.success_cnt;
  4858. tid_stats->tx_total[tid].comp_fail_cnt = tx.comp_fail_cnt;
  4859. qdf_mem_copy(&tid_stats->tx_total[tid].tqm_status_cnt[0],
  4860. &tx.tqm_status_cnt[0],
  4861. CDP_MAX_TX_TQM_STATUS * sizeof(uint64_t));
  4862. qdf_mem_copy(&tid_stats->tx_total[tid].htt_status_cnt[0],
  4863. &tx.htt_status_cnt[0],
  4864. CDP_MAX_TX_HTT_STATUS * sizeof(uint64_t));
  4865. qdf_mem_copy(&tid_stats->tx_total[tid].swdrop_cnt[0],
  4866. &tx.swdrop_cnt[0], TX_MAX_DROP * sizeof(uint64_t));
  4867. /* Copy specific accumulated Rx tid stats */
  4868. tid_stats->rx_total[tid].delivered_to_stack =
  4869. rx.delivered_to_stack;
  4870. tid_stats->rx_total[tid].intrabss_cnt = rx.intrabss_cnt;
  4871. tid_stats->rx_total[tid].msdu_cnt = rx.msdu_cnt;
  4872. tid_stats->rx_total[tid].mcast_msdu_cnt = rx.mcast_msdu_cnt;
  4873. tid_stats->rx_total[tid].bcast_msdu_cnt = rx.bcast_msdu_cnt;
  4874. qdf_mem_copy(&tid_stats->rx_total[tid].fail_cnt[0],
  4875. &rx.fail_cnt[0], RX_MAX_DROP * sizeof(uint64_t));
  4876. dp_accumulate_tid_stats(pdev, tid, &tx, &rx, TID_DELAY_STATS);
  4877. /* Copy specific accumulated Tx delay stats */
  4878. qdf_mem_copy(&tid_stats->tx_total[tid].swq_delay,
  4879. &tx.swq_delay, size);
  4880. qdf_mem_copy(&tid_stats->tx_total[tid].hwtx_delay,
  4881. &tx.hwtx_delay, size);
  4882. qdf_mem_copy(&tid_stats->tx_total[tid].intfrm_delay,
  4883. &tx.intfrm_delay, size);
  4884. /* Copy specific accumulated Rx delay stats */
  4885. qdf_mem_copy(&tid_stats->rx_total[tid].intfrm_delay,
  4886. &rx.intfrm_delay, size);
  4887. qdf_mem_copy(&tid_stats->rx_total[tid].to_stack_delay,
  4888. &rx.to_stack_delay, size);
  4889. }
  4890. for (tid = 0; tid < CDP_MAX_VOW_TID; tid++) {
  4891. dp_accumulate_tid_stats(pdev, tid, &tx, &rx,
  4892. TID_RX_ERROR_STATS);
  4893. /* Copy specific accumulated VOW Rx stats */
  4894. qdf_mem_copy(&tid_stats->rx_total[tid].reo_err,
  4895. &rx.reo_err, sizeof(struct cdp_reo_error_stats));
  4896. qdf_mem_copy(&tid_stats->rx_total[tid].rxdma_err, &rx.rxdma_err,
  4897. sizeof(struct cdp_rxdma_error_stats));
  4898. }
  4899. tid_stats->ingress_stack = pdev->stats.tid_stats.ingress_stack;
  4900. tid_stats->osif_drop = pdev->stats.tid_stats.osif_drop;
  4901. return QDF_STATUS_SUCCESS;
  4902. }
  4903. #else
  4904. QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  4905. struct cdp_tid_stats_intf *tid_stats)
  4906. {
  4907. return QDF_STATUS_E_INVAL;
  4908. }
  4909. #endif
  4910. #ifdef HW_TX_DELAY_STATS_ENABLE
  4911. static void dp_vdev_print_tx_delay_stats(struct dp_vdev *vdev)
  4912. {
  4913. struct cdp_delay_stats delay_stats;
  4914. struct cdp_tid_tx_stats *per_ring;
  4915. uint8_t tid, index;
  4916. uint64_t count = 0;
  4917. uint8_t ring_id;
  4918. if (!vdev)
  4919. return;
  4920. DP_PRINT_STATS("vdev_id: %d Per TID Delay Non-Zero Stats:\n",
  4921. vdev->vdev_id);
  4922. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  4923. qdf_mem_zero(&delay_stats, sizeof(delay_stats));
  4924. for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
  4925. per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
  4926. dp_accumulate_delay_stats(&delay_stats,
  4927. &per_ring->hwtx_delay);
  4928. }
  4929. DP_PRINT_STATS("Hardware Tx completion latency stats TID: %d",
  4930. tid);
  4931. for (index = 0; index < CDP_DELAY_BUCKET_MAX; index++) {
  4932. count = delay_stats.delay_bucket[index];
  4933. if (count) {
  4934. DP_PRINT_STATS("%s: Packets = %llu",
  4935. dp_vow_str_fw_to_hw_delay(index),
  4936. count);
  4937. }
  4938. }
  4939. DP_PRINT_STATS("Min = %u", delay_stats.min_delay);
  4940. DP_PRINT_STATS("Max = %u", delay_stats.max_delay);
  4941. DP_PRINT_STATS("Avg = %u\n", delay_stats.avg_delay);
  4942. }
  4943. }
  4944. void dp_pdev_print_tx_delay_stats(struct dp_soc *soc)
  4945. {
  4946. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
  4947. struct dp_vdev *vdev;
  4948. struct dp_vdev **vdev_array = NULL;
  4949. int index = 0, num_vdev = 0;
  4950. if (!pdev) {
  4951. dp_err("pdev is NULL");
  4952. return;
  4953. }
  4954. vdev_array =
  4955. qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
  4956. if (!vdev_array)
  4957. return;
  4958. qdf_spin_lock_bh(&pdev->vdev_list_lock);
  4959. DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
  4960. if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS))
  4961. continue;
  4962. vdev_array[index] = vdev;
  4963. index = index + 1;
  4964. }
  4965. qdf_spin_unlock_bh(&pdev->vdev_list_lock);
  4966. num_vdev = index;
  4967. for (index = 0; index < num_vdev; index++) {
  4968. vdev = vdev_array[index];
  4969. dp_vdev_print_tx_delay_stats(vdev);
  4970. dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
  4971. }
  4972. qdf_mem_free(vdev_array);
  4973. }
  4974. /**
  4975. * dp_reset_delay_stats() - reset delay stats
  4976. * @per_ring: per ring structures from where stats need to be accumulated
  4977. *
  4978. * Return: void
  4979. */
  4980. static void dp_reset_delay_stats(struct cdp_delay_stats *per_ring)
  4981. {
  4982. qdf_mem_zero(per_ring, sizeof(struct cdp_delay_stats));
  4983. }
  4984. /**
  4985. * dp_vdev_init_tx_delay_stats() - Clear tx delay stats
  4986. * @vdev: vdev handle
  4987. *
  4988. * Return: None
  4989. */
  4990. static void dp_vdev_init_tx_delay_stats(struct dp_vdev *vdev)
  4991. {
  4992. struct cdp_tid_tx_stats *per_ring;
  4993. uint8_t tid;
  4994. uint8_t ring_id;
  4995. if (!vdev)
  4996. return;
  4997. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  4998. for (ring_id = 0; ring_id < CDP_MAX_TX_COMP_RINGS; ring_id++) {
  4999. per_ring = &vdev->stats.tid_tx_stats[ring_id][tid];
  5000. dp_reset_delay_stats(&per_ring->hwtx_delay);
  5001. }
  5002. }
  5003. }
  5004. void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc)
  5005. {
  5006. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, 0);
  5007. struct dp_vdev *vdev;
  5008. struct dp_vdev **vdev_array = NULL;
  5009. int index = 0, num_vdev = 0;
  5010. if (!pdev) {
  5011. dp_err("pdev is NULL");
  5012. return;
  5013. }
  5014. vdev_array =
  5015. qdf_mem_malloc(sizeof(struct dp_vdev *) * WLAN_PDEV_MAX_VDEVS);
  5016. if (!vdev_array)
  5017. return;
  5018. qdf_spin_lock_bh(&pdev->vdev_list_lock);
  5019. DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
  5020. if (dp_vdev_get_ref(soc, vdev, DP_MOD_ID_GENERIC_STATS) !=
  5021. QDF_STATUS_SUCCESS)
  5022. continue;
  5023. vdev_array[index] = vdev;
  5024. index = index + 1;
  5025. }
  5026. qdf_spin_unlock_bh(&pdev->vdev_list_lock);
  5027. num_vdev = index;
  5028. for (index = 0; index < num_vdev; index++) {
  5029. vdev = vdev_array[index];
  5030. dp_vdev_init_tx_delay_stats(vdev);
  5031. dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_GENERIC_STATS);
  5032. }
  5033. qdf_mem_free(vdev_array);
  5034. }
  5035. #endif
  5036. void dp_print_soc_cfg_params(struct dp_soc *soc)
  5037. {
  5038. struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx;
  5039. uint8_t index = 0, i = 0;
  5040. char ring_mask[DP_MAX_INT_CONTEXTS_STRING_LENGTH];
  5041. int num_of_int_contexts;
  5042. if (!soc) {
  5043. dp_err("Context is null");
  5044. return;
  5045. }
  5046. soc_cfg_ctx = soc->wlan_cfg_ctx;
  5047. if (!soc_cfg_ctx) {
  5048. dp_err("Context is null");
  5049. return;
  5050. }
  5051. num_of_int_contexts =
  5052. wlan_cfg_get_num_contexts(soc_cfg_ctx);
  5053. DP_PRINT_STATS("No. of interrupt contexts: %u",
  5054. soc_cfg_ctx->num_int_ctxts);
  5055. DP_PRINT_STATS("Max clients: %u",
  5056. soc_cfg_ctx->max_clients);
  5057. DP_PRINT_STATS("Max alloc size: %u ",
  5058. soc_cfg_ctx->max_alloc_size);
  5059. DP_PRINT_STATS("Per pdev tx ring: %u ",
  5060. soc_cfg_ctx->per_pdev_tx_ring);
  5061. DP_PRINT_STATS("Num tcl data rings: %u ",
  5062. soc_cfg_ctx->num_tcl_data_rings);
  5063. DP_PRINT_STATS("Per pdev rx ring: %u ",
  5064. soc_cfg_ctx->per_pdev_rx_ring);
  5065. DP_PRINT_STATS("Per pdev lmac ring: %u ",
  5066. soc_cfg_ctx->per_pdev_lmac_ring);
  5067. DP_PRINT_STATS("Num of reo dest rings: %u ",
  5068. soc_cfg_ctx->num_reo_dest_rings);
  5069. DP_PRINT_STATS("Num tx desc pool: %u ",
  5070. soc_cfg_ctx->num_tx_desc_pool);
  5071. DP_PRINT_STATS("Num tx ext desc pool: %u ",
  5072. soc_cfg_ctx->num_tx_ext_desc_pool);
  5073. DP_PRINT_STATS("Num tx desc: %u ",
  5074. soc_cfg_ctx->num_tx_desc);
  5075. DP_PRINT_STATS("Num tx ext desc: %u ",
  5076. soc_cfg_ctx->num_tx_ext_desc);
  5077. DP_PRINT_STATS("Htt packet type: %u ",
  5078. soc_cfg_ctx->htt_packet_type);
  5079. DP_PRINT_STATS("Max peer_ids: %u ",
  5080. soc_cfg_ctx->max_peer_id);
  5081. DP_PRINT_STATS("Tx ring size: %u ",
  5082. soc_cfg_ctx->tx_ring_size);
  5083. DP_PRINT_STATS("Tx comp ring size: %u ",
  5084. soc_cfg_ctx->tx_comp_ring_size);
  5085. DP_PRINT_STATS("Tx comp ring size nss: %u ",
  5086. soc_cfg_ctx->tx_comp_ring_size_nss);
  5087. DP_PRINT_STATS("Int batch threshold tx: %u ",
  5088. soc_cfg_ctx->int_batch_threshold_tx);
  5089. DP_PRINT_STATS("Int timer threshold tx: %u ",
  5090. soc_cfg_ctx->int_timer_threshold_tx);
  5091. DP_PRINT_STATS("Int batch threshold rx: %u ",
  5092. soc_cfg_ctx->int_batch_threshold_rx);
  5093. DP_PRINT_STATS("Int timer threshold rx: %u ",
  5094. soc_cfg_ctx->int_timer_threshold_rx);
  5095. DP_PRINT_STATS("Int batch threshold other: %u ",
  5096. soc_cfg_ctx->int_batch_threshold_other);
  5097. DP_PRINT_STATS("Int timer threshold other: %u ",
  5098. soc_cfg_ctx->int_timer_threshold_other);
  5099. DP_PRINT_STATS("Int batch threshold ppe2tcl: %u ",
  5100. soc_cfg_ctx->int_batch_threshold_ppe2tcl);
  5101. DP_PRINT_STATS("Int timer threshold ppe2tcl: %u ",
  5102. soc_cfg_ctx->int_timer_threshold_ppe2tcl);
  5103. DP_PRINT_STATS("DP NAPI scale factor: %u ",
  5104. soc_cfg_ctx->napi_scale_factor);
  5105. for (i = 0; i < num_of_int_contexts; i++) {
  5106. index += qdf_snprint(&ring_mask[index],
  5107. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5108. " %d",
  5109. soc_cfg_ctx->int_tx_ring_mask[i]);
  5110. }
  5111. DP_PRINT_STATS("Tx ring mask (0-%d):%s",
  5112. num_of_int_contexts, ring_mask);
  5113. index = 0;
  5114. for (i = 0; i < num_of_int_contexts; i++) {
  5115. index += qdf_snprint(&ring_mask[index],
  5116. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5117. " %d",
  5118. soc_cfg_ctx->int_rx_ring_mask[i]);
  5119. }
  5120. DP_PRINT_STATS("Rx ring mask (0-%d):%s",
  5121. num_of_int_contexts, ring_mask);
  5122. index = 0;
  5123. for (i = 0; i < num_of_int_contexts; i++) {
  5124. index += qdf_snprint(&ring_mask[index],
  5125. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5126. " %d",
  5127. soc_cfg_ctx->int_rx_mon_ring_mask[i]);
  5128. }
  5129. DP_PRINT_STATS("Rx mon ring mask (0-%d):%s",
  5130. num_of_int_contexts, ring_mask);
  5131. index = 0;
  5132. for (i = 0; i < num_of_int_contexts; i++) {
  5133. index += qdf_snprint(&ring_mask[index],
  5134. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5135. " %d",
  5136. soc_cfg_ctx->int_rx_err_ring_mask[i]);
  5137. }
  5138. DP_PRINT_STATS("Rx err ring mask (0-%d):%s",
  5139. num_of_int_contexts, ring_mask);
  5140. index = 0;
  5141. for (i = 0; i < num_of_int_contexts; i++) {
  5142. index += qdf_snprint(&ring_mask[index],
  5143. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5144. " %d",
  5145. soc_cfg_ctx->int_rx_wbm_rel_ring_mask[i]);
  5146. }
  5147. DP_PRINT_STATS("Rx wbm rel ring mask (0-%d):%s",
  5148. num_of_int_contexts, ring_mask);
  5149. index = 0;
  5150. for (i = 0; i < num_of_int_contexts; i++) {
  5151. index += qdf_snprint(&ring_mask[index],
  5152. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5153. " %d",
  5154. soc_cfg_ctx->int_reo_status_ring_mask[i]);
  5155. }
  5156. DP_PRINT_STATS("Reo ring mask (0-%d):%s",
  5157. num_of_int_contexts, ring_mask);
  5158. index = 0;
  5159. for (i = 0; i < num_of_int_contexts; i++) {
  5160. index += qdf_snprint(&ring_mask[index],
  5161. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5162. " %d",
  5163. soc_cfg_ctx->int_rxdma2host_ring_mask[i]);
  5164. }
  5165. DP_PRINT_STATS("Rxdma2host ring mask (0-%d):%s",
  5166. num_of_int_contexts, ring_mask);
  5167. index = 0;
  5168. for (i = 0; i < num_of_int_contexts; i++) {
  5169. index += qdf_snprint(&ring_mask[index],
  5170. DP_MAX_INT_CONTEXTS_STRING_LENGTH - index,
  5171. " %d",
  5172. soc_cfg_ctx->int_host2rxdma_ring_mask[i]);
  5173. }
  5174. DP_PRINT_STATS("Host2rxdma ring mask (0-%d):%s",
  5175. num_of_int_contexts, ring_mask);
  5176. DP_PRINT_STATS("Rx hash: %u ",
  5177. soc_cfg_ctx->rx_hash);
  5178. DP_PRINT_STATS("Tso enabled: %u ",
  5179. soc_cfg_ctx->tso_enabled);
  5180. DP_PRINT_STATS("Lro enabled: %u ",
  5181. soc_cfg_ctx->lro_enabled);
  5182. DP_PRINT_STATS("Sg enabled: %u ",
  5183. soc_cfg_ctx->sg_enabled);
  5184. DP_PRINT_STATS("Gro enabled: %u ",
  5185. soc_cfg_ctx->gro_enabled);
  5186. DP_PRINT_STATS("TC based dynamic GRO: %u ",
  5187. soc_cfg_ctx->tc_based_dynamic_gro);
  5188. DP_PRINT_STATS("TC ingress prio: %u ",
  5189. soc_cfg_ctx->tc_ingress_prio);
  5190. DP_PRINT_STATS("rawmode enabled: %u ",
  5191. soc_cfg_ctx->rawmode_enabled);
  5192. DP_PRINT_STATS("peer flow ctrl enabled: %u ",
  5193. soc_cfg_ctx->peer_flow_ctrl_enabled);
  5194. DP_PRINT_STATS("napi enabled: %u ",
  5195. soc_cfg_ctx->napi_enabled);
  5196. DP_PRINT_STATS("P2P Tcp Udp checksum offload: %u ",
  5197. soc_cfg_ctx->p2p_tcp_udp_checksumoffload);
  5198. DP_PRINT_STATS("NAN Tcp Udp checksum offload: %u ",
  5199. soc_cfg_ctx->nan_tcp_udp_checksumoffload);
  5200. DP_PRINT_STATS("Tcp Udp checksum offload: %u ",
  5201. soc_cfg_ctx->tcp_udp_checksumoffload);
  5202. DP_PRINT_STATS("Defrag timeout check: %u ",
  5203. soc_cfg_ctx->defrag_timeout_check);
  5204. DP_PRINT_STATS("Rx defrag min timeout: %u ",
  5205. soc_cfg_ctx->rx_defrag_min_timeout);
  5206. DP_PRINT_STATS("WBM release ring: %u ",
  5207. soc_cfg_ctx->wbm_release_ring);
  5208. DP_PRINT_STATS("TCL CMD_CREDIT ring: %u ",
  5209. soc_cfg_ctx->tcl_cmd_credit_ring);
  5210. DP_PRINT_STATS("TCL Status ring: %u ",
  5211. soc_cfg_ctx->tcl_status_ring);
  5212. DP_PRINT_STATS("REO Destination ring: %u ",
  5213. soc_cfg_ctx->reo_dst_ring_size);
  5214. DP_PRINT_STATS("REO Reinject ring: %u ",
  5215. soc_cfg_ctx->reo_reinject_ring);
  5216. DP_PRINT_STATS("RX release ring: %u ",
  5217. soc_cfg_ctx->rx_release_ring);
  5218. DP_PRINT_STATS("REO Exception ring: %u ",
  5219. soc_cfg_ctx->reo_exception_ring);
  5220. DP_PRINT_STATS("REO CMD ring: %u ",
  5221. soc_cfg_ctx->reo_cmd_ring);
  5222. DP_PRINT_STATS("REO STATUS ring: %u ",
  5223. soc_cfg_ctx->reo_status_ring);
  5224. DP_PRINT_STATS("RXDMA refill ring: %u ",
  5225. soc_cfg_ctx->rxdma_refill_ring);
  5226. DP_PRINT_STATS("TX_desc limit_0: %u ",
  5227. soc_cfg_ctx->tx_desc_limit_0);
  5228. DP_PRINT_STATS("TX_desc limit_1: %u ",
  5229. soc_cfg_ctx->tx_desc_limit_1);
  5230. DP_PRINT_STATS("TX_desc limit_2: %u ",
  5231. soc_cfg_ctx->tx_desc_limit_2);
  5232. DP_PRINT_STATS("TX device limit: %u ",
  5233. soc_cfg_ctx->tx_device_limit);
  5234. DP_PRINT_STATS("TX sw internode queue: %u ",
  5235. soc_cfg_ctx->tx_sw_internode_queue);
  5236. DP_PRINT_STATS("RXDMA err dst ring: %u ",
  5237. soc_cfg_ctx->rxdma_err_dst_ring);
  5238. DP_PRINT_STATS("RX Flow Tag Enabled: %u ",
  5239. soc_cfg_ctx->is_rx_flow_tag_enabled);
  5240. DP_PRINT_STATS("RX Flow Search Table Size (# of entries): %u ",
  5241. soc_cfg_ctx->rx_flow_search_table_size);
  5242. DP_PRINT_STATS("RX Flow Search Table Per PDev : %u ",
  5243. soc_cfg_ctx->is_rx_flow_search_table_per_pdev);
  5244. DP_PRINT_STATS("Rx desc pool size: %u ",
  5245. soc_cfg_ctx->rx_sw_desc_num);
  5246. }
  5247. void
  5248. dp_print_pdev_cfg_params(struct dp_pdev *pdev)
  5249. {
  5250. struct wlan_cfg_dp_pdev_ctxt *pdev_cfg_ctx;
  5251. if (!pdev) {
  5252. dp_err("Context is null");
  5253. return;
  5254. }
  5255. pdev_cfg_ctx = pdev->wlan_cfg_ctx;
  5256. if (!pdev_cfg_ctx) {
  5257. dp_err("Context is null");
  5258. return;
  5259. }
  5260. DP_PRINT_STATS("Rx dma buf ring size: %d ",
  5261. pdev_cfg_ctx->rx_dma_buf_ring_size);
  5262. DP_PRINT_STATS("DMA Mon buf ring size: %d ",
  5263. pdev_cfg_ctx->dma_mon_buf_ring_size);
  5264. DP_PRINT_STATS("DMA Mon dest ring size: %d ",
  5265. pdev_cfg_ctx->dma_rx_mon_dest_ring_size);
  5266. DP_PRINT_STATS("DMA Mon status ring size: %d ",
  5267. pdev_cfg_ctx->dma_mon_status_ring_size);
  5268. DP_PRINT_STATS("Rxdma monitor desc ring: %d",
  5269. pdev_cfg_ctx->rxdma_monitor_desc_ring);
  5270. DP_PRINT_STATS("Num mac rings: %d ",
  5271. pdev_cfg_ctx->num_mac_rings);
  5272. }
  5273. void
  5274. dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng,
  5275. enum hal_ring_type ring_type)
  5276. {
  5277. uint32_t tailp;
  5278. uint32_t headp;
  5279. int32_t hw_headp = -1;
  5280. int32_t hw_tailp = -1;
  5281. uint32_t ring_usage;
  5282. const char *ring_name;
  5283. if (soc && srng && srng->hal_srng) {
  5284. ring_name = dp_srng_get_str_from_hal_ring_type(ring_type);
  5285. hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
  5286. ring_usage = hal_get_ring_usage(srng->hal_srng,
  5287. ring_type, &headp, &tailp);
  5288. DP_PRINT_STATS("%s:SW: Head = %d Tail = %d Ring Usage = %u",
  5289. ring_name, headp, tailp, ring_usage);
  5290. hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
  5291. &hw_tailp, ring_type);
  5292. ring_usage = 0;
  5293. if (hw_headp >= 0 && tailp >= 0)
  5294. ring_usage =
  5295. hal_get_ring_usage(
  5296. srng->hal_srng, ring_type,
  5297. &hw_headp, &hw_tailp);
  5298. DP_PRINT_STATS("%s:HW: Head = %d Tail = %d Ring Usage = %u",
  5299. ring_name, hw_headp, hw_tailp, ring_usage);
  5300. }
  5301. }
  5302. qdf_export_symbol(dp_print_ring_stat_from_hal);
  5303. #ifdef FEATURE_TSO_STATS
  5304. /**
  5305. * dp_print_tso_seg_stats - tso segment stats
  5306. * @pdev: pdev handle
  5307. * @id: tso packet id
  5308. *
  5309. * Return: None
  5310. */
  5311. static void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
  5312. {
  5313. uint8_t num_seg;
  5314. uint32_t segid;
  5315. /* TSO LEVEL 2 - SEGMENT INFO */
  5316. num_seg = pdev->stats.tso_stats.tso_info.tso_packet_info[id].num_seg;
  5317. for (segid = 0; segid < CDP_MAX_TSO_SEGMENTS && segid < num_seg; segid++) {
  5318. DP_PRINT_STATS(
  5319. "Segment id:[%u] fragments: %u | Segment Length %u | TCP Seq no.: %u | ip_id: %u",
  5320. segid,
  5321. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5322. .tso_seg[segid].num_frags,
  5323. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5324. .tso_seg[segid].total_len,
  5325. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5326. .tso_seg[segid].tso_flags.tcp_seq_num,
  5327. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5328. .tso_seg[segid].tso_flags.ip_id);
  5329. DP_PRINT_STATS(
  5330. "fin: %u syn: %u rst: %u psh: %u ack: %u urg: %u ece: %u cwr: %u ns: %u",
  5331. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5332. .tso_seg[segid].tso_flags.fin,
  5333. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5334. .tso_seg[segid].tso_flags.syn,
  5335. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5336. .tso_seg[segid].tso_flags.rst,
  5337. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5338. .tso_seg[segid].tso_flags.psh,
  5339. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5340. .tso_seg[segid].tso_flags.ack,
  5341. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5342. .tso_seg[segid].tso_flags.urg,
  5343. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5344. .tso_seg[segid].tso_flags.ece,
  5345. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5346. .tso_seg[segid].tso_flags.cwr,
  5347. pdev->stats.tso_stats.tso_info.tso_packet_info[id]
  5348. .tso_seg[segid].tso_flags.ns);
  5349. }
  5350. }
  5351. #else
  5352. static inline
  5353. void dp_print_tso_seg_stats(struct dp_pdev *pdev, uint32_t id)
  5354. {
  5355. }
  5356. #endif /* FEATURE_TSO_STATS */
  5357. /**
  5358. * dp_print_mon_ring_stat_from_hal() - Print stat for monitor rings based
  5359. * on target
  5360. * @pdev: physical device handle
  5361. * @mac_id: mac id
  5362. *
  5363. * Return: void
  5364. */
  5365. static inline
  5366. void dp_print_mon_ring_stat_from_hal(struct dp_pdev *pdev, uint8_t mac_id)
  5367. {
  5368. if (pdev->soc->wlan_cfg_ctx->rxdma1_enable) {
  5369. dp_print_ring_stat_from_hal(pdev->soc,
  5370. &pdev->soc->rxdma_mon_buf_ring[mac_id],
  5371. RXDMA_MONITOR_BUF);
  5372. dp_print_ring_stat_from_hal(pdev->soc,
  5373. &pdev->soc->rxdma_mon_dst_ring[mac_id],
  5374. RXDMA_MONITOR_DST);
  5375. dp_print_ring_stat_from_hal(pdev->soc,
  5376. &pdev->soc->rxdma_mon_desc_ring[mac_id],
  5377. RXDMA_MONITOR_DESC);
  5378. }
  5379. dp_print_ring_stat_from_hal(pdev->soc,
  5380. &pdev->soc->rxdma_mon_status_ring[mac_id],
  5381. RXDMA_MONITOR_STATUS);
  5382. }
  5383. void
  5384. dp_print_ring_stats(struct dp_pdev *pdev)
  5385. {
  5386. struct dp_soc *soc = pdev->soc;
  5387. uint32_t i;
  5388. int mac_id;
  5389. int lmac_id;
  5390. if (hif_rtpm_get(HIF_RTPM_GET_SYNC, HIF_RTPM_ID_DP_RING_STATS))
  5391. return;
  5392. dp_print_ring_stat_from_hal(pdev->soc,
  5393. &pdev->soc->wbm_idle_link_ring,
  5394. WBM_IDLE_LINK);
  5395. dp_print_ring_stat_from_hal(pdev->soc,
  5396. &pdev->soc->reo_exception_ring,
  5397. REO_EXCEPTION);
  5398. dp_print_ring_stat_from_hal(pdev->soc,
  5399. &pdev->soc->reo_reinject_ring,
  5400. REO_REINJECT);
  5401. dp_print_ring_stat_from_hal(pdev->soc,
  5402. &pdev->soc->reo_cmd_ring,
  5403. REO_CMD);
  5404. dp_print_ring_stat_from_hal(pdev->soc,
  5405. &pdev->soc->reo_status_ring,
  5406. REO_STATUS);
  5407. dp_print_ring_stat_from_hal(pdev->soc,
  5408. &pdev->soc->rx_rel_ring,
  5409. WBM2SW_RELEASE);
  5410. dp_print_ring_stat_from_hal(pdev->soc,
  5411. &pdev->soc->tcl_cmd_credit_ring,
  5412. TCL_CMD_CREDIT);
  5413. dp_print_ring_stat_from_hal(pdev->soc,
  5414. &pdev->soc->tcl_status_ring,
  5415. TCL_STATUS);
  5416. dp_print_ring_stat_from_hal(pdev->soc,
  5417. &pdev->soc->wbm_desc_rel_ring,
  5418. SW2WBM_RELEASE);
  5419. for (i = 0; i < MAX_REO_DEST_RINGS; i++)
  5420. dp_print_ring_stat_from_hal(pdev->soc,
  5421. &pdev->soc->reo_dest_ring[i],
  5422. REO_DST);
  5423. for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
  5424. dp_print_ring_stat_from_hal(pdev->soc,
  5425. &pdev->soc->tcl_data_ring[i],
  5426. TCL_DATA);
  5427. for (i = 0; i < pdev->soc->num_tcl_data_rings; i++)
  5428. dp_print_ring_stat_from_hal(pdev->soc,
  5429. &pdev->soc->tx_comp_ring[i],
  5430. WBM2SW_RELEASE);
  5431. if (pdev->soc->features.dmac_cmn_src_rxbuf_ring_enabled) {
  5432. for (i = 0; i < pdev->soc->num_rx_refill_buf_rings; i++) {
  5433. dp_print_ring_stat_from_hal
  5434. (pdev->soc, &pdev->soc->rx_refill_buf_ring[i],
  5435. RXDMA_BUF);
  5436. }
  5437. } else {
  5438. lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc, 0,
  5439. pdev->pdev_id);
  5440. dp_print_ring_stat_from_hal
  5441. (pdev->soc, &pdev->soc->rx_refill_buf_ring[lmac_id],
  5442. RXDMA_BUF);
  5443. }
  5444. dp_print_ring_stat_from_hal(pdev->soc,
  5445. &pdev->rx_refill_buf_ring2,
  5446. RXDMA_BUF);
  5447. for (i = 0; i < MAX_RX_MAC_RINGS; i++)
  5448. dp_print_ring_stat_from_hal(pdev->soc,
  5449. &pdev->rx_mac_buf_ring[i],
  5450. RXDMA_BUF);
  5451. for (mac_id = 0;
  5452. mac_id < soc->wlan_cfg_ctx->num_rxdma_status_rings_per_pdev;
  5453. mac_id++) {
  5454. lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
  5455. mac_id, pdev->pdev_id);
  5456. dp_print_mon_ring_stat_from_hal(pdev, lmac_id);
  5457. }
  5458. for (i = 0; i < soc->wlan_cfg_ctx->num_rxdma_dst_rings_per_pdev; i++) {
  5459. lmac_id = dp_get_lmac_id_for_pdev_id(pdev->soc,
  5460. i, pdev->pdev_id);
  5461. dp_print_ring_stat_from_hal(pdev->soc,
  5462. &pdev->soc->rxdma_err_dst_ring
  5463. [lmac_id],
  5464. RXDMA_DST);
  5465. }
  5466. dp_print_txmon_ring_stat_from_hal(pdev);
  5467. #ifdef WLAN_SUPPORT_PPEDS
  5468. if (pdev->soc->arch_ops.dp_txrx_ppeds_rings_status)
  5469. pdev->soc->arch_ops.dp_txrx_ppeds_rings_status(pdev->soc);
  5470. #endif
  5471. hif_rtpm_put(HIF_RTPM_PUT_ASYNC, HIF_RTPM_ID_DP_RING_STATS);
  5472. }
  5473. /**
  5474. * dp_print_common_rates_info(): Print common rate for tx or rx
  5475. * @pkt_type_array: rate type array contains rate info
  5476. *
  5477. * Return: void
  5478. */
  5479. static inline void
  5480. dp_print_common_rates_info(struct cdp_pkt_type *pkt_type_array)
  5481. {
  5482. uint8_t mcs, pkt_type;
  5483. DP_PRINT_STATS("MSDU Count");
  5484. for (pkt_type = 0; pkt_type < DOT11_MAX; pkt_type++) {
  5485. for (mcs = 0; mcs < MAX_MCS; mcs++) {
  5486. if (!cdp_rate_string[pkt_type][mcs].valid)
  5487. continue;
  5488. DP_PRINT_STATS(" %s = %d",
  5489. cdp_rate_string[pkt_type][mcs].mcs_type,
  5490. pkt_type_array[pkt_type].mcs_count[mcs]);
  5491. }
  5492. DP_PRINT_STATS("\n");
  5493. }
  5494. }
  5495. /**
  5496. * dp_print_common_ppdu_rates_info(): Print ppdu rate for tx or rx
  5497. * @pkt_type_array: rate type array contains rate info
  5498. * @pkt_type: packet type
  5499. *
  5500. * Return: void
  5501. */
  5502. #ifdef WLAN_FEATURE_11BE
  5503. static inline void
  5504. dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
  5505. enum cdp_packet_type pkt_type)
  5506. {
  5507. uint8_t mcs;
  5508. DP_PRINT_STATS("PPDU Count");
  5509. for (mcs = 0; mcs < MAX_MCS; mcs++) {
  5510. if (pkt_type == DOT11_AX) {
  5511. if (!dp_ppdu_rate_string[0][mcs].valid)
  5512. continue;
  5513. DP_PRINT_STATS(" %s = %d",
  5514. dp_ppdu_rate_string[0][mcs].mcs_type,
  5515. pkt_type_array->mcs_count[mcs]);
  5516. } else if (pkt_type == DOT11_BE) {
  5517. if (!dp_ppdu_rate_string[1][mcs].valid)
  5518. continue;
  5519. DP_PRINT_STATS(" %s = %d",
  5520. dp_ppdu_rate_string[1][mcs].mcs_type,
  5521. pkt_type_array->mcs_count[mcs]);
  5522. }
  5523. }
  5524. DP_PRINT_STATS("\n");
  5525. }
  5526. #else
  5527. static inline void
  5528. dp_print_common_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array,
  5529. enum cdp_packet_type pkt_type)
  5530. {
  5531. uint8_t mcs;
  5532. DP_PRINT_STATS("PPDU Count");
  5533. for (mcs = 0; mcs < MAX_MCS; mcs++) {
  5534. if (!dp_ppdu_rate_string[0][mcs].valid)
  5535. continue;
  5536. DP_PRINT_STATS(" %s = %d",
  5537. dp_ppdu_rate_string[0][mcs].mcs_type,
  5538. pkt_type_array->mcs_count[mcs]);
  5539. }
  5540. DP_PRINT_STATS("\n");
  5541. }
  5542. #endif
  5543. /**
  5544. * dp_print_mu_be_ppdu_rates_info(): Print mu be rate for tx or rx
  5545. * @pkt_type_array: rate type array contains rate info
  5546. *
  5547. * Return: void
  5548. */
  5549. #ifdef WLAN_FEATURE_11BE
  5550. static inline void
  5551. dp_print_mu_be_ppdu_rates_info(struct cdp_pkt_type *pkt_type_array)
  5552. {
  5553. uint8_t mcs, pkt_type;
  5554. DP_PRINT_STATS("PPDU Count");
  5555. for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
  5556. for (mcs = 0; mcs < MAX_MCS; mcs++) {
  5557. if (!dp_mu_be_rate_string[pkt_type][mcs].valid)
  5558. continue;
  5559. DP_PRINT_STATS(" %s = %d",
  5560. dp_mu_be_rate_string[pkt_type][mcs].mcs_type,
  5561. pkt_type_array[pkt_type].mcs_count[mcs]);
  5562. }
  5563. DP_PRINT_STATS("\n");
  5564. }
  5565. }
  5566. #endif
  5567. static inline void
  5568. dp_print_mu_ppdu_rates_info(struct cdp_rx_mu *rx_mu)
  5569. {
  5570. uint8_t mcs, pkt_type;
  5571. DP_PRINT_STATS("PPDU Count");
  5572. for (pkt_type = 0; pkt_type < TXRX_TYPE_MU_MAX; pkt_type++) {
  5573. for (mcs = 0; mcs < MAX_MCS; mcs++) {
  5574. if (!dp_mu_rate_string[pkt_type][mcs].valid)
  5575. continue;
  5576. DP_PRINT_STATS(" %s = %d",
  5577. dp_mu_rate_string[pkt_type][mcs].mcs_type,
  5578. rx_mu[pkt_type].ppdu.mcs_count[mcs]);
  5579. }
  5580. DP_PRINT_STATS("\n");
  5581. }
  5582. }
  5583. #ifdef WLAN_FEATURE_11BE
  5584. static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
  5585. {
  5586. DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
  5587. pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
  5588. pdev->stats.rx.bw[2], pdev->stats.rx.bw[3],
  5589. pdev->stats.rx.bw[4]);
  5590. }
  5591. static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
  5592. {
  5593. DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d, 320MHz %d",
  5594. pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
  5595. pdev->stats.tx.bw[2], pdev->stats.tx.bw[3],
  5596. pdev->stats.tx.bw[4]);
  5597. }
  5598. #else
  5599. static inline void dp_print_rx_bw_stats(struct dp_pdev *pdev)
  5600. {
  5601. DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
  5602. pdev->stats.rx.bw[0], pdev->stats.rx.bw[1],
  5603. pdev->stats.rx.bw[2], pdev->stats.rx.bw[3]);
  5604. }
  5605. static inline void dp_print_tx_bw_stats(struct dp_pdev *pdev)
  5606. {
  5607. DP_PRINT_STATS("BW Counts = 20MHz %d, 40MHz %d, 80MHz %d, 160MHz %d",
  5608. pdev->stats.tx.bw[0], pdev->stats.tx.bw[1],
  5609. pdev->stats.tx.bw[2], pdev->stats.tx.bw[3]);
  5610. }
  5611. #endif
  5612. void dp_print_rx_rates(struct dp_vdev *vdev)
  5613. {
  5614. struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
  5615. uint8_t i;
  5616. uint8_t index = 0;
  5617. char nss[DP_NSS_LENGTH];
  5618. DP_PRINT_STATS("Rx Rate Info:\n");
  5619. dp_print_common_rates_info(pdev->stats.rx.pkt_type);
  5620. index = 0;
  5621. for (i = 0; i < SS_COUNT; i++) {
  5622. index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
  5623. " %d", pdev->stats.rx.nss[i]);
  5624. }
  5625. DP_PRINT_STATS("NSS(1-8) = %s",
  5626. nss);
  5627. DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
  5628. pdev->stats.rx.sgi_count[0],
  5629. pdev->stats.rx.sgi_count[1],
  5630. pdev->stats.rx.sgi_count[2],
  5631. pdev->stats.rx.sgi_count[3]);
  5632. dp_print_rx_bw_stats(pdev);
  5633. DP_PRINT_STATS("Reception Type ="
  5634. "SU: %d MU_MIMO:%d MU_OFDMA:%d MU_OFDMA_MIMO:%d",
  5635. pdev->stats.rx.reception_type[0],
  5636. pdev->stats.rx.reception_type[1],
  5637. pdev->stats.rx.reception_type[2],
  5638. pdev->stats.rx.reception_type[3]);
  5639. DP_PRINT_STATS("Aggregation:\n");
  5640. DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
  5641. pdev->stats.rx.ampdu_cnt);
  5642. DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
  5643. pdev->stats.rx.non_ampdu_cnt);
  5644. DP_PRINT_STATS("Number of Msdu's Part of Amsdu: %d",
  5645. pdev->stats.rx.amsdu_cnt);
  5646. DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation: %d",
  5647. pdev->stats.rx.non_amsdu_cnt);
  5648. }
  5649. void dp_print_tx_rates(struct dp_vdev *vdev)
  5650. {
  5651. struct dp_pdev *pdev = (struct dp_pdev *)vdev->pdev;
  5652. DP_PRINT_STATS("Tx Rate Info:\n");
  5653. dp_print_common_rates_info(pdev->stats.tx.pkt_type);
  5654. DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
  5655. pdev->stats.tx.sgi_count[0],
  5656. pdev->stats.tx.sgi_count[1],
  5657. pdev->stats.tx.sgi_count[2],
  5658. pdev->stats.tx.sgi_count[3]);
  5659. dp_print_tx_bw_stats(pdev);
  5660. DP_PRINT_STATS("OFDMA = %d", pdev->stats.tx.ofdma);
  5661. DP_PRINT_STATS("STBC = %d", pdev->stats.tx.stbc);
  5662. DP_PRINT_STATS("LDPC = %d", pdev->stats.tx.ldpc);
  5663. DP_PRINT_STATS("Retries = %d", pdev->stats.tx.retries);
  5664. DP_PRINT_STATS("Last ack rssi = %d\n", pdev->stats.tx.last_ack_rssi);
  5665. DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
  5666. pdev->stats.tx.pream_punct_cnt);
  5667. DP_PRINT_STATS("Aggregation:\n");
  5668. DP_PRINT_STATS("Number of Msdu's Part of Ampdus = %d",
  5669. pdev->stats.tx.ampdu_cnt);
  5670. DP_PRINT_STATS("Number of Msdu's With No Mpdu Level Aggregation : %d",
  5671. pdev->stats.tx.non_ampdu_cnt);
  5672. DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
  5673. pdev->stats.tx.amsdu_cnt);
  5674. DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
  5675. pdev->stats.tx.non_amsdu_cnt);
  5676. }
  5677. /**
  5678. * dp_print_nss(): Print nss count
  5679. * @nss: printable nss count array
  5680. * @pnss: nss count array
  5681. * @ss_count: number of nss
  5682. *
  5683. * Return: void
  5684. */
  5685. static void dp_print_nss(char *nss, uint32_t *pnss, uint32_t ss_count)
  5686. {
  5687. uint32_t index;
  5688. uint8_t i;
  5689. index = 0;
  5690. for (i = 0; i < ss_count; i++) {
  5691. index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
  5692. " %d", *(pnss + i));
  5693. }
  5694. }
  5695. /**
  5696. * dp_print_jitter_stats(): Print per-tid jitter stats
  5697. * @peer: DP peer object
  5698. * @pdev: DP pdev object
  5699. *
  5700. * Return: void
  5701. */
  5702. #ifdef WLAN_PEER_JITTER
  5703. static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
  5704. {
  5705. uint8_t tid = 0;
  5706. if (!pdev || !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx))
  5707. return;
  5708. if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats)
  5709. return;
  5710. DP_PRINT_STATS("Per TID Tx HW Enqueue-Comp Jitter Stats:\n");
  5711. for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
  5712. struct cdp_peer_tid_stats *rx_tid =
  5713. &peer->txrx_peer->jitter_stats[tid];
  5714. DP_PRINT_STATS("Node tid = %d\n"
  5715. "Average Jiiter : %u (us)\n"
  5716. "Average Delay : %u (us)\n"
  5717. "Total Average error count : %llu\n"
  5718. "Total Success Count : %llu\n"
  5719. "Total Drop : %llu\n",
  5720. tid,
  5721. rx_tid->tx_avg_jitter,
  5722. rx_tid->tx_avg_delay,
  5723. rx_tid->tx_avg_err,
  5724. rx_tid->tx_total_success,
  5725. rx_tid->tx_drop);
  5726. }
  5727. }
  5728. #else
  5729. static void dp_print_jitter_stats(struct dp_peer *peer, struct dp_pdev *pdev)
  5730. {
  5731. }
  5732. #endif /* WLAN_PEER_JITTER */
  5733. #ifdef QCA_PEER_EXT_STATS
  5734. /**
  5735. * dp_print_hist_stats() - Print delay histogram
  5736. * @hstats: Histogram stats
  5737. * @hist_type: histogram type
  5738. *
  5739. * Return: void
  5740. */
  5741. static void dp_print_hist_stats(struct cdp_hist_stats *hstats,
  5742. enum cdp_hist_types hist_type)
  5743. {
  5744. uint8_t index = 0;
  5745. uint64_t count = 0;
  5746. bool hist_delay_data = false;
  5747. for (index = 0; index < CDP_HIST_BUCKET_MAX; index++) {
  5748. count = hstats->hist.freq[index];
  5749. if (!count)
  5750. continue;
  5751. hist_delay_data = true;
  5752. if (hist_type == CDP_HIST_TYPE_SW_ENQEUE_DELAY)
  5753. DP_PRINT_STATS("%s: Packets = %llu",
  5754. dp_vow_str_sw_enq_delay(index),
  5755. count);
  5756. else if (hist_type == CDP_HIST_TYPE_HW_COMP_DELAY)
  5757. DP_PRINT_STATS("%s: Packets = %llu",
  5758. dp_vow_str_fw_to_hw_delay(index),
  5759. count);
  5760. else if (hist_type == CDP_HIST_TYPE_REAP_STACK)
  5761. DP_PRINT_STATS("%s: Packets = %llu",
  5762. dp_vow_str_intfrm_delay(index),
  5763. count);
  5764. }
  5765. /*
  5766. * If none of the buckets have any packets,
  5767. * there is no need to display the stats.
  5768. */
  5769. if (hist_delay_data) {
  5770. DP_PRINT_STATS("Min = %u", hstats->min);
  5771. DP_PRINT_STATS("Max = %u", hstats->max);
  5772. DP_PRINT_STATS("Avg = %u\n", hstats->avg);
  5773. }
  5774. }
  5775. #ifdef CONFIG_SAWF
  5776. /**
  5777. * dp_accumulate_delay_avg_stats(): Accumulate the delay average stats
  5778. * @stats: cdp_delay_tid stats
  5779. * @dst_stats: Destination delay Tx stats
  5780. * @tid: TID value
  5781. *
  5782. * Return: void
  5783. */
  5784. static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
  5785. [CDP_MAX_TXRX_CTX],
  5786. struct cdp_delay_tx_stats *dst_stats,
  5787. uint8_t tid)
  5788. {
  5789. uint32_t num_rings = 0;
  5790. uint8_t ring_id;
  5791. for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
  5792. struct cdp_delay_tx_stats *dstats =
  5793. &stats[tid][ring_id].tx_delay;
  5794. if (dstats->swdelay_avg || dstats->hwdelay_avg) {
  5795. dst_stats->nwdelay_avg += dstats->nwdelay_avg;
  5796. dst_stats->swdelay_avg += dstats->swdelay_avg;
  5797. dst_stats->hwdelay_avg += dstats->hwdelay_avg;
  5798. num_rings++;
  5799. }
  5800. }
  5801. if (!num_rings)
  5802. return;
  5803. dst_stats->nwdelay_avg = qdf_do_div(dst_stats->nwdelay_avg,
  5804. num_rings);
  5805. dst_stats->swdelay_avg = qdf_do_div(dst_stats->swdelay_avg,
  5806. num_rings);
  5807. dst_stats->hwdelay_avg = qdf_do_div(dst_stats->hwdelay_avg,
  5808. num_rings);
  5809. }
  5810. #else
  5811. static void dp_accumulate_delay_avg_stats(struct cdp_delay_tid_stats stats[]
  5812. [CDP_MAX_TXRX_CTX],
  5813. struct cdp_delay_tx_stats *dst_stats,
  5814. uint8_t tid)
  5815. {
  5816. }
  5817. #endif
  5818. /**
  5819. * dp_accumulate_delay_tid_stats(): Accumulate the tid stats to the
  5820. * hist stats.
  5821. * @soc: DP SoC handle
  5822. * @stats: cdp_delay_tid stats
  5823. * @dst_hstats: Destination histogram to copy tid stats
  5824. * @tid: TID value
  5825. * @mode:
  5826. *
  5827. * Return: void
  5828. */
  5829. static void dp_accumulate_delay_tid_stats(struct dp_soc *soc,
  5830. struct cdp_delay_tid_stats stats[]
  5831. [CDP_MAX_TXRX_CTX],
  5832. struct cdp_hist_stats *dst_hstats,
  5833. uint8_t tid, uint32_t mode)
  5834. {
  5835. uint8_t ring_id;
  5836. if (wlan_cfg_get_dp_soc_nss_cfg(soc->wlan_cfg_ctx)) {
  5837. struct cdp_delay_tid_stats *dstats =
  5838. &stats[tid][0];
  5839. struct cdp_hist_stats *src_hstats = NULL;
  5840. switch (mode) {
  5841. case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
  5842. src_hstats = &dstats->tx_delay.tx_swq_delay;
  5843. break;
  5844. case CDP_HIST_TYPE_HW_COMP_DELAY:
  5845. src_hstats = &dstats->tx_delay.hwtx_delay;
  5846. break;
  5847. case CDP_HIST_TYPE_REAP_STACK:
  5848. src_hstats = &dstats->rx_delay.to_stack_delay;
  5849. break;
  5850. default:
  5851. break;
  5852. }
  5853. if (src_hstats)
  5854. dp_copy_hist_stats(src_hstats, dst_hstats);
  5855. return;
  5856. }
  5857. for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
  5858. struct cdp_delay_tid_stats *dstats =
  5859. &stats[tid][ring_id];
  5860. struct cdp_hist_stats *src_hstats = NULL;
  5861. switch (mode) {
  5862. case CDP_HIST_TYPE_SW_ENQEUE_DELAY:
  5863. src_hstats = &dstats->tx_delay.tx_swq_delay;
  5864. break;
  5865. case CDP_HIST_TYPE_HW_COMP_DELAY:
  5866. src_hstats = &dstats->tx_delay.hwtx_delay;
  5867. break;
  5868. case CDP_HIST_TYPE_REAP_STACK:
  5869. src_hstats = &dstats->rx_delay.to_stack_delay;
  5870. break;
  5871. default:
  5872. break;
  5873. }
  5874. if (src_hstats)
  5875. dp_accumulate_hist_stats(src_hstats, dst_hstats);
  5876. }
  5877. }
  5878. /**
  5879. * dp_peer_print_tx_delay_stats() - Print peer delay stats
  5880. * @pdev: DP pdev handle
  5881. * @peer: DP peer handle
  5882. *
  5883. * Return: void
  5884. */
  5885. static void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
  5886. struct dp_peer *peer)
  5887. {
  5888. struct dp_peer_delay_stats *delay_stats;
  5889. struct dp_soc *soc = NULL;
  5890. struct cdp_hist_stats hist_stats;
  5891. uint8_t tid;
  5892. if (!peer || !peer->txrx_peer)
  5893. return;
  5894. if (!pdev || !pdev->soc)
  5895. return;
  5896. soc = pdev->soc;
  5897. if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
  5898. return;
  5899. delay_stats = peer->txrx_peer->delay_stats;
  5900. if (!delay_stats)
  5901. return;
  5902. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  5903. DP_PRINT_STATS("----TID: %d----", tid);
  5904. DP_PRINT_STATS("Software Enqueue Delay:");
  5905. dp_hist_init(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
  5906. dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
  5907. &hist_stats, tid,
  5908. CDP_HIST_TYPE_SW_ENQEUE_DELAY);
  5909. dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_SW_ENQEUE_DELAY);
  5910. DP_PRINT_STATS("Hardware Transmission Delay:");
  5911. dp_hist_init(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
  5912. dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
  5913. &hist_stats, tid,
  5914. CDP_HIST_TYPE_HW_COMP_DELAY);
  5915. dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_HW_COMP_DELAY);
  5916. }
  5917. }
  5918. /**
  5919. * dp_peer_print_rx_delay_stats() - Print peer delay stats
  5920. * @pdev: DP pdev handle
  5921. * @peer: DP peer handle
  5922. *
  5923. * Return: void
  5924. */
  5925. static void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
  5926. struct dp_peer *peer)
  5927. {
  5928. struct dp_peer_delay_stats *delay_stats;
  5929. struct dp_soc *soc = NULL;
  5930. struct cdp_hist_stats hist_stats;
  5931. uint8_t tid;
  5932. if (!peer || !peer->txrx_peer)
  5933. return;
  5934. if (!pdev || !pdev->soc)
  5935. return;
  5936. soc = pdev->soc;
  5937. if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
  5938. return;
  5939. delay_stats = peer->txrx_peer->delay_stats;
  5940. if (!delay_stats)
  5941. return;
  5942. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  5943. DP_PRINT_STATS("----TID: %d----", tid);
  5944. DP_PRINT_STATS("Rx Reap2stack Deliver Delay:");
  5945. dp_hist_init(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
  5946. dp_accumulate_delay_tid_stats(soc, delay_stats->delay_tid_stats,
  5947. &hist_stats, tid,
  5948. CDP_HIST_TYPE_REAP_STACK);
  5949. dp_print_hist_stats(&hist_stats, CDP_HIST_TYPE_REAP_STACK);
  5950. }
  5951. }
  5952. #else
  5953. static inline void dp_peer_print_tx_delay_stats(struct dp_pdev *pdev,
  5954. struct dp_peer *peer)
  5955. {
  5956. }
  5957. static inline void dp_peer_print_rx_delay_stats(struct dp_pdev *pdev,
  5958. struct dp_peer *peer)
  5959. {
  5960. }
  5961. #endif
  5962. #ifdef WLAN_FEATURE_11BE
  5963. void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
  5964. enum peer_stats_type stats_type)
  5965. {
  5966. uint8_t i;
  5967. if (stats_type == PEER_TX_STATS) {
  5968. DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d\n",
  5969. peer_stats->tx.bw[CMN_BW_20MHZ],
  5970. peer_stats->tx.bw[CMN_BW_40MHZ],
  5971. peer_stats->tx.bw[CMN_BW_80MHZ],
  5972. peer_stats->tx.bw[CMN_BW_160MHZ],
  5973. peer_stats->tx.bw[CMN_BW_320MHZ]);
  5974. DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
  5975. peer_stats->tx.punc_bw[NO_PUNCTURE],
  5976. peer_stats->tx.punc_bw[PUNCTURED_20MHZ],
  5977. peer_stats->tx.punc_bw[PUNCTURED_40MHZ],
  5978. peer_stats->tx.punc_bw[PUNCTURED_80MHZ],
  5979. peer_stats->tx.punc_bw[PUNCTURED_120MHZ]);
  5980. DP_PRINT_STATS("RU Locations");
  5981. for (i = 0; i < RU_INDEX_MAX; i++)
  5982. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  5983. cdp_ru_string[i].ru_type,
  5984. peer_stats->tx.ru_loc[i].num_msdu,
  5985. peer_stats->tx.ru_loc[i].num_mpdu,
  5986. peer_stats->tx.ru_loc[i].mpdu_tried);
  5987. dp_print_common_ppdu_rates_info(&peer_stats->tx.su_be_ppdu_cnt,
  5988. DOT11_BE);
  5989. dp_print_mu_be_ppdu_rates_info(&peer_stats->tx.mu_be_ppdu_cnt[0]);
  5990. } else {
  5991. DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d 320MHZ %d",
  5992. peer_stats->rx.bw[CMN_BW_20MHZ],
  5993. peer_stats->rx.bw[CMN_BW_40MHZ],
  5994. peer_stats->rx.bw[CMN_BW_80MHZ],
  5995. peer_stats->rx.bw[CMN_BW_160MHZ],
  5996. peer_stats->rx.bw[CMN_BW_320MHZ]);
  5997. DP_PRINT_STATS("Punctured BW Counts = NO_PUNC %d 20MHz %d 40MHz %d 80MHz %d 120MHz %d\n",
  5998. peer_stats->rx.punc_bw[NO_PUNCTURE],
  5999. peer_stats->rx.punc_bw[PUNCTURED_20MHZ],
  6000. peer_stats->rx.punc_bw[PUNCTURED_40MHZ],
  6001. peer_stats->rx.punc_bw[PUNCTURED_80MHZ],
  6002. peer_stats->rx.punc_bw[PUNCTURED_120MHZ]);
  6003. dp_print_common_ppdu_rates_info(&peer_stats->rx.su_be_ppdu_cnt,
  6004. DOT11_BE);
  6005. dp_print_mu_be_ppdu_rates_info(&peer_stats->rx.mu_be_ppdu_cnt[0]);
  6006. }
  6007. }
  6008. #else
  6009. void dp_print_peer_txrx_stats_be(struct cdp_peer_stats *peer_stats,
  6010. enum peer_stats_type stats_type)
  6011. {
  6012. }
  6013. #endif
  6014. void dp_print_peer_txrx_stats_li(struct cdp_peer_stats *peer_stats,
  6015. enum peer_stats_type stats_type)
  6016. {
  6017. if (stats_type == PEER_TX_STATS) {
  6018. DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
  6019. peer_stats->tx.bw[CMN_BW_20MHZ],
  6020. peer_stats->tx.bw[CMN_BW_40MHZ],
  6021. peer_stats->tx.bw[CMN_BW_80MHZ],
  6022. peer_stats->tx.bw[CMN_BW_160MHZ]);
  6023. DP_PRINT_STATS("RU Locations");
  6024. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6025. cdp_ru_string[RU_26_INDEX].ru_type,
  6026. peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
  6027. peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
  6028. peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
  6029. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6030. cdp_ru_string[RU_52_INDEX].ru_type,
  6031. peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
  6032. peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
  6033. peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
  6034. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6035. cdp_ru_string[RU_106_INDEX].ru_type,
  6036. peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
  6037. peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
  6038. peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
  6039. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6040. cdp_ru_string[RU_242_INDEX].ru_type,
  6041. peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
  6042. peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
  6043. peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
  6044. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6045. cdp_ru_string[RU_484_INDEX].ru_type,
  6046. peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
  6047. peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
  6048. peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
  6049. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6050. cdp_ru_string[RU_996_INDEX].ru_type,
  6051. peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
  6052. peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
  6053. peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
  6054. } else {
  6055. DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
  6056. peer_stats->rx.bw[CMN_BW_20MHZ],
  6057. peer_stats->rx.bw[CMN_BW_40MHZ],
  6058. peer_stats->rx.bw[CMN_BW_80MHZ],
  6059. peer_stats->rx.bw[CMN_BW_160MHZ]);
  6060. }
  6061. }
  6062. void dp_print_peer_txrx_stats_rh(struct cdp_peer_stats *peer_stats,
  6063. enum peer_stats_type stats_type)
  6064. {
  6065. if (stats_type == PEER_TX_STATS) {
  6066. DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d\n",
  6067. peer_stats->tx.bw[CMN_BW_20MHZ],
  6068. peer_stats->tx.bw[CMN_BW_40MHZ],
  6069. peer_stats->tx.bw[CMN_BW_80MHZ],
  6070. peer_stats->tx.bw[CMN_BW_160MHZ]);
  6071. DP_PRINT_STATS("RU Locations");
  6072. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6073. cdp_ru_string[RU_26_INDEX].ru_type,
  6074. peer_stats->tx.ru_loc[RU_26_INDEX].num_msdu,
  6075. peer_stats->tx.ru_loc[RU_26_INDEX].num_mpdu,
  6076. peer_stats->tx.ru_loc[RU_26_INDEX].mpdu_tried);
  6077. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6078. cdp_ru_string[RU_52_INDEX].ru_type,
  6079. peer_stats->tx.ru_loc[RU_52_INDEX].num_msdu,
  6080. peer_stats->tx.ru_loc[RU_52_INDEX].num_mpdu,
  6081. peer_stats->tx.ru_loc[RU_52_INDEX].mpdu_tried);
  6082. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6083. cdp_ru_string[RU_106_INDEX].ru_type,
  6084. peer_stats->tx.ru_loc[RU_106_INDEX].num_msdu,
  6085. peer_stats->tx.ru_loc[RU_106_INDEX].num_mpdu,
  6086. peer_stats->tx.ru_loc[RU_106_INDEX].mpdu_tried);
  6087. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6088. cdp_ru_string[RU_242_INDEX].ru_type,
  6089. peer_stats->tx.ru_loc[RU_242_INDEX].num_msdu,
  6090. peer_stats->tx.ru_loc[RU_242_INDEX].num_mpdu,
  6091. peer_stats->tx.ru_loc[RU_242_INDEX].mpdu_tried);
  6092. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6093. cdp_ru_string[RU_484_INDEX].ru_type,
  6094. peer_stats->tx.ru_loc[RU_484_INDEX].num_msdu,
  6095. peer_stats->tx.ru_loc[RU_484_INDEX].num_mpdu,
  6096. peer_stats->tx.ru_loc[RU_484_INDEX].mpdu_tried);
  6097. DP_PRINT_STATS("%s: MSDUs Success = %d MPDUs Success = %d MPDUs Tried = %d",
  6098. cdp_ru_string[RU_996_INDEX].ru_type,
  6099. peer_stats->tx.ru_loc[RU_996_INDEX].num_msdu,
  6100. peer_stats->tx.ru_loc[RU_996_INDEX].num_mpdu,
  6101. peer_stats->tx.ru_loc[RU_996_INDEX].mpdu_tried);
  6102. } else {
  6103. DP_PRINT_STATS("BW Counts = 20MHZ %d 40MHZ %d 80MHZ %d 160MHZ %d",
  6104. peer_stats->rx.bw[CMN_BW_20MHZ],
  6105. peer_stats->rx.bw[CMN_BW_40MHZ],
  6106. peer_stats->rx.bw[CMN_BW_80MHZ],
  6107. peer_stats->rx.bw[CMN_BW_160MHZ]);
  6108. }
  6109. }
  6110. #ifdef REO_SHARED_QREF_TABLE_EN
  6111. static void dp_peer_print_reo_qref_table(struct dp_peer *peer)
  6112. {
  6113. struct hal_soc *hal;
  6114. int i;
  6115. uint64_t *reo_qref_addr;
  6116. uint32_t peer_idx;
  6117. hal = (struct hal_soc *)peer->vdev->pdev->soc->hal_soc;
  6118. if (!hal_reo_shared_qaddr_is_enable((hal_soc_handle_t)hal))
  6119. return;
  6120. if ((!hal->reo_qref.non_mlo_reo_qref_table_vaddr) ||
  6121. (!hal->reo_qref.mlo_reo_qref_table_vaddr)) {
  6122. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
  6123. FL("REO shared table not allocated"));
  6124. return;
  6125. }
  6126. if (IS_MLO_DP_LINK_PEER(peer))
  6127. return;
  6128. if (IS_MLO_DP_MLD_PEER(peer)) {
  6129. hal = (struct hal_soc *)
  6130. peer->vdev->pdev->soc->hal_soc;
  6131. peer_idx = (peer->peer_id - HAL_ML_PEER_ID_START) *
  6132. DP_MAX_TIDS;
  6133. reo_qref_addr =
  6134. &hal->reo_qref.mlo_reo_qref_table_vaddr[peer_idx];
  6135. } else {
  6136. peer_idx = (peer->peer_id * DP_MAX_TIDS);
  6137. reo_qref_addr =
  6138. &hal->reo_qref.non_mlo_reo_qref_table_vaddr[peer_idx];
  6139. }
  6140. DP_PRINT_STATS("Reo Qref table for peer_id: %d\n", peer->peer_id);
  6141. for (i = 0; i < DP_MAX_TIDS; i++)
  6142. DP_PRINT_STATS(" Tid [%d] :%llx", i, reo_qref_addr[i]);
  6143. }
  6144. #else
  6145. static inline void dp_peer_print_reo_qref_table(struct dp_peer *peer)
  6146. {
  6147. }
  6148. #endif
  6149. void dp_print_peer_stats(struct dp_peer *peer,
  6150. struct cdp_peer_stats *peer_stats)
  6151. {
  6152. uint8_t i;
  6153. uint32_t index;
  6154. uint32_t j;
  6155. char nss[DP_NSS_LENGTH];
  6156. char mu_group_id[DP_MU_GROUP_LENGTH];
  6157. struct dp_pdev *pdev;
  6158. uint32_t *pnss;
  6159. enum cdp_mu_packet_type rx_mu_type;
  6160. struct cdp_rx_mu *rx_mu;
  6161. pdev = peer->vdev->pdev;
  6162. DP_PRINT_STATS("Node Tx Stats:\n");
  6163. DP_PRINT_STATS("Total Packet Completions = %d",
  6164. peer_stats->tx.comp_pkt.num);
  6165. DP_PRINT_STATS("Total Bytes Completions = %llu",
  6166. peer_stats->tx.comp_pkt.bytes);
  6167. DP_PRINT_STATS("Success Packets = %d",
  6168. peer_stats->tx.tx_success.num);
  6169. DP_PRINT_STATS("Success Bytes = %llu",
  6170. peer_stats->tx.tx_success.bytes);
  6171. DP_PRINT_STATS("Success Packets in TWT Session = %d",
  6172. peer_stats->tx.tx_success_twt.num);
  6173. DP_PRINT_STATS("Success Bytes in TWT Session = %llu",
  6174. peer_stats->tx.tx_success_twt.bytes);
  6175. DP_PRINT_STATS("Unicast Success Packets = %d",
  6176. peer_stats->tx.ucast.num);
  6177. DP_PRINT_STATS("Unicast Success Bytes = %llu",
  6178. peer_stats->tx.ucast.bytes);
  6179. DP_PRINT_STATS("Multicast Success Packets = %d",
  6180. peer_stats->tx.mcast.num);
  6181. DP_PRINT_STATS("Multicast Success Bytes = %llu",
  6182. peer_stats->tx.mcast.bytes);
  6183. DP_PRINT_STATS("Broadcast Success Packets = %d",
  6184. peer_stats->tx.bcast.num);
  6185. DP_PRINT_STATS("Broadcast Success Bytes = %llu",
  6186. peer_stats->tx.bcast.bytes);
  6187. DP_PRINT_STATS("Packets Successfully Sent after one or more retry = %d",
  6188. peer_stats->tx.retry_count);
  6189. DP_PRINT_STATS("Packets Successfully Sent after more than one retry = %d",
  6190. peer_stats->tx.multiple_retry_count);
  6191. DP_PRINT_STATS("Packets Failed = %d",
  6192. peer_stats->tx.tx_failed);
  6193. DP_PRINT_STATS("Packets Failed due to retry threshold breach = %d",
  6194. peer_stats->tx.failed_retry_count);
  6195. DP_PRINT_STATS("Packets In OFDMA = %d",
  6196. peer_stats->tx.ofdma);
  6197. DP_PRINT_STATS("Packets In STBC = %d",
  6198. peer_stats->tx.stbc);
  6199. DP_PRINT_STATS("Packets In LDPC = %d",
  6200. peer_stats->tx.ldpc);
  6201. DP_PRINT_STATS("Packet Retries = %d",
  6202. peer_stats->tx.retries);
  6203. DP_PRINT_STATS("MSDU's Part of AMSDU = %d",
  6204. peer_stats->tx.amsdu_cnt);
  6205. DP_PRINT_STATS("Msdu's As Part of Ampdu = %d",
  6206. peer_stats->tx.non_ampdu_cnt);
  6207. DP_PRINT_STATS("Msdu's As Ampdu = %d",
  6208. peer_stats->tx.ampdu_cnt);
  6209. DP_PRINT_STATS("Last Packet RSSI = %d",
  6210. peer_stats->tx.last_ack_rssi);
  6211. DP_PRINT_STATS("Dropped At FW: Removed Pkts = %u",
  6212. peer_stats->tx.dropped.fw_rem.num);
  6213. DP_PRINT_STATS("Release source not TQM = %u",
  6214. peer_stats->tx.release_src_not_tqm);
  6215. if (pdev && !wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
  6216. DP_PRINT_STATS("Dropped At FW: Removed bytes = %llu",
  6217. peer_stats->tx.dropped.fw_rem.bytes);
  6218. }
  6219. DP_PRINT_STATS("Dropped At FW: Removed transmitted = %d",
  6220. peer_stats->tx.dropped.fw_rem_tx);
  6221. DP_PRINT_STATS("Dropped At FW: Removed Untransmitted = %d",
  6222. peer_stats->tx.dropped.fw_rem_notx);
  6223. DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason1 = %u",
  6224. peer_stats->tx.dropped.fw_reason1);
  6225. DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason2 = %u",
  6226. peer_stats->tx.dropped.fw_reason2);
  6227. DP_PRINT_STATS("Dropped At FW: removed untransmitted fw_reason3 = %u",
  6228. peer_stats->tx.dropped.fw_reason3);
  6229. DP_PRINT_STATS("Dropped At FW:removed untransmitted disable queue = %u",
  6230. peer_stats->tx.dropped.fw_rem_queue_disable);
  6231. DP_PRINT_STATS("Dropped At FW: removed untransmitted no match = %u",
  6232. peer_stats->tx.dropped.fw_rem_no_match);
  6233. DP_PRINT_STATS("Dropped due to HW threshold criteria = %u",
  6234. peer_stats->tx.dropped.drop_threshold);
  6235. DP_PRINT_STATS("Dropped due Link desc not available drop in HW = %u",
  6236. peer_stats->tx.dropped.drop_link_desc_na);
  6237. DP_PRINT_STATS("Drop bit set or invalid flow = %u",
  6238. peer_stats->tx.dropped.invalid_drop);
  6239. DP_PRINT_STATS("MCAST vdev drop in HW = %u",
  6240. peer_stats->tx.dropped.mcast_vdev_drop);
  6241. DP_PRINT_STATS("Dropped : Age Out = %d",
  6242. peer_stats->tx.dropped.age_out);
  6243. DP_PRINT_STATS("Dropped : Invalid Reason = %u",
  6244. peer_stats->tx.dropped.invalid_rr);
  6245. DP_PRINT_STATS("NAWDS : ");
  6246. DP_PRINT_STATS("Nawds multicast Drop Tx Packet = %d",
  6247. peer_stats->tx.nawds_mcast_drop);
  6248. DP_PRINT_STATS(" Nawds multicast Tx Packet Count = %d",
  6249. peer_stats->tx.nawds_mcast.num);
  6250. DP_PRINT_STATS(" Nawds multicast Tx Packet Bytes = %llu",
  6251. peer_stats->tx.nawds_mcast.bytes);
  6252. DP_PRINT_STATS("PPDU's = %d", peer_stats->tx.tx_ppdus);
  6253. DP_PRINT_STATS("Number of PPDU's with Punctured Preamble = %d",
  6254. peer_stats->tx.pream_punct_cnt);
  6255. DP_PRINT_STATS("MPDU's Successful = %d",
  6256. peer_stats->tx.tx_mpdus_success);
  6257. DP_PRINT_STATS("MPDU's Tried = %d", peer_stats->tx.tx_mpdus_tried);
  6258. DP_PRINT_STATS("Rate Info:");
  6259. dp_print_common_rates_info(peer_stats->tx.pkt_type);
  6260. DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
  6261. peer_stats->tx.sgi_count[0],
  6262. peer_stats->tx.sgi_count[1],
  6263. peer_stats->tx.sgi_count[2],
  6264. peer_stats->tx.sgi_count[3]);
  6265. DP_PRINT_STATS("Wireless Mutlimedia ");
  6266. DP_PRINT_STATS(" Best effort = %d",
  6267. peer_stats->tx.wme_ac_type[0]);
  6268. DP_PRINT_STATS(" Background= %d",
  6269. peer_stats->tx.wme_ac_type[1]);
  6270. DP_PRINT_STATS(" Video = %d",
  6271. peer_stats->tx.wme_ac_type[2]);
  6272. DP_PRINT_STATS(" Voice = %d",
  6273. peer_stats->tx.wme_ac_type[3]);
  6274. DP_PRINT_STATS("Excess Retries per AC ");
  6275. DP_PRINT_STATS(" Best effort = %d",
  6276. peer_stats->tx.excess_retries_per_ac[0]);
  6277. DP_PRINT_STATS(" Background= %d",
  6278. peer_stats->tx.excess_retries_per_ac[1]);
  6279. DP_PRINT_STATS(" Video = %d",
  6280. peer_stats->tx.excess_retries_per_ac[2]);
  6281. DP_PRINT_STATS(" Voice = %d",
  6282. peer_stats->tx.excess_retries_per_ac[3]);
  6283. pnss = &peer_stats->tx.nss[0];
  6284. dp_print_nss(nss, pnss, SS_COUNT);
  6285. DP_PRINT_STATS("NSS(1-8) = %s", nss);
  6286. DP_PRINT_STATS("Transmit Type :");
  6287. DP_PRINT_STATS("MSDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
  6288. peer_stats->tx.transmit_type[SU].num_msdu,
  6289. peer_stats->tx.transmit_type[MU_MIMO].num_msdu,
  6290. peer_stats->tx.transmit_type[MU_OFDMA].num_msdu,
  6291. peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_msdu);
  6292. DP_PRINT_STATS("MPDUs Success: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
  6293. peer_stats->tx.transmit_type[SU].num_mpdu,
  6294. peer_stats->tx.transmit_type[MU_MIMO].num_mpdu,
  6295. peer_stats->tx.transmit_type[MU_OFDMA].num_mpdu,
  6296. peer_stats->tx.transmit_type[MU_MIMO_OFDMA].num_mpdu);
  6297. DP_PRINT_STATS("MPDUs Tried: SU %d, MU_MIMO %d, MU_OFDMA %d, MU_MIMO_OFDMA %d",
  6298. peer_stats->tx.transmit_type[SU].mpdu_tried,
  6299. peer_stats->tx.transmit_type[MU_MIMO].mpdu_tried,
  6300. peer_stats->tx.transmit_type[MU_OFDMA].mpdu_tried,
  6301. peer_stats->tx.transmit_type[MU_MIMO_OFDMA].mpdu_tried);
  6302. for (i = 0; i < MAX_MU_GROUP_ID;) {
  6303. index = 0;
  6304. for (j = 0; j < DP_MU_GROUP_SHOW && i < MAX_MU_GROUP_ID;
  6305. j++) {
  6306. index += qdf_snprint(&mu_group_id[index],
  6307. DP_MU_GROUP_LENGTH - index,
  6308. " %d",
  6309. peer_stats->tx.mu_group_id[i]);
  6310. i++;
  6311. }
  6312. DP_PRINT_STATS("User position list for GID %02d->%d: [%s]",
  6313. i - DP_MU_GROUP_SHOW, i - 1, mu_group_id);
  6314. }
  6315. DP_PRINT_STATS("Last Packet RU index [%d], Size [%d]",
  6316. peer_stats->tx.ru_start, peer_stats->tx.ru_tones);
  6317. DP_PRINT_STATS("Aggregation:");
  6318. DP_PRINT_STATS("Number of Msdu's Part of Amsdu = %d",
  6319. peer_stats->tx.amsdu_cnt);
  6320. DP_PRINT_STATS("Number of Msdu's With No Msdu Level Aggregation = %d",
  6321. peer_stats->tx.non_amsdu_cnt);
  6322. DP_PRINT_STATS("Bytes and Packets transmitted in last one sec:");
  6323. DP_PRINT_STATS(" Bytes transmitted in last sec: %d",
  6324. peer_stats->tx.tx_byte_rate);
  6325. DP_PRINT_STATS(" Data transmitted in last sec: %d",
  6326. peer_stats->tx.tx_data_rate);
  6327. if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
  6328. pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
  6329. PEER_TX_STATS);
  6330. if (!IS_MLO_DP_LINK_PEER(peer)) {
  6331. dp_print_jitter_stats(peer, pdev);
  6332. dp_peer_print_tx_delay_stats(pdev, peer);
  6333. }
  6334. if (IS_MLO_DP_MLD_PEER(peer))
  6335. DP_PRINT_STATS("TX Invalid Link ID Packet Count = %u",
  6336. peer_stats->tx.inval_link_id_pkt_cnt);
  6337. DP_PRINT_STATS("Node Rx Stats:");
  6338. DP_PRINT_STATS("Packets Sent To Stack = %d",
  6339. peer_stats->rx.to_stack.num);
  6340. DP_PRINT_STATS("Bytes Sent To Stack = %llu",
  6341. peer_stats->rx.to_stack.bytes);
  6342. for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
  6343. DP_PRINT_STATS("Ring Id = %d", i);
  6344. DP_PRINT_STATS(" Packets Received = %d",
  6345. peer_stats->rx.rcvd_reo[i].num);
  6346. DP_PRINT_STATS(" Bytes Received = %llu",
  6347. peer_stats->rx.rcvd_reo[i].bytes);
  6348. }
  6349. for (i = 0; i < CDP_MAX_LMACS; i++)
  6350. DP_PRINT_STATS("Packets Received on lmac[%d] = %d ( %llu ),",
  6351. i, peer_stats->rx.rx_lmac[i].num,
  6352. peer_stats->rx.rx_lmac[i].bytes);
  6353. DP_PRINT_STATS("Unicast Packets Received = %d",
  6354. peer_stats->rx.unicast.num);
  6355. DP_PRINT_STATS("Unicast Bytes Received = %llu",
  6356. peer_stats->rx.unicast.bytes);
  6357. DP_PRINT_STATS("Multicast Packets Received = %d",
  6358. peer_stats->rx.multicast.num);
  6359. DP_PRINT_STATS("Multicast Bytes Received = %llu",
  6360. peer_stats->rx.multicast.bytes);
  6361. DP_PRINT_STATS("Broadcast Packets Received = %d",
  6362. peer_stats->rx.bcast.num);
  6363. DP_PRINT_STATS("Broadcast Bytes Received = %llu",
  6364. peer_stats->rx.bcast.bytes);
  6365. DP_PRINT_STATS("Packets Sent To Stack in TWT Session = %d",
  6366. peer_stats->rx.to_stack_twt.num);
  6367. DP_PRINT_STATS("Bytes Sent To Stack in TWT Session = %llu",
  6368. peer_stats->rx.to_stack_twt.bytes);
  6369. DP_PRINT_STATS("Intra BSS Packets Received = %d",
  6370. peer_stats->rx.intra_bss.pkts.num);
  6371. DP_PRINT_STATS("Intra BSS Bytes Received = %llu",
  6372. peer_stats->rx.intra_bss.pkts.bytes);
  6373. DP_PRINT_STATS("Intra BSS Packets Failed = %d",
  6374. peer_stats->rx.intra_bss.fail.num);
  6375. DP_PRINT_STATS("Intra BSS Bytes Failed = %llu",
  6376. peer_stats->rx.intra_bss.fail.bytes);
  6377. DP_PRINT_STATS("Intra BSS MDNS Packets Not Forwarded = %d",
  6378. peer_stats->rx.intra_bss.mdns_no_fwd);
  6379. DP_PRINT_STATS("Raw Packets Received = %d",
  6380. peer_stats->rx.raw.num);
  6381. DP_PRINT_STATS("Raw Bytes Received = %llu",
  6382. peer_stats->rx.raw.bytes);
  6383. DP_PRINT_STATS("Errors: MIC Errors = %d",
  6384. peer_stats->rx.err.mic_err);
  6385. DP_PRINT_STATS("Errors: Decryption Errors = %d",
  6386. peer_stats->rx.err.decrypt_err);
  6387. DP_PRINT_STATS("Errors: PN Errors = %d",
  6388. peer_stats->rx.err.pn_err);
  6389. DP_PRINT_STATS("Errors: OOR Errors = %d",
  6390. peer_stats->rx.err.oor_err);
  6391. DP_PRINT_STATS("Errors: 2k Jump Errors = %d",
  6392. peer_stats->rx.err.jump_2k_err);
  6393. DP_PRINT_STATS("Errors: RXDMA Wifi Parse Errors = %d",
  6394. peer_stats->rx.err.rxdma_wifi_parse_err);
  6395. DP_PRINT_STATS("Msdu's Received As Part of Ampdu = %d",
  6396. peer_stats->rx.non_ampdu_cnt);
  6397. DP_PRINT_STATS("Msdu's Received As Ampdu = %d",
  6398. peer_stats->rx.ampdu_cnt);
  6399. DP_PRINT_STATS("Msdu's Received Not Part of Amsdu's = %d",
  6400. peer_stats->rx.non_amsdu_cnt);
  6401. DP_PRINT_STATS("MSDUs Received As Part of Amsdu = %d",
  6402. peer_stats->rx.amsdu_cnt);
  6403. DP_PRINT_STATS("MSDU Rx Retries= %d", peer_stats->rx.rx_retries);
  6404. DP_PRINT_STATS("MPDU Rx Retries= %d", peer_stats->rx.mpdu_retry_cnt);
  6405. DP_PRINT_STATS("NAWDS : ");
  6406. DP_PRINT_STATS(" Nawds multicast Drop Rx Packet = %d",
  6407. peer_stats->rx.nawds_mcast_drop);
  6408. DP_PRINT_STATS(" 3address multicast Drop Rx Packet = %d",
  6409. peer_stats->rx.mcast_3addr_drop);
  6410. DP_PRINT_STATS("SGI = 0.8us %d 0.4us %d 1.6us %d 3.2us %d",
  6411. peer_stats->rx.sgi_count[0],
  6412. peer_stats->rx.sgi_count[1],
  6413. peer_stats->rx.sgi_count[2],
  6414. peer_stats->rx.sgi_count[3]);
  6415. DP_PRINT_STATS("Wireless Mutlimedia ");
  6416. DP_PRINT_STATS(" Best effort = %d",
  6417. peer_stats->rx.wme_ac_type[0]);
  6418. DP_PRINT_STATS(" Background= %d",
  6419. peer_stats->rx.wme_ac_type[1]);
  6420. DP_PRINT_STATS(" Video = %d",
  6421. peer_stats->rx.wme_ac_type[2]);
  6422. DP_PRINT_STATS(" Voice = %d",
  6423. peer_stats->rx.wme_ac_type[3]);
  6424. DP_PRINT_STATS(" Total Rx PPDU Count = %d", peer_stats->rx.rx_ppdus);
  6425. DP_PRINT_STATS(" Total Rx MPDU Count = %d", peer_stats->rx.rx_mpdus);
  6426. DP_PRINT_STATS("MSDU Reception Type");
  6427. DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
  6428. peer_stats->rx.reception_type[0],
  6429. peer_stats->rx.reception_type[1],
  6430. peer_stats->rx.reception_type[2],
  6431. peer_stats->rx.reception_type[3]);
  6432. DP_PRINT_STATS("PPDU Reception Type");
  6433. DP_PRINT_STATS("SU %d MU_MIMO %d MU_OFDMA %d MU_OFDMA_MIMO %d",
  6434. peer_stats->rx.ppdu_cnt[0],
  6435. peer_stats->rx.ppdu_cnt[1],
  6436. peer_stats->rx.ppdu_cnt[2],
  6437. peer_stats->rx.ppdu_cnt[3]);
  6438. dp_print_common_rates_info(peer_stats->rx.pkt_type);
  6439. dp_print_common_ppdu_rates_info(&peer_stats->rx.su_ax_ppdu_cnt,
  6440. DOT11_AX);
  6441. dp_print_mu_ppdu_rates_info(&peer_stats->rx.rx_mu[0]);
  6442. pnss = &peer_stats->rx.nss[0];
  6443. dp_print_nss(nss, pnss, SS_COUNT);
  6444. DP_PRINT_STATS("MSDU Count");
  6445. DP_PRINT_STATS(" NSS(1-8) = %s", nss);
  6446. DP_PRINT_STATS("reception mode SU");
  6447. pnss = &peer_stats->rx.ppdu_nss[0];
  6448. dp_print_nss(nss, pnss, SS_COUNT);
  6449. DP_PRINT_STATS(" PPDU Count");
  6450. DP_PRINT_STATS(" NSS(1-8) = %s", nss);
  6451. DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d",
  6452. peer_stats->rx.mpdu_cnt_fcs_ok,
  6453. peer_stats->rx.mpdu_cnt_fcs_err);
  6454. for (rx_mu_type = 0; rx_mu_type < TXRX_TYPE_MU_MAX; rx_mu_type++) {
  6455. DP_PRINT_STATS("reception mode %s",
  6456. mu_reception_mode[rx_mu_type]);
  6457. rx_mu = &peer_stats->rx.rx_mu[rx_mu_type];
  6458. pnss = &rx_mu->ppdu_nss[0];
  6459. dp_print_nss(nss, pnss, SS_COUNT);
  6460. DP_PRINT_STATS(" PPDU Count");
  6461. DP_PRINT_STATS(" NSS(1-8) = %s", nss);
  6462. DP_PRINT_STATS(" MPDU OK = %d, MPDU Fail = %d",
  6463. rx_mu->mpdu_cnt_fcs_ok,
  6464. rx_mu->mpdu_cnt_fcs_err);
  6465. }
  6466. DP_PRINT_STATS("Aggregation:");
  6467. DP_PRINT_STATS(" Msdu's Part of Ampdu = %d",
  6468. peer_stats->rx.ampdu_cnt);
  6469. DP_PRINT_STATS(" Msdu's With No Mpdu Level Aggregation = %d",
  6470. peer_stats->rx.non_ampdu_cnt);
  6471. DP_PRINT_STATS(" Msdu's Part of Amsdu = %d",
  6472. peer_stats->rx.amsdu_cnt);
  6473. DP_PRINT_STATS(" Msdu's With No Msdu Level Aggregation = %d",
  6474. peer_stats->rx.non_amsdu_cnt);
  6475. DP_PRINT_STATS("Bytes and Packets received in last one sec:");
  6476. DP_PRINT_STATS(" Bytes received in last sec: %d",
  6477. peer_stats->rx.rx_byte_rate);
  6478. DP_PRINT_STATS(" Data received in last sec: %d",
  6479. peer_stats->rx.rx_data_rate);
  6480. DP_PRINT_STATS("MEC Packet Drop = %d",
  6481. peer_stats->rx.mec_drop.num);
  6482. DP_PRINT_STATS("MEC Byte Drop = %llu",
  6483. peer_stats->rx.mec_drop.bytes);
  6484. DP_PRINT_STATS("Multipass Rx Packet Drop = %d",
  6485. peer_stats->rx.multipass_rx_pkt_drop);
  6486. DP_PRINT_STATS("Peer Unauth Rx Packet Drop = %d",
  6487. peer_stats->rx.peer_unauth_rx_pkt_drop);
  6488. DP_PRINT_STATS("Policy Check Rx Packet Drop = %d",
  6489. peer_stats->rx.policy_check_drop);
  6490. if (pdev && pdev->soc->arch_ops.txrx_print_peer_stats)
  6491. pdev->soc->arch_ops.txrx_print_peer_stats(peer_stats,
  6492. PEER_RX_STATS);
  6493. if (!IS_MLO_DP_LINK_PEER(peer))
  6494. dp_peer_print_rx_delay_stats(pdev, peer);
  6495. if (IS_MLO_DP_MLD_PEER(peer))
  6496. DP_PRINT_STATS("RX Invalid Link ID Packet Count = %u",
  6497. peer_stats->rx.inval_link_id_pkt_cnt);
  6498. dp_peer_print_reo_qref_table(peer);
  6499. }
  6500. void dp_print_per_ring_stats(struct dp_soc *soc)
  6501. {
  6502. uint8_t ring;
  6503. uint16_t core;
  6504. uint64_t total_packets;
  6505. DP_PRINT_STATS("Reo packets per ring:");
  6506. for (ring = 0; ring < MAX_REO_DEST_RINGS; ring++) {
  6507. total_packets = 0;
  6508. DP_PRINT_STATS("Packets on ring %u:", ring);
  6509. for (core = 0; core < num_possible_cpus(); core++) {
  6510. if (!soc->stats.rx.ring_packets[core][ring])
  6511. continue;
  6512. DP_PRINT_STATS("Packets arriving on core %u: %llu",
  6513. core,
  6514. soc->stats.rx.ring_packets[core][ring]);
  6515. total_packets += soc->stats.rx.ring_packets[core][ring];
  6516. }
  6517. DP_PRINT_STATS("Total packets on ring %u: %llu",
  6518. ring, total_packets);
  6519. }
  6520. }
  6521. void dp_txrx_path_stats(struct dp_soc *soc)
  6522. {
  6523. uint8_t error_code;
  6524. uint8_t loop_pdev;
  6525. struct dp_pdev *pdev;
  6526. uint8_t i;
  6527. if (!soc) {
  6528. dp_err("%s: Invalid access", __func__);
  6529. return;
  6530. }
  6531. for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
  6532. pdev = soc->pdev_list[loop_pdev];
  6533. dp_aggregate_pdev_stats(pdev);
  6534. DP_PRINT_STATS("Tx path Statistics:");
  6535. DP_PRINT_STATS("from stack: %u msdus (%llu bytes)",
  6536. pdev->stats.tx_i.rcvd.num,
  6537. pdev->stats.tx_i.rcvd.bytes);
  6538. DP_PRINT_STATS("processed from host: %u msdus (%llu bytes)",
  6539. pdev->stats.tx_i.processed.num,
  6540. pdev->stats.tx_i.processed.bytes);
  6541. DP_PRINT_STATS("successfully transmitted: %u msdus (%llu bytes)",
  6542. pdev->stats.tx.tx_success.num,
  6543. pdev->stats.tx.tx_success.bytes);
  6544. for (i = 0; i < soc->num_tcl_data_rings; i++) {
  6545. DP_PRINT_STATS("Enqueue to SW2TCL%u: %u", i + 1,
  6546. soc->stats.tx.tcl_enq[i]);
  6547. DP_PRINT_STATS("TX completions reaped from ring %u: %u",
  6548. i, soc->stats.tx.tx_comp[i]);
  6549. }
  6550. DP_PRINT_STATS("Invalid release source: %u",
  6551. soc->stats.tx.invalid_release_source);
  6552. DP_PRINT_STATS("Invalid TX desc from completion ring: %u",
  6553. soc->stats.tx.invalid_tx_comp_desc);
  6554. DP_PRINT_STATS("Dropped in host:");
  6555. DP_PRINT_STATS("Total packets dropped: %u,",
  6556. pdev->stats.tx_i.dropped.dropped_pkt.num);
  6557. DP_PRINT_STATS("Descriptor not available: %u",
  6558. pdev->stats.tx_i.dropped.desc_na.num);
  6559. DP_PRINT_STATS("Ring full: %u",
  6560. pdev->stats.tx_i.dropped.ring_full);
  6561. DP_PRINT_STATS("Enqueue fail: %u",
  6562. pdev->stats.tx_i.dropped.enqueue_fail);
  6563. DP_PRINT_STATS("Pkt dropped in vdev-id check: %u",
  6564. pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
  6565. DP_PRINT_STATS("DMA Error: %u",
  6566. pdev->stats.tx_i.dropped.dma_error);
  6567. DP_PRINT_STATS("Drop Ingress: %u",
  6568. pdev->stats.tx_i.dropped.drop_ingress);
  6569. DP_PRINT_STATS("Dropped in hardware:");
  6570. DP_PRINT_STATS("total packets dropped: %u",
  6571. pdev->stats.tx.tx_failed);
  6572. DP_PRINT_STATS("mpdu age out: %u",
  6573. pdev->stats.tx.dropped.age_out);
  6574. DP_PRINT_STATS("firmware removed packets: %u (%llu bytes)",
  6575. pdev->stats.tx.dropped.fw_rem.num,
  6576. pdev->stats.tx.dropped.fw_rem.bytes);
  6577. DP_PRINT_STATS("firmware removed tx: %u",
  6578. pdev->stats.tx.dropped.fw_rem_tx);
  6579. DP_PRINT_STATS("firmware removed notx %u",
  6580. pdev->stats.tx.dropped.fw_rem_notx);
  6581. DP_PRINT_STATS("Invalid peer on tx path: %u",
  6582. pdev->soc->stats.tx.tx_invalid_peer.num);
  6583. DP_PRINT_STATS("Tx desc freed in non-completion path: %u",
  6584. pdev->soc->stats.tx.tx_comp_exception);
  6585. DP_PRINT_STATS("Tx desc force freed: %u",
  6586. pdev->soc->stats.tx.tx_comp_force_freed);
  6587. DP_PRINT_STATS("Tx packets sent per interrupt:");
  6588. DP_PRINT_STATS("Single Packet: %u",
  6589. pdev->stats.tx_comp_histogram.pkts_1);
  6590. DP_PRINT_STATS("2-20 Packets: %u",
  6591. pdev->stats.tx_comp_histogram.pkts_2_20);
  6592. DP_PRINT_STATS("21-40 Packets: %u",
  6593. pdev->stats.tx_comp_histogram.pkts_21_40);
  6594. DP_PRINT_STATS("41-60 Packets: %u",
  6595. pdev->stats.tx_comp_histogram.pkts_41_60);
  6596. DP_PRINT_STATS("61-80 Packets: %u",
  6597. pdev->stats.tx_comp_histogram.pkts_61_80);
  6598. DP_PRINT_STATS("81-100 Packets: %u",
  6599. pdev->stats.tx_comp_histogram.pkts_81_100);
  6600. DP_PRINT_STATS("101-200 Packets: %u",
  6601. pdev->stats.tx_comp_histogram.pkts_101_200);
  6602. DP_PRINT_STATS(" 201+ Packets: %u",
  6603. pdev->stats.tx_comp_histogram.pkts_201_plus);
  6604. DP_PRINT_STATS("Rx path statistics");
  6605. DP_PRINT_STATS("delivered %u msdus ( %llu bytes),",
  6606. pdev->stats.rx.to_stack.num,
  6607. pdev->stats.rx.to_stack.bytes);
  6608. for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
  6609. if (!pdev->stats.rx.rcvd_reo[i].num)
  6610. continue;
  6611. DP_PRINT_STATS(
  6612. "received on reo[%d] %u msdus( %llu bytes),",
  6613. i, pdev->stats.rx.rcvd_reo[i].num,
  6614. pdev->stats.rx.rcvd_reo[i].bytes);
  6615. }
  6616. for (i = 0; i < CDP_MAX_LMACS; i++)
  6617. DP_PRINT_STATS("received on lmac[%d] %u msdus (%llu bytes),",
  6618. i, pdev->stats.rx.rx_lmac[i].num,
  6619. pdev->stats.rx.rx_lmac[i].bytes);
  6620. DP_PRINT_STATS("intra-bss packets %u msdus ( %llu bytes),",
  6621. pdev->stats.rx.intra_bss.pkts.num,
  6622. pdev->stats.rx.intra_bss.pkts.bytes);
  6623. DP_PRINT_STATS("intra-bss fails %u msdus ( %llu bytes),",
  6624. pdev->stats.rx.intra_bss.fail.num,
  6625. pdev->stats.rx.intra_bss.fail.bytes);
  6626. DP_PRINT_STATS("intra-bss no mdns fwds %u msdus",
  6627. pdev->stats.rx.intra_bss.mdns_no_fwd);
  6628. DP_PRINT_STATS("intra-bss EAPOL drops: %u",
  6629. soc->stats.rx.err.intrabss_eapol_drop);
  6630. DP_PRINT_STATS("raw packets %u msdus ( %llu bytes),",
  6631. pdev->stats.rx.raw.num,
  6632. pdev->stats.rx.raw.bytes);
  6633. DP_PRINT_STATS("mic errors %u",
  6634. pdev->stats.rx.err.mic_err);
  6635. DP_PRINT_STATS("Invalid peer on rx path: %u",
  6636. pdev->soc->stats.rx.err.rx_invalid_peer.num);
  6637. DP_PRINT_STATS("sw_peer_id invalid %u",
  6638. pdev->soc->stats.rx.err.rx_invalid_peer_id.num);
  6639. DP_PRINT_STATS("packet_len invalid %u",
  6640. pdev->soc->stats.rx.err.rx_invalid_pkt_len.num);
  6641. DP_PRINT_STATS("sa or da idx invalid %u",
  6642. pdev->soc->stats.rx.err.invalid_sa_da_idx);
  6643. DP_PRINT_STATS("defrag peer uninit %u",
  6644. pdev->soc->stats.rx.err.defrag_peer_uninit);
  6645. DP_PRINT_STATS("pkts delivered no peer %u",
  6646. pdev->soc->stats.rx.err.pkt_delivered_no_peer);
  6647. DP_PRINT_STATS("RX invalid cookie: %d",
  6648. soc->stats.rx.err.invalid_cookie);
  6649. DP_PRINT_STATS("RX stale cookie: %d",
  6650. soc->stats.rx.err.stale_cookie);
  6651. DP_PRINT_STATS("2k jump delba sent: %u",
  6652. pdev->soc->stats.rx.err.rx_2k_jump_delba_sent);
  6653. DP_PRINT_STATS("2k jump msdu to stack: %u",
  6654. pdev->soc->stats.rx.err.rx_2k_jump_to_stack);
  6655. DP_PRINT_STATS("2k jump msdu drop: %u",
  6656. pdev->soc->stats.rx.err.rx_2k_jump_drop);
  6657. DP_PRINT_STATS("REO err oor msdu to stack %u",
  6658. pdev->soc->stats.rx.err.reo_err_oor_to_stack);
  6659. DP_PRINT_STATS("REO err oor msdu drop: %u",
  6660. pdev->soc->stats.rx.err.reo_err_oor_drop);
  6661. DP_PRINT_STATS("Rx err msdu rejected: %d",
  6662. soc->stats.rx.err.rejected);
  6663. DP_PRINT_STATS("Rx raw frame dropped: %d",
  6664. soc->stats.rx.err.raw_frm_drop);
  6665. DP_PRINT_STATS("Rx stale link desc cookie: %d",
  6666. pdev->soc->stats.rx.err.invalid_link_cookie);
  6667. DP_PRINT_STATS("Rx nbuf sanity fails: %d",
  6668. pdev->soc->stats.rx.err.nbuf_sanity_fail);
  6669. DP_PRINT_STATS("Rx refill duplicate link desc: %d",
  6670. pdev->soc->stats.rx.err.dup_refill_link_desc);
  6671. DP_PRINT_STATS("Rx ipa smmu map duplicate: %d",
  6672. pdev->soc->stats.rx.err.ipa_smmu_map_dup);
  6673. DP_PRINT_STATS("Rx ipa smmu unmap duplicate: %d",
  6674. pdev->soc->stats.rx.err.ipa_smmu_unmap_dup);
  6675. DP_PRINT_STATS("Rx ipa smmu unmap no pipes: %d",
  6676. pdev->soc->stats.rx.err.ipa_unmap_no_pipe);
  6677. DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
  6678. soc->stats.rx.err.pn_in_dest_check_fail);
  6679. DP_PRINT_STATS("Reo Statistics");
  6680. DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
  6681. DP_PRINT_STATS("rbm error: %u msdus",
  6682. pdev->soc->stats.rx.err.invalid_rbm);
  6683. DP_PRINT_STATS("hal ring access fail: %u msdus",
  6684. pdev->soc->stats.rx.err.hal_ring_access_fail);
  6685. DP_PRINT_STATS("hal ring access full fail: %u msdus",
  6686. pdev->soc->stats.rx.err.hal_ring_access_full_fail);
  6687. DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
  6688. for (error_code = 0; error_code < HAL_REO_ERR_MAX;
  6689. error_code++) {
  6690. if (!pdev->soc->stats.rx.err.reo_error[error_code])
  6691. continue;
  6692. DP_PRINT_STATS("Reo error number (%u): %u msdus",
  6693. error_code,
  6694. pdev->soc->stats.rx.err
  6695. .reo_error[error_code]);
  6696. }
  6697. for (error_code = 0; error_code < HAL_RXDMA_ERR_MAX;
  6698. error_code++) {
  6699. if (!pdev->soc->stats.rx.err.rxdma_error[error_code])
  6700. continue;
  6701. DP_PRINT_STATS("Rxdma error number (%u): %u msdus",
  6702. error_code,
  6703. pdev->soc->stats.rx.err
  6704. .rxdma_error[error_code]);
  6705. }
  6706. DP_PRINT_STATS("Rx packets reaped per interrupt:");
  6707. DP_PRINT_STATS("Single Packet: %u",
  6708. pdev->stats.rx_ind_histogram.pkts_1);
  6709. DP_PRINT_STATS("2-20 Packets: %u",
  6710. pdev->stats.rx_ind_histogram.pkts_2_20);
  6711. DP_PRINT_STATS("21-40 Packets: %u",
  6712. pdev->stats.rx_ind_histogram.pkts_21_40);
  6713. DP_PRINT_STATS("41-60 Packets: %u",
  6714. pdev->stats.rx_ind_histogram.pkts_41_60);
  6715. DP_PRINT_STATS("61-80 Packets: %u",
  6716. pdev->stats.rx_ind_histogram.pkts_61_80);
  6717. DP_PRINT_STATS("81-100 Packets: %u",
  6718. pdev->stats.rx_ind_histogram.pkts_81_100);
  6719. DP_PRINT_STATS("101-200 Packets: %u",
  6720. pdev->stats.rx_ind_histogram.pkts_101_200);
  6721. DP_PRINT_STATS(" 201+ Packets: %u",
  6722. pdev->stats.rx_ind_histogram.pkts_201_plus);
  6723. DP_PRINT_STATS("%s: tso_enable: %u lro_enable: %u rx_hash: %u napi_enable: %u",
  6724. __func__,
  6725. pdev->soc->wlan_cfg_ctx
  6726. ->tso_enabled,
  6727. pdev->soc->wlan_cfg_ctx
  6728. ->lro_enabled,
  6729. pdev->soc->wlan_cfg_ctx
  6730. ->rx_hash,
  6731. pdev->soc->wlan_cfg_ctx
  6732. ->napi_enabled);
  6733. #ifdef QCA_LL_TX_FLOW_CONTROL_V2
  6734. DP_PRINT_STATS("%s: Tx flow stop queue: %u tx flow start queue offset: %u",
  6735. __func__,
  6736. pdev->soc->wlan_cfg_ctx
  6737. ->tx_flow_stop_queue_threshold,
  6738. pdev->soc->wlan_cfg_ctx
  6739. ->tx_flow_start_queue_offset);
  6740. #endif
  6741. }
  6742. }
  6743. #ifndef WLAN_SOFTUMAC_SUPPORT
  6744. /**
  6745. * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats
  6746. * Current scope is bar received count
  6747. *
  6748. * @soc : Datapath SOC handle
  6749. * @peer: Datapath peer handle
  6750. * @arg : argument to iterate function
  6751. *
  6752. * Return: void
  6753. */
  6754. static void
  6755. dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
  6756. struct dp_peer *peer,
  6757. void *arg)
  6758. {
  6759. uint32_t waitcnt;
  6760. struct dp_peer *tgt_peer = dp_get_tgt_peer_from_peer(peer);
  6761. struct dp_pdev *pdev = tgt_peer->vdev->pdev;
  6762. waitcnt = 0;
  6763. dp_peer_rxtid_stats(tgt_peer, dp_rx_bar_stats_cb, pdev);
  6764. while (!(qdf_atomic_read(&pdev->stats_cmd_complete)) &&
  6765. waitcnt < 10) {
  6766. schedule_timeout_interruptible(
  6767. STATS_PROC_TIMEOUT);
  6768. waitcnt++;
  6769. }
  6770. qdf_atomic_set(&pdev->stats_cmd_complete, 0);
  6771. }
  6772. #else
  6773. /**
  6774. * dp_peer_ctrl_frames_stats_get() - function to agreegate peer stats
  6775. * Current scope is bar received count
  6776. *
  6777. * @soc : Datapath SOC handle
  6778. * @peer: Datapath peer handle
  6779. * @arg : argument to iterate function
  6780. *
  6781. * Return: void
  6782. */
  6783. static void
  6784. dp_peer_ctrl_frames_stats_get(struct dp_soc *soc,
  6785. struct dp_peer *peer,
  6786. void *arg)
  6787. {
  6788. }
  6789. #endif /* WLAN_SOFTUMAC_SUPPORT */
  6790. void
  6791. dp_print_pdev_tx_stats(struct dp_pdev *pdev)
  6792. {
  6793. uint8_t i = 0, index = 0;
  6794. DP_PRINT_STATS("PDEV Tx Stats:\n");
  6795. DP_PRINT_STATS("Received From Stack:");
  6796. DP_PRINT_STATS(" Packets = %u",
  6797. pdev->stats.tx_i.rcvd.num);
  6798. DP_PRINT_STATS(" Bytes = %llu",
  6799. pdev->stats.tx_i.rcvd.bytes);
  6800. DP_PRINT_STATS("Received from Stack in FP:");
  6801. DP_PRINT_STATS(" Packets = %llu",
  6802. pdev->stats.tx_i.rcvd_in_fast_xmit_flow);
  6803. DP_PRINT_STATS("Received from Stack per core:");
  6804. DP_PRINT_STATS(" Packets = %u %u %u %u",
  6805. pdev->stats.tx_i.rcvd_per_core[0],
  6806. pdev->stats.tx_i.rcvd_per_core[1],
  6807. pdev->stats.tx_i.rcvd_per_core[2],
  6808. pdev->stats.tx_i.rcvd_per_core[3]);
  6809. DP_PRINT_STATS("Processed:");
  6810. DP_PRINT_STATS(" Packets = %u",
  6811. pdev->stats.tx_i.processed.num);
  6812. DP_PRINT_STATS(" Bytes = %llu",
  6813. pdev->stats.tx_i.processed.bytes);
  6814. DP_PRINT_STATS("Total Completions:");
  6815. DP_PRINT_STATS(" Packets = %u",
  6816. pdev->stats.tx.comp_pkt.num);
  6817. DP_PRINT_STATS(" Bytes = %llu",
  6818. pdev->stats.tx.comp_pkt.bytes);
  6819. DP_PRINT_STATS("Successful Completions:");
  6820. DP_PRINT_STATS(" Packets = %u",
  6821. pdev->stats.tx.tx_success.num);
  6822. DP_PRINT_STATS(" Bytes = %llu",
  6823. pdev->stats.tx.tx_success.bytes);
  6824. DP_PRINT_STATS("Dropped:");
  6825. DP_PRINT_STATS(" Total = %u",
  6826. pdev->stats.tx_i.dropped.dropped_pkt.num);
  6827. DP_PRINT_STATS(" Dma_map_error = %u",
  6828. pdev->stats.tx_i.dropped.dma_error);
  6829. DP_PRINT_STATS(" Ring Full = %u",
  6830. pdev->stats.tx_i.dropped.ring_full);
  6831. DP_PRINT_STATS(" Descriptor Not available = %u",
  6832. pdev->stats.tx_i.dropped.desc_na.num);
  6833. DP_PRINT_STATS(" HW enqueue failed= %u",
  6834. pdev->stats.tx_i.dropped.enqueue_fail);
  6835. DP_PRINT_STATS(" Descriptor alloc fail = %u",
  6836. pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num);
  6837. DP_PRINT_STATS(" Tx outstanding too many = %u",
  6838. pdev->stats.tx_i.dropped.desc_na_exc_outstand.num);
  6839. DP_PRINT_STATS(" Pkt dropped in vdev-id check= %u",
  6840. pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check);
  6841. DP_PRINT_STATS(" Resources Full = %u",
  6842. pdev->stats.tx_i.dropped.res_full);
  6843. DP_PRINT_STATS(" Drop Ingress = %u",
  6844. pdev->stats.tx_i.dropped.drop_ingress);
  6845. DP_PRINT_STATS(" invalid peer id in exception path = %u",
  6846. pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path);
  6847. DP_PRINT_STATS(" Tx Mcast Drop = %u",
  6848. pdev->stats.tx_i.dropped.tx_mcast_drop);
  6849. DP_PRINT_STATS(" PPE-DS FW2WBM Tx Drop = %u",
  6850. pdev->stats.tx_i.dropped.fw2wbm_tx_drop);
  6851. DP_PRINT_STATS("Tx failed = %u",
  6852. pdev->stats.tx.tx_failed);
  6853. DP_PRINT_STATS(" FW removed Pkts = %u",
  6854. pdev->stats.tx.dropped.fw_rem.num);
  6855. DP_PRINT_STATS(" FW removed bytes= %llu",
  6856. pdev->stats.tx.dropped.fw_rem.bytes);
  6857. DP_PRINT_STATS(" FW removed transmitted = %u",
  6858. pdev->stats.tx.dropped.fw_rem_tx);
  6859. DP_PRINT_STATS(" FW removed untransmitted = %u",
  6860. pdev->stats.tx.dropped.fw_rem_notx);
  6861. DP_PRINT_STATS(" FW removed untransmitted fw_reason1 = %u",
  6862. pdev->stats.tx.dropped.fw_reason1);
  6863. DP_PRINT_STATS(" FW removed untransmitted fw_reason2 = %u",
  6864. pdev->stats.tx.dropped.fw_reason2);
  6865. DP_PRINT_STATS(" FW removed untransmitted fw_reason3 = %u",
  6866. pdev->stats.tx.dropped.fw_reason3);
  6867. DP_PRINT_STATS(" FW removed untransmitted disable queue = %u",
  6868. pdev->stats.tx.dropped.fw_rem_queue_disable);
  6869. DP_PRINT_STATS(" FW removed untransmitted no match = %u",
  6870. pdev->stats.tx.dropped.fw_rem_no_match);
  6871. DP_PRINT_STATS(" Dropped due to HW threshold criteria = %u",
  6872. pdev->stats.tx.dropped.drop_threshold);
  6873. DP_PRINT_STATS(" Link desc not available drop = %u",
  6874. pdev->stats.tx.dropped.drop_link_desc_na);
  6875. DP_PRINT_STATS(" Drop bit set or invalid flow = %u",
  6876. pdev->stats.tx.dropped.invalid_drop);
  6877. DP_PRINT_STATS(" MCAST vdev drop in HW = %u",
  6878. pdev->stats.tx.dropped.mcast_vdev_drop);
  6879. DP_PRINT_STATS(" Dropped with invalid reason = %u",
  6880. pdev->stats.tx.dropped.invalid_rr);
  6881. DP_PRINT_STATS(" Aged Out from msdu/mpdu queues = %u",
  6882. pdev->stats.tx.dropped.age_out);
  6883. DP_PRINT_STATS(" headroom insufficient = %u",
  6884. pdev->stats.tx_i.dropped.headroom_insufficient);
  6885. DP_PRINT_STATS("Multicast:");
  6886. DP_PRINT_STATS(" Packets: %u",
  6887. pdev->stats.tx.mcast.num);
  6888. DP_PRINT_STATS(" Bytes: %llu",
  6889. pdev->stats.tx.mcast.bytes);
  6890. DP_PRINT_STATS("Scatter Gather:");
  6891. DP_PRINT_STATS(" Packets = %d",
  6892. pdev->stats.tx_i.sg.sg_pkt.num);
  6893. DP_PRINT_STATS(" Bytes = %llu",
  6894. pdev->stats.tx_i.sg.sg_pkt.bytes);
  6895. DP_PRINT_STATS(" Dropped By Host = %u",
  6896. pdev->stats.tx_i.sg.dropped_host.num);
  6897. DP_PRINT_STATS(" Dropped By Target = %u",
  6898. pdev->stats.tx_i.sg.dropped_target);
  6899. DP_PRINT_STATS("Mcast Enhancement:");
  6900. DP_PRINT_STATS(" Packets = %u",
  6901. pdev->stats.tx_i.mcast_en.mcast_pkt.num);
  6902. DP_PRINT_STATS(" Bytes = %llu",
  6903. pdev->stats.tx_i.mcast_en.mcast_pkt.bytes);
  6904. DP_PRINT_STATS(" Dropped: Map Errors = %u",
  6905. pdev->stats.tx_i.mcast_en.dropped_map_error);
  6906. DP_PRINT_STATS(" Dropped: Self Mac = %u",
  6907. pdev->stats.tx_i.mcast_en.dropped_self_mac);
  6908. DP_PRINT_STATS(" Dropped: Send Fail = %u",
  6909. pdev->stats.tx_i.mcast_en.dropped_send_fail);
  6910. DP_PRINT_STATS(" Unicast sent = %u",
  6911. pdev->stats.tx_i.mcast_en.ucast);
  6912. DP_PRINT_STATS("EAPOL Packets dropped:");
  6913. DP_PRINT_STATS(" Dropped: TX desc errors = %u",
  6914. pdev->stats.eap_drop_stats.tx_desc_err);
  6915. DP_PRINT_STATS(" Dropped: Tx HAL ring access errors = %u",
  6916. pdev->stats.eap_drop_stats.tx_hal_ring_access_err);
  6917. DP_PRINT_STATS(" Dropped: TX DMA map errors = %u",
  6918. pdev->stats.eap_drop_stats.tx_dma_map_err);
  6919. DP_PRINT_STATS(" Dropped: Tx HW enqueue errors = %u",
  6920. pdev->stats.eap_drop_stats.tx_hw_enqueue);
  6921. DP_PRINT_STATS(" Dropped: TX SW enqueue errors= %u",
  6922. pdev->stats.eap_drop_stats.tx_sw_enqueue);
  6923. DP_PRINT_STATS("IGMP Mcast Enhancement:");
  6924. DP_PRINT_STATS(" IGMP packets received = %u",
  6925. pdev->stats.tx_i.igmp_mcast_en.igmp_rcvd);
  6926. DP_PRINT_STATS(" Converted to uncast = %u",
  6927. pdev->stats.tx_i.igmp_mcast_en.igmp_ucast_converted);
  6928. DP_PRINT_STATS("Raw:");
  6929. DP_PRINT_STATS(" Packets = %u",
  6930. pdev->stats.tx_i.raw.raw_pkt.num);
  6931. DP_PRINT_STATS(" Bytes = %llu",
  6932. pdev->stats.tx_i.raw.raw_pkt.bytes);
  6933. DP_PRINT_STATS(" DMA map error = %u",
  6934. pdev->stats.tx_i.raw.dma_map_error);
  6935. DP_PRINT_STATS(" RAW pkt type[!data] error = %u",
  6936. pdev->stats.tx_i.raw.invalid_raw_pkt_datatype);
  6937. DP_PRINT_STATS(" Frags count overflow error = %u",
  6938. pdev->stats.tx_i.raw.num_frags_overflow_err);
  6939. DP_PRINT_STATS("Reinjected:");
  6940. DP_PRINT_STATS(" Packets = %u",
  6941. pdev->stats.tx_i.reinject_pkts.num);
  6942. DP_PRINT_STATS(" Bytes = %llu\n",
  6943. pdev->stats.tx_i.reinject_pkts.bytes);
  6944. DP_PRINT_STATS("Inspected:");
  6945. DP_PRINT_STATS(" Packets = %d",
  6946. pdev->stats.tx_i.inspect_pkts.num);
  6947. DP_PRINT_STATS(" Bytes = %llu",
  6948. pdev->stats.tx_i.inspect_pkts.bytes);
  6949. DP_PRINT_STATS("Nawds Multicast:");
  6950. DP_PRINT_STATS(" Packets = %u",
  6951. pdev->stats.tx_i.nawds_mcast.num);
  6952. DP_PRINT_STATS(" Bytes = %llu",
  6953. pdev->stats.tx_i.nawds_mcast.bytes);
  6954. DP_PRINT_STATS("CCE Classified:");
  6955. DP_PRINT_STATS(" CCE Classified Packets: %u",
  6956. pdev->stats.tx_i.cce_classified);
  6957. DP_PRINT_STATS(" RAW CCE Classified Packets: %u",
  6958. pdev->stats.tx_i.cce_classified_raw);
  6959. DP_PRINT_STATS("Mesh stats:");
  6960. DP_PRINT_STATS(" frames to firmware: %u",
  6961. pdev->stats.tx_i.mesh.exception_fw);
  6962. DP_PRINT_STATS(" completions from fw: %u",
  6963. pdev->stats.tx_i.mesh.completion_fw);
  6964. DP_PRINT_STATS("PPDU stats counter");
  6965. for (index = 0; index < CDP_PPDU_STATS_MAX_TAG; index++) {
  6966. DP_PRINT_STATS(" Tag[%d] = %llu", index,
  6967. pdev->stats.ppdu_stats_counter[index]);
  6968. }
  6969. DP_PRINT_STATS("BA not received for delayed_ba: %u",
  6970. pdev->stats.cdp_delayed_ba_not_recev);
  6971. dp_monitor_print_tx_stats(pdev);
  6972. DP_PRINT_STATS("tx_ppdu_proc: %llu",
  6973. pdev->stats.tx_ppdu_proc);
  6974. DP_PRINT_STATS("ack ba comes twice: %llu",
  6975. pdev->stats.ack_ba_comes_twice);
  6976. DP_PRINT_STATS("ppdu dropped because of incomplete tlv: %llu",
  6977. pdev->stats.ppdu_drop);
  6978. DP_PRINT_STATS("ppdu dropped because of wrap around: %llu",
  6979. pdev->stats.ppdu_wrap_drop);
  6980. for (i = 0; i < CDP_WDI_NUM_EVENTS; i++) {
  6981. if (!pdev->stats.wdi_event[i])
  6982. DP_PRINT_STATS("Wdi msgs received from fw[%d]:%d",
  6983. i, pdev->stats.wdi_event[i]);
  6984. }
  6985. dp_monitor_print_pdev_tx_capture_stats(pdev);
  6986. }
  6987. #ifdef WLAN_SUPPORT_RX_FLOW_TAG
  6988. static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
  6989. {
  6990. DP_PRINT_STATS("\tNo of IPv4 Flow entries inserted = %d",
  6991. qdf_atomic_read(&pdev->soc->ipv4_fse_cnt));
  6992. DP_PRINT_STATS("\tNo of IPv6 Flow entries inserted = %d",
  6993. qdf_atomic_read(&pdev->soc->ipv6_fse_cnt));
  6994. }
  6995. #else
  6996. static inline void dp_rx_basic_fst_stats(struct dp_pdev *pdev)
  6997. {
  6998. }
  6999. #endif
  7000. void
  7001. dp_print_pdev_rx_stats(struct dp_pdev *pdev)
  7002. {
  7003. uint8_t i;
  7004. DP_PRINT_STATS("PDEV Rx Stats:\n");
  7005. DP_PRINT_STATS("Received From HW (Per Rx Ring):");
  7006. DP_PRINT_STATS(" Packets = %u %u %u %u",
  7007. pdev->stats.rx.rcvd_reo[0].num,
  7008. pdev->stats.rx.rcvd_reo[1].num,
  7009. pdev->stats.rx.rcvd_reo[2].num,
  7010. pdev->stats.rx.rcvd_reo[3].num);
  7011. DP_PRINT_STATS(" Bytes = %llu %llu %llu %llu",
  7012. pdev->stats.rx.rcvd_reo[0].bytes,
  7013. pdev->stats.rx.rcvd_reo[1].bytes,
  7014. pdev->stats.rx.rcvd_reo[2].bytes,
  7015. pdev->stats.rx.rcvd_reo[3].bytes);
  7016. for (i = 0; i < CDP_MAX_LMACS; i++)
  7017. DP_PRINT_STATS("Packets Received on lmac[%d] = %d (%llu)",
  7018. i, pdev->stats.rx.rx_lmac[i].num,
  7019. pdev->stats.rx.rx_lmac[i].bytes);
  7020. DP_PRINT_STATS("Replenished:");
  7021. DP_PRINT_STATS(" Packets = %u",
  7022. pdev->stats.replenish.pkts.num);
  7023. DP_PRINT_STATS(" Buffers Added To Freelist = %u",
  7024. pdev->stats.buf_freelist);
  7025. DP_PRINT_STATS(" Low threshold intr = %d",
  7026. pdev->stats.replenish.low_thresh_intrs);
  7027. DP_PRINT_STATS("Dropped:");
  7028. DP_PRINT_STATS(" msdu_not_done = %u",
  7029. pdev->stats.dropped.msdu_not_done);
  7030. DP_PRINT_STATS(" wifi parse = %u",
  7031. pdev->stats.dropped.wifi_parse);
  7032. DP_PRINT_STATS(" mon_rx_drop = %u",
  7033. pdev->stats.dropped.mon_rx_drop);
  7034. DP_PRINT_STATS(" mon_radiotap_update_err = %u",
  7035. pdev->stats.dropped.mon_radiotap_update_err);
  7036. DP_PRINT_STATS(" mec_drop = %u",
  7037. pdev->stats.rx.mec_drop.num);
  7038. DP_PRINT_STATS(" Bytes = %llu",
  7039. pdev->stats.rx.mec_drop.bytes);
  7040. DP_PRINT_STATS(" peer_unauth_drop = %u",
  7041. pdev->stats.rx.peer_unauth_rx_pkt_drop);
  7042. DP_PRINT_STATS(" policy_check_drop = %u",
  7043. pdev->stats.rx.policy_check_drop);
  7044. DP_PRINT_STATS("Sent To Stack:");
  7045. DP_PRINT_STATS(" Packets = %u",
  7046. pdev->stats.rx.to_stack.num);
  7047. DP_PRINT_STATS(" Bytes = %llu",
  7048. pdev->stats.rx.to_stack.bytes);
  7049. DP_PRINT_STATS(" vlan_tag_stp_cnt = %u",
  7050. pdev->stats.vlan_tag_stp_cnt);
  7051. DP_PRINT_STATS("Multicast/Broadcast:");
  7052. DP_PRINT_STATS(" Packets = %u",
  7053. pdev->stats.rx.multicast.num);
  7054. DP_PRINT_STATS(" Bytes = %llu",
  7055. pdev->stats.rx.multicast.bytes);
  7056. DP_PRINT_STATS("Errors:");
  7057. DP_PRINT_STATS(" Rxdma Ring Un-inititalized = %u",
  7058. pdev->stats.replenish.rxdma_err);
  7059. DP_PRINT_STATS(" Desc Alloc Failed: = %u",
  7060. pdev->stats.err.desc_alloc_fail);
  7061. DP_PRINT_STATS(" Low threshold Desc Alloc Failed: = %u",
  7062. pdev->stats.err.desc_lt_alloc_fail);
  7063. DP_PRINT_STATS(" IP checksum error = %u",
  7064. pdev->stats.err.ip_csum_err);
  7065. DP_PRINT_STATS(" TCP/UDP checksum error = %u",
  7066. pdev->stats.err.tcp_udp_csum_err);
  7067. DP_PRINT_STATS(" Failed frag alloc = %u",
  7068. pdev->stats.replenish.frag_alloc_fail);
  7069. dp_pdev_iterate_peer_lock_safe(pdev, dp_peer_ctrl_frames_stats_get,
  7070. NULL, DP_MOD_ID_GENERIC_STATS);
  7071. /* Get bar_recv_cnt */
  7072. DP_PRINT_STATS("BAR Received Count: = %u",
  7073. pdev->stats.rx.bar_recv_cnt);
  7074. DP_PRINT_STATS("RX Buffer Pool Stats:\n");
  7075. DP_PRINT_STATS("\tBuffers consumed during refill = %llu",
  7076. pdev->stats.rx_buffer_pool.num_bufs_consumed);
  7077. DP_PRINT_STATS("\tSuccessful allocations during refill = %llu",
  7078. pdev->stats.rx_buffer_pool.num_bufs_alloc_success);
  7079. DP_PRINT_STATS("\tAllocations from the pool during replenish = %llu",
  7080. pdev->stats.rx_buffer_pool.num_pool_bufs_replenish);
  7081. dp_rx_basic_fst_stats(pdev);
  7082. }
  7083. #ifdef WLAN_SUPPORT_PPEDS
  7084. void dp_print_tx_ppeds_stats(struct dp_soc *soc)
  7085. {
  7086. if (soc->arch_ops.dp_tx_ppeds_inuse_desc)
  7087. soc->arch_ops.dp_tx_ppeds_inuse_desc(soc);
  7088. DP_PRINT_STATS("PPE-DS Tx desc fw2wbm_tx_drop %u",
  7089. soc->stats.tx.fw2wbm_tx_drop);
  7090. }
  7091. #else
  7092. void dp_print_tx_ppeds_stats(struct dp_soc *soc)
  7093. {
  7094. }
  7095. #endif
  7096. #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
  7097. void dp_print_global_desc_count(void)
  7098. {
  7099. struct dp_global_context *dp_global;
  7100. dp_global = wlan_objmgr_get_global_ctx();
  7101. DP_PRINT_STATS("Global Tx Descriptors in use = %u",
  7102. dp_tx_get_global_desc_in_use(dp_global));
  7103. }
  7104. #endif
  7105. void
  7106. dp_print_soc_tx_stats(struct dp_soc *soc)
  7107. {
  7108. uint8_t desc_pool_id;
  7109. soc->stats.tx.desc_in_use = 0;
  7110. DP_PRINT_STATS("SOC Tx Stats:\n");
  7111. for (desc_pool_id = 0;
  7112. desc_pool_id < wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
  7113. desc_pool_id++)
  7114. soc->stats.tx.desc_in_use +=
  7115. soc->tx_desc[desc_pool_id].num_allocated;
  7116. DP_PRINT_STATS("Tx Descriptors In Use = %u",
  7117. soc->stats.tx.desc_in_use);
  7118. DP_PRINT_STATS("Tx Invalid peer:");
  7119. DP_PRINT_STATS(" Packets = %u",
  7120. soc->stats.tx.tx_invalid_peer.num);
  7121. DP_PRINT_STATS(" Bytes = %llu",
  7122. soc->stats.tx.tx_invalid_peer.bytes);
  7123. DP_PRINT_STATS("Packets dropped due to TCL ring full = %u %u %u %u",
  7124. soc->stats.tx.tcl_ring_full[0],
  7125. soc->stats.tx.tcl_ring_full[1],
  7126. soc->stats.tx.tcl_ring_full[2],
  7127. soc->stats.tx.tcl_ring_full[3]);
  7128. DP_PRINT_STATS("Tx invalid completion release = %u",
  7129. soc->stats.tx.invalid_release_source);
  7130. DP_PRINT_STATS("TX invalid Desc from completion ring = %u",
  7131. soc->stats.tx.invalid_tx_comp_desc);
  7132. DP_PRINT_STATS("Tx comp wbm internal error = %d : [%d %d %d %d]",
  7133. soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_ALL],
  7134. soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_BUFFER],
  7135. soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_LINK_DESC],
  7136. soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_NULL_MSDU_BUFF],
  7137. soc->stats.tx.wbm_internal_error[WBM_INT_ERROR_REO_BUFF_REAPED]);
  7138. DP_PRINT_STATS("Tx comp non wbm internal error = %d",
  7139. soc->stats.tx.non_wbm_internal_err);
  7140. DP_PRINT_STATS("Tx comp loop pkt limit hit = %d",
  7141. soc->stats.tx.tx_comp_loop_pkt_limit_hit);
  7142. DP_PRINT_STATS("Tx comp HP out of sync2 = %d",
  7143. soc->stats.tx.hp_oos2);
  7144. dp_print_tx_ppeds_stats(soc);
  7145. }
  7146. static
  7147. int dp_fill_rx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
  7148. char *buf, int buf_len)
  7149. { int i;
  7150. int pos = 0;
  7151. if (buf_len <= 0 || !buf) {
  7152. dp_err("incorrect buf or buf_len(%d)!", buf_len);
  7153. return pos;
  7154. }
  7155. for (i = 0; i < MAX_REO_DEST_RINGS; i++) {
  7156. if (intr_ctx->intr_stats.num_rx_ring_masks[i])
  7157. pos += qdf_scnprintf(buf + pos,
  7158. buf_len - pos,
  7159. "reo[%u]:%u ", i,
  7160. intr_ctx->intr_stats.num_rx_ring_masks[i]);
  7161. }
  7162. return pos;
  7163. }
  7164. static
  7165. int dp_fill_tx_interrupt_ctx_stats(struct dp_intr *intr_ctx,
  7166. char *buf, int buf_len)
  7167. { int i;
  7168. int pos = 0;
  7169. if (buf_len <= 0 || !buf) {
  7170. dp_err("incorrect buf or buf_len(%d)!", buf_len);
  7171. return pos;
  7172. }
  7173. for (i = 0; i < MAX_TCL_DATA_RINGS; i++) {
  7174. if (intr_ctx->intr_stats.num_tx_ring_masks[i])
  7175. pos += qdf_scnprintf(buf + pos,
  7176. buf_len - pos,
  7177. "tx_comps[%u]:%u ", i,
  7178. intr_ctx->intr_stats.num_tx_ring_masks[i]);
  7179. }
  7180. return pos;
  7181. }
  7182. #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
  7183. #define DP_SRNG_HIGH_WM_STATS_STRING_LEN 512
  7184. void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask)
  7185. {
  7186. char *buf;
  7187. int ring, pos, buf_len;
  7188. char srng_high_wm_str[DP_SRNG_HIGH_WM_STATS_STRING_LEN] = {'\0'};
  7189. if (!srng_mask)
  7190. return;
  7191. buf = srng_high_wm_str;
  7192. buf_len = DP_SRNG_HIGH_WM_STATS_STRING_LEN;
  7193. dp_info("%8s %7s %12s %10s %10s %10s %10s %10s %10s",
  7194. "ring_id", "high_wm", "time", "<50", "50-60", "60-70",
  7195. "70-80", "80-90", "90-100");
  7196. if (srng_mask & (1 << REO_DST)) {
  7197. for (ring = 0; ring < soc->num_reo_dest_rings; ring++) {
  7198. pos = 0;
  7199. pos += hal_dump_srng_high_wm_stats(soc->hal_soc,
  7200. soc->reo_dest_ring[ring].hal_srng,
  7201. buf, buf_len, pos);
  7202. dp_info("%s", srng_high_wm_str);
  7203. }
  7204. }
  7205. }
  7206. #endif
  7207. #define DP_INT_CTX_STATS_STRING_LEN 512
  7208. void dp_print_soc_interrupt_stats(struct dp_soc *soc)
  7209. {
  7210. char *buf;
  7211. char int_ctx_str[DP_INT_CTX_STATS_STRING_LEN] = {'\0'};
  7212. int i, pos, buf_len;
  7213. struct dp_intr_stats *intr_stats;
  7214. buf = int_ctx_str;
  7215. buf_len = DP_INT_CTX_STATS_STRING_LEN;
  7216. for (i = 0; i < WLAN_CFG_INT_NUM_CONTEXTS; i++) {
  7217. pos = 0;
  7218. qdf_mem_zero(int_ctx_str, sizeof(int_ctx_str));
  7219. intr_stats = &soc->intr_ctx[i].intr_stats;
  7220. if (!intr_stats->num_masks && !intr_stats->num_near_full_masks)
  7221. continue;
  7222. pos += qdf_scnprintf(buf + pos,
  7223. buf_len - pos,
  7224. "%2u[%3d] - Total:%u ",
  7225. i,
  7226. hif_get_int_ctx_irq_num(soc->hif_handle,
  7227. i),
  7228. intr_stats->num_masks);
  7229. if (soc->intr_ctx[i].tx_ring_mask)
  7230. pos += dp_fill_tx_interrupt_ctx_stats(&soc->intr_ctx[i],
  7231. buf + pos,
  7232. buf_len - pos);
  7233. if (soc->intr_ctx[i].rx_ring_mask)
  7234. pos += dp_fill_rx_interrupt_ctx_stats(&soc->intr_ctx[i],
  7235. buf + pos,
  7236. buf_len - pos);
  7237. if (soc->intr_ctx[i].rx_err_ring_mask)
  7238. pos += qdf_scnprintf(buf + pos,
  7239. buf_len - pos,
  7240. "reo_err:%u ",
  7241. intr_stats->num_rx_err_ring_masks);
  7242. if (soc->intr_ctx[i].rx_wbm_rel_ring_mask)
  7243. pos += qdf_scnprintf(buf + pos,
  7244. buf_len - pos,
  7245. "wbm_rx_err:%u ",
  7246. intr_stats->num_rx_wbm_rel_ring_masks);
  7247. if (soc->intr_ctx[i].rxdma2host_ring_mask)
  7248. pos += qdf_scnprintf(buf + pos,
  7249. buf_len - pos,
  7250. "rxdma2_host_err:%u ",
  7251. intr_stats->num_rxdma2host_ring_masks);
  7252. if (soc->intr_ctx[i].rx_near_full_grp_1_mask)
  7253. pos += qdf_scnprintf(buf + pos,
  7254. buf_len - pos,
  7255. "rx_near_full_grp_1:%u ",
  7256. intr_stats->num_near_full_masks);
  7257. if (soc->intr_ctx[i].rx_near_full_grp_2_mask)
  7258. pos += qdf_scnprintf(buf + pos,
  7259. buf_len - pos,
  7260. "rx_near_full_grp_2:%u ",
  7261. intr_stats->num_near_full_masks);
  7262. if (soc->intr_ctx[i].tx_ring_near_full_mask)
  7263. pos += qdf_scnprintf(buf + pos,
  7264. buf_len - pos,
  7265. "tx_near_full:%u ",
  7266. intr_stats->num_near_full_masks);
  7267. dp_info("%s", int_ctx_str);
  7268. }
  7269. }
  7270. void
  7271. dp_print_soc_rx_stats(struct dp_soc *soc)
  7272. {
  7273. uint32_t i;
  7274. char reo_error[DP_REO_ERR_LENGTH];
  7275. char rxdma_error[DP_RXDMA_ERR_LENGTH];
  7276. uint8_t index = 0;
  7277. DP_PRINT_STATS("No of AST Entries = %d", soc->num_ast_entries);
  7278. DP_PRINT_STATS("SOC Rx Stats:\n");
  7279. DP_PRINT_STATS("Fast recycled packets: %llu",
  7280. soc->stats.rx.fast_recycled);
  7281. DP_PRINT_STATS("Fragmented packets: %u",
  7282. soc->stats.rx.rx_frags);
  7283. DP_PRINT_STATS("Reo reinjected packets: %u",
  7284. soc->stats.rx.reo_reinject);
  7285. DP_PRINT_STATS("Errors:\n");
  7286. DP_PRINT_STATS("Rx Decrypt Errors = %d",
  7287. (soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_DECRYPT] +
  7288. soc->stats.rx.err.rxdma_error[HAL_RXDMA_ERR_TKIP_MIC]));
  7289. DP_PRINT_STATS("Invalid RBM = %d",
  7290. soc->stats.rx.err.invalid_rbm);
  7291. DP_PRINT_STATS("Invalid Vdev = %d",
  7292. soc->stats.rx.err.invalid_vdev);
  7293. DP_PRINT_STATS("Invalid sa_idx or da_idx = %d",
  7294. soc->stats.rx.err.invalid_sa_da_idx);
  7295. DP_PRINT_STATS("Defrag peer uninit = %d",
  7296. soc->stats.rx.err.defrag_peer_uninit);
  7297. DP_PRINT_STATS("Pkts delivered no peer = %d",
  7298. soc->stats.rx.err.pkt_delivered_no_peer);
  7299. DP_PRINT_STATS("Invalid Pdev = %d",
  7300. soc->stats.rx.err.invalid_pdev);
  7301. DP_PRINT_STATS("Invalid Peer = %d",
  7302. soc->stats.rx.err.rx_invalid_peer.num);
  7303. DP_PRINT_STATS("HAL Ring Access Fail = %d",
  7304. soc->stats.rx.err.hal_ring_access_fail);
  7305. DP_PRINT_STATS("HAL Ring Access Full Fail = %d",
  7306. soc->stats.rx.err.hal_ring_access_full_fail);
  7307. DP_PRINT_STATS("MSDU Done failures = %d",
  7308. soc->stats.rx.err.msdu_done_fail);
  7309. DP_PRINT_STATS("RX frags: %d", soc->stats.rx.rx_frags);
  7310. DP_PRINT_STATS("RX frag wait: %d", soc->stats.rx.rx_frag_wait);
  7311. DP_PRINT_STATS("RX frag err: %d", soc->stats.rx.rx_frag_err);
  7312. DP_PRINT_STATS("RX frag OOR: %d", soc->stats.rx.rx_frag_oor);
  7313. DP_PRINT_STATS("RX HP out_of_sync: %d", soc->stats.rx.hp_oos2);
  7314. DP_PRINT_STATS("RX Ring Near Full: %d", soc->stats.rx.near_full);
  7315. DP_PRINT_STATS("RX Reap Loop Pkt Limit Hit: %d",
  7316. soc->stats.rx.reap_loop_pkt_limit_hit);
  7317. DP_PRINT_STATS("RX DESC invalid magic: %u",
  7318. soc->stats.rx.err.rx_desc_invalid_magic);
  7319. DP_PRINT_STATS("RX DUP DESC: %d",
  7320. soc->stats.rx.err.hal_reo_dest_dup);
  7321. DP_PRINT_STATS("RX REL DUP DESC: %d",
  7322. soc->stats.rx.err.hal_wbm_rel_dup);
  7323. DP_PRINT_STATS("RXDMA ERR DUP DESC: %d",
  7324. soc->stats.rx.err.hal_rxdma_err_dup);
  7325. DP_PRINT_STATS("RX scatter msdu: %d",
  7326. soc->stats.rx.err.scatter_msdu);
  7327. DP_PRINT_STATS("RX invalid cookie: %d",
  7328. soc->stats.rx.err.invalid_cookie);
  7329. DP_PRINT_STATS("RX stale cookie: %d",
  7330. soc->stats.rx.err.stale_cookie);
  7331. DP_PRINT_STATS("RX wait completed msdu break: %d",
  7332. soc->stats.rx.msdu_scatter_wait_break);
  7333. DP_PRINT_STATS("2k jump delba sent: %d",
  7334. soc->stats.rx.err.rx_2k_jump_delba_sent);
  7335. DP_PRINT_STATS("2k jump msdu to stack: %d",
  7336. soc->stats.rx.err.rx_2k_jump_to_stack);
  7337. DP_PRINT_STATS("2k jump msdu drop: %d",
  7338. soc->stats.rx.err.rx_2k_jump_drop);
  7339. DP_PRINT_STATS("REO err oor msdu to stack %d",
  7340. soc->stats.rx.err.reo_err_oor_to_stack);
  7341. DP_PRINT_STATS("REO err oor msdu drop: %d",
  7342. soc->stats.rx.err.reo_err_oor_drop);
  7343. DP_PRINT_STATS("Rx err msdu rejected: %d",
  7344. soc->stats.rx.err.rejected);
  7345. DP_PRINT_STATS("Rx stale link desc cookie: %d",
  7346. soc->stats.rx.err.invalid_link_cookie);
  7347. DP_PRINT_STATS("Rx nbuf sanity fail: %d",
  7348. soc->stats.rx.err.nbuf_sanity_fail);
  7349. DP_PRINT_STATS("Rx err msdu continuation err: %d",
  7350. soc->stats.rx.err.msdu_continuation_err);
  7351. DP_PRINT_STATS("ssn update count: %d",
  7352. soc->stats.rx.err.ssn_update_count);
  7353. DP_PRINT_STATS("bar handle update fail count: %d",
  7354. soc->stats.rx.err.bar_handle_fail_count);
  7355. DP_PRINT_STATS("PN-in-Dest error frame pn-check fail: %d",
  7356. soc->stats.rx.err.pn_in_dest_check_fail);
  7357. for (i = 0; i < HAL_RXDMA_ERR_MAX; i++) {
  7358. index += qdf_snprint(&rxdma_error[index],
  7359. DP_RXDMA_ERR_LENGTH - index,
  7360. " %d", soc->stats.rx.err.rxdma_error[i]);
  7361. }
  7362. DP_PRINT_STATS("RXDMA Error (0-31):%s", rxdma_error);
  7363. index = 0;
  7364. for (i = 0; i < HAL_REO_ERR_MAX; i++) {
  7365. index += qdf_snprint(&reo_error[index],
  7366. DP_REO_ERR_LENGTH - index,
  7367. " %d", soc->stats.rx.err.reo_error[i]);
  7368. }
  7369. DP_PRINT_STATS("REO Error(0-14):%s", reo_error);
  7370. DP_PRINT_STATS("REO CMD SEND FAIL: %d",
  7371. soc->stats.rx.err.reo_cmd_send_fail);
  7372. DP_PRINT_STATS("Rx BAR frames:%d", soc->stats.rx.bar_frame);
  7373. DP_PRINT_STATS("Rxdma2rel route drop:%d",
  7374. soc->stats.rx.rxdma2rel_route_drop);
  7375. DP_PRINT_STATS("Reo2rel route drop:%d",
  7376. soc->stats.rx.reo2rel_route_drop);
  7377. DP_PRINT_STATS("Rx Flush count:%d", soc->stats.rx.err.rx_flush_count);
  7378. DP_PRINT_STATS("RX HW stats request count:%d",
  7379. soc->stats.rx.rx_hw_stats_requested);
  7380. DP_PRINT_STATS("RX HW stats request timeout:%d",
  7381. soc->stats.rx.rx_hw_stats_timeout);
  7382. DP_PRINT_STATS("Rx invalid TID count:%d",
  7383. soc->stats.rx.err.rx_invalid_tid_err);
  7384. DP_PRINT_STATS("Rx Defrag Address1 Invalid:%d",
  7385. soc->stats.rx.err.defrag_ad1_invalid);
  7386. DP_PRINT_STATS("Rx decrypt error frame for valid peer:%d",
  7387. soc->stats.rx.err.decrypt_err_drop);
  7388. }
  7389. #ifdef FEATURE_TSO_STATS
  7390. void dp_print_tso_stats(struct dp_soc *soc,
  7391. enum qdf_stats_verbosity_level level)
  7392. {
  7393. uint8_t loop_pdev;
  7394. uint32_t id;
  7395. struct dp_pdev *pdev;
  7396. for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
  7397. pdev = soc->pdev_list[loop_pdev];
  7398. DP_PRINT_STATS("TSO Statistics\n");
  7399. DP_PRINT_STATS(
  7400. "From stack: %d | Successful completions: %d | TSO Packets: %d | TSO Completions: %d",
  7401. pdev->stats.tx_i.rcvd.num,
  7402. pdev->stats.tx.tx_success.num,
  7403. pdev->stats.tso_stats.num_tso_pkts.num,
  7404. pdev->stats.tso_stats.tso_comp);
  7405. for (id = 0; id < CDP_MAX_TSO_PACKETS; id++) {
  7406. /* TSO LEVEL 1 - PACKET INFO */
  7407. DP_PRINT_STATS(
  7408. "Packet_Id:[%u]: Packet Length %zu | No. of segments: %u",
  7409. id,
  7410. pdev->stats.tso_stats.tso_info
  7411. .tso_packet_info[id].tso_packet_len,
  7412. pdev->stats.tso_stats.tso_info
  7413. .tso_packet_info[id].num_seg);
  7414. /* TSO LEVEL 2 */
  7415. if (level == QDF_STATS_VERBOSITY_LEVEL_HIGH)
  7416. dp_print_tso_seg_stats(pdev, id);
  7417. }
  7418. DP_PRINT_STATS(
  7419. "TSO Histogram: Single: %llu | 2-5 segs: %llu | 6-10: %llu segs | 11-15 segs: %llu | 16-20 segs: %llu | 20+ segs: %llu",
  7420. pdev->stats.tso_stats.seg_histogram.segs_1,
  7421. pdev->stats.tso_stats.seg_histogram.segs_2_5,
  7422. pdev->stats.tso_stats.seg_histogram.segs_6_10,
  7423. pdev->stats.tso_stats.seg_histogram.segs_11_15,
  7424. pdev->stats.tso_stats.seg_histogram.segs_16_20,
  7425. pdev->stats.tso_stats.seg_histogram.segs_20_plus);
  7426. }
  7427. }
  7428. void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
  7429. uint8_t _p_cntrs)
  7430. {
  7431. if (_p_cntrs == 1) {
  7432. DP_STATS_INC(pdev,
  7433. tso_stats.seg_histogram.segs_1, 1);
  7434. } else if (_p_cntrs >= 2 && _p_cntrs <= 5) {
  7435. DP_STATS_INC(pdev,
  7436. tso_stats.seg_histogram.segs_2_5, 1);
  7437. } else if (_p_cntrs > 5 && _p_cntrs <= 10) {
  7438. DP_STATS_INC(pdev,
  7439. tso_stats.seg_histogram.segs_6_10, 1);
  7440. } else if (_p_cntrs > 10 && _p_cntrs <= 15) {
  7441. DP_STATS_INC(pdev,
  7442. tso_stats.seg_histogram.segs_11_15, 1);
  7443. } else if (_p_cntrs > 15 && _p_cntrs <= 20) {
  7444. DP_STATS_INC(pdev,
  7445. tso_stats.seg_histogram.segs_16_20, 1);
  7446. } else if (_p_cntrs > 20) {
  7447. DP_STATS_INC(pdev,
  7448. tso_stats.seg_histogram.segs_20_plus, 1);
  7449. }
  7450. }
  7451. void dp_tso_segment_update(struct dp_pdev *pdev,
  7452. uint32_t stats_idx,
  7453. uint8_t idx,
  7454. struct qdf_tso_seg_t seg)
  7455. {
  7456. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7457. .tso_seg[idx].num_frags,
  7458. seg.num_frags);
  7459. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7460. .tso_seg[idx].total_len,
  7461. seg.total_len);
  7462. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7463. .tso_seg[idx].tso_flags.tso_enable,
  7464. seg.tso_flags.tso_enable);
  7465. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7466. .tso_seg[idx].tso_flags.fin,
  7467. seg.tso_flags.fin);
  7468. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7469. .tso_seg[idx].tso_flags.syn,
  7470. seg.tso_flags.syn);
  7471. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7472. .tso_seg[idx].tso_flags.rst,
  7473. seg.tso_flags.rst);
  7474. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7475. .tso_seg[idx].tso_flags.psh,
  7476. seg.tso_flags.psh);
  7477. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7478. .tso_seg[idx].tso_flags.ack,
  7479. seg.tso_flags.ack);
  7480. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7481. .tso_seg[idx].tso_flags.urg,
  7482. seg.tso_flags.urg);
  7483. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7484. .tso_seg[idx].tso_flags.ece,
  7485. seg.tso_flags.ece);
  7486. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7487. .tso_seg[idx].tso_flags.cwr,
  7488. seg.tso_flags.cwr);
  7489. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7490. .tso_seg[idx].tso_flags.ns,
  7491. seg.tso_flags.ns);
  7492. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7493. .tso_seg[idx].tso_flags.tcp_seq_num,
  7494. seg.tso_flags.tcp_seq_num);
  7495. DP_STATS_UPD(pdev, tso_stats.tso_info.tso_packet_info[stats_idx]
  7496. .tso_seg[idx].tso_flags.ip_id,
  7497. seg.tso_flags.ip_id);
  7498. }
  7499. void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
  7500. qdf_nbuf_t msdu, uint16_t num_segs)
  7501. {
  7502. DP_STATS_UPD(pdev,
  7503. tso_stats.tso_info.tso_packet_info[stats_idx]
  7504. .num_seg,
  7505. num_segs);
  7506. DP_STATS_UPD(pdev,
  7507. tso_stats.tso_info.tso_packet_info[stats_idx]
  7508. .tso_packet_len,
  7509. qdf_nbuf_get_tcp_payload_len(msdu));
  7510. }
  7511. void dp_tso_segment_stats_update(struct dp_pdev *pdev,
  7512. struct qdf_tso_seg_elem_t *stats_seg,
  7513. uint32_t stats_idx)
  7514. {
  7515. uint8_t tso_seg_idx = 0;
  7516. while (stats_seg && (tso_seg_idx < CDP_MAX_TSO_SEGMENTS)) {
  7517. dp_tso_segment_update(pdev, stats_idx,
  7518. tso_seg_idx,
  7519. stats_seg->seg);
  7520. ++tso_seg_idx;
  7521. stats_seg = stats_seg->next;
  7522. }
  7523. }
  7524. void dp_txrx_clear_tso_stats(struct dp_soc *soc)
  7525. {
  7526. uint8_t loop_pdev;
  7527. struct dp_pdev *pdev;
  7528. for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
  7529. pdev = soc->pdev_list[loop_pdev];
  7530. dp_init_tso_stats(pdev);
  7531. }
  7532. }
  7533. #endif /* FEATURE_TSO_STATS */
  7534. QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer,
  7535. enum cdp_peer_stats_type type,
  7536. cdp_peer_stats_param_t *buf)
  7537. {
  7538. QDF_STATUS ret = QDF_STATUS_SUCCESS;
  7539. struct dp_peer *tgt_peer;
  7540. struct dp_txrx_peer *txrx_peer;
  7541. struct dp_peer_per_pkt_stats *peer_stats;
  7542. uint8_t link_id = 0;
  7543. uint8_t idx = 0;
  7544. uint8_t stats_arr_size;
  7545. struct cdp_pkt_info pkt_info = {0};
  7546. struct dp_soc *soc = peer->vdev->pdev->soc;
  7547. struct dp_pdev *pdev = peer->vdev->pdev;
  7548. txrx_peer = dp_get_txrx_peer(peer);
  7549. if (!txrx_peer)
  7550. return QDF_STATUS_E_FAILURE;
  7551. stats_arr_size = txrx_peer->stats_arr_size;
  7552. if (IS_MLO_DP_LINK_PEER(peer))
  7553. link_id = dp_get_peer_hw_link_id(soc, pdev);
  7554. switch (type) {
  7555. case cdp_peer_tx_ucast:
  7556. if (link_id > 0) {
  7557. peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
  7558. buf->tx_ucast = peer_stats->tx.ucast;
  7559. } else {
  7560. for (idx = 0; idx < stats_arr_size; idx++) {
  7561. peer_stats =
  7562. &txrx_peer->stats[idx].per_pkt_stats;
  7563. pkt_info.num += peer_stats->tx.ucast.num;
  7564. pkt_info.bytes += peer_stats->tx.ucast.bytes;
  7565. }
  7566. buf->tx_ucast = pkt_info;
  7567. }
  7568. break;
  7569. case cdp_peer_tx_mcast:
  7570. if (link_id > 0) {
  7571. peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
  7572. buf->tx_mcast = peer_stats->tx.mcast;
  7573. } else {
  7574. for (idx = 0; idx < stats_arr_size; idx++) {
  7575. peer_stats =
  7576. &txrx_peer->stats[idx].per_pkt_stats;
  7577. pkt_info.num += peer_stats->tx.mcast.num;
  7578. pkt_info.bytes += peer_stats->tx.mcast.bytes;
  7579. }
  7580. buf->tx_mcast = pkt_info;
  7581. }
  7582. break;
  7583. case cdp_peer_tx_inactive_time:
  7584. tgt_peer = dp_get_tgt_peer_from_peer(peer);
  7585. if (tgt_peer)
  7586. buf->tx_inactive_time =
  7587. tgt_peer->stats.tx.inactive_time;
  7588. else
  7589. ret = QDF_STATUS_E_FAILURE;
  7590. break;
  7591. case cdp_peer_rx_ucast:
  7592. if (link_id > 0) {
  7593. peer_stats = &txrx_peer->stats[link_id].per_pkt_stats;
  7594. buf->rx_ucast = peer_stats->rx.unicast;
  7595. } else {
  7596. for (idx = 0; idx < stats_arr_size; idx++) {
  7597. peer_stats =
  7598. &txrx_peer->stats[idx].per_pkt_stats;
  7599. pkt_info.num += peer_stats->rx.unicast.num;
  7600. pkt_info.bytes += peer_stats->rx.unicast.bytes;
  7601. }
  7602. buf->rx_ucast = pkt_info;
  7603. }
  7604. break;
  7605. default:
  7606. ret = QDF_STATUS_E_FAILURE;
  7607. break;
  7608. }
  7609. return ret;
  7610. }
  7611. #ifdef QCA_ENHANCED_STATS_SUPPORT
  7612. #ifdef WLAN_FEATURE_11BE_MLO
  7613. QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
  7614. enum cdp_peer_stats_type type,
  7615. cdp_peer_stats_param_t *buf)
  7616. {
  7617. QDF_STATUS ret = QDF_STATUS_E_FAILURE;
  7618. struct dp_soc *soc = peer->vdev->pdev->soc;
  7619. if (IS_MLO_DP_MLD_PEER(peer)) {
  7620. struct dp_peer *link_peer;
  7621. struct dp_soc *link_peer_soc;
  7622. link_peer = dp_get_primary_link_peer_by_id(soc, peer->peer_id,
  7623. DP_MOD_ID_CDP);
  7624. if (link_peer) {
  7625. link_peer_soc = link_peer->vdev->pdev->soc;
  7626. ret = dp_monitor_peer_get_stats_param(link_peer_soc,
  7627. link_peer,
  7628. type, buf);
  7629. dp_peer_unref_delete(link_peer, DP_MOD_ID_CDP);
  7630. }
  7631. return ret;
  7632. } else {
  7633. return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
  7634. }
  7635. }
  7636. #else
  7637. QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
  7638. enum cdp_peer_stats_type type,
  7639. cdp_peer_stats_param_t *buf)
  7640. {
  7641. struct dp_soc *soc = peer->vdev->pdev->soc;
  7642. return dp_monitor_peer_get_stats_param(soc, peer, type, buf);
  7643. }
  7644. #endif
  7645. #else
  7646. QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
  7647. enum cdp_peer_stats_type type,
  7648. cdp_peer_stats_param_t *buf)
  7649. {
  7650. QDF_STATUS ret = QDF_STATUS_SUCCESS;
  7651. struct dp_txrx_peer *txrx_peer;
  7652. struct dp_peer_extd_stats *peer_stats;
  7653. txrx_peer = dp_get_txrx_peer(peer);
  7654. if (!txrx_peer)
  7655. return QDF_STATUS_E_FAILURE;
  7656. peer_stats = &txrx_peer->stats[0].extd_stats;
  7657. switch (type) {
  7658. case cdp_peer_tx_rate:
  7659. buf->tx_rate = peer_stats->tx.tx_rate;
  7660. break;
  7661. case cdp_peer_tx_last_tx_rate:
  7662. buf->last_tx_rate = peer_stats->tx.last_tx_rate;
  7663. break;
  7664. case cdp_peer_tx_ratecode:
  7665. buf->tx_ratecode = peer_stats->tx.tx_ratecode;
  7666. break;
  7667. case cdp_peer_rx_rate:
  7668. buf->rx_rate = peer_stats->rx.rx_rate;
  7669. break;
  7670. case cdp_peer_rx_last_rx_rate:
  7671. buf->last_rx_rate = peer_stats->rx.last_rx_rate;
  7672. break;
  7673. case cdp_peer_rx_ratecode:
  7674. buf->rx_ratecode = peer_stats->rx.rx_ratecode;
  7675. break;
  7676. case cdp_peer_rx_avg_snr:
  7677. buf->rx_avg_snr = peer_stats->rx.avg_snr;
  7678. break;
  7679. case cdp_peer_rx_snr:
  7680. buf->rx_snr = peer_stats->rx.snr;
  7681. break;
  7682. default:
  7683. ret = QDF_STATUS_E_FAILURE;
  7684. break;
  7685. }
  7686. return ret;
  7687. }
  7688. #endif
  7689. /**
  7690. * dp_is_wds_extended() - Check if wds ext is enabled
  7691. * @txrx_peer: DP txrx_peer handle
  7692. *
  7693. * Return: true if enabled, false if not
  7694. */
  7695. #ifdef QCA_SUPPORT_WDS_EXTENDED
  7696. static inline
  7697. bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
  7698. {
  7699. if (qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT,
  7700. &txrx_peer->wds_ext.init))
  7701. return true;
  7702. return false;
  7703. }
  7704. #else
  7705. static inline
  7706. bool dp_is_wds_extended(struct dp_txrx_peer *txrx_peer)
  7707. {
  7708. return false;
  7709. }
  7710. #endif /* QCA_SUPPORT_WDS_EXTENDED */
  7711. /**
  7712. * dp_peer_get_hw_txrx_stats_en() - Get value of hw_txrx_stats_en
  7713. * @txrx_peer: DP txrx_peer handle
  7714. *
  7715. * Return: true if enabled, false if not
  7716. */
  7717. #ifdef QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT
  7718. static inline
  7719. bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
  7720. {
  7721. return txrx_peer->hw_txrx_stats_en;
  7722. }
  7723. #else
  7724. static inline
  7725. bool dp_peer_get_hw_txrx_stats_en(struct dp_txrx_peer *txrx_peer)
  7726. {
  7727. return false;
  7728. }
  7729. #endif
  7730. #ifdef WLAN_FEATURE_11BE_MLO
  7731. static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
  7732. {
  7733. /* ML primary link peer return mld_peer */
  7734. if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link)
  7735. return peer->mld_peer;
  7736. return peer;
  7737. }
  7738. #else
  7739. static inline struct dp_peer *dp_get_stats_peer(struct dp_peer *peer)
  7740. {
  7741. return peer;
  7742. }
  7743. #endif
  7744. /**
  7745. * dp_update_vdev_basic_stats() - Update vdev basic stats
  7746. * @txrx_peer: DP txrx_peer handle
  7747. * @tgtobj: Pointer to buffer for vdev stats
  7748. *
  7749. * Return: None
  7750. */
  7751. static inline
  7752. void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer,
  7753. struct cdp_vdev_stats *tgtobj)
  7754. {
  7755. if (qdf_unlikely(!txrx_peer || !tgtobj))
  7756. return;
  7757. if (!dp_peer_get_hw_txrx_stats_en(txrx_peer)) {
  7758. tgtobj->tx.comp_pkt.num += txrx_peer->comp_pkt.num;
  7759. tgtobj->tx.comp_pkt.bytes += txrx_peer->comp_pkt.bytes;
  7760. tgtobj->tx.tx_failed += txrx_peer->tx_failed;
  7761. }
  7762. tgtobj->rx.to_stack.num += txrx_peer->to_stack.num;
  7763. tgtobj->rx.to_stack.bytes += txrx_peer->to_stack.bytes;
  7764. }
  7765. #ifdef QCA_ENHANCED_STATS_SUPPORT
  7766. void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
  7767. void *arg)
  7768. {
  7769. struct dp_txrx_peer *txrx_peer;
  7770. struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
  7771. struct dp_peer_per_pkt_stats *per_pkt_stats;
  7772. uint8_t link_id = 0;
  7773. struct dp_pdev *pdev = srcobj->vdev->pdev;
  7774. txrx_peer = dp_get_txrx_peer(srcobj);
  7775. if (qdf_unlikely(!txrx_peer))
  7776. goto link_stats;
  7777. if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
  7778. return;
  7779. if (dp_peer_is_primary_link_peer(srcobj)) {
  7780. dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
  7781. per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
  7782. DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
  7783. }
  7784. if (IS_MLO_DP_LINK_PEER(srcobj)) {
  7785. link_id = dp_get_peer_hw_link_id(soc, pdev);
  7786. if (link_id > 0) {
  7787. per_pkt_stats = &txrx_peer->
  7788. stats[link_id].per_pkt_stats;
  7789. DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
  7790. }
  7791. }
  7792. link_stats:
  7793. dp_monitor_peer_get_stats(soc, srcobj, vdev_stats, UPDATE_VDEV_STATS);
  7794. }
  7795. void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
  7796. struct dp_peer *peer)
  7797. {
  7798. struct dp_soc *soc = vdev->pdev->soc;
  7799. struct dp_txrx_peer *txrx_peer;
  7800. struct dp_peer_per_pkt_stats *per_pkt_stats;
  7801. struct cdp_vdev_stats *vdev_stats = &vdev->stats;
  7802. uint8_t link_id = 0;
  7803. struct dp_pdev *pdev = vdev->pdev;
  7804. txrx_peer = dp_get_txrx_peer(peer);
  7805. if (!txrx_peer)
  7806. goto link_stats;
  7807. dp_peer_aggregate_tid_stats(peer);
  7808. if (!IS_MLO_DP_LINK_PEER(peer)) {
  7809. per_pkt_stats = &txrx_peer->stats[0].per_pkt_stats;
  7810. dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
  7811. DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
  7812. }
  7813. if (IS_MLO_DP_LINK_PEER(peer)) {
  7814. link_id = dp_get_peer_hw_link_id(soc, pdev);
  7815. if (link_id > 0) {
  7816. per_pkt_stats =
  7817. &txrx_peer->stats[link_id].per_pkt_stats;
  7818. DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
  7819. }
  7820. }
  7821. link_stats:
  7822. dp_monitor_peer_get_stats(soc, peer, vdev_stats, UPDATE_VDEV_STATS);
  7823. }
  7824. #else
  7825. void dp_update_vdev_stats(struct dp_soc *soc, struct dp_peer *srcobj,
  7826. void *arg)
  7827. {
  7828. struct dp_txrx_peer *txrx_peer;
  7829. struct cdp_vdev_stats *vdev_stats = (struct cdp_vdev_stats *)arg;
  7830. struct dp_peer_per_pkt_stats *per_pkt_stats;
  7831. struct dp_peer_extd_stats *extd_stats;
  7832. uint8_t inx = 0;
  7833. uint8_t stats_arr_size = 0;
  7834. txrx_peer = dp_get_txrx_peer(srcobj);
  7835. if (qdf_unlikely(!txrx_peer))
  7836. return;
  7837. if (qdf_unlikely(dp_is_wds_extended(txrx_peer)))
  7838. return;
  7839. if (!dp_peer_is_primary_link_peer(srcobj))
  7840. return;
  7841. stats_arr_size = txrx_peer->stats_arr_size;
  7842. dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
  7843. for (inx = 0; inx < stats_arr_size; inx++) {
  7844. per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats;
  7845. extd_stats = &txrx_peer->stats[inx].extd_stats;
  7846. DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
  7847. DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
  7848. }
  7849. }
  7850. void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
  7851. struct dp_peer *peer)
  7852. {
  7853. struct dp_txrx_peer *txrx_peer;
  7854. struct dp_peer_per_pkt_stats *per_pkt_stats;
  7855. struct dp_peer_extd_stats *extd_stats;
  7856. struct cdp_vdev_stats *vdev_stats = &vdev->stats;
  7857. uint8_t inx = 0;
  7858. uint8_t stats_arr_size = 0;
  7859. txrx_peer = dp_get_txrx_peer(peer);
  7860. if (!txrx_peer)
  7861. return;
  7862. stats_arr_size = txrx_peer->stats_arr_size;
  7863. dp_update_vdev_basic_stats(txrx_peer, vdev_stats);
  7864. for (inx = 0; inx < stats_arr_size; inx++) {
  7865. per_pkt_stats = &txrx_peer->stats[inx].per_pkt_stats;
  7866. extd_stats = &txrx_peer->stats[inx].extd_stats;
  7867. DP_UPDATE_EXTD_STATS(vdev_stats, extd_stats);
  7868. DP_UPDATE_PER_PKT_STATS(vdev_stats, per_pkt_stats);
  7869. }
  7870. }
  7871. #endif
  7872. void dp_update_pdev_stats(struct dp_pdev *tgtobj,
  7873. struct cdp_vdev_stats *srcobj)
  7874. {
  7875. uint8_t i;
  7876. uint8_t pream_type;
  7877. uint8_t mu_type;
  7878. struct cdp_pdev_stats *pdev_stats = NULL;
  7879. pdev_stats = &tgtobj->stats;
  7880. for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
  7881. for (i = 0; i < MAX_MCS; i++) {
  7882. tgtobj->stats.tx.pkt_type[pream_type].
  7883. mcs_count[i] +=
  7884. srcobj->tx.pkt_type[pream_type].
  7885. mcs_count[i];
  7886. tgtobj->stats.rx.pkt_type[pream_type].
  7887. mcs_count[i] +=
  7888. srcobj->rx.pkt_type[pream_type].
  7889. mcs_count[i];
  7890. }
  7891. }
  7892. for (i = 0; i < MAX_BW; i++) {
  7893. tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i];
  7894. tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i];
  7895. }
  7896. for (i = 0; i < SS_COUNT; i++) {
  7897. tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i];
  7898. tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i];
  7899. tgtobj->stats.rx.ppdu_nss[i] += srcobj->rx.ppdu_nss[i];
  7900. }
  7901. for (i = 0; i < WME_AC_MAX; i++) {
  7902. tgtobj->stats.tx.wme_ac_type[i] +=
  7903. srcobj->tx.wme_ac_type[i];
  7904. tgtobj->stats.tx.wme_ac_type_bytes[i] +=
  7905. srcobj->tx.wme_ac_type_bytes[i];
  7906. tgtobj->stats.rx.wme_ac_type[i] +=
  7907. srcobj->rx.wme_ac_type[i];
  7908. tgtobj->stats.rx.wme_ac_type_bytes[i] +=
  7909. srcobj->rx.wme_ac_type_bytes[i];
  7910. tgtobj->stats.tx.excess_retries_per_ac[i] +=
  7911. srcobj->tx.excess_retries_per_ac[i];
  7912. }
  7913. for (i = 0; i < MAX_GI; i++) {
  7914. tgtobj->stats.tx.sgi_count[i] +=
  7915. srcobj->tx.sgi_count[i];
  7916. tgtobj->stats.rx.sgi_count[i] +=
  7917. srcobj->rx.sgi_count[i];
  7918. }
  7919. for (i = 0; i < MAX_RECEPTION_TYPES; i++) {
  7920. tgtobj->stats.rx.reception_type[i] +=
  7921. srcobj->rx.reception_type[i];
  7922. tgtobj->stats.rx.ppdu_cnt[i] += srcobj->rx.ppdu_cnt[i];
  7923. }
  7924. for (i = 0; i < MAX_TRANSMIT_TYPES; i++) {
  7925. tgtobj->stats.tx.transmit_type[i].num_msdu +=
  7926. srcobj->tx.transmit_type[i].num_msdu;
  7927. tgtobj->stats.tx.transmit_type[i].num_mpdu +=
  7928. srcobj->tx.transmit_type[i].num_mpdu;
  7929. tgtobj->stats.tx.transmit_type[i].mpdu_tried +=
  7930. srcobj->tx.transmit_type[i].mpdu_tried;
  7931. }
  7932. for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++)
  7933. tgtobj->stats.tx.no_ack_count[i] += srcobj->tx.no_ack_count[i];
  7934. for (i = 0; i < MAX_MU_GROUP_ID; i++)
  7935. tgtobj->stats.tx.mu_group_id[i] = srcobj->tx.mu_group_id[i];
  7936. for (i = 0; i < MAX_RU_LOCATIONS; i++) {
  7937. tgtobj->stats.tx.ru_loc[i].num_msdu +=
  7938. srcobj->tx.ru_loc[i].num_msdu;
  7939. tgtobj->stats.tx.ru_loc[i].num_mpdu +=
  7940. srcobj->tx.ru_loc[i].num_mpdu;
  7941. tgtobj->stats.tx.ru_loc[i].mpdu_tried +=
  7942. srcobj->tx.ru_loc[i].mpdu_tried;
  7943. }
  7944. tgtobj->stats.tx.tx_ppdus += srcobj->tx.tx_ppdus;
  7945. tgtobj->stats.tx.tx_mpdus_success += srcobj->tx.tx_mpdus_success;
  7946. tgtobj->stats.tx.tx_mpdus_tried += srcobj->tx.tx_mpdus_tried;
  7947. tgtobj->stats.tx.retries_mpdu += srcobj->tx.retries_mpdu;
  7948. tgtobj->stats.tx.mpdu_success_with_retries +=
  7949. srcobj->tx.mpdu_success_with_retries;
  7950. tgtobj->stats.tx.last_tx_ts = srcobj->tx.last_tx_ts;
  7951. tgtobj->stats.tx.tx_rate = srcobj->tx.tx_rate;
  7952. tgtobj->stats.tx.last_tx_rate = srcobj->tx.last_tx_rate;
  7953. tgtobj->stats.tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
  7954. tgtobj->stats.tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
  7955. tgtobj->stats.tx.mcast_last_tx_rate_mcs =
  7956. srcobj->tx.mcast_last_tx_rate_mcs;
  7957. tgtobj->stats.tx.rnd_avg_tx_rate = srcobj->tx.rnd_avg_tx_rate;
  7958. tgtobj->stats.tx.avg_tx_rate = srcobj->tx.avg_tx_rate;
  7959. tgtobj->stats.tx.tx_ratecode = srcobj->tx.tx_ratecode;
  7960. tgtobj->stats.tx.ru_start = srcobj->tx.ru_start;
  7961. tgtobj->stats.tx.ru_tones = srcobj->tx.ru_tones;
  7962. tgtobj->stats.tx.last_ack_rssi = srcobj->tx.last_ack_rssi;
  7963. tgtobj->stats.tx.nss_info = srcobj->tx.nss_info;
  7964. tgtobj->stats.tx.mcs_info = srcobj->tx.mcs_info;
  7965. tgtobj->stats.tx.bw_info = srcobj->tx.bw_info;
  7966. tgtobj->stats.tx.gi_info = srcobj->tx.gi_info;
  7967. tgtobj->stats.tx.preamble_info = srcobj->tx.preamble_info;
  7968. tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes;
  7969. tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num;
  7970. tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num;
  7971. tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes;
  7972. tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num;
  7973. tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes;
  7974. tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num;
  7975. tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes;
  7976. tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num;
  7977. tgtobj->stats.tx.tx_success.bytes +=
  7978. srcobj->tx.tx_success.bytes;
  7979. tgtobj->stats.tx.nawds_mcast.num +=
  7980. srcobj->tx.nawds_mcast.num;
  7981. tgtobj->stats.tx.nawds_mcast.bytes +=
  7982. srcobj->tx.nawds_mcast.bytes;
  7983. tgtobj->stats.tx.nawds_mcast_drop +=
  7984. srcobj->tx.nawds_mcast_drop;
  7985. tgtobj->stats.tx.num_ppdu_cookie_valid +=
  7986. srcobj->tx.num_ppdu_cookie_valid;
  7987. tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed;
  7988. tgtobj->stats.tx.ofdma += srcobj->tx.ofdma;
  7989. tgtobj->stats.tx.stbc += srcobj->tx.stbc;
  7990. tgtobj->stats.tx.ldpc += srcobj->tx.ldpc;
  7991. tgtobj->stats.tx.pream_punct_cnt += srcobj->tx.pream_punct_cnt;
  7992. tgtobj->stats.tx.retries += srcobj->tx.retries;
  7993. tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt;
  7994. tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt;
  7995. tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt;
  7996. tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt;
  7997. tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num;
  7998. tgtobj->stats.tx.dropped.fw_rem.bytes +=
  7999. srcobj->tx.dropped.fw_rem.bytes;
  8000. tgtobj->stats.tx.dropped.fw_rem_tx +=
  8001. srcobj->tx.dropped.fw_rem_tx;
  8002. tgtobj->stats.tx.dropped.fw_rem_notx +=
  8003. srcobj->tx.dropped.fw_rem_notx;
  8004. tgtobj->stats.tx.dropped.fw_reason1 +=
  8005. srcobj->tx.dropped.fw_reason1;
  8006. tgtobj->stats.tx.dropped.fw_reason2 +=
  8007. srcobj->tx.dropped.fw_reason2;
  8008. tgtobj->stats.tx.dropped.fw_reason3 +=
  8009. srcobj->tx.dropped.fw_reason3;
  8010. tgtobj->stats.tx.dropped.fw_rem_queue_disable +=
  8011. srcobj->tx.dropped.fw_rem_queue_disable;
  8012. tgtobj->stats.tx.dropped.fw_rem_no_match +=
  8013. srcobj->tx.dropped.fw_rem_no_match;
  8014. tgtobj->stats.tx.dropped.drop_threshold +=
  8015. srcobj->tx.dropped.drop_threshold;
  8016. tgtobj->stats.tx.dropped.drop_link_desc_na +=
  8017. srcobj->tx.dropped.drop_link_desc_na;
  8018. tgtobj->stats.tx.dropped.invalid_drop +=
  8019. srcobj->tx.dropped.invalid_drop;
  8020. tgtobj->stats.tx.dropped.mcast_vdev_drop +=
  8021. srcobj->tx.dropped.mcast_vdev_drop;
  8022. tgtobj->stats.tx.dropped.invalid_rr +=
  8023. srcobj->tx.dropped.invalid_rr;
  8024. tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out;
  8025. tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err;
  8026. tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err;
  8027. tgtobj->stats.rx.err.fcserr += srcobj->rx.err.fcserr;
  8028. tgtobj->stats.rx.err.pn_err += srcobj->rx.err.pn_err;
  8029. tgtobj->stats.rx.err.oor_err += srcobj->rx.err.oor_err;
  8030. tgtobj->stats.rx.err.jump_2k_err += srcobj->rx.err.jump_2k_err;
  8031. tgtobj->stats.rx.err.rxdma_wifi_parse_err +=
  8032. srcobj->rx.err.rxdma_wifi_parse_err;
  8033. if (srcobj->rx.snr != 0)
  8034. tgtobj->stats.rx.snr = srcobj->rx.snr;
  8035. tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate;
  8036. tgtobj->stats.rx.last_rx_rate = srcobj->rx.last_rx_rate;
  8037. tgtobj->stats.rx.rnd_avg_rx_rate = srcobj->rx.rnd_avg_rx_rate;
  8038. tgtobj->stats.rx.avg_rx_rate = srcobj->rx.avg_rx_rate;
  8039. tgtobj->stats.rx.rx_ratecode = srcobj->rx.rx_ratecode;
  8040. tgtobj->stats.rx.avg_snr = srcobj->rx.avg_snr;
  8041. tgtobj->stats.rx.rx_snr_measured_time = srcobj->rx.rx_snr_measured_time;
  8042. tgtobj->stats.rx.last_snr = srcobj->rx.last_snr;
  8043. tgtobj->stats.rx.nss_info = srcobj->rx.nss_info;
  8044. tgtobj->stats.rx.mcs_info = srcobj->rx.mcs_info;
  8045. tgtobj->stats.rx.bw_info = srcobj->rx.bw_info;
  8046. tgtobj->stats.rx.gi_info = srcobj->rx.gi_info;
  8047. tgtobj->stats.rx.preamble_info = srcobj->rx.preamble_info;
  8048. tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt;
  8049. tgtobj->stats.rx.ampdu_cnt += srcobj->rx.ampdu_cnt;
  8050. tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
  8051. tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
  8052. tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
  8053. tgtobj->stats.rx.mcast_3addr_drop += srcobj->rx.mcast_3addr_drop;
  8054. tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
  8055. tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
  8056. for (i = 0; i < CDP_MAX_RX_RINGS; i++) {
  8057. tgtobj->stats.rx.rcvd_reo[i].num +=
  8058. srcobj->rx.rcvd_reo[i].num;
  8059. tgtobj->stats.rx.rcvd_reo[i].bytes +=
  8060. srcobj->rx.rcvd_reo[i].bytes;
  8061. }
  8062. for (i = 0; i < CDP_MAX_LMACS; i++) {
  8063. tgtobj->stats.rx.rx_lmac[i].num +=
  8064. srcobj->rx.rx_lmac[i].num;
  8065. tgtobj->stats.rx.rx_lmac[i].bytes +=
  8066. srcobj->rx.rx_lmac[i].bytes;
  8067. }
  8068. if (srcobj->rx.to_stack.num >= (srcobj->rx.multicast.num))
  8069. srcobj->rx.unicast.num =
  8070. srcobj->rx.to_stack.num -
  8071. (srcobj->rx.multicast.num);
  8072. if (srcobj->rx.to_stack.bytes >= srcobj->rx.multicast.bytes)
  8073. srcobj->rx.unicast.bytes =
  8074. srcobj->rx.to_stack.bytes -
  8075. (srcobj->rx.multicast.bytes);
  8076. tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num;
  8077. tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes;
  8078. tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num;
  8079. tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes;
  8080. tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num;
  8081. tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes;
  8082. tgtobj->stats.rx.raw.num += srcobj->rx.raw.num;
  8083. tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes;
  8084. tgtobj->stats.rx.intra_bss.pkts.num +=
  8085. srcobj->rx.intra_bss.pkts.num;
  8086. tgtobj->stats.rx.intra_bss.pkts.bytes +=
  8087. srcobj->rx.intra_bss.pkts.bytes;
  8088. tgtobj->stats.rx.intra_bss.fail.num +=
  8089. srcobj->rx.intra_bss.fail.num;
  8090. tgtobj->stats.rx.intra_bss.fail.bytes +=
  8091. srcobj->rx.intra_bss.fail.bytes;
  8092. tgtobj->stats.tx.last_ack_rssi =
  8093. srcobj->tx.last_ack_rssi;
  8094. tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num;
  8095. tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes;
  8096. tgtobj->stats.rx.ppeds_drop.num += srcobj->rx.ppeds_drop.num;
  8097. tgtobj->stats.rx.ppeds_drop.bytes += srcobj->rx.ppeds_drop.bytes;
  8098. tgtobj->stats.rx.multipass_rx_pkt_drop +=
  8099. srcobj->rx.multipass_rx_pkt_drop;
  8100. tgtobj->stats.rx.peer_unauth_rx_pkt_drop +=
  8101. srcobj->rx.peer_unauth_rx_pkt_drop;
  8102. tgtobj->stats.rx.policy_check_drop +=
  8103. srcobj->rx.policy_check_drop;
  8104. for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) {
  8105. tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_ok +=
  8106. srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok;
  8107. tgtobj->stats.rx.rx_mu[mu_type].mpdu_cnt_fcs_err +=
  8108. srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err;
  8109. for (i = 0; i < SS_COUNT; i++)
  8110. tgtobj->stats.rx.rx_mu[mu_type].ppdu_nss[i] +=
  8111. srcobj->rx.rx_mu[mu_type].ppdu_nss[i];
  8112. for (i = 0; i < MAX_MCS; i++)
  8113. tgtobj->stats.rx.rx_mu[mu_type].ppdu.mcs_count[i] +=
  8114. srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i];
  8115. }
  8116. for (i = 0; i < MAX_MCS; i++) {
  8117. tgtobj->stats.rx.su_ax_ppdu_cnt.mcs_count[i] +=
  8118. srcobj->rx.su_ax_ppdu_cnt.mcs_count[i];
  8119. tgtobj->stats.rx.rx_mpdu_cnt[i] += srcobj->rx.rx_mpdu_cnt[i];
  8120. }
  8121. tgtobj->stats.rx.mpdu_cnt_fcs_ok += srcobj->rx.mpdu_cnt_fcs_ok;
  8122. tgtobj->stats.rx.mpdu_cnt_fcs_err += srcobj->rx.mpdu_cnt_fcs_err;
  8123. tgtobj->stats.rx.rx_mpdus += srcobj->rx.rx_mpdus;
  8124. tgtobj->stats.rx.rx_ppdus += srcobj->rx.rx_ppdus;
  8125. tgtobj->stats.rx.mpdu_retry_cnt += srcobj->rx.mpdu_retry_cnt;
  8126. tgtobj->stats.rx.rx_retries += srcobj->rx.rx_retries;
  8127. DP_UPDATE_11BE_STATS(pdev_stats, srcobj);
  8128. }
  8129. void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj)
  8130. {
  8131. tgtobj->stats.tx_i.dropped.dropped_pkt.num =
  8132. tgtobj->stats.tx_i.dropped.dma_error +
  8133. tgtobj->stats.tx_i.dropped.ring_full +
  8134. tgtobj->stats.tx_i.dropped.enqueue_fail +
  8135. tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
  8136. tgtobj->stats.tx_i.dropped.desc_na.num +
  8137. tgtobj->stats.tx_i.dropped.res_full +
  8138. tgtobj->stats.tx_i.dropped.drop_ingress +
  8139. tgtobj->stats.tx_i.dropped.headroom_insufficient +
  8140. tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
  8141. tgtobj->stats.tx_i.dropped.tx_mcast_drop +
  8142. tgtobj->stats.tx_i.dropped.fw2wbm_tx_drop;
  8143. }
  8144. void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
  8145. struct cdp_vdev_stats *srcobj)
  8146. {
  8147. tgtobj->tx.last_tx_rate = srcobj->tx.last_tx_rate;
  8148. tgtobj->tx.last_tx_rate_mcs = srcobj->tx.last_tx_rate_mcs;
  8149. tgtobj->tx.mcast_last_tx_rate = srcobj->tx.mcast_last_tx_rate;
  8150. tgtobj->tx.mcast_last_tx_rate_mcs = srcobj->tx.mcast_last_tx_rate_mcs;
  8151. tgtobj->rx.last_rx_rate = srcobj->rx.last_rx_rate;
  8152. }
  8153. void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
  8154. struct dp_vdev *srcobj)
  8155. {
  8156. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast);
  8157. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd);
  8158. DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_in_fast_xmit_flow);
  8159. DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[0]);
  8160. DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[1]);
  8161. DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[2]);
  8162. DP_STATS_AGGR(tgtobj, srcobj, tx_i.rcvd_per_core[3]);
  8163. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed);
  8164. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts);
  8165. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts);
  8166. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt);
  8167. DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error);
  8168. DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.num_frags_overflow_err);
  8169. DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num);
  8170. DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target);
  8171. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt);
  8172. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt);
  8173. DP_STATS_AGGR(tgtobj, srcobj,
  8174. tx_i.mcast_en.dropped_map_error);
  8175. DP_STATS_AGGR(tgtobj, srcobj,
  8176. tx_i.mcast_en.dropped_self_mac);
  8177. DP_STATS_AGGR(tgtobj, srcobj,
  8178. tx_i.mcast_en.dropped_send_fail);
  8179. DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast);
  8180. DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_rcvd);
  8181. DP_STATS_AGGR(tgtobj, srcobj, tx_i.igmp_mcast_en.igmp_ucast_converted);
  8182. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error);
  8183. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full);
  8184. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail);
  8185. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fail_per_pkt_vdev_id_check);
  8186. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num);
  8187. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full);
  8188. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.drop_ingress);
  8189. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient);
  8190. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path);
  8191. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.tx_mcast_drop);
  8192. DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fw2wbm_tx_drop);
  8193. DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified);
  8194. DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
  8195. DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd);
  8196. DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw);
  8197. DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw);
  8198. DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.reo_rcvd_pkt);
  8199. DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.null_q_desc_pkt);
  8200. DP_STATS_AGGR_PKT(tgtobj, srcobj, rx_i.routed_eapol_pkt);
  8201. tgtobj->stats.tx_i.dropped.dropped_pkt.num =
  8202. tgtobj->stats.tx_i.dropped.dma_error +
  8203. tgtobj->stats.tx_i.dropped.ring_full +
  8204. tgtobj->stats.tx_i.dropped.enqueue_fail +
  8205. tgtobj->stats.tx_i.dropped.fail_per_pkt_vdev_id_check +
  8206. tgtobj->stats.tx_i.dropped.desc_na.num +
  8207. tgtobj->stats.tx_i.dropped.res_full +
  8208. tgtobj->stats.tx_i.dropped.drop_ingress +
  8209. tgtobj->stats.tx_i.dropped.headroom_insufficient +
  8210. tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path +
  8211. tgtobj->stats.tx_i.dropped.tx_mcast_drop;
  8212. }
  8213. QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,
  8214. struct cdp_soc_stats *soc_stats)
  8215. {
  8216. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8217. uint8_t inx;
  8218. uint8_t cpus;
  8219. /* soc tx stats */
  8220. soc_stats->tx.egress = soc->stats.tx.egress[0];
  8221. soc_stats->tx.tx_invalid_peer = soc->stats.tx.tx_invalid_peer;
  8222. for (inx = 0; inx < CDP_MAX_TX_DATA_RINGS; inx++) {
  8223. soc_stats->tx.tx_hw_enq[inx] = soc->stats.tx.tcl_enq[inx];
  8224. soc_stats->tx.tx_hw_ring_full[inx] =
  8225. soc->stats.tx.tcl_ring_full[inx];
  8226. }
  8227. soc_stats->tx.desc_in_use = soc->stats.tx.desc_in_use;
  8228. soc_stats->tx.dropped_fw_removed = soc->stats.tx.dropped_fw_removed;
  8229. soc_stats->tx.invalid_release_source =
  8230. soc->stats.tx.invalid_release_source;
  8231. soc_stats->tx.invalid_tx_comp_desc =
  8232. soc->stats.tx.invalid_tx_comp_desc;
  8233. for (inx = 0; inx < CDP_MAX_WIFI_INT_ERROR_REASONS; inx++)
  8234. soc_stats->tx.wifi_internal_error[inx] =
  8235. soc->stats.tx.wbm_internal_error[inx];
  8236. soc_stats->tx.non_wifi_internal_err =
  8237. soc->stats.tx.non_wbm_internal_err;
  8238. soc_stats->tx.tx_comp_loop_pkt_limit_hit =
  8239. soc->stats.tx.tx_comp_loop_pkt_limit_hit;
  8240. soc_stats->tx.hp_oos2 = soc->stats.tx.hp_oos2;
  8241. soc_stats->tx.tx_comp_exception = soc->stats.tx.tx_comp_exception;
  8242. /* soc rx stats */
  8243. soc_stats->rx.ingress = soc->stats.rx.ingress;
  8244. soc_stats->rx.err_ring_pkts = soc->stats.rx.err_ring_pkts;
  8245. soc_stats->rx.rx_frags = soc->stats.rx.rx_frags;
  8246. soc_stats->rx.rx_hw_reinject = soc->stats.rx.reo_reinject;
  8247. soc_stats->rx.bar_frame = soc->stats.rx.bar_frame;
  8248. soc_stats->rx.rx_frag_err_len_error =
  8249. soc->stats.rx.rx_frag_err_len_error;
  8250. soc_stats->rx.rx_frag_err_no_peer = soc->stats.rx.rx_frag_err_no_peer;
  8251. soc_stats->rx.rx_frag_wait = soc->stats.rx.rx_frag_wait;
  8252. soc_stats->rx.rx_frag_err = soc->stats.rx.rx_frag_err;
  8253. soc_stats->rx.rx_frag_oor = soc->stats.rx.rx_frag_oor;
  8254. soc_stats->rx.reap_loop_pkt_limit_hit =
  8255. soc->stats.rx.reap_loop_pkt_limit_hit;
  8256. soc_stats->rx.hp_oos2 = soc->stats.rx.hp_oos2;
  8257. soc_stats->rx.near_full = soc->stats.rx.near_full;
  8258. soc_stats->rx.msdu_scatter_wait_break =
  8259. soc->stats.rx.msdu_scatter_wait_break;
  8260. soc_stats->rx.rx_sw_route_drop = soc->stats.rx.rxdma2rel_route_drop;
  8261. soc_stats->rx.rx_hw_route_drop = soc->stats.rx.reo2rel_route_drop;
  8262. soc_stats->rx.rx_packets.num_cpus = qdf_min((uint32_t)CDP_NR_CPUS,
  8263. num_possible_cpus());
  8264. for (cpus = 0; cpus < soc_stats->rx.rx_packets.num_cpus; cpus++) {
  8265. for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
  8266. soc_stats->rx.rx_packets.pkts[cpus][inx] =
  8267. soc->stats.rx.ring_packets[cpus][inx];
  8268. }
  8269. soc_stats->rx.err.rx_rejected = soc->stats.rx.err.rejected;
  8270. soc_stats->rx.err.rx_raw_frm_drop = soc->stats.rx.err.raw_frm_drop;
  8271. soc_stats->rx.err.phy_ring_access_fail =
  8272. soc->stats.rx.err.hal_ring_access_fail;
  8273. soc_stats->rx.err.phy_ring_access_full_fail =
  8274. soc->stats.rx.err.hal_ring_access_full_fail;
  8275. for (inx = 0; inx < CDP_MAX_RX_DEST_RINGS; inx++)
  8276. soc_stats->rx.err.phy_rx_hw_error[inx] =
  8277. soc->stats.rx.err.hal_reo_error[inx];
  8278. soc_stats->rx.err.phy_rx_hw_dest_dup =
  8279. soc->stats.rx.err.hal_reo_dest_dup;
  8280. soc_stats->rx.err.phy_wifi_rel_dup = soc->stats.rx.err.hal_wbm_rel_dup;
  8281. soc_stats->rx.err.phy_rx_sw_err_dup =
  8282. soc->stats.rx.err.hal_rxdma_err_dup;
  8283. soc_stats->rx.err.invalid_rbm = soc->stats.rx.err.invalid_rbm;
  8284. soc_stats->rx.err.invalid_vdev = soc->stats.rx.err.invalid_vdev;
  8285. soc_stats->rx.err.invalid_pdev = soc->stats.rx.err.invalid_pdev;
  8286. soc_stats->rx.err.pkt_delivered_no_peer =
  8287. soc->stats.rx.err.pkt_delivered_no_peer;
  8288. soc_stats->rx.err.defrag_peer_uninit =
  8289. soc->stats.rx.err.defrag_peer_uninit;
  8290. soc_stats->rx.err.invalid_sa_da_idx =
  8291. soc->stats.rx.err.invalid_sa_da_idx;
  8292. soc_stats->rx.err.msdu_done_fail = soc->stats.rx.err.msdu_done_fail;
  8293. soc_stats->rx.err.rx_invalid_peer = soc->stats.rx.err.rx_invalid_peer;
  8294. soc_stats->rx.err.rx_invalid_peer_id =
  8295. soc->stats.rx.err.rx_invalid_peer_id;
  8296. soc_stats->rx.err.rx_invalid_pkt_len =
  8297. soc->stats.rx.err.rx_invalid_pkt_len;
  8298. for (inx = 0; inx < qdf_min((uint32_t)CDP_WIFI_ERR_MAX,
  8299. (uint32_t)HAL_RXDMA_ERR_MAX); inx++)
  8300. soc_stats->rx.err.rx_sw_error[inx] =
  8301. soc->stats.rx.err.rxdma_error[inx];
  8302. for (inx = 0; inx < qdf_min((uint32_t)CDP_RX_ERR_MAX,
  8303. (uint32_t)HAL_REO_ERR_MAX); inx++)
  8304. soc_stats->rx.err.rx_hw_error[inx] =
  8305. soc->stats.rx.err.reo_error[inx];
  8306. soc_stats->rx.err.rx_desc_invalid_magic =
  8307. soc->stats.rx.err.rx_desc_invalid_magic;
  8308. soc_stats->rx.err.rx_hw_cmd_send_fail =
  8309. soc->stats.rx.err.reo_cmd_send_fail;
  8310. soc_stats->rx.err.rx_hw_cmd_send_drain =
  8311. soc->stats.rx.err.reo_cmd_send_drain;
  8312. soc_stats->rx.err.scatter_msdu = soc->stats.rx.err.scatter_msdu;
  8313. soc_stats->rx.err.invalid_cookie = soc->stats.rx.err.invalid_cookie;
  8314. soc_stats->rx.err.stale_cookie = soc->stats.rx.err.stale_cookie;
  8315. soc_stats->rx.err.rx_2k_jump_delba_sent =
  8316. soc->stats.rx.err.rx_2k_jump_delba_sent;
  8317. soc_stats->rx.err.rx_2k_jump_to_stack =
  8318. soc->stats.rx.err.rx_2k_jump_to_stack;
  8319. soc_stats->rx.err.rx_2k_jump_drop = soc->stats.rx.err.rx_2k_jump_drop;
  8320. soc_stats->rx.err.rx_hw_err_msdu_buf_rcved =
  8321. soc->stats.rx.err.reo_err_msdu_buf_rcved;
  8322. soc_stats->rx.err.rx_hw_err_msdu_buf_invalid_cookie =
  8323. soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie;
  8324. soc_stats->rx.err.rx_hw_err_oor_drop =
  8325. soc->stats.rx.err.reo_err_oor_drop;
  8326. soc_stats->rx.err.rx_hw_err_oor_to_stack =
  8327. soc->stats.rx.err.reo_err_oor_to_stack;
  8328. soc_stats->rx.err.rx_hw_err_oor_sg_count =
  8329. soc->stats.rx.err.reo_err_oor_sg_count;
  8330. soc_stats->rx.err.msdu_count_mismatch =
  8331. soc->stats.rx.err.msdu_count_mismatch;
  8332. soc_stats->rx.err.invalid_link_cookie =
  8333. soc->stats.rx.err.invalid_link_cookie;
  8334. soc_stats->rx.err.nbuf_sanity_fail = soc->stats.rx.err.nbuf_sanity_fail;
  8335. soc_stats->rx.err.dup_refill_link_desc =
  8336. soc->stats.rx.err.dup_refill_link_desc;
  8337. soc_stats->rx.err.msdu_continuation_err =
  8338. soc->stats.rx.err.msdu_continuation_err;
  8339. soc_stats->rx.err.ssn_update_count = soc->stats.rx.err.ssn_update_count;
  8340. soc_stats->rx.err.bar_handle_fail_count =
  8341. soc->stats.rx.err.bar_handle_fail_count;
  8342. soc_stats->rx.err.intrabss_eapol_drop =
  8343. soc->stats.rx.err.intrabss_eapol_drop;
  8344. soc_stats->rx.err.pn_in_dest_check_fail =
  8345. soc->stats.rx.err.pn_in_dest_check_fail;
  8346. soc_stats->rx.err.msdu_len_err = soc->stats.rx.err.msdu_len_err;
  8347. soc_stats->rx.err.rx_flush_count = soc->stats.rx.err.rx_flush_count;
  8348. /* soc ast stats */
  8349. soc_stats->ast.added = soc->stats.ast.added;
  8350. soc_stats->ast.deleted = soc->stats.ast.deleted;
  8351. soc_stats->ast.aged_out = soc->stats.ast.aged_out;
  8352. soc_stats->ast.map_err = soc->stats.ast.map_err;
  8353. soc_stats->ast.ast_mismatch = soc->stats.ast.ast_mismatch;
  8354. /* soc mec stats */
  8355. soc_stats->mec.added = soc->stats.mec.added;
  8356. soc_stats->mec.deleted = soc->stats.mec.deleted;
  8357. return QDF_STATUS_SUCCESS;
  8358. }
  8359. #ifdef QCA_PEER_EXT_STATS
  8360. QDF_STATUS
  8361. dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
  8362. uint8_t *peer_mac,
  8363. struct cdp_delay_tid_stats *delay_stats)
  8364. {
  8365. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8366. struct dp_peer *peer = NULL;
  8367. struct dp_peer_delay_stats *pext_stats;
  8368. struct cdp_delay_rx_stats *rx_delay;
  8369. struct cdp_delay_tx_stats *tx_delay;
  8370. uint8_t tid;
  8371. struct cdp_peer_info peer_info = { 0 };
  8372. if (!wlan_cfg_is_peer_ext_stats_enabled(soc->wlan_cfg_ctx))
  8373. return QDF_STATUS_E_FAILURE;
  8374. DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
  8375. CDP_WILD_PEER_TYPE);
  8376. peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
  8377. if (!peer)
  8378. return QDF_STATUS_E_FAILURE;
  8379. if (!peer->txrx_peer) {
  8380. dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
  8381. return QDF_STATUS_E_FAILURE;
  8382. }
  8383. pext_stats = peer->txrx_peer->delay_stats;
  8384. if (!pext_stats) {
  8385. dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
  8386. return QDF_STATUS_E_FAILURE;
  8387. }
  8388. for (tid = 0; tid < CDP_MAX_DATA_TIDS; tid++) {
  8389. rx_delay = &delay_stats[tid].rx_delay;
  8390. dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
  8391. &rx_delay->to_stack_delay, tid,
  8392. CDP_HIST_TYPE_REAP_STACK);
  8393. tx_delay = &delay_stats[tid].tx_delay;
  8394. dp_accumulate_delay_avg_stats(pext_stats->delay_tid_stats,
  8395. tx_delay,
  8396. tid);
  8397. dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
  8398. &tx_delay->tx_swq_delay, tid,
  8399. CDP_HIST_TYPE_SW_ENQEUE_DELAY);
  8400. dp_accumulate_delay_tid_stats(soc, pext_stats->delay_tid_stats,
  8401. &tx_delay->hwtx_delay, tid,
  8402. CDP_HIST_TYPE_HW_COMP_DELAY);
  8403. }
  8404. dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
  8405. return QDF_STATUS_SUCCESS;
  8406. }
  8407. #else
  8408. QDF_STATUS
  8409. dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
  8410. uint8_t *peer_mac,
  8411. struct cdp_delay_tid_stats *delay_stats)
  8412. {
  8413. return QDF_STATUS_E_FAILURE;
  8414. }
  8415. #endif /* QCA_PEER_EXT_STATS */
  8416. #ifdef WLAN_PEER_JITTER
  8417. QDF_STATUS
  8418. dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  8419. uint8_t vdev_id, uint8_t *peer_mac,
  8420. struct cdp_peer_tid_stats *tid_stats)
  8421. {
  8422. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8423. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
  8424. struct dp_peer *peer = NULL;
  8425. uint8_t tid;
  8426. struct cdp_peer_info peer_info = { 0 };
  8427. struct cdp_peer_tid_stats *jitter_stats;
  8428. uint8_t ring_id;
  8429. if (!pdev)
  8430. return QDF_STATUS_E_FAILURE;
  8431. if (!wlan_cfg_is_peer_jitter_stats_enabled(soc->wlan_cfg_ctx))
  8432. return QDF_STATUS_E_FAILURE;
  8433. DP_PEER_INFO_PARAMS_INIT(&peer_info, vdev_id, peer_mac, false,
  8434. CDP_WILD_PEER_TYPE);
  8435. peer = dp_peer_hash_find_wrapper(soc, &peer_info, DP_MOD_ID_CDP);
  8436. if (!peer)
  8437. return QDF_STATUS_E_FAILURE;
  8438. if (!peer->txrx_peer || !peer->txrx_peer->jitter_stats) {
  8439. dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
  8440. return QDF_STATUS_E_FAILURE;
  8441. }
  8442. if (wlan_cfg_get_dp_pdev_nss_enabled(pdev->wlan_cfg_ctx)) {
  8443. for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
  8444. struct cdp_peer_tid_stats *rx_tid =
  8445. &peer->txrx_peer->jitter_stats[tid];
  8446. tid_stats[tid].tx_avg_jitter = rx_tid->tx_avg_jitter;
  8447. tid_stats[tid].tx_avg_delay = rx_tid->tx_avg_delay;
  8448. tid_stats[tid].tx_avg_err = rx_tid->tx_avg_err;
  8449. tid_stats[tid].tx_total_success = rx_tid->tx_total_success;
  8450. tid_stats[tid].tx_drop = rx_tid->tx_drop;
  8451. }
  8452. } else {
  8453. jitter_stats = peer->txrx_peer->jitter_stats;
  8454. for (tid = 0; tid < qdf_min(CDP_DATA_TID_MAX, DP_MAX_TIDS); tid++) {
  8455. for (ring_id = 0; ring_id < CDP_MAX_TXRX_CTX; ring_id++) {
  8456. struct cdp_peer_tid_stats *rx_tid =
  8457. &jitter_stats[tid *
  8458. CDP_MAX_TXRX_CTX + ring_id];
  8459. tid_stats[tid].tx_avg_jitter =
  8460. (rx_tid->tx_avg_jitter +
  8461. tid_stats[tid].tx_avg_jitter) >> 1;
  8462. tid_stats[tid].tx_avg_delay =
  8463. (rx_tid->tx_avg_delay +
  8464. tid_stats[tid].tx_avg_delay) >> 1;
  8465. tid_stats[tid].tx_avg_err = (rx_tid->tx_avg_err
  8466. + tid_stats[tid].tx_avg_err) >> 1;
  8467. tid_stats[tid].tx_total_success +=
  8468. rx_tid->tx_total_success;
  8469. tid_stats[tid].tx_drop += rx_tid->tx_drop;
  8470. }
  8471. }
  8472. }
  8473. dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
  8474. return QDF_STATUS_SUCCESS;
  8475. }
  8476. #else
  8477. QDF_STATUS
  8478. dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  8479. uint8_t vdev_id, uint8_t *peer_mac,
  8480. struct cdp_peer_tid_stats *tid_stats)
  8481. {
  8482. return QDF_STATUS_E_FAILURE;
  8483. }
  8484. #endif /* WLAN_PEER_JITTER */
  8485. #ifdef WLAN_TX_PKT_CAPTURE_ENH
  8486. QDF_STATUS
  8487. dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
  8488. uint8_t vdev_id, uint8_t *peer_mac,
  8489. struct cdp_peer_tx_capture_stats *stats)
  8490. {
  8491. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8492. struct dp_peer *peer = dp_peer_find_hash_find(soc, peer_mac, 0, vdev_id,
  8493. DP_MOD_ID_TX_CAPTURE);
  8494. QDF_STATUS status;
  8495. if (!peer)
  8496. return QDF_STATUS_E_FAILURE;
  8497. status = dp_monitor_peer_tx_capture_get_stats(soc, peer, stats);
  8498. dp_peer_unref_delete(peer, DP_MOD_ID_TX_CAPTURE);
  8499. return status;
  8500. }
  8501. QDF_STATUS
  8502. dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  8503. struct cdp_pdev_tx_capture_stats *stats)
  8504. {
  8505. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8506. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
  8507. if (!pdev)
  8508. return QDF_STATUS_E_FAILURE;
  8509. return dp_monitor_pdev_tx_capture_get_stats(soc, pdev, stats);
  8510. }
  8511. #else /* WLAN_TX_PKT_CAPTURE_ENH */
  8512. QDF_STATUS
  8513. dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
  8514. uint8_t vdev_id, uint8_t *peer_mac,
  8515. struct cdp_peer_tx_capture_stats *stats)
  8516. {
  8517. return QDF_STATUS_E_FAILURE;
  8518. }
  8519. QDF_STATUS
  8520. dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  8521. struct cdp_pdev_tx_capture_stats *stats)
  8522. {
  8523. return QDF_STATUS_E_FAILURE;
  8524. }
  8525. #endif /* WLAN_TX_PKT_CAPTURE_ENH */
  8526. #ifdef WLAN_CONFIG_TELEMETRY_AGENT
  8527. QDF_STATUS
  8528. dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  8529. struct cdp_pdev_telemetry_stats *stats)
  8530. {
  8531. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8532. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
  8533. uint8_t ac = 0;
  8534. if (!pdev)
  8535. return QDF_STATUS_E_FAILURE;
  8536. /* consumption is in micro seconds, convert it to seconds and
  8537. * then calculate %age per sec
  8538. */
  8539. for (ac = 0; ac < WME_AC_MAX; ac++) {
  8540. stats->link_airtime[ac] =
  8541. ((pdev->stats.telemetry_stats.link_airtime[ac] * 100) / 1000000);
  8542. stats->tx_mpdu_failed[ac] = pdev->stats.telemetry_stats.tx_mpdu_failed[ac];
  8543. stats->tx_mpdu_total[ac] = pdev->stats.telemetry_stats.tx_mpdu_total[ac];
  8544. }
  8545. return QDF_STATUS_SUCCESS;
  8546. }
  8547. QDF_STATUS
  8548. dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
  8549. struct cdp_peer_telemetry_stats *stats)
  8550. {
  8551. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8552. struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, DP_VDEV_ALL,
  8553. DP_MOD_ID_MISC);
  8554. if (!peer)
  8555. return QDF_STATUS_E_FAILURE;
  8556. dp_monitor_peer_telemetry_stats(peer, stats);
  8557. dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
  8558. return QDF_STATUS_SUCCESS;
  8559. }
  8560. QDF_STATUS
  8561. dp_get_pdev_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  8562. struct cdp_pdev_deter_stats *stats)
  8563. {
  8564. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8565. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
  8566. if (!pdev)
  8567. return QDF_STATUS_E_FAILURE;
  8568. qdf_mem_copy(stats->dl_ofdma_usr, pdev->stats.deter_stats.dl_ofdma_usr,
  8569. sizeof(stats->dl_ofdma_usr[0]) * CDP_MU_MAX_USERS);
  8570. qdf_mem_copy(stats->ul_ofdma_usr, pdev->stats.deter_stats.ul_ofdma_usr,
  8571. sizeof(stats->ul_ofdma_usr[0]) * CDP_MU_MAX_USERS);
  8572. qdf_mem_copy(stats->dl_mimo_usr, pdev->stats.deter_stats.dl_mimo_usr,
  8573. sizeof(stats->dl_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS);
  8574. qdf_mem_copy(stats->ul_mimo_usr, pdev->stats.deter_stats.ul_mimo_usr,
  8575. sizeof(stats->ul_mimo_usr[0]) * CDP_MU_MAX_MIMO_USERS);
  8576. qdf_mem_copy(stats->ul_mode_cnt, pdev->stats.deter_stats.ul_mode_cnt,
  8577. sizeof(stats->ul_mode_cnt[0]) * TX_MODE_UL_MAX);
  8578. qdf_mem_copy(stats->dl_mode_cnt, pdev->stats.deter_stats.dl_mode_cnt,
  8579. sizeof(stats->dl_mode_cnt[0]) * TX_MODE_DL_MAX);
  8580. qdf_mem_copy(stats->ch_access_delay,
  8581. pdev->stats.deter_stats.ch_access_delay,
  8582. sizeof(stats->ch_access_delay[0]) * WME_AC_MAX);
  8583. qdf_mem_copy(stats->ts,
  8584. pdev->stats.deter_stats.ts,
  8585. sizeof(stats->ts[0]) * TX_MODE_UL_MAX);
  8586. stats->ch_util.ap_tx_util = pdev->stats.deter_stats.ch_util.ap_tx_util;
  8587. stats->ch_util.ap_rx_util = pdev->stats.deter_stats.ch_util.ap_rx_util;
  8588. stats->ch_util.ap_chan_util =
  8589. pdev->stats.deter_stats.ch_util.ap_chan_util;
  8590. stats->rx_su_cnt = pdev->stats.deter_stats.rx_su_cnt;
  8591. return QDF_STATUS_SUCCESS;
  8592. }
  8593. QDF_STATUS
  8594. dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl,
  8595. uint8_t vdev_id,
  8596. uint8_t *addr,
  8597. struct cdp_peer_deter_stats *stats)
  8598. {
  8599. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8600. struct dp_peer *peer = dp_peer_find_hash_find(soc, addr, 0, vdev_id,
  8601. DP_MOD_ID_MISC);
  8602. if (!peer)
  8603. return QDF_STATUS_E_FAILURE;
  8604. dp_monitor_peer_deter_stats(peer, stats);
  8605. dp_peer_unref_delete(peer, DP_MOD_ID_MISC);
  8606. return QDF_STATUS_SUCCESS;
  8607. }
  8608. QDF_STATUS
  8609. dp_update_pdev_chan_util_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
  8610. struct cdp_pdev_chan_util_stats *ch_util)
  8611. {
  8612. struct dp_soc *soc = (struct dp_soc *)soc_hdl;
  8613. struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id);
  8614. if (!pdev)
  8615. return QDF_STATUS_E_FAILURE;
  8616. pdev->stats.deter_stats.ch_util.ap_tx_util = ch_util->ap_tx_util;
  8617. pdev->stats.deter_stats.ch_util.ap_rx_util = ch_util->ap_rx_util;
  8618. pdev->stats.deter_stats.ch_util.ap_chan_util = ch_util->ap_chan_util;
  8619. return QDF_STATUS_SUCCESS;
  8620. }
  8621. #endif