diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index ba82f36da0..f870df685b 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -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 diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 91c69f04bb..7e538401a5 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -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);