dp_stats.c 343 KB

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