wlan_mlme_api.c 212 KB

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