qcacmn: Adding multi vdev set param WMI API

Adding multi vdev set param WMI API support to send
vdev param update for multiple VAPs.

Change-Id: I6f331d4179afa2b331abef9b857365c60c0a64b3
This commit is contained in:
Sridhar Selvaraj
2021-08-16 18:44:46 +05:30
committed by Madan Koyyalamudi
parent 858a29eec9
commit c9c8ccb8cb
6 changed files with 159 additions and 9 deletions

View File

@@ -1024,6 +1024,43 @@ static QDF_STATUS target_if_vdev_mgr_multiple_vdev_restart_req_cmd(
return status;
}
static QDF_STATUS target_if_vdev_mgr_multiple_vdev_set_param_cmd(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_set_param *param)
{
QDF_STATUS status = QDF_STATUS_E_FAILURE;
struct wmi_unified *wmi_handle;
struct wlan_objmgr_psoc *psoc;
if (!pdev || !param) {
mlme_err("Invalid input");
return QDF_STATUS_E_INVAL;
}
psoc = wlan_pdev_get_psoc(pdev);
if (!psoc) {
mlme_err("PSOC is NULL");
return QDF_STATUS_E_INVAL;
}
wmi_handle = get_wmi_unified_hdl_from_pdev(pdev);
if (!wmi_handle) {
mlme_err("PDEV WMI Handle is NULL!");
return QDF_STATUS_E_INVAL;
}
if (param->num_vdevs > WLAN_UMAC_PDEV_MAX_VDEVS) {
mlme_err("param->num_vdevs: %u exceed the limit",
param->num_vdevs);
return QDF_STATUS_E_INVAL;
}
status = wmi_unified_send_multiple_vdev_set_param_cmd(wmi_handle,
param);
return status;
}
static QDF_STATUS target_if_vdev_mgr_beacon_send(
struct wlan_objmgr_vdev *vdev,
struct beacon_params *param)
@@ -1204,6 +1241,8 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
target_if_vdev_mgr_peer_flush_tids_send;
mlme_tx_ops->multiple_vdev_restart_req_cmd =
target_if_vdev_mgr_multiple_vdev_restart_req_cmd;
mlme_tx_ops->multiple_vdev_set_param_cmd =
target_if_vdev_mgr_multiple_vdev_set_param_cmd;
mlme_tx_ops->beacon_cmd_send = target_if_vdev_mgr_beacon_send;
mlme_tx_ops->beacon_tmpl_send = target_if_vdev_mgr_beacon_tmpl_send;
mlme_tx_ops->vdev_set_param_send =

View File

