wlan_mlme_api.c 192 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057605860596060606160626063606460656066606760686069607060716072607360746075607660776078607960806081608260836084608560866087608860896090609160926093609460956096609760986099610061016102610361046105610661076108610961106111611261136114611561166117611861196120612161226123612461256126612761286129613061316132613361346135613661376138613961406141614261436144614561466147614861496150615161526153615461556156615761586159616061616162616361646165616661676168616961706171617261736174617561766177617861796180618161826183618461856186618761886189619061916192619361946195619661976198619962006201620262036204620562066207620862096210621162126213621462156216621762186219622062216222622362246225622662276228622962306231623262336234623562366237623862396240624162426243624462456246624762486249625062516252625362546255625662576258625962606261626262636264626562666267626862696270627162726273627462756276627762786279628062816282628362846285628662876288628962906291629262936294629562966297629862996300630163026303630463056306630763086309631063116312631363146315631663176318631963206321632263236324632563266327632863296330633163326333633463356336633763386339634063416342634363446345634663476348634963506351635263536354635563566357635863596360636163626363636463656366636763686369637063716372637363746375637663776378637963806381638263836384638563866387638863896390639163926393639463956396639763986399640064016402640364046405640664076408640964106411641264136414641564166417641864196420642164226423642464256426642764286429643064316432643364346435643664376438643964406441644264436444644564466447644864496450645164526453645464556456645764586459646064616462646364646465646664676468646964706471647264736474647564766477647864796480648164826483648464856486648764886489649064916492649364946495649664976498649965006501650265036504650565066507650865096510651165126513651465156516651765186519652065216522652365246525652665276528652965306531653265336534653565366537653865396540654165426543654465456546654765486549655065516552655365546555655665576558655965606561656265636564656565666567656865696570657165726573657465756576657765786579658065816582658365846585658665876588658965906591659265936594659565966597659865996600660166026603660466056606660766086609661066116612661366146615661666176618661966206621662266236624662566266627662866296630663166326633663466356636663766386639664066416642664366446645664666476648664966506651665266536654665566566657665866596660666166626663666466656666666766686669667066716672667366746675667666776678667966806681668266836684668566866687668866896690669166926693669466956696669766986699670067016702670367046705670667076708670967106711671267136714671567166717671867196720672167226723672467256726672767286729673067316732673367346735673667376738673967406741674267436744674567466747674867496750675167526753675467556756675767586759676067616762676367646765676667676768676967706771677267736774677567766777677867796780678167826783678467856786678767886789679067916792679367946795679667976798679968006801680268036804680568066807680868096810681168126813681468156816681768186819682068216822682368246825682668276828682968306831683268336834683568366837683868396840684168426843684468456846684768486849685068516852685368546855685668576858685968606861686268636864686568666867686868696870687168726873687468756876687768786879688068816882688368846885688668876888688968906891689268936894689568966897689868996900690169026903690469056906690769086909691069116912691369146915691669176918691969206921692269236924692569266927692869296930693169326933693469356936693769386939694069416942694369446945694669476948694969506951695269536954695569566957695869596960696169626963696469656966696769686969697069716972697369746975697669776978697969806981698269836984698569866987698869896990699169926993699469956996699769986999700070017002700370047005700670077008700970107011701270137014701570167017701870197020702170227023702470257026702770287029703070317032703370347035703670377038703970407041704270437044704570467047704870497050705170527053705470557056705770587059706070617062706370647065706670677068706970707071707270737074707570767077707870797080708170827083708470857086708770887089709070917092709370947095709670977098709971007101710271037104710571067107710871097110711171127113711471157116711771187119712071217122712371247125712671277128712971307131713271337134713571367137713871397140714171427143714471457146714771487149715071517152715371547155715671577158715971607161716271637164716571667167716871697170717171727173717471757176717771787179718071817182718371847185718671877188718971907191719271937194719571967197719871997200720172027203720472057206720772087209721072117212721372147215721672177218721972207221722272237224722572267227722872297230723172327233723472357236723772387239724072417242724372447245724672477248724972507251725272537254725572567257725872597260726172627263726472657266726772687269727072717272727372747275727672777278727972807281728272837284728572867287728872897290729172927293729472957296729772987299730073017302730373047305730673077308730973107311731273137314731573167317731873197320732173227323732473257326732773287329733073317332733373347335733673377338733973407341734273437344734573467347734873497350735173527353735473557356735773587359736073617362736373647365736673677368736973707371737273737374737573767377737873797380738173827383738473857386738773887389739073917392739373947395739673977398739974007401740274037404740574067407740874097410741174127413741474157416741774187419742074217422742374247425742674277428742974307431743274337434743574367437743874397440744174427443744474457446744774487449745074517452745374547455745674577458745974607461746274637464746574667467746874697470747174727473747474757476747774787479748074817482748374847485748674877488748974907491749274937494749574967497749874997500750175027503750475057506750775087509751075117512751375147515751675177518751975207521752275237524752575267527752875297530753175327533753475357536753775387539754075417542754375447545754675477548754975507551755275537554755575567557755875597560756175627563756475657566756775687569757075717572757375747575757675777578757975807581758275837584758575867587
  1. /*
  2. * Copyright (c) 2018-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. /**
  20. * DOC: define public APIs exposed by the mlme component
  21. */
  22. #include "cfg_ucfg_api.h"
  23. #include "wlan_mlme_main.h"
  24. #include "wlan_mlme_ucfg_api.h"
  25. #include "wma_types.h"
  26. #include "wmi_unified.h"
  27. #include "wma.h"
  28. #include "wma_internal.h"
  29. #include "wlan_crypto_global_api.h"
  30. #include "wlan_utility.h"
  31. #include "wlan_policy_mgr_ucfg.h"
  32. #include "wlan_vdev_mgr_utils_api.h"
  33. #include <../../core/src/wlan_cm_vdev_api.h>
  34. #include "wlan_psoc_mlme_api.h"
  35. #include "wlan_action_oui_main.h"
  36. #include "target_if.h"
  37. #include "wlan_vdev_mgr_tgt_if_tx_api.h"
  38. #include "wmi_unified_vdev_api.h"
  39. #include "../../core/src/wlan_cp_stats_defs.h"
  40. /* quota in milliseconds */
  41. #define MCC_DUTY_CYCLE 70
  42. QDF_STATUS wlan_mlme_get_cfg_str(uint8_t *dst, struct mlme_cfg_str *cfg_str,
  43. qdf_size_t *len)
  44. {
  45. if (*len < cfg_str->len) {
  46. mlme_legacy_err("Invalid len %zd", *len);
  47. return QDF_STATUS_E_INVAL;
  48. }
  49. *len = cfg_str->len;
  50. qdf_mem_copy(dst, cfg_str->data, *len);
  51. return QDF_STATUS_SUCCESS;
  52. }
  53. QDF_STATUS wlan_mlme_set_cfg_str(uint8_t *src, struct mlme_cfg_str *dst_cfg_str,
  54. qdf_size_t len)
  55. {
  56. if (len > dst_cfg_str->max_len) {
  57. mlme_legacy_err("Invalid len %zd (>%zd)", len,
  58. dst_cfg_str->max_len);
  59. return QDF_STATUS_E_INVAL;
  60. }
  61. dst_cfg_str->len = len;
  62. qdf_mem_copy(dst_cfg_str->data, src, len);
  63. return QDF_STATUS_SUCCESS;
  64. }
  65. uint8_t wlan_mlme_get_tx_power(struct wlan_objmgr_psoc *psoc,
  66. enum band_info band)
  67. {
  68. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  69. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  70. if (!mlme_obj)
  71. return 0;
  72. switch (band) {
  73. case BAND_2G:
  74. return mlme_obj->cfg.power.tx_power_2g;
  75. case BAND_5G:
  76. return mlme_obj->cfg.power.tx_power_5g;
  77. default:
  78. break;
  79. }
  80. return 0;
  81. }
  82. char *wlan_mlme_get_power_usage(struct wlan_objmgr_psoc *psoc)
  83. {
  84. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  85. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  86. if (!mlme_obj)
  87. return NULL;
  88. return mlme_obj->cfg.power.power_usage.data;
  89. }
  90. QDF_STATUS
  91. wlan_mlme_get_enable_deauth_to_disassoc_map(struct wlan_objmgr_psoc *psoc,
  92. bool *value)
  93. {
  94. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  95. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  96. if (!mlme_obj)
  97. return QDF_STATUS_E_INVAL;
  98. *value = mlme_obj->cfg.gen.enable_deauth_to_disassoc_map;
  99. return QDF_STATUS_SUCCESS;
  100. }
  101. QDF_STATUS wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  102. struct mlme_ht_capabilities_info
  103. *ht_cap_info)
  104. {
  105. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  106. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  107. if (!mlme_obj)
  108. return QDF_STATUS_E_FAILURE;
  109. *ht_cap_info = mlme_obj->cfg.ht_caps.ht_cap_info;
  110. return QDF_STATUS_SUCCESS;
  111. }
  112. QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  113. struct mlme_ht_capabilities_info
  114. ht_cap_info)
  115. {
  116. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  117. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  118. if (!mlme_obj)
  119. return QDF_STATUS_E_FAILURE;
  120. mlme_obj->cfg.ht_caps.ht_cap_info = ht_cap_info;
  121. return QDF_STATUS_SUCCESS;
  122. }
  123. QDF_STATUS wlan_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
  124. uint8_t *value)
  125. {
  126. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  127. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  128. if (!mlme_obj)
  129. return QDF_STATUS_E_FAILURE;
  130. *value = mlme_obj->cfg.ht_caps.max_num_amsdu;
  131. return QDF_STATUS_SUCCESS;
  132. }
  133. QDF_STATUS wlan_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
  134. uint8_t value)
  135. {
  136. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  137. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  138. if (!mlme_obj)
  139. return QDF_STATUS_E_FAILURE;
  140. if (!cfg_in_range(CFG_MAX_AMSDU_NUM, value)) {
  141. mlme_legacy_err("Error in setting Max AMSDU Num");
  142. return QDF_STATUS_E_INVAL;
  143. }
  144. mlme_obj->cfg.ht_caps.max_num_amsdu = value;
  145. return QDF_STATUS_SUCCESS;
  146. }
  147. QDF_STATUS wlan_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
  148. uint8_t *value)
  149. {
  150. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  151. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  152. if (!mlme_obj)
  153. return QDF_STATUS_E_FAILURE;
  154. *value = (uint8_t)mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density;
  155. return QDF_STATUS_SUCCESS;
  156. }
  157. QDF_STATUS wlan_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
  158. uint8_t value)
  159. {
  160. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  161. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  162. if (!mlme_obj)
  163. return QDF_STATUS_E_FAILURE;
  164. if (!cfg_in_range(CFG_MPDU_DENSITY, value)) {
  165. mlme_legacy_err("Invalid value %d", value);
  166. return QDF_STATUS_E_INVAL;
  167. }
  168. mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density = value;
  169. return QDF_STATUS_SUCCESS;
  170. }
  171. #ifdef MULTI_CLIENT_LL_SUPPORT
  172. bool wlan_mlme_get_wlm_multi_client_ll_caps(struct wlan_objmgr_psoc *psoc)
  173. {
  174. return wlan_psoc_nif_fw_ext2_cap_get(psoc,
  175. WLAN_SOC_WLM_MULTI_CLIENT_LL_SUPPORT);
  176. }
  177. #endif
  178. #ifdef FEATURE_WLAN_CH_AVOID_EXT
  179. bool wlan_mlme_get_coex_unsafe_chan_nb_user_prefer(
  180. struct wlan_objmgr_psoc *psoc)
  181. {
  182. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  183. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  184. if (!mlme_obj) {
  185. mlme_legacy_err("Failed to get MLME Obj");
  186. return cfg_default(CFG_COEX_UNSAFE_CHAN_NB_USER_PREFER);
  187. }
  188. return mlme_obj->cfg.reg.coex_unsafe_chan_nb_user_prefer;
  189. }
  190. #endif
  191. QDF_STATUS wlan_mlme_get_band_capability(struct wlan_objmgr_psoc *psoc,
  192. uint32_t *band_capability)
  193. {
  194. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  195. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  196. if (!mlme_obj)
  197. return QDF_STATUS_E_FAILURE;
  198. *band_capability = mlme_obj->cfg.gen.band_capability;
  199. return QDF_STATUS_SUCCESS;
  200. }
  201. #ifdef QCA_MULTIPASS_SUPPORT
  202. QDF_STATUS
  203. wlan_mlme_peer_config_vlan(struct wlan_objmgr_vdev *vdev,
  204. uint8_t *mac_addr)
  205. {
  206. QDF_STATUS status;
  207. wmi_unified_t wmi_handle;
  208. struct peer_vlan_config_param param;
  209. wmi_handle = get_wmi_unified_hdl_from_pdev(wlan_vdev_get_pdev(vdev));
  210. if (!wmi_handle) {
  211. mlme_err("unable to get wmi_handle");
  212. return QDF_STATUS_E_INVAL;
  213. }
  214. qdf_mem_set(&param, sizeof(param), 0);
  215. param.rx_cmd = 1;
  216. /* Enabling Rx_insert_inner_vlan_tag */
  217. param.rx_insert_c_tag = 1;
  218. param.vdev_id = wlan_vdev_get_id(vdev);
  219. status = wmi_send_peer_vlan_config(wmi_handle, mac_addr, param);
  220. if (QDF_IS_STATUS_ERROR(status))
  221. return status;
  222. return QDF_STATUS_SUCCESS;
  223. }
  224. #endif
  225. QDF_STATUS wlan_mlme_set_band_capability(struct wlan_objmgr_psoc *psoc,
  226. uint32_t band_capability)
  227. {
  228. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  229. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  230. if (!mlme_obj)
  231. return QDF_STATUS_E_FAILURE;
  232. mlme_obj->cfg.gen.band_capability = band_capability;
  233. return QDF_STATUS_SUCCESS;
  234. }
  235. #ifdef WLAN_VENDOR_HANDOFF_CONTROL
  236. bool wlan_mlme_get_vendor_handoff_control_caps(struct wlan_objmgr_psoc *psoc)
  237. {
  238. return wlan_psoc_nif_fw_ext2_cap_get(psoc,
  239. WLAN_SOC_VENDOR_HANDOFF_CONTROL);
  240. }
  241. #endif
  242. QDF_STATUS wlan_mlme_set_dual_sta_policy(struct wlan_objmgr_psoc *psoc,
  243. uint8_t dual_sta_config)
  244. {
  245. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  246. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  247. if (!mlme_obj)
  248. return QDF_STATUS_E_FAILURE;
  249. mlme_obj->cfg.gen.dual_sta_policy.concurrent_sta_policy =
  250. dual_sta_config;
  251. mlme_debug("Set dual_sta_config to :%d", dual_sta_config);
  252. return QDF_STATUS_SUCCESS;
  253. }
  254. QDF_STATUS wlan_mlme_get_dual_sta_policy(struct wlan_objmgr_psoc *psoc,
  255. uint8_t *dual_sta_config)
  256. {
  257. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  258. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  259. if (!mlme_obj)
  260. return QDF_STATUS_E_FAILURE;
  261. *dual_sta_config =
  262. mlme_obj->cfg.gen.dual_sta_policy.concurrent_sta_policy;
  263. return QDF_STATUS_SUCCESS;
  264. }
  265. enum host_concurrent_ap_policy
  266. wlan_mlme_convert_ap_policy_config(
  267. enum qca_wlan_concurrent_ap_policy_config ap_config)
  268. {
  269. switch (ap_config) {
  270. case QCA_WLAN_CONCURRENT_AP_POLICY_UNSPECIFIED:
  271. return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED;
  272. case QCA_WLAN_CONCURRENT_AP_POLICY_GAMING_AUDIO:
  273. return HOST_CONCURRENT_AP_POLICY_GAMING_AUDIO;
  274. case QCA_WLAN_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING:
  275. return HOST_CONCURRENT_AP_POLICY_LOSSLESS_AUDIO_STREAMING;
  276. case QCA_WLAN_CONCURRENT_AP_POLICY_XR:
  277. return HOST_CONCURRENT_AP_POLICY_XR;
  278. default:
  279. return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED;
  280. }
  281. }
  282. QDF_STATUS wlan_mlme_set_ap_policy(struct wlan_objmgr_vdev *vdev,
  283. enum host_concurrent_ap_policy ap_cfg_policy)
  284. {
  285. struct mlme_legacy_priv *mlme_priv;
  286. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  287. if (!mlme_priv) {
  288. mlme_legacy_err("vdev legacy private object is NULL");
  289. return QDF_STATUS_E_FAILURE;
  290. }
  291. mlme_priv->mlme_ap.ap_policy = ap_cfg_policy;
  292. mlme_debug("Set ap_cfg_policy to :%d", mlme_priv->mlme_ap.ap_policy);
  293. return QDF_STATUS_SUCCESS;
  294. }
  295. enum host_concurrent_ap_policy
  296. wlan_mlme_get_ap_policy(struct wlan_objmgr_vdev *vdev)
  297. {
  298. struct mlme_legacy_priv *mlme_priv;
  299. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  300. if (!mlme_priv) {
  301. mlme_legacy_err("vdev legacy private object is NULL");
  302. return HOST_CONCURRENT_AP_POLICY_UNSPECIFIED;
  303. }
  304. mlme_debug("Get ap_cfg_policy to :%d", mlme_priv->mlme_ap.ap_policy);
  305. return mlme_priv->mlme_ap.ap_policy;
  306. }
  307. QDF_STATUS wlan_mlme_get_prevent_link_down(struct wlan_objmgr_psoc *psoc,
  308. bool *prevent_link_down)
  309. {
  310. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  311. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  312. if (!mlme_obj)
  313. return QDF_STATUS_E_FAILURE;
  314. *prevent_link_down = mlme_obj->cfg.gen.prevent_link_down;
  315. return QDF_STATUS_SUCCESS;
  316. }
  317. QDF_STATUS wlan_mlme_get_select_5ghz_margin(struct wlan_objmgr_psoc *psoc,
  318. uint8_t *select_5ghz_margin)
  319. {
  320. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  321. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  322. if (!mlme_obj)
  323. return QDF_STATUS_E_FAILURE;
  324. *select_5ghz_margin = mlme_obj->cfg.gen.select_5ghz_margin;
  325. return QDF_STATUS_SUCCESS;
  326. }
  327. QDF_STATUS wlan_mlme_get_rtt_mac_randomization(struct wlan_objmgr_psoc *psoc,
  328. bool *rtt_mac_randomization)
  329. {
  330. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  331. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  332. if (!mlme_obj)
  333. return QDF_STATUS_E_FAILURE;
  334. *rtt_mac_randomization = mlme_obj->cfg.gen.rtt_mac_randomization;
  335. return QDF_STATUS_SUCCESS;
  336. }
  337. QDF_STATUS wlan_mlme_get_crash_inject(struct wlan_objmgr_psoc *psoc,
  338. bool *crash_inject)
  339. {
  340. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  341. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  342. if (!mlme_obj)
  343. return QDF_STATUS_E_FAILURE;
  344. *crash_inject = mlme_obj->cfg.gen.crash_inject;
  345. return QDF_STATUS_SUCCESS;
  346. }
  347. QDF_STATUS wlan_mlme_get_lpass_support(struct wlan_objmgr_psoc *psoc,
  348. bool *lpass_support)
  349. {
  350. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  351. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  352. if (!mlme_obj)
  353. return QDF_STATUS_E_FAILURE;
  354. *lpass_support = mlme_obj->cfg.gen.lpass_support;
  355. return QDF_STATUS_SUCCESS;
  356. }
  357. void wlan_mlme_get_wls_6ghz_cap(struct wlan_objmgr_psoc *psoc,
  358. bool *wls_6ghz_capable)
  359. {
  360. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  361. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  362. if (!mlme_obj) {
  363. *wls_6ghz_capable = cfg_default(CFG_WLS_6GHZ_CAPABLE);
  364. return;
  365. }
  366. *wls_6ghz_capable = mlme_obj->cfg.gen.wls_6ghz_capable;
  367. }
  368. QDF_STATUS wlan_mlme_get_self_recovery(struct wlan_objmgr_psoc *psoc,
  369. bool *self_recovery)
  370. {
  371. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  372. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  373. if (!mlme_obj)
  374. return QDF_STATUS_E_FAILURE;
  375. *self_recovery = mlme_obj->cfg.gen.self_recovery;
  376. return QDF_STATUS_SUCCESS;
  377. }
  378. QDF_STATUS wlan_mlme_get_sub_20_chan_width(struct wlan_objmgr_psoc *psoc,
  379. uint8_t *sub_20_chan_width)
  380. {
  381. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  382. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  383. if (!mlme_obj)
  384. return QDF_STATUS_E_FAILURE;
  385. *sub_20_chan_width = mlme_obj->cfg.gen.sub_20_chan_width;
  386. return QDF_STATUS_SUCCESS;
  387. }
  388. QDF_STATUS wlan_mlme_get_fw_timeout_crash(struct wlan_objmgr_psoc *psoc,
  389. bool *fw_timeout_crash)
  390. {
  391. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  392. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  393. if (!mlme_obj)
  394. return QDF_STATUS_E_FAILURE;
  395. *fw_timeout_crash = mlme_obj->cfg.gen.fw_timeout_crash;
  396. return QDF_STATUS_SUCCESS;
  397. }
  398. QDF_STATUS wlan_mlme_get_ito_repeat_count(struct wlan_objmgr_psoc *psoc,
  399. uint8_t *ito_repeat_count)
  400. {
  401. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  402. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  403. if (!mlme_obj)
  404. return QDF_STATUS_E_FAILURE;
  405. *ito_repeat_count = mlme_obj->cfg.gen.ito_repeat_count;
  406. return QDF_STATUS_SUCCESS;
  407. }
  408. void wlan_mlme_get_sap_inactivity_override(struct wlan_objmgr_psoc *psoc,
  409. bool *val)
  410. {
  411. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  412. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  413. if (!mlme_obj)
  414. return;
  415. *val = mlme_obj->cfg.qos_mlme_params.sap_max_inactivity_override;
  416. }
  417. QDF_STATUS wlan_mlme_get_acs_with_more_param(struct wlan_objmgr_psoc *psoc,
  418. bool *value)
  419. {
  420. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  421. if (!mlme_obj)
  422. return QDF_STATUS_E_FAILURE;
  423. *value = mlme_obj->cfg.acs.is_acs_with_more_param;
  424. return QDF_STATUS_SUCCESS;
  425. }
  426. QDF_STATUS wlan_mlme_get_auto_channel_weight(struct wlan_objmgr_psoc *psoc,
  427. uint32_t *value)
  428. {
  429. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  430. if (!mlme_obj) {
  431. *value = cfg_default(CFG_AUTO_CHANNEL_SELECT_WEIGHT);
  432. return QDF_STATUS_E_FAILURE;
  433. }
  434. *value = mlme_obj->cfg.acs.auto_channel_select_weight;
  435. return QDF_STATUS_SUCCESS;
  436. }
  437. QDF_STATUS wlan_mlme_get_vendor_acs_support(struct wlan_objmgr_psoc *psoc,
  438. bool *value)
  439. {
  440. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  441. if (!mlme_obj)
  442. return QDF_STATUS_E_FAILURE;
  443. *value = mlme_obj->cfg.acs.is_vendor_acs_support;
  444. return QDF_STATUS_SUCCESS;
  445. }
  446. QDF_STATUS
  447. wlan_mlme_get_acs_support_for_dfs_ltecoex(struct wlan_objmgr_psoc *psoc,
  448. bool *value)
  449. {
  450. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  451. if (!mlme_obj)
  452. return QDF_STATUS_E_FAILURE;
  453. *value = mlme_obj->cfg.acs.is_acs_support_for_dfs_ltecoex;
  454. return QDF_STATUS_SUCCESS;
  455. }
  456. QDF_STATUS
  457. wlan_mlme_get_external_acs_policy(struct wlan_objmgr_psoc *psoc,
  458. bool *value)
  459. {
  460. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  461. if (!mlme_obj)
  462. return QDF_STATUS_E_FAILURE;
  463. *value = mlme_obj->cfg.acs.is_external_acs_policy;
  464. return QDF_STATUS_SUCCESS;
  465. }
  466. QDF_STATUS wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc *psoc,
  467. bool *value)
  468. {
  469. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  470. if (!mlme_obj)
  471. return QDF_STATUS_E_FAILURE;
  472. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_cck;
  473. return QDF_STATUS_SUCCESS;
  474. }
  475. QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc,
  476. uint8_t *value)
  477. {
  478. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  479. if (!mlme_obj)
  480. return QDF_STATUS_E_FAILURE;
  481. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_1ss;
  482. return QDF_STATUS_SUCCESS;
  483. }
  484. bool
  485. wlan_mlme_is_data_stall_recovery_fw_supported(struct wlan_objmgr_psoc *psoc)
  486. {
  487. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  488. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  489. if (!mlme_obj) {
  490. mlme_err("MLME obj is NULL");
  491. return false;
  492. }
  493. return mlme_obj->cfg.gen.data_stall_recovery_fw_support;
  494. }
  495. void
  496. wlan_mlme_update_cfg_with_tgt_caps(struct wlan_objmgr_psoc *psoc,
  497. struct mlme_tgt_caps *tgt_caps)
  498. {
  499. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  500. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  501. if (!mlme_obj)
  502. return;
  503. /* Update the mlme cfg according to the tgt capability received */
  504. mlme_obj->cfg.gen.data_stall_recovery_fw_support =
  505. tgt_caps->data_stall_recovery_fw_support;
  506. mlme_obj->cfg.gen.bigtk_support = tgt_caps->bigtk_support;
  507. mlme_obj->cfg.gen.stop_all_host_scan_support =
  508. tgt_caps->stop_all_host_scan_support;
  509. mlme_obj->cfg.gen.dual_sta_roam_fw_support =
  510. tgt_caps->dual_sta_roam_fw_support;
  511. mlme_obj->cfg.gen.ocv_support = tgt_caps->ocv_support;
  512. }
  513. void
  514. wlan_mlme_update_aux_dev_caps(
  515. struct wlan_objmgr_psoc *psoc,
  516. struct wlan_mlme_aux_dev_caps wlan_mlme_aux_dev_caps[])
  517. {
  518. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  519. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  520. if (!mlme_obj)
  521. return;
  522. qdf_mem_copy(&mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps[0],
  523. &wlan_mlme_aux_dev_caps[0],
  524. sizeof(mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps));
  525. }
  526. bool wlan_mlme_cfg_get_aux_supported_modes(
  527. struct wlan_objmgr_psoc *psoc,
  528. uint32_t aux_index,
  529. enum wlan_mlme_hw_mode_config_type hw_mode_id,
  530. uint32_t *supported_modes_bitmap)
  531. {
  532. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  533. struct wlan_mlme_aux_dev_caps *wlan_mlme_aux0_dev_caps;
  534. if (aux_index != 0) {
  535. mlme_err("current only support aux0");
  536. return false;
  537. }
  538. if (hw_mode_id >= WLAN_MLME_HW_MODE_MAX) {
  539. mlme_err("invalid hw mode id %d.", hw_mode_id);
  540. return false;
  541. }
  542. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  543. if (!mlme_obj) {
  544. mlme_err("MLME obj is NULL");
  545. return false;
  546. }
  547. wlan_mlme_aux0_dev_caps = mlme_obj->cfg.gen.wlan_mlme_aux0_dev_caps;
  548. *supported_modes_bitmap =
  549. wlan_mlme_aux0_dev_caps[hw_mode_id].supported_modes_bitmap;
  550. return true;
  551. }
  552. #ifdef WLAN_FEATURE_11AX
  553. QDF_STATUS wlan_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc *psoc,
  554. uint32_t *value)
  555. {
  556. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  557. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  558. if (!mlme_obj)
  559. return QDF_STATUS_E_FAILURE;
  560. *value = mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu;
  561. return QDF_STATUS_SUCCESS;
  562. }
  563. QDF_STATUS mlme_cfg_get_he_caps(struct wlan_objmgr_psoc *psoc,
  564. tDot11fIEhe_cap *he_cap)
  565. {
  566. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  567. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  568. if (!mlme_obj)
  569. return QDF_STATUS_E_FAILURE;
  570. *he_cap = mlme_obj->cfg.he_caps.he_cap_orig;
  571. return QDF_STATUS_SUCCESS;
  572. }
  573. QDF_STATUS wlan_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc *psoc,
  574. uint32_t value)
  575. {
  576. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  577. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  578. if (!mlme_obj)
  579. return QDF_STATUS_E_FAILURE;
  580. if (!cfg_in_range(CFG_HE_UL_MUMIMO, value)) {
  581. mlme_legacy_debug("Failed to set CFG_HE_UL_MUMIMO with %d",
  582. value);
  583. return QDF_STATUS_E_FAILURE;
  584. }
  585. mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = value;
  586. return QDF_STATUS_SUCCESS;
  587. }
  588. QDF_STATUS wlan_mlme_cfg_get_enable_ul_mimo(struct wlan_objmgr_psoc *psoc,
  589. uint8_t *value)
  590. {
  591. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  592. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  593. if (!mlme_obj)
  594. return QDF_STATUS_E_FAILURE;
  595. *value = mlme_obj->cfg.he_caps.enable_ul_mimo;
  596. return QDF_STATUS_SUCCESS;
  597. }
  598. QDF_STATUS wlan_mlme_cfg_get_enable_ul_ofdm(struct wlan_objmgr_psoc *psoc,
  599. uint8_t *value)
  600. {
  601. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  602. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  603. if (!mlme_obj)
  604. return QDF_STATUS_E_FAILURE;
  605. *value = mlme_obj->cfg.he_caps.enable_ul_ofdm;
  606. return QDF_STATUS_SUCCESS;
  607. }
  608. /* mlme_get_min_rate_cap() - get minimum capability for HE-MCS between
  609. * ini value and fw capability.
  610. *
  611. * Rx HE-MCS Map and Tx HE-MCS Map subfields format where 2-bit indicates
  612. * 0 indicates support for HE-MCS 0-7 for n spatial streams
  613. * 1 indicates support for HE-MCS 0-9 for n spatial streams
  614. * 2 indicates support for HE-MCS 0-11 for n spatial streams
  615. * 3 indicates that n spatial streams is not supported for HE PPDUs
  616. *
  617. */
  618. static uint16_t mlme_get_min_rate_cap(uint16_t val1, uint16_t val2)
  619. {
  620. uint16_t ret = 0, i;
  621. for (i = 0; i < 8; i++) {
  622. if (((val1 >> (2 * i)) & 0x3) == 0x3 ||
  623. ((val2 >> (2 * i)) & 0x3) == 0x3) {
  624. ret |= 0x3 << (2 * i);
  625. continue;
  626. }
  627. ret |= QDF_MIN((val1 >> (2 * i)) & 0x3,
  628. (val2 >> (2 * i)) & 0x3) << (2 * i);
  629. }
  630. return ret;
  631. }
  632. QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc,
  633. struct wma_tgt_cfg *wma_cfg)
  634. {
  635. uint8_t chan_width;
  636. QDF_STATUS status = QDF_STATUS_SUCCESS;
  637. tDot11fIEhe_cap *he_cap = &wma_cfg->he_cap;
  638. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  639. uint8_t value;
  640. uint16_t tx_mcs_map = 0;
  641. uint16_t rx_mcs_map = 0;
  642. uint8_t nss;
  643. if (!mlme_obj)
  644. return QDF_STATUS_E_FAILURE;
  645. mlme_obj->cfg.he_caps.dot11_he_cap.present = 1;
  646. mlme_obj->cfg.he_caps.dot11_he_cap.htc_he = he_cap->htc_he;
  647. value = QDF_MIN(he_cap->twt_request,
  648. mlme_obj->cfg.he_caps.dot11_he_cap.twt_request);
  649. mlme_obj->cfg.he_caps.dot11_he_cap.twt_request = value;
  650. value = QDF_MIN(he_cap->fragmentation,
  651. mlme_obj->cfg.he_caps.he_dynamic_fragmentation);
  652. if (cfg_in_range(CFG_HE_FRAGMENTATION, value))
  653. mlme_obj->cfg.he_caps.dot11_he_cap.fragmentation = value;
  654. if (cfg_in_range(CFG_HE_MAX_FRAG_MSDU,
  655. he_cap->max_num_frag_msdu_amsdu_exp))
  656. mlme_obj->cfg.he_caps.dot11_he_cap.max_num_frag_msdu_amsdu_exp =
  657. he_cap->max_num_frag_msdu_amsdu_exp;
  658. if (cfg_in_range(CFG_HE_MIN_FRAG_SIZE, he_cap->min_frag_size))
  659. mlme_obj->cfg.he_caps.dot11_he_cap.min_frag_size =
  660. he_cap->min_frag_size;
  661. if (cfg_in_range(CFG_HE_TRIG_PAD, he_cap->trigger_frm_mac_pad))
  662. mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad =
  663. QDF_MIN(he_cap->trigger_frm_mac_pad,
  664. mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad);
  665. if (cfg_in_range(CFG_HE_MTID_AGGR_RX, he_cap->multi_tid_aggr_rx_supp))
  666. mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_rx_supp =
  667. he_cap->multi_tid_aggr_rx_supp;
  668. if (cfg_in_range(CFG_HE_MTID_AGGR_TX, he_cap->multi_tid_aggr_tx_supp))
  669. mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_tx_supp =
  670. he_cap->multi_tid_aggr_tx_supp;
  671. if (cfg_in_range(CFG_HE_LINK_ADAPTATION, he_cap->he_link_adaptation))
  672. mlme_obj->cfg.he_caps.dot11_he_cap.he_link_adaptation =
  673. he_cap->he_link_adaptation;
  674. mlme_obj->cfg.he_caps.dot11_he_cap.all_ack = he_cap->all_ack;
  675. mlme_obj->cfg.he_caps.dot11_he_cap.trigd_rsp_sched =
  676. he_cap->trigd_rsp_sched;
  677. mlme_obj->cfg.he_caps.dot11_he_cap.a_bsr = he_cap->a_bsr;
  678. value = QDF_MIN(he_cap->broadcast_twt,
  679. mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt);
  680. mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt = value;
  681. mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched =
  682. he_cap->flex_twt_sched;
  683. mlme_obj->cfg.he_caps.dot11_he_cap.ba_32bit_bitmap =
  684. he_cap->ba_32bit_bitmap;
  685. mlme_obj->cfg.he_caps.dot11_he_cap.mu_cascade = he_cap->mu_cascade;
  686. mlme_obj->cfg.he_caps.dot11_he_cap.ack_enabled_multitid =
  687. he_cap->ack_enabled_multitid;
  688. mlme_obj->cfg.he_caps.dot11_he_cap.omi_a_ctrl = he_cap->omi_a_ctrl;
  689. mlme_obj->cfg.he_caps.dot11_he_cap.ofdma_ra = he_cap->ofdma_ra;
  690. if (cfg_in_range(CFG_HE_MAX_AMPDU_LEN, he_cap->max_ampdu_len_exp_ext))
  691. mlme_obj->cfg.he_caps.dot11_he_cap.max_ampdu_len_exp_ext =
  692. he_cap->max_ampdu_len_exp_ext;
  693. mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_frag = he_cap->amsdu_frag;
  694. mlme_obj->cfg.he_caps.dot11_he_cap.rx_ctrl_frame =
  695. he_cap->rx_ctrl_frame;
  696. mlme_obj->cfg.he_caps.dot11_he_cap.bsrp_ampdu_aggr =
  697. he_cap->bsrp_ampdu_aggr;
  698. mlme_obj->cfg.he_caps.dot11_he_cap.qtp = he_cap->qtp;
  699. mlme_obj->cfg.he_caps.dot11_he_cap.a_bqr = he_cap->a_bqr;
  700. mlme_obj->cfg.he_caps.dot11_he_cap.spatial_reuse_param_rspder =
  701. he_cap->spatial_reuse_param_rspder;
  702. mlme_obj->cfg.he_caps.dot11_he_cap.ndp_feedback_supp =
  703. he_cap->ndp_feedback_supp;
  704. mlme_obj->cfg.he_caps.dot11_he_cap.ops_supp = he_cap->ops_supp;
  705. mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_in_ampdu =
  706. he_cap->amsdu_in_ampdu;
  707. mlme_obj->cfg.he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp =
  708. he_cap->he_sub_ch_sel_tx_supp;
  709. mlme_obj->cfg.he_caps.dot11_he_cap.ul_2x996_tone_ru_supp =
  710. he_cap->ul_2x996_tone_ru_supp;
  711. mlme_obj->cfg.he_caps.dot11_he_cap.om_ctrl_ul_mu_data_dis_rx =
  712. he_cap->om_ctrl_ul_mu_data_dis_rx;
  713. mlme_obj->cfg.he_caps.dot11_he_cap.he_dynamic_smps =
  714. he_cap->he_dynamic_smps;
  715. mlme_obj->cfg.he_caps.dot11_he_cap.punctured_sounding_supp =
  716. he_cap->punctured_sounding_supp;
  717. mlme_obj->cfg.he_caps.dot11_he_cap.ht_vht_trg_frm_rx_supp =
  718. he_cap->ht_vht_trg_frm_rx_supp;
  719. chan_width = HE_CH_WIDTH_COMBINE(he_cap->chan_width_0,
  720. he_cap->chan_width_1,
  721. he_cap->chan_width_2,
  722. he_cap->chan_width_3,
  723. he_cap->chan_width_4,
  724. he_cap->chan_width_5,
  725. he_cap->chan_width_6);
  726. if (cfg_in_range(CFG_HE_CHAN_WIDTH, chan_width)) {
  727. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_0 =
  728. he_cap->chan_width_0;
  729. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_1 =
  730. he_cap->chan_width_1;
  731. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_2 =
  732. he_cap->chan_width_2;
  733. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_3 =
  734. he_cap->chan_width_3;
  735. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_4 =
  736. he_cap->chan_width_4;
  737. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_5 =
  738. he_cap->chan_width_5;
  739. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_6 =
  740. he_cap->chan_width_6;
  741. }
  742. if (cfg_in_range(CFG_HE_RX_PREAM_PUNC, he_cap->rx_pream_puncturing))
  743. mlme_obj->cfg.he_caps.dot11_he_cap.rx_pream_puncturing =
  744. he_cap->rx_pream_puncturing;
  745. mlme_obj->cfg.he_caps.dot11_he_cap.device_class = he_cap->device_class;
  746. mlme_obj->cfg.he_caps.dot11_he_cap.ldpc_coding = he_cap->ldpc_coding;
  747. if (cfg_in_range(CFG_HE_LTF_PPDU, he_cap->he_1x_ltf_800_gi_ppdu))
  748. mlme_obj->cfg.he_caps.dot11_he_cap.he_1x_ltf_800_gi_ppdu =
  749. he_cap->he_1x_ltf_800_gi_ppdu;
  750. if (cfg_in_range(CFG_HE_MIDAMBLE_RX_MAX_NSTS,
  751. he_cap->midamble_tx_rx_max_nsts))
  752. mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_max_nsts =
  753. he_cap->midamble_tx_rx_max_nsts;
  754. mlme_obj->cfg.he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp =
  755. he_cap->he_4x_ltf_3200_gi_ndp;
  756. if (mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc) {
  757. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
  758. he_cap->rx_stbc_lt_80mhz;
  759. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
  760. he_cap->rx_stbc_gt_80mhz;
  761. } else {
  762. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz = 0;
  763. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz = 0;
  764. }
  765. if (mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc) {
  766. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz =
  767. he_cap->tb_ppdu_tx_stbc_lt_80mhz;
  768. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz =
  769. he_cap->tb_ppdu_tx_stbc_gt_80mhz;
  770. } else {
  771. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz = 0;
  772. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz = 0;
  773. }
  774. if (cfg_in_range(CFG_HE_DOPPLER, he_cap->doppler))
  775. mlme_obj->cfg.he_caps.dot11_he_cap.doppler = he_cap->doppler;
  776. if (cfg_in_range(CFG_HE_DCM_TX, he_cap->dcm_enc_tx))
  777. mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_tx =
  778. he_cap->dcm_enc_tx;
  779. if (cfg_in_range(CFG_HE_DCM_RX, he_cap->dcm_enc_rx))
  780. mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_rx =
  781. he_cap->dcm_enc_rx;
  782. mlme_obj->cfg.he_caps.dot11_he_cap.ul_he_mu = he_cap->ul_he_mu;
  783. if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) {
  784. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer =
  785. he_cap->su_beamformer;
  786. if (cfg_in_range(CFG_HE_NUM_SOUND_LT80,
  787. he_cap->num_sounding_lt_80))
  788. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 =
  789. he_cap->num_sounding_lt_80;
  790. if (cfg_in_range(CFG_HE_NUM_SOUND_GT80,
  791. he_cap->num_sounding_gt_80))
  792. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 =
  793. he_cap->num_sounding_gt_80;
  794. mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer =
  795. he_cap->mu_beamformer;
  796. } else {
  797. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer = 0;
  798. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 = 0;
  799. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 = 0;
  800. mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer = 0;
  801. }
  802. if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) {
  803. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee =
  804. he_cap->su_beamformee;
  805. if (cfg_in_range(CFG_HE_BFEE_STS_LT80, he_cap->bfee_sts_lt_80))
  806. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 =
  807. he_cap->bfee_sts_lt_80;
  808. if (cfg_in_range(CFG_HE_BFEE_STS_GT80, he_cap->bfee_sts_gt_80))
  809. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 =
  810. he_cap->bfee_sts_gt_80;
  811. } else {
  812. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee = 0;
  813. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 = 0;
  814. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 = 0;
  815. }
  816. mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = he_cap->ul_mu;
  817. mlme_obj->cfg.he_caps.dot11_he_cap.su_feedback_tone16 =
  818. he_cap->su_feedback_tone16;
  819. mlme_obj->cfg.he_caps.dot11_he_cap.mu_feedback_tone16 =
  820. he_cap->mu_feedback_tone16;
  821. mlme_obj->cfg.he_caps.dot11_he_cap.codebook_su = he_cap->codebook_su;
  822. mlme_obj->cfg.he_caps.dot11_he_cap.codebook_mu = he_cap->codebook_mu;
  823. if (cfg_in_range(CFG_HE_BFRM_FEED, he_cap->beamforming_feedback))
  824. mlme_obj->cfg.he_caps.dot11_he_cap.beamforming_feedback =
  825. he_cap->beamforming_feedback;
  826. mlme_obj->cfg.he_caps.dot11_he_cap.he_er_su_ppdu =
  827. he_cap->he_er_su_ppdu;
  828. mlme_obj->cfg.he_caps.dot11_he_cap.dl_mu_mimo_part_bw =
  829. he_cap->dl_mu_mimo_part_bw;
  830. mlme_obj->cfg.he_caps.dot11_he_cap.ppet_present = he_cap->ppet_present;
  831. mlme_obj->cfg.he_caps.dot11_he_cap.srp = he_cap->srp;
  832. mlme_obj->cfg.he_caps.dot11_he_cap.power_boost = he_cap->power_boost;
  833. mlme_obj->cfg.he_caps.dot11_he_cap.he_ltf_800_gi_4x =
  834. he_cap->he_ltf_800_gi_4x;
  835. if (cfg_in_range(CFG_HE_MAX_NC, he_cap->max_nc))
  836. mlme_obj->cfg.he_caps.dot11_he_cap.max_nc = he_cap->max_nc;
  837. mlme_obj->cfg.he_caps.dot11_he_cap.er_he_ltf_800_gi_4x =
  838. he_cap->er_he_ltf_800_gi_4x;
  839. mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G =
  840. he_cap->he_ppdu_20_in_40Mhz_2G;
  841. mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz =
  842. he_cap->he_ppdu_20_in_160_80p80Mhz;
  843. mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz =
  844. he_cap->he_ppdu_80_in_160_80p80Mhz;
  845. mlme_obj->cfg.he_caps.dot11_he_cap.er_1x_he_ltf_gi =
  846. he_cap->er_1x_he_ltf_gi;
  847. mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_1x_he_ltf =
  848. he_cap->midamble_tx_rx_1x_he_ltf;
  849. if (cfg_in_range(CFG_HE_DCM_MAX_BW, he_cap->dcm_max_bw))
  850. mlme_obj->cfg.he_caps.dot11_he_cap.dcm_max_bw =
  851. he_cap->dcm_max_bw;
  852. mlme_obj->cfg.he_caps.dot11_he_cap.longer_than_16_he_sigb_ofdm_sym =
  853. he_cap->longer_than_16_he_sigb_ofdm_sym;
  854. mlme_obj->cfg.he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru =
  855. he_cap->tx_1024_qam_lt_242_tone_ru;
  856. mlme_obj->cfg.he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru =
  857. he_cap->rx_1024_qam_lt_242_tone_ru;
  858. mlme_obj->cfg.he_caps.dot11_he_cap.non_trig_cqi_feedback =
  859. he_cap->non_trig_cqi_feedback;
  860. mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb =
  861. he_cap->rx_full_bw_su_he_mu_compress_sigb;
  862. mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb =
  863. he_cap->rx_full_bw_su_he_mu_non_cmpr_sigb;
  864. tx_mcs_map = mlme_get_min_rate_cap(
  865. mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80,
  866. he_cap->tx_he_mcs_map_lt_80);
  867. rx_mcs_map = mlme_get_min_rate_cap(
  868. mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80,
  869. he_cap->rx_he_mcs_map_lt_80);
  870. if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) {
  871. nss = 2;
  872. tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss);
  873. rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss);
  874. }
  875. if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
  876. mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
  877. rx_mcs_map;
  878. if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
  879. mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
  880. tx_mcs_map;
  881. tx_mcs_map = mlme_get_min_rate_cap(
  882. *((uint16_t *)mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_160),
  883. *((uint16_t *)he_cap->tx_he_mcs_map_160));
  884. rx_mcs_map = mlme_get_min_rate_cap(
  885. *((uint16_t *)mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_160),
  886. *((uint16_t *)he_cap->rx_he_mcs_map_160));
  887. if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) {
  888. nss = 2;
  889. tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss);
  890. rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss);
  891. }
  892. if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, rx_mcs_map))
  893. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  894. rx_he_mcs_map_160,
  895. &rx_mcs_map, sizeof(uint16_t));
  896. if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, tx_mcs_map))
  897. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  898. tx_he_mcs_map_160,
  899. &tx_mcs_map, sizeof(uint16_t));
  900. if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80,
  901. *((uint16_t *)he_cap->rx_he_mcs_map_80_80)))
  902. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  903. rx_he_mcs_map_80_80,
  904. he_cap->rx_he_mcs_map_80_80, sizeof(uint16_t));
  905. if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80,
  906. *((uint16_t *)he_cap->tx_he_mcs_map_80_80)))
  907. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  908. tx_he_mcs_map_80_80,
  909. he_cap->tx_he_mcs_map_80_80, sizeof(uint16_t));
  910. qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_2g, wma_cfg->ppet_2g,
  911. HE_MAX_PPET_SIZE);
  912. qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_5g, wma_cfg->ppet_5g,
  913. HE_MAX_PPET_SIZE);
  914. mlme_obj->cfg.he_caps.he_cap_orig = mlme_obj->cfg.he_caps.dot11_he_cap;
  915. /* Take intersection of host and FW capabilities */
  916. mlme_obj->cfg.he_caps.he_mcs_12_13_supp_2g &=
  917. wma_cfg->he_mcs_12_13_supp_2g;
  918. mlme_obj->cfg.he_caps.he_mcs_12_13_supp_5g &=
  919. wma_cfg->he_mcs_12_13_supp_5g;
  920. mlme_debug("mcs_12_13 2G: %x 5G: %x FW_cap: 2G: %x 5G: %x",
  921. mlme_obj->cfg.he_caps.he_mcs_12_13_supp_2g,
  922. mlme_obj->cfg.he_caps.he_mcs_12_13_supp_5g,
  923. wma_cfg->he_mcs_12_13_supp_2g,
  924. wma_cfg->he_mcs_12_13_supp_5g);
  925. return status;
  926. }
  927. #ifdef WLAN_FEATURE_SR
  928. void
  929. wlan_mlme_get_sr_enable_modes(struct wlan_objmgr_psoc *psoc, uint8_t *val)
  930. {
  931. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  932. if (!mlme_obj) {
  933. *val = cfg_default(CFG_SR_ENABLE_MODES);
  934. return;
  935. }
  936. *val = mlme_obj->cfg.gen.sr_enable_modes;
  937. }
  938. #endif
  939. #endif
  940. #ifdef WLAN_FEATURE_11BE
  941. QDF_STATUS mlme_update_tgt_eht_caps_in_cfg(struct wlan_objmgr_psoc *psoc,
  942. struct wma_tgt_cfg *wma_cfg)
  943. {
  944. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  945. tDot11fIEeht_cap *eht_cap = &wma_cfg->eht_cap;
  946. tDot11fIEeht_cap *mlme_eht_cap;
  947. bool eht_capab;
  948. if (!mlme_obj)
  949. return QDF_STATUS_E_FAILURE;
  950. wlan_psoc_mlme_get_11be_capab(psoc, &eht_capab);
  951. if (!eht_capab)
  952. return QDF_STATUS_SUCCESS;
  953. mlme_obj->cfg.eht_caps.dot11_eht_cap.present = 1;
  954. qdf_mem_copy(&mlme_obj->cfg.eht_caps.dot11_eht_cap, eht_cap,
  955. sizeof(tDot11fIEeht_cap));
  956. mlme_eht_cap = &mlme_obj->cfg.eht_caps.dot11_eht_cap;
  957. if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) {
  958. mlme_eht_cap->su_beamformer = eht_cap->su_beamformer;
  959. if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_LE_80MHZ,
  960. eht_cap->num_sounding_dim_le_80mhz))
  961. mlme_eht_cap->num_sounding_dim_le_80mhz =
  962. eht_cap->num_sounding_dim_le_80mhz;
  963. if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_160MHZ,
  964. eht_cap->num_sounding_dim_160mhz))
  965. mlme_eht_cap->num_sounding_dim_160mhz =
  966. eht_cap->num_sounding_dim_160mhz;
  967. if (cfg_in_range(CFG_EHT_NUM_SOUNDING_DIM_320MHZ,
  968. eht_cap->num_sounding_dim_320mhz))
  969. mlme_eht_cap->num_sounding_dim_320mhz =
  970. eht_cap->num_sounding_dim_320mhz;
  971. mlme_eht_cap->mu_bformer_le_80mhz =
  972. eht_cap->mu_bformer_le_80mhz;
  973. mlme_eht_cap->mu_bformer_160mhz = eht_cap->mu_bformer_160mhz;
  974. mlme_eht_cap->mu_bformer_320mhz = eht_cap->mu_bformer_320mhz;
  975. } else {
  976. mlme_eht_cap->su_beamformer = 0;
  977. mlme_eht_cap->num_sounding_dim_le_80mhz = 0;
  978. mlme_eht_cap->num_sounding_dim_160mhz = 0;
  979. mlme_eht_cap->num_sounding_dim_320mhz = 0;
  980. mlme_eht_cap->mu_bformer_le_80mhz = 0;
  981. mlme_eht_cap->mu_bformer_160mhz = 0;
  982. mlme_eht_cap->mu_bformer_320mhz = 0;
  983. }
  984. if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) {
  985. mlme_eht_cap->su_beamformee = eht_cap->su_beamformee;
  986. if (cfg_in_range(CFG_EHT_BFEE_SS_LE_80MHZ,
  987. eht_cap->bfee_ss_le_80mhz))
  988. mlme_eht_cap->bfee_ss_le_80mhz =
  989. eht_cap->bfee_ss_le_80mhz;
  990. if (cfg_in_range(CFG_EHT_BFEE_SS_160MHZ,
  991. eht_cap->bfee_ss_160mhz))
  992. mlme_eht_cap->bfee_ss_160mhz = eht_cap->bfee_ss_160mhz;
  993. if (cfg_in_range(CFG_EHT_BFEE_SS_320MHZ,
  994. eht_cap->bfee_ss_320mhz))
  995. mlme_eht_cap->bfee_ss_320mhz = eht_cap->bfee_ss_320mhz;
  996. } else {
  997. mlme_eht_cap->su_beamformee = 0;
  998. mlme_eht_cap->bfee_ss_le_80mhz = 0;
  999. mlme_eht_cap->bfee_ss_160mhz = 0;
  1000. mlme_eht_cap->bfee_ss_320mhz = 0;
  1001. }
  1002. mlme_obj->cfg.eht_caps.eht_cap_orig =
  1003. mlme_obj->cfg.eht_caps.dot11_eht_cap;
  1004. return QDF_STATUS_SUCCESS;
  1005. }
  1006. QDF_STATUS mlme_update_tgt_mlo_caps_in_cfg(struct wlan_objmgr_psoc *psoc)
  1007. {
  1008. struct target_psoc_info *tgt_hdl;
  1009. QDF_STATUS status;
  1010. uint16_t value;
  1011. tgt_hdl = wlan_psoc_get_tgt_if_handle(psoc);
  1012. if (!tgt_hdl) {
  1013. mlme_debug("target psoc info is NULL");
  1014. return QDF_STATUS_E_FAILURE;
  1015. }
  1016. value = target_if_res_cfg_get_num_max_mlo_link(tgt_hdl);
  1017. status = wlan_mlme_set_sta_mlo_conn_max_num(psoc, value);
  1018. mlme_debug("Max ML link supported: %d", value);
  1019. return status;
  1020. }
  1021. enum phy_ch_width wlan_mlme_convert_eht_op_bw_to_phy_ch_width(
  1022. uint8_t channel_width)
  1023. {
  1024. enum phy_ch_width phy_bw = CH_WIDTH_20MHZ;
  1025. if (channel_width == WLAN_EHT_CHWIDTH_320)
  1026. phy_bw = CH_WIDTH_320MHZ;
  1027. else if (channel_width == WLAN_EHT_CHWIDTH_160)
  1028. phy_bw = CH_WIDTH_160MHZ;
  1029. else if (channel_width == WLAN_EHT_CHWIDTH_80)
  1030. phy_bw = CH_WIDTH_80MHZ;
  1031. else if (channel_width == WLAN_EHT_CHWIDTH_40)
  1032. phy_bw = CH_WIDTH_40MHZ;
  1033. return phy_bw;
  1034. }
  1035. bool wlan_mlme_get_epcs_capability(struct wlan_objmgr_psoc *psoc)
  1036. {
  1037. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1038. if (!mlme_obj)
  1039. return true;
  1040. return mlme_obj->cfg.sta.epcs_capability;
  1041. }
  1042. void wlan_mlme_set_epcs_capability(struct wlan_objmgr_psoc *psoc, bool flag)
  1043. {
  1044. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1045. if (!mlme_obj)
  1046. return;
  1047. mlme_debug("set mlme epcs capability from %d to %d",
  1048. mlme_obj->cfg.sta.epcs_capability, flag);
  1049. mlme_obj->cfg.sta.epcs_capability = flag;
  1050. }
  1051. bool wlan_mlme_get_usr_disable_sta_eht(struct wlan_objmgr_psoc *psoc)
  1052. {
  1053. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1054. if (!mlme_obj)
  1055. return true;
  1056. return mlme_obj->cfg.sta.usr_disable_eht;
  1057. }
  1058. void wlan_mlme_set_usr_disable_sta_eht(struct wlan_objmgr_psoc *psoc,
  1059. bool disable)
  1060. {
  1061. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1062. if (!mlme_obj)
  1063. return;
  1064. mlme_debug("set usr_disable_eht from %d to %d",
  1065. mlme_obj->cfg.sta.usr_disable_eht, disable);
  1066. mlme_obj->cfg.sta.usr_disable_eht = disable;
  1067. }
  1068. enum phy_ch_width wlan_mlme_get_max_bw(void)
  1069. {
  1070. uint32_t max_bw = wma_get_eht_ch_width();
  1071. if (max_bw == WNI_CFG_EHT_CHANNEL_WIDTH_320MHZ)
  1072. return CH_WIDTH_320MHZ;
  1073. else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
  1074. return CH_WIDTH_160MHZ;
  1075. else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
  1076. return CH_WIDTH_80P80MHZ;
  1077. else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
  1078. return CH_WIDTH_80MHZ;
  1079. else
  1080. return CH_WIDTH_40MHZ;
  1081. }
  1082. #else
  1083. enum phy_ch_width wlan_mlme_get_max_bw(void)
  1084. {
  1085. uint32_t max_bw = wma_get_vht_ch_width();
  1086. if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
  1087. return CH_WIDTH_160MHZ;
  1088. else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
  1089. return CH_WIDTH_80P80MHZ;
  1090. else if (max_bw == WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
  1091. return CH_WIDTH_80MHZ;
  1092. else
  1093. return CH_WIDTH_40MHZ;
  1094. }
  1095. #endif
  1096. QDF_STATUS wlan_mlme_get_sta_ch_width(struct wlan_objmgr_vdev *vdev,
  1097. enum phy_ch_width *ch_width)
  1098. {
  1099. QDF_STATUS status = QDF_STATUS_E_INVAL;
  1100. struct wlan_objmgr_peer *peer;
  1101. enum wlan_phymode phymode;
  1102. enum QDF_OPMODE op_mode;
  1103. peer = wlan_vdev_get_bsspeer(vdev);
  1104. op_mode = wlan_vdev_mlme_get_opmode(vdev);
  1105. if (ch_width && peer &&
  1106. (op_mode == QDF_STA_MODE ||
  1107. op_mode == QDF_P2P_CLIENT_MODE)) {
  1108. wlan_peer_obj_lock(peer);
  1109. phymode = wlan_peer_get_phymode(peer);
  1110. wlan_peer_obj_unlock(peer);
  1111. *ch_width = wlan_mlme_get_ch_width_from_phymode(phymode);
  1112. }
  1113. return status;
  1114. }
  1115. #ifdef WLAN_FEATURE_11BE_MLO
  1116. uint8_t wlan_mlme_get_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc)
  1117. {
  1118. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1119. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1120. if (!mlme_obj)
  1121. return false;
  1122. return mlme_obj->cfg.sta.mlo_max_simultaneous_links;
  1123. }
  1124. QDF_STATUS
  1125. wlan_mlme_set_sta_mlo_simultaneous_links(struct wlan_objmgr_psoc *psoc,
  1126. uint8_t value)
  1127. {
  1128. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1129. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1130. if (!mlme_obj)
  1131. return QDF_STATUS_E_FAILURE;
  1132. mlme_obj->cfg.sta.mlo_max_simultaneous_links = value;
  1133. mlme_legacy_debug("mlo_max_simultaneous_links %d", value);
  1134. return QDF_STATUS_SUCCESS;
  1135. }
  1136. uint8_t wlan_mlme_get_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc)
  1137. {
  1138. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1139. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1140. if (!mlme_obj)
  1141. return false;
  1142. return mlme_obj->cfg.sta.mlo_support_link_num;
  1143. }
  1144. QDF_STATUS wlan_mlme_set_sta_mlo_conn_max_num(struct wlan_objmgr_psoc *psoc,
  1145. uint8_t value)
  1146. {
  1147. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1148. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1149. if (!mlme_obj)
  1150. return QDF_STATUS_E_FAILURE;
  1151. if (!value)
  1152. mlme_obj->cfg.sta.mlo_support_link_num =
  1153. cfg_default(CFG_MLO_SUPPORT_LINK_NUM);
  1154. else
  1155. mlme_obj->cfg.sta.mlo_support_link_num = value;
  1156. mlme_legacy_debug("mlo_support_link_num %d", value);
  1157. return QDF_STATUS_SUCCESS;
  1158. }
  1159. QDF_STATUS wlan_mlme_set_user_set_link_num(struct wlan_objmgr_psoc *psoc,
  1160. uint8_t value)
  1161. {
  1162. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1163. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1164. if (!mlme_obj)
  1165. return QDF_STATUS_E_FAILURE;
  1166. mlme_obj->cfg.sta.user_set_link_num = value;
  1167. mlme_legacy_debug("user_set_link_num %d", value);
  1168. return QDF_STATUS_SUCCESS;
  1169. }
  1170. void wlan_mlme_restore_user_set_link_num(struct wlan_objmgr_psoc *psoc)
  1171. {
  1172. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1173. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1174. if (!mlme_obj)
  1175. return;
  1176. if (!mlme_obj->cfg.sta.user_set_link_num)
  1177. return;
  1178. mlme_obj->cfg.sta.mlo_support_link_num =
  1179. mlme_obj->cfg.sta.user_set_link_num;
  1180. mlme_legacy_debug("restore mlo_support_link_num %d",
  1181. mlme_obj->cfg.sta.user_set_link_num);
  1182. }
  1183. void wlan_mlme_clear_user_set_link_num(struct wlan_objmgr_psoc *psoc)
  1184. {
  1185. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1186. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1187. if (!mlme_obj)
  1188. return;
  1189. mlme_obj->cfg.sta.user_set_link_num = 0;
  1190. }
  1191. uint8_t wlan_mlme_get_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc)
  1192. {
  1193. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1194. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1195. if (!mlme_obj)
  1196. return false;
  1197. return mlme_obj->cfg.sta.mlo_support_link_band;
  1198. }
  1199. QDF_STATUS wlan_mlme_set_sta_mlo_conn_band_bmp(struct wlan_objmgr_psoc *psoc,
  1200. uint8_t value)
  1201. {
  1202. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1203. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1204. if (!mlme_obj)
  1205. return QDF_STATUS_E_FAILURE;
  1206. mlme_obj->cfg.sta.mlo_support_link_band = value;
  1207. mlme_legacy_debug("mlo_support_link_conn band %d", value);
  1208. return QDF_STATUS_SUCCESS;
  1209. }
  1210. void
  1211. wlan_mlme_get_mlo_prefer_percentage(struct wlan_objmgr_psoc *psoc,
  1212. int8_t *mlo_prefer_percentage)
  1213. {
  1214. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1215. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1216. if (!mlme_obj) {
  1217. mlme_legacy_err("invalid mlo object");
  1218. return;
  1219. }
  1220. *mlo_prefer_percentage = mlme_obj->cfg.sta.mlo_prefer_percentage;
  1221. mlme_legacy_debug("mlo_prefer_percentage %d", *mlo_prefer_percentage);
  1222. }
  1223. bool wlan_mlme_get_sta_same_link_mld_addr(struct wlan_objmgr_psoc *psoc)
  1224. {
  1225. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1226. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1227. if (!mlme_obj)
  1228. return false;
  1229. return mlme_obj->cfg.sta.mlo_same_link_mld_address;
  1230. }
  1231. #endif
  1232. QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc,
  1233. uint16_t *value)
  1234. {
  1235. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1236. if (!mlme_obj)
  1237. return QDF_STATUS_E_FAILURE;
  1238. *value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains;
  1239. return QDF_STATUS_SUCCESS;
  1240. }
  1241. QDF_STATUS wlan_mlme_get_bt_chain_separation_flag(struct wlan_objmgr_psoc *psoc,
  1242. bool *value)
  1243. {
  1244. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1245. if (!mlme_obj)
  1246. return QDF_STATUS_E_FAILURE;
  1247. *value = mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation;
  1248. return QDF_STATUS_SUCCESS;
  1249. }
  1250. QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc,
  1251. uint16_t *value)
  1252. {
  1253. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1254. if (!mlme_obj)
  1255. return QDF_STATUS_E_FAILURE;
  1256. *value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains;
  1257. return QDF_STATUS_SUCCESS;
  1258. }
  1259. static
  1260. bool wlan_mlme_configure_chain_mask_supported(struct wlan_objmgr_psoc *psoc)
  1261. {
  1262. struct wma_caps_per_phy non_dbs_phy_cap = {0};
  1263. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1264. QDF_STATUS status;
  1265. bool as_enabled, enable_bt_chain_sep, enable2x2;
  1266. uint8_t dual_mac_feature;
  1267. bool hw_dbs_2x2_cap;
  1268. if (!mlme_obj)
  1269. return false;
  1270. status = wma_get_caps_for_phyidx_hwmode(&non_dbs_phy_cap,
  1271. HW_MODE_DBS_NONE,
  1272. CDS_BAND_ALL);
  1273. if (QDF_IS_STATUS_ERROR(status)) {
  1274. mlme_legacy_err("couldn't get phy caps. skip chain mask programming");
  1275. return false;
  1276. }
  1277. if (non_dbs_phy_cap.tx_chain_mask_2G < 3 ||
  1278. non_dbs_phy_cap.rx_chain_mask_2G < 3 ||
  1279. non_dbs_phy_cap.tx_chain_mask_5G < 3 ||
  1280. non_dbs_phy_cap.rx_chain_mask_5G < 3) {
  1281. mlme_legacy_debug("firmware not capable. skip chain mask programming");
  1282. return false;
  1283. }
  1284. enable_bt_chain_sep =
  1285. mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation;
  1286. as_enabled = mlme_obj->cfg.gen.as_enabled;
  1287. ucfg_policy_mgr_get_dual_mac_feature(psoc, &dual_mac_feature);
  1288. hw_dbs_2x2_cap = policy_mgr_is_hw_dbs_2x2_capable(psoc);
  1289. enable2x2 = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2;
  1290. if ((enable2x2 && !enable_bt_chain_sep) || as_enabled ||
  1291. (!hw_dbs_2x2_cap && (dual_mac_feature != DISABLE_DBS_CXN_AND_SCAN) &&
  1292. enable2x2)) {
  1293. mlme_legacy_debug("Cannot configure chainmask enable_bt_chain_sep %d as_enabled %d enable2x2 %d hw_dbs_2x2_cap %d dual_mac_feature %d",
  1294. enable_bt_chain_sep, as_enabled, enable2x2,
  1295. hw_dbs_2x2_cap, dual_mac_feature);
  1296. return false;
  1297. }
  1298. return true;
  1299. }
  1300. bool wlan_mlme_is_chain_mask_supported(struct wlan_objmgr_psoc *psoc)
  1301. {
  1302. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1303. if (!mlme_obj)
  1304. return false;
  1305. if (!wlan_mlme_configure_chain_mask_supported(psoc))
  1306. return false;
  1307. /* If user has configured 1x1 from INI */
  1308. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 != 3 ||
  1309. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1 != 3) {
  1310. mlme_legacy_debug("txchainmask1x1 %d rxchainmask1x1 %d",
  1311. mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
  1312. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
  1313. return false;
  1314. }
  1315. return true;
  1316. }
  1317. #define MAX_PDEV_CHAIN_MASK_PARAMS 6
  1318. /* params being sent:
  1319. * wmi_pdev_param_tx_chain_mask
  1320. * wmi_pdev_param_rx_chain_mask
  1321. * wmi_pdev_param_tx_chain_mask_2g
  1322. * wmi_pdev_param_rx_chain_mask_2g
  1323. * wmi_pdev_param_tx_chain_mask_5g
  1324. * wmi_pdev_param_rx_chain_mask_5g
  1325. */
  1326. QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc,
  1327. uint8_t session_id)
  1328. {
  1329. QDF_STATUS ret_val = QDF_STATUS_E_FAILURE;
  1330. uint8_t ch_msk_val;
  1331. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1332. bool mrc_disabled_2g_rx, mrc_disabled_2g_tx;
  1333. bool mrc_disabled_5g_rx, mrc_disabled_5g_tx;
  1334. struct dev_set_param setparam[MAX_PDEV_CHAIN_MASK_PARAMS];
  1335. uint8_t index = 0;
  1336. if (!mlme_obj)
  1337. return QDF_STATUS_E_FAILURE;
  1338. mlme_legacy_debug("txchainmask1x1: %d rxchainmask1x1: %d",
  1339. mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
  1340. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
  1341. mlme_legacy_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d",
  1342. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g,
  1343. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g);
  1344. mlme_legacy_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d",
  1345. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g,
  1346. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g);
  1347. mrc_disabled_2g_rx =
  1348. mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_2GHZ];
  1349. mrc_disabled_2g_tx =
  1350. mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_2GHZ];
  1351. mrc_disabled_5g_rx =
  1352. mlme_obj->cfg.nss_chains_ini_cfg.disable_rx_mrc[NSS_CHAINS_BAND_5GHZ];
  1353. mrc_disabled_5g_tx =
  1354. mlme_obj->cfg.nss_chains_ini_cfg.disable_tx_mrc[NSS_CHAINS_BAND_5GHZ];
  1355. mlme_legacy_debug("MRC values TX:- 2g %d 5g %d RX:- 2g %d 5g %d",
  1356. mrc_disabled_2g_tx, mrc_disabled_5g_tx,
  1357. mrc_disabled_2g_rx, mrc_disabled_5g_rx);
  1358. if (!wlan_mlme_configure_chain_mask_supported(psoc))
  1359. return QDF_STATUS_E_FAILURE;
  1360. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) {
  1361. ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1;
  1362. if (wma_validate_txrx_chain_mask(wmi_pdev_param_tx_chain_mask,
  1363. ch_msk_val)) {
  1364. goto error;
  1365. }
  1366. ret_val = mlme_check_index_setparam(
  1367. setparam,
  1368. wmi_pdev_param_tx_chain_mask,
  1369. ch_msk_val, index++,
  1370. MAX_PDEV_CHAIN_MASK_PARAMS);
  1371. if (QDF_IS_STATUS_ERROR(ret_val)) {
  1372. mlme_err("failed at wmi_pdev_param_tx_chain_mask");
  1373. goto error;
  1374. }
  1375. }
  1376. if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  1377. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1;
  1378. if (wma_validate_txrx_chain_mask(wmi_pdev_param_rx_chain_mask,
  1379. ch_msk_val)) {
  1380. goto error;
  1381. }
  1382. ret_val = mlme_check_index_setparam(
  1383. setparam,
  1384. wmi_pdev_param_rx_chain_mask,
  1385. ch_msk_val, index++,
  1386. MAX_PDEV_CHAIN_MASK_PARAMS);
  1387. if (QDF_IS_STATUS_ERROR(ret_val)) {
  1388. mlme_err("failed at wmi_pdev_param_rx_chain_mask");
  1389. goto error;
  1390. }
  1391. }
  1392. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 ||
  1393. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  1394. mlme_legacy_debug("band agnostic tx/rx chain mask set. skip per band chain mask");
  1395. goto sendparam;
  1396. }
  1397. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g &&
  1398. mrc_disabled_2g_tx) {
  1399. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g;
  1400. ret_val = mlme_check_index_setparam(
  1401. setparam,
  1402. wmi_pdev_param_tx_chain_mask_2g,
  1403. ch_msk_val, index++,
  1404. MAX_PDEV_CHAIN_MASK_PARAMS);
  1405. if (QDF_IS_STATUS_ERROR(ret_val)) {
  1406. mlme_err("failed at wmi_pdev_param_tx_chain_mask_2g");
  1407. goto error;
  1408. }
  1409. }
  1410. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g &&
  1411. mrc_disabled_2g_rx) {
  1412. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g;
  1413. ret_val = mlme_check_index_setparam(
  1414. setparam,
  1415. wmi_pdev_param_rx_chain_mask_2g,
  1416. ch_msk_val, index++,
  1417. MAX_PDEV_CHAIN_MASK_PARAMS);
  1418. if (QDF_IS_STATUS_ERROR(ret_val)) {
  1419. mlme_err("failed at wmi_pdev_param_rx_chain_mask_2g");
  1420. goto error;
  1421. }
  1422. }
  1423. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g &&
  1424. mrc_disabled_5g_tx) {
  1425. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g;
  1426. ret_val = mlme_check_index_setparam(
  1427. setparam,
  1428. wmi_pdev_param_tx_chain_mask_5g,
  1429. ch_msk_val, index++,
  1430. MAX_PDEV_CHAIN_MASK_PARAMS);
  1431. if (QDF_IS_STATUS_ERROR(ret_val)) {
  1432. mlme_err("failed at wmi_pdev_param_tx_chain_mask_5g");
  1433. goto error;
  1434. }
  1435. }
  1436. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g &&
  1437. mrc_disabled_5g_rx) {
  1438. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g;
  1439. ret_val = mlme_check_index_setparam(
  1440. setparam,
  1441. wmi_pdev_param_rx_chain_mask_5g,
  1442. ch_msk_val, index++,
  1443. MAX_PDEV_CHAIN_MASK_PARAMS);
  1444. if (QDF_IS_STATUS_ERROR(ret_val)) {
  1445. mlme_err("failed at wmi_pdev_param_rx_chain_mask_5g");
  1446. goto error;
  1447. }
  1448. }
  1449. sendparam:
  1450. ret_val = wma_send_multi_pdev_vdev_set_params(MLME_PDEV_SETPARAM,
  1451. WMI_PDEV_ID_SOC, setparam,
  1452. index);
  1453. if (QDF_IS_STATUS_ERROR(ret_val))
  1454. mlme_err("failed to send chainmask params");
  1455. error:
  1456. return ret_val;
  1457. }
  1458. QDF_STATUS
  1459. wlan_mlme_get_manufacturer_name(struct wlan_objmgr_psoc *psoc,
  1460. uint8_t *pbuf, uint32_t *plen)
  1461. {
  1462. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1463. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1464. if (!mlme_obj)
  1465. return QDF_STATUS_E_FAILURE;
  1466. *plen = qdf_str_lcopy(pbuf,
  1467. mlme_obj->cfg.product_details.manufacturer_name,
  1468. *plen);
  1469. return QDF_STATUS_SUCCESS;
  1470. }
  1471. QDF_STATUS
  1472. wlan_mlme_get_model_number(struct wlan_objmgr_psoc *psoc,
  1473. uint8_t *pbuf, uint32_t *plen)
  1474. {
  1475. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1476. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1477. if (!mlme_obj)
  1478. return QDF_STATUS_E_FAILURE;
  1479. *plen = qdf_str_lcopy(pbuf,
  1480. mlme_obj->cfg.product_details.model_number,
  1481. *plen);
  1482. return QDF_STATUS_SUCCESS;
  1483. }
  1484. QDF_STATUS
  1485. wlan_mlme_get_model_name(struct wlan_objmgr_psoc *psoc,
  1486. uint8_t *pbuf, uint32_t *plen)
  1487. {
  1488. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1489. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1490. if (!mlme_obj)
  1491. return QDF_STATUS_E_FAILURE;
  1492. *plen = qdf_str_lcopy(pbuf,
  1493. mlme_obj->cfg.product_details.model_name,
  1494. *plen);
  1495. return QDF_STATUS_SUCCESS;
  1496. }
  1497. QDF_STATUS
  1498. wlan_mlme_get_manufacture_product_version(struct wlan_objmgr_psoc *psoc,
  1499. uint8_t *pbuf, uint32_t *plen)
  1500. {
  1501. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1502. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1503. if (!mlme_obj)
  1504. return QDF_STATUS_E_FAILURE;
  1505. *plen = qdf_str_lcopy(pbuf,
  1506. mlme_obj->cfg.product_details.manufacture_product_version,
  1507. *plen);
  1508. return QDF_STATUS_SUCCESS;
  1509. }
  1510. QDF_STATUS
  1511. wlan_mlme_get_manufacture_product_name(struct wlan_objmgr_psoc *psoc,
  1512. uint8_t *pbuf, uint32_t *plen)
  1513. {
  1514. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1515. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1516. if (!mlme_obj)
  1517. return QDF_STATUS_E_FAILURE;
  1518. *plen = qdf_str_lcopy(pbuf,
  1519. mlme_obj->cfg.product_details.manufacture_product_name,
  1520. *plen);
  1521. return QDF_STATUS_SUCCESS;
  1522. }
  1523. void wlan_mlme_get_tl_delayed_trgr_frm_int(struct wlan_objmgr_psoc *psoc,
  1524. uint32_t *value)
  1525. {
  1526. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1527. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1528. if (!mlme_obj) {
  1529. *value = cfg_default(CFG_TL_DELAYED_TRGR_FRM_INTERVAL);
  1530. return;
  1531. }
  1532. *value = mlme_obj->cfg.wmm_params.delayed_trigger_frm_int;
  1533. }
  1534. QDF_STATUS wlan_mlme_get_wmm_dir_ac_vo(struct wlan_objmgr_psoc *psoc,
  1535. uint8_t *value)
  1536. {
  1537. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1538. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1539. if (!mlme_obj)
  1540. return QDF_STATUS_E_FAILURE;
  1541. *value = mlme_obj->cfg.wmm_params.ac_vo.dir_ac_vo;
  1542. return QDF_STATUS_SUCCESS;
  1543. }
  1544. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vo(struct wlan_objmgr_psoc *psoc,
  1545. uint16_t *value)
  1546. {
  1547. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1548. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1549. if (!mlme_obj)
  1550. return QDF_STATUS_E_FAILURE;
  1551. *value = mlme_obj->cfg.wmm_params.ac_vo.nom_msdu_size_ac_vo;
  1552. return QDF_STATUS_SUCCESS;
  1553. }
  1554. QDF_STATUS
  1555. wlan_mlme_get_wmm_mean_data_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
  1556. uint32_t *value)
  1557. {
  1558. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1559. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1560. if (!mlme_obj)
  1561. return QDF_STATUS_E_FAILURE;
  1562. *value = mlme_obj->cfg.wmm_params.ac_vo.mean_data_rate_ac_vo;
  1563. return QDF_STATUS_SUCCESS;
  1564. }
  1565. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
  1566. uint32_t *value)
  1567. {
  1568. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1569. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1570. if (!mlme_obj)
  1571. return QDF_STATUS_E_FAILURE;
  1572. *value = mlme_obj->cfg.wmm_params.ac_vo.min_phy_rate_ac_vo;
  1573. return QDF_STATUS_SUCCESS;
  1574. }
  1575. QDF_STATUS
  1576. wlan_mlme_get_wmm_sba_ac_vo(struct wlan_objmgr_psoc *psoc, uint16_t *value)
  1577. {
  1578. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1579. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1580. if (!mlme_obj) {
  1581. return QDF_STATUS_E_FAILURE;
  1582. }
  1583. *value = mlme_obj->cfg.wmm_params.ac_vo.sba_ac_vo;
  1584. return QDF_STATUS_SUCCESS;
  1585. }
  1586. QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_srv_intv(struct wlan_objmgr_psoc *psoc,
  1587. uint32_t *value)
  1588. {
  1589. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1590. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1591. if (!mlme_obj)
  1592. return QDF_STATUS_E_FAILURE;
  1593. *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_srv_intv;
  1594. return QDF_STATUS_SUCCESS;
  1595. }
  1596. QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc *psoc,
  1597. uint32_t *value)
  1598. {
  1599. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1600. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1601. if (!mlme_obj)
  1602. return QDF_STATUS_E_FAILURE;
  1603. *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_sus_intv;
  1604. return QDF_STATUS_SUCCESS;
  1605. }
  1606. QDF_STATUS wlan_mlme_cfg_get_vht_ampdu_len_exp(struct wlan_objmgr_psoc *psoc,
  1607. uint8_t *value)
  1608. {
  1609. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1610. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1611. if (!mlme_obj)
  1612. return QDF_STATUS_E_FAILURE;
  1613. *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len_exponent;
  1614. return QDF_STATUS_SUCCESS;
  1615. }
  1616. QDF_STATUS wlan_mlme_cfg_get_vht_max_mpdu_len(struct wlan_objmgr_psoc *psoc,
  1617. uint8_t *value)
  1618. {
  1619. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1620. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1621. if (!mlme_obj)
  1622. return QDF_STATUS_E_FAILURE;
  1623. *value = mlme_obj->cfg.vht_caps.vht_cap_info.ampdu_len;
  1624. return QDF_STATUS_SUCCESS;
  1625. }
  1626. QDF_STATUS wlan_mlme_cfg_get_ht_smps(struct wlan_objmgr_psoc *psoc,
  1627. uint8_t *value)
  1628. {
  1629. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1630. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1631. if (!mlme_obj)
  1632. return QDF_STATUS_E_FAILURE;
  1633. *value = mlme_obj->cfg.ht_caps.smps;
  1634. return QDF_STATUS_SUCCESS;
  1635. }
  1636. QDF_STATUS
  1637. wlan_mlme_get_wmm_dir_ac_vi(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1638. {
  1639. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1640. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1641. if (!mlme_obj)
  1642. return QDF_STATUS_E_FAILURE;
  1643. *value = mlme_obj->cfg.wmm_params.ac_vi.dir_ac_vi;
  1644. return QDF_STATUS_SUCCESS;
  1645. }
  1646. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vi(struct wlan_objmgr_psoc *psoc,
  1647. uint16_t *value)
  1648. {
  1649. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1650. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1651. if (!mlme_obj)
  1652. return QDF_STATUS_E_FAILURE;
  1653. *value =
  1654. mlme_obj->cfg.wmm_params.ac_vi.nom_msdu_size_ac_vi;
  1655. return QDF_STATUS_SUCCESS;
  1656. }
  1657. QDF_STATUS
  1658. wlan_mlme_get_wmm_mean_data_rate_ac_vi(struct wlan_objmgr_psoc *psoc,
  1659. uint32_t *value)
  1660. {
  1661. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1662. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1663. if (!mlme_obj)
  1664. return QDF_STATUS_E_FAILURE;
  1665. *value = mlme_obj->cfg.wmm_params.ac_vi.mean_data_rate_ac_vi;
  1666. return QDF_STATUS_SUCCESS;
  1667. }
  1668. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vi(struct wlan_objmgr_psoc *psoc,
  1669. uint32_t *value)
  1670. {
  1671. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1672. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1673. if (!mlme_obj)
  1674. return QDF_STATUS_E_FAILURE;
  1675. *value = mlme_obj->cfg.wmm_params.ac_vi.min_phy_rate_ac_vi;
  1676. return QDF_STATUS_SUCCESS;
  1677. }
  1678. QDF_STATUS wlan_mlme_get_wmm_sba_ac_vi(struct wlan_objmgr_psoc *psoc,
  1679. uint16_t *value)
  1680. {
  1681. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1682. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1683. if (!mlme_obj)
  1684. return QDF_STATUS_E_FAILURE;
  1685. *value = mlme_obj->cfg.wmm_params.ac_vi.sba_ac_vi;
  1686. return QDF_STATUS_SUCCESS;
  1687. }
  1688. QDF_STATUS
  1689. wlan_mlme_get_wmm_uapsd_vi_srv_intv(struct wlan_objmgr_psoc *psoc,
  1690. uint32_t *value)
  1691. {
  1692. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1693. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1694. if (!mlme_obj)
  1695. return QDF_STATUS_E_FAILURE;
  1696. *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_srv_intv;
  1697. return QDF_STATUS_SUCCESS;
  1698. }
  1699. QDF_STATUS wlan_mlme_get_wmm_uapsd_vi_sus_intv(struct wlan_objmgr_psoc *psoc,
  1700. uint32_t *value)
  1701. {
  1702. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1703. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1704. if (!mlme_obj)
  1705. return QDF_STATUS_E_FAILURE;
  1706. *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_sus_intv;
  1707. return QDF_STATUS_SUCCESS;
  1708. }
  1709. QDF_STATUS
  1710. wlan_mlme_get_wmm_dir_ac_be(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1711. {
  1712. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1713. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1714. if (!mlme_obj)
  1715. return QDF_STATUS_E_FAILURE;
  1716. *value = mlme_obj->cfg.wmm_params.ac_be.dir_ac_be;
  1717. return QDF_STATUS_SUCCESS;
  1718. }
  1719. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_be(struct wlan_objmgr_psoc *psoc,
  1720. uint16_t *value)
  1721. {
  1722. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1723. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1724. if (!mlme_obj)
  1725. return QDF_STATUS_E_FAILURE;
  1726. *value = mlme_obj->cfg.wmm_params.ac_be.nom_msdu_size_ac_be;
  1727. return QDF_STATUS_SUCCESS;
  1728. }
  1729. QDF_STATUS
  1730. wlan_mlme_get_wmm_mean_data_rate_ac_be(struct wlan_objmgr_psoc *psoc,
  1731. uint32_t *value)
  1732. {
  1733. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1734. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1735. if (!mlme_obj)
  1736. return QDF_STATUS_E_FAILURE;
  1737. *value = mlme_obj->cfg.wmm_params.ac_be.mean_data_rate_ac_be;
  1738. return QDF_STATUS_SUCCESS;
  1739. }
  1740. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_be(struct wlan_objmgr_psoc *psoc,
  1741. uint32_t *value)
  1742. {
  1743. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1744. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1745. if (!mlme_obj)
  1746. return QDF_STATUS_E_FAILURE;
  1747. *value = mlme_obj->cfg.wmm_params.ac_be.min_phy_rate_ac_be;
  1748. return QDF_STATUS_SUCCESS;
  1749. }
  1750. QDF_STATUS
  1751. wlan_mlme_get_wmm_sba_ac_be(struct wlan_objmgr_psoc *psoc, uint16_t *value)
  1752. {
  1753. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1754. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1755. if (!mlme_obj)
  1756. return QDF_STATUS_E_FAILURE;
  1757. *value = mlme_obj->cfg.wmm_params.ac_be.sba_ac_be;
  1758. return QDF_STATUS_SUCCESS;
  1759. }
  1760. QDF_STATUS wlan_mlme_get_wmm_uapsd_be_srv_intv(struct wlan_objmgr_psoc *psoc,
  1761. uint32_t *value)
  1762. {
  1763. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1764. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1765. if (!mlme_obj)
  1766. return QDF_STATUS_E_FAILURE;
  1767. *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_srv_intv;
  1768. return QDF_STATUS_SUCCESS;
  1769. }
  1770. QDF_STATUS wlan_mlme_get_wmm_uapsd_be_sus_intv(struct wlan_objmgr_psoc *psoc,
  1771. uint32_t *value)
  1772. {
  1773. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1774. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1775. if (!mlme_obj)
  1776. return QDF_STATUS_E_FAILURE;
  1777. *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_sus_intv;
  1778. return QDF_STATUS_SUCCESS;
  1779. }
  1780. QDF_STATUS
  1781. wlan_mlme_get_wmm_dir_ac_bk(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1782. {
  1783. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1784. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1785. if (!mlme_obj)
  1786. return QDF_STATUS_E_FAILURE;
  1787. *value = mlme_obj->cfg.wmm_params.ac_bk.dir_ac_bk;
  1788. return QDF_STATUS_SUCCESS;
  1789. }
  1790. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_bk(struct wlan_objmgr_psoc *psoc,
  1791. uint16_t *value)
  1792. {
  1793. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1794. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1795. if (!mlme_obj)
  1796. return QDF_STATUS_E_FAILURE;
  1797. *value = mlme_obj->cfg.wmm_params.ac_bk.nom_msdu_size_ac_bk;
  1798. return QDF_STATUS_SUCCESS;
  1799. }
  1800. QDF_STATUS
  1801. wlan_mlme_get_wmm_mean_data_rate_ac_bk(struct wlan_objmgr_psoc *psoc,
  1802. uint32_t *value)
  1803. {
  1804. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1805. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1806. if (!mlme_obj)
  1807. return QDF_STATUS_E_FAILURE;
  1808. *value = mlme_obj->cfg.wmm_params.ac_bk.mean_data_rate_ac_bk;
  1809. return QDF_STATUS_SUCCESS;
  1810. }
  1811. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_bk(struct wlan_objmgr_psoc *psoc,
  1812. uint32_t *value)
  1813. {
  1814. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1815. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1816. if (!mlme_obj)
  1817. return QDF_STATUS_E_FAILURE;
  1818. *value = mlme_obj->cfg.wmm_params.ac_bk.min_phy_rate_ac_bk;
  1819. return QDF_STATUS_SUCCESS;
  1820. }
  1821. QDF_STATUS
  1822. wlan_mlme_get_wmm_sba_ac_bk(struct wlan_objmgr_psoc *psoc, uint16_t *value)
  1823. {
  1824. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1825. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1826. if (!mlme_obj)
  1827. return QDF_STATUS_E_FAILURE;
  1828. *value = mlme_obj->cfg.wmm_params.ac_bk.sba_ac_bk;
  1829. return QDF_STATUS_SUCCESS;
  1830. }
  1831. QDF_STATUS
  1832. wlan_mlme_get_wmm_uapsd_bk_srv_intv(struct wlan_objmgr_psoc *psoc,
  1833. uint32_t *value)
  1834. {
  1835. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1836. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1837. if (!mlme_obj)
  1838. return QDF_STATUS_E_FAILURE;
  1839. *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_srv_intv;
  1840. return QDF_STATUS_SUCCESS;
  1841. }
  1842. QDF_STATUS
  1843. wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc,
  1844. uint32_t *value)
  1845. {
  1846. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1847. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1848. if (!mlme_obj)
  1849. return QDF_STATUS_E_FAILURE;
  1850. *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_sus_intv;
  1851. return QDF_STATUS_SUCCESS;
  1852. }
  1853. QDF_STATUS
  1854. wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1855. {
  1856. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1857. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1858. if (!mlme_obj)
  1859. return QDF_STATUS_E_FAILURE;
  1860. *value = mlme_obj->cfg.wmm_params.wmm_config.wmm_mode;
  1861. return QDF_STATUS_SUCCESS;
  1862. }
  1863. QDF_STATUS
  1864. wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  1865. {
  1866. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1867. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1868. if (!mlme_obj)
  1869. return QDF_STATUS_E_FAILURE;
  1870. *value = mlme_obj->cfg.wmm_params.wmm_config.b80211e_is_enabled;
  1871. return QDF_STATUS_SUCCESS;
  1872. }
  1873. QDF_STATUS
  1874. wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1875. {
  1876. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1877. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1878. if (!mlme_obj)
  1879. return QDF_STATUS_E_FAILURE;
  1880. *value = mlme_obj->cfg.wmm_params.wmm_config.uapsd_mask;
  1881. return QDF_STATUS_SUCCESS;
  1882. }
  1883. #ifdef FEATURE_WLAN_ESE
  1884. void wlan_mlme_get_inactivity_interval(struct wlan_objmgr_psoc *psoc,
  1885. uint32_t *value)
  1886. {
  1887. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1888. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1889. if (!mlme_obj) {
  1890. *value = cfg_default(CFG_QOS_WMM_INACTIVITY_INTERVAL);
  1891. return;
  1892. }
  1893. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.inactivity_intv;
  1894. }
  1895. #endif
  1896. void wlan_mlme_get_is_ts_burst_size_enable(struct wlan_objmgr_psoc *psoc,
  1897. bool *value)
  1898. {
  1899. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1900. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1901. if (!mlme_obj) {
  1902. *value = cfg_default(CFG_QOS_WMM_BURST_SIZE_DEFN);
  1903. return;
  1904. }
  1905. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.burst_size_def;
  1906. }
  1907. void wlan_mlme_get_ts_info_ack_policy(struct wlan_objmgr_psoc *psoc,
  1908. enum mlme_ts_info_ack_policy *value)
  1909. {
  1910. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1911. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1912. if (!mlme_obj) {
  1913. *value = cfg_default(CFG_QOS_WMM_TS_INFO_ACK_POLICY);
  1914. return;
  1915. }
  1916. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_ack_policy;
  1917. }
  1918. QDF_STATUS
  1919. wlan_mlme_get_ts_acm_value_for_ac(struct wlan_objmgr_psoc *psoc, bool *value)
  1920. {
  1921. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1922. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1923. if (!mlme_obj)
  1924. return QDF_STATUS_E_FAILURE;
  1925. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_acm_is_off;
  1926. return QDF_STATUS_SUCCESS;
  1927. }
  1928. QDF_STATUS wlan_mlme_get_listen_interval(struct wlan_objmgr_psoc *psoc,
  1929. int *value)
  1930. {
  1931. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1932. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1933. if (!mlme_obj)
  1934. return QDF_STATUS_E_FAILURE;
  1935. *value = mlme_obj->cfg.sap_cfg.listen_interval;
  1936. return QDF_STATUS_SUCCESS;
  1937. }
  1938. QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc,
  1939. int value)
  1940. {
  1941. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1942. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1943. if (!mlme_obj)
  1944. return QDF_STATUS_E_FAILURE;
  1945. if (cfg_in_range(CFG_LISTEN_INTERVAL, value))
  1946. mlme_obj->cfg.sap_cfg.listen_interval = value;
  1947. else
  1948. return QDF_STATUS_E_FAILURE;
  1949. return QDF_STATUS_SUCCESS;
  1950. }
  1951. QDF_STATUS wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc *psoc,
  1952. int value)
  1953. {
  1954. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1955. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1956. if (!mlme_obj)
  1957. return QDF_STATUS_E_FAILURE;
  1958. if (cfg_in_range(CFG_ASSOC_STA_LIMIT, value) &&
  1959. (value <= mlme_obj->cfg.sap_cfg.sap_max_no_peers))
  1960. mlme_obj->cfg.sap_cfg.assoc_sta_limit = value;
  1961. else
  1962. return QDF_STATUS_E_FAILURE;
  1963. return QDF_STATUS_SUCCESS;
  1964. }
  1965. QDF_STATUS wlan_mlme_get_assoc_sta_limit(struct wlan_objmgr_psoc *psoc,
  1966. int *value)
  1967. {
  1968. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1969. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1970. if (!mlme_obj)
  1971. return QDF_STATUS_E_FAILURE;
  1972. *value = mlme_obj->cfg.sap_cfg.assoc_sta_limit;
  1973. return QDF_STATUS_SUCCESS;
  1974. }
  1975. QDF_STATUS wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
  1976. bool *value)
  1977. {
  1978. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1979. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1980. if (!mlme_obj)
  1981. return QDF_STATUS_E_FAILURE;
  1982. *value = mlme_obj->cfg.sap_cfg.sap_get_peer_info;
  1983. return QDF_STATUS_SUCCESS;
  1984. }
  1985. QDF_STATUS wlan_mlme_set_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
  1986. bool value)
  1987. {
  1988. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  1989. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  1990. if (!mlme_obj)
  1991. return QDF_STATUS_E_FAILURE;
  1992. mlme_obj->cfg.sap_cfg.sap_get_peer_info = value;
  1993. return QDF_STATUS_SUCCESS;
  1994. }
  1995. QDF_STATUS
  1996. wlan_mlme_get_sap_bcast_deauth_enabled(struct wlan_objmgr_psoc *psoc,
  1997. bool *value)
  1998. {
  1999. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2000. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2001. if (!mlme_obj)
  2002. return QDF_STATUS_E_FAILURE;
  2003. *value = mlme_obj->cfg.sap_cfg.is_sap_bcast_deauth_enabled;
  2004. return QDF_STATUS_SUCCESS;
  2005. }
  2006. QDF_STATUS
  2007. wlan_mlme_is_6g_sap_fd_enabled(struct wlan_objmgr_psoc *psoc,
  2008. bool *value)
  2009. {
  2010. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2011. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2012. if (!mlme_obj)
  2013. return QDF_STATUS_E_FAILURE;
  2014. *value = mlme_obj->cfg.sap_cfg.is_6g_sap_fd_enabled;
  2015. return QDF_STATUS_SUCCESS;
  2016. }
  2017. QDF_STATUS wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc *psoc,
  2018. bool *value)
  2019. {
  2020. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2021. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2022. if (!mlme_obj)
  2023. return QDF_STATUS_E_FAILURE;
  2024. *value = mlme_obj->cfg.sap_cfg.sap_allow_all_chan_param_name;
  2025. return QDF_STATUS_SUCCESS;
  2026. }
  2027. QDF_STATUS wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc *psoc,
  2028. int *value)
  2029. {
  2030. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2031. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2032. if (!mlme_obj)
  2033. return QDF_STATUS_E_FAILURE;
  2034. *value = mlme_obj->cfg.sap_cfg.sap_max_no_peers;
  2035. return QDF_STATUS_SUCCESS;
  2036. }
  2037. QDF_STATUS wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc *psoc,
  2038. int value)
  2039. {
  2040. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2041. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2042. if (!mlme_obj)
  2043. return QDF_STATUS_E_FAILURE;
  2044. if (cfg_in_range(CFG_SAP_MAX_NO_PEERS, value))
  2045. mlme_obj->cfg.sap_cfg.sap_max_no_peers = value;
  2046. else
  2047. return QDF_STATUS_E_FAILURE;
  2048. return QDF_STATUS_SUCCESS;
  2049. }
  2050. QDF_STATUS wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc *psoc,
  2051. int *value)
  2052. {
  2053. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2054. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2055. if (!mlme_obj)
  2056. return QDF_STATUS_E_FAILURE;
  2057. *value = mlme_obj->cfg.sap_cfg.sap_max_offload_peers;
  2058. return QDF_STATUS_SUCCESS;
  2059. }
  2060. QDF_STATUS wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc
  2061. *psoc, int *value)
  2062. {
  2063. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2064. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2065. if (!mlme_obj)
  2066. return QDF_STATUS_E_FAILURE;
  2067. *value = mlme_obj->cfg.sap_cfg.sap_max_offload_reorder_buffs;
  2068. return QDF_STATUS_SUCCESS;
  2069. }
  2070. QDF_STATUS wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc *psoc,
  2071. int *value)
  2072. {
  2073. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2074. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2075. if (!mlme_obj)
  2076. return QDF_STATUS_E_FAILURE;
  2077. *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_beacon_cnt;
  2078. return QDF_STATUS_SUCCESS;
  2079. }
  2080. QDF_STATUS wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc *psoc,
  2081. bool *value)
  2082. {
  2083. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2084. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2085. if (!mlme_obj)
  2086. return QDF_STATUS_E_FAILURE;
  2087. *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_mode;
  2088. return QDF_STATUS_SUCCESS;
  2089. }
  2090. QDF_STATUS wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc *psoc,
  2091. bool *value)
  2092. {
  2093. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2094. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2095. if (!mlme_obj)
  2096. return QDF_STATUS_E_FAILURE;
  2097. *value = mlme_obj->cfg.sap_cfg.sap_internal_restart;
  2098. return QDF_STATUS_SUCCESS;
  2099. }
  2100. QDF_STATUS wlan_mlme_get_sap_max_modulated_dtim(struct wlan_objmgr_psoc *psoc,
  2101. uint8_t *value)
  2102. {
  2103. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2104. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2105. if (!mlme_obj)
  2106. return QDF_STATUS_E_FAILURE;
  2107. *value = mlme_obj->cfg.sap_cfg.max_li_modulated_dtim_time;
  2108. return QDF_STATUS_SUCCESS;
  2109. }
  2110. QDF_STATUS wlan_mlme_get_sap_chan_pref_location(struct wlan_objmgr_psoc *psoc,
  2111. uint8_t *value)
  2112. {
  2113. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2114. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2115. if (!mlme_obj)
  2116. return QDF_STATUS_E_FAILURE;
  2117. *value = mlme_obj->cfg.sap_cfg.sap_pref_chan_location;
  2118. return QDF_STATUS_SUCCESS;
  2119. }
  2120. QDF_STATUS wlan_mlme_get_sap_country_priority(struct wlan_objmgr_psoc *psoc,
  2121. bool *value)
  2122. {
  2123. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2124. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2125. if (!mlme_obj)
  2126. return QDF_STATUS_E_FAILURE;
  2127. *value = mlme_obj->cfg.sap_cfg.country_code_priority;
  2128. return QDF_STATUS_SUCCESS;
  2129. }
  2130. QDF_STATUS wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc
  2131. *psoc, int *value)
  2132. {
  2133. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2134. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2135. if (!mlme_obj) {
  2136. *value = cfg_default(CFG_REDUCED_BEACON_INTERVAL);
  2137. return QDF_STATUS_E_FAILURE;
  2138. }
  2139. *value = mlme_obj->cfg.sap_cfg.reduced_beacon_interval;
  2140. return QDF_STATUS_SUCCESS;
  2141. }
  2142. QDF_STATUS wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc
  2143. *psoc, bool *value)
  2144. {
  2145. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2146. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2147. if (!mlme_obj)
  2148. return QDF_STATUS_E_FAILURE;
  2149. *value = mlme_obj->cfg.sap_cfg.chan_switch_hostapd_rate_enabled_name;
  2150. return QDF_STATUS_SUCCESS;
  2151. }
  2152. QDF_STATUS wlan_mlme_get_sap_force_11n_for_11ac(struct wlan_objmgr_psoc
  2153. *psoc, bool *value)
  2154. {
  2155. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2156. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2157. if (!mlme_obj)
  2158. return QDF_STATUS_E_FAILURE;
  2159. *value = mlme_obj->cfg.sap_cfg.sap_force_11n_for_11ac;
  2160. return QDF_STATUS_SUCCESS;
  2161. }
  2162. QDF_STATUS wlan_mlme_get_go_force_11n_for_11ac(struct wlan_objmgr_psoc
  2163. *psoc, bool *value)
  2164. {
  2165. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2166. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2167. if (!mlme_obj)
  2168. return QDF_STATUS_E_FAILURE;
  2169. *value = mlme_obj->cfg.sap_cfg.go_force_11n_for_11ac;
  2170. return QDF_STATUS_SUCCESS;
  2171. }
  2172. QDF_STATUS wlan_mlme_is_sap_11ac_override(struct wlan_objmgr_psoc *psoc,
  2173. bool *value)
  2174. {
  2175. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2176. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2177. if (!mlme_obj) {
  2178. *value = cfg_default(CFG_SAP_11AC_OVERRIDE);
  2179. return QDF_STATUS_E_FAILURE;
  2180. }
  2181. *value = mlme_obj->cfg.sap_cfg.sap_11ac_override;
  2182. return QDF_STATUS_SUCCESS;
  2183. }
  2184. QDF_STATUS wlan_mlme_is_go_11ac_override(struct wlan_objmgr_psoc *psoc,
  2185. bool *value)
  2186. {
  2187. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2188. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2189. if (!mlme_obj) {
  2190. *value = cfg_default(CFG_GO_11AC_OVERRIDE);
  2191. return QDF_STATUS_E_FAILURE;
  2192. }
  2193. *value = mlme_obj->cfg.sap_cfg.go_11ac_override;
  2194. return QDF_STATUS_SUCCESS;
  2195. }
  2196. QDF_STATUS wlan_mlme_set_sap_11ac_override(struct wlan_objmgr_psoc *psoc,
  2197. bool value)
  2198. {
  2199. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2200. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2201. if (!mlme_obj)
  2202. return QDF_STATUS_E_FAILURE;
  2203. mlme_obj->cfg.sap_cfg.sap_11ac_override = value;
  2204. return QDF_STATUS_SUCCESS;
  2205. }
  2206. QDF_STATUS wlan_mlme_set_go_11ac_override(struct wlan_objmgr_psoc *psoc,
  2207. bool value)
  2208. {
  2209. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2210. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2211. if (!mlme_obj)
  2212. return QDF_STATUS_E_FAILURE;
  2213. mlme_obj->cfg.sap_cfg.go_11ac_override = value;
  2214. return QDF_STATUS_SUCCESS;
  2215. }
  2216. QDF_STATUS wlan_mlme_get_bigtk_support(struct wlan_objmgr_psoc *psoc,
  2217. bool *value)
  2218. {
  2219. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2220. if (!mlme_obj)
  2221. return QDF_STATUS_E_FAILURE;
  2222. *value = mlme_obj->cfg.gen.bigtk_support;
  2223. return QDF_STATUS_SUCCESS;
  2224. }
  2225. QDF_STATUS wlan_mlme_get_ocv_support(struct wlan_objmgr_psoc *psoc,
  2226. bool *value)
  2227. {
  2228. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2229. if (!mlme_obj)
  2230. return QDF_STATUS_E_FAILURE;
  2231. *value = mlme_obj->cfg.gen.ocv_support;
  2232. return QDF_STATUS_SUCCESS;
  2233. }
  2234. bool wlan_mlme_get_host_scan_abort_support(struct wlan_objmgr_psoc *psoc)
  2235. {
  2236. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2237. if (!mlme_obj)
  2238. return false;
  2239. return mlme_obj->cfg.gen.stop_all_host_scan_support;
  2240. }
  2241. bool wlan_mlme_get_dual_sta_roam_support(struct wlan_objmgr_psoc *psoc)
  2242. {
  2243. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2244. if (!mlme_obj)
  2245. return false;
  2246. return mlme_obj->cfg.gen.dual_sta_roam_fw_support;
  2247. }
  2248. QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
  2249. bool *value)
  2250. {
  2251. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2252. if (!mlme_obj)
  2253. return QDF_STATUS_E_FAILURE;
  2254. *value = mlme_obj->cfg.oce.oce_sta_enabled;
  2255. return QDF_STATUS_SUCCESS;
  2256. }
  2257. QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc,
  2258. bool *value)
  2259. {
  2260. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2261. if (!mlme_obj)
  2262. return QDF_STATUS_E_FAILURE;
  2263. *value = mlme_obj->cfg.oce.oce_sap_enabled;
  2264. return QDF_STATUS_SUCCESS;
  2265. }
  2266. /**
  2267. * wlan_mlme_send_oce_flags_fw() - Send the oce flags to FW
  2268. * @pdev: pointer to pdev object
  2269. * @object: vdev object
  2270. * @arg: Arguments to the handler
  2271. *
  2272. * Return: void
  2273. */
  2274. static void wlan_mlme_send_oce_flags_fw(struct wlan_objmgr_pdev *pdev,
  2275. void *object, void *arg)
  2276. {
  2277. struct wlan_objmgr_vdev *vdev = object;
  2278. uint8_t *updated_fw_value = arg;
  2279. uint8_t *dynamic_fw_value = 0;
  2280. uint8_t vdev_id;
  2281. if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) {
  2282. dynamic_fw_value = mlme_get_dynamic_oce_flags(vdev);
  2283. if (!dynamic_fw_value)
  2284. return;
  2285. if (*updated_fw_value == *dynamic_fw_value) {
  2286. mlme_legacy_debug("Current FW flags matches with updated value.");
  2287. return;
  2288. }
  2289. *dynamic_fw_value = *updated_fw_value;
  2290. vdev_id = wlan_vdev_get_id(vdev);
  2291. if (wma_cli_set_command(vdev_id,
  2292. wmi_vdev_param_enable_disable_oce_features,
  2293. *updated_fw_value, VDEV_CMD))
  2294. mlme_legacy_err("Failed to send OCE update to FW");
  2295. }
  2296. }
  2297. void wlan_mlme_update_oce_flags(struct wlan_objmgr_pdev *pdev)
  2298. {
  2299. uint16_t sap_connected_peer, go_connected_peer;
  2300. struct wlan_objmgr_psoc *psoc = NULL;
  2301. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2302. uint8_t updated_fw_value = 0;
  2303. psoc = wlan_pdev_get_psoc(pdev);
  2304. if (!psoc)
  2305. return;
  2306. sap_connected_peer =
  2307. wlan_util_get_peer_count_for_mode(pdev, QDF_SAP_MODE);
  2308. go_connected_peer =
  2309. wlan_util_get_peer_count_for_mode(pdev, QDF_P2P_GO_MODE);
  2310. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2311. if (!mlme_obj)
  2312. return;
  2313. if (sap_connected_peer || go_connected_peer) {
  2314. updated_fw_value = mlme_obj->cfg.oce.feature_bitmap;
  2315. updated_fw_value &=
  2316. ~(WMI_VDEV_OCE_PROBE_REQUEST_RATE_FEATURE_BITMAP);
  2317. updated_fw_value &=
  2318. ~(WMI_VDEV_OCE_PROBE_REQUEST_DEFERRAL_FEATURE_BITMAP);
  2319. mlme_legacy_debug("Disable STA OCE probe req rate and defferal updated_fw_value :%d",
  2320. updated_fw_value);
  2321. } else {
  2322. updated_fw_value = mlme_obj->cfg.oce.feature_bitmap;
  2323. mlme_legacy_debug("Update the STA OCE flags to default INI updated_fw_value :%d",
  2324. updated_fw_value);
  2325. }
  2326. wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
  2327. wlan_mlme_send_oce_flags_fw,
  2328. &updated_fw_value, 0, WLAN_MLME_NB_ID);
  2329. }
  2330. bool wlan_mlme_is_ap_prot_enabled(struct wlan_objmgr_psoc *psoc)
  2331. {
  2332. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2333. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2334. if (!mlme_obj)
  2335. return false;
  2336. return mlme_obj->cfg.sap_protection_cfg.is_ap_prot_enabled;
  2337. }
  2338. QDF_STATUS wlan_mlme_get_ap_protection_mode(struct wlan_objmgr_psoc *psoc,
  2339. uint16_t *value)
  2340. {
  2341. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2342. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2343. if (!mlme_obj)
  2344. return QDF_STATUS_E_FAILURE;
  2345. *value = mlme_obj->cfg.sap_protection_cfg.ap_protection_mode;
  2346. return QDF_STATUS_SUCCESS;
  2347. }
  2348. QDF_STATUS wlan_mlme_is_ap_obss_prot_enabled(struct wlan_objmgr_psoc *psoc,
  2349. bool *value)
  2350. {
  2351. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2352. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2353. if (!mlme_obj)
  2354. return QDF_STATUS_E_FAILURE;
  2355. *value = mlme_obj->cfg.sap_protection_cfg.enable_ap_obss_protection;
  2356. return QDF_STATUS_SUCCESS;
  2357. }
  2358. QDF_STATUS wlan_mlme_get_rts_threshold(struct wlan_objmgr_psoc *psoc,
  2359. uint32_t *value)
  2360. {
  2361. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2362. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2363. if (!mlme_obj)
  2364. return QDF_STATUS_E_FAILURE;
  2365. *value = mlme_obj->cfg.threshold.rts_threshold;
  2366. return QDF_STATUS_SUCCESS;
  2367. }
  2368. QDF_STATUS wlan_mlme_set_rts_threshold(struct wlan_objmgr_psoc *psoc,
  2369. uint32_t value)
  2370. {
  2371. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2372. tp_wma_handle wma_handle;
  2373. wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
  2374. if (!wma_handle)
  2375. return QDF_STATUS_E_INVAL;
  2376. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2377. if (!mlme_obj)
  2378. return QDF_STATUS_E_FAILURE;
  2379. mlme_obj->cfg.threshold.rts_threshold = value;
  2380. wma_update_rts_params(wma_handle, value);
  2381. return QDF_STATUS_SUCCESS;
  2382. }
  2383. QDF_STATUS wlan_mlme_get_frag_threshold(struct wlan_objmgr_psoc *psoc,
  2384. uint32_t *value)
  2385. {
  2386. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2387. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2388. if (!mlme_obj)
  2389. return QDF_STATUS_E_FAILURE;
  2390. *value = mlme_obj->cfg.threshold.frag_threshold;
  2391. return QDF_STATUS_SUCCESS;
  2392. }
  2393. QDF_STATUS wlan_mlme_set_frag_threshold(struct wlan_objmgr_psoc *psoc,
  2394. uint32_t value)
  2395. {
  2396. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2397. tp_wma_handle wma_handle;
  2398. wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
  2399. if (!wma_handle)
  2400. return QDF_STATUS_E_INVAL;
  2401. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2402. if (!mlme_obj)
  2403. return QDF_STATUS_E_FAILURE;
  2404. mlme_obj->cfg.threshold.frag_threshold = value;
  2405. wma_update_frag_params(wma_handle,
  2406. value);
  2407. return QDF_STATUS_SUCCESS;
  2408. }
  2409. QDF_STATUS wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
  2410. bool *value)
  2411. {
  2412. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2413. if (!mlme_obj)
  2414. return QDF_STATUS_E_FAILURE;
  2415. *value = mlme_obj->cfg.oce.fils_enabled;
  2416. return QDF_STATUS_SUCCESS;
  2417. }
  2418. QDF_STATUS wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
  2419. bool value)
  2420. {
  2421. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2422. if (!mlme_obj)
  2423. return QDF_STATUS_E_FAILURE;
  2424. mlme_obj->cfg.oce.fils_enabled = value;
  2425. return QDF_STATUS_SUCCESS;
  2426. }
  2427. QDF_STATUS wlan_mlme_set_primary_interface(struct wlan_objmgr_psoc *psoc,
  2428. uint8_t value)
  2429. {
  2430. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2431. if (!mlme_obj)
  2432. return QDF_STATUS_E_FAILURE;
  2433. mlme_obj->cfg.gen.dual_sta_policy.primary_vdev_id = value;
  2434. mlme_debug("Set primary iface to :%d", value);
  2435. return QDF_STATUS_SUCCESS;
  2436. }
  2437. bool wlan_mlme_is_primary_interface_configured(struct wlan_objmgr_psoc *psoc)
  2438. {
  2439. return wlan_cm_same_band_sta_allowed(psoc);
  2440. }
  2441. QDF_STATUS wlan_mlme_peer_get_assoc_rsp_ies(struct wlan_objmgr_peer *peer,
  2442. const uint8_t **ie_buf,
  2443. size_t *ie_len)
  2444. {
  2445. struct peer_mlme_priv_obj *peer_priv;
  2446. if (!peer || !ie_buf || !ie_len)
  2447. return QDF_STATUS_E_INVAL;
  2448. *ie_buf = NULL;
  2449. *ie_len = 0;
  2450. peer_priv = wlan_objmgr_peer_get_comp_private_obj(peer,
  2451. WLAN_UMAC_COMP_MLME);
  2452. if (!peer_priv || peer_priv->assoc_rsp.len == 0)
  2453. return QDF_STATUS_SUCCESS;
  2454. *ie_buf = peer_priv->assoc_rsp.ptr;
  2455. *ie_len = peer_priv->assoc_rsp.len;
  2456. return QDF_STATUS_SUCCESS;
  2457. }
  2458. int wlan_mlme_get_mcc_duty_cycle_percentage(struct wlan_objmgr_pdev *pdev)
  2459. {
  2460. struct wlan_objmgr_psoc *psoc = NULL;
  2461. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2462. uint32_t op_ch_freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
  2463. uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
  2464. uint32_t i, operating_channel, quota_value = MCC_DUTY_CYCLE;
  2465. struct dual_sta_policy *dual_sta_policy;
  2466. uint32_t count, primary_sta_freq = 0, secondary_sta_freq = 0;
  2467. psoc = wlan_pdev_get_psoc(pdev);
  2468. if (!psoc)
  2469. return -EINVAL;
  2470. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2471. if (!mlme_obj)
  2472. return -EINVAL;
  2473. dual_sta_policy = &mlme_obj->cfg.gen.dual_sta_policy;
  2474. if (dual_sta_policy->primary_vdev_id == WLAN_INVALID_VDEV_ID ||
  2475. (dual_sta_policy->concurrent_sta_policy ==
  2476. QCA_WLAN_CONCURRENT_STA_POLICY_UNBIASED)) {
  2477. mlme_debug("Invalid primary vdev id or policy is unbaised :%d",
  2478. dual_sta_policy->concurrent_sta_policy);
  2479. return -EINVAL;
  2480. }
  2481. count = policy_mgr_get_mode_specific_conn_info(psoc, op_ch_freq_list,
  2482. vdev_id_list,
  2483. PM_STA_MODE);
  2484. /* Proceed only in case of STA+STA */
  2485. if (count != 2) {
  2486. mlme_debug("STA+STA concurrency is not present");
  2487. return -EINVAL;
  2488. }
  2489. for (i = 0; i < count; i++) {
  2490. if (vdev_id_list[i] == dual_sta_policy->primary_vdev_id) {
  2491. primary_sta_freq = op_ch_freq_list[i];
  2492. mlme_debug("primary sta vdev:%d at inxex:%d, freq:%d",
  2493. i, vdev_id_list[i], op_ch_freq_list[i]);
  2494. } else {
  2495. secondary_sta_freq = op_ch_freq_list[i];
  2496. mlme_debug("secondary sta vdev:%d at inxex:%d, freq:%d",
  2497. i, vdev_id_list[i], op_ch_freq_list[i]);
  2498. }
  2499. }
  2500. if (!primary_sta_freq || !secondary_sta_freq) {
  2501. mlme_debug("Invalid primary or secondary sta freq");
  2502. return -EINVAL;
  2503. }
  2504. operating_channel = wlan_freq_to_chan(primary_sta_freq);
  2505. /*
  2506. * The channel numbers for both adapters and the time
  2507. * quota for the 1st adapter, i.e., one specified in cmd
  2508. * are formatted as a bit vector
  2509. * ******************************************************
  2510. * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 |
  2511. * | Unused | Quota for | chan. # for |chan. # for|
  2512. * | | 1st chan | 1st chan. |2nd chan. |
  2513. * ******************************************************
  2514. */
  2515. mlme_debug("First connection channel No.:%d and quota:%dms",
  2516. operating_channel, quota_value);
  2517. /* Move the time quota for first channel to bits 15-8 */
  2518. quota_value = quota_value << 8;
  2519. /*
  2520. * Store the channel number of 1st channel at bits 7-0
  2521. * of the bit vector
  2522. */
  2523. quota_value |= operating_channel;
  2524. /* Second STA Connection */
  2525. operating_channel = wlan_freq_to_chan(secondary_sta_freq);
  2526. if (!operating_channel)
  2527. mlme_debug("Secondary adapter op channel is invalid");
  2528. /*
  2529. * Now move the time quota and channel number of the
  2530. * 1st adapter to bits 23-16 and bits 15-8 of the bit
  2531. * vector, respectively.
  2532. */
  2533. quota_value = quota_value << 8;
  2534. /*
  2535. * Set the channel number for 2nd MCC vdev at bits
  2536. * 7-0 of set_value
  2537. */
  2538. quota_value |= operating_channel;
  2539. mlme_debug("quota value:%x", quota_value);
  2540. return quota_value;
  2541. }
  2542. QDF_STATUS wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc *psoc,
  2543. bool value)
  2544. {
  2545. struct wlan_mlme_psoc_ext_obj *mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2546. if (!mlme_obj)
  2547. return QDF_STATUS_E_FAILURE;
  2548. mlme_obj->cfg.oce.enable_bcast_probe_rsp = value;
  2549. return QDF_STATUS_SUCCESS;
  2550. }
  2551. QDF_STATUS
  2552. wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc,
  2553. uint32_t *value)
  2554. {
  2555. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2556. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2557. if (!mlme_obj)
  2558. return QDF_STATUS_E_FAILURE;
  2559. *value = mlme_obj->cfg.sta.sta_miracast_mcc_rest_time;
  2560. return QDF_STATUS_SUCCESS;
  2561. }
  2562. QDF_STATUS
  2563. wlan_mlme_get_max_modulated_dtim_ms(struct wlan_objmgr_psoc *psoc,
  2564. uint16_t *value)
  2565. {
  2566. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2567. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2568. if (!mlme_obj)
  2569. return QDF_STATUS_E_FAILURE;
  2570. *value = mlme_obj->cfg.sta.max_li_modulated_dtim_time_ms;
  2571. return QDF_STATUS_SUCCESS;
  2572. }
  2573. QDF_STATUS
  2574. wlan_mlme_get_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc,
  2575. bool *value)
  2576. {
  2577. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2578. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2579. if (!mlme_obj)
  2580. return QDF_STATUS_E_FAILURE;
  2581. *value = mlme_obj->cfg.sta.usr_scan_probe_unicast_ra;
  2582. mlme_legacy_debug("scan_probe_unicast_ra %d", *value);
  2583. return QDF_STATUS_SUCCESS;
  2584. }
  2585. QDF_STATUS
  2586. wlan_mlme_set_scan_probe_unicast_ra(struct wlan_objmgr_psoc *psoc,
  2587. bool value)
  2588. {
  2589. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2590. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2591. if (!mlme_obj)
  2592. return QDF_STATUS_E_FAILURE;
  2593. mlme_legacy_debug("scan_probe_unicast_ra %d", value);
  2594. mlme_obj->cfg.sta.usr_scan_probe_unicast_ra = value;
  2595. return QDF_STATUS_SUCCESS;
  2596. }
  2597. QDF_STATUS
  2598. wlan_mlme_get_sap_mcc_chnl_avoid(struct wlan_objmgr_psoc *psoc,
  2599. uint8_t *value)
  2600. {
  2601. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2602. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2603. if (!mlme_obj)
  2604. return QDF_STATUS_E_FAILURE;
  2605. *value = mlme_obj->cfg.sap_cfg.sap_mcc_chnl_avoid;
  2606. return QDF_STATUS_SUCCESS;
  2607. }
  2608. QDF_STATUS
  2609. wlan_mlme_get_mcc_bcast_prob_resp(struct wlan_objmgr_psoc *psoc,
  2610. uint8_t *value)
  2611. {
  2612. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2613. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2614. if (!mlme_obj)
  2615. return QDF_STATUS_E_FAILURE;
  2616. *value = mlme_obj->cfg.feature_flags.mcc_bcast_prob_rsp;
  2617. return QDF_STATUS_SUCCESS;
  2618. }
  2619. QDF_STATUS
  2620. wlan_mlme_get_mcc_rts_cts_prot(struct wlan_objmgr_psoc *psoc,
  2621. uint8_t *value)
  2622. {
  2623. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2624. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2625. if (!mlme_obj)
  2626. return QDF_STATUS_E_FAILURE;
  2627. *value = mlme_obj->cfg.feature_flags.mcc_rts_cts_prot;
  2628. return QDF_STATUS_SUCCESS;
  2629. }
  2630. QDF_STATUS
  2631. wlan_mlme_get_mcc_feature(struct wlan_objmgr_psoc *psoc,
  2632. uint8_t *value)
  2633. {
  2634. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2635. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2636. if (!mlme_obj)
  2637. return QDF_STATUS_E_FAILURE;
  2638. *value = mlme_obj->cfg.feature_flags.enable_mcc;
  2639. return QDF_STATUS_SUCCESS;
  2640. }
  2641. QDF_STATUS wlan_mlme_get_edca_params(struct wlan_mlme_edca_params *edca_params,
  2642. uint8_t *data, enum e_edca_type edca_ac)
  2643. {
  2644. qdf_size_t len;
  2645. switch (edca_ac) {
  2646. case edca_ani_acbe_local:
  2647. len = edca_params->ani_acbe_l.len;
  2648. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_l, &len);
  2649. break;
  2650. case edca_ani_acbk_local:
  2651. len = edca_params->ani_acbk_l.len;
  2652. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_l, &len);
  2653. break;
  2654. case edca_ani_acvi_local:
  2655. len = edca_params->ani_acvi_l.len;
  2656. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_l, &len);
  2657. break;
  2658. case edca_ani_acvo_local:
  2659. len = edca_params->ani_acvo_l.len;
  2660. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_l, &len);
  2661. break;
  2662. case edca_ani_acbk_bcast:
  2663. len = edca_params->ani_acbk_b.len;
  2664. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_b, &len);
  2665. break;
  2666. case edca_ani_acbe_bcast:
  2667. len = edca_params->ani_acbe_b.len;
  2668. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_b, &len);
  2669. break;
  2670. case edca_ani_acvi_bcast:
  2671. len = edca_params->ani_acvi_b.len;
  2672. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_b, &len);
  2673. break;
  2674. case edca_ani_acvo_bcast:
  2675. len = edca_params->ani_acvo_b.len;
  2676. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_b, &len);
  2677. break;
  2678. case edca_wme_acbe_local:
  2679. len = edca_params->wme_acbe_l.len;
  2680. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_l, &len);
  2681. break;
  2682. case edca_wme_acbk_local:
  2683. len = edca_params->wme_acbk_l.len;
  2684. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_l, &len);
  2685. break;
  2686. case edca_wme_acvi_local:
  2687. len = edca_params->wme_acvi_l.len;
  2688. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_l, &len);
  2689. break;
  2690. case edca_wme_acvo_local:
  2691. len = edca_params->wme_acvo_l.len;
  2692. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_l, &len);
  2693. break;
  2694. case edca_wme_acbe_bcast:
  2695. len = edca_params->wme_acbe_b.len;
  2696. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_b, &len);
  2697. break;
  2698. case edca_wme_acbk_bcast:
  2699. len = edca_params->wme_acbk_b.len;
  2700. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_b, &len);
  2701. break;
  2702. case edca_wme_acvi_bcast:
  2703. len = edca_params->wme_acvi_b.len;
  2704. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_b, &len);
  2705. break;
  2706. case edca_wme_acvo_bcast:
  2707. len = edca_params->wme_acvo_b.len;
  2708. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_b, &len);
  2709. break;
  2710. case edca_etsi_acbe_local:
  2711. len = edca_params->etsi_acbe_l.len;
  2712. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_l, &len);
  2713. break;
  2714. case edca_etsi_acbk_local:
  2715. len = edca_params->etsi_acbk_l.len;
  2716. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_l, &len);
  2717. break;
  2718. case edca_etsi_acvi_local:
  2719. len = edca_params->etsi_acvi_l.len;
  2720. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_l, &len);
  2721. break;
  2722. case edca_etsi_acvo_local:
  2723. len = edca_params->etsi_acvo_l.len;
  2724. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_l, &len);
  2725. break;
  2726. case edca_etsi_acbe_bcast:
  2727. len = edca_params->etsi_acbe_b.len;
  2728. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_b, &len);
  2729. break;
  2730. case edca_etsi_acbk_bcast:
  2731. len = edca_params->etsi_acbk_b.len;
  2732. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_b, &len);
  2733. break;
  2734. case edca_etsi_acvi_bcast:
  2735. len = edca_params->etsi_acvi_b.len;
  2736. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_b, &len);
  2737. break;
  2738. case edca_etsi_acvo_bcast:
  2739. len = edca_params->etsi_acvo_b.len;
  2740. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_b, &len);
  2741. break;
  2742. default:
  2743. mlme_legacy_err("Invalid edca access category");
  2744. return QDF_STATUS_E_INVAL;
  2745. }
  2746. return QDF_STATUS_SUCCESS;
  2747. }
  2748. QDF_STATUS mlme_get_wep_key(struct wlan_objmgr_vdev *vdev,
  2749. struct wlan_mlme_wep_cfg *wep_params,
  2750. enum wep_key_id wep_keyid, uint8_t *default_key,
  2751. qdf_size_t *key_len)
  2752. {
  2753. struct wlan_crypto_key *crypto_key = NULL;
  2754. if (wep_keyid >= WLAN_CRYPTO_MAXKEYIDX) {
  2755. mlme_legacy_err("Incorrect wep key index %d", wep_keyid);
  2756. return QDF_STATUS_E_INVAL;
  2757. }
  2758. crypto_key = wlan_crypto_get_key(vdev, wep_keyid);
  2759. if (!crypto_key) {
  2760. mlme_legacy_err("Crypto KEY not present");
  2761. return QDF_STATUS_E_INVAL;
  2762. }
  2763. if (crypto_key->keylen > WLAN_CRYPTO_KEY_WEP104_LEN) {
  2764. mlme_legacy_err("Key too large to hold");
  2765. return QDF_STATUS_E_INVAL;
  2766. }
  2767. *key_len = crypto_key->keylen;
  2768. qdf_mem_copy(default_key, &crypto_key->keyval, crypto_key->keylen);
  2769. return QDF_STATUS_SUCCESS;
  2770. }
  2771. QDF_STATUS
  2772. wlan_mlme_is_11h_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  2773. {
  2774. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2775. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2776. if (!mlme_obj)
  2777. return QDF_STATUS_E_FAILURE;
  2778. *value = mlme_obj->cfg.gen.enabled_11h;
  2779. return QDF_STATUS_SUCCESS;
  2780. }
  2781. QDF_STATUS
  2782. wlan_mlme_set_11h_enabled(struct wlan_objmgr_psoc *psoc, bool value)
  2783. {
  2784. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2785. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2786. if (!mlme_obj)
  2787. return QDF_STATUS_E_FAILURE;
  2788. mlme_obj->cfg.gen.enabled_11h = value;
  2789. return QDF_STATUS_SUCCESS;
  2790. }
  2791. QDF_STATUS
  2792. wlan_mlme_is_11d_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  2793. {
  2794. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2795. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2796. if (!mlme_obj)
  2797. return QDF_STATUS_E_FAILURE;
  2798. *value = mlme_obj->cfg.gen.enabled_11d;
  2799. return QDF_STATUS_SUCCESS;
  2800. }
  2801. QDF_STATUS
  2802. wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value)
  2803. {
  2804. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2805. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2806. if (!mlme_obj)
  2807. return QDF_STATUS_E_FAILURE;
  2808. mlme_obj->cfg.gen.enabled_11d = value;
  2809. return QDF_STATUS_SUCCESS;
  2810. }
  2811. QDF_STATUS
  2812. wlan_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  2813. {
  2814. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2815. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2816. if (!mlme_obj) {
  2817. *value = false;
  2818. return QDF_STATUS_E_FAILURE;
  2819. }
  2820. *value = mlme_obj->cfg.gen.enabled_rf_test_mode;
  2821. return QDF_STATUS_SUCCESS;
  2822. }
  2823. QDF_STATUS
  2824. wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
  2825. {
  2826. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2827. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2828. if (!mlme_obj)
  2829. return QDF_STATUS_E_FAILURE;
  2830. mlme_obj->cfg.gen.enabled_rf_test_mode = value;
  2831. return QDF_STATUS_SUCCESS;
  2832. }
  2833. #ifdef CONFIG_BAND_6GHZ
  2834. QDF_STATUS
  2835. wlan_mlme_is_standard_6ghz_conn_policy_enabled(struct wlan_objmgr_psoc *psoc,
  2836. bool *value)
  2837. {
  2838. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2839. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2840. if (!mlme_obj)
  2841. return QDF_STATUS_E_FAILURE;
  2842. *value = mlme_obj->cfg.gen.std_6ghz_conn_policy;
  2843. return QDF_STATUS_SUCCESS;
  2844. }
  2845. QDF_STATUS
  2846. wlan_mlme_is_disable_vlp_sta_conn_to_sp_ap_enabled(
  2847. struct wlan_objmgr_psoc *psoc,
  2848. bool *value)
  2849. {
  2850. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2851. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2852. if (!mlme_obj)
  2853. return QDF_STATUS_E_FAILURE;
  2854. *value = mlme_obj->cfg.gen.disable_vlp_sta_conn_to_sp_ap;
  2855. return QDF_STATUS_SUCCESS;
  2856. }
  2857. #endif
  2858. #ifdef WLAN_FEATURE_11BE_MLO
  2859. QDF_STATUS
  2860. wlan_mlme_get_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode *value)
  2861. {
  2862. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2863. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2864. if (!mlme_obj)
  2865. return QDF_STATUS_E_FAILURE;
  2866. *value = mlme_obj->cfg.gen.eht_mode;
  2867. return QDF_STATUS_SUCCESS;
  2868. }
  2869. QDF_STATUS
  2870. wlan_mlme_get_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  2871. {
  2872. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2873. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2874. if (!mlme_obj)
  2875. return QDF_STATUS_E_FAILURE;
  2876. *value = mlme_obj->cfg.gen.enable_emlsr_mode;
  2877. return QDF_STATUS_SUCCESS;
  2878. }
  2879. QDF_STATUS
  2880. wlan_mlme_set_eht_mode(struct wlan_objmgr_psoc *psoc, enum wlan_eht_mode value)
  2881. {
  2882. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2883. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2884. if (!mlme_obj)
  2885. return QDF_STATUS_E_FAILURE;
  2886. mlme_obj->cfg.gen.eht_mode = value;
  2887. return QDF_STATUS_SUCCESS;
  2888. }
  2889. QDF_STATUS
  2890. wlan_mlme_set_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
  2891. {
  2892. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2893. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2894. if (!mlme_obj)
  2895. return QDF_STATUS_E_FAILURE;
  2896. mlme_obj->cfg.gen.enable_emlsr_mode = value;
  2897. return QDF_STATUS_SUCCESS;
  2898. }
  2899. void
  2900. wlan_mlme_set_eml_params(struct wlan_objmgr_psoc *psoc,
  2901. struct wlan_psoc_host_mac_phy_caps_ext2 *cap)
  2902. {
  2903. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2904. if (!cap->emlcap.emlsr_supp) {
  2905. mlme_legacy_debug("EMLSR supp: %d", cap->emlcap.emlsr_supp);
  2906. return;
  2907. }
  2908. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2909. if (!mlme_obj) {
  2910. mlme_legacy_err("No psoc object");
  2911. return;
  2912. }
  2913. mlme_obj->cfg.eml_cap.emlsr_supp = cap->emlcap.emlsr_supp;
  2914. mlme_obj->cfg.eml_cap.emlsr_pad_delay = cap->emlcap.emlsr_pad_delay;
  2915. mlme_obj->cfg.eml_cap.emlsr_trans_delay = cap->emlcap.emlsr_trans_delay;
  2916. mlme_obj->cfg.eml_cap.emlmr_supp = cap->emlcap.emlmr_supp;
  2917. }
  2918. void
  2919. wlan_mlme_get_eml_params(struct wlan_objmgr_psoc *psoc,
  2920. struct wlan_mlo_eml_cap *cap)
  2921. {
  2922. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2923. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2924. if (!mlme_obj) {
  2925. mlme_legacy_err("No psoc object");
  2926. return;
  2927. }
  2928. cap->emlsr_supp = mlme_obj->cfg.eml_cap.emlsr_supp;
  2929. cap->emlsr_pad_delay = mlme_obj->cfg.eml_cap.emlsr_pad_delay;
  2930. cap->emlsr_trans_delay = mlme_obj->cfg.eml_cap.emlsr_trans_delay;
  2931. cap->emlmr_supp = mlme_obj->cfg.eml_cap.emlmr_supp;
  2932. }
  2933. void
  2934. wlan_mlme_cfg_set_emlsr_pad_delay(struct wlan_objmgr_psoc *psoc, uint8_t val)
  2935. {
  2936. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2937. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2938. if (!mlme_obj) {
  2939. mlme_legacy_err("No psoc object");
  2940. return;
  2941. }
  2942. if (val > mlme_obj->cfg.eml_cap.emlsr_pad_delay &&
  2943. val <= WLAN_ML_BV_CINFO_EMLCAP_EMLSRDELAY_256US) {
  2944. mlme_obj->cfg.eml_cap.emlsr_pad_delay = val;
  2945. mlme_debug("EMLSR padding delay configured to %d", val);
  2946. }
  2947. }
  2948. enum t2lm_negotiation_support
  2949. wlan_mlme_get_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc)
  2950. {
  2951. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2952. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2953. if (!mlme_obj)
  2954. return T2LM_NEGOTIATION_DISABLED;
  2955. return mlme_obj->cfg.gen.t2lm_negotiation_support;
  2956. }
  2957. QDF_STATUS
  2958. wlan_mlme_set_t2lm_negotiation_supported(struct wlan_objmgr_psoc *psoc,
  2959. uint8_t value)
  2960. {
  2961. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2962. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2963. if (!mlme_obj)
  2964. return QDF_STATUS_E_FAILURE;
  2965. if (value > T2LM_NEGOTIATION_MAX) {
  2966. mlme_err("Invalid value %d", value);
  2967. return QDF_STATUS_E_INVAL;
  2968. }
  2969. mlme_obj->cfg.gen.t2lm_negotiation_support = value;
  2970. return QDF_STATUS_SUCCESS;
  2971. }
  2972. #endif
  2973. QDF_STATUS
  2974. wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value)
  2975. {
  2976. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2977. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2978. if (!mlme_obj)
  2979. return QDF_STATUS_E_FAILURE;
  2980. mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value;
  2981. if (value == VHT_CAP_160_AND_80P80_SUPP ||
  2982. value == VHT_CAP_160_SUPP) {
  2983. mlme_obj->cfg.vht_caps.vht_cap_info.vht_extended_nss_bw_cap = 1;
  2984. mlme_obj->cfg.vht_caps.vht_cap_info.extended_nss_bw_supp = 0;
  2985. }
  2986. return QDF_STATUS_SUCCESS;
  2987. }
  2988. QDF_STATUS
  2989. wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  2990. {
  2991. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  2992. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  2993. if (!mlme_obj)
  2994. return QDF_STATUS_E_FAILURE;
  2995. *value = mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width;
  2996. return QDF_STATUS_SUCCESS;
  2997. }
  2998. QDF_STATUS wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc,
  2999. bool value)
  3000. {
  3001. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3002. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3003. if (!mlme_obj)
  3004. return QDF_STATUS_E_FAILURE;
  3005. mlme_obj->cfg.vht_caps.vht_cap_info.ldpc_coding_cap = value;
  3006. return QDF_STATUS_SUCCESS;
  3007. }
  3008. QDF_STATUS
  3009. wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc,
  3010. bool value)
  3011. {
  3012. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3013. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3014. if (!mlme_obj)
  3015. return QDF_STATUS_E_FAILURE;
  3016. mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz = value;
  3017. return QDF_STATUS_SUCCESS;
  3018. }
  3019. QDF_STATUS
  3020. wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, bool *value)
  3021. {
  3022. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3023. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3024. if (!mlme_obj)
  3025. return QDF_STATUS_E_FAILURE;
  3026. *value = mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz;
  3027. return QDF_STATUS_SUCCESS;
  3028. }
  3029. QDF_STATUS
  3030. wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
  3031. {
  3032. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3033. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3034. if (!mlme_obj)
  3035. return QDF_STATUS_E_FAILURE;
  3036. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc;
  3037. return QDF_STATUS_SUCCESS;
  3038. }
  3039. QDF_STATUS
  3040. wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
  3041. {
  3042. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3043. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3044. if (!mlme_obj)
  3045. return QDF_STATUS_E_FAILURE;
  3046. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc;
  3047. return QDF_STATUS_SUCCESS;
  3048. }
  3049. QDF_STATUS
  3050. wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
  3051. uint8_t value)
  3052. {
  3053. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3054. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3055. if (!mlme_obj)
  3056. return QDF_STATUS_E_FAILURE;
  3057. mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp = value;
  3058. return QDF_STATUS_SUCCESS;
  3059. }
  3060. QDF_STATUS
  3061. wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
  3062. uint8_t *value)
  3063. {
  3064. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3065. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3066. if (!mlme_obj)
  3067. return QDF_STATUS_E_FAILURE;
  3068. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp;
  3069. return QDF_STATUS_SUCCESS;
  3070. }
  3071. QDF_STATUS wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
  3072. uint32_t *value)
  3073. {
  3074. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3075. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3076. if (!mlme_obj)
  3077. return QDF_STATUS_E_FAILURE;
  3078. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map;
  3079. return QDF_STATUS_SUCCESS;
  3080. }
  3081. QDF_STATUS wlan_mlme_cfg_set_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
  3082. uint32_t value)
  3083. {
  3084. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3085. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3086. if (!mlme_obj)
  3087. return QDF_STATUS_E_FAILURE;
  3088. mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map = value;
  3089. return QDF_STATUS_SUCCESS;
  3090. }
  3091. QDF_STATUS wlan_mlme_cfg_get_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
  3092. uint32_t *value)
  3093. {
  3094. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3095. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3096. if (!mlme_obj)
  3097. return QDF_STATUS_E_FAILURE;
  3098. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map;
  3099. return QDF_STATUS_SUCCESS;
  3100. }
  3101. QDF_STATUS wlan_mlme_cfg_set_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
  3102. uint32_t value)
  3103. {
  3104. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3105. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3106. if (!mlme_obj)
  3107. return QDF_STATUS_E_FAILURE;
  3108. mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map = value;
  3109. return QDF_STATUS_SUCCESS;
  3110. }
  3111. QDF_STATUS
  3112. wlan_mlme_cfg_set_vht_rx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
  3113. uint32_t value)
  3114. {
  3115. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3116. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3117. if (!mlme_obj)
  3118. return QDF_STATUS_E_FAILURE;
  3119. mlme_obj->cfg.vht_caps.vht_cap_info.rx_supp_data_rate = value;
  3120. return QDF_STATUS_SUCCESS;
  3121. }
  3122. QDF_STATUS
  3123. wlan_mlme_cfg_set_vht_tx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
  3124. uint32_t value)
  3125. {
  3126. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3127. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3128. if (!mlme_obj)
  3129. return QDF_STATUS_E_FAILURE;
  3130. mlme_obj->cfg.vht_caps.vht_cap_info.tx_supp_data_rate = value;
  3131. return QDF_STATUS_SUCCESS;
  3132. }
  3133. QDF_STATUS
  3134. wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
  3135. uint32_t *value)
  3136. {
  3137. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3138. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3139. if (!mlme_obj)
  3140. return QDF_STATUS_E_FAILURE;
  3141. *value = mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set;
  3142. return QDF_STATUS_SUCCESS;
  3143. }
  3144. QDF_STATUS
  3145. wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
  3146. uint32_t value)
  3147. {
  3148. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3149. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3150. if (!mlme_obj)
  3151. return QDF_STATUS_E_FAILURE;
  3152. mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set = value;
  3153. return QDF_STATUS_SUCCESS;
  3154. }
  3155. QDF_STATUS
  3156. wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value)
  3157. {
  3158. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3159. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3160. if (!mlme_obj)
  3161. return QDF_STATUS_E_FAILURE;
  3162. *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee;
  3163. return QDF_STATUS_SUCCESS;
  3164. }
  3165. QDF_STATUS
  3166. wlan_mlme_get_vht_tx_su_beamformer(struct wlan_objmgr_psoc *psoc, bool *value)
  3167. {
  3168. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3169. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3170. if (!mlme_obj)
  3171. return QDF_STATUS_E_FAILURE;
  3172. *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer;
  3173. return QDF_STATUS_SUCCESS;
  3174. }
  3175. QDF_STATUS
  3176. wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  3177. {
  3178. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3179. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3180. if (!mlme_obj)
  3181. return QDF_STATUS_E_FAILURE;
  3182. *value = mlme_obj->cfg.vht_caps.vht_cap_info.channel_width;
  3183. return QDF_STATUS_SUCCESS;
  3184. }
  3185. QDF_STATUS
  3186. wlan_mlme_get_vht_rx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  3187. {
  3188. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3189. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3190. if (!mlme_obj)
  3191. return QDF_STATUS_E_FAILURE;
  3192. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs;
  3193. return QDF_STATUS_SUCCESS;
  3194. }
  3195. QDF_STATUS
  3196. wlan_mlme_get_vht_tx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  3197. {
  3198. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3199. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3200. if (!mlme_obj)
  3201. return QDF_STATUS_E_FAILURE;
  3202. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs;
  3203. return QDF_STATUS_SUCCESS;
  3204. }
  3205. QDF_STATUS
  3206. wlan_mlme_get_vht_rx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  3207. {
  3208. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3209. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3210. if (!mlme_obj)
  3211. return QDF_STATUS_E_FAILURE;
  3212. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs2x2;
  3213. return QDF_STATUS_SUCCESS;
  3214. }
  3215. QDF_STATUS
  3216. wlan_mlme_get_vht_tx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  3217. {
  3218. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3219. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3220. if (!mlme_obj)
  3221. return QDF_STATUS_E_FAILURE;
  3222. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs2x2;
  3223. return QDF_STATUS_SUCCESS;
  3224. }
  3225. QDF_STATUS
  3226. wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value)
  3227. {
  3228. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3229. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3230. if (!mlme_obj)
  3231. return QDF_STATUS_E_FAILURE;
  3232. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_vht20_mcs9;
  3233. return QDF_STATUS_SUCCESS;
  3234. }
  3235. QDF_STATUS
  3236. wlan_mlme_get_indoor_support_for_nan(struct wlan_objmgr_psoc *psoc,
  3237. bool *value)
  3238. {
  3239. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3240. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3241. if (!mlme_obj) {
  3242. *value = false;
  3243. mlme_legacy_err("Failed to get MLME Obj");
  3244. return QDF_STATUS_E_INVAL;
  3245. }
  3246. *value = mlme_obj->cfg.reg.enable_nan_on_indoor_channels;
  3247. return QDF_STATUS_SUCCESS;
  3248. }
  3249. QDF_STATUS
  3250. wlan_mlme_get_srd_master_mode_for_vdev(struct wlan_objmgr_psoc *psoc,
  3251. enum QDF_OPMODE vdev_opmode,
  3252. bool *value)
  3253. {
  3254. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3255. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3256. if (!mlme_obj) {
  3257. *value = false;
  3258. mlme_legacy_err("Failed to get MLME Obj");
  3259. return QDF_STATUS_E_INVAL;
  3260. }
  3261. switch (vdev_opmode) {
  3262. case QDF_SAP_MODE:
  3263. *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode &
  3264. MLME_SRD_MASTER_MODE_SAP;
  3265. break;
  3266. case QDF_P2P_GO_MODE:
  3267. *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode &
  3268. MLME_SRD_MASTER_MODE_P2P_GO;
  3269. break;
  3270. case QDF_NAN_DISC_MODE:
  3271. *value = mlme_obj->cfg.reg.etsi_srd_chan_in_master_mode &
  3272. MLME_SRD_MASTER_MODE_NAN;
  3273. break;
  3274. default:
  3275. mlme_legacy_err("Unexpected opmode %d", vdev_opmode);
  3276. *value = false;
  3277. }
  3278. return QDF_STATUS_SUCCESS;
  3279. }
  3280. QDF_STATUS
  3281. wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
  3282. bool *value)
  3283. {
  3284. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3285. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3286. if (!mlme_obj)
  3287. return QDF_STATUS_E_FAILURE;
  3288. *value = mlme_obj->cfg.nss_chains_ini_cfg.enable_dynamic_nss_chains_cfg;
  3289. return QDF_STATUS_SUCCESS;
  3290. }
  3291. QDF_STATUS
  3292. wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
  3293. struct wlan_objmgr_psoc *psoc,
  3294. bool *value)
  3295. {
  3296. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3297. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3298. if (!mlme_obj)
  3299. return QDF_STATUS_E_FAILURE;
  3300. *value =
  3301. mlme_obj->cfg.nss_chains_ini_cfg.restart_sap_on_dyn_nss_chains_cfg;
  3302. return QDF_STATUS_SUCCESS;
  3303. }
  3304. QDF_STATUS
  3305. wlan_mlme_cfg_get_dynamic_nss_chains_support(struct wlan_objmgr_psoc *psoc,
  3306. bool *value)
  3307. {
  3308. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3309. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3310. if (!mlme_obj)
  3311. return QDF_STATUS_E_FAILURE;
  3312. *value = mlme_obj->cfg.dynamic_nss_chains_support;
  3313. return QDF_STATUS_SUCCESS;
  3314. }
  3315. QDF_STATUS
  3316. wlan_mlme_cfg_set_dynamic_nss_chains_support(struct wlan_objmgr_psoc *psoc,
  3317. bool value)
  3318. {
  3319. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3320. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3321. if (!mlme_obj)
  3322. return QDF_STATUS_E_FAILURE;
  3323. mlme_obj->cfg.dynamic_nss_chains_support = value;
  3324. return QDF_STATUS_SUCCESS;
  3325. }
  3326. QDF_STATUS
  3327. wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value)
  3328. {
  3329. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3330. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3331. if (!mlme_obj)
  3332. return QDF_STATUS_E_FAILURE;
  3333. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2;
  3334. return QDF_STATUS_SUCCESS;
  3335. }
  3336. QDF_STATUS
  3337. wlan_mlme_get_force_sap_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  3338. {
  3339. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3340. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3341. if (!mlme_obj)
  3342. return QDF_STATUS_E_FAILURE;
  3343. *value = mlme_obj->cfg.acs.force_sap_start;
  3344. return QDF_STATUS_SUCCESS;
  3345. }
  3346. QDF_STATUS
  3347. wlan_mlme_set_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool value)
  3348. {
  3349. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3350. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3351. if (!mlme_obj)
  3352. return QDF_STATUS_E_FAILURE;
  3353. mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2 = value;
  3354. return QDF_STATUS_SUCCESS;
  3355. }
  3356. QDF_STATUS
  3357. wlan_mlme_get_vht_enable_paid(struct wlan_objmgr_psoc *psoc, bool *value)
  3358. {
  3359. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3360. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3361. if (!mlme_obj)
  3362. return QDF_STATUS_E_FAILURE;
  3363. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_paid;
  3364. return QDF_STATUS_SUCCESS;
  3365. }
  3366. QDF_STATUS
  3367. wlan_mlme_get_vht_enable_gid(struct wlan_objmgr_psoc *psoc, bool *value)
  3368. {
  3369. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3370. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3371. if (!mlme_obj)
  3372. return QDF_STATUS_E_FAILURE;
  3373. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_gid;
  3374. return QDF_STATUS_SUCCESS;
  3375. }
  3376. QDF_STATUS
  3377. wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
  3378. {
  3379. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3380. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3381. if (!mlme_obj)
  3382. return QDF_STATUS_E_FAILURE;
  3383. *value = mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band;
  3384. return QDF_STATUS_SUCCESS;
  3385. }
  3386. QDF_STATUS
  3387. wlan_mlme_set_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool value)
  3388. {
  3389. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3390. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3391. if (!mlme_obj)
  3392. return QDF_STATUS_E_FAILURE;
  3393. mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band = value;
  3394. return QDF_STATUS_SUCCESS;
  3395. }
  3396. QDF_STATUS
  3397. wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
  3398. {
  3399. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3400. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3401. if (!mlme_obj)
  3402. return QDF_STATUS_E_FAILURE;
  3403. *value = mlme_obj->cfg.vht_caps.vht_cap_info.vendor_24ghz_band;
  3404. return QDF_STATUS_SUCCESS;
  3405. }
  3406. QDF_STATUS
  3407. mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, struct wma_tgt_vht_cap *cfg)
  3408. {
  3409. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3410. struct mlme_vht_capabilities_info *vht_cap_info;
  3411. uint32_t value = 0;
  3412. bool hw_rx_ldpc_enabled;
  3413. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3414. if (!mlme_obj)
  3415. return QDF_STATUS_E_FAILURE;
  3416. vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info;
  3417. /*
  3418. * VHT max MPDU length:
  3419. * override if user configured value is too high
  3420. * that the target cannot support
  3421. */
  3422. if (vht_cap_info->ampdu_len > cfg->vht_max_mpdu)
  3423. vht_cap_info->ampdu_len = cfg->vht_max_mpdu;
  3424. if (vht_cap_info->ampdu_len >= 1)
  3425. mlme_obj->cfg.ht_caps.ht_cap_info.maximal_amsdu_size = 1;
  3426. value = (CFG_VHT_BASIC_MCS_SET_STADEF & VHT_MCS_1x1) |
  3427. vht_cap_info->basic_mcs_set;
  3428. if (vht_cap_info->enable2x2)
  3429. value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2);
  3430. vht_cap_info->basic_mcs_set = value;
  3431. value = (CFG_VHT_RX_MCS_MAP_STADEF & VHT_MCS_1x1) |
  3432. vht_cap_info->rx_mcs;
  3433. if (vht_cap_info->enable2x2)
  3434. value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2);
  3435. vht_cap_info->rx_mcs_map = value;
  3436. value = (CFG_VHT_TX_MCS_MAP_STADEF & VHT_MCS_1x1) |
  3437. vht_cap_info->tx_mcs;
  3438. if (vht_cap_info->enable2x2)
  3439. value = (value & VHT_MCS_2x2) | (vht_cap_info->tx_mcs2x2 << 2);
  3440. vht_cap_info->tx_mcs_map = value;
  3441. /* Set HW RX LDPC capability */
  3442. hw_rx_ldpc_enabled = !!cfg->vht_rx_ldpc;
  3443. if (vht_cap_info->ldpc_coding_cap && !hw_rx_ldpc_enabled)
  3444. vht_cap_info->ldpc_coding_cap = hw_rx_ldpc_enabled;
  3445. /* set the Guard interval 80MHz */
  3446. if (vht_cap_info->short_gi_80mhz && !cfg->vht_short_gi_80)
  3447. vht_cap_info->short_gi_80mhz = cfg->vht_short_gi_80;
  3448. /* Set VHT TX/RX STBC cap */
  3449. if (vht_cap_info->enable2x2) {
  3450. if (vht_cap_info->tx_stbc && !cfg->vht_tx_stbc)
  3451. vht_cap_info->tx_stbc = cfg->vht_tx_stbc;
  3452. if (vht_cap_info->rx_stbc && !cfg->vht_rx_stbc)
  3453. vht_cap_info->rx_stbc = cfg->vht_rx_stbc;
  3454. } else {
  3455. vht_cap_info->tx_stbc = 0;
  3456. vht_cap_info->rx_stbc = 0;
  3457. }
  3458. /* Set VHT SU Beamformer cap */
  3459. if (vht_cap_info->su_bformer && !cfg->vht_su_bformer)
  3460. vht_cap_info->su_bformer = cfg->vht_su_bformer;
  3461. /* check and update SU BEAMFORMEE capabality */
  3462. if (vht_cap_info->su_bformee && !cfg->vht_su_bformee)
  3463. vht_cap_info->su_bformee = cfg->vht_su_bformee;
  3464. /* Set VHT MU Beamformer cap */
  3465. if (vht_cap_info->mu_bformer && !cfg->vht_mu_bformer)
  3466. vht_cap_info->mu_bformer = cfg->vht_mu_bformer;
  3467. /* Set VHT MU Beamformee cap */
  3468. if (vht_cap_info->enable_mu_bformee && !cfg->vht_mu_bformee)
  3469. vht_cap_info->enable_mu_bformee = cfg->vht_mu_bformee;
  3470. /*
  3471. * VHT max AMPDU len exp:
  3472. * override if user configured value is too high
  3473. * that the target cannot support.
  3474. * Even though Rome publish ampdu_len=7, it can
  3475. * only support 4 because of some h/w bug.
  3476. */
  3477. if (vht_cap_info->ampdu_len_exponent > cfg->vht_max_ampdu_len_exp)
  3478. vht_cap_info->ampdu_len_exponent = cfg->vht_max_ampdu_len_exp;
  3479. /* Set VHT TXOP PS CAP */
  3480. if (vht_cap_info->txop_ps && !cfg->vht_txop_ps)
  3481. vht_cap_info->txop_ps = cfg->vht_txop_ps;
  3482. /* set the Guard interval 160MHz */
  3483. if (vht_cap_info->short_gi_160mhz && !cfg->vht_short_gi_160)
  3484. vht_cap_info->short_gi_160mhz = cfg->vht_short_gi_160;
  3485. if (cfg_get(psoc, CFG_ENABLE_VHT_MCS_10_11))
  3486. vht_cap_info->vht_mcs_10_11_supp = cfg->vht_mcs_10_11_supp;
  3487. mlme_legacy_debug("vht_mcs_10_11_supp %d",
  3488. vht_cap_info->vht_mcs_10_11_supp);
  3489. return QDF_STATUS_SUCCESS;
  3490. }
  3491. QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc)
  3492. {
  3493. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3494. struct mlme_vht_capabilities_info *vht_cap_info;
  3495. uint32_t temp = 0;
  3496. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3497. if (!mlme_obj)
  3498. return QDF_STATUS_E_FAILURE;
  3499. vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info;
  3500. temp = vht_cap_info->basic_mcs_set;
  3501. temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs;
  3502. if (vht_cap_info->enable2x2)
  3503. temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2);
  3504. else
  3505. temp |= 0x000C;
  3506. vht_cap_info->basic_mcs_set = temp;
  3507. temp = vht_cap_info->rx_mcs_map;
  3508. temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs;
  3509. if (vht_cap_info->enable2x2)
  3510. temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2);
  3511. else
  3512. temp |= 0x000C;
  3513. vht_cap_info->rx_mcs_map = temp;
  3514. temp = vht_cap_info->tx_mcs_map;
  3515. temp = (temp & 0xFFFC) | vht_cap_info->tx_mcs;
  3516. if (vht_cap_info->enable2x2)
  3517. temp = (temp & 0xFFF3) | (vht_cap_info->tx_mcs2x2 << 2);
  3518. else
  3519. temp |= 0x000C;
  3520. vht_cap_info->tx_mcs_map = temp;
  3521. return QDF_STATUS_SUCCESS;
  3522. }
  3523. #ifdef WLAN_FEATURE_11BE
  3524. bool mlme_get_bss_11be_allowed(struct wlan_objmgr_psoc *psoc,
  3525. struct qdf_mac_addr *bssid,
  3526. uint8_t *ie_data,
  3527. uint32_t ie_length)
  3528. {
  3529. struct action_oui_search_attr search_attr;
  3530. if (wlan_action_oui_is_empty(psoc, ACTION_OUI_11BE_OUI_ALLOW))
  3531. return true;
  3532. qdf_mem_zero(&search_attr, sizeof(search_attr));
  3533. search_attr.ie_data = ie_data;
  3534. search_attr.ie_length = ie_length;
  3535. if (wlan_action_oui_search(psoc, &search_attr,
  3536. ACTION_OUI_11BE_OUI_ALLOW))
  3537. return true;
  3538. mlme_legacy_debug("AP not in 11be oui allow list "QDF_MAC_ADDR_FMT,
  3539. QDF_MAC_ADDR_REF(bssid->bytes));
  3540. return false;
  3541. }
  3542. #endif
  3543. QDF_STATUS wlan_mlme_is_sap_uapsd_enabled(struct wlan_objmgr_psoc *psoc,
  3544. bool *value)
  3545. {
  3546. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3547. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3548. if (!mlme_obj)
  3549. return QDF_STATUS_E_FAILURE;
  3550. *value = mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled;
  3551. return QDF_STATUS_SUCCESS;
  3552. }
  3553. QDF_STATUS wlan_mlme_get_dtim_selection_diversity(struct wlan_objmgr_psoc *psoc,
  3554. uint32_t *dtim_selection_div)
  3555. {
  3556. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3557. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3558. if (!mlme_obj) {
  3559. *dtim_selection_div = cfg_default(CFG_DTIM_SELECTION_DIVERSITY);
  3560. return QDF_STATUS_E_FAILURE;
  3561. }
  3562. *dtim_selection_div = mlme_obj->cfg.ps_params.dtim_selection_diversity;
  3563. return QDF_STATUS_SUCCESS;
  3564. }
  3565. QDF_STATUS wlan_mlme_get_bmps_min_listen_interval(struct wlan_objmgr_psoc *psoc,
  3566. uint32_t *value)
  3567. {
  3568. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3569. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3570. if (!mlme_obj) {
  3571. *value = cfg_default(CFG_BMPS_MINIMUM_LI);
  3572. return QDF_STATUS_E_FAILURE;
  3573. }
  3574. *value = mlme_obj->cfg.ps_params.bmps_min_listen_interval;
  3575. return QDF_STATUS_SUCCESS;
  3576. }
  3577. QDF_STATUS wlan_mlme_get_bmps_max_listen_interval(struct wlan_objmgr_psoc *psoc,
  3578. uint32_t *value)
  3579. {
  3580. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3581. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3582. if (!mlme_obj) {
  3583. *value = cfg_default(CFG_BMPS_MAXIMUM_LI);
  3584. return QDF_STATUS_E_FAILURE;
  3585. }
  3586. *value = mlme_obj->cfg.ps_params.bmps_max_listen_interval;
  3587. return QDF_STATUS_SUCCESS;
  3588. }
  3589. QDF_STATUS wlan_mlme_set_sap_uapsd_flag(struct wlan_objmgr_psoc *psoc,
  3590. bool value)
  3591. {
  3592. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3593. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3594. if (!mlme_obj)
  3595. return QDF_STATUS_E_FAILURE;
  3596. mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled &= value;
  3597. return QDF_STATUS_SUCCESS;
  3598. }
  3599. QDF_STATUS wlan_mlme_get_rrm_enabled(struct wlan_objmgr_psoc *psoc,
  3600. bool *value)
  3601. {
  3602. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3603. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3604. if (!mlme_obj)
  3605. return QDF_STATUS_E_FAILURE;
  3606. *value = mlme_obj->cfg.rrm_config.rrm_enabled;
  3607. return QDF_STATUS_SUCCESS;
  3608. }
  3609. QDF_STATUS wlan_mlme_get_auto_bmps_timer_value(struct wlan_objmgr_psoc *psoc,
  3610. uint32_t *value)
  3611. {
  3612. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3613. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3614. if (!mlme_obj) {
  3615. *value = cfg_default(CFG_AUTO_BMPS_ENABLE_TIMER);
  3616. return QDF_STATUS_E_FAILURE;
  3617. }
  3618. *value = mlme_obj->cfg.ps_params.auto_bmps_timer_val;
  3619. return QDF_STATUS_SUCCESS;
  3620. }
  3621. QDF_STATUS wlan_mlme_is_bmps_enabled(struct wlan_objmgr_psoc *psoc,
  3622. bool *value)
  3623. {
  3624. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3625. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3626. if (!mlme_obj) {
  3627. *value = cfg_default(CFG_ENABLE_PS);
  3628. return QDF_STATUS_E_FAILURE;
  3629. }
  3630. *value = mlme_obj->cfg.ps_params.is_bmps_enabled;
  3631. return QDF_STATUS_SUCCESS;
  3632. }
  3633. QDF_STATUS wlan_mlme_is_imps_enabled(struct wlan_objmgr_psoc *psoc,
  3634. bool *value)
  3635. {
  3636. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3637. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3638. if (!mlme_obj) {
  3639. *value = cfg_default(CFG_ENABLE_IMPS);
  3640. return QDF_STATUS_E_FAILURE;
  3641. }
  3642. *value = mlme_obj->cfg.ps_params.is_imps_enabled;
  3643. return QDF_STATUS_SUCCESS;
  3644. }
  3645. QDF_STATUS wlan_mlme_override_bmps_imps(struct wlan_objmgr_psoc *psoc)
  3646. {
  3647. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3648. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3649. if (!mlme_obj)
  3650. return QDF_STATUS_E_FAILURE;
  3651. mlme_obj->cfg.ps_params.is_imps_enabled = 0;
  3652. mlme_obj->cfg.ps_params.is_bmps_enabled = 0;
  3653. return QDF_STATUS_SUCCESS;
  3654. }
  3655. void wlan_mlme_get_wps_uuid(struct wlan_mlme_wps_params *wps_params,
  3656. uint8_t *data)
  3657. {
  3658. qdf_size_t len = wps_params->wps_uuid.len;
  3659. wlan_mlme_get_cfg_str(data, &wps_params->wps_uuid, &len);
  3660. }
  3661. QDF_STATUS
  3662. wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc *psoc,
  3663. uint32_t *value)
  3664. {
  3665. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3666. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3667. if (!mlme_obj) {
  3668. *value = cfg_default(CFG_SELF_GEN_FRM_PWR);
  3669. mlme_legacy_err("Failed to get MLME Obj");
  3670. return QDF_STATUS_E_FAILURE;
  3671. }
  3672. *value = mlme_obj->cfg.reg.self_gen_frm_pwr;
  3673. return QDF_STATUS_SUCCESS;
  3674. }
  3675. QDF_STATUS
  3676. wlan_mlme_get_4way_hs_offload(struct wlan_objmgr_psoc *psoc, uint32_t *value)
  3677. {
  3678. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3679. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3680. if (!mlme_obj) {
  3681. *value = cfg_default(CFG_DISABLE_4WAY_HS_OFFLOAD);
  3682. mlme_legacy_err("Failed to get MLME Obj");
  3683. return QDF_STATUS_E_FAILURE;
  3684. }
  3685. *value = mlme_obj->cfg.gen.disable_4way_hs_offload;
  3686. return QDF_STATUS_SUCCESS;
  3687. }
  3688. QDF_STATUS
  3689. wlan_mlme_get_bmiss_skip_full_scan_value(struct wlan_objmgr_psoc *psoc,
  3690. bool *value)
  3691. {
  3692. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3693. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3694. if (!mlme_obj) {
  3695. *value = cfg_default(CFG_BMISS_SKIP_FULL_SCAN);
  3696. mlme_legacy_err("Failed to get MLME Obj");
  3697. return QDF_STATUS_E_FAILURE;
  3698. }
  3699. *value = mlme_obj->cfg.gen.bmiss_skip_full_scan;
  3700. return QDF_STATUS_SUCCESS;
  3701. }
  3702. QDF_STATUS mlme_get_peer_phymode(struct wlan_objmgr_psoc *psoc, uint8_t *mac,
  3703. enum wlan_phymode *peer_phymode)
  3704. {
  3705. struct wlan_objmgr_peer *peer;
  3706. peer = wlan_objmgr_get_peer_by_mac(psoc, mac, WLAN_MLME_NB_ID);
  3707. if (!peer) {
  3708. mlme_legacy_err("peer object is null");
  3709. return QDF_STATUS_E_NULL_VALUE;
  3710. }
  3711. *peer_phymode = wlan_peer_get_phymode(peer);
  3712. wlan_objmgr_peer_release_ref(peer, WLAN_MLME_NB_ID);
  3713. return QDF_STATUS_SUCCESS;
  3714. }
  3715. QDF_STATUS mlme_set_tgt_wpa3_roam_cap(struct wlan_objmgr_psoc *psoc,
  3716. uint32_t akm_bitmap)
  3717. {
  3718. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3719. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3720. if (!mlme_obj)
  3721. return QDF_STATUS_E_FAILURE;
  3722. mlme_obj->cfg.lfr.fw_akm_bitmap |= akm_bitmap;
  3723. return QDF_STATUS_SUCCESS;
  3724. }
  3725. QDF_STATUS
  3726. wlan_mlme_get_ignore_fw_reg_offload_ind(struct wlan_objmgr_psoc *psoc,
  3727. bool *disabled)
  3728. {
  3729. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3730. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3731. if (!mlme_obj)
  3732. return QDF_STATUS_E_FAILURE;
  3733. *disabled = mlme_obj->cfg.reg.ignore_fw_reg_offload_ind;
  3734. return QDF_STATUS_SUCCESS;
  3735. }
  3736. char *mlme_get_roam_status_str(uint32_t roam_status)
  3737. {
  3738. switch (roam_status) {
  3739. case 0:
  3740. return "SUCCESS";
  3741. case 1:
  3742. return "FAILED";
  3743. case 2:
  3744. return "NO ROAM";
  3745. default:
  3746. return "UNKNOWN";
  3747. }
  3748. }
  3749. char *mlme_get_roam_trigger_str(uint32_t roam_scan_trigger)
  3750. {
  3751. switch (roam_scan_trigger) {
  3752. case WMI_ROAM_TRIGGER_REASON_PER:
  3753. return "PER";
  3754. case WMI_ROAM_TRIGGER_REASON_BMISS:
  3755. return "BEACON MISS";
  3756. case WMI_ROAM_TRIGGER_REASON_LOW_RSSI:
  3757. return "LOW RSSI";
  3758. case WMI_ROAM_TRIGGER_REASON_HIGH_RSSI:
  3759. return "HIGH RSSI";
  3760. case WMI_ROAM_TRIGGER_REASON_PERIODIC:
  3761. return "PERIODIC SCAN";
  3762. case WMI_ROAM_TRIGGER_REASON_MAWC:
  3763. return "MAWC";
  3764. case WMI_ROAM_TRIGGER_REASON_DENSE:
  3765. return "DENSE ENVIRONMENT";
  3766. case WMI_ROAM_TRIGGER_REASON_BACKGROUND:
  3767. return "BACKGROUND SCAN";
  3768. case WMI_ROAM_TRIGGER_REASON_FORCED:
  3769. return "FORCED SCAN";
  3770. case WMI_ROAM_TRIGGER_REASON_BTM:
  3771. return "BTM TRIGGER";
  3772. case WMI_ROAM_TRIGGER_REASON_UNIT_TEST:
  3773. return "TEST COMMAND";
  3774. case WMI_ROAM_TRIGGER_REASON_BSS_LOAD:
  3775. return "HIGH BSS LOAD";
  3776. case WMI_ROAM_TRIGGER_REASON_DEAUTH:
  3777. return "DEAUTH RECEIVED";
  3778. case WMI_ROAM_TRIGGER_REASON_IDLE:
  3779. return "IDLE STATE SCAN";
  3780. case WMI_ROAM_TRIGGER_REASON_STA_KICKOUT:
  3781. return "STA KICKOUT";
  3782. case WMI_ROAM_TRIGGER_REASON_ESS_RSSI:
  3783. return "ESS RSSI";
  3784. case WMI_ROAM_TRIGGER_REASON_WTC_BTM:
  3785. return "WTC BTM";
  3786. case WMI_ROAM_TRIGGER_REASON_NONE:
  3787. return "NONE";
  3788. case WMI_ROAM_TRIGGER_REASON_PMK_TIMEOUT:
  3789. return "PMK Expired";
  3790. case WMI_ROAM_TRIGGER_REASON_BTC:
  3791. return "BTC TRIGGER";
  3792. default:
  3793. return "UNKNOWN";
  3794. }
  3795. }
  3796. void mlme_get_converted_timestamp(uint32_t timestamp, char *time)
  3797. {
  3798. uint32_t hr, mins, secs;
  3799. secs = timestamp / 1000;
  3800. mins = secs / 60;
  3801. hr = mins / 60;
  3802. qdf_snprint(time, TIME_STRING_LEN, "[%02d:%02d:%02d.%06u]",
  3803. (hr % 24), (mins % 60), (secs % 60),
  3804. (timestamp % 1000) * 1000);
  3805. }
  3806. #if defined(WLAN_SAE_SINGLE_PMK) && defined(WLAN_FEATURE_ROAM_OFFLOAD)
  3807. void wlan_mlme_set_sae_single_pmk_bss_cap(struct wlan_objmgr_psoc *psoc,
  3808. uint8_t vdev_id, bool val)
  3809. {
  3810. struct mlme_legacy_priv *mlme_priv;
  3811. struct wlan_objmgr_vdev *vdev;
  3812. vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
  3813. WLAN_MLME_OBJMGR_ID);
  3814. if (!vdev) {
  3815. mlme_err("get vdev failed");
  3816. return;
  3817. }
  3818. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  3819. if (!mlme_priv) {
  3820. wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
  3821. mlme_legacy_err("vdev legacy private object is NULL");
  3822. return;
  3823. }
  3824. mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap = val;
  3825. wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
  3826. }
  3827. void wlan_mlme_update_sae_single_pmk(struct wlan_objmgr_vdev *vdev,
  3828. struct mlme_pmk_info *sae_single_pmk)
  3829. {
  3830. struct mlme_legacy_priv *mlme_priv;
  3831. int32_t keymgmt;
  3832. bool is_sae_connection = false;
  3833. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  3834. if (!mlme_priv) {
  3835. mlme_legacy_err("vdev legacy private object is NULL");
  3836. return;
  3837. }
  3838. keymgmt = wlan_crypto_get_param(vdev, WLAN_CRYPTO_PARAM_KEY_MGMT);
  3839. if (keymgmt < 0) {
  3840. mlme_legacy_err("Invalid mgmt cipher");
  3841. return;
  3842. }
  3843. if (keymgmt & (1 << WLAN_CRYPTO_KEY_MGMT_SAE))
  3844. is_sae_connection = true;
  3845. mlme_legacy_debug("SAE_SPMK: single_pmk_ap:%d, is_sae_connection:%d, pmk_len:%d",
  3846. mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap,
  3847. is_sae_connection, sae_single_pmk->pmk_len);
  3848. if (mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap &&
  3849. is_sae_connection)
  3850. mlme_priv->mlme_roam.sae_single_pmk.pmk_info = *sae_single_pmk;
  3851. }
  3852. bool wlan_mlme_is_sae_single_pmk_enabled(struct wlan_objmgr_psoc *psoc)
  3853. {
  3854. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  3855. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  3856. if (!mlme_obj)
  3857. return cfg_default(CFG_SAE_SINGLE_PMK);
  3858. return mlme_obj->cfg.lfr.sae_single_pmk_feature_enabled;
  3859. }
  3860. void wlan_mlme_get_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
  3861. struct wlan_mlme_sae_single_pmk *pmksa)
  3862. {
  3863. struct mlme_legacy_priv *mlme_priv;
  3864. struct mlme_pmk_info *pmk_info;
  3865. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  3866. if (!mlme_priv) {
  3867. mlme_legacy_err("vdev legacy private object is NULL");
  3868. return;
  3869. }
  3870. pmk_info = &mlme_priv->mlme_roam.sae_single_pmk.pmk_info;
  3871. pmksa->sae_single_pmk_ap =
  3872. mlme_priv->mlme_roam.sae_single_pmk.sae_single_pmk_ap;
  3873. pmksa->pmk_info.spmk_timeout_period = pmk_info->spmk_timeout_period;
  3874. pmksa->pmk_info.spmk_timestamp = pmk_info->spmk_timestamp;
  3875. if (pmk_info->pmk_len) {
  3876. qdf_mem_copy(pmksa->pmk_info.pmk, pmk_info->pmk,
  3877. pmk_info->pmk_len);
  3878. pmksa->pmk_info.pmk_len = pmk_info->pmk_len;
  3879. return;
  3880. }
  3881. qdf_mem_zero(pmksa->pmk_info.pmk, sizeof(*pmksa->pmk_info.pmk));
  3882. pmksa->pmk_info.pmk_len = 0;
  3883. }
  3884. void wlan_mlme_clear_sae_single_pmk_info(struct wlan_objmgr_vdev *vdev,
  3885. struct mlme_pmk_info *pmk_recv)
  3886. {
  3887. struct mlme_legacy_priv *mlme_priv;
  3888. struct wlan_mlme_sae_single_pmk *sae_single_pmk;
  3889. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  3890. if (!mlme_priv) {
  3891. mlme_legacy_err("vdev legacy private object is NULL");
  3892. return;
  3893. }
  3894. sae_single_pmk = &mlme_priv->mlme_roam.sae_single_pmk;
  3895. if (!pmk_recv) {
  3896. /* Process flush pmk cmd */
  3897. mlme_legacy_debug("Flush sae_single_pmk info");
  3898. qdf_mem_zero(&sae_single_pmk->pmk_info,
  3899. sizeof(sae_single_pmk->pmk_info));
  3900. } else if (pmk_recv->pmk_len != sae_single_pmk->pmk_info.pmk_len) {
  3901. mlme_legacy_debug("Invalid pmk len");
  3902. return;
  3903. } else if (!qdf_mem_cmp(&sae_single_pmk->pmk_info.pmk, pmk_recv->pmk,
  3904. pmk_recv->pmk_len)) {
  3905. /* Process delete pmk cmd */
  3906. mlme_legacy_debug("Clear sae_single_pmk info");
  3907. qdf_mem_zero(&sae_single_pmk->pmk_info,
  3908. sizeof(sae_single_pmk->pmk_info));
  3909. }
  3910. }
  3911. #endif
  3912. char *mlme_get_roam_fail_reason_str(enum wlan_roam_failure_reason_code result)
  3913. {
  3914. switch (result) {
  3915. case ROAM_FAIL_REASON_NO_SCAN_START:
  3916. return "SCAN NOT STARTED";
  3917. case ROAM_FAIL_REASON_NO_AP_FOUND:
  3918. return "NO AP FOUND";
  3919. case ROAM_FAIL_REASON_NO_CAND_AP_FOUND:
  3920. return "NO CANDIDATE FOUND";
  3921. case ROAM_FAIL_REASON_HOST:
  3922. return "HOST ABORTED";
  3923. case ROAM_FAIL_REASON_AUTH_SEND:
  3924. return "Send AUTH Failed";
  3925. case ROAM_FAIL_REASON_AUTH_RECV:
  3926. return "Received AUTH with FAILURE Status";
  3927. case ROAM_FAIL_REASON_NO_AUTH_RESP:
  3928. return "No Auth response from AP";
  3929. case ROAM_FAIL_REASON_REASSOC_SEND:
  3930. return "Send Re-assoc request failed";
  3931. case ROAM_FAIL_REASON_REASSOC_RECV:
  3932. return "Received Re-Assoc resp with Failure status";
  3933. case ROAM_FAIL_REASON_NO_REASSOC_RESP:
  3934. return "No Re-assoc response from AP";
  3935. case ROAM_FAIL_REASON_EAPOL_TIMEOUT:
  3936. return "EAPOL M1 timed out";
  3937. case ROAM_FAIL_REASON_MLME:
  3938. return "MLME error";
  3939. case ROAM_FAIL_REASON_INTERNAL_ABORT:
  3940. return "Fw aborted roam";
  3941. case ROAM_FAIL_REASON_SCAN_START:
  3942. return "Unable to start roam scan";
  3943. case ROAM_FAIL_REASON_AUTH_NO_ACK:
  3944. return "No ACK for Auth req";
  3945. case ROAM_FAIL_REASON_AUTH_INTERNAL_DROP:
  3946. return "Auth req dropped internally";
  3947. case ROAM_FAIL_REASON_REASSOC_NO_ACK:
  3948. return "No ACK for Re-assoc req";
  3949. case ROAM_FAIL_REASON_REASSOC_INTERNAL_DROP:
  3950. return "Re-assoc dropped internally";
  3951. case ROAM_FAIL_REASON_EAPOL_M2_SEND:
  3952. return "Unable to send M2 frame";
  3953. case ROAM_FAIL_REASON_EAPOL_M2_INTERNAL_DROP:
  3954. return "M2 Frame dropped internally";
  3955. case ROAM_FAIL_REASON_EAPOL_M2_NO_ACK:
  3956. return "No ACK for M2 frame";
  3957. case ROAM_FAIL_REASON_EAPOL_M3_TIMEOUT:
  3958. return "EAPOL M3 timed out";
  3959. case ROAM_FAIL_REASON_EAPOL_M4_SEND:
  3960. return "Unable to send M4 frame";
  3961. case ROAM_FAIL_REASON_EAPOL_M4_INTERNAL_DROP:
  3962. return "M4 frame dropped internally";
  3963. case ROAM_FAIL_REASON_EAPOL_M4_NO_ACK:
  3964. return "No ACK for M4 frame";
  3965. case ROAM_FAIL_REASON_NO_SCAN_FOR_FINAL_BMISS:
  3966. return "No scan on final BMISS";
  3967. case ROAM_FAIL_REASON_DISCONNECT:
  3968. return "Disconnect received during handoff";
  3969. case ROAM_FAIL_REASON_SYNC:
  3970. return "Previous roam sync pending";
  3971. case ROAM_FAIL_REASON_SAE_INVALID_PMKID:
  3972. return "Reason assoc reject - invalid PMKID";
  3973. case ROAM_FAIL_REASON_SAE_PREAUTH_TIMEOUT:
  3974. return "SAE preauth timed out";
  3975. case ROAM_FAIL_REASON_SAE_PREAUTH_FAIL:
  3976. return "SAE preauth failed";
  3977. case ROAM_FAIL_REASON_UNABLE_TO_START_ROAM_HO:
  3978. return "Start handoff failed- internal error";
  3979. case ROAM_FAIL_REASON_NO_AP_FOUND_AND_FINAL_BMISS_SENT:
  3980. return "No AP found on final BMISS";
  3981. case ROAM_FAIL_REASON_NO_CAND_AP_FOUND_AND_FINAL_BMISS_SENT:
  3982. return "No Candidate AP found on final BMISS";
  3983. case ROAM_FAIL_REASON_CURR_AP_STILL_OK:
  3984. return "CURRENT AP STILL OK";
  3985. default:
  3986. return "UNKNOWN";
  3987. }
  3988. }
  3989. char *mlme_get_sub_reason_str(enum roam_trigger_sub_reason sub_reason)
  3990. {
  3991. switch (sub_reason) {
  3992. case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER:
  3993. return "PERIODIC TIMER";
  3994. case ROAM_TRIGGER_SUB_REASON_LOW_RSSI_PERIODIC:
  3995. return "LOW RSSI PERIODIC TIMER1";
  3996. case ROAM_TRIGGER_SUB_REASON_BTM_DI_TIMER:
  3997. return "BTM DISASSOC IMMINENT TIMER";
  3998. case ROAM_TRIGGER_SUB_REASON_FULL_SCAN:
  3999. return "FULL SCAN";
  4000. case ROAM_TRIGGER_SUB_REASON_CU_PERIODIC:
  4001. return "CU PERIODIC Timer1";
  4002. case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_LOW_RSSI:
  4003. return "LOW RSSI INACTIVE TIMER";
  4004. case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY_CU:
  4005. return "CU PERIODIC TIMER2";
  4006. case ROAM_TRIGGER_SUB_REASON_PERIODIC_TIMER_AFTER_INACTIVITY:
  4007. return "LOW RSSI PERIODIC TIMER2";
  4008. case ROAM_TRIGGER_SUB_REASON_INACTIVITY_TIMER_CU:
  4009. return "CU INACTIVITY TIMER";
  4010. default:
  4011. return "NONE";
  4012. }
  4013. }
  4014. QDF_STATUS
  4015. wlan_mlme_get_mgmt_max_retry(struct wlan_objmgr_psoc *psoc,
  4016. uint8_t *max_retry)
  4017. {
  4018. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4019. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4020. if (!mlme_obj) {
  4021. *max_retry = cfg_default(CFG_MGMT_RETRY_MAX);
  4022. return QDF_STATUS_E_FAILURE;
  4023. }
  4024. *max_retry = mlme_obj->cfg.gen.mgmt_retry_max;
  4025. return QDF_STATUS_SUCCESS;
  4026. }
  4027. QDF_STATUS
  4028. wlan_mlme_get_mgmt_6ghz_rate_support(struct wlan_objmgr_psoc *psoc,
  4029. bool *enable_he_mcs0_for_6ghz_mgmt)
  4030. {
  4031. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4032. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4033. if (!mlme_obj) {
  4034. *enable_he_mcs0_for_6ghz_mgmt =
  4035. cfg_default(CFG_ENABLE_HE_MCS0_MGMT_6GHZ);
  4036. return QDF_STATUS_E_FAILURE;
  4037. }
  4038. *enable_he_mcs0_for_6ghz_mgmt =
  4039. mlme_obj->cfg.gen.enable_he_mcs0_for_6ghz_mgmt;
  4040. return QDF_STATUS_SUCCESS;
  4041. }
  4042. QDF_STATUS
  4043. wlan_mlme_get_status_ring_buffer(struct wlan_objmgr_psoc *psoc,
  4044. bool *enable_ring_buffer)
  4045. {
  4046. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4047. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4048. if (!mlme_obj) {
  4049. *enable_ring_buffer = cfg_default(CFG_ENABLE_RING_BUFFER);
  4050. return QDF_STATUS_E_FAILURE;
  4051. }
  4052. *enable_ring_buffer = mlme_obj->cfg.gen.enable_ring_buffer;
  4053. return QDF_STATUS_SUCCESS;
  4054. }
  4055. bool wlan_mlme_get_peer_unmap_conf(struct wlan_objmgr_psoc *psoc)
  4056. {
  4057. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4058. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4059. if (!mlme_obj)
  4060. return false;
  4061. return mlme_obj->cfg.gen.enable_peer_unmap_conf_support;
  4062. }
  4063. #ifdef WLAN_FEATURE_ROAM_OFFLOAD
  4064. QDF_STATUS
  4065. wlan_mlme_get_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
  4066. uint8_t *roam_reason_vsie_enable)
  4067. {
  4068. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4069. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4070. if (!mlme_obj) {
  4071. *roam_reason_vsie_enable =
  4072. cfg_default(CFG_ENABLE_ROAM_REASON_VSIE);
  4073. return QDF_STATUS_E_FAILURE;
  4074. }
  4075. *roam_reason_vsie_enable = mlme_obj->cfg.lfr.enable_roam_reason_vsie;
  4076. return QDF_STATUS_SUCCESS;
  4077. }
  4078. QDF_STATUS
  4079. wlan_mlme_set_roam_reason_vsie_status(struct wlan_objmgr_psoc *psoc,
  4080. uint8_t roam_reason_vsie_enable)
  4081. {
  4082. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4083. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4084. if (!mlme_obj)
  4085. return QDF_STATUS_E_FAILURE;
  4086. mlme_obj->cfg.lfr.enable_roam_reason_vsie = roam_reason_vsie_enable;
  4087. return QDF_STATUS_SUCCESS;
  4088. }
  4089. uint32_t wlan_mlme_get_roaming_triggers(struct wlan_objmgr_psoc *psoc)
  4090. {
  4091. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4092. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4093. if (!mlme_obj)
  4094. return cfg_default(CFG_ROAM_TRIGGER_BITMAP);
  4095. return mlme_obj->cfg.lfr.roam_trigger_bitmap;
  4096. }
  4097. void wlan_mlme_set_roaming_triggers(struct wlan_objmgr_psoc *psoc,
  4098. uint32_t trigger_bitmap)
  4099. {
  4100. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4101. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4102. if (!mlme_obj)
  4103. return;
  4104. mlme_obj->cfg.lfr.roam_trigger_bitmap = trigger_bitmap;
  4105. }
  4106. QDF_STATUS
  4107. wlan_mlme_get_roaming_offload(struct wlan_objmgr_psoc *psoc,
  4108. bool *val)
  4109. {
  4110. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4111. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4112. if (!mlme_obj) {
  4113. *val = cfg_default(CFG_LFR3_ROAMING_OFFLOAD);
  4114. return QDF_STATUS_E_INVAL;
  4115. }
  4116. *val = mlme_obj->cfg.lfr.lfr3_roaming_offload;
  4117. return QDF_STATUS_SUCCESS;
  4118. }
  4119. QDF_STATUS
  4120. wlan_mlme_get_enable_disconnect_roam_offload(struct wlan_objmgr_psoc *psoc,
  4121. bool *val)
  4122. {
  4123. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4124. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4125. if (!mlme_obj) {
  4126. *val = cfg_default(CFG_LFR_ENABLE_DISCONNECT_ROAM);
  4127. return QDF_STATUS_E_INVAL;
  4128. }
  4129. *val = mlme_obj->cfg.lfr.enable_disconnect_roam_offload;
  4130. return QDF_STATUS_SUCCESS;
  4131. }
  4132. QDF_STATUS
  4133. wlan_mlme_get_enable_idle_roam(struct wlan_objmgr_psoc *psoc, bool *val)
  4134. {
  4135. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4136. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4137. if (!mlme_obj) {
  4138. *val = cfg_default(CFG_LFR_ENABLE_IDLE_ROAM);
  4139. return QDF_STATUS_E_INVAL;
  4140. }
  4141. *val = mlme_obj->cfg.lfr.enable_idle_roam;
  4142. return QDF_STATUS_SUCCESS;
  4143. }
  4144. QDF_STATUS
  4145. wlan_mlme_get_idle_roam_rssi_delta(struct wlan_objmgr_psoc *psoc, uint32_t *val)
  4146. {
  4147. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4148. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4149. if (!mlme_obj) {
  4150. *val = cfg_default(CFG_LFR_IDLE_ROAM_RSSI_DELTA);
  4151. return QDF_STATUS_E_INVAL;
  4152. }
  4153. *val = mlme_obj->cfg.lfr.idle_roam_rssi_delta;
  4154. return QDF_STATUS_SUCCESS;
  4155. }
  4156. QDF_STATUS
  4157. wlan_mlme_get_roam_info_stats_num(struct wlan_objmgr_psoc *psoc, uint32_t *val)
  4158. {
  4159. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4160. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4161. if (!mlme_obj) {
  4162. *val = cfg_default(CFG_LFR3_ROAM_INFO_STATS_NUM);
  4163. return QDF_STATUS_E_INVAL;
  4164. }
  4165. *val = mlme_obj->cfg.lfr.roam_info_stats_num;
  4166. return QDF_STATUS_SUCCESS;
  4167. }
  4168. QDF_STATUS
  4169. wlan_mlme_get_idle_roam_inactive_time(struct wlan_objmgr_psoc *psoc,
  4170. uint32_t *val)
  4171. {
  4172. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4173. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4174. if (!mlme_obj) {
  4175. *val = cfg_default(CFG_LFR_IDLE_ROAM_INACTIVE_TIME);
  4176. return QDF_STATUS_E_INVAL;
  4177. }
  4178. *val = mlme_obj->cfg.lfr.idle_roam_inactive_time;
  4179. return QDF_STATUS_SUCCESS;
  4180. }
  4181. QDF_STATUS
  4182. wlan_mlme_get_idle_data_packet_count(struct wlan_objmgr_psoc *psoc,
  4183. uint32_t *val)
  4184. {
  4185. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4186. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4187. if (!mlme_obj) {
  4188. *val = cfg_default(CFG_LFR_IDLE_ROAM_PACKET_COUNT);
  4189. return QDF_STATUS_E_INVAL;
  4190. }
  4191. *val = mlme_obj->cfg.lfr.idle_data_packet_count;
  4192. return QDF_STATUS_SUCCESS;
  4193. }
  4194. QDF_STATUS
  4195. wlan_mlme_get_idle_roam_min_rssi(struct wlan_objmgr_psoc *psoc, uint32_t *val)
  4196. {
  4197. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4198. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4199. if (!mlme_obj) {
  4200. *val = cfg_default(CFG_LFR_IDLE_ROAM_MIN_RSSI);
  4201. return QDF_STATUS_E_INVAL;
  4202. }
  4203. *val = mlme_obj->cfg.lfr.idle_roam_min_rssi;
  4204. return QDF_STATUS_SUCCESS;
  4205. }
  4206. QDF_STATUS
  4207. wlan_mlme_get_idle_roam_band(struct wlan_objmgr_psoc *psoc, uint32_t *val)
  4208. {
  4209. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4210. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4211. if (!mlme_obj) {
  4212. *val = cfg_default(CFG_LFR_IDLE_ROAM_BAND);
  4213. return QDF_STATUS_E_INVAL;
  4214. }
  4215. *val = mlme_obj->cfg.lfr.idle_roam_band;
  4216. return QDF_STATUS_SUCCESS;
  4217. }
  4218. QDF_STATUS
  4219. wlan_mlme_get_self_bss_roam(struct wlan_objmgr_psoc *psoc,
  4220. uint8_t *enable_self_bss_roam)
  4221. {
  4222. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4223. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4224. if (!mlme_obj) {
  4225. *enable_self_bss_roam =
  4226. cfg_get(psoc, CFG_LFR3_ENABLE_SELF_BSS_ROAM);
  4227. return QDF_STATUS_E_FAILURE;
  4228. }
  4229. *enable_self_bss_roam = mlme_obj->cfg.lfr.enable_self_bss_roam;
  4230. return QDF_STATUS_SUCCESS;
  4231. }
  4232. #endif
  4233. QDF_STATUS
  4234. wlan_mlme_set_ft_over_ds(struct wlan_objmgr_psoc *psoc,
  4235. uint8_t ft_over_ds_enable)
  4236. {
  4237. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4238. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4239. if (!mlme_obj)
  4240. return QDF_STATUS_E_FAILURE;
  4241. mlme_obj->cfg.lfr.enable_ft_over_ds = ft_over_ds_enable;
  4242. return QDF_STATUS_SUCCESS;
  4243. }
  4244. QDF_STATUS
  4245. wlan_mlme_get_dfs_chan_ageout_time(struct wlan_objmgr_psoc *psoc,
  4246. uint8_t *dfs_chan_ageout_time)
  4247. {
  4248. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4249. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4250. if (!mlme_obj) {
  4251. *dfs_chan_ageout_time =
  4252. cfg_default(CFG_DFS_CHAN_AGEOUT_TIME);
  4253. return QDF_STATUS_E_FAILURE;
  4254. }
  4255. *dfs_chan_ageout_time = mlme_obj->cfg.gen.dfs_chan_ageout_time;
  4256. return QDF_STATUS_SUCCESS;
  4257. }
  4258. #ifdef WLAN_FEATURE_SAE
  4259. #define NUM_RETRY_BITS 3
  4260. #define ROAM_AUTH_INDEX 2
  4261. #define ASSOC_INDEX 1
  4262. #define AUTH_INDEX 0
  4263. #define MAX_RETRIES 2
  4264. #define MAX_ROAM_AUTH_RETRIES 1
  4265. #define MAX_AUTH_RETRIES 3
  4266. QDF_STATUS
  4267. wlan_mlme_get_sae_assoc_retry_count(struct wlan_objmgr_psoc *psoc,
  4268. uint8_t *retry_count)
  4269. {
  4270. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4271. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4272. if (!mlme_obj) {
  4273. *retry_count = 0;
  4274. return QDF_STATUS_E_FAILURE;
  4275. }
  4276. *retry_count =
  4277. QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries,
  4278. ASSOC_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS);
  4279. *retry_count = QDF_MIN(MAX_RETRIES, *retry_count);
  4280. return QDF_STATUS_SUCCESS;
  4281. }
  4282. QDF_STATUS
  4283. wlan_mlme_get_sae_auth_retry_count(struct wlan_objmgr_psoc *psoc,
  4284. uint8_t *retry_count)
  4285. {
  4286. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4287. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4288. if (!mlme_obj) {
  4289. *retry_count = 0;
  4290. return QDF_STATUS_E_FAILURE;
  4291. }
  4292. *retry_count =
  4293. QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries,
  4294. AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS);
  4295. *retry_count = QDF_MIN(MAX_AUTH_RETRIES, *retry_count);
  4296. return QDF_STATUS_SUCCESS;
  4297. }
  4298. QDF_STATUS
  4299. wlan_mlme_get_sae_roam_auth_retry_count(struct wlan_objmgr_psoc *psoc,
  4300. uint8_t *retry_count)
  4301. {
  4302. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4303. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4304. if (!mlme_obj) {
  4305. *retry_count = 0;
  4306. return QDF_STATUS_E_FAILURE;
  4307. }
  4308. *retry_count =
  4309. QDF_GET_BITS(mlme_obj->cfg.gen.sae_connect_retries,
  4310. ROAM_AUTH_INDEX * NUM_RETRY_BITS, NUM_RETRY_BITS);
  4311. *retry_count = QDF_MIN(MAX_ROAM_AUTH_RETRIES, *retry_count);
  4312. return QDF_STATUS_SUCCESS;
  4313. }
  4314. #endif
  4315. #ifdef WLAN_FEATURE_ROAM_OFFLOAD
  4316. bool
  4317. wlan_mlme_get_dual_sta_roaming_enabled(struct wlan_objmgr_psoc *psoc)
  4318. {
  4319. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4320. bool dual_sta_roaming_enabled;
  4321. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4322. if (!mlme_obj)
  4323. return cfg_default(CFG_ENABLE_DUAL_STA_ROAM_OFFLOAD);
  4324. dual_sta_roaming_enabled =
  4325. mlme_obj->cfg.lfr.lfr3_roaming_offload &&
  4326. mlme_obj->cfg.lfr.lfr3_dual_sta_roaming_enabled &&
  4327. wlan_mlme_get_dual_sta_roam_support(psoc) &&
  4328. policy_mgr_is_hw_dbs_capable(psoc);
  4329. return dual_sta_roaming_enabled;
  4330. }
  4331. #endif
  4332. QDF_STATUS
  4333. wlan_mlme_get_roam_scan_offload_enabled(struct wlan_objmgr_psoc *psoc,
  4334. bool *val)
  4335. {
  4336. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4337. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4338. if (!mlme_obj) {
  4339. *val = cfg_default(CFG_LFR_ROAM_SCAN_OFFLOAD_ENABLED);
  4340. return QDF_STATUS_E_INVAL;
  4341. }
  4342. *val = mlme_obj->cfg.lfr.roam_scan_offload_enabled;
  4343. return QDF_STATUS_SUCCESS;
  4344. }
  4345. QDF_STATUS
  4346. wlan_mlme_get_roam_bmiss_final_bcnt(struct wlan_objmgr_psoc *psoc,
  4347. uint8_t *val)
  4348. {
  4349. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4350. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4351. if (!mlme_obj) {
  4352. *val = cfg_default(CFG_LFR_ROAM_BMISS_FINAL_BCNT);
  4353. return QDF_STATUS_E_INVAL;
  4354. }
  4355. *val = mlme_obj->cfg.lfr.roam_bmiss_final_bcnt;
  4356. return QDF_STATUS_SUCCESS;
  4357. }
  4358. QDF_STATUS
  4359. wlan_mlme_get_bmiss_timeout_on_wakeup(struct wlan_objmgr_psoc *psoc,
  4360. uint8_t *val)
  4361. {
  4362. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4363. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4364. if (!mlme_obj) {
  4365. *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_WAKEUP);
  4366. return QDF_STATUS_E_INVAL;
  4367. }
  4368. *val = mlme_obj->cfg.lfr.beaconloss_timeout_onwakeup;
  4369. return QDF_STATUS_SUCCESS;
  4370. }
  4371. QDF_STATUS
  4372. wlan_mlme_get_bmiss_timeout_on_sleep(struct wlan_objmgr_psoc *psoc,
  4373. uint8_t *val)
  4374. {
  4375. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4376. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4377. if (!mlme_obj) {
  4378. *val = cfg_default(CFG_LFR_BEACONLOSS_TIMEOUT_ON_SLEEP);
  4379. return QDF_STATUS_E_INVAL;
  4380. }
  4381. *val = mlme_obj->cfg.lfr.beaconloss_timeout_onsleep;
  4382. return QDF_STATUS_SUCCESS;
  4383. }
  4384. QDF_STATUS
  4385. wlan_mlme_get_roam_bmiss_first_bcnt(struct wlan_objmgr_psoc *psoc,
  4386. uint8_t *val)
  4387. {
  4388. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4389. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4390. if (!mlme_obj) {
  4391. *val = cfg_default(CFG_LFR_ROAM_BMISS_FIRST_BCNT);
  4392. return QDF_STATUS_E_INVAL;
  4393. }
  4394. *val = mlme_obj->cfg.lfr.roam_bmiss_first_bcnt;
  4395. return QDF_STATUS_SUCCESS;
  4396. }
  4397. #ifdef WLAN_ADAPTIVE_11R
  4398. bool wlan_mlme_adaptive_11r_enabled(struct wlan_objmgr_psoc *psoc)
  4399. {
  4400. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4401. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4402. if (!mlme_obj)
  4403. return cfg_default(CFG_ADAPTIVE_11R);
  4404. return mlme_obj->cfg.lfr.enable_adaptive_11r;
  4405. }
  4406. #endif
  4407. QDF_STATUS
  4408. wlan_mlme_get_mawc_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  4409. {
  4410. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4411. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4412. if (!mlme_obj) {
  4413. *val = cfg_default(CFG_LFR_MAWC_FEATURE_ENABLED);
  4414. return QDF_STATUS_E_INVAL;
  4415. }
  4416. *val = mlme_obj->cfg.lfr.mawc_enabled;
  4417. return QDF_STATUS_SUCCESS;
  4418. }
  4419. QDF_STATUS
  4420. wlan_mlme_get_mawc_roam_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  4421. {
  4422. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4423. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4424. if (!mlme_obj) {
  4425. *val = cfg_default(CFG_LFR_MAWC_ROAM_ENABLED);
  4426. return QDF_STATUS_E_INVAL;
  4427. }
  4428. *val = mlme_obj->cfg.lfr.mawc_roam_enabled;
  4429. return QDF_STATUS_SUCCESS;
  4430. }
  4431. QDF_STATUS
  4432. wlan_mlme_get_mawc_roam_traffic_threshold(struct wlan_objmgr_psoc *psoc,
  4433. uint32_t *val)
  4434. {
  4435. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4436. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4437. if (!mlme_obj) {
  4438. *val = cfg_default(CFG_LFR_MAWC_ROAM_TRAFFIC_THRESHOLD);
  4439. return QDF_STATUS_E_INVAL;
  4440. }
  4441. *val = mlme_obj->cfg.lfr.mawc_roam_traffic_threshold;
  4442. return QDF_STATUS_SUCCESS;
  4443. }
  4444. QDF_STATUS
  4445. wlan_mlme_get_mawc_roam_ap_rssi_threshold(struct wlan_objmgr_psoc *psoc,
  4446. uint32_t *val)
  4447. {
  4448. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4449. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4450. if (!mlme_obj) {
  4451. *val = cfg_default(CFG_LFR_MAWC_ROAM_AP_RSSI_THRESHOLD);
  4452. return QDF_STATUS_E_INVAL;
  4453. }
  4454. *val = mlme_obj->cfg.lfr.mawc_roam_ap_rssi_threshold;
  4455. return QDF_STATUS_SUCCESS;
  4456. }
  4457. QDF_STATUS
  4458. wlan_mlme_get_mawc_roam_rssi_high_adjust(struct wlan_objmgr_psoc *psoc,
  4459. uint8_t *val)
  4460. {
  4461. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4462. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4463. if (!mlme_obj) {
  4464. *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_HIGH_ADJUST);
  4465. return QDF_STATUS_E_INVAL;
  4466. }
  4467. *val = mlme_obj->cfg.lfr.mawc_roam_rssi_high_adjust;
  4468. return QDF_STATUS_SUCCESS;
  4469. }
  4470. QDF_STATUS
  4471. wlan_mlme_get_mawc_roam_rssi_low_adjust(struct wlan_objmgr_psoc *psoc,
  4472. uint8_t *val)
  4473. {
  4474. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4475. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4476. if (!mlme_obj) {
  4477. *val = cfg_default(CFG_LFR_MAWC_ROAM_RSSI_LOW_ADJUST);
  4478. return QDF_STATUS_E_INVAL;
  4479. }
  4480. *val = mlme_obj->cfg.lfr.mawc_roam_rssi_low_adjust;
  4481. return QDF_STATUS_SUCCESS;
  4482. }
  4483. QDF_STATUS
  4484. wlan_mlme_get_bss_load_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  4485. {
  4486. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4487. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4488. if (!mlme_obj) {
  4489. *val = cfg_default(CFG_ENABLE_BSS_LOAD_TRIGGERED_ROAM);
  4490. return QDF_STATUS_E_INVAL;
  4491. }
  4492. *val = mlme_obj->cfg.lfr.bss_load_trig.enabled;
  4493. return QDF_STATUS_SUCCESS;
  4494. }
  4495. QDF_STATUS
  4496. wlan_mlme_get_bss_load_threshold(struct wlan_objmgr_psoc *psoc, uint32_t *val)
  4497. {
  4498. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4499. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4500. if (!mlme_obj) {
  4501. *val = cfg_default(CFG_BSS_LOAD_THRESHOLD);
  4502. return QDF_STATUS_E_INVAL;
  4503. }
  4504. *val = mlme_obj->cfg.lfr.bss_load_trig.threshold;
  4505. return QDF_STATUS_SUCCESS;
  4506. }
  4507. QDF_STATUS
  4508. wlan_mlme_get_bss_load_sample_time(struct wlan_objmgr_psoc *psoc,
  4509. uint32_t *val)
  4510. {
  4511. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4512. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4513. if (!mlme_obj) {
  4514. *val = cfg_default(CFG_BSS_LOAD_SAMPLE_TIME);
  4515. return QDF_STATUS_E_INVAL;
  4516. }
  4517. *val = mlme_obj->cfg.lfr.bss_load_trig.sample_time;
  4518. return QDF_STATUS_SUCCESS;
  4519. }
  4520. QDF_STATUS
  4521. wlan_mlme_get_bss_load_rssi_threshold_6ghz(struct wlan_objmgr_psoc *psoc,
  4522. int32_t *val)
  4523. {
  4524. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4525. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4526. if (!mlme_obj) {
  4527. *val = cfg_default(CFG_BSS_LOAD_TRIG_6G_RSSI_THRES);
  4528. return QDF_STATUS_E_INVAL;
  4529. }
  4530. *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_6ghz;
  4531. return QDF_STATUS_SUCCESS;
  4532. }
  4533. QDF_STATUS
  4534. wlan_mlme_get_bss_load_rssi_threshold_5ghz(struct wlan_objmgr_psoc *psoc,
  4535. int32_t *val)
  4536. {
  4537. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4538. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4539. if (!mlme_obj) {
  4540. *val = cfg_default(CFG_BSS_LOAD_TRIG_5G_RSSI_THRES);
  4541. return QDF_STATUS_E_INVAL;
  4542. }
  4543. *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_5ghz;
  4544. return QDF_STATUS_SUCCESS;
  4545. }
  4546. QDF_STATUS
  4547. wlan_mlme_get_bss_load_rssi_threshold_24ghz(struct wlan_objmgr_psoc *psoc,
  4548. int32_t *val)
  4549. {
  4550. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4551. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4552. if (!mlme_obj) {
  4553. *val = cfg_default(CFG_BSS_LOAD_TRIG_2G_RSSI_THRES);
  4554. return QDF_STATUS_E_INVAL;
  4555. }
  4556. *val = mlme_obj->cfg.lfr.bss_load_trig.rssi_threshold_24ghz;
  4557. return QDF_STATUS_SUCCESS;
  4558. }
  4559. bool
  4560. wlan_mlme_check_chan_param_has_dfs(struct wlan_objmgr_pdev *pdev,
  4561. struct ch_params *ch_params,
  4562. uint32_t chan_freq)
  4563. {
  4564. bool is_dfs = false;
  4565. if (ch_params->ch_width == CH_WIDTH_160MHZ) {
  4566. wlan_reg_set_create_punc_bitmap(ch_params, true);
  4567. if (wlan_reg_get_5g_bonded_channel_state_for_pwrmode(pdev,
  4568. chan_freq,
  4569. ch_params,
  4570. REG_CURRENT_PWR_MODE) ==
  4571. CHANNEL_STATE_DFS)
  4572. is_dfs = true;
  4573. } else if (ch_params->ch_width == CH_WIDTH_80P80MHZ) {
  4574. if (wlan_reg_get_channel_state_for_pwrmode(
  4575. pdev,
  4576. chan_freq,
  4577. REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS ||
  4578. wlan_reg_get_channel_state_for_pwrmode(
  4579. pdev,
  4580. ch_params->mhz_freq_seg1,
  4581. REG_CURRENT_PWR_MODE) == CHANNEL_STATE_DFS)
  4582. is_dfs = true;
  4583. } else if (wlan_reg_is_dfs_for_freq(pdev, chan_freq)) {
  4584. /*Indoor channels are also marked DFS, therefore
  4585. * check if the channel has REGULATORY_CHAN_RADAR
  4586. * channel flag to identify if the channel is DFS
  4587. */
  4588. is_dfs = true;
  4589. }
  4590. if (WLAN_REG_IS_6GHZ_CHAN_FREQ(chan_freq) ||
  4591. WLAN_REG_IS_24GHZ_CH_FREQ(chan_freq))
  4592. is_dfs = false;
  4593. return is_dfs;
  4594. }
  4595. QDF_STATUS
  4596. wlan_mlme_set_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool val)
  4597. {
  4598. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4599. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4600. if (!mlme_obj)
  4601. return QDF_STATUS_E_FAILURE;
  4602. mlme_obj->cfg.sta.usr_disabled_roaming = val;
  4603. return QDF_STATUS_SUCCESS;
  4604. }
  4605. QDF_STATUS
  4606. wlan_mlme_get_usr_disabled_roaming(struct wlan_objmgr_psoc *psoc, bool *val)
  4607. {
  4608. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4609. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4610. if (!mlme_obj)
  4611. return QDF_STATUS_E_INVAL;
  4612. *val = mlme_obj->cfg.sta.usr_disabled_roaming;
  4613. return QDF_STATUS_SUCCESS;
  4614. }
  4615. qdf_size_t mlme_get_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
  4616. qdf_size_t len)
  4617. {
  4618. struct mlme_legacy_priv *mlme_priv;
  4619. if (!vdev || !dst || !len) {
  4620. mlme_legacy_err("invalid params");
  4621. return 0;
  4622. }
  4623. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4624. if (!mlme_priv) {
  4625. mlme_legacy_err("vdev legacy private object is NULL");
  4626. return 0;
  4627. }
  4628. if (len < mlme_priv->opr_rate_set.len) {
  4629. mlme_legacy_err("Invalid length %zd (<%zd)", len,
  4630. mlme_priv->opr_rate_set.len);
  4631. return 0;
  4632. }
  4633. qdf_mem_copy(dst, mlme_priv->opr_rate_set.data,
  4634. mlme_priv->opr_rate_set.len);
  4635. return mlme_priv->opr_rate_set.len;
  4636. }
  4637. QDF_STATUS mlme_set_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
  4638. qdf_size_t len)
  4639. {
  4640. struct mlme_legacy_priv *mlme_priv;
  4641. if (!vdev || !src) {
  4642. mlme_legacy_err("invalid params");
  4643. return QDF_STATUS_E_INVAL;
  4644. }
  4645. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4646. if (!mlme_priv) {
  4647. mlme_legacy_err("vdev legacy private object is NULL");
  4648. return QDF_STATUS_E_FAILURE;
  4649. }
  4650. if (len > mlme_priv->opr_rate_set.max_len) {
  4651. mlme_legacy_err("Invalid len %zd (>%zd)", len,
  4652. mlme_priv->opr_rate_set.max_len);
  4653. return QDF_STATUS_E_INVAL;
  4654. }
  4655. mlme_priv->opr_rate_set.len = len;
  4656. qdf_mem_copy(mlme_priv->opr_rate_set.data, src, len);
  4657. return QDF_STATUS_SUCCESS;
  4658. }
  4659. qdf_size_t mlme_get_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
  4660. qdf_size_t len)
  4661. {
  4662. struct mlme_legacy_priv *mlme_priv;
  4663. if (!vdev || !dst || !len) {
  4664. mlme_legacy_err("invalid params");
  4665. return 0;
  4666. }
  4667. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4668. if (!mlme_priv) {
  4669. mlme_legacy_err("vdev legacy private object is NULL");
  4670. return 0;
  4671. }
  4672. if (len < mlme_priv->ext_opr_rate_set.len) {
  4673. mlme_legacy_err("Invalid length %zd (<%zd)", len,
  4674. mlme_priv->ext_opr_rate_set.len);
  4675. return 0;
  4676. }
  4677. qdf_mem_copy(dst, mlme_priv->ext_opr_rate_set.data,
  4678. mlme_priv->ext_opr_rate_set.len);
  4679. return mlme_priv->ext_opr_rate_set.len;
  4680. }
  4681. QDF_STATUS mlme_set_ext_opr_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
  4682. qdf_size_t len)
  4683. {
  4684. struct mlme_legacy_priv *mlme_priv;
  4685. if (!vdev || !src) {
  4686. mlme_legacy_err("invalid params");
  4687. return QDF_STATUS_E_INVAL;
  4688. }
  4689. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4690. if (!mlme_priv) {
  4691. mlme_legacy_err("vdev legacy private object is NULL");
  4692. return QDF_STATUS_E_FAILURE;
  4693. }
  4694. if (len > mlme_priv->ext_opr_rate_set.max_len) {
  4695. mlme_legacy_err("Invalid len %zd (>%zd)", len,
  4696. mlme_priv->ext_opr_rate_set.max_len);
  4697. return QDF_STATUS_E_INVAL;
  4698. }
  4699. mlme_priv->ext_opr_rate_set.len = len;
  4700. qdf_mem_copy(mlme_priv->ext_opr_rate_set.data, src, len);
  4701. return QDF_STATUS_SUCCESS;
  4702. }
  4703. QDF_STATUS mlme_clear_ext_opr_rate(struct wlan_objmgr_vdev *vdev)
  4704. {
  4705. struct mlme_legacy_priv *mlme_priv;
  4706. if (!vdev) {
  4707. mlme_legacy_err("invalid params");
  4708. return QDF_STATUS_E_INVAL;
  4709. }
  4710. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4711. if (!mlme_priv) {
  4712. mlme_legacy_err("vdev legacy private object is NULL");
  4713. return QDF_STATUS_E_FAILURE;
  4714. }
  4715. mlme_priv->ext_opr_rate_set.len = 0;
  4716. qdf_mem_set(mlme_priv->ext_opr_rate_set.data, CFG_STR_DATA_LEN, 0);
  4717. return QDF_STATUS_SUCCESS;
  4718. }
  4719. qdf_size_t mlme_get_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *dst,
  4720. qdf_size_t len)
  4721. {
  4722. struct mlme_legacy_priv *mlme_priv;
  4723. if (!vdev || !dst || !len) {
  4724. mlme_legacy_err("invalid params");
  4725. return 0;
  4726. }
  4727. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4728. if (!mlme_priv) {
  4729. mlme_legacy_err("vdev legacy private object is NULL");
  4730. return 0;
  4731. }
  4732. if (len < mlme_priv->mcs_rate_set.len) {
  4733. mlme_legacy_err("Invalid length %zd (<%zd)", len,
  4734. mlme_priv->mcs_rate_set.len);
  4735. return 0;
  4736. }
  4737. qdf_mem_copy(dst, mlme_priv->mcs_rate_set.data,
  4738. mlme_priv->mcs_rate_set.len);
  4739. return mlme_priv->mcs_rate_set.len;
  4740. }
  4741. QDF_STATUS mlme_set_mcs_rate(struct wlan_objmgr_vdev *vdev, uint8_t *src,
  4742. qdf_size_t len)
  4743. {
  4744. struct mlme_legacy_priv *mlme_priv;
  4745. if (!vdev || !src) {
  4746. mlme_legacy_err("invalid params");
  4747. return QDF_STATUS_E_INVAL;
  4748. }
  4749. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4750. if (!mlme_priv) {
  4751. mlme_legacy_err("vdev legacy private object is NULL");
  4752. return QDF_STATUS_E_FAILURE;
  4753. }
  4754. if (len > mlme_priv->mcs_rate_set.max_len) {
  4755. mlme_legacy_err("Invalid len %zd (>%zd)", len,
  4756. mlme_priv->mcs_rate_set.max_len);
  4757. return QDF_STATUS_E_INVAL;
  4758. }
  4759. mlme_priv->mcs_rate_set.len = len;
  4760. qdf_mem_copy(mlme_priv->mcs_rate_set.data, src, len);
  4761. return QDF_STATUS_SUCCESS;
  4762. }
  4763. QDF_STATUS mlme_clear_mcs_rate(struct wlan_objmgr_vdev *vdev)
  4764. {
  4765. struct mlme_legacy_priv *mlme_priv;
  4766. if (!vdev) {
  4767. mlme_legacy_err("invalid params");
  4768. return QDF_STATUS_E_INVAL;
  4769. }
  4770. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4771. if (!mlme_priv) {
  4772. mlme_legacy_err("vdev legacy private object is NULL");
  4773. return QDF_STATUS_E_FAILURE;
  4774. }
  4775. mlme_priv->mcs_rate_set.len = 0;
  4776. qdf_mem_set(mlme_priv->mcs_rate_set.data, CFG_STR_DATA_LEN, 0);
  4777. return QDF_STATUS_SUCCESS;
  4778. }
  4779. static enum monitor_mode_concurrency
  4780. wlan_mlme_get_monitor_mode_concurrency(struct wlan_objmgr_psoc *psoc)
  4781. {
  4782. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4783. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4784. if (!mlme_obj)
  4785. return cfg_default(CFG_MONITOR_MODE_CONCURRENCY);
  4786. return mlme_obj->cfg.gen.monitor_mode_concurrency;
  4787. }
  4788. #ifdef FEATURE_WDS
  4789. enum wlan_wds_mode
  4790. wlan_mlme_get_wds_mode(struct wlan_objmgr_psoc *psoc)
  4791. {
  4792. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4793. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4794. if (!mlme_obj)
  4795. return cfg_default(CFG_WDS_MODE);
  4796. return mlme_obj->cfg.gen.wds_mode;
  4797. }
  4798. void wlan_mlme_set_wds_mode(struct wlan_objmgr_psoc *psoc,
  4799. enum wlan_wds_mode mode)
  4800. {
  4801. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4802. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4803. if (!mlme_obj)
  4804. return;
  4805. if (mode <= WLAN_WDS_MODE_MAX)
  4806. mlme_obj->cfg.gen.wds_mode = mode;
  4807. }
  4808. #endif
  4809. bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc)
  4810. {
  4811. if (wlan_mlme_get_monitor_mode_concurrency(psoc) ==
  4812. MONITOR_MODE_CONC_STA_SCAN_MON)
  4813. return true;
  4814. return false;
  4815. }
  4816. bool wlan_mlme_is_local_tpe_pref(struct wlan_objmgr_psoc *psoc)
  4817. {
  4818. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4819. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4820. if (!mlme_obj)
  4821. return false;
  4822. return mlme_obj->cfg.power.use_local_tpe;
  4823. }
  4824. bool wlan_mlme_skip_tpe(struct wlan_objmgr_psoc *psoc)
  4825. {
  4826. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4827. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4828. if (!mlme_obj)
  4829. return false;
  4830. return mlme_obj->cfg.power.skip_tpe;
  4831. }
  4832. #ifdef WLAN_FEATURE_11BE
  4833. QDF_STATUS mlme_cfg_get_eht_caps(struct wlan_objmgr_psoc *psoc,
  4834. tDot11fIEeht_cap *eht_cap)
  4835. {
  4836. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  4837. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  4838. if (!mlme_obj)
  4839. return QDF_STATUS_E_FAILURE;
  4840. *eht_cap = mlme_obj->cfg.eht_caps.dot11_eht_cap;
  4841. return QDF_STATUS_SUCCESS;
  4842. }
  4843. #endif
  4844. QDF_STATUS
  4845. wlan_mlme_set_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev, bool found)
  4846. {
  4847. struct mlme_legacy_priv *mlme_priv;
  4848. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4849. if (!mlme_priv) {
  4850. mlme_legacy_err("vdev legacy private object is NULL");
  4851. return QDF_STATUS_E_FAILURE;
  4852. }
  4853. mlme_priv->ba_2k_jump_iot_ap = found;
  4854. return QDF_STATUS_SUCCESS;
  4855. }
  4856. bool wlan_mlme_is_ba_2k_jump_iot_ap(struct wlan_objmgr_vdev *vdev)
  4857. {
  4858. struct mlme_legacy_priv *mlme_priv;
  4859. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4860. if (!mlme_priv) {
  4861. mlme_legacy_err("vdev legacy private object is NULL");
  4862. return false;
  4863. }
  4864. return mlme_priv->ba_2k_jump_iot_ap;
  4865. }
  4866. QDF_STATUS
  4867. wlan_mlme_set_last_delba_sent_time(struct wlan_objmgr_vdev *vdev,
  4868. qdf_time_t delba_sent_time)
  4869. {
  4870. struct mlme_legacy_priv *mlme_priv;
  4871. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4872. if (!mlme_priv) {
  4873. mlme_legacy_err("vdev legacy private object is NULL");
  4874. return QDF_STATUS_E_FAILURE;
  4875. }
  4876. mlme_priv->last_delba_sent_time = delba_sent_time;
  4877. return QDF_STATUS_SUCCESS;
  4878. }
  4879. qdf_time_t
  4880. wlan_mlme_get_last_delba_sent_time(struct wlan_objmgr_vdev *vdev)
  4881. {
  4882. struct mlme_legacy_priv *mlme_priv;
  4883. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4884. if (!mlme_priv) {
  4885. mlme_legacy_err("vdev legacy private object is NULL");
  4886. return 0;
  4887. }
  4888. return mlme_priv->last_delba_sent_time;
  4889. }
  4890. QDF_STATUS mlme_set_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
  4891. bool ps_enable)
  4892. {
  4893. struct wlan_objmgr_vdev *vdev;
  4894. struct mlme_legacy_priv *mlme_priv;
  4895. QDF_STATUS status = QDF_STATUS_E_FAILURE;
  4896. vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
  4897. WLAN_MLME_OBJMGR_ID);
  4898. if (!vdev)
  4899. return status;
  4900. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4901. if (mlme_priv) {
  4902. mlme_priv->is_usr_ps_enabled = ps_enable;
  4903. status = QDF_STATUS_SUCCESS;
  4904. mlme_legacy_debug("vdev:%d user PS:%d", vdev_id,
  4905. mlme_priv->is_usr_ps_enabled);
  4906. }
  4907. wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
  4908. return status;
  4909. }
  4910. bool mlme_get_user_ps(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id)
  4911. {
  4912. struct wlan_objmgr_vdev *vdev;
  4913. struct mlme_legacy_priv *mlme_priv;
  4914. bool usr_ps_enable = false;
  4915. vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
  4916. WLAN_MLME_OBJMGR_ID);
  4917. if (!vdev)
  4918. return false;
  4919. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  4920. if (mlme_priv)
  4921. usr_ps_enable = mlme_priv->is_usr_ps_enabled;
  4922. wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
  4923. return usr_ps_enable;
  4924. }
  4925. bool wlan_mlme_is_multipass_sap(struct wlan_objmgr_psoc *psoc)
  4926. {
  4927. struct target_psoc_info *info;
  4928. info = wlan_psoc_get_tgt_if_handle(psoc);
  4929. if (!info) {
  4930. mlme_legacy_err("target_psoc_info is null");
  4931. return QDF_STATUS_E_FAILURE;
  4932. }
  4933. return target_is_multipass_sap(info);
  4934. }
  4935. QDF_STATUS wlan_mlme_get_phy_max_freq_range(struct wlan_objmgr_psoc *psoc,
  4936. uint32_t *low_2ghz_chan,
  4937. uint32_t *high_2ghz_chan,
  4938. uint32_t *low_5ghz_chan,
  4939. uint32_t *high_5ghz_chan)
  4940. {
  4941. uint32_t i;
  4942. uint32_t reg_low_2ghz_chan;
  4943. uint32_t reg_high_2ghz_chan;
  4944. uint32_t reg_low_5ghz_chan;
  4945. uint32_t reg_high_5ghz_chan;
  4946. struct target_psoc_info *info;
  4947. struct wlan_psoc_host_mac_phy_caps *mac_phy_cap;
  4948. struct wlan_psoc_host_hal_reg_cap_ext *reg_cap_ext;
  4949. info = wlan_psoc_get_tgt_if_handle(psoc);
  4950. if (!info) {
  4951. mlme_legacy_err("target_psoc_info is null");
  4952. return QDF_STATUS_E_FAILURE;
  4953. }
  4954. mac_phy_cap = info->info.mac_phy_cap;
  4955. reg_cap_ext = &mac_phy_cap->reg_cap_ext;
  4956. reg_low_2ghz_chan = reg_cap_ext->low_2ghz_chan;
  4957. reg_high_2ghz_chan = reg_cap_ext->high_2ghz_chan;
  4958. reg_low_5ghz_chan = reg_cap_ext->low_5ghz_chan;
  4959. reg_high_5ghz_chan = reg_cap_ext->high_5ghz_chan;
  4960. for (i = 1; i < PSOC_MAX_MAC_PHY_CAP; i++) {
  4961. mac_phy_cap = &info->info.mac_phy_cap[i];
  4962. reg_cap_ext = &mac_phy_cap->reg_cap_ext;
  4963. if (reg_cap_ext->low_2ghz_chan) {
  4964. reg_low_2ghz_chan = reg_low_2ghz_chan ?
  4965. QDF_MIN(reg_cap_ext->low_2ghz_chan,
  4966. reg_low_2ghz_chan) :
  4967. reg_cap_ext->low_2ghz_chan;
  4968. }
  4969. if (reg_cap_ext->high_2ghz_chan) {
  4970. reg_high_2ghz_chan = reg_high_2ghz_chan ?
  4971. QDF_MAX(reg_cap_ext->high_2ghz_chan,
  4972. reg_high_2ghz_chan) :
  4973. reg_cap_ext->high_2ghz_chan;
  4974. }
  4975. if (reg_cap_ext->low_5ghz_chan) {
  4976. reg_low_5ghz_chan = reg_low_5ghz_chan ?
  4977. QDF_MIN(reg_cap_ext->low_5ghz_chan,
  4978. reg_low_5ghz_chan) :
  4979. reg_cap_ext->low_5ghz_chan;
  4980. }
  4981. if (reg_cap_ext->high_5ghz_chan) {
  4982. reg_high_5ghz_chan = reg_high_5ghz_chan ?
  4983. QDF_MAX(reg_cap_ext->high_5ghz_chan,
  4984. reg_high_5ghz_chan) :
  4985. reg_cap_ext->high_5ghz_chan;
  4986. }
  4987. }
  4988. /* For old hw, no reg_cap_ext reported from service ready ext,
  4989. * fill the low/high with default of regulatory.
  4990. */
  4991. if (!reg_low_2ghz_chan && !reg_high_2ghz_chan &&
  4992. !reg_low_5ghz_chan && !reg_high_5ghz_chan) {
  4993. mlme_legacy_debug("no reg_cap_ext in mac_phy_cap");
  4994. reg_low_2ghz_chan = TWOG_STARTING_FREQ - 10;
  4995. reg_high_2ghz_chan = TWOG_CHAN_14_IN_MHZ + 10;
  4996. reg_low_5ghz_chan = FIVEG_STARTING_FREQ - 10;
  4997. reg_high_5ghz_chan = SIXG_CHAN_233_IN_MHZ + 10;
  4998. }
  4999. if (!wlan_reg_is_6ghz_supported(psoc)) {
  5000. mlme_legacy_debug("disabling 6ghz channels");
  5001. reg_high_5ghz_chan = FIVEG_CHAN_177_IN_MHZ + 10;
  5002. }
  5003. mlme_legacy_debug("%d %d %d %d", reg_low_2ghz_chan, reg_high_2ghz_chan,
  5004. reg_low_5ghz_chan, reg_high_5ghz_chan);
  5005. *low_2ghz_chan = reg_low_2ghz_chan;
  5006. *high_2ghz_chan = reg_high_2ghz_chan;
  5007. *low_5ghz_chan = reg_low_5ghz_chan;
  5008. *high_5ghz_chan = reg_high_5ghz_chan;
  5009. return QDF_STATUS_SUCCESS;
  5010. }
  5011. #ifdef WLAN_FEATURE_P2P_P2P_STA
  5012. bool
  5013. wlan_mlme_get_p2p_p2p_conc_support(struct wlan_objmgr_psoc *psoc)
  5014. {
  5015. return wlan_psoc_nif_fw_ext_cap_get(psoc,
  5016. WLAN_SOC_EXT_P2P_P2P_CONC_SUPPORT);
  5017. }
  5018. #endif
  5019. enum phy_ch_width mlme_get_vht_ch_width(void)
  5020. {
  5021. enum phy_ch_width bandwidth = CH_WIDTH_INVALID;
  5022. uint32_t fw_ch_wd = wma_get_vht_ch_width();
  5023. if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
  5024. bandwidth = CH_WIDTH_80P80MHZ;
  5025. else if (fw_ch_wd == WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
  5026. bandwidth = CH_WIDTH_160MHZ;
  5027. else
  5028. bandwidth = CH_WIDTH_80MHZ;
  5029. return bandwidth;
  5030. }
  5031. uint8_t
  5032. wlan_mlme_get_mgmt_hw_tx_retry_count(struct wlan_objmgr_psoc *psoc,
  5033. enum mlme_cfg_frame_type frm_type)
  5034. {
  5035. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5036. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5037. if (!mlme_obj)
  5038. return 0;
  5039. if (frm_type >= CFG_FRAME_TYPE_MAX)
  5040. return 0;
  5041. return mlme_obj->cfg.gen.mgmt_hw_tx_retry_count[frm_type];
  5042. }
  5043. QDF_STATUS
  5044. wlan_mlme_get_tx_retry_multiplier(struct wlan_objmgr_psoc *psoc,
  5045. uint32_t *tx_retry_multiplier)
  5046. {
  5047. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5048. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5049. if (!mlme_obj) {
  5050. *tx_retry_multiplier =
  5051. cfg_default(CFG_TX_RETRY_MULTIPLIER);
  5052. return QDF_STATUS_E_FAILURE;
  5053. }
  5054. *tx_retry_multiplier = mlme_obj->cfg.gen.tx_retry_multiplier;
  5055. return QDF_STATUS_SUCCESS;
  5056. }
  5057. QDF_STATUS
  5058. wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
  5059. uint32_t *value)
  5060. {
  5061. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5062. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5063. if (!mlme_obj) {
  5064. *value = cfg_default(CFG_CHANNEL_BONDING_MODE_5GHZ);
  5065. return QDF_STATUS_E_INVAL;
  5066. }
  5067. *value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz;
  5068. return QDF_STATUS_SUCCESS;
  5069. }
  5070. QDF_STATUS
  5071. wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev,
  5072. uint8_t num_ratemask,
  5073. struct config_ratemask_params *rate_params)
  5074. {
  5075. struct vdev_mlme_obj *vdev_mlme;
  5076. struct vdev_mlme_rate_info *rate_info;
  5077. QDF_STATUS ret;
  5078. uint8_t i = 0;
  5079. uint8_t index;
  5080. vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
  5081. if (!vdev_mlme)
  5082. return QDF_STATUS_E_FAILURE;
  5083. rate_info = &vdev_mlme->mgmt.rate_info;
  5084. while (i < num_ratemask) {
  5085. index = rate_params[i].type;
  5086. if (index >= WLAN_VDEV_RATEMASK_TYPE_MAX) {
  5087. mlme_legacy_err("Invalid ratemask type");
  5088. ++i;
  5089. continue;
  5090. }
  5091. if (rate_info->ratemask_params[index].lower32 !=
  5092. rate_params[i].lower32 ||
  5093. rate_info->ratemask_params[index].lower32_2 !=
  5094. rate_params[i].lower32_2 ||
  5095. rate_info->ratemask_params[index].higher32 !=
  5096. rate_params[i].higher32 ||
  5097. rate_info->ratemask_params[index].higher32_2 !=
  5098. rate_params[i].higher32_2) {
  5099. rate_info->ratemask_params[index].lower32 =
  5100. rate_params[i].lower32;
  5101. rate_info->ratemask_params[index].higher32 =
  5102. rate_params[i].higher32;
  5103. rate_info->ratemask_params[index].lower32_2 =
  5104. rate_params[i].lower32_2;
  5105. rate_info->ratemask_params[index].higher32_2 =
  5106. rate_params[i].higher32_2;
  5107. ret = wlan_util_vdev_mlme_set_ratemask_config(vdev_mlme,
  5108. index);
  5109. if (ret != QDF_STATUS_SUCCESS)
  5110. mlme_legacy_err("ratemask config failed");
  5111. } else {
  5112. mlme_legacy_debug("Ratemask same as configured mask");
  5113. }
  5114. ++i;
  5115. }
  5116. return QDF_STATUS_SUCCESS;
  5117. }
  5118. bool wlan_mlme_is_channel_valid(struct wlan_objmgr_psoc *psoc,
  5119. uint32_t chan_freq)
  5120. {
  5121. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5122. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5123. if (!mlme_obj)
  5124. return false;
  5125. return wlan_roam_is_channel_valid(&mlme_obj->cfg.reg,
  5126. chan_freq);
  5127. }
  5128. #ifdef WLAN_FEATURE_MCC_QUOTA
  5129. #define WLAN_MCC_MIN_QUOTA 10 /* in %age */
  5130. #define WLAN_MCC_MAX_QUOTA 90 /* in %age */
  5131. QDF_STATUS wlan_mlme_set_user_mcc_quota(struct wlan_objmgr_psoc *psoc,
  5132. struct wlan_user_mcc_quota *quota)
  5133. {
  5134. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5135. if (!quota)
  5136. return QDF_STATUS_E_NULL_VALUE;
  5137. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5138. if (!mlme_obj)
  5139. return QDF_STATUS_E_FAILURE;
  5140. if (quota->quota < WLAN_MCC_MIN_QUOTA)
  5141. quota->quota = WLAN_MCC_MIN_QUOTA;
  5142. else if (quota->quota > WLAN_MCC_MAX_QUOTA)
  5143. quota->quota = WLAN_MCC_MAX_QUOTA;
  5144. mlme_obj->cfg.gen.user_mcc_quota.quota = quota->quota;
  5145. mlme_obj->cfg.gen.user_mcc_quota.op_mode = quota->op_mode;
  5146. mlme_obj->cfg.gen.user_mcc_quota.vdev_id = quota->vdev_id;
  5147. mlme_debug("quota : %u, op_mode : %d, vdev_id : %u",
  5148. quota->quota, quota->op_mode, quota->vdev_id);
  5149. return QDF_STATUS_SUCCESS;
  5150. }
  5151. QDF_STATUS wlan_mlme_get_user_mcc_quota(struct wlan_objmgr_psoc *psoc,
  5152. struct wlan_user_mcc_quota *quota)
  5153. {
  5154. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5155. if (!quota)
  5156. return QDF_STATUS_E_NULL_VALUE;
  5157. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5158. if (!mlme_obj)
  5159. return QDF_STATUS_E_FAILURE;
  5160. quota->quota = mlme_obj->cfg.gen.user_mcc_quota.quota;
  5161. quota->op_mode = mlme_obj->cfg.gen.user_mcc_quota.op_mode;
  5162. quota->vdev_id = mlme_obj->cfg.gen.user_mcc_quota.vdev_id;
  5163. return QDF_STATUS_SUCCESS;
  5164. }
  5165. uint32_t
  5166. wlan_mlme_get_user_mcc_duty_cycle_percentage(struct wlan_objmgr_psoc *psoc)
  5167. {
  5168. uint32_t mcc_freq, ch_freq, quota_value;
  5169. struct wlan_user_mcc_quota quota;
  5170. uint8_t operating_channel;
  5171. int status;
  5172. quota.vdev_id = WLAN_UMAC_VDEV_ID_MAX;
  5173. quota.quota = 0;
  5174. if (QDF_IS_STATUS_ERROR(wlan_mlme_get_user_mcc_quota(psoc, &quota))) {
  5175. mlme_debug("Error getting user quota set");
  5176. return 0;
  5177. }
  5178. if (quota.vdev_id == WLAN_UMAC_VDEV_ID_MAX || quota.quota == 0) {
  5179. mlme_debug("Invalid quota : vdev %u, quota %u",
  5180. quota.vdev_id, quota.quota);
  5181. return 0;
  5182. }
  5183. status = policy_mgr_get_chan_by_session_id(psoc, quota.vdev_id,
  5184. &ch_freq);
  5185. if (QDF_IS_STATUS_ERROR(status)) {
  5186. mlme_debug("Could not get vdev %u chan", quota.vdev_id);
  5187. return 0;
  5188. }
  5189. mcc_freq = policy_mgr_get_mcc_operating_channel(psoc, quota.vdev_id);
  5190. if (mcc_freq == INVALID_CHANNEL_ID)
  5191. return 0;
  5192. operating_channel = wlan_freq_to_chan(ch_freq);
  5193. if (!operating_channel) {
  5194. mlme_debug("Primary op channel is invalid");
  5195. return 0;
  5196. }
  5197. /*
  5198. * The channel numbers for both adapters and the time
  5199. * quota for the 1st adapter, i.e., one specified in cmd
  5200. * are formatted as a bit vector
  5201. * ******************************************************
  5202. * |bit 31-24 | bit 23-16 | bits 15-8 |bits 7-0 |
  5203. * | Unused | Quota for | chan. # for |chan. # for|
  5204. * | | 1st chan | 1st chan. |2nd chan. |
  5205. * ******************************************************
  5206. */
  5207. mlme_debug("Opmode (%d) vdev (%u) channel %u and quota %u",
  5208. quota.op_mode, quota.vdev_id,
  5209. operating_channel, quota.quota);
  5210. quota_value = quota.quota;
  5211. /* Move the time quota for first channel to bits 15-8 */
  5212. quota_value = quota_value << 8;
  5213. /*
  5214. * Store the channel number of 1st channel at bits 7-0
  5215. * of the bit vector
  5216. */
  5217. quota_value |= operating_channel;
  5218. operating_channel = wlan_freq_to_chan(mcc_freq);
  5219. if (!operating_channel) {
  5220. mlme_debug("Secondary op channel is invalid");
  5221. return 0;
  5222. }
  5223. /*
  5224. * Now move the time quota and channel number of the
  5225. * 1st adapter to bits 23-16 and bits 15-8 of the bit
  5226. * vector, respectively.
  5227. */
  5228. quota_value = quota_value << 8;
  5229. /*
  5230. * Set the channel number for 2nd MCC vdev at bits
  5231. * 7-0 of set_value
  5232. */
  5233. quota_value |= operating_channel;
  5234. mlme_debug("quota value:%x", quota_value);
  5235. return quota_value;
  5236. }
  5237. #endif /* WLAN_FEATURE_MCC_QUOTA */
  5238. uint8_t mlme_get_max_he_mcs_idx(enum phy_ch_width mcs_ch_width,
  5239. u_int16_t *hecap_rxmcsnssmap,
  5240. u_int16_t *hecap_txmcsnssmap)
  5241. {
  5242. uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX;
  5243. switch (mcs_ch_width) {
  5244. case CH_WIDTH_80P80MHZ:
  5245. if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] &&
  5246. hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80]) {
  5247. rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03;
  5248. tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80_80] & 0x03;
  5249. max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
  5250. if (max_mcs < 0x03)
  5251. max_mcs = 7 + 2 * max_mcs;
  5252. }
  5253. fallthrough;
  5254. case CH_WIDTH_160MHZ:
  5255. if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] &&
  5256. hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160]) {
  5257. rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03;
  5258. tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_160] & 0x03;
  5259. max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
  5260. if (max_mcs < 0x03)
  5261. max_mcs = 7 + 2 * max_mcs;
  5262. }
  5263. fallthrough;
  5264. default:
  5265. if (hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] &&
  5266. hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80]) {
  5267. rx_max_mcs = hecap_rxmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03;
  5268. tx_max_mcs = hecap_txmcsnssmap[HECAP_TXRX_MCS_NSS_IDX_80] & 0x03;
  5269. max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
  5270. if (max_mcs < 0x03)
  5271. max_mcs = 7 + 2 * max_mcs;
  5272. }
  5273. }
  5274. return max_mcs;
  5275. }
  5276. uint8_t mlme_get_max_vht_mcs_idx(u_int16_t rx_vht_mcs_map,
  5277. u_int16_t tx_vht_mcs_map)
  5278. {
  5279. uint8_t rx_max_mcs, tx_max_mcs, max_mcs = INVALID_MCS_NSS_INDEX;
  5280. if (rx_vht_mcs_map && tx_vht_mcs_map) {
  5281. rx_max_mcs = rx_vht_mcs_map & 0x03;
  5282. tx_max_mcs = tx_vht_mcs_map & 0x03;
  5283. max_mcs = rx_max_mcs < tx_max_mcs ? rx_max_mcs : tx_max_mcs;
  5284. if (max_mcs < 0x03)
  5285. return 7 + max_mcs;
  5286. }
  5287. return max_mcs;
  5288. }
  5289. #ifdef WLAN_FEATURE_SON
  5290. QDF_STATUS mlme_save_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
  5291. uint8_t max_mcs_idx)
  5292. {
  5293. struct mlme_legacy_priv *mlme_priv;
  5294. if (!vdev) {
  5295. mlme_legacy_err("invalid vdev");
  5296. return QDF_STATUS_E_INVAL;
  5297. }
  5298. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  5299. if (!mlme_priv) {
  5300. mlme_legacy_err("vdev legacy private object is NULL");
  5301. return QDF_STATUS_E_FAILURE;
  5302. }
  5303. mlme_priv->max_mcs_index = max_mcs_idx;
  5304. return QDF_STATUS_SUCCESS;
  5305. }
  5306. uint8_t mlme_get_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev)
  5307. {
  5308. struct mlme_legacy_priv *mlme_priv;
  5309. if (!vdev) {
  5310. mlme_legacy_err("invalid vdev");
  5311. return INVALID_MCS_NSS_INDEX;
  5312. }
  5313. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  5314. if (!mlme_priv) {
  5315. mlme_legacy_err("vdev legacy private object is NULL");
  5316. return INVALID_MCS_NSS_INDEX;
  5317. }
  5318. return mlme_priv->max_mcs_index;
  5319. }
  5320. #endif /* WLAN_FEATURE_SON */
  5321. void wlan_mlme_get_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
  5322. bool *safe_mode_enable)
  5323. {
  5324. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5325. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5326. if (!mlme_obj) {
  5327. mlme_legacy_err("invalid mlme obj");
  5328. *safe_mode_enable = false;
  5329. return;
  5330. }
  5331. *safe_mode_enable = mlme_obj->cfg.gen.safe_mode_enable;
  5332. }
  5333. void wlan_mlme_set_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
  5334. bool safe_mode_enable)
  5335. {
  5336. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5337. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5338. if (!mlme_obj) {
  5339. mlme_legacy_err("invalid mlme obj");
  5340. return;
  5341. }
  5342. mlme_obj->cfg.gen.safe_mode_enable = safe_mode_enable;
  5343. }
  5344. uint32_t wlan_mlme_get_6g_ap_power_type(struct wlan_objmgr_vdev *vdev)
  5345. {
  5346. struct vdev_mlme_obj *mlme_obj;
  5347. mlme_obj = wlan_vdev_mlme_get_cmpt_obj(vdev);
  5348. if (!mlme_obj) {
  5349. mlme_legacy_err("vdev component object is NULL");
  5350. return REG_MAX_AP_TYPE;
  5351. }
  5352. return mlme_obj->reg_tpc_obj.power_type_6g;
  5353. }
  5354. QDF_STATUS wlan_connect_hw_mode_change_resp(struct wlan_objmgr_pdev *pdev,
  5355. uint8_t vdev_id,
  5356. wlan_cm_id cm_id, QDF_STATUS status)
  5357. {
  5358. return wlan_cm_handle_hw_mode_change_resp(pdev, vdev_id, cm_id,
  5359. status);
  5360. }
  5361. enum phy_ch_width
  5362. wlan_mlme_get_ch_width_from_phymode(enum wlan_phymode phy_mode)
  5363. {
  5364. enum phy_ch_width ch_width;
  5365. if (IS_WLAN_PHYMODE_320MHZ(phy_mode))
  5366. ch_width = CH_WIDTH_320MHZ;
  5367. else if (IS_WLAN_PHYMODE_160MHZ(phy_mode))
  5368. ch_width = CH_WIDTH_160MHZ;
  5369. else if (IS_WLAN_PHYMODE_80MHZ(phy_mode))
  5370. ch_width = CH_WIDTH_80MHZ;
  5371. else if (IS_WLAN_PHYMODE_40MHZ(phy_mode))
  5372. ch_width = CH_WIDTH_40MHZ;
  5373. else
  5374. ch_width = CH_WIDTH_20MHZ;
  5375. mlme_legacy_debug("phymode: %d, ch_width: %d ", phy_mode, ch_width);
  5376. return ch_width;
  5377. }
  5378. enum phy_ch_width
  5379. wlan_mlme_get_peer_ch_width(struct wlan_objmgr_psoc *psoc, uint8_t *mac)
  5380. {
  5381. enum wlan_phymode phy_mode;
  5382. QDF_STATUS status;
  5383. status = mlme_get_peer_phymode(psoc, mac, &phy_mode);
  5384. if (QDF_IS_STATUS_ERROR(status)) {
  5385. mlme_legacy_err("failed to fetch phy_mode status: %d for mac: " QDF_MAC_ADDR_FMT,
  5386. status, QDF_MAC_ADDR_REF(mac));
  5387. return CH_WIDTH_20MHZ;
  5388. }
  5389. return wlan_mlme_get_ch_width_from_phymode(phy_mode);
  5390. }
  5391. #ifdef FEATURE_SET
  5392. /**
  5393. * wlan_mlme_get_latency_enable() - get wlm latency cfg value
  5394. * @psoc: psoc context
  5395. * @value: Pointer in which wlam latency cfg value needs to be filled
  5396. *
  5397. * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure
  5398. */
  5399. static QDF_STATUS
  5400. wlan_mlme_get_latency_enable(struct wlan_objmgr_psoc *psoc, bool *value)
  5401. {
  5402. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5403. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5404. if (!mlme_obj) {
  5405. mlme_legacy_err("mlme obj null");
  5406. return QDF_STATUS_E_INVAL;
  5407. }
  5408. *value = mlme_obj->cfg.wlm_config.latency_enable;
  5409. return QDF_STATUS_SUCCESS;
  5410. }
  5411. #ifdef WLAN_ADAPTIVE_11R
  5412. /**
  5413. * wlan_mlme_get_adaptive11r_enabled() - get adaptive 11r cfg value
  5414. * @psoc: psoc context
  5415. * @val: Pointer in which adaptive 11r cfg value needs to be filled
  5416. *
  5417. * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure
  5418. */
  5419. static QDF_STATUS
  5420. wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  5421. {
  5422. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5423. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5424. if (!mlme_obj) {
  5425. *val = cfg_default(CFG_ADAPTIVE_11R);
  5426. return QDF_STATUS_E_INVAL;
  5427. }
  5428. *val = mlme_obj->cfg.lfr.enable_adaptive_11r;
  5429. return QDF_STATUS_SUCCESS;
  5430. }
  5431. #else
  5432. static inline QDF_STATUS
  5433. wlan_mlme_get_adaptive11r_enabled(struct wlan_objmgr_psoc *psoc, bool *val)
  5434. {
  5435. *val = false;
  5436. return QDF_STATUS_SUCCESS;
  5437. }
  5438. #endif
  5439. #ifdef WLAN_FEATURE_P2P_P2P_STA
  5440. static bool
  5441. wlan_mlme_get_p2p_p2p_host_conc_support(void)
  5442. {
  5443. return true;
  5444. }
  5445. #else
  5446. static bool
  5447. wlan_mlme_get_p2p_p2p_host_conc_support(void)
  5448. {
  5449. return false;
  5450. }
  5451. #endif
  5452. void wlan_mlme_get_feature_info(struct wlan_objmgr_psoc *psoc,
  5453. struct wlan_mlme_features *mlme_feature_set)
  5454. {
  5455. uint32_t roam_triggers;
  5456. int sap_max_num_clients = 0;
  5457. bool is_enable_idle_roam = false, is_bss_load_enabled = false;
  5458. wlan_mlme_get_latency_enable(psoc,
  5459. &mlme_feature_set->enable_wifi_optimizer);
  5460. wlan_mlme_get_sap_max_peers(psoc, &sap_max_num_clients);
  5461. mlme_feature_set->sap_max_num_clients = sap_max_num_clients;
  5462. mlme_feature_set->vendor_req_1_version =
  5463. WMI_HOST_VENDOR1_REQ1_VERSION_3_40;
  5464. roam_triggers = wlan_mlme_get_roaming_triggers(psoc);
  5465. wlan_mlme_get_bss_load_enabled(psoc, &is_bss_load_enabled);
  5466. mlme_feature_set->roaming_high_cu_roam_trigger =
  5467. (roam_triggers & BIT(ROAM_TRIGGER_REASON_BSS_LOAD)) &&
  5468. is_bss_load_enabled;
  5469. mlme_feature_set->roaming_emergency_trigger =
  5470. roam_triggers & BIT(ROAM_TRIGGER_REASON_FORCED);
  5471. mlme_feature_set->roaming_btm_trihgger =
  5472. roam_triggers & BIT(ROAM_TRIGGER_REASON_BTM);
  5473. wlan_mlme_get_enable_idle_roam(psoc, &is_enable_idle_roam);
  5474. mlme_feature_set->roaming_idle_trigger =
  5475. (roam_triggers & BIT(ROAM_TRIGGER_REASON_IDLE)) &&
  5476. is_enable_idle_roam;
  5477. mlme_feature_set->roaming_wtc_trigger =
  5478. roam_triggers & BIT(ROAM_TRIGGER_REASON_WTC_BTM);
  5479. mlme_feature_set->roaming_btcoex_trigger =
  5480. roam_triggers & BIT(ROAM_TRIGGER_REASON_BTC);
  5481. mlme_feature_set->roaming_btw_wpa_wpa2 = true;
  5482. mlme_feature_set->roaming_manage_chan_list_api = true;
  5483. wlan_mlme_get_adaptive11r_enabled(
  5484. psoc,
  5485. &mlme_feature_set->roaming_adaptive_11r);
  5486. mlme_feature_set->roaming_ctrl_api_get_set = true;
  5487. mlme_feature_set->roaming_ctrl_api_reassoc = true;
  5488. mlme_feature_set->roaming_ctrl_get_cu = true;
  5489. mlme_feature_set->vendor_req_2_version =
  5490. WMI_HOST_VENDOR1_REQ2_VERSION_3_20;
  5491. mlme_feature_set->sta_dual_p2p_support =
  5492. wlan_mlme_get_p2p_p2p_host_conc_support();
  5493. wlan_mlme_get_vht_enable2x2(psoc, &mlme_feature_set->enable2x2);
  5494. }
  5495. #endif
  5496. void wlan_mlme_chan_stats_scan_event_cb(struct wlan_objmgr_vdev *vdev,
  5497. struct scan_event *event, void *arg)
  5498. {
  5499. bool success = false;
  5500. if (!util_is_scan_completed(event, &success))
  5501. return;
  5502. mlme_send_scan_done_complete_cb(event->vdev_id);
  5503. }
  5504. static QDF_STATUS
  5505. wlan_mlme_update_vdev_chwidth_with_notify(struct wlan_objmgr_psoc *psoc,
  5506. struct wlan_objmgr_vdev *vdev,
  5507. uint8_t vdev_id,
  5508. enum phy_ch_width ch_width)
  5509. {
  5510. struct vdev_mlme_obj *vdev_mlme;
  5511. struct vdev_set_params param = {0};
  5512. QDF_STATUS status;
  5513. vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
  5514. if (!vdev_mlme)
  5515. return QDF_STATUS_E_FAILURE;
  5516. param.param_id = wmi_vdev_param_chwidth_with_notify;
  5517. param.vdev_id = vdev_id;
  5518. param.param_value = ch_width;
  5519. status = tgt_vdev_mgr_set_param_send(vdev_mlme, &param);
  5520. policy_mgr_handle_ml_sta_link_on_traffic_type_change(psoc, vdev);
  5521. return status;
  5522. }
  5523. static QDF_STATUS wlan_mlme_update_ch_width(struct wlan_objmgr_vdev *vdev,
  5524. uint8_t vdev_id,
  5525. enum phy_ch_width ch_width)
  5526. {
  5527. struct wlan_channel *des_chan;
  5528. struct wlan_channel *bss_chan;
  5529. uint16_t curr_op_freq;
  5530. struct ch_params ch_params = {0};
  5531. struct wlan_objmgr_pdev *pdev;
  5532. QDF_STATUS status;
  5533. des_chan = wlan_vdev_mlme_get_des_chan(vdev);
  5534. if (!des_chan)
  5535. return QDF_STATUS_E_FAILURE;
  5536. bss_chan = wlan_vdev_mlme_get_bss_chan(vdev);
  5537. if (!bss_chan)
  5538. return QDF_STATUS_E_FAILURE;
  5539. pdev = wlan_vdev_get_pdev(vdev);
  5540. if (!pdev) {
  5541. mlme_err("vdev %d: Pdev is NULL", vdev_id);
  5542. return QDF_STATUS_E_INVAL;
  5543. }
  5544. ch_params.ch_width = ch_width;
  5545. curr_op_freq = des_chan->ch_freq;
  5546. wlan_reg_set_channel_params_for_pwrmode(pdev, curr_op_freq,
  5547. 0, &ch_params,
  5548. REG_CURRENT_PWR_MODE);
  5549. des_chan->ch_width = ch_width;
  5550. des_chan->ch_freq_seg1 = ch_params.center_freq_seg0;
  5551. des_chan->ch_freq_seg2 = ch_params.center_freq_seg1;
  5552. des_chan->ch_cfreq1 = ch_params.mhz_freq_seg0;
  5553. des_chan->ch_cfreq2 = ch_params.mhz_freq_seg1;
  5554. status = wlan_update_peer_phy_mode(des_chan, vdev);
  5555. if (QDF_IS_STATUS_ERROR(status)) {
  5556. mlme_err("Failed to update phymode");
  5557. return QDF_STATUS_E_INVAL;
  5558. }
  5559. qdf_mem_copy(bss_chan, des_chan, sizeof(struct wlan_channel));
  5560. mlme_legacy_debug("vdev id %d freq %d seg0 %d seg1 %d ch_width %d mhz seg0 %d mhz seg1 %d",
  5561. vdev_id, curr_op_freq, ch_params.center_freq_seg0,
  5562. ch_params.center_freq_seg1, ch_params.ch_width,
  5563. ch_params.mhz_freq_seg0, ch_params.mhz_freq_seg1);
  5564. return QDF_STATUS_SUCCESS;
  5565. }
  5566. static uint32_t
  5567. wlan_mlme_get_vht_rate_flags(enum phy_ch_width ch_width)
  5568. {
  5569. uint32_t rate_flags = 0;
  5570. if (ch_width == CH_WIDTH_80P80MHZ || ch_width == CH_WIDTH_160MHZ)
  5571. rate_flags |= TX_RATE_VHT160 | TX_RATE_VHT80 | TX_RATE_VHT40 |
  5572. TX_RATE_VHT20;
  5573. if (ch_width == CH_WIDTH_80MHZ)
  5574. rate_flags |= TX_RATE_VHT80 | TX_RATE_VHT40 | TX_RATE_VHT20;
  5575. else if (ch_width)
  5576. rate_flags |= TX_RATE_VHT40 | TX_RATE_VHT20;
  5577. else
  5578. rate_flags |= TX_RATE_VHT20;
  5579. return rate_flags;
  5580. }
  5581. static uint32_t wlan_mlme_get_ht_rate_flags(enum phy_ch_width ch_width)
  5582. {
  5583. uint32_t rate_flags = 0;
  5584. if (ch_width)
  5585. rate_flags |= TX_RATE_HT40 | TX_RATE_HT20;
  5586. else
  5587. rate_flags |= TX_RATE_HT20;
  5588. return rate_flags;
  5589. }
  5590. #ifdef WLAN_FEATURE_11BE
  5591. static uint32_t
  5592. wlan_mlme_get_eht_rate_flags(enum phy_ch_width ch_width)
  5593. {
  5594. uint32_t rate_flags = 0;
  5595. if (ch_width == CH_WIDTH_320MHZ)
  5596. rate_flags |= TX_RATE_EHT320 | TX_RATE_EHT160 |
  5597. TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20;
  5598. else if (ch_width == CH_WIDTH_160MHZ || ch_width == CH_WIDTH_80P80MHZ)
  5599. rate_flags |= TX_RATE_EHT160 | TX_RATE_EHT80 | TX_RATE_EHT40 |
  5600. TX_RATE_EHT20;
  5601. else if (ch_width == CH_WIDTH_80MHZ)
  5602. rate_flags |= TX_RATE_EHT80 | TX_RATE_EHT40 | TX_RATE_EHT20;
  5603. else if (ch_width)
  5604. rate_flags |= TX_RATE_EHT40 | TX_RATE_EHT20;
  5605. else
  5606. rate_flags |= TX_RATE_EHT20;
  5607. return rate_flags;
  5608. }
  5609. static QDF_STATUS
  5610. wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present,
  5611. enum phy_ch_width ch_width)
  5612. {
  5613. if (!eht_present)
  5614. return QDF_STATUS_E_NOSUPPORT;
  5615. *rate_flags |= wlan_mlme_get_eht_rate_flags(ch_width);
  5616. return QDF_STATUS_SUCCESS;
  5617. }
  5618. #else
  5619. static inline QDF_STATUS
  5620. wlan_mlme_set_bss_rate_flags_eht(uint32_t *rate_flags, uint8_t eht_present,
  5621. enum phy_ch_width ch_width)
  5622. {
  5623. return QDF_STATUS_E_NOSUPPORT;
  5624. }
  5625. #endif
  5626. #ifdef WLAN_FEATURE_11AX
  5627. static uint32_t wlan_mlme_get_he_rate_flags(enum phy_ch_width ch_width)
  5628. {
  5629. uint32_t rate_flags = 0;
  5630. if (ch_width == CH_WIDTH_160MHZ ||
  5631. ch_width == CH_WIDTH_80P80MHZ)
  5632. rate_flags |= TX_RATE_HE160 | TX_RATE_HE80 | TX_RATE_HE40 |
  5633. TX_RATE_HE20;
  5634. else if (ch_width == CH_WIDTH_80MHZ)
  5635. rate_flags |= TX_RATE_HE80 | TX_RATE_HE40 | TX_RATE_HE20;
  5636. else if (ch_width)
  5637. rate_flags |= TX_RATE_HE40 | TX_RATE_HE20;
  5638. else
  5639. rate_flags |= TX_RATE_HE20;
  5640. return rate_flags;
  5641. }
  5642. static QDF_STATUS wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags,
  5643. uint8_t he_present,
  5644. enum phy_ch_width ch_width)
  5645. {
  5646. if (!he_present)
  5647. return QDF_STATUS_E_NOSUPPORT;
  5648. *rate_flags |= wlan_mlme_get_he_rate_flags(ch_width);
  5649. return QDF_STATUS_SUCCESS;
  5650. }
  5651. #else
  5652. static inline QDF_STATUS
  5653. wlan_mlme_set_bss_rate_flags_he(uint32_t *rate_flags,
  5654. uint8_t he_present,
  5655. enum phy_ch_width ch_width)
  5656. {
  5657. return QDF_STATUS_E_NOSUPPORT;
  5658. }
  5659. #endif
  5660. static QDF_STATUS
  5661. wlan_mlme_cp_stats_set_rate_flags(struct wlan_objmgr_vdev *vdev,
  5662. uint32_t flags)
  5663. {
  5664. struct vdev_mc_cp_stats *vdev_mc_stats;
  5665. struct vdev_cp_stats *vdev_cp_stats_priv;
  5666. vdev_cp_stats_priv = wlan_cp_stats_get_vdev_stats_obj(vdev);
  5667. if (!vdev_cp_stats_priv) {
  5668. cp_stats_err("vdev cp stats object is null");
  5669. return QDF_STATUS_E_NULL_VALUE;
  5670. }
  5671. wlan_cp_stats_vdev_obj_lock(vdev_cp_stats_priv);
  5672. vdev_mc_stats = vdev_cp_stats_priv->vdev_stats;
  5673. vdev_mc_stats->tx_rate_flags = flags;
  5674. wlan_cp_stats_vdev_obj_unlock(vdev_cp_stats_priv);
  5675. return QDF_STATUS_SUCCESS;
  5676. }
  5677. QDF_STATUS
  5678. wlan_mlme_update_bss_rate_flags(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
  5679. enum phy_ch_width cw, uint8_t eht_present,
  5680. uint8_t he_present, uint8_t vht_present,
  5681. uint8_t ht_present)
  5682. {
  5683. uint32_t *rate_flags;
  5684. struct vdev_mlme_obj *vdev_mlme;
  5685. struct wlan_objmgr_vdev *vdev;
  5686. QDF_STATUS status;
  5687. if (!eht_present && !he_present && !vht_present && !ht_present)
  5688. return QDF_STATUS_E_INVAL;
  5689. vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
  5690. WLAN_HDD_ID_OBJ_MGR);
  5691. if (!vdev) {
  5692. mlme_debug("vdev: %d vdev not found", vdev_id);
  5693. return QDF_STATUS_E_INVAL;
  5694. }
  5695. vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
  5696. if (!vdev_mlme) {
  5697. mlme_debug("vdev: %d mlme obj not found", vdev_id);
  5698. wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
  5699. return QDF_STATUS_E_INVAL;
  5700. }
  5701. rate_flags = &vdev_mlme->mgmt.rate_info.rate_flags;
  5702. *rate_flags = 0;
  5703. status = wlan_mlme_set_bss_rate_flags_eht(rate_flags, eht_present, cw);
  5704. if (QDF_IS_STATUS_ERROR(status)) {
  5705. status = wlan_mlme_set_bss_rate_flags_he(rate_flags,
  5706. he_present, cw);
  5707. if (QDF_IS_STATUS_ERROR(status)) {
  5708. if (vht_present)
  5709. *rate_flags = wlan_mlme_get_vht_rate_flags(cw);
  5710. else if (ht_present)
  5711. *rate_flags |= wlan_mlme_get_ht_rate_flags(cw);
  5712. }
  5713. }
  5714. mlme_debug("vdev:%d, eht:%u, he:%u, vht:%u, ht:%u, flag:%x, cw:%d",
  5715. vdev_id, eht_present, he_present, vht_present, ht_present,
  5716. *rate_flags, cw);
  5717. status = wlan_mlme_cp_stats_set_rate_flags(vdev, *rate_flags);
  5718. wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
  5719. return status;
  5720. }
  5721. QDF_STATUS
  5722. wlan_mlme_send_ch_width_update_with_notify(struct wlan_objmgr_psoc *psoc,
  5723. struct wlan_objmgr_vdev *vdev,
  5724. uint8_t vdev_id,
  5725. enum phy_ch_width ch_width)
  5726. {
  5727. QDF_STATUS status;
  5728. enum phy_ch_width associated_ch_width;
  5729. struct wlan_channel *des_chan;
  5730. struct mlme_legacy_priv *mlme_priv;
  5731. mlme_priv = wlan_vdev_mlme_get_ext_hdl(vdev);
  5732. if (!mlme_priv)
  5733. return QDF_STATUS_E_INVAL;
  5734. des_chan = wlan_vdev_mlme_get_des_chan(vdev);
  5735. if (!des_chan)
  5736. return QDF_STATUS_E_INVAL;
  5737. if (wlan_reg_is_24ghz_ch_freq(des_chan->ch_freq)) {
  5738. mlme_debug("vdev %d: CW:%d update not supported for freq:%d",
  5739. vdev_id, ch_width, des_chan->ch_freq);
  5740. return QDF_STATUS_E_NOSUPPORT;
  5741. }
  5742. associated_ch_width =
  5743. mlme_priv->connect_info.assoc_chan_info.assoc_ch_width;
  5744. if (associated_ch_width == CH_WIDTH_INVALID ||
  5745. ch_width > associated_ch_width) {
  5746. mlme_debug("vdev %d: Invalid new chwidth:%d, assoc ch_width:%d",
  5747. vdev_id, ch_width, associated_ch_width);
  5748. return QDF_STATUS_E_INVAL;
  5749. }
  5750. /* update ch width to internal host structure */
  5751. status = wlan_mlme_update_ch_width(vdev, vdev_id, ch_width);
  5752. if (QDF_IS_STATUS_ERROR(status)) {
  5753. mlme_err("vdev %d: Failed to update CW:%d to host, status:%d",
  5754. vdev_id, ch_width, status);
  5755. return status;
  5756. }
  5757. /* update ch width to fw */
  5758. status = wlan_mlme_update_vdev_chwidth_with_notify(psoc, vdev, vdev_id,
  5759. ch_width);
  5760. if (QDF_IS_STATUS_ERROR(status))
  5761. mlme_err("vdev %d: Failed to update CW:%d to fw, status:%d",
  5762. vdev_id, ch_width, status);
  5763. return status;
  5764. }
  5765. enum phy_ch_width
  5766. wlan_mlme_convert_vht_op_bw_to_phy_ch_width(uint8_t channel_width,
  5767. uint8_t chan_id,
  5768. uint8_t ccfs0,
  5769. uint8_t ccfs1)
  5770. {
  5771. /** channel_width in vht op from 802.11-2020
  5772. * Set to 0 for 20 MHz or 40 MHz BSS bandwidth.
  5773. * Set to 1 for 80 MHz, 160 MHz or 80+80 MHz BSS
  5774. * bandwidth.
  5775. * Set to 2 for 160 MHz BSS bandwidth (deprecated).
  5776. * Set to 3 for noncontiguous 80+80 MHz BSS
  5777. * bandwidth (deprecated).
  5778. * Values in the range 4 to 255 are reserved
  5779. *
  5780. * 80+80 not supported by MCC platform, so downgrade to 80
  5781. */
  5782. enum phy_ch_width phy_bw = CH_WIDTH_20MHZ;
  5783. if (channel_width == WLAN_VHTOP_CHWIDTH_2040) {
  5784. phy_bw = CH_WIDTH_20MHZ;
  5785. if (abs(ccfs0 - chan_id) == 2)
  5786. phy_bw = CH_WIDTH_40MHZ;
  5787. } else if (channel_width == WLAN_VHTOP_CHWIDTH_80) {
  5788. if (ccfs1 && (abs(ccfs1 - ccfs0) == 8))
  5789. phy_bw = CH_WIDTH_160MHZ;
  5790. else
  5791. phy_bw = CH_WIDTH_80MHZ;
  5792. } else if (channel_width == WLAN_VHTOP_CHWIDTH_160) {
  5793. phy_bw = CH_WIDTH_160MHZ;
  5794. } else if (channel_width == WLAN_VHTOP_CHWIDTH_80_80) {
  5795. phy_bw = WLAN_VHTOP_CHWIDTH_80;
  5796. }
  5797. return phy_bw;
  5798. }
  5799. enum phy_ch_width
  5800. wlan_mlme_convert_he_6ghz_op_bw_to_phy_ch_width(uint8_t channel_width,
  5801. uint8_t chan_id,
  5802. uint8_t ccfs0,
  5803. uint8_t ccfs1)
  5804. {
  5805. enum phy_ch_width phy_bw = CH_WIDTH_20MHZ;
  5806. if (channel_width == WLAN_HE_6GHZ_CHWIDTH_20) {
  5807. phy_bw = CH_WIDTH_20MHZ;
  5808. } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_40) {
  5809. phy_bw = CH_WIDTH_40MHZ;
  5810. } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_80) {
  5811. phy_bw = CH_WIDTH_80MHZ;
  5812. } else if (channel_width == WLAN_HE_6GHZ_CHWIDTH_160_80_80) {
  5813. phy_bw = CH_WIDTH_160MHZ;
  5814. /* 80+80 not supported */
  5815. if (ccfs1 && abs(ccfs0 - ccfs1) > 8)
  5816. phy_bw = CH_WIDTH_80MHZ;
  5817. }
  5818. return phy_bw;
  5819. }
  5820. void
  5821. wlan_mlme_set_edca_pifs_param(struct wlan_edca_pifs_param_ie *ep,
  5822. enum host_edca_param_type type)
  5823. {
  5824. ep->edca_param_type = type;
  5825. if (type == HOST_EDCA_PARAM_TYPE_AGGRESSIVE) {
  5826. ep->edca_pifs_param.eparam.acvo_aifsn = CFG_EDCA_PARAM_AIFSN;
  5827. ep->edca_pifs_param.eparam.acvo_acm = CFG_EDCA_PARAM_ACM;
  5828. ep->edca_pifs_param.eparam.acvo_aci = CFG_EDCA_PARAM_ACI;
  5829. ep->edca_pifs_param.eparam.acvo_cwmin = CFG_EDCA_PARAM_CWMIN;
  5830. ep->edca_pifs_param.eparam.acvo_cwmax = CFG_EDCA_PARAM_CWMAX;
  5831. ep->edca_pifs_param.eparam.acvo_txoplimit = CFG_EDCA_PARAM_TXOP;
  5832. } else if (type == HOST_EDCA_PARAM_TYPE_PIFS) {
  5833. ep->edca_pifs_param.pparam.sap_pifs_offset =
  5834. CFG_PIFS_PARAM_SAP_OFFSET;
  5835. ep->edca_pifs_param.pparam.leb_pifs_offset =
  5836. CFG_PIFS_PARAM_LEB_OFFSET;
  5837. ep->edca_pifs_param.pparam.reb_pifs_offset =
  5838. CFG_PIFS_PARAM_REB_OFFSET;
  5839. }
  5840. }
  5841. QDF_STATUS
  5842. wlan_mlme_stats_get_periodic_display_time(struct wlan_objmgr_psoc *psoc,
  5843. uint32_t *periodic_display_time)
  5844. {
  5845. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5846. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5847. if (!mlme_obj) {
  5848. *periodic_display_time =
  5849. cfg_default(CFG_PERIODIC_STATS_DISPLAY_TIME);
  5850. return QDF_STATUS_E_INVAL;
  5851. }
  5852. *periodic_display_time =
  5853. mlme_obj->cfg.stats.stats_periodic_display_time;
  5854. return QDF_STATUS_SUCCESS;
  5855. }
  5856. bool
  5857. wlan_mlme_is_bcn_prot_disabled_for_sap(struct wlan_objmgr_psoc *psoc)
  5858. {
  5859. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5860. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5861. if (!mlme_obj)
  5862. return cfg_default(CFG_DISABLE_SAP_BCN_PROT);
  5863. return mlme_obj->cfg.sap_cfg.disable_bcn_prot;
  5864. }
  5865. uint8_t *wlan_mlme_get_src_addr_from_frame(struct element_info *frame)
  5866. {
  5867. struct wlan_frame_hdr *hdr;
  5868. if (!frame || !frame->len || frame->len < WLAN_MAC_HDR_LEN_3A)
  5869. return NULL;
  5870. hdr = (struct wlan_frame_hdr *)frame->ptr;
  5871. return hdr->i_addr2;
  5872. }
  5873. bool
  5874. wlan_mlme_get_sap_ps_with_twt(struct wlan_objmgr_psoc *psoc)
  5875. {
  5876. struct wlan_mlme_psoc_ext_obj *mlme_obj;
  5877. mlme_obj = mlme_get_psoc_ext_obj(psoc);
  5878. if (!mlme_obj)
  5879. return cfg_default(CFG_SAP_PS_WITH_TWT);
  5880. return mlme_obj->cfg.sap_cfg.sap_ps_with_twt_enable;
  5881. }
  5882. /**
  5883. * set_omi_ch_width() - set OMI ch_bw/eht_ch_bw_ext bit value from channel width
  5884. * @ch_width: channel width
  5885. * @omi_data: Pointer to omi_data object
  5886. *
  5887. * If the channel width is 20Mhz, 40Mhz, 80Mhz, 160Mhz and 80+80Mhz ch_bw set
  5888. * to 0, 1, 2, 3 accordingly, if channel width is 320Mhz then eht_ch_bw_ext
  5889. * set to 1
  5890. *
  5891. * Return: QDF_STATUS_SUCCESS on success or QDF_STATUS_E_INVAL on failure
  5892. */
  5893. static QDF_STATUS
  5894. set_omi_ch_width(enum phy_ch_width ch_width, struct omi_ctrl_tx *omi_data)
  5895. {
  5896. switch (ch_width) {
  5897. case CH_WIDTH_20MHZ:
  5898. omi_data->ch_bw = 0;
  5899. break;
  5900. case CH_WIDTH_40MHZ:
  5901. omi_data->ch_bw = 1;
  5902. break;
  5903. case CH_WIDTH_80MHZ:
  5904. omi_data->ch_bw = 2;
  5905. break;
  5906. case CH_WIDTH_160MHZ:
  5907. case CH_WIDTH_80P80MHZ:
  5908. omi_data->ch_bw = 3;
  5909. break;
  5910. case CH_WIDTH_320MHZ:
  5911. omi_data->eht_ch_bw_ext = 1;
  5912. break;
  5913. default:
  5914. return QDF_STATUS_E_INVAL;
  5915. }
  5916. return QDF_STATUS_SUCCESS;
  5917. }
  5918. QDF_STATUS
  5919. wlan_mlme_set_ul_mu_config(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
  5920. uint8_t ulmu_disable)
  5921. {
  5922. struct omi_ctrl_tx omi_data = {0};
  5923. uint32_t param_val = 0;
  5924. struct wlan_objmgr_pdev *pdev;
  5925. struct wlan_objmgr_vdev *vdev;
  5926. enum phy_ch_width ch_width;
  5927. uint8_t rx_nss, tx_nsts;
  5928. struct qdf_mac_addr macaddr = {0};
  5929. enum wlan_phymode peer_phymode;
  5930. qdf_freq_t op_chan_freq;
  5931. qdf_freq_t freq_seg_0;
  5932. QDF_STATUS status = QDF_STATUS_SUCCESS;
  5933. vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
  5934. WLAN_MLME_OBJMGR_ID);
  5935. if (!vdev) {
  5936. mlme_err("vdev %d: vdev is NULL", vdev_id);
  5937. return QDF_STATUS_E_INVAL;
  5938. }
  5939. pdev = wlan_vdev_get_pdev(vdev);
  5940. if (!pdev) {
  5941. mlme_err("pdev is NULL");
  5942. status = QDF_STATUS_E_INVAL;
  5943. goto err;
  5944. }
  5945. if (!cm_is_vdevid_connected(pdev, vdev_id)) {
  5946. mlme_err("STA is not connected, Session_id: %d", vdev_id);
  5947. status = QDF_STATUS_E_INVAL;
  5948. goto err;
  5949. }
  5950. status = wlan_vdev_get_bss_peer_mac(vdev, &macaddr);
  5951. if (QDF_STATUS_SUCCESS != status) {
  5952. mlme_err("Failed to get bss peer mac, Err : %d", status);
  5953. goto err;
  5954. }
  5955. status = mlme_get_peer_phymode(psoc, macaddr.bytes, &peer_phymode);
  5956. if (QDF_STATUS_SUCCESS != status) {
  5957. mlme_err("Failed to get peer phymode, Err : %d", status);
  5958. goto err;
  5959. }
  5960. if (!(IS_WLAN_PHYMODE_HE(peer_phymode) ||
  5961. IS_WLAN_PHYMODE_EHT(peer_phymode))) {
  5962. mlme_err("Invalid mode");
  5963. status = QDF_STATUS_E_INVAL;
  5964. goto err;
  5965. }
  5966. status = wlan_mlme_get_sta_rx_nss(psoc, vdev, &rx_nss);
  5967. if (QDF_STATUS_SUCCESS != status) {
  5968. mlme_err("Failed to get sta_rx_nss, Err : %d", status);
  5969. goto err;
  5970. }
  5971. status = wlan_mlme_get_sta_tx_nss(psoc, vdev, &tx_nsts);
  5972. if (QDF_STATUS_SUCCESS != status) {
  5973. mlme_err("Failed to get sta_tx_nss, Err : %d", status);
  5974. goto err;
  5975. }
  5976. status = wlan_get_op_chan_freq_info_vdev_id(pdev, vdev_id,
  5977. &op_chan_freq,
  5978. &freq_seg_0, &ch_width);
  5979. if (QDF_STATUS_SUCCESS != status) {
  5980. mlme_err("Failed to get bw, Err : %d", status);
  5981. goto err;
  5982. }
  5983. omi_data.omi_in_vht = 0x1;
  5984. omi_data.omi_in_he = 0x1;
  5985. omi_data.a_ctrl_id = 0x1;
  5986. status = set_omi_ch_width(ch_width, &omi_data);
  5987. if (QDF_STATUS_SUCCESS != status) {
  5988. mlme_err("Failed to set bw, Err : %d", status);
  5989. goto err;
  5990. }
  5991. omi_data.rx_nss = rx_nss - 1;
  5992. omi_data.tx_nsts = tx_nsts - 1;
  5993. omi_data.ul_mu_dis = ulmu_disable;
  5994. omi_data.ul_mu_data_dis = 0;
  5995. qdf_mem_copy(&param_val, &omi_data, sizeof(omi_data));
  5996. mlme_debug("OMI: BW %d TxNSTS %d RxNSS %d ULMU %d OMI_VHT %d OMI_HE %d, EHT OMI: BW %d RxNSS %d TxNSS %d, param val: %08X, bssid:" QDF_MAC_ADDR_FMT,
  5997. omi_data.ch_bw, omi_data.tx_nsts, omi_data.rx_nss,
  5998. omi_data.ul_mu_dis, omi_data.omi_in_vht, omi_data.omi_in_he,
  5999. omi_data.eht_ch_bw_ext, omi_data.eht_rx_nss_ext,
  6000. omi_data.eht_tx_nss_ext, param_val,
  6001. QDF_MAC_ADDR_REF(macaddr.bytes));
  6002. status = wlan_util_vdev_peer_set_param_send(vdev, macaddr.bytes,
  6003. WMI_PEER_PARAM_XMIT_OMI,
  6004. param_val);
  6005. if (QDF_STATUS_SUCCESS != status)
  6006. mlme_err("set_peer_param_cmd returned %d", status);
  6007. err:
  6008. wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_OBJMGR_ID);
  6009. return status;
  6010. }