wlan_mlme_api.c 212 KB

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