wlan_mlme_api.c 84 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397
  1. /*
  2. * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. /**
  19. * DOC: define public APIs exposed by the mlme component
  20. */
  21. #include "cfg_ucfg_api.h"
  22. #include "wlan_mlme_main.h"
  23. #include "wlan_mlme_ucfg_api.h"
  24. #include "wma_types.h"
  25. #include "wmi_unified.h"
  26. #include "wma.h"
  27. #include "wma_internal.h"
  28. #include "wlan_crypto_global_api.h"
  29. #include "wlan_utility.h"
  30. QDF_STATUS wlan_mlme_get_cfg_str(uint8_t *dst, struct mlme_cfg_str *cfg_str,
  31. qdf_size_t *len)
  32. {
  33. if (*len < cfg_str->len) {
  34. mlme_err("Invalid len %zd", *len);
  35. return QDF_STATUS_E_INVAL;
  36. }
  37. *len = cfg_str->len;
  38. qdf_mem_copy(dst, cfg_str->data, *len);
  39. return QDF_STATUS_SUCCESS;
  40. }
  41. QDF_STATUS wlan_mlme_set_cfg_str(uint8_t *src, struct mlme_cfg_str *dst_cfg_str,
  42. qdf_size_t len)
  43. {
  44. if (len > dst_cfg_str->max_len) {
  45. mlme_err("Invalid len %zd (>%zd)", len,
  46. dst_cfg_str->max_len);
  47. return QDF_STATUS_E_INVAL;
  48. }
  49. dst_cfg_str->len = len;
  50. qdf_mem_copy(dst_cfg_str->data, src, len);
  51. return QDF_STATUS_SUCCESS;
  52. }
  53. uint8_t wlan_mlme_get_tx_power(struct wlan_objmgr_psoc *psoc,
  54. enum band_info band)
  55. {
  56. struct wlan_mlme_psoc_obj *mlme_obj;
  57. mlme_obj = mlme_get_psoc_obj(psoc);
  58. if (!mlme_obj)
  59. return 0;
  60. switch (band) {
  61. case BAND_2G:
  62. return mlme_obj->cfg.power.tx_power_2g;
  63. case BAND_5G:
  64. return mlme_obj->cfg.power.tx_power_5g;
  65. default:
  66. break;
  67. }
  68. return 0;
  69. }
  70. char *wlan_mlme_get_power_usage(struct wlan_objmgr_psoc *psoc)
  71. {
  72. struct wlan_mlme_psoc_obj *mlme_obj;
  73. mlme_obj = mlme_get_psoc_obj(psoc);
  74. if (!mlme_obj)
  75. return NULL;
  76. return mlme_obj->cfg.power.power_usage.data;
  77. }
  78. QDF_STATUS wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  79. struct mlme_ht_capabilities_info
  80. *ht_cap_info)
  81. {
  82. struct wlan_mlme_psoc_obj *mlme_obj;
  83. mlme_obj = mlme_get_psoc_obj(psoc);
  84. if (!mlme_obj)
  85. return QDF_STATUS_E_FAILURE;
  86. *ht_cap_info = mlme_obj->cfg.ht_caps.ht_cap_info;
  87. return QDF_STATUS_SUCCESS;
  88. }
  89. QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  90. struct mlme_ht_capabilities_info
  91. ht_cap_info)
  92. {
  93. struct wlan_mlme_psoc_obj *mlme_obj;
  94. mlme_obj = mlme_get_psoc_obj(psoc);
  95. if (!mlme_obj)
  96. return QDF_STATUS_E_FAILURE;
  97. mlme_obj->cfg.ht_caps.ht_cap_info = ht_cap_info;
  98. return QDF_STATUS_SUCCESS;
  99. }
  100. QDF_STATUS wlan_mlme_get_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
  101. uint8_t *value)
  102. {
  103. struct wlan_mlme_psoc_obj *mlme_obj;
  104. mlme_obj = mlme_get_psoc_obj(psoc);
  105. if (!mlme_obj)
  106. return QDF_STATUS_E_FAILURE;
  107. *value = mlme_obj->cfg.ht_caps.max_num_amsdu;
  108. return QDF_STATUS_SUCCESS;
  109. }
  110. QDF_STATUS wlan_mlme_set_max_amsdu_num(struct wlan_objmgr_psoc *psoc,
  111. uint8_t value)
  112. {
  113. struct wlan_mlme_psoc_obj *mlme_obj;
  114. mlme_obj = mlme_get_psoc_obj(psoc);
  115. if (!mlme_obj)
  116. return QDF_STATUS_E_FAILURE;
  117. if (!cfg_in_range(CFG_MAX_AMSDU_NUM, value)) {
  118. mlme_err("Error in setting Max AMSDU Num");
  119. return QDF_STATUS_E_INVAL;
  120. }
  121. mlme_obj->cfg.ht_caps.max_num_amsdu = value;
  122. return QDF_STATUS_SUCCESS;
  123. }
  124. QDF_STATUS wlan_mlme_get_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
  125. uint8_t *value)
  126. {
  127. struct wlan_mlme_psoc_obj *mlme_obj;
  128. mlme_obj = mlme_get_psoc_obj(psoc);
  129. if (!mlme_obj)
  130. return QDF_STATUS_E_FAILURE;
  131. *value = (uint8_t)mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density;
  132. return QDF_STATUS_SUCCESS;
  133. }
  134. QDF_STATUS wlan_mlme_set_ht_mpdu_density(struct wlan_objmgr_psoc *psoc,
  135. uint8_t value)
  136. {
  137. struct wlan_mlme_psoc_obj *mlme_obj;
  138. mlme_obj = mlme_get_psoc_obj(psoc);
  139. if (!mlme_obj)
  140. return QDF_STATUS_E_FAILURE;
  141. if (!cfg_in_range(CFG_MPDU_DENSITY, value)) {
  142. mlme_err("Invalid value %d", value);
  143. return QDF_STATUS_E_INVAL;
  144. }
  145. mlme_obj->cfg.ht_caps.ampdu_params.mpdu_density = value;
  146. return QDF_STATUS_SUCCESS;
  147. }
  148. QDF_STATUS wlan_mlme_get_band_capability(struct wlan_objmgr_psoc *psoc,
  149. uint8_t *band_capability)
  150. {
  151. struct wlan_mlme_psoc_obj *mlme_obj;
  152. mlme_obj = mlme_get_psoc_obj(psoc);
  153. if (!mlme_obj)
  154. return QDF_STATUS_E_FAILURE;
  155. *band_capability = mlme_obj->cfg.gen.band_capability;
  156. return QDF_STATUS_SUCCESS;
  157. }
  158. QDF_STATUS wlan_mlme_set_band_capability(struct wlan_objmgr_psoc *psoc,
  159. uint8_t band_capability)
  160. {
  161. struct wlan_mlme_psoc_obj *mlme_obj;
  162. mlme_obj = mlme_get_psoc_obj(psoc);
  163. if (!mlme_obj)
  164. return QDF_STATUS_E_FAILURE;
  165. mlme_obj->cfg.gen.band_capability = band_capability;
  166. return QDF_STATUS_SUCCESS;
  167. }
  168. QDF_STATUS wlan_mlme_get_prevent_link_down(struct wlan_objmgr_psoc *psoc,
  169. bool *prevent_link_down)
  170. {
  171. struct wlan_mlme_psoc_obj *mlme_obj;
  172. mlme_obj = mlme_get_psoc_obj(psoc);
  173. if (!mlme_obj)
  174. return QDF_STATUS_E_FAILURE;
  175. *prevent_link_down = mlme_obj->cfg.gen.prevent_link_down;
  176. return QDF_STATUS_SUCCESS;
  177. }
  178. QDF_STATUS wlan_mlme_get_select_5ghz_margin(struct wlan_objmgr_psoc *psoc,
  179. uint8_t *select_5ghz_margin)
  180. {
  181. struct wlan_mlme_psoc_obj *mlme_obj;
  182. mlme_obj = mlme_get_psoc_obj(psoc);
  183. if (!mlme_obj)
  184. return QDF_STATUS_E_FAILURE;
  185. *select_5ghz_margin = mlme_obj->cfg.gen.select_5ghz_margin;
  186. return QDF_STATUS_SUCCESS;
  187. }
  188. QDF_STATUS wlan_mlme_get_rtt_mac_randomization(struct wlan_objmgr_psoc *psoc,
  189. bool *rtt_mac_randomization)
  190. {
  191. struct wlan_mlme_psoc_obj *mlme_obj;
  192. mlme_obj = mlme_get_psoc_obj(psoc);
  193. if (!mlme_obj)
  194. return QDF_STATUS_E_FAILURE;
  195. *rtt_mac_randomization = mlme_obj->cfg.gen.rtt_mac_randomization;
  196. return QDF_STATUS_SUCCESS;
  197. }
  198. QDF_STATUS wlan_mlme_get_crash_inject(struct wlan_objmgr_psoc *psoc,
  199. bool *crash_inject)
  200. {
  201. struct wlan_mlme_psoc_obj *mlme_obj;
  202. mlme_obj = mlme_get_psoc_obj(psoc);
  203. if (!mlme_obj)
  204. return QDF_STATUS_E_FAILURE;
  205. *crash_inject = mlme_obj->cfg.gen.crash_inject;
  206. return QDF_STATUS_SUCCESS;
  207. }
  208. QDF_STATUS wlan_mlme_get_lpass_support(struct wlan_objmgr_psoc *psoc,
  209. bool *lpass_support)
  210. {
  211. struct wlan_mlme_psoc_obj *mlme_obj;
  212. mlme_obj = mlme_get_psoc_obj(psoc);
  213. if (!mlme_obj)
  214. return QDF_STATUS_E_FAILURE;
  215. *lpass_support = mlme_obj->cfg.gen.lpass_support;
  216. return QDF_STATUS_SUCCESS;
  217. }
  218. QDF_STATUS wlan_mlme_get_self_recovery(struct wlan_objmgr_psoc *psoc,
  219. bool *self_recovery)
  220. {
  221. struct wlan_mlme_psoc_obj *mlme_obj;
  222. mlme_obj = mlme_get_psoc_obj(psoc);
  223. if (!mlme_obj)
  224. return QDF_STATUS_E_FAILURE;
  225. *self_recovery = mlme_obj->cfg.gen.self_recovery;
  226. return QDF_STATUS_SUCCESS;
  227. }
  228. QDF_STATUS wlan_mlme_get_sub_20_chan_width(struct wlan_objmgr_psoc *psoc,
  229. uint8_t *sub_20_chan_width)
  230. {
  231. struct wlan_mlme_psoc_obj *mlme_obj;
  232. mlme_obj = mlme_get_psoc_obj(psoc);
  233. if (!mlme_obj)
  234. return QDF_STATUS_E_FAILURE;
  235. *sub_20_chan_width = mlme_obj->cfg.gen.sub_20_chan_width;
  236. return QDF_STATUS_SUCCESS;
  237. }
  238. QDF_STATUS wlan_mlme_get_fw_timeout_crash(struct wlan_objmgr_psoc *psoc,
  239. bool *fw_timeout_crash)
  240. {
  241. struct wlan_mlme_psoc_obj *mlme_obj;
  242. mlme_obj = mlme_get_psoc_obj(psoc);
  243. if (!mlme_obj)
  244. return QDF_STATUS_E_FAILURE;
  245. *fw_timeout_crash = mlme_obj->cfg.gen.fw_timeout_crash;
  246. return QDF_STATUS_SUCCESS;
  247. }
  248. QDF_STATUS wlan_mlme_get_ito_repeat_count(struct wlan_objmgr_psoc *psoc,
  249. uint8_t *ito_repeat_count)
  250. {
  251. struct wlan_mlme_psoc_obj *mlme_obj;
  252. mlme_obj = mlme_get_psoc_obj(psoc);
  253. if (!mlme_obj)
  254. return QDF_STATUS_E_FAILURE;
  255. *ito_repeat_count = mlme_obj->cfg.gen.ito_repeat_count;
  256. return QDF_STATUS_SUCCESS;
  257. }
  258. void wlan_mlme_get_sap_inactivity_override(struct wlan_objmgr_psoc *psoc,
  259. bool *val)
  260. {
  261. struct wlan_mlme_psoc_obj *mlme_obj;
  262. mlme_obj = mlme_get_psoc_obj(psoc);
  263. if (!mlme_obj)
  264. return;
  265. *val = mlme_obj->cfg.qos_mlme_params.sap_max_inactivity_override;
  266. }
  267. QDF_STATUS wlan_mlme_get_acs_with_more_param(struct wlan_objmgr_psoc *psoc,
  268. bool *value)
  269. {
  270. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  271. if (!mlme_obj)
  272. return QDF_STATUS_E_FAILURE;
  273. *value = mlme_obj->cfg.acs.is_acs_with_more_param;
  274. return QDF_STATUS_SUCCESS;
  275. }
  276. QDF_STATUS wlan_mlme_get_auto_channel_weight(struct wlan_objmgr_psoc *psoc,
  277. uint32_t *value)
  278. {
  279. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  280. if (!mlme_obj) {
  281. *value = cfg_default(CFG_AUTO_CHANNEL_SELECT_WEIGHT);
  282. return QDF_STATUS_E_FAILURE;
  283. }
  284. *value = mlme_obj->cfg.acs.auto_channel_select_weight;
  285. return QDF_STATUS_SUCCESS;
  286. }
  287. QDF_STATUS wlan_mlme_get_vendor_acs_support(struct wlan_objmgr_psoc *psoc,
  288. bool *value)
  289. {
  290. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  291. if (!mlme_obj)
  292. return QDF_STATUS_E_FAILURE;
  293. *value = mlme_obj->cfg.acs.is_vendor_acs_support;
  294. return QDF_STATUS_SUCCESS;
  295. }
  296. QDF_STATUS
  297. wlan_mlme_get_acs_support_for_dfs_ltecoex(struct wlan_objmgr_psoc *psoc,
  298. bool *value)
  299. {
  300. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  301. if (!mlme_obj)
  302. return QDF_STATUS_E_FAILURE;
  303. *value = mlme_obj->cfg.acs.is_acs_support_for_dfs_ltecoex;
  304. return QDF_STATUS_SUCCESS;
  305. }
  306. QDF_STATUS
  307. wlan_mlme_get_external_acs_policy(struct wlan_objmgr_psoc *psoc,
  308. bool *value)
  309. {
  310. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  311. if (!mlme_obj)
  312. return QDF_STATUS_E_FAILURE;
  313. *value = mlme_obj->cfg.acs.is_external_acs_policy;
  314. return QDF_STATUS_SUCCESS;
  315. }
  316. QDF_STATUS wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc *psoc,
  317. bool *value)
  318. {
  319. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  320. if (!mlme_obj)
  321. return QDF_STATUS_E_FAILURE;
  322. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_cck;
  323. return QDF_STATUS_SUCCESS;
  324. }
  325. QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc,
  326. uint8_t *value)
  327. {
  328. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  329. if (!mlme_obj)
  330. return QDF_STATUS_E_FAILURE;
  331. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_1ss;
  332. return QDF_STATUS_SUCCESS;
  333. }
  334. #ifdef WLAN_FEATURE_11AX
  335. QDF_STATUS wlan_mlme_cfg_get_he_ul_mumimo(struct wlan_objmgr_psoc *psoc,
  336. uint32_t *value)
  337. {
  338. struct wlan_mlme_psoc_obj *mlme_obj;
  339. mlme_obj = mlme_get_psoc_obj(psoc);
  340. if (!mlme_obj)
  341. return QDF_STATUS_E_FAILURE;
  342. *value = mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu;
  343. return QDF_STATUS_SUCCESS;
  344. }
  345. QDF_STATUS wlan_mlme_cfg_set_he_ul_mumimo(struct wlan_objmgr_psoc *psoc,
  346. uint32_t value)
  347. {
  348. struct wlan_mlme_psoc_obj *mlme_obj;
  349. mlme_obj = mlme_get_psoc_obj(psoc);
  350. if (!mlme_obj)
  351. return QDF_STATUS_E_FAILURE;
  352. if (!cfg_in_range(CFG_HE_UL_MUMIMO, value)) {
  353. mlme_debug("Failed to set CFG_HE_UL_MUMIMO with %d", value);
  354. return QDF_STATUS_E_FAILURE;
  355. }
  356. mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = value;
  357. return QDF_STATUS_SUCCESS;
  358. }
  359. QDF_STATUS wlan_mlme_cfg_get_enable_ul_mimo(struct wlan_objmgr_psoc *psoc,
  360. uint8_t *value)
  361. {
  362. struct wlan_mlme_psoc_obj *mlme_obj;
  363. mlme_obj = mlme_get_psoc_obj(psoc);
  364. if (!mlme_obj)
  365. return QDF_STATUS_E_FAILURE;
  366. *value = mlme_obj->cfg.he_caps.enable_ul_mimo;
  367. return QDF_STATUS_SUCCESS;
  368. }
  369. QDF_STATUS wlan_mlme_cfg_get_enable_ul_ofdm(struct wlan_objmgr_psoc *psoc,
  370. uint8_t *value)
  371. {
  372. struct wlan_mlme_psoc_obj *mlme_obj;
  373. mlme_obj = mlme_get_psoc_obj(psoc);
  374. if (!mlme_obj)
  375. return QDF_STATUS_E_FAILURE;
  376. *value = mlme_obj->cfg.he_caps.enable_ul_ofdm;
  377. return QDF_STATUS_SUCCESS;
  378. }
  379. QDF_STATUS mlme_update_tgt_he_caps_in_cfg(struct wlan_objmgr_psoc *psoc,
  380. struct wma_tgt_cfg *wma_cfg)
  381. {
  382. uint8_t chan_width;
  383. QDF_STATUS status = QDF_STATUS_SUCCESS;
  384. tDot11fIEhe_cap *he_cap = &wma_cfg->he_cap;
  385. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  386. uint8_t value;
  387. uint16_t tx_mcs_map = 0;
  388. uint16_t rx_mcs_map = 0;
  389. uint8_t nss;
  390. if (!mlme_obj)
  391. return QDF_STATUS_E_FAILURE;
  392. mlme_obj->cfg.he_caps.dot11_he_cap.present = 1;
  393. mlme_obj->cfg.he_caps.dot11_he_cap.htc_he = he_cap->htc_he;
  394. mlme_obj->cfg.he_caps.dot11_he_cap.twt_request =
  395. he_cap->twt_request;
  396. mlme_obj->cfg.he_caps.dot11_he_cap.twt_responder =
  397. he_cap->twt_responder;
  398. value = QDF_MIN(
  399. he_cap->fragmentation,
  400. mlme_obj->cfg.he_caps.he_dynamic_fragmentation);
  401. if (cfg_in_range(CFG_HE_FRAGMENTATION, value))
  402. mlme_obj->cfg.he_caps.dot11_he_cap.fragmentation = value;
  403. if (cfg_in_range(CFG_HE_MAX_FRAG_MSDU,
  404. he_cap->max_num_frag_msdu_amsdu_exp))
  405. mlme_obj->cfg.he_caps.dot11_he_cap.max_num_frag_msdu_amsdu_exp =
  406. he_cap->max_num_frag_msdu_amsdu_exp;
  407. if (cfg_in_range(CFG_HE_MIN_FRAG_SIZE, he_cap->min_frag_size))
  408. mlme_obj->cfg.he_caps.dot11_he_cap.min_frag_size =
  409. he_cap->min_frag_size;
  410. if (cfg_in_range(CFG_HE_TRIG_PAD, he_cap->trigger_frm_mac_pad))
  411. mlme_obj->cfg.he_caps.dot11_he_cap.trigger_frm_mac_pad =
  412. he_cap->trigger_frm_mac_pad;
  413. if (cfg_in_range(CFG_HE_MTID_AGGR_RX, he_cap->multi_tid_aggr_rx_supp))
  414. mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_rx_supp =
  415. he_cap->multi_tid_aggr_rx_supp;
  416. if (cfg_in_range(CFG_HE_MTID_AGGR_TX, he_cap->multi_tid_aggr_tx_supp))
  417. mlme_obj->cfg.he_caps.dot11_he_cap.multi_tid_aggr_tx_supp =
  418. he_cap->multi_tid_aggr_tx_supp;
  419. if (cfg_in_range(CFG_HE_LINK_ADAPTATION, he_cap->he_link_adaptation))
  420. mlme_obj->cfg.he_caps.dot11_he_cap.he_link_adaptation =
  421. he_cap->he_link_adaptation;
  422. mlme_obj->cfg.he_caps.dot11_he_cap.all_ack = he_cap->all_ack;
  423. mlme_obj->cfg.he_caps.dot11_he_cap.trigd_rsp_sched =
  424. he_cap->trigd_rsp_sched;
  425. mlme_obj->cfg.he_caps.dot11_he_cap.a_bsr = he_cap->a_bsr;
  426. mlme_obj->cfg.he_caps.dot11_he_cap.broadcast_twt =
  427. he_cap->broadcast_twt;
  428. mlme_obj->cfg.he_caps.dot11_he_cap.ba_32bit_bitmap =
  429. he_cap->ba_32bit_bitmap;
  430. mlme_obj->cfg.he_caps.dot11_he_cap.mu_cascade = he_cap->mu_cascade;
  431. mlme_obj->cfg.he_caps.dot11_he_cap.ack_enabled_multitid =
  432. he_cap->ack_enabled_multitid;
  433. mlme_obj->cfg.he_caps.dot11_he_cap.omi_a_ctrl = he_cap->omi_a_ctrl;
  434. mlme_obj->cfg.he_caps.dot11_he_cap.ofdma_ra = he_cap->ofdma_ra;
  435. if (cfg_in_range(CFG_HE_MAX_AMPDU_LEN, he_cap->max_ampdu_len_exp_ext))
  436. mlme_obj->cfg.he_caps.dot11_he_cap.max_ampdu_len_exp_ext =
  437. he_cap->max_ampdu_len_exp_ext;
  438. mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_frag = he_cap->amsdu_frag;
  439. mlme_obj->cfg.he_caps.dot11_he_cap.flex_twt_sched =
  440. he_cap->flex_twt_sched;
  441. mlme_obj->cfg.he_caps.dot11_he_cap.rx_ctrl_frame =
  442. he_cap->rx_ctrl_frame;
  443. mlme_obj->cfg.he_caps.dot11_he_cap.bsrp_ampdu_aggr =
  444. he_cap->bsrp_ampdu_aggr;
  445. mlme_obj->cfg.he_caps.dot11_he_cap.qtp = he_cap->qtp;
  446. mlme_obj->cfg.he_caps.dot11_he_cap.a_bqr = he_cap->a_bqr;
  447. mlme_obj->cfg.he_caps.dot11_he_cap.spatial_reuse_param_rspder =
  448. he_cap->spatial_reuse_param_rspder;
  449. mlme_obj->cfg.he_caps.dot11_he_cap.ndp_feedback_supp =
  450. he_cap->ndp_feedback_supp;
  451. mlme_obj->cfg.he_caps.dot11_he_cap.ops_supp = he_cap->ops_supp;
  452. mlme_obj->cfg.he_caps.dot11_he_cap.amsdu_in_ampdu =
  453. he_cap->amsdu_in_ampdu;
  454. mlme_obj->cfg.he_caps.dot11_he_cap.he_sub_ch_sel_tx_supp =
  455. he_cap->he_sub_ch_sel_tx_supp;
  456. mlme_obj->cfg.he_caps.dot11_he_cap.ul_2x996_tone_ru_supp =
  457. he_cap->ul_2x996_tone_ru_supp;
  458. mlme_obj->cfg.he_caps.dot11_he_cap.om_ctrl_ul_mu_data_dis_rx =
  459. he_cap->om_ctrl_ul_mu_data_dis_rx;
  460. mlme_obj->cfg.he_caps.dot11_he_cap.he_dynamic_smps =
  461. he_cap->he_dynamic_smps;
  462. mlme_obj->cfg.he_caps.dot11_he_cap.punctured_sounding_supp =
  463. he_cap->punctured_sounding_supp;
  464. mlme_obj->cfg.he_caps.dot11_he_cap.ht_vht_trg_frm_rx_supp =
  465. he_cap->ht_vht_trg_frm_rx_supp;
  466. chan_width = HE_CH_WIDTH_COMBINE(he_cap->chan_width_0,
  467. he_cap->chan_width_1,
  468. he_cap->chan_width_2,
  469. he_cap->chan_width_3,
  470. he_cap->chan_width_4,
  471. he_cap->chan_width_5,
  472. he_cap->chan_width_6);
  473. if (cfg_in_range(CFG_HE_CHAN_WIDTH, chan_width)) {
  474. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_0 =
  475. he_cap->chan_width_0;
  476. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_1 =
  477. he_cap->chan_width_1;
  478. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_2 =
  479. he_cap->chan_width_2;
  480. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_3 =
  481. he_cap->chan_width_3;
  482. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_4 =
  483. he_cap->chan_width_4;
  484. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_5 =
  485. he_cap->chan_width_5;
  486. mlme_obj->cfg.he_caps.dot11_he_cap.chan_width_6 =
  487. he_cap->chan_width_6;
  488. }
  489. if (cfg_in_range(CFG_HE_RX_PREAM_PUNC, he_cap->rx_pream_puncturing))
  490. mlme_obj->cfg.he_caps.dot11_he_cap.rx_pream_puncturing =
  491. he_cap->rx_pream_puncturing;
  492. mlme_obj->cfg.he_caps.dot11_he_cap.device_class = he_cap->device_class;
  493. mlme_obj->cfg.he_caps.dot11_he_cap.ldpc_coding = he_cap->ldpc_coding;
  494. if (cfg_in_range(CFG_HE_LTF_PPDU, he_cap->he_1x_ltf_800_gi_ppdu))
  495. mlme_obj->cfg.he_caps.dot11_he_cap.he_1x_ltf_800_gi_ppdu =
  496. he_cap->he_1x_ltf_800_gi_ppdu;
  497. if (cfg_in_range(CFG_HE_MIDAMBLE_RX_MAX_NSTS,
  498. he_cap->midamble_tx_rx_max_nsts))
  499. mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_max_nsts =
  500. he_cap->midamble_tx_rx_max_nsts;
  501. mlme_obj->cfg.he_caps.dot11_he_cap.he_4x_ltf_3200_gi_ndp =
  502. he_cap->he_4x_ltf_3200_gi_ndp;
  503. if (mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc) {
  504. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz =
  505. he_cap->rx_stbc_lt_80mhz;
  506. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz =
  507. he_cap->rx_stbc_gt_80mhz;
  508. } else {
  509. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_lt_80mhz = 0;
  510. mlme_obj->cfg.he_caps.dot11_he_cap.rx_stbc_gt_80mhz = 0;
  511. }
  512. if (mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc) {
  513. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz =
  514. he_cap->tb_ppdu_tx_stbc_lt_80mhz;
  515. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz =
  516. he_cap->tb_ppdu_tx_stbc_gt_80mhz;
  517. } else {
  518. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_lt_80mhz = 0;
  519. mlme_obj->cfg.he_caps.dot11_he_cap.tb_ppdu_tx_stbc_gt_80mhz = 0;
  520. }
  521. if (cfg_in_range(CFG_HE_DOPPLER, he_cap->doppler))
  522. mlme_obj->cfg.he_caps.dot11_he_cap.doppler = he_cap->doppler;
  523. if (cfg_in_range(CFG_HE_DCM_TX, he_cap->dcm_enc_tx))
  524. mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_tx =
  525. he_cap->dcm_enc_tx;
  526. if (cfg_in_range(CFG_HE_DCM_RX, he_cap->dcm_enc_rx))
  527. mlme_obj->cfg.he_caps.dot11_he_cap.dcm_enc_rx =
  528. he_cap->dcm_enc_rx;
  529. mlme_obj->cfg.he_caps.dot11_he_cap.ul_he_mu = he_cap->ul_he_mu;
  530. if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer) {
  531. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer =
  532. he_cap->su_beamformer;
  533. if (cfg_in_range(CFG_HE_NUM_SOUND_LT80,
  534. he_cap->num_sounding_lt_80))
  535. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 =
  536. he_cap->num_sounding_lt_80;
  537. if (cfg_in_range(CFG_HE_NUM_SOUND_GT80,
  538. he_cap->num_sounding_gt_80))
  539. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 =
  540. he_cap->num_sounding_gt_80;
  541. mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer =
  542. he_cap->mu_beamformer;
  543. } else {
  544. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformer = 0;
  545. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_lt_80 = 0;
  546. mlme_obj->cfg.he_caps.dot11_he_cap.num_sounding_gt_80 = 0;
  547. mlme_obj->cfg.he_caps.dot11_he_cap.mu_beamformer = 0;
  548. }
  549. if (mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee) {
  550. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee =
  551. he_cap->su_beamformee;
  552. if (cfg_in_range(CFG_HE_BFEE_STS_LT80, he_cap->bfee_sts_lt_80))
  553. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 =
  554. he_cap->bfee_sts_lt_80;
  555. if (cfg_in_range(CFG_HE_BFEE_STS_GT80, he_cap->bfee_sts_gt_80))
  556. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 =
  557. he_cap->bfee_sts_gt_80;
  558. } else {
  559. mlme_obj->cfg.he_caps.dot11_he_cap.su_beamformee = 0;
  560. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_lt_80 = 0;
  561. mlme_obj->cfg.he_caps.dot11_he_cap.bfee_sts_gt_80 = 0;
  562. }
  563. mlme_obj->cfg.he_caps.dot11_he_cap.ul_mu = he_cap->ul_mu;
  564. mlme_obj->cfg.he_caps.dot11_he_cap.su_feedback_tone16 =
  565. he_cap->su_feedback_tone16;
  566. mlme_obj->cfg.he_caps.dot11_he_cap.mu_feedback_tone16 =
  567. he_cap->mu_feedback_tone16;
  568. mlme_obj->cfg.he_caps.dot11_he_cap.codebook_su = he_cap->codebook_su;
  569. mlme_obj->cfg.he_caps.dot11_he_cap.codebook_mu = he_cap->codebook_mu;
  570. if (cfg_in_range(CFG_HE_BFRM_FEED, he_cap->beamforming_feedback))
  571. mlme_obj->cfg.he_caps.dot11_he_cap.beamforming_feedback =
  572. he_cap->beamforming_feedback;
  573. mlme_obj->cfg.he_caps.dot11_he_cap.he_er_su_ppdu =
  574. he_cap->he_er_su_ppdu;
  575. mlme_obj->cfg.he_caps.dot11_he_cap.dl_mu_mimo_part_bw =
  576. he_cap->dl_mu_mimo_part_bw;
  577. mlme_obj->cfg.he_caps.dot11_he_cap.ppet_present = he_cap->ppet_present;
  578. mlme_obj->cfg.he_caps.dot11_he_cap.srp = he_cap->srp;
  579. mlme_obj->cfg.he_caps.dot11_he_cap.power_boost = he_cap->power_boost;
  580. mlme_obj->cfg.he_caps.dot11_he_cap.he_ltf_800_gi_4x =
  581. he_cap->he_ltf_800_gi_4x;
  582. if (cfg_in_range(CFG_HE_MAX_NC, he_cap->max_nc))
  583. mlme_obj->cfg.he_caps.dot11_he_cap.max_nc = he_cap->max_nc;
  584. mlme_obj->cfg.he_caps.dot11_he_cap.er_he_ltf_800_gi_4x =
  585. he_cap->er_he_ltf_800_gi_4x;
  586. mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_40Mhz_2G =
  587. he_cap->he_ppdu_20_in_40Mhz_2G;
  588. mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_20_in_160_80p80Mhz =
  589. he_cap->he_ppdu_20_in_160_80p80Mhz;
  590. mlme_obj->cfg.he_caps.dot11_he_cap.he_ppdu_80_in_160_80p80Mhz =
  591. he_cap->he_ppdu_80_in_160_80p80Mhz;
  592. mlme_obj->cfg.he_caps.dot11_he_cap.er_1x_he_ltf_gi =
  593. he_cap->er_1x_he_ltf_gi;
  594. mlme_obj->cfg.he_caps.dot11_he_cap.midamble_tx_rx_1x_he_ltf =
  595. he_cap->midamble_tx_rx_1x_he_ltf;
  596. if (cfg_in_range(CFG_HE_DCM_MAX_BW, he_cap->dcm_max_bw))
  597. mlme_obj->cfg.he_caps.dot11_he_cap.dcm_max_bw =
  598. he_cap->dcm_max_bw;
  599. mlme_obj->cfg.he_caps.dot11_he_cap.longer_than_16_he_sigb_ofdm_sym =
  600. he_cap->longer_than_16_he_sigb_ofdm_sym;
  601. mlme_obj->cfg.he_caps.dot11_he_cap.tx_1024_qam_lt_242_tone_ru =
  602. he_cap->tx_1024_qam_lt_242_tone_ru;
  603. mlme_obj->cfg.he_caps.dot11_he_cap.rx_1024_qam_lt_242_tone_ru =
  604. he_cap->rx_1024_qam_lt_242_tone_ru;
  605. mlme_obj->cfg.he_caps.dot11_he_cap.non_trig_cqi_feedback =
  606. he_cap->non_trig_cqi_feedback;
  607. mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_compress_sigb =
  608. he_cap->rx_full_bw_su_he_mu_compress_sigb;
  609. mlme_obj->cfg.he_caps.dot11_he_cap.rx_full_bw_su_he_mu_non_cmpr_sigb =
  610. he_cap->rx_full_bw_su_he_mu_non_cmpr_sigb;
  611. tx_mcs_map = he_cap->tx_he_mcs_map_lt_80;
  612. rx_mcs_map = he_cap->rx_he_mcs_map_lt_80;
  613. if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) {
  614. nss = 2;
  615. tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss);
  616. rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss);
  617. }
  618. if (cfg_in_range(CFG_HE_RX_MCS_MAP_LT_80, rx_mcs_map))
  619. mlme_obj->cfg.he_caps.dot11_he_cap.rx_he_mcs_map_lt_80 =
  620. rx_mcs_map;
  621. if (cfg_in_range(CFG_HE_TX_MCS_MAP_LT_80, tx_mcs_map))
  622. mlme_obj->cfg.he_caps.dot11_he_cap.tx_he_mcs_map_lt_80 =
  623. tx_mcs_map;
  624. tx_mcs_map = *((uint16_t *)he_cap->tx_he_mcs_map_160);
  625. rx_mcs_map = *((uint16_t *)he_cap->rx_he_mcs_map_160);
  626. if (!mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2) {
  627. nss = 2;
  628. tx_mcs_map = HE_SET_MCS_4_NSS(tx_mcs_map, HE_MCS_DISABLE, nss);
  629. rx_mcs_map = HE_SET_MCS_4_NSS(rx_mcs_map, HE_MCS_DISABLE, nss);
  630. }
  631. if (cfg_in_range(CFG_HE_RX_MCS_MAP_160, rx_mcs_map))
  632. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  633. rx_he_mcs_map_160,
  634. &rx_mcs_map, sizeof(uint16_t));
  635. if (cfg_in_range(CFG_HE_TX_MCS_MAP_160, tx_mcs_map))
  636. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  637. tx_he_mcs_map_160,
  638. &tx_mcs_map, sizeof(uint16_t));
  639. if (cfg_in_range(CFG_HE_RX_MCS_MAP_80_80,
  640. *((uint16_t *)he_cap->rx_he_mcs_map_80_80)))
  641. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  642. rx_he_mcs_map_80_80,
  643. he_cap->rx_he_mcs_map_80_80, sizeof(uint16_t));
  644. if (cfg_in_range(CFG_HE_TX_MCS_MAP_80_80,
  645. *((uint16_t *)he_cap->tx_he_mcs_map_80_80)))
  646. qdf_mem_copy(mlme_obj->cfg.he_caps.dot11_he_cap.
  647. tx_he_mcs_map_80_80,
  648. he_cap->tx_he_mcs_map_80_80, sizeof(uint16_t));
  649. qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_2g, wma_cfg->ppet_2g,
  650. HE_MAX_PPET_SIZE);
  651. qdf_mem_copy(mlme_obj->cfg.he_caps.he_ppet_5g, wma_cfg->ppet_5g,
  652. HE_MAX_PPET_SIZE);
  653. mlme_obj->cfg.he_caps.he_cap_orig = mlme_obj->cfg.he_caps.dot11_he_cap;
  654. return status;
  655. }
  656. #endif
  657. QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc,
  658. uint16_t *value)
  659. {
  660. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  661. if (!mlme_obj)
  662. return QDF_STATUS_E_FAILURE;
  663. *value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains;
  664. return QDF_STATUS_SUCCESS;
  665. }
  666. QDF_STATUS wlan_mlme_get_bt_chain_separation_flag(struct wlan_objmgr_psoc *psoc,
  667. bool *value)
  668. {
  669. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  670. if (!mlme_obj)
  671. return QDF_STATUS_E_FAILURE;
  672. *value = mlme_obj->cfg.chainmask_cfg.enable_bt_chain_separation;
  673. return QDF_STATUS_SUCCESS;
  674. }
  675. QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc,
  676. uint16_t *value)
  677. {
  678. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  679. if (!mlme_obj)
  680. return QDF_STATUS_E_FAILURE;
  681. *value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains;
  682. return QDF_STATUS_SUCCESS;
  683. }
  684. QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc,
  685. uint8_t session_id)
  686. {
  687. int ret_val;
  688. uint8_t ch_msk_val;
  689. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  690. if (!mlme_obj)
  691. return QDF_STATUS_E_FAILURE;
  692. mlme_debug("txchainmask1x1: %d rxchainmask1x1: %d",
  693. mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
  694. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
  695. mlme_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d",
  696. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g,
  697. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g);
  698. mlme_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d",
  699. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g,
  700. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g);
  701. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) {
  702. ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1;
  703. ret_val = wma_cli_set_command(session_id,
  704. WMI_PDEV_PARAM_TX_CHAIN_MASK,
  705. ch_msk_val, PDEV_CMD);
  706. if (ret_val)
  707. return QDF_STATUS_E_FAILURE;
  708. }
  709. if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  710. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1;
  711. ret_val = wma_cli_set_command(session_id,
  712. WMI_PDEV_PARAM_RX_CHAIN_MASK,
  713. ch_msk_val, PDEV_CMD);
  714. if (ret_val)
  715. return QDF_STATUS_E_FAILURE;
  716. }
  717. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 ||
  718. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  719. mlme_debug("band agnostic tx/rx chain mask set. skip per band chain mask");
  720. return QDF_STATUS_SUCCESS;
  721. }
  722. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g) {
  723. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g;
  724. ret_val = wma_cli_set_command(session_id,
  725. WMI_PDEV_PARAM_TX_CHAIN_MASK_2G,
  726. ch_msk_val, PDEV_CMD);
  727. if (0 != ret_val)
  728. return QDF_STATUS_E_FAILURE;
  729. }
  730. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g) {
  731. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g;
  732. ret_val = wma_cli_set_command(session_id,
  733. WMI_PDEV_PARAM_RX_CHAIN_MASK_2G,
  734. ch_msk_val, PDEV_CMD);
  735. if (0 != ret_val)
  736. return QDF_STATUS_E_FAILURE;
  737. }
  738. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g) {
  739. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g;
  740. ret_val = wma_cli_set_command(session_id,
  741. WMI_PDEV_PARAM_TX_CHAIN_MASK_5G,
  742. ch_msk_val, PDEV_CMD);
  743. if (0 != ret_val)
  744. return QDF_STATUS_E_FAILURE;
  745. }
  746. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g) {
  747. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g;
  748. ret_val = wma_cli_set_command(session_id,
  749. WMI_PDEV_PARAM_RX_CHAIN_MASK_5G,
  750. ch_msk_val, PDEV_CMD);
  751. if (0 != ret_val)
  752. return QDF_STATUS_E_FAILURE;
  753. }
  754. return QDF_STATUS_SUCCESS;
  755. }
  756. QDF_STATUS
  757. wlan_mlme_get_manufacturer_name(struct wlan_objmgr_psoc *psoc,
  758. uint8_t *pbuf, uint32_t *plen)
  759. {
  760. struct wlan_mlme_psoc_obj *mlme_obj;
  761. mlme_obj = mlme_get_psoc_obj(psoc);
  762. if (!mlme_obj)
  763. return QDF_STATUS_E_FAILURE;
  764. *plen = qdf_str_lcopy(pbuf,
  765. mlme_obj->cfg.product_details.manufacturer_name,
  766. *plen);
  767. return QDF_STATUS_SUCCESS;
  768. }
  769. QDF_STATUS
  770. wlan_mlme_get_model_number(struct wlan_objmgr_psoc *psoc,
  771. uint8_t *pbuf, uint32_t *plen)
  772. {
  773. struct wlan_mlme_psoc_obj *mlme_obj;
  774. mlme_obj = mlme_get_psoc_obj(psoc);
  775. if (!mlme_obj)
  776. return QDF_STATUS_E_FAILURE;
  777. *plen = qdf_str_lcopy(pbuf,
  778. mlme_obj->cfg.product_details.model_number,
  779. *plen);
  780. return QDF_STATUS_SUCCESS;
  781. }
  782. QDF_STATUS
  783. wlan_mlme_get_model_name(struct wlan_objmgr_psoc *psoc,
  784. uint8_t *pbuf, uint32_t *plen)
  785. {
  786. struct wlan_mlme_psoc_obj *mlme_obj;
  787. mlme_obj = mlme_get_psoc_obj(psoc);
  788. if (!mlme_obj)
  789. return QDF_STATUS_E_FAILURE;
  790. *plen = qdf_str_lcopy(pbuf,
  791. mlme_obj->cfg.product_details.model_name,
  792. *plen);
  793. return QDF_STATUS_SUCCESS;
  794. }
  795. QDF_STATUS
  796. wlan_mlme_get_manufacture_product_version(struct wlan_objmgr_psoc *psoc,
  797. uint8_t *pbuf, uint32_t *plen)
  798. {
  799. struct wlan_mlme_psoc_obj *mlme_obj;
  800. mlme_obj = mlme_get_psoc_obj(psoc);
  801. if (!mlme_obj)
  802. return QDF_STATUS_E_FAILURE;
  803. *plen = qdf_str_lcopy(pbuf,
  804. mlme_obj->cfg.product_details.manufacture_product_version,
  805. *plen);
  806. return QDF_STATUS_SUCCESS;
  807. }
  808. QDF_STATUS
  809. wlan_mlme_get_manufacture_product_name(struct wlan_objmgr_psoc *psoc,
  810. uint8_t *pbuf, uint32_t *plen)
  811. {
  812. struct wlan_mlme_psoc_obj *mlme_obj;
  813. mlme_obj = mlme_get_psoc_obj(psoc);
  814. if (!mlme_obj)
  815. return QDF_STATUS_E_FAILURE;
  816. *plen = qdf_str_lcopy(pbuf,
  817. mlme_obj->cfg.product_details.manufacture_product_name,
  818. *plen);
  819. return QDF_STATUS_SUCCESS;
  820. }
  821. void wlan_mlme_get_tl_delayed_trgr_frm_int(struct wlan_objmgr_psoc *psoc,
  822. uint32_t *value)
  823. {
  824. struct wlan_mlme_psoc_obj *mlme_obj;
  825. mlme_obj = mlme_get_psoc_obj(psoc);
  826. if (!mlme_obj) {
  827. *value = cfg_default(CFG_TL_DELAYED_TRGR_FRM_INTERVAL);
  828. return;
  829. }
  830. *value = mlme_obj->cfg.wmm_params.delayed_trigger_frm_int;
  831. }
  832. QDF_STATUS wlan_mlme_get_wmm_dir_ac_vo(struct wlan_objmgr_psoc *psoc,
  833. uint8_t *value)
  834. {
  835. struct wlan_mlme_psoc_obj *mlme_obj;
  836. mlme_obj = mlme_get_psoc_obj(psoc);
  837. if (!mlme_obj)
  838. return QDF_STATUS_E_FAILURE;
  839. *value = mlme_obj->cfg.wmm_params.ac_vo.dir_ac_vo;
  840. return QDF_STATUS_SUCCESS;
  841. }
  842. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vo(struct wlan_objmgr_psoc *psoc,
  843. uint16_t *value)
  844. {
  845. struct wlan_mlme_psoc_obj *mlme_obj;
  846. mlme_obj = mlme_get_psoc_obj(psoc);
  847. if (!mlme_obj)
  848. return QDF_STATUS_E_FAILURE;
  849. *value = mlme_obj->cfg.wmm_params.ac_vo.nom_msdu_size_ac_vo;
  850. return QDF_STATUS_SUCCESS;
  851. }
  852. QDF_STATUS
  853. wlan_mlme_get_wmm_mean_data_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
  854. uint32_t *value)
  855. {
  856. struct wlan_mlme_psoc_obj *mlme_obj;
  857. mlme_obj = mlme_get_psoc_obj(psoc);
  858. if (!mlme_obj)
  859. return QDF_STATUS_E_FAILURE;
  860. *value = mlme_obj->cfg.wmm_params.ac_vo.mean_data_rate_ac_vo;
  861. return QDF_STATUS_SUCCESS;
  862. }
  863. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
  864. uint32_t *value)
  865. {
  866. struct wlan_mlme_psoc_obj *mlme_obj;
  867. mlme_obj = mlme_get_psoc_obj(psoc);
  868. if (!mlme_obj)
  869. return QDF_STATUS_E_FAILURE;
  870. *value = mlme_obj->cfg.wmm_params.ac_vo.min_phy_rate_ac_vo;
  871. return QDF_STATUS_SUCCESS;
  872. }
  873. QDF_STATUS
  874. wlan_mlme_get_wmm_sba_ac_vo(struct wlan_objmgr_psoc *psoc, uint16_t *value)
  875. {
  876. struct wlan_mlme_psoc_obj *mlme_obj;
  877. mlme_obj = mlme_get_psoc_obj(psoc);
  878. if (!mlme_obj) {
  879. return QDF_STATUS_E_FAILURE;
  880. }
  881. *value = mlme_obj->cfg.wmm_params.ac_vo.sba_ac_vo;
  882. return QDF_STATUS_SUCCESS;
  883. }
  884. QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_srv_intv(struct wlan_objmgr_psoc *psoc,
  885. uint32_t *value)
  886. {
  887. struct wlan_mlme_psoc_obj *mlme_obj;
  888. mlme_obj = mlme_get_psoc_obj(psoc);
  889. if (!mlme_obj)
  890. return QDF_STATUS_E_FAILURE;
  891. *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_srv_intv;
  892. return QDF_STATUS_SUCCESS;
  893. }
  894. QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc *psoc,
  895. uint32_t *value)
  896. {
  897. struct wlan_mlme_psoc_obj *mlme_obj;
  898. mlme_obj = mlme_get_psoc_obj(psoc);
  899. if (!mlme_obj)
  900. return QDF_STATUS_E_FAILURE;
  901. *value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_sus_intv;
  902. return QDF_STATUS_SUCCESS;
  903. }
  904. QDF_STATUS
  905. wlan_mlme_get_wmm_dir_ac_vi(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  906. {
  907. struct wlan_mlme_psoc_obj *mlme_obj;
  908. mlme_obj = mlme_get_psoc_obj(psoc);
  909. if (!mlme_obj)
  910. return QDF_STATUS_E_FAILURE;
  911. *value = mlme_obj->cfg.wmm_params.ac_vi.dir_ac_vi;
  912. return QDF_STATUS_SUCCESS;
  913. }
  914. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vi(struct wlan_objmgr_psoc *psoc,
  915. uint16_t *value)
  916. {
  917. struct wlan_mlme_psoc_obj *mlme_obj;
  918. mlme_obj = mlme_get_psoc_obj(psoc);
  919. if (!mlme_obj)
  920. return QDF_STATUS_E_FAILURE;
  921. *value =
  922. mlme_obj->cfg.wmm_params.ac_vi.nom_msdu_size_ac_vi;
  923. return QDF_STATUS_SUCCESS;
  924. }
  925. QDF_STATUS
  926. wlan_mlme_get_wmm_mean_data_rate_ac_vi(struct wlan_objmgr_psoc *psoc,
  927. uint32_t *value)
  928. {
  929. struct wlan_mlme_psoc_obj *mlme_obj;
  930. mlme_obj = mlme_get_psoc_obj(psoc);
  931. if (!mlme_obj)
  932. return QDF_STATUS_E_FAILURE;
  933. *value = mlme_obj->cfg.wmm_params.ac_vi.mean_data_rate_ac_vi;
  934. return QDF_STATUS_SUCCESS;
  935. }
  936. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vi(struct wlan_objmgr_psoc *psoc,
  937. uint32_t *value)
  938. {
  939. struct wlan_mlme_psoc_obj *mlme_obj;
  940. mlme_obj = mlme_get_psoc_obj(psoc);
  941. if (!mlme_obj)
  942. return QDF_STATUS_E_FAILURE;
  943. *value = mlme_obj->cfg.wmm_params.ac_vi.min_phy_rate_ac_vi;
  944. return QDF_STATUS_SUCCESS;
  945. }
  946. QDF_STATUS wlan_mlme_get_wmm_sba_ac_vi(struct wlan_objmgr_psoc *psoc,
  947. uint16_t *value)
  948. {
  949. struct wlan_mlme_psoc_obj *mlme_obj;
  950. mlme_obj = mlme_get_psoc_obj(psoc);
  951. if (!mlme_obj)
  952. return QDF_STATUS_E_FAILURE;
  953. *value = mlme_obj->cfg.wmm_params.ac_vi.sba_ac_vi;
  954. return QDF_STATUS_SUCCESS;
  955. }
  956. QDF_STATUS
  957. wlan_mlme_get_wmm_uapsd_vi_srv_intv(struct wlan_objmgr_psoc *psoc,
  958. uint32_t *value)
  959. {
  960. struct wlan_mlme_psoc_obj *mlme_obj;
  961. mlme_obj = mlme_get_psoc_obj(psoc);
  962. if (!mlme_obj)
  963. return QDF_STATUS_E_FAILURE;
  964. *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_srv_intv;
  965. return QDF_STATUS_SUCCESS;
  966. }
  967. QDF_STATUS wlan_mlme_get_wmm_uapsd_vi_sus_intv(struct wlan_objmgr_psoc *psoc,
  968. uint32_t *value)
  969. {
  970. struct wlan_mlme_psoc_obj *mlme_obj;
  971. mlme_obj = mlme_get_psoc_obj(psoc);
  972. if (!mlme_obj)
  973. return QDF_STATUS_E_FAILURE;
  974. *value = mlme_obj->cfg.wmm_params.ac_vi.uapsd_vi_sus_intv;
  975. return QDF_STATUS_SUCCESS;
  976. }
  977. QDF_STATUS
  978. wlan_mlme_get_wmm_dir_ac_be(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  979. {
  980. struct wlan_mlme_psoc_obj *mlme_obj;
  981. mlme_obj = mlme_get_psoc_obj(psoc);
  982. if (!mlme_obj)
  983. return QDF_STATUS_E_FAILURE;
  984. *value = mlme_obj->cfg.wmm_params.ac_be.dir_ac_be;
  985. return QDF_STATUS_SUCCESS;
  986. }
  987. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_be(struct wlan_objmgr_psoc *psoc,
  988. uint16_t *value)
  989. {
  990. struct wlan_mlme_psoc_obj *mlme_obj;
  991. mlme_obj = mlme_get_psoc_obj(psoc);
  992. if (!mlme_obj)
  993. return QDF_STATUS_E_FAILURE;
  994. *value = mlme_obj->cfg.wmm_params.ac_be.nom_msdu_size_ac_be;
  995. return QDF_STATUS_SUCCESS;
  996. }
  997. QDF_STATUS
  998. wlan_mlme_get_wmm_mean_data_rate_ac_be(struct wlan_objmgr_psoc *psoc,
  999. uint32_t *value)
  1000. {
  1001. struct wlan_mlme_psoc_obj *mlme_obj;
  1002. mlme_obj = mlme_get_psoc_obj(psoc);
  1003. if (!mlme_obj)
  1004. return QDF_STATUS_E_FAILURE;
  1005. *value = mlme_obj->cfg.wmm_params.ac_be.mean_data_rate_ac_be;
  1006. return QDF_STATUS_SUCCESS;
  1007. }
  1008. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_be(struct wlan_objmgr_psoc *psoc,
  1009. uint32_t *value)
  1010. {
  1011. struct wlan_mlme_psoc_obj *mlme_obj;
  1012. mlme_obj = mlme_get_psoc_obj(psoc);
  1013. if (!mlme_obj)
  1014. return QDF_STATUS_E_FAILURE;
  1015. *value = mlme_obj->cfg.wmm_params.ac_be.min_phy_rate_ac_be;
  1016. return QDF_STATUS_SUCCESS;
  1017. }
  1018. QDF_STATUS
  1019. wlan_mlme_get_wmm_sba_ac_be(struct wlan_objmgr_psoc *psoc, uint16_t *value)
  1020. {
  1021. struct wlan_mlme_psoc_obj *mlme_obj;
  1022. mlme_obj = mlme_get_psoc_obj(psoc);
  1023. if (!mlme_obj)
  1024. return QDF_STATUS_E_FAILURE;
  1025. *value = mlme_obj->cfg.wmm_params.ac_be.sba_ac_be;
  1026. return QDF_STATUS_SUCCESS;
  1027. }
  1028. QDF_STATUS wlan_mlme_get_wmm_uapsd_be_srv_intv(struct wlan_objmgr_psoc *psoc,
  1029. uint32_t *value)
  1030. {
  1031. struct wlan_mlme_psoc_obj *mlme_obj;
  1032. mlme_obj = mlme_get_psoc_obj(psoc);
  1033. if (!mlme_obj)
  1034. return QDF_STATUS_E_FAILURE;
  1035. *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_srv_intv;
  1036. return QDF_STATUS_SUCCESS;
  1037. }
  1038. QDF_STATUS wlan_mlme_get_wmm_uapsd_be_sus_intv(struct wlan_objmgr_psoc *psoc,
  1039. uint32_t *value)
  1040. {
  1041. struct wlan_mlme_psoc_obj *mlme_obj;
  1042. mlme_obj = mlme_get_psoc_obj(psoc);
  1043. if (!mlme_obj)
  1044. return QDF_STATUS_E_FAILURE;
  1045. *value = mlme_obj->cfg.wmm_params.ac_be.uapsd_be_sus_intv;
  1046. return QDF_STATUS_SUCCESS;
  1047. }
  1048. QDF_STATUS
  1049. wlan_mlme_get_wmm_dir_ac_bk(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1050. {
  1051. struct wlan_mlme_psoc_obj *mlme_obj;
  1052. mlme_obj = mlme_get_psoc_obj(psoc);
  1053. if (!mlme_obj)
  1054. return QDF_STATUS_E_FAILURE;
  1055. *value = mlme_obj->cfg.wmm_params.ac_bk.dir_ac_bk;
  1056. return QDF_STATUS_SUCCESS;
  1057. }
  1058. QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_bk(struct wlan_objmgr_psoc *psoc,
  1059. uint16_t *value)
  1060. {
  1061. struct wlan_mlme_psoc_obj *mlme_obj;
  1062. mlme_obj = mlme_get_psoc_obj(psoc);
  1063. if (!mlme_obj)
  1064. return QDF_STATUS_E_FAILURE;
  1065. *value = mlme_obj->cfg.wmm_params.ac_bk.nom_msdu_size_ac_bk;
  1066. return QDF_STATUS_SUCCESS;
  1067. }
  1068. QDF_STATUS
  1069. wlan_mlme_get_wmm_mean_data_rate_ac_bk(struct wlan_objmgr_psoc *psoc,
  1070. uint32_t *value)
  1071. {
  1072. struct wlan_mlme_psoc_obj *mlme_obj;
  1073. mlme_obj = mlme_get_psoc_obj(psoc);
  1074. if (!mlme_obj)
  1075. return QDF_STATUS_E_FAILURE;
  1076. *value = mlme_obj->cfg.wmm_params.ac_bk.mean_data_rate_ac_bk;
  1077. return QDF_STATUS_SUCCESS;
  1078. }
  1079. QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_bk(struct wlan_objmgr_psoc *psoc,
  1080. uint32_t *value)
  1081. {
  1082. struct wlan_mlme_psoc_obj *mlme_obj;
  1083. mlme_obj = mlme_get_psoc_obj(psoc);
  1084. if (!mlme_obj)
  1085. return QDF_STATUS_E_FAILURE;
  1086. *value = mlme_obj->cfg.wmm_params.ac_bk.min_phy_rate_ac_bk;
  1087. return QDF_STATUS_SUCCESS;
  1088. }
  1089. QDF_STATUS
  1090. wlan_mlme_get_wmm_sba_ac_bk(struct wlan_objmgr_psoc *psoc, uint16_t *value)
  1091. {
  1092. struct wlan_mlme_psoc_obj *mlme_obj;
  1093. mlme_obj = mlme_get_psoc_obj(psoc);
  1094. if (!mlme_obj)
  1095. return QDF_STATUS_E_FAILURE;
  1096. *value = mlme_obj->cfg.wmm_params.ac_bk.sba_ac_bk;
  1097. return QDF_STATUS_SUCCESS;
  1098. }
  1099. QDF_STATUS
  1100. wlan_mlme_get_wmm_uapsd_bk_srv_intv(struct wlan_objmgr_psoc *psoc,
  1101. uint32_t *value)
  1102. {
  1103. struct wlan_mlme_psoc_obj *mlme_obj;
  1104. mlme_obj = mlme_get_psoc_obj(psoc);
  1105. if (!mlme_obj)
  1106. return QDF_STATUS_E_FAILURE;
  1107. *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_srv_intv;
  1108. return QDF_STATUS_SUCCESS;
  1109. }
  1110. QDF_STATUS
  1111. wlan_mlme_get_wmm_uapsd_bk_sus_intv(struct wlan_objmgr_psoc *psoc,
  1112. uint32_t *value)
  1113. {
  1114. struct wlan_mlme_psoc_obj *mlme_obj;
  1115. mlme_obj = mlme_get_psoc_obj(psoc);
  1116. if (!mlme_obj)
  1117. return QDF_STATUS_E_FAILURE;
  1118. *value = mlme_obj->cfg.wmm_params.ac_bk.uapsd_bk_sus_intv;
  1119. return QDF_STATUS_SUCCESS;
  1120. }
  1121. QDF_STATUS
  1122. wlan_mlme_get_wmm_mode(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1123. {
  1124. struct wlan_mlme_psoc_obj *mlme_obj;
  1125. mlme_obj = mlme_get_psoc_obj(psoc);
  1126. if (!mlme_obj)
  1127. return QDF_STATUS_E_FAILURE;
  1128. *value = mlme_obj->cfg.wmm_params.wmm_config.wmm_mode;
  1129. return QDF_STATUS_SUCCESS;
  1130. }
  1131. QDF_STATUS
  1132. wlan_mlme_get_80211e_is_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  1133. {
  1134. struct wlan_mlme_psoc_obj *mlme_obj;
  1135. mlme_obj = mlme_get_psoc_obj(psoc);
  1136. if (!mlme_obj)
  1137. return QDF_STATUS_E_FAILURE;
  1138. *value = mlme_obj->cfg.wmm_params.wmm_config.b80211e_is_enabled;
  1139. return QDF_STATUS_SUCCESS;
  1140. }
  1141. QDF_STATUS
  1142. wlan_mlme_get_wmm_uapsd_mask(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1143. {
  1144. struct wlan_mlme_psoc_obj *mlme_obj;
  1145. mlme_obj = mlme_get_psoc_obj(psoc);
  1146. if (!mlme_obj)
  1147. return QDF_STATUS_E_FAILURE;
  1148. *value = mlme_obj->cfg.wmm_params.wmm_config.uapsd_mask;
  1149. return QDF_STATUS_SUCCESS;
  1150. }
  1151. QDF_STATUS wlan_mlme_get_implicit_qos_is_enabled(struct wlan_objmgr_psoc *psoc,
  1152. bool *value)
  1153. {
  1154. struct wlan_mlme_psoc_obj *mlme_obj;
  1155. mlme_obj = mlme_get_psoc_obj(psoc);
  1156. if (!mlme_obj)
  1157. return QDF_STATUS_E_FAILURE;
  1158. *value = mlme_obj->cfg.wmm_params.wmm_config.bimplicit_qos_enabled;
  1159. return QDF_STATUS_SUCCESS;
  1160. }
  1161. #ifdef FEATURE_WLAN_ESE
  1162. void wlan_mlme_get_inactivity_interval(struct wlan_objmgr_psoc *psoc,
  1163. uint32_t *value)
  1164. {
  1165. struct wlan_mlme_psoc_obj *mlme_obj;
  1166. mlme_obj = mlme_get_psoc_obj(psoc);
  1167. if (!mlme_obj) {
  1168. *value = cfg_default(CFG_QOS_WMM_INACTIVITY_INTERVAL);
  1169. return;
  1170. }
  1171. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.inactivity_intv;
  1172. }
  1173. #endif
  1174. void wlan_mlme_get_is_ts_burst_size_enable(struct wlan_objmgr_psoc *psoc,
  1175. bool *value)
  1176. {
  1177. struct wlan_mlme_psoc_obj *mlme_obj;
  1178. mlme_obj = mlme_get_psoc_obj(psoc);
  1179. if (!mlme_obj) {
  1180. *value = cfg_default(CFG_QOS_WMM_BURST_SIZE_DEFN);
  1181. return;
  1182. }
  1183. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.burst_size_def;
  1184. }
  1185. void wlan_mlme_get_ts_info_ack_policy(struct wlan_objmgr_psoc *psoc,
  1186. enum mlme_ts_info_ack_policy *value)
  1187. {
  1188. struct wlan_mlme_psoc_obj *mlme_obj;
  1189. mlme_obj = mlme_get_psoc_obj(psoc);
  1190. if (!mlme_obj) {
  1191. *value = cfg_default(CFG_QOS_WMM_TS_INFO_ACK_POLICY);
  1192. return;
  1193. }
  1194. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_ack_policy;
  1195. }
  1196. QDF_STATUS
  1197. wlan_mlme_get_ts_acm_value_for_ac(struct wlan_objmgr_psoc *psoc, bool *value)
  1198. {
  1199. struct wlan_mlme_psoc_obj *mlme_obj;
  1200. mlme_obj = mlme_get_psoc_obj(psoc);
  1201. if (!mlme_obj)
  1202. return QDF_STATUS_E_FAILURE;
  1203. *value = mlme_obj->cfg.wmm_params.wmm_tspec_element.ts_acm_is_off;
  1204. return QDF_STATUS_SUCCESS;
  1205. }
  1206. QDF_STATUS wlan_mlme_get_listen_interval(struct wlan_objmgr_psoc *psoc,
  1207. int *value)
  1208. {
  1209. struct wlan_mlme_psoc_obj *mlme_obj;
  1210. mlme_obj = mlme_get_psoc_obj(psoc);
  1211. if (!mlme_obj)
  1212. return QDF_STATUS_E_FAILURE;
  1213. *value = mlme_obj->cfg.sap_cfg.listen_interval;
  1214. return QDF_STATUS_SUCCESS;
  1215. }
  1216. QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc,
  1217. int value)
  1218. {
  1219. struct wlan_mlme_psoc_obj *mlme_obj;
  1220. mlme_obj = mlme_get_psoc_obj(psoc);
  1221. if (!mlme_obj)
  1222. return QDF_STATUS_E_FAILURE;
  1223. if (cfg_in_range(CFG_LISTEN_INTERVAL, value))
  1224. mlme_obj->cfg.sap_cfg.listen_interval = value;
  1225. else
  1226. return QDF_STATUS_E_FAILURE;
  1227. return QDF_STATUS_SUCCESS;
  1228. }
  1229. QDF_STATUS wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc *psoc,
  1230. int value)
  1231. {
  1232. struct wlan_mlme_psoc_obj *mlme_obj;
  1233. mlme_obj = mlme_get_psoc_obj(psoc);
  1234. if (!mlme_obj)
  1235. return QDF_STATUS_E_FAILURE;
  1236. if (cfg_in_range(CFG_ASSOC_STA_LIMIT, value))
  1237. mlme_obj->cfg.sap_cfg.assoc_sta_limit = value;
  1238. else
  1239. return QDF_STATUS_E_FAILURE;
  1240. return QDF_STATUS_SUCCESS;
  1241. }
  1242. QDF_STATUS wlan_mlme_set_rmc_action_period_freq(struct wlan_objmgr_psoc *psoc,
  1243. int value)
  1244. {
  1245. struct wlan_mlme_psoc_obj *mlme_obj;
  1246. mlme_obj = mlme_get_psoc_obj(psoc);
  1247. if (!mlme_obj)
  1248. return QDF_STATUS_E_FAILURE;
  1249. if (cfg_in_range(CFG_RMC_ACTION_PERIOD_FREQUENCY, value))
  1250. mlme_obj->cfg.sap_cfg.rmc_action_period_freq = value;
  1251. else
  1252. return QDF_STATUS_E_FAILURE;
  1253. return QDF_STATUS_SUCCESS;
  1254. }
  1255. QDF_STATUS wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
  1256. bool *value)
  1257. {
  1258. struct wlan_mlme_psoc_obj *mlme_obj;
  1259. mlme_obj = mlme_get_psoc_obj(psoc);
  1260. if (!mlme_obj)
  1261. return QDF_STATUS_E_FAILURE;
  1262. *value = mlme_obj->cfg.sap_cfg.sap_get_peer_info;
  1263. return QDF_STATUS_SUCCESS;
  1264. }
  1265. QDF_STATUS wlan_mlme_set_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
  1266. bool value)
  1267. {
  1268. struct wlan_mlme_psoc_obj *mlme_obj;
  1269. mlme_obj = mlme_get_psoc_obj(psoc);
  1270. if (!mlme_obj)
  1271. return QDF_STATUS_E_FAILURE;
  1272. mlme_obj->cfg.sap_cfg.sap_get_peer_info = value;
  1273. return QDF_STATUS_SUCCESS;
  1274. }
  1275. QDF_STATUS
  1276. wlan_mlme_is_sap_bcast_deauth_enabled(struct wlan_objmgr_psoc *psoc,
  1277. bool *value)
  1278. {
  1279. struct wlan_mlme_psoc_obj *mlme_obj;
  1280. mlme_obj = mlme_get_psoc_obj(psoc);
  1281. if (!mlme_obj)
  1282. return QDF_STATUS_E_FAILURE;
  1283. *value = mlme_obj->cfg.sap_cfg.is_sap_bcast_deauth_enabled;
  1284. return QDF_STATUS_SUCCESS;
  1285. }
  1286. QDF_STATUS wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc *psoc,
  1287. bool *value)
  1288. {
  1289. struct wlan_mlme_psoc_obj *mlme_obj;
  1290. mlme_obj = mlme_get_psoc_obj(psoc);
  1291. if (!mlme_obj)
  1292. return QDF_STATUS_E_FAILURE;
  1293. *value = mlme_obj->cfg.sap_cfg.sap_allow_all_chan_param_name;
  1294. return QDF_STATUS_SUCCESS;
  1295. }
  1296. QDF_STATUS wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc *psoc,
  1297. int *value)
  1298. {
  1299. struct wlan_mlme_psoc_obj *mlme_obj;
  1300. mlme_obj = mlme_get_psoc_obj(psoc);
  1301. if (!mlme_obj)
  1302. return QDF_STATUS_E_FAILURE;
  1303. *value = mlme_obj->cfg.sap_cfg.sap_max_no_peers;
  1304. return QDF_STATUS_SUCCESS;
  1305. }
  1306. QDF_STATUS wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc *psoc,
  1307. int value)
  1308. {
  1309. struct wlan_mlme_psoc_obj *mlme_obj;
  1310. mlme_obj = mlme_get_psoc_obj(psoc);
  1311. if (!mlme_obj)
  1312. return QDF_STATUS_E_FAILURE;
  1313. if (cfg_in_range(CFG_RMC_ACTION_PERIOD_FREQUENCY, value))
  1314. mlme_obj->cfg.sap_cfg.sap_max_no_peers = value;
  1315. else
  1316. return QDF_STATUS_E_FAILURE;
  1317. return QDF_STATUS_SUCCESS;
  1318. }
  1319. QDF_STATUS wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc *psoc,
  1320. int *value)
  1321. {
  1322. struct wlan_mlme_psoc_obj *mlme_obj;
  1323. mlme_obj = mlme_get_psoc_obj(psoc);
  1324. if (!mlme_obj)
  1325. return QDF_STATUS_E_FAILURE;
  1326. *value = mlme_obj->cfg.sap_cfg.sap_max_offload_peers;
  1327. return QDF_STATUS_SUCCESS;
  1328. }
  1329. QDF_STATUS wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc
  1330. *psoc, int *value)
  1331. {
  1332. struct wlan_mlme_psoc_obj *mlme_obj;
  1333. mlme_obj = mlme_get_psoc_obj(psoc);
  1334. if (!mlme_obj)
  1335. return QDF_STATUS_E_FAILURE;
  1336. *value = mlme_obj->cfg.sap_cfg.sap_max_offload_reorder_buffs;
  1337. return QDF_STATUS_SUCCESS;
  1338. }
  1339. QDF_STATUS wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc *psoc,
  1340. int *value)
  1341. {
  1342. struct wlan_mlme_psoc_obj *mlme_obj;
  1343. mlme_obj = mlme_get_psoc_obj(psoc);
  1344. if (!mlme_obj)
  1345. return QDF_STATUS_E_FAILURE;
  1346. *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_beacon_cnt;
  1347. return QDF_STATUS_SUCCESS;
  1348. }
  1349. QDF_STATUS wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc *psoc,
  1350. bool *value)
  1351. {
  1352. struct wlan_mlme_psoc_obj *mlme_obj;
  1353. mlme_obj = mlme_get_psoc_obj(psoc);
  1354. if (!mlme_obj)
  1355. return QDF_STATUS_E_FAILURE;
  1356. *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_mode;
  1357. return QDF_STATUS_SUCCESS;
  1358. }
  1359. QDF_STATUS wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc *psoc,
  1360. bool *value)
  1361. {
  1362. struct wlan_mlme_psoc_obj *mlme_obj;
  1363. mlme_obj = mlme_get_psoc_obj(psoc);
  1364. if (!mlme_obj)
  1365. return QDF_STATUS_E_FAILURE;
  1366. *value = mlme_obj->cfg.sap_cfg.sap_internal_restart;
  1367. return QDF_STATUS_SUCCESS;
  1368. }
  1369. QDF_STATUS wlan_mlme_get_sap_max_modulated_dtim(struct wlan_objmgr_psoc *psoc,
  1370. uint8_t *value)
  1371. {
  1372. struct wlan_mlme_psoc_obj *mlme_obj;
  1373. mlme_obj = mlme_get_psoc_obj(psoc);
  1374. if (!mlme_obj)
  1375. return QDF_STATUS_E_FAILURE;
  1376. *value = mlme_obj->cfg.sap_cfg.max_li_modulated_dtim_time;
  1377. return QDF_STATUS_SUCCESS;
  1378. }
  1379. QDF_STATUS wlan_mlme_get_sap_chan_pref_location(struct wlan_objmgr_psoc *psoc,
  1380. uint8_t *value)
  1381. {
  1382. struct wlan_mlme_psoc_obj *mlme_obj;
  1383. mlme_obj = mlme_get_psoc_obj(psoc);
  1384. if (!mlme_obj)
  1385. return QDF_STATUS_E_FAILURE;
  1386. *value = mlme_obj->cfg.sap_cfg.sap_pref_chan_location;
  1387. return QDF_STATUS_SUCCESS;
  1388. }
  1389. QDF_STATUS wlan_mlme_get_sap_country_priority(struct wlan_objmgr_psoc *psoc,
  1390. bool *value)
  1391. {
  1392. struct wlan_mlme_psoc_obj *mlme_obj;
  1393. mlme_obj = mlme_get_psoc_obj(psoc);
  1394. if (!mlme_obj)
  1395. return QDF_STATUS_E_FAILURE;
  1396. *value = mlme_obj->cfg.sap_cfg.country_code_priority;
  1397. return QDF_STATUS_SUCCESS;
  1398. }
  1399. QDF_STATUS wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc
  1400. *psoc, int *value)
  1401. {
  1402. struct wlan_mlme_psoc_obj *mlme_obj;
  1403. mlme_obj = mlme_get_psoc_obj(psoc);
  1404. if (!mlme_obj) {
  1405. *value = cfg_default(CFG_REDUCED_BEACON_INTERVAL);
  1406. return QDF_STATUS_E_FAILURE;
  1407. }
  1408. *value = mlme_obj->cfg.sap_cfg.reduced_beacon_interval;
  1409. return QDF_STATUS_SUCCESS;
  1410. }
  1411. QDF_STATUS wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc
  1412. *psoc, bool *value)
  1413. {
  1414. struct wlan_mlme_psoc_obj *mlme_obj;
  1415. mlme_obj = mlme_get_psoc_obj(psoc);
  1416. if (!mlme_obj)
  1417. return QDF_STATUS_E_FAILURE;
  1418. *value = mlme_obj->cfg.sap_cfg.chan_switch_hostapd_rate_enabled_name;
  1419. return QDF_STATUS_SUCCESS;
  1420. }
  1421. QDF_STATUS wlan_mlme_get_sap_force_11n_for_11ac(struct wlan_objmgr_psoc
  1422. *psoc, bool *value)
  1423. {
  1424. struct wlan_mlme_psoc_obj *mlme_obj;
  1425. mlme_obj = mlme_get_psoc_obj(psoc);
  1426. if (!mlme_obj)
  1427. return QDF_STATUS_E_FAILURE;
  1428. *value = mlme_obj->cfg.sap_cfg.sap_force_11n_for_11ac;
  1429. return QDF_STATUS_SUCCESS;
  1430. }
  1431. QDF_STATUS wlan_mlme_get_go_force_11n_for_11ac(struct wlan_objmgr_psoc
  1432. *psoc, bool *value)
  1433. {
  1434. struct wlan_mlme_psoc_obj *mlme_obj;
  1435. mlme_obj = mlme_get_psoc_obj(psoc);
  1436. if (!mlme_obj)
  1437. return QDF_STATUS_E_FAILURE;
  1438. *value = mlme_obj->cfg.sap_cfg.go_force_11n_for_11ac;
  1439. return QDF_STATUS_SUCCESS;
  1440. }
  1441. QDF_STATUS wlan_mlme_is_sap_11ac_override(struct wlan_objmgr_psoc *psoc,
  1442. bool *value)
  1443. {
  1444. struct wlan_mlme_psoc_obj *mlme_obj;
  1445. mlme_obj = mlme_get_psoc_obj(psoc);
  1446. if (!mlme_obj) {
  1447. *value = cfg_default(CFG_SAP_11AC_OVERRIDE);
  1448. return QDF_STATUS_E_FAILURE;
  1449. }
  1450. *value = mlme_obj->cfg.sap_cfg.sap_11ac_override;
  1451. return QDF_STATUS_SUCCESS;
  1452. }
  1453. QDF_STATUS wlan_mlme_is_go_11ac_override(struct wlan_objmgr_psoc *psoc,
  1454. bool *value)
  1455. {
  1456. struct wlan_mlme_psoc_obj *mlme_obj;
  1457. mlme_obj = mlme_get_psoc_obj(psoc);
  1458. if (!mlme_obj) {
  1459. *value = cfg_default(CFG_GO_11AC_OVERRIDE);
  1460. return QDF_STATUS_E_FAILURE;
  1461. }
  1462. *value = mlme_obj->cfg.sap_cfg.go_11ac_override;
  1463. return QDF_STATUS_SUCCESS;
  1464. }
  1465. QDF_STATUS wlan_mlme_set_sap_11ac_override(struct wlan_objmgr_psoc *psoc,
  1466. bool value)
  1467. {
  1468. struct wlan_mlme_psoc_obj *mlme_obj;
  1469. mlme_obj = mlme_get_psoc_obj(psoc);
  1470. if (!mlme_obj)
  1471. return QDF_STATUS_E_FAILURE;
  1472. mlme_obj->cfg.sap_cfg.sap_11ac_override = value;
  1473. return QDF_STATUS_SUCCESS;
  1474. }
  1475. QDF_STATUS wlan_mlme_set_go_11ac_override(struct wlan_objmgr_psoc *psoc,
  1476. bool value)
  1477. {
  1478. struct wlan_mlme_psoc_obj *mlme_obj;
  1479. mlme_obj = mlme_get_psoc_obj(psoc);
  1480. if (!mlme_obj)
  1481. return QDF_STATUS_E_FAILURE;
  1482. mlme_obj->cfg.sap_cfg.go_11ac_override = value;
  1483. return QDF_STATUS_SUCCESS;
  1484. }
  1485. QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
  1486. bool *value)
  1487. {
  1488. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  1489. if (!mlme_obj)
  1490. return QDF_STATUS_E_FAILURE;
  1491. *value = mlme_obj->cfg.oce.oce_sta_enabled;
  1492. return QDF_STATUS_SUCCESS;
  1493. }
  1494. QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc,
  1495. bool *value)
  1496. {
  1497. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  1498. if (!mlme_obj)
  1499. return QDF_STATUS_E_FAILURE;
  1500. *value = mlme_obj->cfg.oce.oce_sap_enabled;
  1501. return QDF_STATUS_SUCCESS;
  1502. }
  1503. /**
  1504. * wlan_mlme_send_oce_flags_fw() - Send the oce flags to FW
  1505. * @pdev: pointer to pdev object
  1506. * @object: vdev object
  1507. * @arg: Arguments to the handler
  1508. *
  1509. * Return: void
  1510. */
  1511. static void wlan_mlme_send_oce_flags_fw(struct wlan_objmgr_pdev *pdev,
  1512. void *object, void *arg)
  1513. {
  1514. struct wlan_objmgr_vdev *vdev = object;
  1515. uint8_t *updated_fw_value = arg;
  1516. uint8_t *dynamic_fw_value = 0;
  1517. uint8_t vdev_id;
  1518. if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE) {
  1519. dynamic_fw_value = mlme_get_dynamic_oce_flags(vdev);
  1520. if (*updated_fw_value == *dynamic_fw_value) {
  1521. mlme_debug("Current FW flags matches with updated value.");
  1522. return;
  1523. }
  1524. *dynamic_fw_value = *updated_fw_value;
  1525. vdev_id = wlan_vdev_get_id(vdev);
  1526. if (wma_cli_set_command(vdev_id,
  1527. WMI_VDEV_PARAM_ENABLE_DISABLE_OCE_FEATURES,
  1528. *updated_fw_value, VDEV_CMD))
  1529. mlme_err("Failed to send OCE update to FW");
  1530. }
  1531. }
  1532. void wlan_mlme_update_oce_flags(struct wlan_objmgr_pdev *pdev)
  1533. {
  1534. uint16_t sap_connected_peer, go_connected_peer;
  1535. struct wlan_objmgr_psoc *psoc = NULL;
  1536. struct wlan_mlme_psoc_obj *mlme_obj;
  1537. uint8_t updated_fw_value = 0;
  1538. psoc = wlan_pdev_get_psoc(pdev);
  1539. if (!psoc)
  1540. return;
  1541. sap_connected_peer =
  1542. wlan_util_get_peer_count_for_mode(pdev, QDF_SAP_MODE);
  1543. go_connected_peer =
  1544. wlan_util_get_peer_count_for_mode(pdev, QDF_P2P_GO_MODE);
  1545. mlme_obj = mlme_get_psoc_obj(psoc);
  1546. if (sap_connected_peer || go_connected_peer) {
  1547. updated_fw_value = mlme_obj->cfg.oce.feature_bitmap;
  1548. updated_fw_value &=
  1549. ~(WMI_VDEV_OCE_PROBE_REQUEST_RATE_FEATURE_BITMAP);
  1550. updated_fw_value &=
  1551. ~(WMI_VDEV_OCE_PROBE_REQUEST_DEFERRAL_FEATURE_BITMAP);
  1552. mlme_debug("Disable STA OCE probe req rate and defferal updated_fw_value :%d",
  1553. updated_fw_value);
  1554. } else {
  1555. updated_fw_value = mlme_obj->cfg.oce.feature_bitmap;
  1556. mlme_debug("Update the STA OCE flags to default INI updated_fw_value :%d",
  1557. updated_fw_value);
  1558. }
  1559. wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
  1560. wlan_mlme_send_oce_flags_fw,
  1561. &updated_fw_value, 0, WLAN_MLME_NB_ID);
  1562. }
  1563. bool wlan_mlme_is_ap_prot_enabled(struct wlan_objmgr_psoc *psoc)
  1564. {
  1565. struct wlan_mlme_psoc_obj *mlme_obj;
  1566. mlme_obj = mlme_get_psoc_obj(psoc);
  1567. if (!mlme_obj)
  1568. return false;
  1569. return mlme_obj->cfg.sap_protection_cfg.is_ap_prot_enabled;
  1570. }
  1571. QDF_STATUS wlan_mlme_get_ap_protection_mode(struct wlan_objmgr_psoc *psoc,
  1572. uint16_t *value)
  1573. {
  1574. struct wlan_mlme_psoc_obj *mlme_obj;
  1575. mlme_obj = mlme_get_psoc_obj(psoc);
  1576. if (!mlme_obj)
  1577. return QDF_STATUS_E_FAILURE;
  1578. *value = mlme_obj->cfg.sap_protection_cfg.ap_protection_mode;
  1579. return QDF_STATUS_SUCCESS;
  1580. }
  1581. QDF_STATUS wlan_mlme_is_ap_obss_prot_enabled(struct wlan_objmgr_psoc *psoc,
  1582. bool *value)
  1583. {
  1584. struct wlan_mlme_psoc_obj *mlme_obj;
  1585. mlme_obj = mlme_get_psoc_obj(psoc);
  1586. if (!mlme_obj)
  1587. return QDF_STATUS_E_FAILURE;
  1588. *value = mlme_obj->cfg.sap_protection_cfg.enable_ap_obss_protection;
  1589. return QDF_STATUS_SUCCESS;
  1590. }
  1591. QDF_STATUS wlan_mlme_get_rts_threshold(struct wlan_objmgr_psoc *psoc,
  1592. uint32_t *value)
  1593. {
  1594. struct wlan_mlme_psoc_obj *mlme_obj;
  1595. mlme_obj = mlme_get_psoc_obj(psoc);
  1596. if (!mlme_obj)
  1597. return QDF_STATUS_E_FAILURE;
  1598. *value = mlme_obj->cfg.threshold.rts_threshold;
  1599. return QDF_STATUS_SUCCESS;
  1600. }
  1601. QDF_STATUS wlan_mlme_set_rts_threshold(struct wlan_objmgr_psoc *psoc,
  1602. uint32_t value)
  1603. {
  1604. struct wlan_mlme_psoc_obj *mlme_obj;
  1605. tp_wma_handle wma_handle;
  1606. wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
  1607. if (!wma_handle) {
  1608. WMA_LOGE("%s: wma_handle is NULL", __func__);
  1609. return QDF_STATUS_E_INVAL;
  1610. }
  1611. mlme_obj = mlme_get_psoc_obj(psoc);
  1612. if (!mlme_obj)
  1613. return QDF_STATUS_E_FAILURE;
  1614. mlme_obj->cfg.threshold.rts_threshold = value;
  1615. wma_update_rts_params(wma_handle, value);
  1616. return QDF_STATUS_SUCCESS;
  1617. }
  1618. QDF_STATUS wlan_mlme_get_frag_threshold(struct wlan_objmgr_psoc *psoc,
  1619. uint32_t *value)
  1620. {
  1621. struct wlan_mlme_psoc_obj *mlme_obj;
  1622. mlme_obj = mlme_get_psoc_obj(psoc);
  1623. if (!mlme_obj)
  1624. return QDF_STATUS_E_FAILURE;
  1625. *value = mlme_obj->cfg.threshold.frag_threshold;
  1626. return QDF_STATUS_SUCCESS;
  1627. }
  1628. QDF_STATUS wlan_mlme_set_frag_threshold(struct wlan_objmgr_psoc *psoc,
  1629. uint32_t value)
  1630. {
  1631. struct wlan_mlme_psoc_obj *mlme_obj;
  1632. tp_wma_handle wma_handle;
  1633. wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
  1634. if (!wma_handle) {
  1635. WMA_LOGE("%s: wma_handle is NULL", __func__);
  1636. return QDF_STATUS_E_INVAL;
  1637. }
  1638. mlme_obj = mlme_get_psoc_obj(psoc);
  1639. if (!mlme_obj)
  1640. return QDF_STATUS_E_FAILURE;
  1641. mlme_obj->cfg.threshold.frag_threshold = value;
  1642. wma_update_frag_params(wma_handle,
  1643. value);
  1644. return QDF_STATUS_SUCCESS;
  1645. }
  1646. QDF_STATUS wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
  1647. bool *value)
  1648. {
  1649. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  1650. if (!mlme_obj)
  1651. return QDF_STATUS_E_FAILURE;
  1652. *value = mlme_obj->cfg.oce.fils_enabled;
  1653. return QDF_STATUS_SUCCESS;
  1654. }
  1655. QDF_STATUS wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
  1656. bool value)
  1657. {
  1658. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  1659. if (!mlme_obj)
  1660. return QDF_STATUS_E_FAILURE;
  1661. mlme_obj->cfg.oce.fils_enabled = value;
  1662. return QDF_STATUS_SUCCESS;
  1663. }
  1664. QDF_STATUS wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc *psoc,
  1665. bool value)
  1666. {
  1667. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  1668. if (!mlme_obj)
  1669. return QDF_STATUS_E_FAILURE;
  1670. mlme_obj->cfg.oce.enable_bcast_probe_rsp = value;
  1671. return QDF_STATUS_SUCCESS;
  1672. }
  1673. QDF_STATUS
  1674. wlan_mlme_get_sta_miracast_mcc_rest_time(struct wlan_objmgr_psoc *psoc,
  1675. uint32_t *value)
  1676. {
  1677. struct wlan_mlme_psoc_obj *mlme_obj;
  1678. mlme_obj = mlme_get_psoc_obj(psoc);
  1679. if (!mlme_obj)
  1680. return QDF_STATUS_E_FAILURE;
  1681. *value = mlme_obj->cfg.sta.sta_miracast_mcc_rest_time;
  1682. return QDF_STATUS_SUCCESS;
  1683. }
  1684. QDF_STATUS
  1685. wlan_mlme_get_sap_mcc_chnl_avoid(struct wlan_objmgr_psoc *psoc,
  1686. uint8_t *value)
  1687. {
  1688. struct wlan_mlme_psoc_obj *mlme_obj;
  1689. mlme_obj = mlme_get_psoc_obj(psoc);
  1690. if (!mlme_obj)
  1691. return QDF_STATUS_E_FAILURE;
  1692. *value = mlme_obj->cfg.sap_cfg.sap_mcc_chnl_avoid;
  1693. return QDF_STATUS_SUCCESS;
  1694. }
  1695. QDF_STATUS
  1696. wlan_mlme_get_mcc_bcast_prob_resp(struct wlan_objmgr_psoc *psoc,
  1697. uint8_t *value)
  1698. {
  1699. struct wlan_mlme_psoc_obj *mlme_obj;
  1700. mlme_obj = mlme_get_psoc_obj(psoc);
  1701. if (!mlme_obj)
  1702. return QDF_STATUS_E_FAILURE;
  1703. *value = mlme_obj->cfg.feature_flags.mcc_bcast_prob_rsp;
  1704. return QDF_STATUS_SUCCESS;
  1705. }
  1706. QDF_STATUS
  1707. wlan_mlme_get_mcc_rts_cts_prot(struct wlan_objmgr_psoc *psoc,
  1708. uint8_t *value)
  1709. {
  1710. struct wlan_mlme_psoc_obj *mlme_obj;
  1711. mlme_obj = mlme_get_psoc_obj(psoc);
  1712. if (!mlme_obj)
  1713. return QDF_STATUS_E_FAILURE;
  1714. *value = mlme_obj->cfg.feature_flags.mcc_rts_cts_prot;
  1715. return QDF_STATUS_SUCCESS;
  1716. }
  1717. QDF_STATUS
  1718. wlan_mlme_get_mcc_feature(struct wlan_objmgr_psoc *psoc,
  1719. uint8_t *value)
  1720. {
  1721. struct wlan_mlme_psoc_obj *mlme_obj;
  1722. mlme_obj = mlme_get_psoc_obj(psoc);
  1723. if (!mlme_obj)
  1724. return QDF_STATUS_E_FAILURE;
  1725. *value = mlme_obj->cfg.feature_flags.enable_mcc;
  1726. return QDF_STATUS_SUCCESS;
  1727. }
  1728. QDF_STATUS wlan_mlme_get_edca_params(struct wlan_mlme_edca_params *edca_params,
  1729. uint8_t *data, enum e_edca_type edca_ac)
  1730. {
  1731. qdf_size_t len;
  1732. switch (edca_ac) {
  1733. case edca_ani_acbe_local:
  1734. len = edca_params->ani_acbe_l.len;
  1735. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_l, &len);
  1736. break;
  1737. case edca_ani_acbk_local:
  1738. len = edca_params->ani_acbk_l.len;
  1739. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_l, &len);
  1740. break;
  1741. case edca_ani_acvi_local:
  1742. len = edca_params->ani_acvi_l.len;
  1743. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_l, &len);
  1744. break;
  1745. case edca_ani_acvo_local:
  1746. len = edca_params->ani_acvo_l.len;
  1747. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_l, &len);
  1748. break;
  1749. case edca_ani_acbk_bcast:
  1750. len = edca_params->ani_acbk_b.len;
  1751. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_b, &len);
  1752. break;
  1753. case edca_ani_acbe_bcast:
  1754. len = edca_params->ani_acbe_b.len;
  1755. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_b, &len);
  1756. break;
  1757. case edca_ani_acvi_bcast:
  1758. len = edca_params->ani_acvi_b.len;
  1759. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_b, &len);
  1760. break;
  1761. case edca_ani_acvo_bcast:
  1762. len = edca_params->ani_acvo_b.len;
  1763. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_b, &len);
  1764. break;
  1765. case edca_wme_acbe_local:
  1766. len = edca_params->wme_acbe_l.len;
  1767. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_l, &len);
  1768. break;
  1769. case edca_wme_acbk_local:
  1770. len = edca_params->wme_acbk_l.len;
  1771. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_l, &len);
  1772. break;
  1773. case edca_wme_acvi_local:
  1774. len = edca_params->wme_acvi_l.len;
  1775. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_l, &len);
  1776. break;
  1777. case edca_wme_acvo_local:
  1778. len = edca_params->wme_acvo_l.len;
  1779. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_l, &len);
  1780. break;
  1781. case edca_wme_acbe_bcast:
  1782. len = edca_params->wme_acbe_b.len;
  1783. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_b, &len);
  1784. break;
  1785. case edca_wme_acbk_bcast:
  1786. len = edca_params->wme_acbk_b.len;
  1787. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_b, &len);
  1788. break;
  1789. case edca_wme_acvi_bcast:
  1790. len = edca_params->wme_acvi_b.len;
  1791. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_b, &len);
  1792. break;
  1793. case edca_wme_acvo_bcast:
  1794. len = edca_params->wme_acvo_b.len;
  1795. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_b, &len);
  1796. break;
  1797. case edca_etsi_acbe_local:
  1798. len = edca_params->etsi_acbe_l.len;
  1799. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_l, &len);
  1800. break;
  1801. case edca_etsi_acbk_local:
  1802. len = edca_params->etsi_acbk_l.len;
  1803. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_l, &len);
  1804. break;
  1805. case edca_etsi_acvi_local:
  1806. len = edca_params->etsi_acvi_l.len;
  1807. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_l, &len);
  1808. break;
  1809. case edca_etsi_acvo_local:
  1810. len = edca_params->etsi_acvo_l.len;
  1811. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_l, &len);
  1812. break;
  1813. case edca_etsi_acbe_bcast:
  1814. len = edca_params->etsi_acbe_b.len;
  1815. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_b, &len);
  1816. break;
  1817. case edca_etsi_acbk_bcast:
  1818. len = edca_params->etsi_acbk_b.len;
  1819. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_b, &len);
  1820. break;
  1821. case edca_etsi_acvi_bcast:
  1822. len = edca_params->etsi_acvi_b.len;
  1823. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_b, &len);
  1824. break;
  1825. case edca_etsi_acvo_bcast:
  1826. len = edca_params->etsi_acvo_b.len;
  1827. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_b, &len);
  1828. break;
  1829. default:
  1830. mlme_err("Invalid edca access category");
  1831. return QDF_STATUS_E_INVAL;
  1832. }
  1833. return QDF_STATUS_SUCCESS;
  1834. }
  1835. #ifdef CRYPTO_SET_KEY_CONVERGED
  1836. QDF_STATUS mlme_get_wep_key(struct wlan_objmgr_vdev *vdev,
  1837. struct wlan_mlme_wep_cfg *wep_params,
  1838. enum wep_key_id wep_keyid, uint8_t *default_key,
  1839. qdf_size_t *key_len)
  1840. {
  1841. struct wlan_crypto_key *crypto_key = NULL;
  1842. if (wep_keyid >= WLAN_CRYPTO_MAXKEYIDX) {
  1843. mlme_err("Incorrect wep key index %d", wep_keyid);
  1844. return QDF_STATUS_E_INVAL;
  1845. }
  1846. crypto_key = wlan_crypto_get_key(vdev, wep_keyid);
  1847. if (!crypto_key) {
  1848. mlme_err("Crypto KEY not present");
  1849. return QDF_STATUS_E_INVAL;
  1850. }
  1851. if (crypto_key->keylen > WLAN_CRYPTO_KEY_WEP104_LEN) {
  1852. mlme_err("Key too large to hold");
  1853. return QDF_STATUS_E_INVAL;
  1854. }
  1855. *key_len = crypto_key->keylen;
  1856. qdf_mem_copy(default_key, &crypto_key->keyval, crypto_key->keylen);
  1857. return QDF_STATUS_SUCCESS;
  1858. }
  1859. #else
  1860. QDF_STATUS mlme_get_wep_key(struct wlan_objmgr_vdev *vdev,
  1861. struct wlan_mlme_wep_cfg *wep_params,
  1862. enum wep_key_id wep_keyid, uint8_t *default_key,
  1863. qdf_size_t *key_len)
  1864. {
  1865. switch (wep_keyid) {
  1866. case MLME_WEP_DEFAULT_KEY_1:
  1867. wlan_mlme_get_cfg_str(default_key,
  1868. &wep_params->wep_default_key_1,
  1869. key_len);
  1870. break;
  1871. case MLME_WEP_DEFAULT_KEY_2:
  1872. wlan_mlme_get_cfg_str(default_key,
  1873. &wep_params->wep_default_key_2,
  1874. key_len);
  1875. break;
  1876. case MLME_WEP_DEFAULT_KEY_3:
  1877. wlan_mlme_get_cfg_str(default_key,
  1878. &wep_params->wep_default_key_3,
  1879. key_len);
  1880. break;
  1881. case MLME_WEP_DEFAULT_KEY_4:
  1882. wlan_mlme_get_cfg_str(default_key,
  1883. &wep_params->wep_default_key_4,
  1884. key_len);
  1885. break;
  1886. default:
  1887. mlme_err("Invalid key id:%d", wep_keyid);
  1888. return QDF_STATUS_E_INVAL;
  1889. }
  1890. mlme_debug("key_id:%d key_len:%zd", wep_keyid, *key_len);
  1891. return QDF_STATUS_SUCCESS;
  1892. }
  1893. #endif /* CRYPTO_SET_KEY_CONVERGED */
  1894. QDF_STATUS mlme_set_wep_key(struct wlan_mlme_wep_cfg *wep_params,
  1895. enum wep_key_id wep_keyid, uint8_t *key_to_set,
  1896. qdf_size_t len)
  1897. {
  1898. if (len == 0)
  1899. return QDF_STATUS_E_FAILURE;
  1900. mlme_debug("WEP set key for key_id:%d key_len:%zd", wep_keyid, len);
  1901. switch (wep_keyid) {
  1902. case MLME_WEP_DEFAULT_KEY_1:
  1903. wlan_mlme_set_cfg_str(key_to_set,
  1904. &wep_params->wep_default_key_1,
  1905. len);
  1906. break;
  1907. case MLME_WEP_DEFAULT_KEY_2:
  1908. wlan_mlme_set_cfg_str(key_to_set,
  1909. &wep_params->wep_default_key_2,
  1910. len);
  1911. break;
  1912. case MLME_WEP_DEFAULT_KEY_3:
  1913. wlan_mlme_set_cfg_str(key_to_set,
  1914. &wep_params->wep_default_key_3,
  1915. len);
  1916. break;
  1917. case MLME_WEP_DEFAULT_KEY_4:
  1918. wlan_mlme_set_cfg_str(key_to_set,
  1919. &wep_params->wep_default_key_4,
  1920. len);
  1921. break;
  1922. default:
  1923. mlme_err("Invalid key id:%d", wep_keyid);
  1924. return QDF_STATUS_E_INVAL;
  1925. }
  1926. return QDF_STATUS_SUCCESS;
  1927. }
  1928. QDF_STATUS
  1929. wlan_mlme_is_11h_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  1930. {
  1931. struct wlan_mlme_psoc_obj *mlme_obj;
  1932. mlme_obj = mlme_get_psoc_obj(psoc);
  1933. if (!mlme_obj)
  1934. return QDF_STATUS_E_FAILURE;
  1935. *value = mlme_obj->cfg.gen.enabled_11h;
  1936. return QDF_STATUS_SUCCESS;
  1937. }
  1938. QDF_STATUS
  1939. wlan_mlme_set_11h_enabled(struct wlan_objmgr_psoc *psoc, bool value)
  1940. {
  1941. struct wlan_mlme_psoc_obj *mlme_obj;
  1942. mlme_obj = mlme_get_psoc_obj(psoc);
  1943. if (!mlme_obj)
  1944. return QDF_STATUS_E_FAILURE;
  1945. mlme_obj->cfg.gen.enabled_11h = value;
  1946. return QDF_STATUS_SUCCESS;
  1947. }
  1948. QDF_STATUS
  1949. wlan_mlme_is_11d_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
  1950. {
  1951. struct wlan_mlme_psoc_obj *mlme_obj;
  1952. mlme_obj = mlme_get_psoc_obj(psoc);
  1953. if (!mlme_obj)
  1954. return QDF_STATUS_E_FAILURE;
  1955. *value = mlme_obj->cfg.gen.enabled_11d;
  1956. return QDF_STATUS_SUCCESS;
  1957. }
  1958. QDF_STATUS
  1959. wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value)
  1960. {
  1961. struct wlan_mlme_psoc_obj *mlme_obj;
  1962. mlme_obj = mlme_get_psoc_obj(psoc);
  1963. if (!mlme_obj)
  1964. return QDF_STATUS_E_FAILURE;
  1965. mlme_obj->cfg.gen.enabled_11d = value;
  1966. return QDF_STATUS_SUCCESS;
  1967. }
  1968. bool
  1969. wlan_mlme_is_change_channel_bandwidth_enabled(struct wlan_objmgr_psoc *psoc)
  1970. {
  1971. struct wlan_mlme_psoc_obj *mlme_obj;
  1972. mlme_obj = mlme_get_psoc_obj(psoc);
  1973. if (!mlme_obj)
  1974. return cfg_default(CFG_CHANGE_CHANNEL_BANDWIDTH);
  1975. return mlme_obj->cfg.gen.enable_change_channel_bandwidth;
  1976. }
  1977. QDF_STATUS
  1978. wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value)
  1979. {
  1980. struct wlan_mlme_psoc_obj *mlme_obj;
  1981. mlme_obj = mlme_get_psoc_obj(psoc);
  1982. if (!mlme_obj)
  1983. return QDF_STATUS_E_FAILURE;
  1984. mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value;
  1985. return QDF_STATUS_SUCCESS;
  1986. }
  1987. QDF_STATUS
  1988. wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  1989. {
  1990. struct wlan_mlme_psoc_obj *mlme_obj;
  1991. mlme_obj = mlme_get_psoc_obj(psoc);
  1992. if (!mlme_obj)
  1993. return QDF_STATUS_E_FAILURE;
  1994. *value = mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width;
  1995. return QDF_STATUS_SUCCESS;
  1996. }
  1997. QDF_STATUS wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc,
  1998. bool value)
  1999. {
  2000. struct wlan_mlme_psoc_obj *mlme_obj;
  2001. mlme_obj = mlme_get_psoc_obj(psoc);
  2002. if (!mlme_obj)
  2003. return QDF_STATUS_E_FAILURE;
  2004. mlme_obj->cfg.vht_caps.vht_cap_info.ldpc_coding_cap = value;
  2005. return QDF_STATUS_SUCCESS;
  2006. }
  2007. QDF_STATUS
  2008. wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc,
  2009. bool value)
  2010. {
  2011. struct wlan_mlme_psoc_obj *mlme_obj;
  2012. mlme_obj = mlme_get_psoc_obj(psoc);
  2013. if (!mlme_obj)
  2014. return QDF_STATUS_E_FAILURE;
  2015. mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz = value;
  2016. return QDF_STATUS_SUCCESS;
  2017. }
  2018. QDF_STATUS
  2019. wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, bool *value)
  2020. {
  2021. struct wlan_mlme_psoc_obj *mlme_obj;
  2022. mlme_obj = mlme_get_psoc_obj(psoc);
  2023. if (!mlme_obj)
  2024. return QDF_STATUS_E_FAILURE;
  2025. *value = mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz;
  2026. return QDF_STATUS_SUCCESS;
  2027. }
  2028. QDF_STATUS
  2029. wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
  2030. {
  2031. struct wlan_mlme_psoc_obj *mlme_obj;
  2032. mlme_obj = mlme_get_psoc_obj(psoc);
  2033. if (!mlme_obj)
  2034. return QDF_STATUS_E_FAILURE;
  2035. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc;
  2036. return QDF_STATUS_SUCCESS;
  2037. }
  2038. QDF_STATUS
  2039. wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
  2040. {
  2041. struct wlan_mlme_psoc_obj *mlme_obj;
  2042. mlme_obj = mlme_get_psoc_obj(psoc);
  2043. if (!mlme_obj)
  2044. return QDF_STATUS_E_FAILURE;
  2045. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc;
  2046. return QDF_STATUS_SUCCESS;
  2047. }
  2048. QDF_STATUS
  2049. wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
  2050. uint8_t value)
  2051. {
  2052. struct wlan_mlme_psoc_obj *mlme_obj;
  2053. mlme_obj = mlme_get_psoc_obj(psoc);
  2054. if (!mlme_obj)
  2055. return QDF_STATUS_E_FAILURE;
  2056. mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp = value;
  2057. return QDF_STATUS_SUCCESS;
  2058. }
  2059. QDF_STATUS
  2060. wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
  2061. uint8_t *value)
  2062. {
  2063. struct wlan_mlme_psoc_obj *mlme_obj;
  2064. mlme_obj = mlme_get_psoc_obj(psoc);
  2065. if (!mlme_obj)
  2066. return QDF_STATUS_E_FAILURE;
  2067. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp;
  2068. return QDF_STATUS_SUCCESS;
  2069. }
  2070. QDF_STATUS wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
  2071. uint32_t *value)
  2072. {
  2073. struct wlan_mlme_psoc_obj *mlme_obj;
  2074. mlme_obj = mlme_get_psoc_obj(psoc);
  2075. if (!mlme_obj)
  2076. return QDF_STATUS_E_FAILURE;
  2077. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map;
  2078. return QDF_STATUS_SUCCESS;
  2079. }
  2080. QDF_STATUS wlan_mlme_cfg_set_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
  2081. uint32_t value)
  2082. {
  2083. struct wlan_mlme_psoc_obj *mlme_obj;
  2084. mlme_obj = mlme_get_psoc_obj(psoc);
  2085. if (!mlme_obj)
  2086. return QDF_STATUS_E_FAILURE;
  2087. mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map = value;
  2088. return QDF_STATUS_SUCCESS;
  2089. }
  2090. QDF_STATUS wlan_mlme_cfg_get_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
  2091. uint32_t *value)
  2092. {
  2093. struct wlan_mlme_psoc_obj *mlme_obj;
  2094. mlme_obj = mlme_get_psoc_obj(psoc);
  2095. if (!mlme_obj)
  2096. return QDF_STATUS_E_FAILURE;
  2097. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map;
  2098. return QDF_STATUS_SUCCESS;
  2099. }
  2100. QDF_STATUS wlan_mlme_cfg_set_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
  2101. uint32_t value)
  2102. {
  2103. struct wlan_mlme_psoc_obj *mlme_obj;
  2104. mlme_obj = mlme_get_psoc_obj(psoc);
  2105. if (!mlme_obj)
  2106. return QDF_STATUS_E_FAILURE;
  2107. mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map = value;
  2108. return QDF_STATUS_SUCCESS;
  2109. }
  2110. QDF_STATUS
  2111. wlan_mlme_cfg_set_vht_rx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
  2112. uint32_t value)
  2113. {
  2114. struct wlan_mlme_psoc_obj *mlme_obj;
  2115. mlme_obj = mlme_get_psoc_obj(psoc);
  2116. if (!mlme_obj)
  2117. return QDF_STATUS_E_FAILURE;
  2118. mlme_obj->cfg.vht_caps.vht_cap_info.rx_supp_data_rate = value;
  2119. return QDF_STATUS_SUCCESS;
  2120. }
  2121. QDF_STATUS
  2122. wlan_mlme_cfg_set_vht_tx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
  2123. uint32_t value)
  2124. {
  2125. struct wlan_mlme_psoc_obj *mlme_obj;
  2126. mlme_obj = mlme_get_psoc_obj(psoc);
  2127. if (!mlme_obj)
  2128. return QDF_STATUS_E_FAILURE;
  2129. mlme_obj->cfg.vht_caps.vht_cap_info.tx_supp_data_rate = value;
  2130. return QDF_STATUS_SUCCESS;
  2131. }
  2132. QDF_STATUS
  2133. wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
  2134. uint32_t *value)
  2135. {
  2136. struct wlan_mlme_psoc_obj *mlme_obj;
  2137. mlme_obj = mlme_get_psoc_obj(psoc);
  2138. if (!mlme_obj)
  2139. return QDF_STATUS_E_FAILURE;
  2140. *value = mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set;
  2141. return QDF_STATUS_SUCCESS;
  2142. }
  2143. QDF_STATUS
  2144. wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
  2145. uint32_t value)
  2146. {
  2147. struct wlan_mlme_psoc_obj *mlme_obj;
  2148. mlme_obj = mlme_get_psoc_obj(psoc);
  2149. if (!mlme_obj)
  2150. return QDF_STATUS_E_FAILURE;
  2151. mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set = value;
  2152. return QDF_STATUS_SUCCESS;
  2153. }
  2154. QDF_STATUS
  2155. wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value)
  2156. {
  2157. struct wlan_mlme_psoc_obj *mlme_obj;
  2158. mlme_obj = mlme_get_psoc_obj(psoc);
  2159. if (!mlme_obj)
  2160. return QDF_STATUS_E_FAILURE;
  2161. *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformee;
  2162. return QDF_STATUS_SUCCESS;
  2163. }
  2164. QDF_STATUS
  2165. wlan_mlme_get_vht_tx_su_beamformer(struct wlan_objmgr_psoc *psoc, bool *value)
  2166. {
  2167. struct wlan_mlme_psoc_obj *mlme_obj;
  2168. mlme_obj = mlme_get_psoc_obj(psoc);
  2169. if (!mlme_obj)
  2170. return QDF_STATUS_E_FAILURE;
  2171. *value = mlme_obj->cfg.vht_caps.vht_cap_info.su_bformer;
  2172. return QDF_STATUS_SUCCESS;
  2173. }
  2174. QDF_STATUS
  2175. wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  2176. {
  2177. struct wlan_mlme_psoc_obj *mlme_obj;
  2178. mlme_obj = mlme_get_psoc_obj(psoc);
  2179. if (!mlme_obj)
  2180. return QDF_STATUS_E_FAILURE;
  2181. *value = mlme_obj->cfg.vht_caps.vht_cap_info.channel_width;
  2182. return QDF_STATUS_SUCCESS;
  2183. }
  2184. QDF_STATUS
  2185. wlan_mlme_get_vht_rx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  2186. {
  2187. struct wlan_mlme_psoc_obj *mlme_obj;
  2188. mlme_obj = mlme_get_psoc_obj(psoc);
  2189. if (!mlme_obj)
  2190. return QDF_STATUS_E_FAILURE;
  2191. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs;
  2192. return QDF_STATUS_SUCCESS;
  2193. }
  2194. QDF_STATUS
  2195. wlan_mlme_get_vht_tx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  2196. {
  2197. struct wlan_mlme_psoc_obj *mlme_obj;
  2198. mlme_obj = mlme_get_psoc_obj(psoc);
  2199. if (!mlme_obj)
  2200. return QDF_STATUS_E_FAILURE;
  2201. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs;
  2202. return QDF_STATUS_SUCCESS;
  2203. }
  2204. QDF_STATUS
  2205. wlan_mlme_get_vht_rx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  2206. {
  2207. struct wlan_mlme_psoc_obj *mlme_obj;
  2208. mlme_obj = mlme_get_psoc_obj(psoc);
  2209. if (!mlme_obj)
  2210. return QDF_STATUS_E_FAILURE;
  2211. *value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs2x2;
  2212. return QDF_STATUS_SUCCESS;
  2213. }
  2214. QDF_STATUS
  2215. wlan_mlme_get_vht_tx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
  2216. {
  2217. struct wlan_mlme_psoc_obj *mlme_obj;
  2218. mlme_obj = mlme_get_psoc_obj(psoc);
  2219. if (!mlme_obj)
  2220. return QDF_STATUS_E_FAILURE;
  2221. *value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs2x2;
  2222. return QDF_STATUS_SUCCESS;
  2223. }
  2224. QDF_STATUS
  2225. wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value)
  2226. {
  2227. struct wlan_mlme_psoc_obj *mlme_obj;
  2228. mlme_obj = mlme_get_psoc_obj(psoc);
  2229. if (!mlme_obj)
  2230. return QDF_STATUS_E_FAILURE;
  2231. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_vht20_mcs9;
  2232. return QDF_STATUS_SUCCESS;
  2233. }
  2234. QDF_STATUS
  2235. wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value)
  2236. {
  2237. struct wlan_mlme_psoc_obj *mlme_obj;
  2238. mlme_obj = mlme_get_psoc_obj(psoc);
  2239. if (!mlme_obj)
  2240. return QDF_STATUS_E_FAILURE;
  2241. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2;
  2242. return QDF_STATUS_SUCCESS;
  2243. }
  2244. QDF_STATUS
  2245. wlan_mlme_set_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool value)
  2246. {
  2247. struct wlan_mlme_psoc_obj *mlme_obj;
  2248. mlme_obj = mlme_get_psoc_obj(psoc);
  2249. if (!mlme_obj)
  2250. return QDF_STATUS_E_FAILURE;
  2251. mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2 = value;
  2252. return QDF_STATUS_SUCCESS;
  2253. }
  2254. QDF_STATUS
  2255. wlan_mlme_get_vht_enable_paid(struct wlan_objmgr_psoc *psoc, bool *value)
  2256. {
  2257. struct wlan_mlme_psoc_obj *mlme_obj;
  2258. mlme_obj = mlme_get_psoc_obj(psoc);
  2259. if (!mlme_obj)
  2260. return QDF_STATUS_E_FAILURE;
  2261. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_paid;
  2262. return QDF_STATUS_SUCCESS;
  2263. }
  2264. QDF_STATUS
  2265. wlan_mlme_get_vht_enable_gid(struct wlan_objmgr_psoc *psoc, bool *value)
  2266. {
  2267. struct wlan_mlme_psoc_obj *mlme_obj;
  2268. mlme_obj = mlme_get_psoc_obj(psoc);
  2269. if (!mlme_obj)
  2270. return QDF_STATUS_E_FAILURE;
  2271. *value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_gid;
  2272. return QDF_STATUS_SUCCESS;
  2273. }
  2274. QDF_STATUS
  2275. wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
  2276. {
  2277. struct wlan_mlme_psoc_obj *mlme_obj;
  2278. mlme_obj = mlme_get_psoc_obj(psoc);
  2279. if (!mlme_obj)
  2280. return QDF_STATUS_E_FAILURE;
  2281. *value = mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band;
  2282. return QDF_STATUS_SUCCESS;
  2283. }
  2284. QDF_STATUS
  2285. wlan_mlme_set_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool value)
  2286. {
  2287. struct wlan_mlme_psoc_obj *mlme_obj;
  2288. mlme_obj = mlme_get_psoc_obj(psoc);
  2289. if (!mlme_obj)
  2290. return QDF_STATUS_E_FAILURE;
  2291. mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band = value;
  2292. return QDF_STATUS_SUCCESS;
  2293. }
  2294. QDF_STATUS
  2295. wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
  2296. {
  2297. struct wlan_mlme_psoc_obj *mlme_obj;
  2298. mlme_obj = mlme_get_psoc_obj(psoc);
  2299. if (!mlme_obj)
  2300. return QDF_STATUS_E_FAILURE;
  2301. *value = mlme_obj->cfg.vht_caps.vht_cap_info.vendor_24ghz_band;
  2302. return QDF_STATUS_SUCCESS;
  2303. }
  2304. QDF_STATUS
  2305. mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc, struct wma_tgt_vht_cap *cfg)
  2306. {
  2307. struct wlan_mlme_psoc_obj *mlme_obj;
  2308. struct mlme_vht_capabilities_info *vht_cap_info;
  2309. uint32_t value = 0;
  2310. bool hw_rx_ldpc_enabled;
  2311. mlme_obj = mlme_get_psoc_obj(psoc);
  2312. if (!mlme_obj)
  2313. return QDF_STATUS_E_FAILURE;
  2314. vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info;
  2315. /*
  2316. * VHT max MPDU length:
  2317. * override if user configured value is too high
  2318. * that the target cannot support
  2319. */
  2320. if (vht_cap_info->ampdu_len > cfg->vht_max_mpdu)
  2321. vht_cap_info->ampdu_len = cfg->vht_max_mpdu;
  2322. value = (CFG_VHT_BASIC_MCS_SET_STADEF & VHT_MCS_1x1) |
  2323. vht_cap_info->basic_mcs_set;
  2324. if (vht_cap_info->enable2x2)
  2325. value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2);
  2326. vht_cap_info->basic_mcs_set = value;
  2327. value = (CFG_VHT_RX_MCS_MAP_STADEF & VHT_MCS_1x1) |
  2328. vht_cap_info->rx_mcs;
  2329. if (vht_cap_info->enable2x2)
  2330. value = (value & VHT_MCS_2x2) | (vht_cap_info->rx_mcs2x2 << 2);
  2331. vht_cap_info->rx_mcs_map = value;
  2332. value = (CFG_VHT_TX_MCS_MAP_STADEF & VHT_MCS_1x1) |
  2333. vht_cap_info->tx_mcs;
  2334. if (vht_cap_info->enable2x2)
  2335. value = (value & VHT_MCS_2x2) | (vht_cap_info->tx_mcs2x2 << 2);
  2336. vht_cap_info->tx_mcs_map = value;
  2337. /* Set HW RX LDPC capability */
  2338. hw_rx_ldpc_enabled = !!cfg->vht_rx_ldpc;
  2339. if (hw_rx_ldpc_enabled != vht_cap_info->ldpc_coding_cap)
  2340. vht_cap_info->ldpc_coding_cap = hw_rx_ldpc_enabled;
  2341. /* set the Guard interval 80MHz */
  2342. if (vht_cap_info->short_gi_80mhz && !cfg->vht_short_gi_80)
  2343. vht_cap_info->short_gi_80mhz = cfg->vht_short_gi_80;
  2344. /* Set VHT TX STBC cap */
  2345. if (vht_cap_info->tx_stbc && !cfg->vht_tx_stbc)
  2346. vht_cap_info->tx_stbc = cfg->vht_tx_stbc;
  2347. /* Set VHT RX STBC cap */
  2348. if (vht_cap_info->rx_stbc && !cfg->vht_rx_stbc)
  2349. vht_cap_info->rx_stbc = cfg->vht_rx_stbc;
  2350. /* Set VHT SU Beamformer cap */
  2351. if (vht_cap_info->su_bformer && !cfg->vht_su_bformer)
  2352. vht_cap_info->su_bformer = cfg->vht_su_bformer;
  2353. /* check and update SU BEAMFORMEE capabality */
  2354. if (vht_cap_info->su_bformee && !cfg->vht_su_bformee)
  2355. vht_cap_info->su_bformee = cfg->vht_su_bformee;
  2356. /* Set VHT MU Beamformer cap */
  2357. if (vht_cap_info->mu_bformer && !cfg->vht_mu_bformer)
  2358. vht_cap_info->mu_bformer = cfg->vht_mu_bformer;
  2359. /* Set VHT MU Beamformee cap */
  2360. if (vht_cap_info->enable_mu_bformee && !cfg->vht_mu_bformee)
  2361. vht_cap_info->enable_mu_bformee = cfg->vht_mu_bformee;
  2362. /*
  2363. * VHT max AMPDU len exp:
  2364. * override if user configured value is too high
  2365. * that the target cannot support.
  2366. * Even though Rome publish ampdu_len=7, it can
  2367. * only support 4 because of some h/w bug.
  2368. */
  2369. if (vht_cap_info->ampdu_len_exponent > cfg->vht_max_ampdu_len_exp)
  2370. vht_cap_info->ampdu_len_exponent = cfg->vht_max_ampdu_len_exp;
  2371. /* Set VHT TXOP PS CAP */
  2372. if (vht_cap_info->txop_ps && !cfg->vht_txop_ps)
  2373. vht_cap_info->txop_ps = cfg->vht_txop_ps;
  2374. /* set the Guard interval 160MHz */
  2375. if (vht_cap_info->short_gi_160mhz && !cfg->vht_short_gi_160)
  2376. vht_cap_info->short_gi_160mhz = cfg->vht_short_gi_160;
  2377. return QDF_STATUS_SUCCESS;
  2378. }
  2379. QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc)
  2380. {
  2381. struct wlan_mlme_psoc_obj *mlme_obj;
  2382. struct mlme_vht_capabilities_info *vht_cap_info;
  2383. uint32_t temp = 0;
  2384. mlme_obj = mlme_get_psoc_obj(psoc);
  2385. if (!mlme_obj)
  2386. return QDF_STATUS_E_FAILURE;
  2387. vht_cap_info = &mlme_obj->cfg.vht_caps.vht_cap_info;
  2388. temp = vht_cap_info->basic_mcs_set;
  2389. temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs;
  2390. if (vht_cap_info->enable2x2)
  2391. temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2);
  2392. else
  2393. temp |= 0x000C;
  2394. vht_cap_info->basic_mcs_set = temp;
  2395. temp = vht_cap_info->rx_mcs_map;
  2396. temp = (temp & 0xFFFC) | vht_cap_info->rx_mcs;
  2397. if (vht_cap_info->enable2x2)
  2398. temp = (temp & 0xFFF3) | (vht_cap_info->rx_mcs2x2 << 2);
  2399. else
  2400. temp |= 0x000C;
  2401. vht_cap_info->rx_mcs_map = temp;
  2402. temp = vht_cap_info->tx_mcs_map;
  2403. temp = (temp & 0xFFFC) | vht_cap_info->tx_mcs;
  2404. if (vht_cap_info->enable2x2)
  2405. temp = (temp & 0xFFF3) | (vht_cap_info->tx_mcs2x2 << 2);
  2406. else
  2407. temp |= 0x000C;
  2408. vht_cap_info->tx_mcs_map = temp;
  2409. return QDF_STATUS_SUCCESS;
  2410. }
  2411. QDF_STATUS wlan_mlme_is_sap_uapsd_enabled(struct wlan_objmgr_psoc *psoc,
  2412. bool *value)
  2413. {
  2414. struct wlan_mlme_psoc_obj *mlme_obj;
  2415. mlme_obj = mlme_get_psoc_obj(psoc);
  2416. if (!mlme_obj)
  2417. return QDF_STATUS_E_FAILURE;
  2418. *value = mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled;
  2419. return QDF_STATUS_SUCCESS;
  2420. }
  2421. QDF_STATUS wlan_mlme_get_dtim_selection_diversity(struct wlan_objmgr_psoc *psoc,
  2422. uint32_t *dtim_selection_div)
  2423. {
  2424. struct wlan_mlme_psoc_obj *mlme_obj;
  2425. mlme_obj = mlme_get_psoc_obj(psoc);
  2426. if (!mlme_obj) {
  2427. *dtim_selection_div = cfg_default(CFG_DTIM_SELECTION_DIVERSITY);
  2428. return QDF_STATUS_E_FAILURE;
  2429. }
  2430. *dtim_selection_div = mlme_obj->cfg.ps_params.dtim_selection_diversity;
  2431. return QDF_STATUS_SUCCESS;
  2432. }
  2433. QDF_STATUS wlan_mlme_get_bmps_min_listen_interval(struct wlan_objmgr_psoc *psoc,
  2434. uint32_t *value)
  2435. {
  2436. struct wlan_mlme_psoc_obj *mlme_obj;
  2437. mlme_obj = mlme_get_psoc_obj(psoc);
  2438. if (!mlme_obj) {
  2439. *value = cfg_default(CFG_BMPS_MINIMUM_LI);
  2440. return QDF_STATUS_E_FAILURE;
  2441. }
  2442. *value = mlme_obj->cfg.ps_params.bmps_min_listen_interval;
  2443. return QDF_STATUS_SUCCESS;
  2444. }
  2445. QDF_STATUS wlan_mlme_get_bmps_max_listen_interval(struct wlan_objmgr_psoc *psoc,
  2446. uint32_t *value)
  2447. {
  2448. struct wlan_mlme_psoc_obj *mlme_obj;
  2449. mlme_obj = mlme_get_psoc_obj(psoc);
  2450. if (!mlme_obj) {
  2451. *value = cfg_default(CFG_BMPS_MAXIMUM_LI);
  2452. return QDF_STATUS_E_FAILURE;
  2453. }
  2454. *value = mlme_obj->cfg.ps_params.bmps_max_listen_interval;
  2455. return QDF_STATUS_SUCCESS;
  2456. }
  2457. QDF_STATUS wlan_mlme_set_sap_uapsd_flag(struct wlan_objmgr_psoc *psoc,
  2458. bool value)
  2459. {
  2460. struct wlan_mlme_psoc_obj *mlme_obj;
  2461. mlme_obj = mlme_get_psoc_obj(psoc);
  2462. if (!mlme_obj)
  2463. return QDF_STATUS_E_FAILURE;
  2464. mlme_obj->cfg.qos_mlme_params.sap_uapsd_enabled &= value;
  2465. return QDF_STATUS_SUCCESS;
  2466. }
  2467. QDF_STATUS wlan_mlme_get_rrm_enabled(struct wlan_objmgr_psoc *psoc,
  2468. bool *value)
  2469. {
  2470. struct wlan_mlme_psoc_obj *mlme_obj;
  2471. mlme_obj = mlme_get_psoc_obj(psoc);
  2472. if (!mlme_obj)
  2473. return QDF_STATUS_E_FAILURE;
  2474. *value = mlme_obj->cfg.rrm_config.rrm_enabled;
  2475. return QDF_STATUS_SUCCESS;
  2476. }
  2477. QDF_STATUS wlan_mlme_get_auto_bmps_timer_value(struct wlan_objmgr_psoc *psoc,
  2478. uint32_t *value)
  2479. {
  2480. struct wlan_mlme_psoc_obj *mlme_obj;
  2481. mlme_obj = mlme_get_psoc_obj(psoc);
  2482. if (!mlme_obj) {
  2483. *value = cfg_default(CFG_AUTO_BMPS_ENABLE_TIMER);
  2484. return QDF_STATUS_E_FAILURE;
  2485. }
  2486. *value = mlme_obj->cfg.ps_params.auto_bmps_timer_val;
  2487. return QDF_STATUS_SUCCESS;
  2488. }
  2489. QDF_STATUS wlan_mlme_is_bmps_enabled(struct wlan_objmgr_psoc *psoc,
  2490. bool *value)
  2491. {
  2492. struct wlan_mlme_psoc_obj *mlme_obj;
  2493. mlme_obj = mlme_get_psoc_obj(psoc);
  2494. if (!mlme_obj) {
  2495. *value = cfg_default(CFG_ENABLE_PS);
  2496. return QDF_STATUS_E_FAILURE;
  2497. }
  2498. *value = mlme_obj->cfg.ps_params.is_bmps_enabled;
  2499. return QDF_STATUS_SUCCESS;
  2500. }
  2501. QDF_STATUS wlan_mlme_is_imps_enabled(struct wlan_objmgr_psoc *psoc,
  2502. bool *value)
  2503. {
  2504. struct wlan_mlme_psoc_obj *mlme_obj;
  2505. mlme_obj = mlme_get_psoc_obj(psoc);
  2506. if (!mlme_obj) {
  2507. *value = cfg_default(CFG_ENABLE_IMPS);
  2508. return QDF_STATUS_E_FAILURE;
  2509. }
  2510. *value = mlme_obj->cfg.ps_params.is_imps_enabled;
  2511. return QDF_STATUS_SUCCESS;
  2512. }
  2513. QDF_STATUS wlan_mlme_override_bmps_imps(struct wlan_objmgr_psoc *psoc)
  2514. {
  2515. struct wlan_mlme_psoc_obj *mlme_obj;
  2516. mlme_obj = mlme_get_psoc_obj(psoc);
  2517. if (!mlme_obj)
  2518. return QDF_STATUS_E_FAILURE;
  2519. mlme_obj->cfg.ps_params.is_imps_enabled = 0;
  2520. mlme_obj->cfg.ps_params.is_bmps_enabled = 0;
  2521. return QDF_STATUS_SUCCESS;
  2522. }
  2523. void wlan_mlme_get_wps_uuid(struct wlan_mlme_wps_params *wps_params,
  2524. uint8_t *data)
  2525. {
  2526. qdf_size_t len = wps_params->wps_uuid.len;
  2527. wlan_mlme_get_cfg_str(data, &wps_params->wps_uuid, &len);
  2528. }
  2529. QDF_STATUS
  2530. wlan_mlme_get_self_gen_frm_pwr(struct wlan_objmgr_psoc *psoc,
  2531. uint32_t *value)
  2532. {
  2533. struct wlan_mlme_psoc_obj *mlme_obj;
  2534. mlme_obj = mlme_get_psoc_obj(psoc);
  2535. if (!mlme_obj) {
  2536. *value = cfg_default(CFG_SELF_GEN_FRM_PWR);
  2537. mlme_err("Failed to get MLME Obj");
  2538. return QDF_STATUS_E_FAILURE;
  2539. }
  2540. *value = mlme_obj->cfg.reg.self_gen_frm_pwr;
  2541. return QDF_STATUS_SUCCESS;
  2542. }
  2543. QDF_STATUS wlan_mlme_ibss_power_save_setup(struct wlan_objmgr_psoc *psoc,
  2544. uint32_t vdev_id)
  2545. {
  2546. struct wlan_mlme_ibss_cfg *ibss_cfg;
  2547. int ret;
  2548. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  2549. if (!mlme_obj)
  2550. return QDF_STATUS_E_FAILURE;
  2551. ibss_cfg = &mlme_obj->cfg.ibss;
  2552. ret = wma_cli_set_command(vdev_id,
  2553. WMA_VDEV_IBSS_SET_ATIM_WINDOW_SIZE,
  2554. ibss_cfg->atim_win_size,
  2555. VDEV_CMD);
  2556. if (ret) {
  2557. mlme_err("atim window set failed: %d", ret);
  2558. return QDF_STATUS_E_FAILURE;
  2559. }
  2560. ret = wma_cli_set_command(vdev_id,
  2561. WMA_VDEV_IBSS_SET_POWER_SAVE_ALLOWED,
  2562. ibss_cfg->power_save_allow,
  2563. VDEV_CMD);
  2564. if (ret) {
  2565. mlme_err("power save allow failed %d", ret);
  2566. return QDF_STATUS_E_FAILURE;
  2567. }
  2568. ret = wma_cli_set_command(vdev_id,
  2569. WMA_VDEV_IBSS_SET_POWER_COLLAPSE_ALLOWED,
  2570. ibss_cfg->power_collapse_allow,
  2571. VDEV_CMD);
  2572. if (ret) {
  2573. mlme_err("power collapse allow failed %d", ret);
  2574. return QDF_STATUS_E_FAILURE;
  2575. }
  2576. ret = wma_cli_set_command(vdev_id,
  2577. WMA_VDEV_IBSS_SET_AWAKE_ON_TX_RX,
  2578. ibss_cfg->awake_on_tx_rx,
  2579. VDEV_CMD);
  2580. if (ret) {
  2581. mlme_err("set awake on tx/rx failed %d", ret);
  2582. return QDF_STATUS_E_FAILURE;
  2583. }
  2584. ret = wma_cli_set_command(vdev_id,
  2585. WMA_VDEV_IBSS_SET_INACTIVITY_TIME,
  2586. ibss_cfg->inactivity_bcon_count,
  2587. VDEV_CMD);
  2588. if (ret) {
  2589. mlme_err("set inactivity time failed %d", ret);
  2590. return QDF_STATUS_E_FAILURE;
  2591. }
  2592. ret = wma_cli_set_command(vdev_id,
  2593. WMA_VDEV_IBSS_SET_TXSP_END_INACTIVITY_TIME,
  2594. ibss_cfg->txsp_end_timeout,
  2595. VDEV_CMD);
  2596. if (ret) {
  2597. mlme_err("set txsp end failed %d", ret);
  2598. return QDF_STATUS_E_FAILURE;
  2599. }
  2600. ret = wma_cli_set_command(vdev_id,
  2601. WMA_VDEV_IBSS_PS_SET_WARMUP_TIME_SECS,
  2602. ibss_cfg->ps_warm_up_time,
  2603. VDEV_CMD);
  2604. if (ret) {
  2605. mlme_err("set ps warmup failed %d", ret);
  2606. return QDF_STATUS_E_FAILURE;
  2607. }
  2608. ret = wma_cli_set_command(vdev_id,
  2609. WMA_VDEV_IBSS_PS_SET_1RX_CHAIN_IN_ATIM_WINDOW,
  2610. ibss_cfg->ps_1rx_chain_atim_win,
  2611. VDEV_CMD);
  2612. if (ret) {
  2613. mlme_err("set 1rx chain atim failed %d", ret);
  2614. return QDF_STATUS_E_FAILURE;
  2615. }
  2616. return QDF_STATUS_SUCCESS;
  2617. }