blob: 2f1ed4917d86bec7d065af9b90e11b69aca34a13 [file] [log] [blame]
/*
* Copyright (c) 2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/**
* DOC: define public APIs exposed by the mlme component
*/
#include "cfg_ucfg_api.h"
#include "wlan_mlme_main.h"
#include "wlan_mlme_ucfg_api.h"
#include "wma_types.h"
#include "wmi_unified.h"
#include "wma.h"
#include "wma_internal.h"
QDF_STATUS wlan_mlme_get_cfg_str(uint8_t *dst, struct mlme_cfg_str *cfg_str,
qdf_size_t *len)
{
if (*len < cfg_str->len) {
mlme_err("Invalid len %zd", *len);
return QDF_STATUS_E_INVAL;
}
*len = cfg_str->len;
qdf_mem_copy(dst, cfg_str->data, *len);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_cfg_str(uint8_t *src, struct mlme_cfg_str *dst_cfg_str,
qdf_size_t len)
{
if (len > dst_cfg_str->max_len) {
mlme_err("Invalid len %zd (>%zd)", len,
dst_cfg_str->max_len);
return QDF_STATUS_E_INVAL;
}
dst_cfg_str->len = len;
qdf_mem_copy(dst_cfg_str->data, src, len);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_ht_cap_info(struct wlan_objmgr_psoc *psoc,
struct mlme_ht_capabilities_info
*ht_cap_info)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*ht_cap_info = mlme_obj->cfg.ht_caps.ht_cap_info;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_ht_cap_info(struct wlan_objmgr_psoc *psoc,
struct mlme_ht_capabilities_info
ht_cap_info)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.ht_caps.ht_cap_info = ht_cap_info;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_band_capability(struct wlan_objmgr_psoc *psoc,
uint8_t *band_capability)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*band_capability = mlme_obj->cfg.gen.band_capability;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_band_capability(struct wlan_objmgr_psoc *psoc,
uint8_t band_capability)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.gen.band_capability = band_capability;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_prevent_link_down(struct wlan_objmgr_psoc *psoc,
bool *prevent_link_down)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*prevent_link_down = mlme_obj->cfg.gen.prevent_link_down;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_select_5ghz_margin(struct wlan_objmgr_psoc *psoc,
uint8_t *select_5ghz_margin)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*select_5ghz_margin = mlme_obj->cfg.gen.select_5ghz_margin;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_crash_inject(struct wlan_objmgr_psoc *psoc,
bool *crash_inject)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*crash_inject = mlme_obj->cfg.gen.crash_inject;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_lpass_support(struct wlan_objmgr_psoc *psoc,
bool *lpass_support)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*lpass_support = mlme_obj->cfg.gen.lpass_support;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_self_recovery(struct wlan_objmgr_psoc *psoc,
bool *self_recovery)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*self_recovery = mlme_obj->cfg.gen.self_recovery;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sub_20_chan_width(struct wlan_objmgr_psoc *psoc,
uint8_t *sub_20_chan_width)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*sub_20_chan_width = mlme_obj->cfg.gen.sub_20_chan_width;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_fw_timeout_crash(struct wlan_objmgr_psoc *psoc,
bool *fw_timeout_crash)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*fw_timeout_crash = mlme_obj->cfg.gen.fw_timeout_crash;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_ito_repeat_count(struct wlan_objmgr_psoc *psoc,
uint8_t *ito_repeat_count)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*ito_repeat_count = mlme_obj->cfg.gen.ito_repeat_count;
return QDF_STATUS_SUCCESS;
}
void wlan_mlme_get_sap_inactivity_override(struct wlan_objmgr_psoc *psoc,
bool *val)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return;
}
*val = mlme_obj->cfg.qos_mlme_params.sap_max_inactivity_override;
}
QDF_STATUS wlan_mlme_get_acs_with_more_param(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.acs.is_acs_with_more_param;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_auto_channel_weight(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.acs.auto_channel_select_weight;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_vendor_acs_support(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.acs.is_vendor_acs_support;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_acs_support_for_dfs_ltecoex(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.acs.is_acs_support_for_dfs_ltecoex;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_external_acs_policy(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.acs.is_external_acs_policy;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_tx_chainmask_cck(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_cck;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_tx_chainmask_1ss(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_1ss;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc,
uint16_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.chainmask_cfg.num_11b_tx_chains;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_num_11ag_tx_chains(struct wlan_objmgr_psoc *psoc,
uint16_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.chainmask_cfg.num_11ag_tx_chains;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_configure_chain_mask(struct wlan_objmgr_psoc *psoc,
uint8_t session_id)
{
int ret_val;
uint8_t ch_msk_val;
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_debug("txchainmask1x1: %d rxchainmask1x1: %d",
mlme_obj->cfg.chainmask_cfg.txchainmask1x1,
mlme_obj->cfg.chainmask_cfg.rxchainmask1x1);
mlme_debug("tx_chain_mask_2g: %d, rx_chain_mask_2g: %d",
mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g,
mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g);
mlme_debug("tx_chain_mask_5g: %d, rx_chain_mask_5g: %d",
mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g,
mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g);
if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1) {
ch_msk_val = mlme_obj->cfg.chainmask_cfg.txchainmask1x1;
ret_val = wma_cli_set_command(session_id,
WMI_PDEV_PARAM_TX_CHAIN_MASK,
ch_msk_val, PDEV_CMD);
if (ret_val)
return QDF_STATUS_E_FAILURE;
}
if (mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
ch_msk_val = mlme_obj->cfg.chainmask_cfg.rxchainmask1x1;
ret_val = wma_cli_set_command(session_id,
WMI_PDEV_PARAM_RX_CHAIN_MASK,
ch_msk_val, PDEV_CMD);
if (ret_val)
return QDF_STATUS_E_FAILURE;
}
if (mlme_obj->cfg.chainmask_cfg.txchainmask1x1 ||
mlme_obj->cfg.chainmask_cfg.rxchainmask1x1) {
mlme_debug("band agnostic tx/rx chain mask set. skip per band chain mask");
return QDF_STATUS_SUCCESS;
}
if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g) {
ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_2g;
ret_val = wma_cli_set_command(session_id,
WMI_PDEV_PARAM_TX_CHAIN_MASK_2G,
ch_msk_val, PDEV_CMD);
if (0 != ret_val)
return QDF_STATUS_E_FAILURE;
}
if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g) {
ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_2g;
ret_val = wma_cli_set_command(session_id,
WMI_PDEV_PARAM_RX_CHAIN_MASK_2G,
ch_msk_val, PDEV_CMD);
if (0 != ret_val)
return QDF_STATUS_E_FAILURE;
}
if (mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g) {
ch_msk_val = mlme_obj->cfg.chainmask_cfg.tx_chain_mask_5g;
ret_val = wma_cli_set_command(session_id,
WMI_PDEV_PARAM_TX_CHAIN_MASK_5G,
ch_msk_val, PDEV_CMD);
if (0 != ret_val)
return QDF_STATUS_E_FAILURE;
}
if (mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g) {
ch_msk_val = mlme_obj->cfg.chainmask_cfg.rx_chain_mask_5g;
ret_val = wma_cli_set_command(session_id,
WMI_PDEV_PARAM_RX_CHAIN_MASK_5G,
ch_msk_val, PDEV_CMD);
if (0 != ret_val)
return QDF_STATUS_E_FAILURE;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_manufacturer_name(struct wlan_objmgr_psoc *psoc,
uint8_t *pbuf, uint32_t *plen)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*plen = qdf_str_lcopy(pbuf,
mlme_obj->cfg.product_details.manufacturer_name,
*plen);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_model_number(struct wlan_objmgr_psoc *psoc,
uint8_t *pbuf, uint32_t *plen)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*plen = qdf_str_lcopy(pbuf,
mlme_obj->cfg.product_details.model_number,
*plen);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_model_name(struct wlan_objmgr_psoc *psoc,
uint8_t *pbuf, uint32_t *plen)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*plen = qdf_str_lcopy(pbuf,
mlme_obj->cfg.product_details.model_name,
*plen);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_manufacture_product_version(struct wlan_objmgr_psoc *psoc,
uint8_t *pbuf, uint32_t *plen)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*plen = qdf_str_lcopy(pbuf,
mlme_obj->cfg.product_details.manufacture_product_version,
*plen);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_manufacture_product_name(struct wlan_objmgr_psoc *psoc,
uint8_t *pbuf, uint32_t *plen)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*plen = qdf_str_lcopy(pbuf,
mlme_obj->cfg.product_details.manufacture_product_name,
*plen);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_wmm_dir_ac_vo(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.wmm_params.ac_vo.dir_ac_vo;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_wmm_nom_msdu_size_ac_vo(struct wlan_objmgr_psoc *psoc,
uint16_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.wmm_params.ac_vo.nom_msdu_size_ac_vo;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_wmm_mean_data_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("failed to get mlme obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.wmm_params.ac_vo.mean_data_rate_ac_vo;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_wmm_min_phy_rate_ac_vo(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("failed to get mlme obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.wmm_params.ac_vo.min_phy_rate_ac_vo;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_wmm_sba_ac_vo(struct wlan_objmgr_psoc *psoc,
uint16_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.wmm_params.ac_vo.sba_ac_vo;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_srv_intv(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_srv_intv;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_wmm_uapsd_vo_sus_intv(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.wmm_params.ac_vo.uapsd_vo_sus_intv;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_sap_listen_interval(struct wlan_objmgr_psoc *psoc,
int value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
if (cfg_in_range(CFG_LISTEN_INTERVAL, value))
mlme_obj->cfg.sap_cfg.listen_interval = value;
else
return QDF_STATUS_E_FAILURE;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_assoc_sta_limit(struct wlan_objmgr_psoc *psoc,
int value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
if (cfg_in_range(CFG_ASSOC_STA_LIMIT, value))
mlme_obj->cfg.sap_cfg.assoc_sta_limit = value;
else
return QDF_STATUS_E_FAILURE;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_rmc_action_period_freq(struct wlan_objmgr_psoc *psoc,
int value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
if (cfg_in_range(CFG_RMC_ACTION_PERIOD_FREQUENCY, value))
mlme_obj->cfg.sap_cfg.rmc_action_period_freq = value;
else
return QDF_STATUS_E_FAILURE;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_get_peer_info(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_get_peer_info;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_allow_all_channels(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_allow_all_chan_param_name;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_max_peers(struct wlan_objmgr_psoc *psoc,
int *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_max_no_peers;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_sap_max_peers(struct wlan_objmgr_psoc *psoc,
int value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
if (cfg_in_range(CFG_RMC_ACTION_PERIOD_FREQUENCY, value))
mlme_obj->cfg.sap_cfg.sap_max_no_peers = value;
else
return QDF_STATUS_E_FAILURE;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_max_offload_peers(struct wlan_objmgr_psoc *psoc,
int *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_max_offload_peers;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_max_offload_reorder_buffs(struct wlan_objmgr_psoc
*psoc, int *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_max_offload_reorder_buffs;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_chn_switch_bcn_count(struct wlan_objmgr_psoc *psoc,
int *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_ch_switch_beacon_cnt;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_chn_switch_mode(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_ch_switch_mode;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_internal_restart(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.sap_internal_restart;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_reduced_beacon_interval(struct wlan_objmgr_psoc
*psoc, int *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.reduced_beacon_interval;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_sap_chan_switch_rate_enabled(struct wlan_objmgr_psoc
*psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.sap_cfg.chan_switch_hostapd_rate_enabled_name;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_oce_sta_enabled_info(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.oce.oce_sta_enabled;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_oce_sap_enabled_info(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.oce.oce_sap_enabled;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_rts_threshold(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.threshold.rts_threshold;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_rts_threshold(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
tp_wma_handle wma_handle;
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (NULL == wma_handle) {
WMA_LOGE("%s: wma_handle is NULL", __func__);
return QDF_STATUS_E_INVAL;
}
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.threshold.rts_threshold = value;
wma_update_rts_params(wma_handle, value);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_frag_threshold(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.threshold.frag_threshold;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_frag_threshold(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
tp_wma_handle wma_handle;
wma_handle = cds_get_context(QDF_MODULE_ID_WMA);
if (NULL == wma_handle) {
WMA_LOGE("%s: wma_handle is NULL", __func__);
return QDF_STATUS_E_INVAL;
}
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.threshold.frag_threshold = value;
wma_update_frag_params(wma_handle,
value);
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.oce.fils_enabled;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_fils_enabled_info(struct wlan_objmgr_psoc *psoc,
bool value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.oce.fils_enabled = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_set_enable_bcast_probe_rsp(struct wlan_objmgr_psoc *psoc,
bool value)
{
struct wlan_mlme_psoc_obj *mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.oce.enable_bcast_probe_rsp = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS wlan_mlme_get_edca_params(struct wlan_mlme_edca_params *edca_params,
uint8_t *data, enum e_edca_type edca_ac)
{
qdf_size_t len;
switch (edca_ac) {
case edca_ani_acbe_local:
len = edca_params->ani_acbe_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_l, &len);
break;
case edca_ani_acbk_local:
len = edca_params->ani_acbk_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_l, &len);
break;
case edca_ani_acvi_local:
len = edca_params->ani_acvi_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_l, &len);
break;
case edca_ani_acvo_local:
len = edca_params->ani_acvo_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_l, &len);
break;
case edca_ani_acbk_bcast:
len = edca_params->ani_acbk_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acbk_b, &len);
break;
case edca_ani_acbe_bcast:
len = edca_params->ani_acbe_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acbe_b, &len);
break;
case edca_ani_acvi_bcast:
len = edca_params->ani_acvi_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acvi_b, &len);
break;
case edca_ani_acvo_bcast:
len = edca_params->ani_acvo_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->ani_acvo_b, &len);
break;
case edca_wme_acbe_local:
len = edca_params->wme_acbe_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_l, &len);
break;
case edca_wme_acbk_local:
len = edca_params->wme_acbk_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_l, &len);
break;
case edca_wme_acvi_local:
len = edca_params->wme_acvi_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_l, &len);
break;
case edca_wme_acvo_local:
len = edca_params->wme_acvo_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_l, &len);
break;
case edca_wme_acbe_bcast:
len = edca_params->wme_acbe_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acbe_b, &len);
break;
case edca_wme_acbk_bcast:
len = edca_params->wme_acbk_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acbk_b, &len);
break;
case edca_wme_acvi_bcast:
len = edca_params->wme_acvi_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acvi_b, &len);
break;
case edca_wme_acvo_bcast:
len = edca_params->wme_acvo_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->wme_acvo_b, &len);
break;
case edca_etsi_acbe_local:
len = edca_params->etsi_acbe_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_l, &len);
break;
case edca_etsi_acbk_local:
len = edca_params->etsi_acbk_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_l, &len);
break;
case edca_etsi_acvi_local:
len = edca_params->etsi_acvi_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_l, &len);
break;
case edca_etsi_acvo_local:
len = edca_params->etsi_acvo_l.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_l, &len);
break;
case edca_etsi_acbe_bcast:
len = edca_params->etsi_acbe_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbe_b, &len);
break;
case edca_etsi_acbk_bcast:
len = edca_params->etsi_acbk_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acbk_b, &len);
break;
case edca_etsi_acvi_bcast:
len = edca_params->etsi_acvi_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvi_b, &len);
break;
case edca_etsi_acvo_bcast:
len = edca_params->etsi_acvo_b.len;
wlan_mlme_get_cfg_str(data, &edca_params->etsi_acvo_b, &len);
break;
default:
mlme_err("Invalid edca access category");
return QDF_STATUS_E_INVAL;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS mlme_get_wep_key(struct wlan_mlme_wep_cfg *wep_params,
enum wep_key_id wep_keyid, uint8_t *default_key,
qdf_size_t key_len)
{
switch (wep_keyid) {
case MLME_WEP_DEFAULT_KEY_1:
wlan_mlme_get_cfg_str(default_key,
&wep_params->wep_default_key_1,
&key_len);
break;
case MLME_WEP_DEFAULT_KEY_2:
wlan_mlme_get_cfg_str(default_key,
&wep_params->wep_default_key_2,
&key_len);
break;
case MLME_WEP_DEFAULT_KEY_3:
wlan_mlme_get_cfg_str(default_key,
&wep_params->wep_default_key_3,
&key_len);
break;
case MLME_WEP_DEFAULT_KEY_4:
wlan_mlme_get_cfg_str(default_key,
&wep_params->wep_default_key_4,
&key_len);
break;
default:
mlme_err("Invalid key id:%d", wep_keyid);
return QDF_STATUS_E_INVAL;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS mlme_set_wep_key(struct wlan_mlme_wep_cfg *wep_params,
enum wep_key_id wep_keyid, uint8_t *key_to_set,
qdf_size_t len)
{
if (len == 0) {
mlme_debug("WEP set key length is zero");
return QDF_STATUS_E_FAILURE;
}
switch (wep_keyid) {
case MLME_WEP_DEFAULT_KEY_1:
wlan_mlme_set_cfg_str(key_to_set,
&wep_params->wep_default_key_1,
len);
break;
case MLME_WEP_DEFAULT_KEY_2:
wlan_mlme_set_cfg_str(key_to_set,
&wep_params->wep_default_key_2,
len);
break;
case MLME_WEP_DEFAULT_KEY_3:
wlan_mlme_set_cfg_str(key_to_set,
&wep_params->wep_default_key_3,
len);
break;
case MLME_WEP_DEFAULT_KEY_4:
wlan_mlme_set_cfg_str(key_to_set,
&wep_params->wep_default_key_4,
len);
break;
default:
mlme_err("Invalid key id:%d", wep_keyid);
return QDF_STATUS_E_INVAL;
}
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.supp_chan_width;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_ldpc_coding_cap(struct wlan_objmgr_psoc *psoc,
bool value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.ldpc_coding_cap = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc,
bool value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_short_gi_160_mhz(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.short_gi_160mhz;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_vht_tx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_stbc;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_vht_rx_stbc(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_stbc;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
uint8_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_vht_tx_bfee_ant_supp(struct wlan_objmgr_psoc *psoc,
uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_bfee_ant_supp;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_rx_mcs_map(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs_map = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_tx_mcs_map(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs_map = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_rx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.rx_supp_data_rate = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_tx_supp_data_rate(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.tx_supp_data_rate = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_get_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
uint32_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_cfg_set_vht_basic_mcs_set(struct wlan_objmgr_psoc *psoc,
uint32_t value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.basic_mcs_set = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_enable_tx_bf(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_txbf_20mhz;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_enable_tx_su_beam(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_tx_su;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_channel_width(struct wlan_objmgr_psoc *psoc, uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.channel_width;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_rx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_tx_mcs_8_9(struct wlan_objmgr_psoc *psoc, uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_rx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.rx_mcs2x2;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_tx_mcs_2x2(struct wlan_objmgr_psoc *psoc, uint8_t *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.tx_mcs2x2;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht20_mcs9(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_vht20_mcs9;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_set_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
mlme_obj->cfg.vht_caps.vht_cap_info.enable2x2 = value;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_enable_paid(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_paid;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_enable_gid(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.enable_gid;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.b24ghz_band;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS
wlan_mlme_get_vendor_vht_for_24ghz(struct wlan_objmgr_psoc *psoc, bool *value)
{
struct wlan_mlme_psoc_obj *mlme_obj;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
*value = mlme_obj->cfg.vht_caps.vht_cap_info.vendor_24ghz_band;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS mlme_update_vht_cap(struct wlan_objmgr_psoc *psoc,
struct wma_tgt_vht_cap *cfg)
{
struct wlan_mlme_psoc_obj *mlme_obj;
struct mlme_vht_capabilities_info vht_cap_info;
uint32_t value = 0;
bool hw_rx_ldpc_enabled;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
vht_cap_info = mlme_obj->cfg.vht_caps.vht_cap_info;
/*
* VHT max MPDU length:
* override if user configured value is too high
* that the target cannot support
*/
if (vht_cap_info.ampdu_len > cfg->vht_max_mpdu)
vht_cap_info.ampdu_len = cfg->vht_max_mpdu;
value = (CFG_VHT_BASIC_MCS_SET_STADEF & VHT_MCS_1x1) |
vht_cap_info.basic_mcs_set;
if (vht_cap_info.enable2x2)
value = (value & VHT_MCS_2x2) | (vht_cap_info.rx_mcs2x2 << 2);
vht_cap_info.basic_mcs_set = value;
value = (CFG_VHT_RX_MCS_MAP_STADEF & VHT_MCS_1x1) | vht_cap_info.rx_mcs;
if (vht_cap_info.enable2x2)
value = (value & VHT_MCS_2x2) | (vht_cap_info.rx_mcs2x2 << 2);
vht_cap_info.rx_mcs_map = value;
value = (CFG_VHT_TX_MCS_MAP_STADEF & VHT_MCS_1x1) | vht_cap_info.tx_mcs;
if (vht_cap_info.enable2x2)
value = (value & VHT_MCS_2x2) | (vht_cap_info.tx_mcs2x2 << 2);
vht_cap_info.tx_mcs_map = value;
/* Set HW RX LDPC capability */
hw_rx_ldpc_enabled = !!cfg->vht_rx_ldpc;
if (hw_rx_ldpc_enabled != vht_cap_info.ldpc_coding_cap)
vht_cap_info.ldpc_coding_cap = hw_rx_ldpc_enabled;
/* set the Guard interval 80MHz */
if (vht_cap_info.short_gi_80mhz && !cfg->vht_short_gi_80)
vht_cap_info.short_gi_80mhz = cfg->vht_short_gi_80;
/* Set VHT TX STBC cap */
if (vht_cap_info.tx_stbc && !cfg->vht_tx_stbc)
vht_cap_info.tx_stbc = cfg->vht_tx_stbc;
/* Set VHT RX STBC cap */
if (vht_cap_info.rx_stbc && !cfg->vht_rx_stbc)
vht_cap_info.rx_stbc = cfg->vht_rx_stbc;
/* Set VHT SU Beamformer cap */
if (vht_cap_info.su_bformer && !cfg->vht_su_bformer)
vht_cap_info.su_bformer = cfg->vht_su_bformer;
/* check and update SU BEAMFORMEE capabality */
if (vht_cap_info.enable_txbf_20mhz && !cfg->vht_su_bformee)
vht_cap_info.su_bformee = cfg->vht_su_bformee;
/* Set VHT MU Beamformer cap */
if (vht_cap_info.mu_bformer && !cfg->vht_mu_bformer)
vht_cap_info.mu_bformer = cfg->vht_mu_bformer;
/* Set VHT MU Beamformee cap */
if (vht_cap_info.enable_mu_bformee && !cfg->vht_mu_bformee)
vht_cap_info.enable_mu_bformee = cfg->vht_mu_bformee;
/*
* VHT max AMPDU len exp:
* override if user configured value is too high
* that the target cannot support.
* Even though Rome publish ampdu_len=7, it can
* only support 4 because of some h/w bug.
*/
if (vht_cap_info.ampdu_len_exponent > cfg->vht_max_ampdu_len_exp)
vht_cap_info.ampdu_len_exponent = cfg->vht_max_ampdu_len_exp;
/* Set VHT TXOP PS CAP */
if (vht_cap_info.txop_ps && !cfg->vht_txop_ps)
vht_cap_info.txop_ps = cfg->vht_txop_ps;
/* set the Guard interval 160MHz */
if (vht_cap_info.short_gi_160mhz && !cfg->vht_short_gi_160)
vht_cap_info.short_gi_160mhz = cfg->vht_short_gi_160;
return QDF_STATUS_SUCCESS;
}
QDF_STATUS mlme_update_nss_vht_cap(struct wlan_objmgr_psoc *psoc)
{
struct wlan_mlme_psoc_obj *mlme_obj;
struct mlme_vht_capabilities_info vht_cap_info;
uint32_t temp = 0;
mlme_obj = mlme_get_psoc_obj(psoc);
if (!mlme_obj) {
mlme_err("Failed to get MLME Obj");
return QDF_STATUS_E_FAILURE;
}
vht_cap_info = mlme_obj->cfg.vht_caps.vht_cap_info;
temp = vht_cap_info.basic_mcs_set;
temp = (temp & 0xFFFC) | vht_cap_info.rx_mcs;
if (vht_cap_info.enable2x2)
temp = (temp & 0xFFF3) | (vht_cap_info.rx_mcs2x2 << 2);
else
temp |= 0x000C;
vht_cap_info.basic_mcs_set = temp;
temp = vht_cap_info.rx_mcs_map;
temp = (temp & 0xFFFC) | vht_cap_info.rx_mcs;
if (vht_cap_info.enable2x2)
temp = (temp & 0xFFF3) | (vht_cap_info.rx_mcs2x2 << 2);
else
temp |= 0x000C;
vht_cap_info.rx_mcs_map = temp;
temp = vht_cap_info.tx_mcs_map;
temp = (temp & 0xFFFC) | vht_cap_info.tx_mcs;
if (vht_cap_info.enable2x2)
temp = (temp & 0xFFF3) | (vht_cap_info.tx_mcs2x2 << 2);
else
temp |= 0x000C;
vht_cap_info.tx_mcs_map = temp;
return QDF_STATUS_SUCCESS;
}