qcacld-3.0: Dynamic ratemask update
Add support for dynamic ratemask update. Change-Id: I9aede4bdcd399af6c8e827f813016df63d7b8ab1 CRs-Fixed: 3112489
This commit is contained in:

committed by
Madan Koyyalamudi

parent
cf785f08ab
commit
0a8f7d7347
@@ -3433,4 +3433,18 @@ wlan_mlme_get_tx_retry_multiplier(struct wlan_objmgr_psoc *psoc,
|
|||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
|
wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
|
||||||
uint32_t *value);
|
uint32_t *value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_mlme_update_ratemask_params() - Update ratemask params
|
||||||
|
*
|
||||||
|
* @vdev: pointer to vdev object
|
||||||
|
* @num_ratemask: number of rate masks
|
||||||
|
* @rate_params: pointer to ratemask structure
|
||||||
|
*
|
||||||
|
* Return: QDF Status
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev,
|
||||||
|
uint8_t num_ratemask,
|
||||||
|
struct config_ratemask_params *rate_params);
|
||||||
#endif /* _WLAN_MLME_API_H_ */
|
#endif /* _WLAN_MLME_API_H_ */
|
||||||
|
@@ -4417,4 +4417,22 @@ bool ucfg_mlme_get_coex_unsafe_chan_reg_disable(
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_set_ratemask_params() - Set ratemask config
|
||||||
|
* @vdev: pointer to vdev object
|
||||||
|
* @num_ratemask: number of ratemask params
|
||||||
|
* @rate_params: ratemask params
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline QDF_STATUS
|
||||||
|
ucfg_set_ratemask_params(struct wlan_objmgr_vdev *vdev,
|
||||||
|
uint8_t num_ratemask,
|
||||||
|
struct config_ratemask_params *rate_params)
|
||||||
|
{
|
||||||
|
return wlan_mlme_update_ratemask_params(vdev, num_ratemask,
|
||||||
|
rate_params);
|
||||||
|
}
|
||||||
#endif /* _WLAN_MLME_UCFG_API_H_ */
|
#endif /* _WLAN_MLME_UCFG_API_H_ */
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
#include "wlan_crypto_global_api.h"
|
#include "wlan_crypto_global_api.h"
|
||||||
#include "wlan_utility.h"
|
#include "wlan_utility.h"
|
||||||
#include "wlan_policy_mgr_ucfg.h"
|
#include "wlan_policy_mgr_ucfg.h"
|
||||||
|
#include "wlan_vdev_mgr_utils_api.h"
|
||||||
|
|
||||||
/* quota in milliseconds */
|
/* quota in milliseconds */
|
||||||
#define MCC_DUTY_CYCLE 70
|
#define MCC_DUTY_CYCLE 70
|
||||||
@@ -5389,5 +5390,58 @@ wlan_mlme_get_channel_bonding_5ghz(struct wlan_objmgr_psoc *psoc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
*value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz;
|
*value = mlme_obj->cfg.feature_flags.channel_bonding_mode_5ghz;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_mlme_update_ratemask_params(struct wlan_objmgr_vdev *vdev,
|
||||||
|
uint8_t num_ratemask,
|
||||||
|
struct config_ratemask_params *rate_params)
|
||||||
|
{
|
||||||
|
struct vdev_mlme_obj *vdev_mlme;
|
||||||
|
struct vdev_mlme_rate_info *rate_info;
|
||||||
|
QDF_STATUS ret;
|
||||||
|
uint8_t i = 0;
|
||||||
|
uint8_t index;
|
||||||
|
|
||||||
|
vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
|
||||||
|
if (!vdev_mlme)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
rate_info = &vdev_mlme->mgmt.rate_info;
|
||||||
|
while (i < num_ratemask) {
|
||||||
|
index = rate_params[i].type;
|
||||||
|
if (index >= WLAN_VDEV_RATEMASK_TYPE_MAX) {
|
||||||
|
mlme_legacy_err("Invalid ratemask type");
|
||||||
|
++i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rate_info->ratemask_params[index].lower32 !=
|
||||||
|
rate_params[i].lower32 ||
|
||||||
|
rate_info->ratemask_params[index].lower32_2 !=
|
||||||
|
rate_params[i].lower32_2 ||
|
||||||
|
rate_info->ratemask_params[index].higher32 !=
|
||||||
|
rate_params[i].higher32 ||
|
||||||
|
rate_info->ratemask_params[index].higher32_2 !=
|
||||||
|
rate_params[i].higher32_2) {
|
||||||
|
rate_info->ratemask_params[index].lower32 =
|
||||||
|
rate_params[i].lower32;
|
||||||
|
rate_info->ratemask_params[index].higher32 =
|
||||||
|
rate_params[i].higher32;
|
||||||
|
rate_info->ratemask_params[index].lower32_2 =
|
||||||
|
rate_params[i].lower32_2;
|
||||||
|
rate_info->ratemask_params[index].higher32_2 =
|
||||||
|
rate_params[i].higher32_2;
|
||||||
|
ret = wlan_util_vdev_mlme_set_ratemask_config(vdev_mlme,
|
||||||
|
index);
|
||||||
|
if (ret != QDF_STATUS_SUCCESS)
|
||||||
|
mlme_legacy_err("ratemask config failed");
|
||||||
|
} else {
|
||||||
|
mlme_legacy_debug("Ratemask same as configured mask");
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@@ -6041,6 +6041,189 @@ wlan_hdd_cfg80211_set_ext_roam_params(struct wiphy *wiphy,
|
|||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define RATEMASK_PARAMS_TYPE_MAX 4
|
||||||
|
#define RATEMASK_PARAMS_MAX QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_MAX
|
||||||
|
const struct nla_policy wlan_hdd_set_ratemask_param_policy[
|
||||||
|
RATEMASK_PARAMS_MAX + 1] = {
|
||||||
|
[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_LIST] =
|
||||||
|
VENDOR_NLA_POLICY_NESTED(wlan_hdd_set_ratemask_param_policy),
|
||||||
|
[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_TYPE] = {.type = NLA_U8},
|
||||||
|
[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_BITMAP] = {.type = NLA_BINARY,
|
||||||
|
.len = 128},
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* hdd_set_ratemask_params() - parse ratemask params
|
||||||
|
* @hdd_ctx: HDD context
|
||||||
|
* @tb: list of attributes
|
||||||
|
* @vdev_id: vdev id
|
||||||
|
*
|
||||||
|
* Return: 0 on success; error number on failure
|
||||||
|
*/
|
||||||
|
static int hdd_set_ratemask_params(struct hdd_context *hdd_ctx,
|
||||||
|
const void *data, int data_len,
|
||||||
|
struct wlan_objmgr_vdev *vdev)
|
||||||
|
{
|
||||||
|
struct nlattr *tb[RATEMASK_PARAMS_MAX + 1];
|
||||||
|
struct nlattr *tb2[RATEMASK_PARAMS_MAX + 1];
|
||||||
|
struct nlattr *curr_attr;
|
||||||
|
int ret, rem;
|
||||||
|
struct config_ratemask_params rate_params[RATEMASK_PARAMS_TYPE_MAX];
|
||||||
|
uint8_t ratemask_type, num_ratemask = 0, len;
|
||||||
|
uint32_t bitmap[RATEMASK_PARAMS_TYPE_MAX] = {0};
|
||||||
|
|
||||||
|
ret = wlan_cfg80211_nla_parse(tb,
|
||||||
|
RATEMASK_PARAMS_MAX,
|
||||||
|
data, data_len,
|
||||||
|
wlan_hdd_set_ratemask_param_policy);
|
||||||
|
if (ret) {
|
||||||
|
hdd_err("Invalid ATTR");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tb[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_LIST]) {
|
||||||
|
hdd_err("ratemask array attribute not present");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(rate_params, 0, (RATEMASK_PARAMS_TYPE_MAX *
|
||||||
|
sizeof(struct config_ratemask_params)));
|
||||||
|
|
||||||
|
nla_for_each_nested(curr_attr,
|
||||||
|
tb[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_LIST],
|
||||||
|
rem) {
|
||||||
|
if (num_ratemask >= RATEMASK_PARAMS_TYPE_MAX) {
|
||||||
|
hdd_err("Exceeding ratemask_list_param_num value");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (wlan_cfg80211_nla_parse(
|
||||||
|
tb2, RATEMASK_PARAMS_MAX,
|
||||||
|
nla_data(curr_attr), nla_len(curr_attr),
|
||||||
|
wlan_hdd_set_ratemask_param_policy)) {
|
||||||
|
hdd_err("nla_parse failed");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tb2[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_TYPE]) {
|
||||||
|
hdd_err("type attribute not present");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tb2[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_BITMAP]) {
|
||||||
|
hdd_err("bitmap attribute not present");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ratemask_type =
|
||||||
|
nla_get_u8(tb2[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_TYPE]);
|
||||||
|
if (ratemask_type >= RATEMASK_PARAMS_TYPE_MAX) {
|
||||||
|
hdd_err("invalid ratemask type");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
len = nla_len(tb2[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_BITMAP]);
|
||||||
|
nla_memcpy((void *)bitmap,
|
||||||
|
tb2[QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_BITMAP],
|
||||||
|
len);
|
||||||
|
|
||||||
|
hdd_debug("rate_type:%d, lower32 0x%x, lower32_2 0x%x, higher32 0x%x, higher32_2 0x%x",
|
||||||
|
ratemask_type, bitmap[0], bitmap[1],
|
||||||
|
bitmap[2], bitmap[3]);
|
||||||
|
|
||||||
|
rate_params[num_ratemask].type = ratemask_type;
|
||||||
|
rate_params[num_ratemask].lower32 = bitmap[0];
|
||||||
|
rate_params[num_ratemask].lower32_2 = bitmap[1];
|
||||||
|
rate_params[num_ratemask].higher32 = bitmap[2];
|
||||||
|
rate_params[num_ratemask].higher32_2 = bitmap[3];
|
||||||
|
|
||||||
|
num_ratemask += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = ucfg_set_ratemask_params(vdev, num_ratemask, rate_params);
|
||||||
|
if (ret)
|
||||||
|
hdd_err("ucfg_set_ratemask_params failed");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __wlan_hdd_cfg80211_set_ratemask_config() - Ratemask parameters
|
||||||
|
* @wiphy: The wiphy structure
|
||||||
|
* @wdev: The wireless device
|
||||||
|
* @data: Data passed by framework
|
||||||
|
* @data_len: Parameters to be configured passed as data
|
||||||
|
*
|
||||||
|
* The ratemask parameters are configured by the framework
|
||||||
|
* using this interface.
|
||||||
|
*
|
||||||
|
* Return: Return either success or failure code.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
__wlan_hdd_cfg80211_set_ratemask_config(struct wiphy *wiphy,
|
||||||
|
struct wireless_dev *wdev,
|
||||||
|
const void *data, int data_len)
|
||||||
|
{
|
||||||
|
struct net_device *dev = wdev->netdev;
|
||||||
|
struct hdd_adapter *adapter = WLAN_HDD_GET_PRIV_PTR(dev);
|
||||||
|
struct hdd_context *hdd_ctx = wiphy_priv(wiphy);
|
||||||
|
struct wlan_objmgr_vdev *vdev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = wlan_hdd_validate_context(hdd_ctx);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (hdd_ctx->driver_status == DRIVER_MODULES_CLOSED) {
|
||||||
|
hdd_err("Driver Modules are closed");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_POWER_ID);
|
||||||
|
if (!vdev) {
|
||||||
|
hdd_err("vdev not present");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = hdd_set_ratemask_params(hdd_ctx, data, data_len, vdev);
|
||||||
|
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_POWER_ID);
|
||||||
|
if (ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
fail:
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_hdd_cfg80211_set_ratemask_config() - set ratemask config
|
||||||
|
* @wiphy: pointer to wireless wiphy structure.
|
||||||
|
* @wdev: pointer to wireless_dev structure.
|
||||||
|
* @data: Pointer to the data to be passed via vendor interface
|
||||||
|
* @data_len:Length of the data to be passed
|
||||||
|
*
|
||||||
|
* Return: Return the Success or Failure code.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
wlan_hdd_cfg80211_set_ratemask_config(struct wiphy *wiphy,
|
||||||
|
struct wireless_dev *wdev,
|
||||||
|
const void *data,
|
||||||
|
int data_len)
|
||||||
|
{
|
||||||
|
int errno;
|
||||||
|
struct osif_vdev_sync *vdev_sync;
|
||||||
|
|
||||||
|
errno = osif_vdev_sync_op_start(wdev->netdev, &vdev_sync);
|
||||||
|
if (errno)
|
||||||
|
return errno;
|
||||||
|
|
||||||
|
errno = __wlan_hdd_cfg80211_set_ratemask_config(wiphy, wdev,
|
||||||
|
data, data_len);
|
||||||
|
|
||||||
|
osif_vdev_sync_op_stop(vdev_sync);
|
||||||
|
|
||||||
|
return errno;
|
||||||
|
}
|
||||||
|
|
||||||
#define PWR_SAVE_FAIL_CMD_INDEX \
|
#define PWR_SAVE_FAIL_CMD_INDEX \
|
||||||
QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX
|
QCA_NL80211_VENDOR_SUBCMD_PWR_SAVE_FAIL_DETECTED_INDEX
|
||||||
|
|
||||||
@@ -17121,6 +17304,16 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = {
|
|||||||
vendor_command_policy(wlan_hdd_set_roam_param_policy,
|
vendor_command_policy(wlan_hdd_set_roam_param_policy,
|
||||||
QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX)
|
QCA_WLAN_VENDOR_ATTR_ROAMING_PARAM_MAX)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.info.vendor_id = QCA_NL80211_VENDOR_ID,
|
||||||
|
.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_RATEMASK_CONFIG,
|
||||||
|
.flags = WIPHY_VENDOR_CMD_NEED_WDEV |
|
||||||
|
WIPHY_VENDOR_CMD_NEED_NETDEV |
|
||||||
|
WIPHY_VENDOR_CMD_NEED_RUNNING,
|
||||||
|
.doit = wlan_hdd_cfg80211_set_ratemask_config,
|
||||||
|
vendor_command_policy(wlan_hdd_set_ratemask_param_policy,
|
||||||
|
QCA_WLAN_VENDOR_ATTR_RATEMASK_PARAMS_MAX)
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.info.vendor_id = QCA_NL80211_VENDOR_ID,
|
.info.vendor_id = QCA_NL80211_VENDOR_ID,
|
||||||
.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_START,
|
.info.subcmd = QCA_NL80211_VENDOR_SUBCMD_WIFI_LOGGER_START,
|
||||||
|
Reference in New Issue
Block a user