wlan_mlme_api.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  1. /*
  2. * Copyright (c) 2018 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. QDF_STATUS wlan_mlme_get_cfg_str(uint8_t *dst, struct mlme_cfg_str *cfg_str,
  27. qdf_size_t *len)
  28. {
  29. if (*len < cfg_str->len) {
  30. mlme_err("Invalid len %zd", *len);
  31. return QDF_STATUS_E_INVAL;
  32. }
  33. *len = cfg_str->len;
  34. qdf_mem_copy(dst, cfg_str->data, *len);
  35. return QDF_STATUS_SUCCESS;
  36. }
  37. QDF_STATUS wlan_mlme_set_cfg_str(uint8_t *src, struct mlme_cfg_str *dst_cfg_str,
  38. qdf_size_t len)
  39. {
  40. if (len > dst_cfg_str->max_len) {
  41. mlme_err("Invalid len %zd (>%zd)", len,
  42. dst_cfg_str->max_len);
  43. return QDF_STATUS_E_INVAL;
  44. }
  45. dst_cfg_str->len = len;
  46. qdf_mem_copy(dst_cfg_str->data, src, len);
  47. return QDF_STATUS_SUCCESS;
  48. }
  49. QDF_STATUS wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  50. struct mlme_ht_capabilities_info
  51. *ht_cap_info)
  52. {
  53. struct wlan_mlme_psoc_obj *mlme_obj;
  54. mlme_obj = mlme_get_psoc_obj(psoc);
  55. if (!mlme_obj) {
  56. mlme_err("Failed to get MLME Obj");
  57. return QDF_STATUS_E_FAILURE;
  58. }
  59. *ht_cap_info = mlme_obj->cfg.ht_caps.ht_cap_info;
  60. return QDF_STATUS_SUCCESS;
  61. }
  62. QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
  63. struct mlme_ht_capabilities_info
  64. ht_cap_info)
  65. {
  66. struct wlan_mlme_psoc_obj *mlme_obj;
  67. mlme_obj = mlme_get_psoc_obj(psoc);
  68. if (!mlme_obj) {
  69. mlme_err("Failed to get MLME Obj");
  70. return QDF_STATUS_E_FAILURE;
  71. }
  72. mlme_obj->cfg.ht_caps.ht_cap_info = ht_cap_info;
  73. return QDF_STATUS_SUCCESS;
  74. }
  75. void wlan_mlme_get_sap_inactivity_override(struct wlan_objmgr_psoc *psoc,
  76. bool *val)
  77. {
  78. struct wlan_mlme_psoc_obj *mlme_obj;
  79. mlme_obj = mlme_get_psoc_obj(psoc);
  80. if (!mlme_obj) {
  81. mlme_err("Failed to get MLME Obj");
  82. return;
  83. }
  84. *val = mlme_obj->cfg.qos_mlme_params.sap_max_inactivity_override;
  85. }
  86. QDF_STATUS wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc *psoc,
  87. bool *value)
  88. {
  89. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  90. if (!mlme_obj) {
  91. mlme_err("Failed to get MLME Obj");
  92. return QDF_STATUS_E_FAILURE;
  93. }
  94. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_cck;
  95. return QDF_STATUS_SUCCESS;
  96. }
  97. QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc,
  98. uint8_t *value)
  99. {
  100. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  101. if (!mlme_obj) {
  102. mlme_err("Failed to get MLME Obj");
  103. return QDF_STATUS_E_FAILURE;
  104. }
  105. *value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_1ss;
  106. return QDF_STATUS_SUCCESS;
  107. }
  108. QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc,
  109. uint16_t *value)
  110. {
  111. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  112. if (!mlme_obj) {
  113. mlme_err("Failed to get MLME Obj");
  114. return QDF_STATUS_E_FAILURE;
  115. }
  116. *value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains;
  117. return QDF_STATUS_SUCCESS;
  118. }
  119. QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc,
  120. uint16_t *value)
  121. {
  122. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  123. if (!mlme_obj) {
  124. mlme_err("Failed to get MLME Obj");
  125. return QDF_STATUS_E_FAILURE;
  126. }
  127. *value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains;
  128. return QDF_STATUS_SUCCESS;
  129. }
  130. QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc,
  131. uint8_t session_id)
  132. {
  133. int ret_val;
  134. uint8_t ch_msk_val;
  135. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  136. if (!mlme_obj) {
  137. mlme_err("Failed to get MLME Obj");
  138. return QDF_STATUS_E_FAILURE;
  139. }
  140. mlme_debug("txchainmask1x1: %d rxchainmask1x1: %d",
  141. mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
  142. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
  143. mlme_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d",
  144. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g,
  145. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g);
  146. mlme_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d",
  147. mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g,
  148. mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g);
  149. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) {
  150. ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1;
  151. ret_val = wma_cli_set_command(session_id,
  152. WMI_PDEV_PARAM_TX_CHAIN_MASK,
  153. ch_msk_val, PDEV_CMD);
  154. if (ret_val)
  155. return QDF_STATUS_E_FAILURE;
  156. }
  157. if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  158. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1;
  159. ret_val = wma_cli_set_command(session_id,
  160. WMI_PDEV_PARAM_RX_CHAIN_MASK,
  161. ch_msk_val, PDEV_CMD);
  162. if (ret_val)
  163. return QDF_STATUS_E_FAILURE;
  164. }
  165. if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 ||
  166. mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
  167. mlme_debug("band agnostic tx/rx chain mask set. skip per band chain mask");
  168. return QDF_STATUS_SUCCESS;
  169. }
  170. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g) {
  171. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g;
  172. ret_val = wma_cli_set_command(session_id,
  173. WMI_PDEV_PARAM_TX_CHAIN_MASK_2G,
  174. ch_msk_val, PDEV_CMD);
  175. if (0 != ret_val)
  176. return QDF_STATUS_E_FAILURE;
  177. }
  178. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g) {
  179. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g;
  180. ret_val = wma_cli_set_command(session_id,
  181. WMI_PDEV_PARAM_RX_CHAIN_MASK_2G,
  182. ch_msk_val, PDEV_CMD);
  183. if (0 != ret_val)
  184. return QDF_STATUS_E_FAILURE;
  185. }
  186. if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g) {
  187. ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g;
  188. ret_val = wma_cli_set_command(session_id,
  189. WMI_PDEV_PARAM_TX_CHAIN_MASK_5G,
  190. ch_msk_val, PDEV_CMD);
  191. if (0 != ret_val)
  192. return QDF_STATUS_E_FAILURE;
  193. }
  194. if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g) {
  195. ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g;
  196. ret_val = wma_cli_set_command(session_id,
  197. WMI_PDEV_PARAM_RX_CHAIN_MASK_5G,
  198. ch_msk_val, PDEV_CMD);
  199. if (0 != ret_val)
  200. return QDF_STATUS_E_FAILURE;
  201. }
  202. return QDF_STATUS_SUCCESS;
  203. }
  204. QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc,
  205. int value)
  206. {
  207. struct wlan_mlme_psoc_obj *mlme_obj;
  208. mlme_obj = mlme_get_psoc_obj(psoc);
  209. if (!mlme_obj) {
  210. mlme_err("Failed to get MLME Obj");
  211. return QDF_STATUS_E_FAILURE;
  212. }
  213. if (cfg_in_range(CFG_LISTEN_INTERVAL, value))
  214. mlme_obj->cfg.sap_cfg.listen_interval = value;
  215. else
  216. return QDF_STATUS_E_FAILURE;
  217. return QDF_STATUS_SUCCESS;
  218. }
  219. QDF_STATUS wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc *psoc,
  220. int value)
  221. {
  222. struct wlan_mlme_psoc_obj *mlme_obj;
  223. mlme_obj = mlme_get_psoc_obj(psoc);
  224. if (!mlme_obj) {
  225. mlme_err("Failed to get MLME Obj");
  226. return QDF_STATUS_E_FAILURE;
  227. }
  228. if (cfg_in_range(CFG_ASSOC_STA_LIMIT, value))
  229. mlme_obj->cfg.sap_cfg.assoc_sta_limit = value;
  230. else
  231. return QDF_STATUS_E_FAILURE;
  232. return QDF_STATUS_SUCCESS;
  233. }
  234. QDF_STATUS wlan_mlme_set_rmc_action_period_freq(struct wlan_objmgr_psoc *psoc,
  235. int value)
  236. {
  237. struct wlan_mlme_psoc_obj *mlme_obj;
  238. mlme_obj = mlme_get_psoc_obj(psoc);
  239. if (!mlme_obj) {
  240. mlme_err("Failed to get MLME Obj");
  241. return QDF_STATUS_E_FAILURE;
  242. }
  243. if (cfg_in_range(CFG_RMC_ACTION_PERIOD_FREQUENCY, value))
  244. mlme_obj->cfg.sap_cfg.rmc_action_period_freq = value;
  245. else
  246. return QDF_STATUS_E_FAILURE;
  247. return QDF_STATUS_SUCCESS;
  248. }
  249. QDF_STATUS wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
  250. bool *value)
  251. {
  252. struct wlan_mlme_psoc_obj *mlme_obj;
  253. mlme_obj = mlme_get_psoc_obj(psoc);
  254. if (!mlme_obj) {
  255. mlme_err("Failed to get MLME Obj");
  256. return QDF_STATUS_E_FAILURE;
  257. }
  258. *value = mlme_obj->cfg.sap_cfg.sap_get_peer_info;
  259. return QDF_STATUS_SUCCESS;
  260. }
  261. QDF_STATUS wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc *psoc,
  262. bool *value)
  263. {
  264. struct wlan_mlme_psoc_obj *mlme_obj;
  265. mlme_obj = mlme_get_psoc_obj(psoc);
  266. if (!mlme_obj) {
  267. mlme_err("Failed to get MLME Obj");
  268. return QDF_STATUS_E_FAILURE;
  269. }
  270. *value = mlme_obj->cfg.sap_cfg.sap_allow_all_chan_param_name;
  271. return QDF_STATUS_SUCCESS;
  272. }
  273. QDF_STATUS wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc *psoc,
  274. int *value)
  275. {
  276. struct wlan_mlme_psoc_obj *mlme_obj;
  277. mlme_obj = mlme_get_psoc_obj(psoc);
  278. if (!mlme_obj) {
  279. mlme_err("Failed to get MLME Obj");
  280. return QDF_STATUS_E_FAILURE;
  281. }
  282. *value = mlme_obj->cfg.sap_cfg.sap_max_no_peers;
  283. return QDF_STATUS_SUCCESS;
  284. }
  285. QDF_STATUS wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc *psoc,
  286. int value)
  287. {
  288. struct wlan_mlme_psoc_obj *mlme_obj;
  289. mlme_obj = mlme_get_psoc_obj(psoc);
  290. if (!mlme_obj) {
  291. mlme_err("Failed to get MLME Obj");
  292. return QDF_STATUS_E_FAILURE;
  293. }
  294. if (cfg_in_range(CFG_RMC_ACTION_PERIOD_FREQUENCY, value))
  295. mlme_obj->cfg.sap_cfg.sap_max_no_peers = value;
  296. else
  297. return QDF_STATUS_E_FAILURE;
  298. return QDF_STATUS_SUCCESS;
  299. }
  300. QDF_STATUS wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc *psoc,
  301. int *value)
  302. {
  303. struct wlan_mlme_psoc_obj *mlme_obj;
  304. mlme_obj = mlme_get_psoc_obj(psoc);
  305. if (!mlme_obj) {
  306. mlme_err("Failed to get MLME Obj");
  307. return QDF_STATUS_E_FAILURE;
  308. }
  309. *value = mlme_obj->cfg.sap_cfg.sap_max_offload_peers;
  310. return QDF_STATUS_SUCCESS;
  311. }
  312. QDF_STATUS wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc
  313. *psoc, int *value)
  314. {
  315. struct wlan_mlme_psoc_obj *mlme_obj;
  316. mlme_obj = mlme_get_psoc_obj(psoc);
  317. if (!mlme_obj) {
  318. mlme_err("Failed to get MLME Obj");
  319. return QDF_STATUS_E_FAILURE;
  320. }
  321. *value = mlme_obj->cfg.sap_cfg.sap_max_offload_reorder_buffs;
  322. return QDF_STATUS_SUCCESS;
  323. }
  324. QDF_STATUS wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc *psoc,
  325. int *value)
  326. {
  327. struct wlan_mlme_psoc_obj *mlme_obj;
  328. mlme_obj = mlme_get_psoc_obj(psoc);
  329. if (!mlme_obj) {
  330. mlme_err("Failed to get MLME Obj");
  331. return QDF_STATUS_E_FAILURE;
  332. }
  333. *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_beacon_cnt;
  334. return QDF_STATUS_SUCCESS;
  335. }
  336. QDF_STATUS wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc *psoc,
  337. bool *value)
  338. {
  339. struct wlan_mlme_psoc_obj *mlme_obj;
  340. mlme_obj = mlme_get_psoc_obj(psoc);
  341. if (!mlme_obj) {
  342. mlme_err("Failed to get MLME Obj");
  343. return QDF_STATUS_E_FAILURE;
  344. }
  345. *value = mlme_obj->cfg.sap_cfg.sap_ch_switch_mode;
  346. return QDF_STATUS_SUCCESS;
  347. }
  348. QDF_STATUS wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc *psoc,
  349. bool *value)
  350. {
  351. struct wlan_mlme_psoc_obj *mlme_obj;
  352. mlme_obj = mlme_get_psoc_obj(psoc);
  353. if (!mlme_obj) {
  354. mlme_err("Failed to get MLME Obj");
  355. return QDF_STATUS_E_FAILURE;
  356. }
  357. *value = mlme_obj->cfg.sap_cfg.sap_internal_restart;
  358. return QDF_STATUS_SUCCESS;
  359. }
  360. QDF_STATUS wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc
  361. *psoc, int *value)
  362. {
  363. struct wlan_mlme_psoc_obj *mlme_obj;
  364. mlme_obj = mlme_get_psoc_obj(psoc);
  365. if (!mlme_obj) {
  366. mlme_err("Failed to get MLME Obj");
  367. return QDF_STATUS_E_FAILURE;
  368. }
  369. *value = mlme_obj->cfg.sap_cfg.reduced_beacon_interval;
  370. return QDF_STATUS_SUCCESS;
  371. }
  372. QDF_STATUS wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc
  373. *psoc, bool *value)
  374. {
  375. struct wlan_mlme_psoc_obj *mlme_obj;
  376. mlme_obj = mlme_get_psoc_obj(psoc);
  377. if (!mlme_obj) {
  378. mlme_err("Failed to get MLME Obj");
  379. return QDF_STATUS_E_FAILURE;
  380. }
  381. *value = mlme_obj->cfg.sap_cfg.chan_switch_hostapd_rate_enabled_name;
  382. return QDF_STATUS_SUCCESS;
  383. }
  384. QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
  385. bool *value)
  386. {
  387. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  388. if (!mlme_obj) {
  389. mlme_err("Failed to get MLME Obj");
  390. return QDF_STATUS_E_FAILURE;
  391. }
  392. *value = mlme_obj->cfg.oce.oce_sta_enabled;
  393. return QDF_STATUS_SUCCESS;
  394. }
  395. QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc,
  396. bool *value)
  397. {
  398. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  399. if (!mlme_obj) {
  400. mlme_err("Failed to get MLME Obj");
  401. return QDF_STATUS_E_FAILURE;
  402. }
  403. *value = mlme_obj->cfg.oce.oce_sap_enabled;
  404. return QDF_STATUS_SUCCESS;
  405. }
  406. QDF_STATUS wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
  407. bool *value)
  408. {
  409. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  410. if (!mlme_obj) {
  411. mlme_err("Failed to get MLME Obj");
  412. return QDF_STATUS_E_FAILURE;
  413. }
  414. *value = mlme_obj->cfg.oce.fils_enabled;
  415. return QDF_STATUS_SUCCESS;
  416. }
  417. QDF_STATUS wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
  418. bool value)
  419. {
  420. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  421. if (!mlme_obj) {
  422. mlme_err("Failed to get MLME Obj");
  423. return QDF_STATUS_E_FAILURE;
  424. }
  425. mlme_obj->cfg.oce.fils_enabled = value;
  426. return QDF_STATUS_SUCCESS;
  427. }
  428. QDF_STATUS wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc *psoc,
  429. bool value)
  430. {
  431. struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
  432. if (!mlme_obj) {
  433. mlme_err("Failed to get MLME Obj");
  434. return QDF_STATUS_E_FAILURE;
  435. }
  436. mlme_obj->cfg.oce.enable_bcast_probe_rsp = value;
  437. return QDF_STATUS_SUCCESS;
  438. }
  439. QDF_STATUS wlan_mlme_get_edca_params(struct wlan_mlme_edca_params *edca_params,
  440. uint8_t *data, enum e_edca_type edca_ac)
  441. {
  442. qdf_size_t len;
  443. switch (edca_ac) {
  444. case edca_ani_acbe_local:
  445. len = edca_params->ani_acbe_l.len;
  446. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_l, &len);
  447. break;
  448. case edca_ani_acbk_local:
  449. len = edca_params->ani_acbk_l.len;
  450. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_l, &len);
  451. break;
  452. case edca_ani_acvi_local:
  453. len = edca_params->ani_acvi_l.len;
  454. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_l, &len);
  455. break;
  456. case edca_ani_acvo_local:
  457. len = edca_params->ani_acvo_l.len;
  458. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_l, &len);
  459. break;
  460. case edca_ani_acbk_bcast:
  461. len = edca_params->ani_acbk_b.len;
  462. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_b, &len);
  463. break;
  464. case edca_ani_acbe_bcast:
  465. len = edca_params->ani_acbe_b.len;
  466. wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_b, &len);
  467. break;
  468. case edca_ani_acvi_bcast:
  469. len = edca_params->ani_acvi_b.len;
  470. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_b, &len);
  471. break;
  472. case edca_ani_acvo_bcast:
  473. len = edca_params->ani_acvo_b.len;
  474. wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_b, &len);
  475. break;
  476. case edca_wme_acbe_local:
  477. len = edca_params->wme_acbe_l.len;
  478. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_l, &len);
  479. break;
  480. case edca_wme_acbk_local:
  481. len = edca_params->wme_acbk_l.len;
  482. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_l, &len);
  483. break;
  484. case edca_wme_acvi_local:
  485. len = edca_params->wme_acvi_l.len;
  486. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_l, &len);
  487. break;
  488. case edca_wme_acvo_local:
  489. len = edca_params->wme_acvo_l.len;
  490. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_l, &len);
  491. break;
  492. case edca_wme_acbe_bcast:
  493. len = edca_params->wme_acbe_b.len;
  494. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_b, &len);
  495. break;
  496. case edca_wme_acbk_bcast:
  497. len = edca_params->wme_acbk_b.len;
  498. wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_b, &len);
  499. break;
  500. case edca_wme_acvi_bcast:
  501. len = edca_params->wme_acvi_b.len;
  502. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_b, &len);
  503. break;
  504. case edca_wme_acvo_bcast:
  505. len = edca_params->wme_acvo_b.len;
  506. wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_b, &len);
  507. break;
  508. case edca_etsi_acbe_local:
  509. len = edca_params->etsi_acbe_l.len;
  510. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_l, &len);
  511. break;
  512. case edca_etsi_acbk_local:
  513. len = edca_params->etsi_acbk_l.len;
  514. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_l, &len);
  515. break;
  516. case edca_etsi_acvi_local:
  517. len = edca_params->etsi_acvi_l.len;
  518. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_l, &len);
  519. break;
  520. case edca_etsi_acvo_local:
  521. len = edca_params->etsi_acvo_l.len;
  522. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_l, &len);
  523. break;
  524. case edca_etsi_acbe_bcast:
  525. len = edca_params->etsi_acbe_b.len;
  526. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_b, &len);
  527. break;
  528. case edca_etsi_acbk_bcast:
  529. len = edca_params->etsi_acbk_b.len;
  530. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_b, &len);
  531. break;
  532. case edca_etsi_acvi_bcast:
  533. len = edca_params->etsi_acvi_b.len;
  534. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_b, &len);
  535. break;
  536. case edca_etsi_acvo_bcast:
  537. len = edca_params->etsi_acvo_b.len;
  538. wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_b, &len);
  539. break;
  540. default:
  541. mlme_err("Invalid edca access category");
  542. return QDF_STATUS_E_INVAL;
  543. }
  544. return QDF_STATUS_SUCCESS;
  545. }