dp_stats.c 333 KB

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