diff --git a/os_if/linux/mlme/inc/wlan_cfg80211_vdev_mlme.h b/os_if/linux/mlme/inc/wlan_cfg80211_vdev_mlme.h new file mode 100644 index 0000000000..bf8e264c31 --- /dev/null +++ b/os_if/linux/mlme/inc/wlan_cfg80211_vdev_mlme.h @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2019 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: wlan_cfg80211_vdev_mlme.h + * + * This header file provide API declarations for osif layer + * to get and set vdev mgr mlme structure parameters + */ + +#ifndef __WLAN_CFG80211_VDEV_MLME_H__ +#define __WLAN_CFG80211_VDEV_MLME_H__ +#include +#include +#include "include/wlan_vdev_mlme.h" + +/** + * wlan_cfg80211_vdev_mlme_get_param_ssid() – cfg80211 MLME API to + * get ssid + * @vdev: pointer to vdev object + * @ssid: pointer to store the ssid + * @ssid_len: pointer to store the ssid length value + * + * Return: 0 on success, negative value on failure + */ +int +wlan_cfg80211_vdev_mlme_get_param_ssid(struct wlan_objmgr_vdev *vdev, + uint8_t *ssid, + uint8_t *ssid_len); + +/** + * wlan_cfg80211_vdev_mlme_get_trans_bssid() – cfg80211 MLME API to + * get trans bssid + * @vdev: pointer to vdev object + * @addr: pointer to store the addr of the transmission bssid + * + * Return: 0 on success, negative value on failure + */ +int +wlan_cfg80211_vdev_mlme_get_trans_bssid(struct wlan_objmgr_vdev *vdev, + uint8_t *addr); + +/** + * wlan_cfg80211_vdev_mlme_set_param() – cfg80211 MLME API to fill common + * parameters of vdev_mlme object + * @vdev: pointer to vdev object + * @param_id: param id for which the value should be set + * @mlme_cfg: structure of a union to set the parameter + * + * Return: void + */ +void +wlan_cfg80211_vdev_mlme_set_param(struct wlan_objmgr_vdev *vdev, + enum wlan_mlme_cfg_id param_id, + struct wlan_vdev_mgr_cfg mlme_cfg); + +/** + * wlan_cfg80211_vdev_mlme_get_param() – cfg80211 MLME API to get common + * parameters of vdev_mlme object + * @vdev: pointer to vdev object + * @param_id: param id for which the value should be set + * @value: pointer to store the value of the req vdev_mlme object + * + * Return: void + */ +void +wlan_cfg80211_vdev_mlme_get_param(struct wlan_objmgr_vdev *vdev, + enum wlan_mlme_cfg_id param_id, + uint32_t *value); +#endif /* __WLAN_CFG80211_VDEV_MLME_H__ */ diff --git a/os_if/linux/mlme/src/wlan_cfg80211_vdev_mlme.c b/os_if/linux/mlme/src/wlan_cfg80211_vdev_mlme.c new file mode 100644 index 0000000000..54eecf5855 --- /dev/null +++ b/os_if/linux/mlme/src/wlan_cfg80211_vdev_mlme.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2019 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: wlan_cfg80211_vdev_mlme.c + * + * This file provide API definitions for osif layer + * to get and set vdev mgr mlme structure parameters + */ + +#include + +int +wlan_cfg80211_vdev_mlme_get_param_ssid(struct wlan_objmgr_vdev *vdev, + uint8_t *ssid, + uint8_t *ssid_len) +{ + if (!vdev) { + cfg80211_err("VDEV is NULL!!!!"); + return qdf_status_to_os_return(QDF_STATUS_E_FAILURE); + } + + ucfg_wlan_vdev_mgr_get_param_ssid(vdev, ssid, ssid_len); + return qdf_status_to_os_return(QDF_STATUS_SUCCESS); +} + +int +wlan_cfg80211_vdev_mlme_get_trans_bssid(struct wlan_objmgr_vdev *vdev, + uint8_t *addr) +{ + if (!vdev) { + cfg80211_err("VDEV is NULL!!!!"); + return qdf_status_to_os_return(QDF_STATUS_E_FAILURE); + } + + ucfg_wlan_vdev_mlme_get_trans_bssid(vdev, addr); + return qdf_status_to_os_return(QDF_STATUS_SUCCESS); +} + +void +wlan_cfg80211_vdev_mlme_set_param(struct wlan_objmgr_vdev *vdev, + enum wlan_mlme_cfg_id param_id, + struct wlan_vdev_mgr_cfg mlme_cfg) +{ + if (!vdev) { + cfg80211_err("VDEV is NULL!!!!"); + return; + } + + ucfg_wlan_vdev_mgr_set_param(vdev, param_id, mlme_cfg); +} + +void +wlan_cfg80211_vdev_mlme_get_param(struct wlan_objmgr_vdev *vdev, + enum wlan_mlme_cfg_id param_id, + uint32_t *value) +{ + if (!vdev) { + cfg80211_err("VDEV is NULL!!!!"); + return; + } + + ucfg_wlan_vdev_mgr_get_param(vdev, param_id, value); +} diff --git a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c index 83192cc279..488a8db869 100644 --- a/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c +++ b/target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c @@ -125,6 +125,7 @@ target_if_vdev_mlme_id_2_wmi(uint32_t cfg_id) case WLAN_MLME_CFG_MUBFEE: case WLAN_MLME_CFG_IMLICIT_BF: case WLAN_MLME_CFG_SOUNDING_DIM: + case WLAN_MLME_CFG_TXBF_CAPS: wmi_id = wmi_vdev_param_txbf; break; case WLAN_MLME_CFG_HE_OPS: @@ -163,6 +164,9 @@ target_if_vdev_mlme_id_2_wmi(uint32_t cfg_id) case WLAN_MLME_CFG_UAPSD: wmi_id = WMI_HOST_STA_PS_PARAM_UAPSD; break; + case WLAN_MLME_CFG_BCN_TX_RATE: + wmi_id = wmi_vdev_param_beacon_rate; + break; default: wmi_id = cfg_id; break; @@ -782,8 +786,8 @@ static QDF_STATUS target_if_vdev_mgr_sta_ps_param_send( return QDF_STATUS_E_INVAL; } - param_id = target_if_vdev_mlme_id_2_wmi(param->param); - param->param = param_id; + param_id = target_if_vdev_mlme_id_2_wmi(param->param_id); + param->param_id = param_id; status = wmi_unified_sta_ps_cmd_send(wmi_handle, param); diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h index e5ff1122c1..822854b8b9 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_psoc_obj.h @@ -185,6 +185,8 @@ #define WLAN_SOC_F_MBSS_IE_ENABLE 0x00800000 /* Spectral disable */ #define WLAN_SOC_F_SPECTRAL_DISABLE 0x01000000 + /* FTM testmode enable */ +#define WLAN_SOC_F_TESTMODE_ENABLE 0x02000000 /* PSOC op flags */ diff --git a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h index eb0c608ed0..f0bd07b028 100644 --- a/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h +++ b/umac/cmn_services/obj_mgr/inc/wlan_objmgr_vdev_obj.h @@ -32,6 +32,11 @@ #include "wlan_objmgr_pdev_obj.h" #include "wlan_objmgr_psoc_obj.h" #include "wlan_vdev_mlme_main.h" +#ifdef CMN_VDEV_MGR_TGT_IF_ENABLE +#include "include/wlan_vdev_mlme.h" +#include "wlan_vdev_mlme_api.h" +#include "wlan_mlme_dbg.h" +#endif /* CONF: privacy enabled */ #define WLAN_VDEV_F_PRIVACY 0x00000001 @@ -278,21 +283,21 @@ struct wlan_channel { * @mlme_state: VDEV MLME SM substate * @bss_chan: BSS channel * @des_chan: Desired channel, for STA Desired may not be used - * @nss: Num. Spatial streams - * @tx_chainmask: Tx Chainmask - * @rx_chainmask: Rx Chainmask - * @tx_power: Tx power * @vdev_caps: VDEV capabilities * @vdev_feat_caps: VDEV feature caps * @vdev_feat_ext_caps: VDEV Extended feature caps - * @max_rate: MAX rate - * @tx_mgmt_rate: TX Mgmt. Rate - * @per_band_mgmt_rate: Per-band TX Mgmt. Rate * @vdev_op_flags: Operation flags * @mataddr[]: MAT address * @macaddr[]: VDEV self MAC address * @ssid[]: SSID * @ssid_len: SSID length + * @nss: Num. Spatial streams + * @tx_chainmask: Tx Chainmask + * @rx_chainmask: Rx Chainmask + * @tx_power: Tx power + * @max_rate: MAX rate + * @tx_mgmt_rate: TX Mgmt. Rate + * @per_band_mgmt_rate: Per-band TX Mgmt. Rate */ struct wlan_objmgr_vdev_mlme { enum QDF_OPMODE vdev_opmode; @@ -300,21 +305,23 @@ struct wlan_objmgr_vdev_mlme { enum wlan_vdev_state mlme_substate; struct wlan_channel *bss_chan; struct wlan_channel *des_chan; + uint32_t vdev_caps; + uint32_t vdev_feat_caps; + uint32_t vdev_feat_ext_caps; + uint32_t vdev_op_flags; + uint8_t mataddr[QDF_MAC_ADDR_SIZE]; + uint8_t macaddr[QDF_MAC_ADDR_SIZE]; +#ifndef CMN_VDEV_MGR_TGT_IF_ENABLE + char ssid[WLAN_SSID_MAX_LEN + 1]; + uint8_t ssid_len; uint8_t nss; uint8_t tx_chainmask; uint8_t rx_chainmask; uint8_t tx_power; - uint32_t vdev_caps; - uint32_t vdev_feat_caps; - uint32_t vdev_feat_ext_caps; uint32_t max_rate; uint32_t tx_mgmt_rate; uint32_t per_band_mgmt_rate[WLAN_BAND_NUM_MAX]; - uint32_t vdev_op_flags; - uint8_t mataddr[QDF_MAC_ADDR_SIZE]; - uint8_t macaddr[QDF_MAC_ADDR_SIZE]; - char ssid[WLAN_SSID_MAX_LEN+1]; - uint8_t ssid_len; +#endif }; /** @@ -803,6 +810,449 @@ static inline uint8_t *wlan_vdev_get_hw_macaddr(struct wlan_objmgr_vdev *vdev) return NULL; } +/** + * wlan_vdev_obj_lock() - Acquire VDEV spinlock + * @vdev: VDEV object + * + * API to acquire VDEV lock + * Parent lock should not be taken in child lock context + * but child lock can be taken in parent lock context + * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) + * + * Return: void + */ +static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) +{ + qdf_spin_lock_bh(&vdev->vdev_lock); +} + +/** + * wlan_vdev_obj_unlock() - Release VDEV spinlock + * @vdev: VDEV object + * + * API to Release VDEV lock + * + * Return: void + */ +static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) +{ + qdf_spin_unlock_bh(&vdev->vdev_lock); +} + +/** + * wlan_vdev_mlme_set_bss_chan() - set bss chan + * @vdev: VDEV object + * @bss_chan: Channel + * + * API to set the BSS channel + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_bss_chan( + struct wlan_objmgr_vdev *vdev, + struct wlan_channel *bss_chan) +{ + vdev->vdev_mlme.bss_chan = bss_chan; +} + +/** + * wlan_vdev_mlme_get_bss_chan() - get bss chan + * @vdev: VDEV object + * + * API to get the BSS channel + * + * Return: + * @bss_chan: Channel + */ +static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( + struct wlan_objmgr_vdev *vdev) +{ + return vdev->vdev_mlme.bss_chan; +} + +/** + * wlan_vdev_mlme_set_des_chan() - set desired chan + * @vdev: VDEV object + * @des_chan: Channel configured by user + * + * API to set the desired channel + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_des_chan( + struct wlan_objmgr_vdev *vdev, + struct wlan_channel *des_chan) +{ + vdev->vdev_mlme.des_chan = des_chan; +} + +/** + * wlan_vdev_mlme_get_des_chan() - get desired chan + * @vdev: VDEV object + * + * API to get the desired channel + * + * Return: + * @des_chan: Channel configured by user + */ +static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( + struct wlan_objmgr_vdev *vdev) +{ + return vdev->vdev_mlme.des_chan; +} + +#ifdef CMN_VDEV_MGR_TGT_IF_ENABLE +/** + * wlan_vdev_mlme_set_ssid() - set ssid + * @vdev: VDEV object + * @ssid: SSID (input) + * @ssid_len: Length of SSID + * + * API to set the SSID of VDEV + * + * Caller need to acquire lock with wlan_vdev_obj_lock() + * + * Return: SUCCESS, if update is done + * FAILURE, if ssid length is > max ssid len + */ +static inline QDF_STATUS wlan_vdev_mlme_set_ssid( + struct wlan_objmgr_vdev *vdev, + const uint8_t *ssid, uint8_t ssid_len) +{ + struct vdev_mlme_obj *vdev_mlme; + + /* This API is invoked with lock acquired, do not add log prints */ + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return QDF_STATUS_E_FAILURE; + + if (ssid_len <= WLAN_SSID_MAX_LEN) { + qdf_mem_copy(vdev_mlme->mgmt.generic.ssid, ssid, ssid_len); + vdev_mlme->mgmt.generic.ssid_len = ssid_len; + } else { + vdev_mlme->mgmt.generic.ssid_len = 0; + return QDF_STATUS_E_FAILURE; + } + return QDF_STATUS_SUCCESS; +} + +/** + * wlan_vdev_mlme_get_ssid() - get ssid + * @vdev: VDEV object + * @ssid: SSID + * @ssid_len: Length of SSID + * + * API to get the SSID of VDEV, it updates the SSID and its length + * in @ssid, @ssid_len respectively + * + * Caller need to acquire lock with wlan_vdev_obj_lock() + * + * Return: SUCCESS, if update is done + * FAILURE, if ssid length is > max ssid len + */ +static inline QDF_STATUS wlan_vdev_mlme_get_ssid( + struct wlan_objmgr_vdev *vdev, + uint8_t *ssid, uint8_t *ssid_len) +{ + struct vdev_mlme_obj *vdev_mlme; + + /* This API is invoked with lock acquired, do not add log prints */ + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return QDF_STATUS_E_FAILURE; + + if (vdev_mlme->mgmt.generic.ssid_len > 0) { + *ssid_len = vdev_mlme->mgmt.generic.ssid_len; + qdf_mem_copy(ssid, vdev_mlme->mgmt.generic.ssid, *ssid_len); + } else { + *ssid_len = 0; + return QDF_STATUS_E_FAILURE; + } + return QDF_STATUS_SUCCESS; +} + +/** + * wlan_vdev_mlme_set_nss() - set NSS + * @vdev: VDEV object + * @nss: nss configured by user + * + * API to set the Number of Spatial streams + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_nss( + struct wlan_objmgr_vdev *vdev, + uint8_t nss) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } + + vdev_mlme->proto.generic.nss = nss; +} + +/** + * wlan_vdev_mlme_get_nss() - get NSS + * @vdev: VDEV object + * + * API to get the Number of Spatial Streams + * + * Return: + * @nss: nss value + */ +static inline uint8_t wlan_vdev_mlme_get_nss( + struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return 0; + } + + return vdev_mlme->proto.generic.nss; +} + +/** + * wlan_vdev_mlme_set_txchainmask() - set Tx chainmask + * @vdev: VDEV object + * @chainmask : chainmask either configured by user or max supported + * + * API to set the Tx chainmask + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_txchainmask( + struct wlan_objmgr_vdev *vdev, + uint8_t chainmask) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } + + vdev_mlme->mgmt.chainmask_info.tx_chainmask = chainmask; +} + +/** + * wlan_vdev_mlme_get_txchainmask() - get Tx chainmask + * @vdev: VDEV object + * + * API to get the Tx chainmask + * + * Return: + * @chainmask : Tx chainmask either configured by user or max supported + */ +static inline uint8_t wlan_vdev_mlme_get_txchainmask( + struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return 0; + } + + return vdev_mlme->mgmt.chainmask_info.tx_chainmask; +} + +/** + * wlan_vdev_mlme_set_rxchainmask() - set Rx chainmask + * @vdev: VDEV object + * @chainmask : Rx chainmask either configured by user or max supported + * + * API to set the Rx chainmask + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_rxchainmask( + struct wlan_objmgr_vdev *vdev, + uint8_t chainmask) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } + + vdev_mlme->mgmt.chainmask_info.rx_chainmask = chainmask; +} + +/** + * wlan_vdev_mlme_get_rxchainmask() - get Rx chainmask + * @vdev: VDEV object + * + * API to get the Rx chainmask + * + * Return: + * @chainmask : Rx chainmask either configured by user or max supported + */ +static inline uint8_t wlan_vdev_mlme_get_rxchainmask( + struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + /* This API is invoked with lock acquired, do not add log prints */ + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return 0; + + return vdev_mlme->mgmt.chainmask_info.rx_chainmask; +} + +/** + * wlan_vdev_mlme_set_txpower() - set tx power + * @vdev: VDEV object + * @txpow: tx power either configured by used or max allowed + * + * API to set the tx power + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_txpower( + struct wlan_objmgr_vdev *vdev, + uint8_t txpow) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } + + vdev_mlme->mgmt.generic.tx_power = txpow; +} + +/** + * wlan_vdev_mlme_get_txpower() - get tx power + * @vdev: VDEV object + * + * API to get the tx power + * + * Return: + * @txpow: tx power either configured by used or max allowed + */ +static inline uint8_t wlan_vdev_mlme_get_txpower( + struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return 0; + } + + return vdev_mlme->mgmt.generic.tx_power; +} + +/** + * wlan_vdev_mlme_set_maxrate() - set max rate + * @vdev: VDEV object + * @maxrate: configured by used or based on configured mode + * + * API to set the max rate the vdev supports + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_maxrate( + struct wlan_objmgr_vdev *vdev, + uint32_t maxrate) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } + + vdev_mlme->mgmt.rate_info.max_rate = maxrate; +} + +/** + * wlan_vdev_mlme_get_maxrate() - get max rate + * @vdev: VDEV object + * + * API to get the max rate the vdev supports + * + * Return: + * @maxrate: configured by used or based on configured mode + */ +static inline uint32_t wlan_vdev_mlme_get_maxrate( + struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return 0; + } + + return vdev_mlme->mgmt.rate_info.max_rate; +} + +/** + * wlan_vdev_mlme_set_txmgmtrate() - set txmgmtrate + * @vdev: VDEV object + * @txmgmtrate: Tx Mgmt rate + * + * API to set Mgmt Tx rate + * + * Return: void + */ +static inline void wlan_vdev_mlme_set_txmgmtrate( + struct wlan_objmgr_vdev *vdev, + uint32_t txmgmtrate) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } + vdev_mlme->mgmt.rate_info.tx_mgmt_rate = txmgmtrate; +} + +/** + * wlan_vdev_mlme_get_txmgmtrate() - get txmgmtrate + * @vdev: VDEV object + * + * API to get Mgmt Tx rate + * + * Return: + * @txmgmtrate: Tx Mgmt rate + */ +static inline uint32_t wlan_vdev_mlme_get_txmgmtrate( + struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return 0; + } + + return vdev_mlme->mgmt.rate_info.tx_mgmt_rate; +} +#else + /** * wlan_vdev_mlme_set_ssid() - set ssid * @vdev: VDEV object @@ -860,95 +1310,6 @@ static inline QDF_STATUS wlan_vdev_mlme_get_ssid( return QDF_STATUS_SUCCESS; } -/** - * wlan_vdev_obj_lock() - Acquire VDEV spinlock - * @vdev: VDEV object - * - * API to acquire VDEV lock - * Parent lock should not be taken in child lock context - * but child lock can be taken in parent lock context - * (for ex: psoc lock can't be invoked in pdev/vdev/peer lock context) - * - * Return: void - */ -static inline void wlan_vdev_obj_lock(struct wlan_objmgr_vdev *vdev) -{ - qdf_spin_lock_bh(&vdev->vdev_lock); -} - -/** - * wlan_vdev_obj_unlock() - Release VDEV spinlock - * @vdev: VDEV object - * - * API to Release VDEV lock - * - * Return: void - */ -static inline void wlan_vdev_obj_unlock(struct wlan_objmgr_vdev *vdev) -{ - qdf_spin_unlock_bh(&vdev->vdev_lock); -} - -/** - * wlan_vdev_mlme_set_bss_chan() - set bss chan - * @vdev: VDEV object - * @bss_chan: Channel - * - * API to set the BSS channel - * - * Return: void - */ -static inline void wlan_vdev_mlme_set_bss_chan(struct wlan_objmgr_vdev *vdev, - struct wlan_channel *bss_chan) -{ - vdev->vdev_mlme.bss_chan = bss_chan; -} - -/** - * wlan_vdev_mlme_get_bss_chan() - get bss chan - * @vdev: VDEV object - * - * API to get the BSS channel - * - * Return: - * @bss_chan: Channel - */ -static inline struct wlan_channel *wlan_vdev_mlme_get_bss_chan( - struct wlan_objmgr_vdev *vdev) -{ - return vdev->vdev_mlme.bss_chan; -} - -/** - * wlan_vdev_mlme_set_des_chan() - set desired chan - * @vdev: VDEV object - * @des_chan: Channel configured by user - * - * API to set the desired channel - * - * Return: void - */ -static inline void wlan_vdev_mlme_set_des_chan(struct wlan_objmgr_vdev *vdev, - struct wlan_channel *des_chan) -{ - vdev->vdev_mlme.des_chan = des_chan; -} - -/** - * wlan_vdev_mlme_get_des_chan() - get desired chan - * @vdev: VDEV object - * - * API to get the desired channel - * - * Return: - * @des_chan: Channel configured by user - */ -static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( - struct wlan_objmgr_vdev *vdev) -{ - return vdev->vdev_mlme.des_chan; -} - /** * wlan_vdev_mlme_set_nss() - set NSS * @vdev: VDEV object @@ -959,7 +1320,7 @@ static inline struct wlan_channel *wlan_vdev_mlme_get_des_chan( * Return: void */ static inline void wlan_vdev_mlme_set_nss(struct wlan_objmgr_vdev *vdev, - uint8_t nss) + uint8_t nss) { vdev->vdev_mlme.nss = nss; } @@ -988,8 +1349,9 @@ static inline uint8_t wlan_vdev_mlme_get_nss( * * Return: void */ -static inline void wlan_vdev_mlme_set_txchainmask(struct wlan_objmgr_vdev *vdev, - uint8_t chainmask) +static inline void wlan_vdev_mlme_set_txchainmask( + struct wlan_objmgr_vdev *vdev, + uint8_t chainmask) { vdev->vdev_mlme.tx_chainmask = chainmask; } @@ -1018,8 +1380,9 @@ static inline uint8_t wlan_vdev_mlme_get_txchainmask( * * Return: void */ -static inline void wlan_vdev_mlme_set_rxchainmask(struct wlan_objmgr_vdev *vdev, - uint8_t chainmask) +static inline void wlan_vdev_mlme_set_rxchainmask( + struct wlan_objmgr_vdev *vdev, + uint8_t chainmask) { vdev->vdev_mlme.rx_chainmask = chainmask; } @@ -1049,8 +1412,9 @@ static inline uint8_t wlan_vdev_mlme_get_rxchainmask( * * Return: void */ -static inline void wlan_vdev_mlme_set_txpower(struct wlan_objmgr_vdev *vdev, - uint8_t txpow) +static inline void wlan_vdev_mlme_set_txpower( + struct wlan_objmgr_vdev *vdev, + uint8_t txpow) { vdev->vdev_mlme.tx_power = txpow; } @@ -1079,8 +1443,9 @@ static inline uint8_t wlan_vdev_mlme_get_txpower( * * Return: void */ -static inline void wlan_vdev_mlme_set_maxrate(struct wlan_objmgr_vdev *vdev, - uint32_t maxrate) +static inline void wlan_vdev_mlme_set_maxrate( + struct wlan_objmgr_vdev *vdev, + uint32_t maxrate) { vdev->vdev_mlme.max_rate = maxrate; } @@ -1109,8 +1474,9 @@ static inline uint32_t wlan_vdev_mlme_get_maxrate( * * Return: void */ -static inline void wlan_vdev_mlme_set_txmgmtrate(struct wlan_objmgr_vdev *vdev, - uint32_t txmgmtrate) +static inline void wlan_vdev_mlme_set_txmgmtrate( + struct wlan_objmgr_vdev *vdev, + uint32_t txmgmtrate) { vdev->vdev_mlme.tx_mgmt_rate = txmgmtrate; } @@ -1129,6 +1495,7 @@ static inline uint32_t wlan_vdev_mlme_get_txmgmtrate( { return vdev->vdev_mlme.tx_mgmt_rate; } +#endif /** * wlan_vdev_mlme_feat_cap_set() - set feature caps diff --git a/umac/dfs/core/src/dfs.h b/umac/dfs/core/src/dfs.h index 5cf0556cdc..14daba3059 100644 --- a/umac/dfs/core/src/dfs.h +++ b/umac/dfs/core/src/dfs.h @@ -863,10 +863,6 @@ struct dfs_event_log { int16_t psidx_diff; }; -#define WLAN_DFS_RESET_TIME_S 7 -#define WLAN_DFS_WAIT (60 + WLAN_DFS_RESET_TIME_S) /* 60 seconds */ -#define WLAN_DFS_WAIT_MS ((WLAN_DFS_WAIT) * 1000) /*in MS*/ - #define WLAN_DFS_WEATHER_CHANNEL_WAIT_MIN 10 /*10 minutes*/ #define WLAN_DFS_WEATHER_CHANNEL_WAIT_S (WLAN_DFS_WEATHER_CHANNEL_WAIT_MIN * 60) #define WLAN_DFS_WEATHER_CHANNEL_WAIT_MS \ diff --git a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h index a19c655821..c5cf7b579f 100644 --- a/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h +++ b/umac/dfs/dispatcher/inc/wlan_dfs_tgt_api.h @@ -27,6 +27,10 @@ #include +#define WLAN_DFS_RESET_TIME_S 7 +#define WLAN_DFS_WAIT (60 + WLAN_DFS_RESET_TIME_S) /* 60 seconds */ +#define WLAN_DFS_WAIT_MS ((WLAN_DFS_WAIT) * 1000) /*in MS*/ + /* Command id to send test radar to firmware */ #define DFS_PHYERR_OFFLOAD_TEST_SET_RADAR 0 diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index 71d0bcc895..02eaa82560 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -189,7 +189,6 @@ struct wlan_lmac_if_ftm_tx_ops { * @vdev_mlme_detach: function to unregister events * @vdev_mlme_rsp_timer_mgmt: function to manage vdev response timer * @vdev_create_send: function to send vdev create - * @vdev_create_complete: function to send WMI cfg required for create * @vdev_start_send: function to send vdev start * @vdev_up_send: function to send vdev up * @vdev_delete_send: function to send vdev delete @@ -224,7 +223,6 @@ struct wlan_lmac_if_mlme_tx_ops { bool flag); QDF_STATUS (*vdev_create_send)(struct wlan_objmgr_vdev *vdev, struct vdev_create_params *param); - QDF_STATUS (*vdev_create_complete)(struct wlan_objmgr_vdev *vdev); QDF_STATUS (*vdev_start_send)(struct wlan_objmgr_vdev *vdev, struct vdev_start_params *param); QDF_STATUS (*vdev_up_send)(struct wlan_objmgr_vdev *vdev, diff --git a/umac/mlme/include/wlan_vdev_mlme.h b/umac/mlme/include/wlan_vdev_mlme.h index 1422aa68d5..998a7affa8 100644 --- a/umac/mlme/include/wlan_vdev_mlme.h +++ b/umac/mlme/include/wlan_vdev_mlme.h @@ -54,6 +54,8 @@ struct vdev_mlme_obj; * @beacon_interval: beacon interval * @ldpc: low density parity check value * @nss: number of spatial stream + * @nss_2g: 2.4GHz number of spatial stream + * @nss_5g: 5GHz number of spatial stream * @tsfadjust: adjusted timer sync value */ struct vdev_mlme_proto_generic { @@ -63,6 +65,8 @@ struct vdev_mlme_proto_generic { uint16_t beacon_interval; uint8_t ldpc; uint8_t nss; + uint8_t nss_2g; + uint8_t nss_5g; uint64_t tsfadjust; }; diff --git a/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c b/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c index c94e1ae26f..428f8e6fe6 100644 --- a/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c +++ b/umac/mlme/vdev_mgr/core/src/vdev_mgr_ops.c @@ -19,7 +19,7 @@ /** * DOC: vdev_mgr_ops.c * - * This header file provides API definitions for filling data structures + * This file provide API definitions for filling data structures * and sending vdev mgmt commands to target_if/mlme */ #include "vdev_mgr_ops.h" @@ -32,7 +32,6 @@ #include #include #include -#include "core/src/dfs.h" #include static QDF_STATUS vdev_mgr_create_param_update( @@ -314,7 +313,7 @@ static QDF_STATUS vdev_mgr_sta_ps_param_update( vdev = mlme_obj->vdev; param->vdev_id = wlan_vdev_get_id(vdev); - param->param = WLAN_MLME_CFG_UAPSD; + param->param_id = WLAN_MLME_CFG_UAPSD; param->value = mlme_obj->proto.sta.uapsd_cfg; return QDF_STATUS_SUCCESS; } diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h index c9e8782756..952ab9bd73 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h @@ -59,12 +59,12 @@ enum mlme_bcn_tx_rate_code { /** * struct sta_ps_params - sta ps cmd parameter * @vdev_id: vdev id - * @param: sta ps parameter + * @param_id: sta ps parameter * @value: sta ps parameter value */ struct sta_ps_params { uint32_t vdev_id; - uint32_t param; + uint32_t param_id; uint32_t value; }; diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_ucfg_api.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_ucfg_api.h index dcf2a8adbd..c02891e23e 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_ucfg_api.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_ucfg_api.h @@ -23,8 +23,8 @@ * for mlme ucfg and declarations for ucfg public APIs */ -#ifndef __UCFG_WLAN_VDEV_MLME_UCFG_H__ -#define __UCFG_WLAN_VDEV_MLME_UCFG_H__ +#ifndef __WLAN_VDEV_MGR_UCFG_API_H__ +#define __WLAN_VDEV_MGR_UCFG_API_H__ #include #include @@ -47,6 +47,7 @@ enum wlan_mlme_cfg_id { WLAN_MLME_CFG_MUBFEE, WLAN_MLME_CFG_IMLICIT_BF, WLAN_MLME_CFG_SOUNDING_DIM, + WLAN_MLME_CFG_TXBF_CAPS, WLAN_MLME_CFG_HT_CAPS, WLAN_MLME_CFG_HE_OPS, WLAN_MLME_CFG_RTS_THRESHOLD, @@ -99,30 +100,92 @@ enum wlan_mlme_cfg_id { WLAN_MLME_CFG_MAX }; +/** + * struct wlan_vdev_mgr_cfg - vdev mgr configuration + * @value: configuration value + * @tsf: tsf adjust value + * @trans_bssid: transmission bssid address + * @ssid_cfg: ssid configuration + */ struct wlan_vdev_mgr_cfg { union { uint32_t value; + uint64_t tsf; uint8_t trans_bssid[QDF_MAC_ADDR_SIZE]; struct mlme_mac_ssid ssid_cfg; - } u; + }; }; +/** + * ucfg_wlan_vdev_mgr_set_param() – ucfg MLME API to + * set value into mlme vdev mgr component + * @vdev: pointer to vdev object + * @param_id: param of type wlan_mlme_cfg_id + * @mlme_cfg: value to set into mlme vdev mgr + * + * Return: QDF_STATUS + */ QDF_STATUS ucfg_wlan_vdev_mgr_set_param(struct wlan_objmgr_vdev *vdev, enum wlan_mlme_cfg_id param_id, struct wlan_vdev_mgr_cfg mlme_cfg); +/** + * ucfg_wlan_vdev_mgr_get_param() – ucfg MLME API to + * get value from mlme vdev mgr component + * @vdev: pointer to vdev object + * @param_id: param of type wlan_mlme_cfg_id + * @param_value: pointer to store the value of mlme vdev mgr + * + * Return: void + */ void ucfg_wlan_vdev_mgr_get_param(struct wlan_objmgr_vdev *vdev, enum wlan_mlme_cfg_id param_id, uint32_t *param_value); +/** + * ucfg_wlan_vdev_mgr_get_param_ssid() – ucfg MLME API to + * get ssid from mlme vdev mgr component + * @vdev: pointer to vdev object + * @ssid: pointer to store the ssid + * @ssid_len: pointer to store the ssid length value + * + * Return: void + */ void ucfg_wlan_vdev_mgr_get_param_ssid(struct wlan_objmgr_vdev *vdev, uint8_t *ssid, uint8_t *ssid_len); +/** + * ucfg_wlan_vdev_mgr_get_beacon_buffer() – ucfg MLME API to + * get beacon buffer from mlme vdev mgr component + * @vdev: pointer to vdev object + * @buf: pointer to store the beacon buffer + * + * Return: void + */ void ucfg_wlan_vdev_mgr_get_beacon_buffer(struct wlan_objmgr_vdev *vdev, qdf_nbuf_t buf); +/** + * ucfg_wlan_vdev_mgr_get_trans_bssid() – ucfg MLME API to + * get transmission bssid from mlme vdev mgr component + * @vdev: pointer to vdev object + * @addr: pointer to store the transmission bssid + * + * Return: void + */ void ucfg_wlan_vdev_mgr_get_trans_bssid(struct wlan_objmgr_vdev *vdev, uint8_t *addr); -#endif /* __UCFG_WLAN_VDEV_MLME_UCFG_H__ */ +/** + * ucfg_wlan_vdev_mgr_get_tsf_adjust() – ucfg MLME API to + * get tsf_adjust from mlme vdev mgr component + * @vdev: pointer to vdev object + * @tsf_adjust: pointer to store the tsf adjust value + * + * Return: void + */ +void ucfg_wlan_vdev_mgr_get_tsf_adjust(struct wlan_objmgr_vdev *vdev, + uint64_t *tsf_adjust); + +#endif /* __WLAN_VDEV_MLME_UCFG_H__ */ diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c index fdcdb341a9..0d84410960 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c @@ -34,6 +34,7 @@ #include #include #include +#include static inline struct wlan_lmac_if_mlme_tx_ops *wlan_vdev_mlme_get_lmac_txops(struct wlan_objmgr_vdev *vdev) @@ -128,12 +129,56 @@ tgt_vdev_mgr_create_end: return status; } -QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *mlme_obj) +QDF_STATUS tgt_vdev_mgr_create_complete(struct vdev_mlme_obj *vdev_mlme) { struct wlan_objmgr_vdev *vdev; + enum QDF_OPMODE opmode; + struct vdev_set_params param = {0}; + struct wlan_lmac_if_mlme_tx_ops *txops; + struct vdev_mlme_inactivity_params *inactivity; + QDF_STATUS status = QDF_STATUS_SUCCESS; - vdev = mlme_obj->vdev; - return QDF_STATUS_SUCCESS; + vdev = vdev_mlme->vdev; + txops = wlan_vdev_mlme_get_lmac_txops(vdev); + if (!txops || !txops->vdev_set_param_send) { + mlme_err("No Tx Ops"); + return QDF_STATUS_E_INVAL; + } + + opmode = wlan_vdev_mlme_get_opmode(vdev); + inactivity = &vdev_mlme->mgmt.inactivity_params; + if (opmode == QDF_SAP_MODE) { + param.vdev_id = wlan_vdev_get_id(vdev); + + param.param_value = vdev_mlme->mgmt.rate_info.bcn_tx_rate; + param.param_id = WLAN_MLME_CFG_BCN_TX_RATE; + status = txops->vdev_set_param_send(vdev, ¶m); + if (QDF_IS_STATUS_ERROR(status)) + mlme_err("Failed to set beacon rate!"); + + param.param_value = + inactivity->keepalive_min_idle_inactive_time_secs; + param.param_id = WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME; + status = txops->vdev_set_param_send(vdev, ¶m); + if (QDF_IS_STATUS_ERROR(status)) + mlme_err("Failed to set min idle inactive time!"); + + param.param_value = + inactivity->keepalive_max_idle_inactive_time_secs; + param.param_id = WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME; + status = txops->vdev_set_param_send(vdev, ¶m); + if (QDF_IS_STATUS_ERROR(status)) + mlme_err("Failed to set max idle inactive time!"); + + param.param_value = + inactivity->keepalive_max_unresponsive_time_secs; + param.param_id = WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME; + status = txops->vdev_set_param_send(vdev, ¶m); + if (QDF_IS_STATUS_ERROR(status)) + mlme_err("Failed to set max unresponsive inactive time!"); + } + + return status; } QDF_STATUS tgt_vdev_mgr_start_send( diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_ucfg_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_ucfg_api.c index 2f7f49ae82..1d28297428 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_ucfg_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_ucfg_api.c @@ -27,6 +27,7 @@ #include "include/wlan_vdev_mlme.h" #include #include +#include void ucfg_wlan_vdev_mgr_get_param_ssid( struct wlan_objmgr_vdev *vdev, @@ -96,6 +97,27 @@ void ucfg_wlan_vdev_mgr_get_trans_bssid( qdf_export_symbol(ucfg_wlan_vdev_mgr_get_trans_bssid); +void ucfg_wlan_vdev_mgr_get_tsf_adjust( + struct wlan_objmgr_vdev *vdev, + uint64_t *tsf_adjust) +{ + struct vdev_mlme_obj *vdev_mlme; + struct vdev_mlme_proto *mlme_proto; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } + + mlme_proto = &vdev_mlme->proto; + + *tsf_adjust = mlme_proto->generic.tsfadjust; +} + +qdf_export_symbol(ucfg_wlan_vdev_mgr_get_tsf_adjust); + QDF_STATUS ucfg_wlan_vdev_mgr_set_param( struct wlan_objmgr_vdev *vdev, enum wlan_mlme_cfg_id param_id, diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_utils_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_utils_api.c index 77b3083372..7bb28c841a 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_utils_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_utils_api.c @@ -63,6 +63,10 @@ wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme, int ret = QDF_STATUS_SUCCESS; struct vdev_set_params param = {0}; + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return QDF_STATUS_E_FAILURE; + } vdev = vdev_mlme->vdev; mlme_proto = &vdev_mlme->proto; mlme_mgmt = &vdev_mlme->mgmt; @@ -70,175 +74,174 @@ wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme, switch (param_id) { case WLAN_MLME_CFG_DTIM_PERIOD: - mlme_proto->generic.dtim_period = mlme_cfg.u.value; + mlme_proto->generic.dtim_period = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_SLOT_TIME: - mlme_proto->generic.slot_time = mlme_cfg.u.value; + mlme_proto->generic.slot_time = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_PROTECTION_MODE: - mlme_proto->generic.protection_mode = mlme_cfg.u.value; + mlme_proto->generic.protection_mode = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_BEACON_INTERVAL: - mlme_proto->generic.beacon_interval = mlme_cfg.u.value; + mlme_proto->generic.beacon_interval = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_LDPC: - mlme_proto->generic.ldpc = mlme_cfg.u.value; + mlme_proto->generic.ldpc = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_NSS: - mlme_proto->generic.nss = mlme_cfg.u.value; + mlme_proto->generic.nss = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_TSF_ADJUST: - mlme_proto->generic.tsfadjust = mlme_cfg.u.value; + mlme_proto->generic.tsfadjust = mlme_cfg.tsf; break; case WLAN_MLME_CFG_ASSOC_ID: - mlme_proto->sta.assoc_id = mlme_cfg.u.value; + mlme_proto->sta.assoc_id = mlme_cfg.value; break; case WLAN_MLME_CFG_VHT_CAPS: - mlme_proto->vht_info.caps = mlme_cfg.u.value; + mlme_proto->vht_info.caps = mlme_cfg.value; break; case WLAN_MLME_CFG_SUBFER: - mlme_proto->vht_info.subfer = mlme_cfg.u.value; - is_wmi_cmd = 1; + mlme_proto->vht_info.subfer = mlme_cfg.value; break; case WLAN_MLME_CFG_MUBFER: - mlme_proto->vht_info.mubfer = mlme_cfg.u.value; - is_wmi_cmd = 1; + mlme_proto->vht_info.mubfer = mlme_cfg.value; break; case WLAN_MLME_CFG_SUBFEE: - mlme_proto->vht_info.subfee = mlme_cfg.u.value; - is_wmi_cmd = 1; + mlme_proto->vht_info.subfee = mlme_cfg.value; break; case WLAN_MLME_CFG_MUBFEE: - mlme_proto->vht_info.mubfee = mlme_cfg.u.value; - is_wmi_cmd = 1; + mlme_proto->vht_info.mubfee = mlme_cfg.value; break; case WLAN_MLME_CFG_IMLICIT_BF: - mlme_proto->vht_info.implicit_bf = mlme_cfg.u.value; - is_wmi_cmd = 1; + mlme_proto->vht_info.implicit_bf = mlme_cfg.value; break; case WLAN_MLME_CFG_SOUNDING_DIM: - mlme_proto->vht_info.sounding_dimension = mlme_cfg.u.value; + mlme_proto->vht_info.sounding_dimension = mlme_cfg.value; + break; + case WLAN_MLME_CFG_TXBF_CAPS: is_wmi_cmd = 1; break; case WLAN_MLME_CFG_HT_CAPS: - mlme_proto->ht_info.ht_caps = mlme_cfg.u.value; + mlme_proto->ht_info.ht_caps = mlme_cfg.value; break; case WLAN_MLME_CFG_HE_OPS: - mlme_proto->he_ops_info.he_ops = mlme_cfg.u.value; + mlme_proto->he_ops_info.he_ops = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_RTS_THRESHOLD: - mlme_mgmt->generic.rts_threshold = mlme_cfg.u.value; + mlme_mgmt->generic.rts_threshold = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_FRAG_THRESHOLD: - mlme_mgmt->generic.frag_threshold = mlme_cfg.u.value; + mlme_mgmt->generic.frag_threshold = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_PROBE_DELAY: - mlme_mgmt->generic.probe_delay = mlme_cfg.u.value; + mlme_mgmt->generic.probe_delay = mlme_cfg.value; break; case WLAN_MLME_CFG_REPEAT_PROBE_TIME: - mlme_mgmt->generic.repeat_probe_time = mlme_cfg.u.value; + mlme_mgmt->generic.repeat_probe_time = mlme_cfg.value; break; case WLAN_MLME_CFG_DROP_UNENCRY: - mlme_mgmt->generic.drop_unencry = mlme_cfg.u.value; + mlme_mgmt->generic.drop_unencry = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_TX_PWR_LIMIT: - mlme_mgmt->generic.tx_pwrlimit = mlme_cfg.u.value; + mlme_mgmt->generic.tx_pwrlimit = mlme_cfg.value; break; case WLAN_MLME_CFG_TX_POWER: - mlme_mgmt->generic.tx_power = mlme_cfg.u.value; + mlme_mgmt->generic.tx_power = mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_AMPDU: - mlme_mgmt->generic.ampdu = mlme_cfg.u.value; + mlme_mgmt->generic.ampdu = mlme_cfg.value; + mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_AMSDU: - mlme_mgmt->generic.amsdu = mlme_cfg.u.value; + mlme_mgmt->generic.amsdu = mlme_cfg.value; + mlme_cfg.value = (mlme_cfg.value << 8) + 0xFF; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_BMISS_FIRST_BCNT: - inactivity_params->bmiss_first_bcnt = mlme_cfg.u.value; + inactivity_params->bmiss_first_bcnt = mlme_cfg.value; break; case WLAN_MLME_CFG_BMISS_FINAL_BCNT: - inactivity_params->bmiss_final_bcnt = mlme_cfg.u.value; + inactivity_params->bmiss_final_bcnt = mlme_cfg.value; break; case WLAN_MLME_CFG_MIN_IDLE_INACTIVE_TIME: inactivity_params->keepalive_min_idle_inactive_time_secs = - mlme_cfg.u.value; + mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_MAX_IDLE_INACTIVE_TIME: inactivity_params->keepalive_max_idle_inactive_time_secs = - mlme_cfg.u.value; + mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_MAX_UNRESPONSIVE_INACTIVE_TIME: inactivity_params->keepalive_max_unresponsive_time_secs = - mlme_cfg.u.value; + mlme_cfg.value; is_wmi_cmd = 1; break; case WLAN_MLME_CFG_RATE_FLAGS: - mlme_mgmt->rate_info.rate_flags = mlme_cfg.u.value; + mlme_mgmt->rate_info.rate_flags = mlme_cfg.value; break; case WLAN_MLME_CFG_PER_BAND_TX_MGMT_RATE: - mlme_mgmt->rate_info.per_band_tx_mgmt_rate = mlme_cfg.u.value; + mlme_mgmt->rate_info.per_band_tx_mgmt_rate = mlme_cfg.value; break; case WLAN_MLME_CFG_MAX_RATE: - mlme_mgmt->rate_info.max_rate = mlme_cfg.u.value; + mlme_mgmt->rate_info.max_rate = mlme_cfg.value; break; case WLAN_MLME_CFG_TX_MGMT_RATE: - mlme_mgmt->rate_info.tx_mgmt_rate = mlme_cfg.u.value; + mlme_mgmt->rate_info.tx_mgmt_rate = mlme_cfg.value; break; case WLAN_MLME_CFG_TX_CHAINMASK: - mlme_mgmt->chainmask_info.tx_chainmask = mlme_cfg.u.value; + mlme_mgmt->chainmask_info.tx_chainmask = mlme_cfg.value; break; case WLAN_MLME_CFG_RX_CHAINMASK: - mlme_mgmt->chainmask_info.rx_chainmask = mlme_cfg.u.value; + mlme_mgmt->chainmask_info.rx_chainmask = mlme_cfg.value; break; case WLAN_MLME_CFG_PKT_POWERSAVE: - mlme_mgmt->powersave_info.packet_powersave = mlme_cfg.u.value; + mlme_mgmt->powersave_info.packet_powersave = mlme_cfg.value; break; case WLAN_MLME_CFG_MAX_LI_OF_MODDTIM: - mlme_mgmt->powersave_info.max_li_of_moddtim = mlme_cfg.u.value; + mlme_mgmt->powersave_info.max_li_of_moddtim = mlme_cfg.value; break; case WLAN_MLME_CFG_DYNDTIM_CNT: - mlme_mgmt->powersave_info.dyndtim_cnt = mlme_cfg.u.value; + mlme_mgmt->powersave_info.dyndtim_cnt = mlme_cfg.value; break; case WLAN_MLME_CFG_LISTEN_INTERVAL: - mlme_mgmt->powersave_info.listen_interval = mlme_cfg.u.value; + mlme_mgmt->powersave_info.listen_interval = mlme_cfg.value; break; case WLAN_MLME_CFG_MODDTIM_CNT: - mlme_mgmt->powersave_info.moddtim_cnt = mlme_cfg.u.value; + mlme_mgmt->powersave_info.moddtim_cnt = mlme_cfg.value; break; case WLAN_MLME_CFG_PROILE_IDX: - mlme_mgmt->mbss_11ax.profile_idx = mlme_cfg.u.value; + mlme_mgmt->mbss_11ax.profile_idx = mlme_cfg.value; break; case WLAN_MLME_CFG_PROFILE_NUM: - mlme_mgmt->mbss_11ax.profile_num = mlme_cfg.u.value; + mlme_mgmt->mbss_11ax.profile_num = mlme_cfg.value; break; case WLAN_MLME_CFG_MBSSID_FLAGS: - mlme_mgmt->mbss_11ax.mbssid_flags = mlme_cfg.u.value; + mlme_mgmt->mbss_11ax.mbssid_flags = mlme_cfg.value; break; case WLAN_MLME_CFG_VDEVID_TRANS: - mlme_mgmt->mbss_11ax.vdevid_trans = mlme_cfg.u.value; + mlme_mgmt->mbss_11ax.vdevid_trans = mlme_cfg.value; break; case WLAN_MLME_CFG_SSID: - if (mlme_cfg.u.ssid_cfg.length <= WLAN_SSID_MAX_LEN) { + if (mlme_cfg.ssid_cfg.length <= WLAN_SSID_MAX_LEN) { qdf_mem_copy(mlme_mgmt->generic.ssid, - mlme_cfg.u.ssid_cfg.mac_ssid, - mlme_cfg.u.ssid_cfg.length); + mlme_cfg.ssid_cfg.mac_ssid, + mlme_cfg.ssid_cfg.length); mlme_mgmt->generic.ssid_len = - mlme_cfg.u.ssid_cfg.length; + mlme_cfg.ssid_cfg.length; } else { mlme_mgmt->generic.ssid_len = 0; } @@ -246,37 +249,37 @@ wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme, break; case WLAN_MLME_CFG_TRANS_BSSID: qdf_mem_copy(mlme_mgmt->mbss_11ax.trans_bssid, - mlme_cfg.u.trans_bssid, QDF_MAC_ADDR_SIZE); + mlme_cfg.trans_bssid, QDF_MAC_ADDR_SIZE); break; case WLAN_MLME_CFG_TYPE: - mlme_mgmt->generic.type = mlme_cfg.u.value; + mlme_mgmt->generic.type = mlme_cfg.value; break; case WLAN_MLME_CFG_SUBTYPE: - mlme_mgmt->generic.subtype = mlme_cfg.u.value; + mlme_mgmt->generic.subtype = mlme_cfg.value; break; case WLAN_MLME_CFG_UAPSD: - mlme_proto->sta.uapsd_cfg = mlme_cfg.u.value; + mlme_proto->sta.uapsd_cfg = mlme_cfg.value; break; case WLAN_MLME_CFG_TX_DECAP_TYPE: - mlme_mgmt->generic.tx_decap_type = mlme_cfg.u.value; + mlme_mgmt->generic.tx_decap_type = mlme_cfg.value; break; case WLAN_MLME_CFG_RX_DECAP_TYPE: - mlme_mgmt->generic.rx_decap_type = mlme_cfg.u.value; + mlme_mgmt->generic.rx_decap_type = mlme_cfg.value; break; case WLAN_MLME_CFG_RATEMASK_TYPE: - mlme_mgmt->rate_info.type = mlme_cfg.u.value; + mlme_mgmt->rate_info.type = mlme_cfg.value; break; case WLAN_MLME_CFG_RATEMASK_LOWER32: - mlme_mgmt->rate_info.lower32 = mlme_cfg.u.value; + mlme_mgmt->rate_info.lower32 = mlme_cfg.value; break; case WLAN_MLME_CFG_RATEMASK_HIGHER32: - mlme_mgmt->rate_info.higher32 = mlme_cfg.u.value; + mlme_mgmt->rate_info.higher32 = mlme_cfg.value; break; case WLAN_MLME_CFG_RATEMASK_LOWER32_2: - mlme_mgmt->rate_info.lower32_2 = mlme_cfg.u.value; + mlme_mgmt->rate_info.lower32_2 = mlme_cfg.value; break; case WLAN_MLME_CFG_BCN_TX_RATE: - mlme_mgmt->rate_info.bcn_tx_rate = mlme_cfg.u.value; + mlme_mgmt->rate_info.bcn_tx_rate = mlme_cfg.value; break; default: break; @@ -285,7 +288,7 @@ wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme, if (is_wmi_cmd) { param.param_id = param_id; param.vdev_id = wlan_vdev_get_id(vdev); - param.param_value = mlme_cfg.u.value; + param.param_value = mlme_cfg.value; ret = tgt_vdev_mgr_set_param_send(vdev_mlme, ¶m); } @@ -302,6 +305,10 @@ void wlan_util_vdev_mlme_get_param(struct vdev_mlme_obj *vdev_mlme, struct vdev_mlme_mgmt *mlme_mgmt; struct vdev_mlme_inactivity_params *inactivity_params; + if (!vdev_mlme) { + mlme_err("VDEV MLME is NULL"); + return; + } mlme_proto = &vdev_mlme->proto; mlme_mgmt = &vdev_mlme->mgmt; inactivity_params = &mlme_mgmt->inactivity_params; @@ -325,9 +332,6 @@ void wlan_util_vdev_mlme_get_param(struct vdev_mlme_obj *vdev_mlme, case WLAN_MLME_CFG_NSS: *value = mlme_proto->generic.nss; break; - case WLAN_MLME_CFG_TSF_ADJUST: - *value = mlme_proto->generic.tsfadjust; - break; case WLAN_MLME_CFG_ASSOC_ID: *value = mlme_proto->sta.assoc_id; break; diff --git a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c index b72c4622aa..538ec1c922 100644 --- a/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c +++ b/umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mlme_api.c @@ -44,6 +44,8 @@ struct vdev_mlme_obj *wlan_vdev_mlme_get_cmpt_obj(struct wlan_objmgr_vdev *vdev) return vdev_mlme; } +qdf_export_symbol(wlan_vdev_mlme_get_cmpt_obj); + void wlan_vdev_mlme_set_ext_hdl(struct wlan_objmgr_vdev *vdev, void *ext_hdl) { struct vdev_mlme_obj *vdev_mlme; diff --git a/wmi/src/wmi_unified_tlv.c b/wmi/src/wmi_unified_tlv.c index bf77513351..4a424acba7 100644 --- a/wmi/src/wmi_unified_tlv.c +++ b/wmi/src/wmi_unified_tlv.c @@ -1469,14 +1469,23 @@ static QDF_STATUS send_set_sta_ps_param_cmd_tlv(wmi_unified_t wmi_handle, WMITLV_GET_STRUCT_TLVLEN (wmi_sta_powersave_param_cmd_fixed_param)); cmd->vdev_id = param->vdev_id; +#ifdef CMN_VDEV_MGR_TGT_IF_ENABLE + cmd->param = param->param_id; +#else cmd->param = param->param; +#endif cmd->value = param->value; wmi_mtrace(WMI_STA_POWERSAVE_PARAM_CMDID, cmd->vdev_id, 0); if (wmi_unified_cmd_send(wmi_handle, buf, len, WMI_STA_POWERSAVE_PARAM_CMDID)) { +#ifdef CMN_VDEV_MGR_TGT_IF_ENABLE + WMI_LOGE("Set Sta Ps param Failed vdevId %d Param %d val %d", + param->vdev_id, param->param_id, param->value); +#else WMI_LOGE("Set Sta Ps param Failed vdevId %d Param %d val %d", param->vdev_id, param->param, param->value); +#endif wmi_buf_free(buf); return QDF_STATUS_E_FAILURE; }