dp_stats.c 297 KB

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