@@ -302,6 +302,7 @@ enum wlan_mlme_cfg_id;
* @vdev_config_ratemask_cmd_send: function to send ratemask
* @peer_flush_tids_send: function to flush peer tids
* @multiple_vdev_restart_req_cmd: function to send multiple vdev restart
* @multiple_vdev_set_param_cmd: function to send multiple vdev param
* @beacon_send_cmd: function to send beacon
* @beacon_tmpl_send: function to send beacon template
* @vdev_bcn_miss_offload_send: function to send beacon miss offload
@@ -358,6 +359,9 @@ struct wlan_lmac_if_mlme_tx_ops {
QDF_STATUS (*multiple_vdev_restart_req_cmd)(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_restart_params *param);
QDF_STATUS (*multiple_vdev_set_param_cmd)(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_set_param *param);
QDF_STATUS (*beacon_cmd_send)(struct wlan_objmgr_vdev *vdev,
struct beacon_params *param);
QDF_STATUS (*beacon_tmpl_send)(struct wlan_objmgr_vdev *vdev,

View File

@@ -56,6 +56,7 @@ struct cnx_mgr;
#define WLAN_VDEV_MLME_FLAGS_TRANSMIT_AP 0x00000002
#define WLAN_VDEV_MLME_FLAGS_NON_TRANSMIT_AP 0x00000004
#define WLAN_VDEV_MLME_FLAGS_EMA_MODE 0x00000008
#define WLAN_VDEV_MLME_FLAGS_MBSS_CMN_PARAM 0x00000010
/**
* struct vdev_mlme_proto_generic - generic mlme proto structure
@@ -481,6 +482,8 @@ struct vdev_mlme_beacon_info {
* 0 means non-MBSS AP.
* @mbssid-flags: MBSS IE flags indicating vdev type
* @vdevid_trans: id of transmitting vdev for MBSS IE
* @vdev_bmap: vdev bitmap of VAPs in MBSS group
* @is_cmn_param: flag to check mbss common param
* @trans_bssid: bssid of transmitted AP (MBSS IE case)
*/
struct vdev_mlme_mbss_11ax {
@@ -488,6 +491,8 @@ struct vdev_mlme_mbss_11ax {
uint32_t profile_num;
uint32_t mbssid_flags;
uint8_t vdevid_trans;
unsigned long vdev_bmap;
bool is_cmn_param;
uint8_t trans_bssid[QDF_MAC_ADDR_SIZE];
};

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019 The Linux Foundation. All rights reserved.
* Copyright (c) 2019, 2021 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
@@ -260,6 +260,18 @@ QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_restart_params *param);
/**
* tgt_vdev_mgr_multiple_vdev_set_param() API to send multiple vdev
* param
* @pdev: pointer to pdev
* @param: pointer to multiple_vdev_set_param
*
* Return: QDF_STATUS - Success or Failure
*/
QDF_STATUS tgt_vdev_mgr_multiple_vdev_set_param(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_set_param *param);
/**
* tgt_vdev_mgr_set_tx_rx_decap_type() API to send tx rx decap type
* @mlme_obj: pointer to vdev mlme obj

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
* Copyright (c) 2019-2021 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
@@ -539,6 +539,41 @@ QDF_STATUS tgt_vdev_mgr_multiple_vdev_restart_send(
return status;
}
QDF_STATUS tgt_vdev_mgr_multiple_vdev_set_param(
struct wlan_objmgr_pdev *pdev,
struct multiple_vdev_set_param *param)
{
QDF_STATUS status = QDF_STATUS_SUCCESS;
struct wlan_lmac_if_mlme_tx_ops *txops;
struct wlan_objmgr_vdev *vdev;
if (!param) {
mlme_err("Invalid input");
return QDF_STATUS_E_INVAL;
}
vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev,
param->vdev_ids[0],
WLAN_VDEV_TARGET_IF_ID);
if (vdev) {
txops = wlan_vdev_mlme_get_lmac_txops(vdev);
if (!txops || !txops->multiple_vdev_set_param_cmd) {
mlme_err("VDEV_%d: No Tx Ops", wlan_vdev_get_id(vdev));
wlan_objmgr_vdev_release_ref(vdev,
WLAN_VDEV_TARGET_IF_ID);
return QDF_STATUS_E_INVAL;
}
status = txops->multiple_vdev_set_param_cmd(pdev, param);
if (QDF_IS_STATUS_ERROR(status))
mlme_err("Tx Ops Error: %d", status);
wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
}
return status;
}
QDF_STATUS tgt_vdev_mgr_set_tx_rx_decap_type(struct vdev_mlme_obj *mlme_obj,
enum wlan_mlme_cfg_id param_id,
uint32_t value)

View File

@@ -128,6 +128,65 @@ wlan_util_vdev_mlme_set_ratemask_config(struct vdev_mlme_obj *vdev_mlme)
qdf_export_symbol(wlan_util_vdev_mlme_set_ratemask_config);
static QDF_STATUS
tgt_vdev_mgr_vdev_set_param_wrapper(struct vdev_mlme_obj *vdev_mlme,
enum wlan_mlme_cfg_id param_id,
struct wlan_vdev_mgr_cfg mlme_cfg)
{
uint8_t id, count = 0;
bool is_mbss_enabled, is_cmn_param = 0;
unsigned long vdev_bmap = 0;
struct wlan_objmgr_pdev *pdev;
struct vdev_mlme_mbss_11ax *mbss;
struct vdev_set_params param1 = {0};
struct multiple_vdev_set_param param2 = {0};
QDF_STATUS status = QDF_STATUS_SUCCESS;
mbss = &vdev_mlme->mgmt.mbss_11ax;
is_mbss_enabled = (mbss->mbssid_flags
& WLAN_VDEV_MLME_FLAGS_NON_MBSSID_AP) ? 0 : 1;
if (is_mbss_enabled) {
vdev_bmap = mbss->vdev_bmap;
is_cmn_param = mbss->is_cmn_param;
}
/* 1. if non tx vap and cmn param, dont send any WMI
* 2. if tx vap and cmn param, send multi vdev set WMI
* 3. if non tx vap and non cmn param, send vdev set WMI
* 4. if tx vap and non cmn param, send vdev set WMI
* 5. if non mbss vap, send vdev set WMI
*/
if (!is_mbss_enabled || !is_cmn_param) {
param1.param_id = param_id;
param1.vdev_id = wlan_vdev_get_id(vdev_mlme->vdev);
param1.param_value = mlme_cfg.value;
return tgt_vdev_mgr_set_param_send(vdev_mlme, &param1);
}
if (is_cmn_param && vdev_bmap) {
pdev = wlan_vdev_get_pdev(vdev_mlme->vdev);
param2.pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev);
param2.param_id = param_id;
param2.param_value = mlme_cfg.value;
for (id = 0; id < WLAN_UMAC_PDEV_MAX_VDEVS; id++) {
if (qdf_test_bit(id, &vdev_bmap)) {
param2.vdev_ids[count] = id;
count++;
}
}
param2.num_vdevs = count;
status = tgt_vdev_mgr_multiple_vdev_set_param(pdev, &param2);
mbss->vdev_bmap = 0;
}
/* Reset the is_cmn_param for this vap */
mbss->is_cmn_param = 0;
return status;
}
QDF_STATUS
wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme,
enum wlan_mlme_cfg_id param_id,
@@ -139,7 +198,6 @@ wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme,
struct vdev_mlme_inactivity_params *inactivity_params;
bool is_wmi_cmd = false;
int ret = QDF_STATUS_SUCCESS;
struct vdev_set_params param = {0};
if (!vdev_mlme) {
mlme_err("VDEV MLME is NULL");
@@ -414,12 +472,9 @@ wlan_util_vdev_mlme_set_param(struct vdev_mlme_obj *vdev_mlme,
break;
}
if (is_wmi_cmd) {
param.param_id = param_id;
param.vdev_id = wlan_vdev_get_id(vdev);
param.param_value = mlme_cfg.value;
ret = tgt_vdev_mgr_set_param_send(vdev_mlme, &param);
}
if (is_wmi_cmd)
ret = tgt_vdev_mgr_vdev_set_param_wrapper(vdev_mlme, param_id,
mlme_cfg);
return ret;
}