diff --git a/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h b/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h index 3adc0055cc56..7722ef009c8d 100644 --- a/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h +++ b/components/mlme/core/inc/wlan_mlme_vdev_mgr_interface.h @@ -167,6 +167,43 @@ mlme_set_mbssid_info(struct wlan_objmgr_vdev *vdev, void mlme_get_mbssid_info(struct wlan_objmgr_vdev *vdev, struct vdev_mlme_mbss_11ax *mbss_11ax); +/** + * mlme_set_tx_power() - set tx power + * @vdev: vdev pointer + * @tx_power: tx power to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS mlme_set_tx_power(struct wlan_objmgr_vdev *vdev, + int8_t tx_power); + +/** + * mlme_get_tx_power() - get tx power + * @vdev: vdev pointer + * @tx_power: tx power info + * + * Return: None + */ +int8_t mlme_get_tx_power(struct wlan_objmgr_vdev *vdev); + +/** + * mlme_get_max_reg_power() - get max reg power + * @vdev: vdev pointer + * + * Return: max reg power + */ +int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev); + +/** + * mlme_set_max_reg_power() - set max reg power + * @vdev: vdev pointer + * @max_tx_power: max tx power to be set + * + * Return: QDF_STATUS + */ +QDF_STATUS mlme_set_max_reg_power(struct wlan_objmgr_vdev *vdev, + int8_t max_reg_power); + /** * mlme_is_vdev_in_beaconning_mode() - check if vdev is beaconing mode * @vdev_opmode: vdev opmode diff --git a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c index c865c86342e2..4712b8558fa5 100644 --- a/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c +++ b/components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c @@ -834,6 +834,66 @@ void mlme_get_mbssid_info(struct wlan_objmgr_vdev *vdev, mbss_11ax = &vdev_mlme->mgmt.mbss_11ax; } +QDF_STATUS mlme_set_tx_power(struct wlan_objmgr_vdev *vdev, + int8_t tx_power) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + + if (!vdev_mlme) { + mlme_legacy_err("vdev component object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + vdev_mlme->mgmt.generic.tx_power = tx_power; + + return QDF_STATUS_SUCCESS; +} + +int8_t mlme_get_tx_power(struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_legacy_err("vdev component object is NULL"); + return QDF_STATUS_E_INVAL; + } + + return vdev_mlme->mgmt.generic.tx_power; +} + +QDF_STATUS mlme_set_max_reg_power(struct wlan_objmgr_vdev *vdev, + int8_t max_reg_power) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + + if (!vdev_mlme) { + mlme_legacy_err("vdev component object is NULL"); + return QDF_STATUS_E_FAILURE; + } + + vdev_mlme->mgmt.generic.maxregpower = max_reg_power; + + return QDF_STATUS_SUCCESS; +} + +int8_t mlme_get_max_reg_power(struct wlan_objmgr_vdev *vdev) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) { + mlme_legacy_err("vdev component object is NULL"); + return QDF_STATUS_E_INVAL; + } + + return vdev_mlme->mgmt.generic.maxregpower; +} + /** * vdevmgr_mlme_ext_hdl_create () - Create mlme legacy priv object * @vdev_mlme: vdev mlme object diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h index 320b28694ff6..2371c28439f4 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -716,8 +716,6 @@ struct wma_invalid_peer_params { * @nss: nss value * @is_channel_switch: is channel switch * @pause_bitmap: pause bitmap - * @tx_power: tx power in dbm - * @max_tx_power: max tx power in dbm * @nwType: network type (802.11a/b/g/n/ac) * @staKeyParams: sta key parameters * @ps_enabled: is powersave enable/disable @@ -771,8 +769,6 @@ struct wma_txrx_node { enum tx_rate_info rate_flags; uint8_t nss; uint16_t pause_bitmap; - int8_t tx_power; - int8_t max_tx_power; uint32_t nwType; tSetStaKeyParams *staKeyParams; uint32_t peer_count; diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 925b8017c13a..748ab7f0fb5a 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -3345,7 +3345,7 @@ wma_vdev_set_bss_params(tp_wma_handle wma, int vdev_id, if (QDF_IS_STATUS_ERROR(ret)) WMA_LOGE("failed to set WMI_VDEV_PARAM_TX_PWRLIMIT"); else - intr[vdev_id].max_tx_power = maxTxPower; + mlme_set_max_reg_power(intr[vdev_id].vdev, maxTxPower); /* Slot time */ if (shortSlotTimeSupported) diff --git a/core/wma/src/wma_main.c b/core/wma/src/wma_main.c index 726b4614f668..e674463799a7 100644 --- a/core/wma/src/wma_main.c +++ b/core/wma/src/wma_main.c @@ -2082,8 +2082,6 @@ static void wma_state_info_dump(char **buf_ptr, uint16_t *size) "aid %d\n" "rate_flags %d\n" "nss %d\n" - "tx_power %d\n" - "max_tx_power %d\n" "nwType %d\n" "tx_streams %d", vdev_id, @@ -2109,8 +2107,6 @@ static void wma_state_info_dump(char **buf_ptr, uint16_t *size) iface->aid, rate_flag, iface->nss, - iface->tx_power, - iface->max_tx_power, iface->nwType, iface->tx_streams); wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); diff --git a/core/wma/src/wma_power.c b/core/wma/src/wma_power.c index f1820678660c..be1d3e97e300 100644 --- a/core/wma/src/wma_power.c +++ b/core/wma/src/wma_power.c @@ -337,6 +337,8 @@ void wma_set_tx_power(WMA_HANDLE handle, uint8_t vdev_id; QDF_STATUS ret = QDF_STATUS_E_FAILURE; struct cdp_vdev *vdev; + int8_t max_reg_power; + struct wma_txrx_node *iface; if (tx_pwr_params->dev_mode == QDF_SAP_MODE || tx_pwr_params->dev_mode == QDF_P2P_GO_MODE) { @@ -362,23 +364,25 @@ void wma_set_tx_power(WMA_HANDLE handle, return; } + iface = &wma_handle->interfaces[vdev_id]; if (tx_pwr_params->power == 0) { /* set to default. Since the app does not care the tx power * we keep the previous setting */ - wma_handle->interfaces[vdev_id].tx_power = 0; + mlme_set_tx_power(iface->vdev, tx_pwr_params->power); ret = 0; goto end; } - if (wma_handle->interfaces[vdev_id].max_tx_power != 0) { + + max_reg_power = mlme_get_max_reg_power(iface->vdev); + + if (max_reg_power != 0) { /* make sure tx_power less than max_tx_power */ - if (tx_pwr_params->power > - wma_handle->interfaces[vdev_id].max_tx_power) { - tx_pwr_params->power = - wma_handle->interfaces[vdev_id].max_tx_power; + if (tx_pwr_params->power > max_reg_power) { + tx_pwr_params->power = max_reg_power; } } - if (wma_handle->interfaces[vdev_id].tx_power != tx_pwr_params->power) { + if (mlme_get_tx_power(iface->vdev) != tx_pwr_params->power) { /* tx_power changed, Push the tx_power to FW */ WMA_LOGI("%s: Set TX pwr limit [WMI_VDEV_PARAM_TX_PWRLIMIT] to %d", @@ -387,8 +391,7 @@ void wma_set_tx_power(WMA_HANDLE handle, WMI_VDEV_PARAM_TX_PWRLIMIT, tx_pwr_params->power); if (ret == QDF_STATUS_SUCCESS) - wma_handle->interfaces[vdev_id].tx_power = - tx_pwr_params->power; + mlme_set_tx_power(iface->vdev, tx_pwr_params->power); } else { /* no tx_power change */ ret = QDF_STATUS_SUCCESS; @@ -414,6 +417,8 @@ void wma_set_max_tx_power(WMA_HANDLE handle, QDF_STATUS ret = QDF_STATUS_E_FAILURE; struct cdp_vdev *vdev; int8_t prev_max_power; + int8_t max_reg_power; + struct wma_txrx_node *iface; vdev = wma_find_vdev_by_addr(wma_handle, tx_pwr_params->bssId.bytes, &vdev_id); @@ -436,27 +441,30 @@ void wma_set_max_tx_power(WMA_HANDLE handle, return; } - if (wma_handle->interfaces[vdev_id].max_tx_power == - tx_pwr_params->power) { + iface = &wma_handle->interfaces[vdev_id]; + if (mlme_get_max_reg_power(iface->vdev) == tx_pwr_params->power) { ret = QDF_STATUS_SUCCESS; goto end; } - prev_max_power = wma_handle->interfaces[vdev_id].max_tx_power; - wma_handle->interfaces[vdev_id].max_tx_power = tx_pwr_params->power; - if (wma_handle->interfaces[vdev_id].max_tx_power == 0) { + prev_max_power = mlme_get_max_reg_power(iface->vdev); + + mlme_set_max_reg_power(iface->vdev, tx_pwr_params->power); + + max_reg_power = mlme_get_max_reg_power(iface->vdev); + + if (max_reg_power == 0) { ret = QDF_STATUS_SUCCESS; goto end; } WMA_LOGI("Set MAX TX pwr limit [WMI_VDEV_PARAM_TX_PWRLIMIT] to %d", - wma_handle->interfaces[vdev_id].max_tx_power); + max_reg_power); ret = wma_vdev_set_param(wma_handle->wmi_handle, vdev_id, WMI_VDEV_PARAM_TX_PWRLIMIT, - wma_handle->interfaces[vdev_id].max_tx_power); + max_reg_power); if (ret == QDF_STATUS_SUCCESS) - wma_handle->interfaces[vdev_id].tx_power = - wma_handle->interfaces[vdev_id].max_tx_power; + mlme_set_tx_power(iface->vdev, max_reg_power); else - wma_handle->interfaces[vdev_id].max_tx_power = prev_max_power; + mlme_set_max_reg_power(iface->vdev, prev_max_power); end: qdf_mem_free(tx_pwr_params); if (QDF_IS_STATUS_ERROR(ret))