qcacld-3.0: Update NSS for SAP dynamically
Currently host driver does not support dynamic NSS update for SAP. Based on new requirement update NSS for SAP. To achieve this requirement, add a logic to update the NSS and restart the SAP with the updated NSS based on the ini. Change-Id: Ie770b1103ba4050c48cd4ba3674a5e0d89c86fdf CRs-Fixed: 3307308
This commit is contained in:

committed by
Madan Koyyalamudi

parent
cba34a2b34
commit
3297080714
@@ -2348,6 +2348,9 @@ static void mlme_init_nss_chains(struct wlan_objmgr_psoc *psoc,
|
|||||||
cfg_get(psoc, CFG_DISABLE_TX_MRC_5G);
|
cfg_get(psoc, CFG_DISABLE_TX_MRC_5G);
|
||||||
nss_chains->enable_dynamic_nss_chains_cfg =
|
nss_chains->enable_dynamic_nss_chains_cfg =
|
||||||
cfg_get(psoc, CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG);
|
cfg_get(psoc, CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG);
|
||||||
|
nss_chains->restart_sap_on_dyn_nss_chains_cfg =
|
||||||
|
cfg_get(psoc,
|
||||||
|
CFG_RESTART_SAP_ON_DYNAMIC_NSS_CHAINS_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mlme_init_wep_cfg(struct wlan_mlme_wep_cfg *wep_params)
|
static void mlme_init_wep_cfg(struct wlan_mlme_wep_cfg *wep_params)
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2012-2018, 2020 The Linux Foundation. All rights reserved.
|
* Copyright (c) 2012-2018, 2020 The Linux Foundation. All rights reserved.
|
||||||
|
* Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved.
|
||||||
*
|
*
|
||||||
* Permission to use, copy, modify, and/or distribute this software for
|
* Permission to use, copy, modify, and/or distribute this software for
|
||||||
* any purpose with or without fee is hereby granted, provided that the
|
* any purpose with or without fee is hereby granted, provided that the
|
||||||
@@ -554,6 +555,27 @@
|
|||||||
1, \
|
1, \
|
||||||
"enable dynamic nss chain config")
|
"enable dynamic nss chain config")
|
||||||
|
|
||||||
|
/*
|
||||||
|
* <ini>
|
||||||
|
* restart_sap_on_dynamic_nss_chains_config - Decide whether SAP needs to be
|
||||||
|
* restarted on dynamic nss chains update
|
||||||
|
* @Min: 0
|
||||||
|
* @Max: 1
|
||||||
|
* @Default: 0
|
||||||
|
*
|
||||||
|
* Related: SAP/P2P.
|
||||||
|
*
|
||||||
|
* Supported Feature: Dynamic chainmask
|
||||||
|
*
|
||||||
|
* Usage: External
|
||||||
|
*
|
||||||
|
* </ini>
|
||||||
|
*/
|
||||||
|
#define CFG_RESTART_SAP_ON_DYNAMIC_NSS_CHAINS_CONFIG CFG_INI_BOOL( \
|
||||||
|
"restart_sap_on_dynamic_nss_chains_config", \
|
||||||
|
0, \
|
||||||
|
"Restart SAP on dynamic nss chain config")
|
||||||
|
|
||||||
#define CFG_NSS_CHAINS_ALL \
|
#define CFG_NSS_CHAINS_ALL \
|
||||||
CFG(CFG_NUM_TX_CHAINS_2G) \
|
CFG(CFG_NUM_TX_CHAINS_2G) \
|
||||||
CFG(CFG_NUM_TX_CHAINS_5G) \
|
CFG(CFG_NUM_TX_CHAINS_5G) \
|
||||||
@@ -570,7 +592,8 @@
|
|||||||
CFG(CFG_DISABLE_RX_MRC_2G) \
|
CFG(CFG_DISABLE_RX_MRC_2G) \
|
||||||
CFG(CFG_DISABLE_TX_MRC_5G) \
|
CFG(CFG_DISABLE_TX_MRC_5G) \
|
||||||
CFG(CFG_DISABLE_RX_MRC_5G) \
|
CFG(CFG_DISABLE_RX_MRC_5G) \
|
||||||
CFG(CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG)
|
CFG(CFG_ENABLE_DYNAMIC_NSS_CHAIN_CONFIG) \
|
||||||
|
CFG(CFG_RESTART_SAP_ON_DYNAMIC_NSS_CHAINS_CONFIG)
|
||||||
|
|
||||||
#endif /* __CFG_MLME_NSS_CHAINS */
|
#endif /* __CFG_MLME_NSS_CHAINS */
|
||||||
|
|
||||||
|
@@ -2230,6 +2230,22 @@ QDF_STATUS
|
|||||||
wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
|
wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
|
||||||
bool *value);
|
bool *value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg() - API to get whether
|
||||||
|
* SAP needs to be restarted or not on dynamic nss chain config
|
||||||
|
* @psoc: psoc context
|
||||||
|
* @value: data to be set
|
||||||
|
*
|
||||||
|
* API to get whether SAP needs to be restarted or not on dynamic nss chain
|
||||||
|
* config
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
bool *value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* wlan_mlme_get_vht_enable2x2() - Enables/disables VHT Tx/Rx MCS values for 2x2
|
* wlan_mlme_get_vht_enable2x2() - Enables/disables VHT Tx/Rx MCS values for 2x2
|
||||||
* @psoc: psoc context
|
* @psoc: psoc context
|
||||||
|
@@ -1609,6 +1609,8 @@ enum dot11p_mode {
|
|||||||
* @disable_rx_mrc: disable 2 rx chains, in rx nss 1 mode
|
* @disable_rx_mrc: disable 2 rx chains, in rx nss 1 mode
|
||||||
* @disable_tx_mrc: disable 2 tx chains, in tx nss 1 mode
|
* @disable_tx_mrc: disable 2 tx chains, in tx nss 1 mode
|
||||||
* @enable_dynamic_nss_chains_cfg: enable the dynamic nss chain config to FW
|
* @enable_dynamic_nss_chains_cfg: enable the dynamic nss chain config to FW
|
||||||
|
* @restart_sap_on_dyn_nss_chains_cfg: restart SAP on dynamic NSS chains
|
||||||
|
* update
|
||||||
*/
|
*/
|
||||||
struct wlan_mlme_nss_chains {
|
struct wlan_mlme_nss_chains {
|
||||||
uint32_t num_tx_chains[NSS_CHAINS_BAND_MAX];
|
uint32_t num_tx_chains[NSS_CHAINS_BAND_MAX];
|
||||||
@@ -1621,6 +1623,7 @@ struct wlan_mlme_nss_chains {
|
|||||||
bool disable_rx_mrc[NSS_CHAINS_BAND_MAX];
|
bool disable_rx_mrc[NSS_CHAINS_BAND_MAX];
|
||||||
bool disable_tx_mrc[NSS_CHAINS_BAND_MAX];
|
bool disable_tx_mrc[NSS_CHAINS_BAND_MAX];
|
||||||
bool enable_dynamic_nss_chains_cfg;
|
bool enable_dynamic_nss_chains_cfg;
|
||||||
|
bool restart_sap_on_dyn_nss_chains_cfg;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -2605,6 +2605,25 @@ ucfg_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
|
|||||||
return wlan_mlme_get_enable_dynamic_nss_chains_cfg(psoc, value);
|
return wlan_mlme_get_enable_dynamic_nss_chains_cfg(psoc, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg() - API to get whether
|
||||||
|
* SAP needs to be restarted or not on dynamic nss chain config
|
||||||
|
* @psoc: psoc context
|
||||||
|
* @value: data to be set
|
||||||
|
*
|
||||||
|
* API to get whether SAP needs to be restarted or not on dynamic nss chain
|
||||||
|
* config
|
||||||
|
*
|
||||||
|
* Return: QDF_STATUS_SUCCESS or QDF_STATUS_FAILURE
|
||||||
|
*/
|
||||||
|
static inline QDF_STATUS
|
||||||
|
ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
bool *value)
|
||||||
|
{
|
||||||
|
return wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(psoc, value);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ucfg_mlme_get_vht_enable2x2() - Enables/disables VHT Tx/Rx MCS values for 2x2
|
* ucfg_mlme_get_vht_enable2x2() - Enables/disables VHT Tx/Rx MCS values for 2x2
|
||||||
* @psoc: psoc context
|
* @psoc: psoc context
|
||||||
|
@@ -3842,6 +3842,23 @@ wlan_mlme_get_enable_dynamic_nss_chains_cfg(struct wlan_objmgr_psoc *psoc,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QDF_STATUS
|
||||||
|
wlan_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
|
||||||
|
struct wlan_objmgr_psoc *psoc,
|
||||||
|
bool *value)
|
||||||
|
{
|
||||||
|
struct wlan_mlme_psoc_ext_obj *mlme_obj;
|
||||||
|
|
||||||
|
mlme_obj = mlme_get_psoc_ext_obj(psoc);
|
||||||
|
if (!mlme_obj)
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
|
||||||
|
*value =
|
||||||
|
mlme_obj->cfg.nss_chains_ini_cfg.restart_sap_on_dyn_nss_chains_cfg;
|
||||||
|
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS
|
QDF_STATUS
|
||||||
wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value)
|
wlan_mlme_get_vht_enable2x2(struct wlan_objmgr_psoc *psoc, bool *value)
|
||||||
{
|
{
|
||||||
|
@@ -1124,6 +1124,40 @@ hdd_set_nss_params(struct hdd_adapter *adapter,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
hdd_update_nss_in_vdev(struct hdd_adapter *adapter, mac_handle_t mac_handle,
|
||||||
|
uint8_t tx_nss, uint8_t rx_nss)
|
||||||
|
{
|
||||||
|
uint8_t band, max_supp_nss = MAX_VDEV_NSS;
|
||||||
|
|
||||||
|
for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX;
|
||||||
|
band++) {
|
||||||
|
/* This API will change the global ini in mlme cfg */
|
||||||
|
sme_update_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
|
||||||
|
adapter->device_mode, band);
|
||||||
|
/*
|
||||||
|
* This API will change the vdev nss params in mac
|
||||||
|
* context
|
||||||
|
*/
|
||||||
|
sme_update_vdev_type_nss(mac_handle, max_supp_nss,
|
||||||
|
band);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* This API will change the ini and dynamic nss params in
|
||||||
|
* mlme vdev priv obj.
|
||||||
|
*/
|
||||||
|
hdd_store_nss_chains_cfg_in_vdev(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void hdd_set_sap_nss_params(struct hdd_context *hdd_ctx,
|
||||||
|
struct hdd_adapter *adapter,
|
||||||
|
mac_handle_t mac_handle,
|
||||||
|
uint8_t tx_nss, uint8_t rx_nss)
|
||||||
|
{
|
||||||
|
hdd_update_nss_in_vdev(adapter, mac_handle, tx_nss, rx_nss);
|
||||||
|
hdd_restart_sap(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
|
QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
|
||||||
uint8_t rx_nss)
|
uint8_t rx_nss)
|
||||||
{
|
{
|
||||||
@@ -1138,7 +1172,7 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
|
|||||||
uint8_t enable2x2;
|
uint8_t enable2x2;
|
||||||
mac_handle_t mac_handle;
|
mac_handle_t mac_handle;
|
||||||
bool bval = 0;
|
bool bval = 0;
|
||||||
uint8_t band, max_supp_nss;
|
bool restart_sap = 0;
|
||||||
|
|
||||||
if ((tx_nss == 2 || rx_nss == 2) && (hdd_ctx->num_rf_chains != 2)) {
|
if ((tx_nss == 2 || rx_nss == 2) && (hdd_ctx->num_rf_chains != 2)) {
|
||||||
hdd_err("No support for 2 spatial streams");
|
hdd_err("No support for 2 spatial streams");
|
||||||
@@ -1162,7 +1196,6 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
|
|||||||
hdd_err("NULL MAC handle");
|
hdd_err("NULL MAC handle");
|
||||||
return QDF_STATUS_E_INVAL;
|
return QDF_STATUS_E_INVAL;
|
||||||
}
|
}
|
||||||
max_supp_nss = MAX_VDEV_NSS;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If FW is supporting the dynamic nss update, this command is meant to
|
* If FW is supporting the dynamic nss update, this command is meant to
|
||||||
@@ -1170,6 +1203,23 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
|
|||||||
* and not the global param enable2x2
|
* and not the global param enable2x2
|
||||||
*/
|
*/
|
||||||
if (hdd_ctx->dynamic_nss_chains_support) {
|
if (hdd_ctx->dynamic_nss_chains_support) {
|
||||||
|
ucfg_mlme_get_restart_sap_on_dynamic_nss_chains_cfg(
|
||||||
|
hdd_ctx->psoc,
|
||||||
|
&restart_sap);
|
||||||
|
if ((adapter->device_mode == QDF_SAP_MODE ||
|
||||||
|
adapter->device_mode == QDF_P2P_GO_MODE) && restart_sap) {
|
||||||
|
if ((tx_nss == 2 && rx_nss == 2) ||
|
||||||
|
(tx_nss == 1 && rx_nss == 1)) {
|
||||||
|
hdd_set_sap_nss_params(hdd_ctx, adapter,
|
||||||
|
mac_handle, tx_nss,
|
||||||
|
rx_nss);
|
||||||
|
return QDF_STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
hdd_err("tx_nss %d rx_nss %d not supported ",
|
||||||
|
tx_nss, rx_nss);
|
||||||
|
return QDF_STATUS_E_FAILURE;
|
||||||
|
}
|
||||||
|
|
||||||
if (hdd_is_vdev_in_conn_state(adapter))
|
if (hdd_is_vdev_in_conn_state(adapter))
|
||||||
return hdd_set_nss_params(adapter, tx_nss, rx_nss);
|
return hdd_set_nss_params(adapter, tx_nss, rx_nss);
|
||||||
hdd_debug("Vdev %d in disconnect state, changing ini nss params",
|
hdd_debug("Vdev %d in disconnect state, changing ini nss params",
|
||||||
@@ -1179,23 +1229,7 @@ QDF_STATUS hdd_update_nss(struct hdd_adapter *adapter, uint8_t tx_nss,
|
|||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX;
|
hdd_update_nss_in_vdev(adapter, mac_handle, tx_nss, rx_nss);
|
||||||
band++) {
|
|
||||||
/* This API will change the global ini in mlme cfg */
|
|
||||||
sme_update_nss_in_mlme_cfg(mac_handle, rx_nss, tx_nss,
|
|
||||||
adapter->device_mode, band);
|
|
||||||
/*
|
|
||||||
* This API will change the vdev nss params in mac
|
|
||||||
* context
|
|
||||||
*/
|
|
||||||
sme_update_vdev_type_nss(mac_handle, max_supp_nss,
|
|
||||||
band);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* This API will change the ini and dynamic nss params in
|
|
||||||
* mlme vdev priv obj.
|
|
||||||
*/
|
|
||||||
hdd_store_nss_chains_cfg_in_vdev(adapter);
|
|
||||||
|
|
||||||
return QDF_STATUS_SUCCESS;
|
return QDF_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user