qcacld-3.0: Add support to get num tx/rx chains for SAP and P2P_Go

Add support to get num tx/rx chains for SAP and P2P_Go.

Change-Id: I161e9f48b757a9c177dbc28c839476a666e73d39
CRs-Fixed: 3603558
这个提交包含在:
Vinod Kumar Myadam
2023-08-31 12:59:57 +05:30
提交者 Rahul Choudhary
父节点 b06fa33b3e
当前提交 05c1a207b8
修改 2 个文件,包含 154 行新增125 行删除

查看文件

@@ -1121,8 +1121,14 @@ static QDF_STATUS hdd_set_nss_params(struct wlan_hdd_link_info *link_info,
return QDF_STATUS_E_INVAL;
}
if (tx_nss > wlan_vdev_mlme_get_nss(vdev) ||
rx_nss > wlan_vdev_mlme_get_nss(vdev)) {
/* For STA tx/rx nss value is updated at the time of connection,
* for SAP case nss values will not get update, so can skip check
* for SAP/P2P_GO mode.
*/
if (adapter->device_mode != QDF_SAP_MODE &&
adapter->device_mode != QDF_P2P_GO_MODE &&
(tx_nss > wlan_vdev_mlme_get_nss(vdev) ||
rx_nss > wlan_vdev_mlme_get_nss(vdev))) {
hdd_err("Given tx nss/rx nss is greater than intersected nss = %d",
wlan_vdev_mlme_get_nss(vdev));
wlan_objmgr_vdev_release_ref(vdev, WLAN_HDD_ID_OBJ_MGR);
@@ -1185,6 +1191,148 @@ static void hdd_set_sap_nss_params(struct wlan_hdd_link_info *link_info,
hdd_restart_sap(link_info);
}
/**
* hdd_get_sap_rx_nss() - get the sap rx nss
* @link_info: Pointer to link_info
* @rx_nss: pointer to rx_nss
*
* get the sap tx nss
*
* Return: None
*/
static QDF_STATUS
hdd_get_sap_rx_nss(struct wlan_hdd_link_info *link_info, uint8_t *rx_nss)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
struct wlan_objmgr_vdev *vdev;
struct wlan_mlme_nss_chains *dynamic_cfg;
enum band_info operating_band;
mac_handle_t mac_handle;
uint8_t vdev_nss;
mac_handle = hdd_ctx->mac_handle;
if (!mac_handle) {
hdd_debug("NULL MAC handle");
return QDF_STATUS_E_INVAL;
}
operating_band = hdd_get_sap_operating_band_by_link_info(link_info);
if (operating_band == BAND_UNKNOWN)
return QDF_STATUS_E_INVAL;
vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
sme_get_sap_vdev_type_nss(mac_handle, &vdev_nss, operating_band);
if (hdd_ctx->dynamic_nss_chains_support) {
dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
if (!dynamic_cfg) {
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
hdd_debug("nss chain dynamic config NULL");
return QDF_STATUS_E_INVAL;
}
switch (operating_band) {
case BAND_2G:
*rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
break;
case BAND_5G:
*rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
break;
default:
hdd_debug("Band %d Not 2G or 5G", operating_band);
break;
}
} else {
*rx_nss = vdev_nss;
}
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
return QDF_STATUS_SUCCESS;
}
/**
* hdd_get_sap_tx_nss() - get the sap tx nss
* @link_info: Pointer of link_info
* @tx_nss: pointer to tx_nss
*
* get the sap tx nss
*
* Return: None
*/
static QDF_STATUS
hdd_get_sap_tx_nss(struct wlan_hdd_link_info *link_info, uint8_t *tx_nss)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
struct wlan_objmgr_vdev *vdev;
struct wlan_mlme_nss_chains *dynamic_cfg;
enum band_info operating_band;
mac_handle_t mac_handle;
uint8_t vdev_nss;
mac_handle = hdd_ctx->mac_handle;
if (!mac_handle) {
hdd_debug("NULL MAC handle");
return QDF_STATUS_E_INVAL;
}
operating_band = hdd_get_sap_operating_band_by_link_info(link_info);
if (operating_band == BAND_UNKNOWN)
return QDF_STATUS_E_INVAL;
vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
sme_get_sap_vdev_type_nss(mac_handle, &vdev_nss, operating_band);
if (hdd_ctx->dynamic_nss_chains_support) {
dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
if (!dynamic_cfg) {
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
hdd_debug("nss chain dynamic config NULL");
return QDF_STATUS_E_INVAL;
}
switch (operating_band) {
case BAND_2G:
*tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
break;
case BAND_5G:
*tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
break;
default:
hdd_debug("Band %d Not 2G or 5G", operating_band);
break;
}
} else {
*tx_nss = vdev_nss;
}
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
return QDF_STATUS_SUCCESS;
}
static bool
hdd_get_sap_restart_required_for_nss(struct wlan_hdd_link_info *link_info,
uint8_t tx_nss, uint8_t rx_nss)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
uint8_t rx_prev, tx_prev;
bool restart_sap = 0;
ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(hdd_ctx->psoc,
&restart_sap);
if (!restart_sap)
return false;
hdd_get_sap_rx_nss(link_info, &rx_prev);
hdd_get_sap_tx_nss(link_info, &tx_prev);
if (rx_prev != rx_nss && tx_prev != tx_nss)
return true;
return false;
}
QDF_STATUS hdd_update_nss(struct wlan_hdd_link_info *link_info,
uint8_t tx_nss, uint8_t rx_nss)
{
@@ -1230,9 +1378,9 @@ QDF_STATUS hdd_update_nss(struct wlan_hdd_link_info *link_info,
* and not the global param enable2x2
*/
if (hdd_ctx->dynamic_nss_chains_support) {
ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
hdd_ctx->psoc,
&restart_sap);
restart_sap =
hdd_get_sap_restart_required_for_nss(link_info, tx_nss, rx_nss);
if ((adapter->device_mode == QDF_SAP_MODE ||
adapter->device_mode == QDF_P2P_GO_MODE) && restart_sap) {
if ((tx_nss == 2 && rx_nss == 2) ||
@@ -1476,66 +1624,6 @@ hdd_get_sap_num_tx_chains(struct wlan_hdd_link_info *link_info,
return QDF_STATUS_SUCCESS;
}
/**
* hdd_get_sap_tx_nss() - get the sap tx nss
* @link_info: Pointer of link_info
* @tx_nss: pointer to tx_nss
*
* get the sap tx nss
*
* Return: None
*/
static QDF_STATUS
hdd_get_sap_tx_nss(struct wlan_hdd_link_info *link_info, uint8_t *tx_nss)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
struct wlan_objmgr_vdev *vdev;
struct wlan_mlme_nss_chains *dynamic_cfg;
enum band_info operating_band;
mac_handle_t mac_handle;
uint8_t vdev_nss;
mac_handle = hdd_ctx->mac_handle;
if (!mac_handle) {
hdd_debug("NULL MAC handle");
return QDF_STATUS_E_INVAL;
}
operating_band = hdd_get_sap_operating_band_by_link_info(link_info);
if (operating_band == BAND_UNKNOWN)
return QDF_STATUS_E_INVAL;
vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
sme_get_sap_vdev_type_nss(mac_handle, &vdev_nss, operating_band);
if (hdd_ctx->dynamic_nss_chains_support) {
dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
if (!dynamic_cfg) {
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
hdd_debug("nss chain dynamic config NULL");
return QDF_STATUS_E_INVAL;
}
switch (operating_band) {
case BAND_2G:
*tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ];
break;
case BAND_5G:
*tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ];
break;
default:
hdd_debug("Band %d Not 2G or 5G", operating_band);
break;
}
} else {
*tx_nss = vdev_nss;
}
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
return QDF_STATUS_SUCCESS;
}
/**
* hdd_get_sta_num_tx_chains() - get the sta num tx chains
* @link_info: Pointer of link_info
@@ -1684,66 +1772,6 @@ hdd_get_sap_num_rx_chains(struct wlan_hdd_link_info *link_info,
return QDF_STATUS_SUCCESS;
}
/**
* hdd_get_sap_rx_nss() - get the sap rx nss
* @link_info: Pointer to link_info
* @rx_nss: pointer to rx_nss
*
* get the sap tx nss
*
* Return: None
*/
static QDF_STATUS
hdd_get_sap_rx_nss(struct wlan_hdd_link_info *link_info, uint8_t *rx_nss)
{
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(link_info->adapter);
struct wlan_objmgr_vdev *vdev;
struct wlan_mlme_nss_chains *dynamic_cfg;
enum band_info operating_band;
mac_handle_t mac_handle;
uint8_t vdev_nss;
mac_handle = hdd_ctx->mac_handle;
if (!mac_handle) {
hdd_debug("NULL MAC handle");
return QDF_STATUS_E_INVAL;
}
operating_band = hdd_get_sap_operating_band_by_link_info(link_info);
if (operating_band == BAND_UNKNOWN)
return QDF_STATUS_E_INVAL;
vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
if (!vdev)
return QDF_STATUS_E_INVAL;
sme_get_sap_vdev_type_nss(mac_handle, &vdev_nss, operating_band);
if (hdd_ctx->dynamic_nss_chains_support) {
dynamic_cfg = mlme_get_dynamic_vdev_config(vdev);
if (!dynamic_cfg) {
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
hdd_debug("nss chain dynamic config NULL");
return QDF_STATUS_E_INVAL;
}
switch (operating_band) {
case BAND_2G:
*rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_2GHZ];
break;
case BAND_5G:
*rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ];
break;
default:
hdd_debug("Band %d Not 2G or 5G", operating_band);
break;
}
} else {
*rx_nss = vdev_nss;
}
hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
return QDF_STATUS_SUCCESS;
}
/**
* hdd_get_sta_num_rx_chains() - get the sta num rx chains
* @link_info: Pointer to link_info in adapter

查看文件

@@ -9357,6 +9357,7 @@ static int hdd_config_vdev_chains(struct wlan_hdd_link_info *link_info,
tx_chains = nla_get_u8(tx_attr);
rx_chains = nla_get_u8(rx_attr);
hdd_debug("tx_chains %d rx_chains %d", tx_chains, rx_chains);
if (hdd_ctx->dynamic_nss_chains_support)
return hdd_set_dynamic_antenna_mode(link_info,
rx_chains, tx_chains);