diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index c33dd782c925..5cd343bb5b27 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -1288,35 +1288,39 @@ QDF_STATUS hdd_get_nss(struct hdd_adapter *adapter, uint8_t *nss) return status; } -QDF_STATUS hdd_get_tx_nss(struct hdd_adapter *adapter, uint8_t *tx_nss) +/** + * hdd_get_sap_tx_nss() - get the sap tx nss + * @vdev: Pointer to vdev + * @hdd_ctx: Pointer to hdd context + * @tx_nss: pointer to tx_nss + * + * get the sap tx nss + * + * Return: None + */ +static QDF_STATUS hdd_get_sap_tx_nss(struct wlan_objmgr_vdev *vdev, + struct hdd_context *hdd_ctx, + uint8_t *tx_nss) { - struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); - struct wlan_objmgr_vdev *vdev; - QDF_STATUS status = QDF_STATUS_SUCCESS; struct wlan_mlme_nss_chains *dynamic_cfg; enum band_info operating_band; - uint8_t proto_generic_nss; + mac_handle_t mac_handle; + uint8_t vdev_nss; - vdev = hdd_objmgr_get_vdev(adapter); - if (!vdev) + mac_handle = hdd_ctx->mac_handle; + if (!mac_handle) { + hdd_debug("NULL MAC handle"); return QDF_STATUS_E_INVAL; + } - proto_generic_nss = wlan_vdev_mlme_get_nss(vdev); + operating_band = hdd_get_sap_operating_band(hdd_ctx); + 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_err("nss chain dynamic config NULL"); - hdd_objmgr_put_vdev(vdev); + hdd_debug("nss chain dynamic config NULL"); return QDF_STATUS_E_INVAL; } - if (adapter->device_mode == QDF_SAP_MODE || - adapter->device_mode == QDF_P2P_GO_MODE) { - operating_band = hdd_get_sap_operating_band( - adapter->hdd_ctx); - } else { - operating_band = hdd_conn_get_connected_band( - &adapter->session.station); - } switch (operating_band) { case BAND_2G: *tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_2GHZ]; @@ -1325,45 +1329,116 @@ QDF_STATUS hdd_get_tx_nss(struct hdd_adapter *adapter, uint8_t *tx_nss) *tx_nss = dynamic_cfg->tx_nss[NSS_CHAINS_BAND_5GHZ]; break; default: - *tx_nss = proto_generic_nss; + hdd_debug("Band %d Not 2G or 5G", operating_band); + break; } - if (*tx_nss > proto_generic_nss) - *tx_nss = proto_generic_nss; - } else - *tx_nss = proto_generic_nss; - hdd_objmgr_put_vdev(vdev); + } else { + *tx_nss = vdev_nss; + } - return status; + return QDF_STATUS_SUCCESS; } -QDF_STATUS hdd_get_rx_nss(struct hdd_adapter *adapter, uint8_t *rx_nss) +/** + * hdd_get_sta_tx_nss() - get the sta tx nss + * @hdd_ctx: Pointer to hdd context + * @adapter: Pointer to adapter + * @vdev: Pointer to vdev + * @tx_nss: pointer to tx_nss + * + * get the STA tx nss + * + * Return: None + */ +static QDF_STATUS hdd_get_sta_tx_nss(struct hdd_adapter *adapter, + struct hdd_context *hdd_ctx, + struct wlan_objmgr_vdev *vdev, + uint8_t *tx_nss) { - struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); - struct wlan_objmgr_vdev *vdev; - QDF_STATUS status = QDF_STATUS_SUCCESS; struct wlan_mlme_nss_chains *dynamic_cfg; enum band_info operating_band; uint8_t proto_generic_nss; - vdev = hdd_objmgr_get_vdev(adapter); - if (!vdev) - return QDF_STATUS_E_INVAL; - proto_generic_nss = wlan_vdev_mlme_get_nss(vdev); if (hdd_ctx->dynamic_nss_chains_support) { dynamic_cfg = mlme_get_dynamic_vdev_config(vdev); if (!dynamic_cfg) { - hdd_err("nss chain dynamic config NULL"); - hdd_objmgr_put_vdev(vdev); + hdd_debug("nss chain dynamic config NULL"); return QDF_STATUS_E_INVAL; } - if (adapter->device_mode == QDF_SAP_MODE || - adapter->device_mode == QDF_P2P_GO_MODE) { - operating_band = hdd_get_sap_operating_band( - adapter->hdd_ctx); - } else { - operating_band = hdd_conn_get_connected_band( + operating_band = hdd_conn_get_connected_band( &adapter->session.station); + 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; + } + if (*tx_nss > proto_generic_nss) + *tx_nss = proto_generic_nss; + } else + *tx_nss = proto_generic_nss; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS hdd_get_tx_nss(struct hdd_adapter *adapter, uint8_t *tx_nss) +{ + struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + struct wlan_objmgr_vdev *vdev; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) + return QDF_STATUS_E_INVAL; + + if (adapter->device_mode == QDF_SAP_MODE || + adapter->device_mode == QDF_P2P_GO_MODE) + status = hdd_get_sap_tx_nss(vdev, hdd_ctx, tx_nss); + else + status = hdd_get_sta_tx_nss(adapter, hdd_ctx, vdev, tx_nss); + hdd_objmgr_put_vdev(vdev); + + return status; +} + +/** + * hdd_get_sap_rx_nss() - get the sap rx nss + * @vdev: Pointer to vdev + * @hdd_ctx: Pointer to hdd context + * @rx_nss: pointer to rx_nss + * + * get the sap tx nss + * + * Return: None + */ +static QDF_STATUS hdd_get_sap_rx_nss(struct wlan_objmgr_vdev *vdev, + struct hdd_context *hdd_ctx, + uint8_t *rx_nss) +{ + 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(hdd_ctx); + 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_debug("nss chain dynamic config NULL"); + return QDF_STATUS_E_INVAL; } switch (operating_band) { case BAND_2G: @@ -1373,12 +1448,79 @@ QDF_STATUS hdd_get_rx_nss(struct hdd_adapter *adapter, uint8_t *rx_nss) *rx_nss = dynamic_cfg->rx_nss[NSS_CHAINS_BAND_5GHZ]; break; default: - *rx_nss = proto_generic_nss; + hdd_debug("Band %d Not 2G or 5G", operating_band); + break; + } + } else { + *rx_nss = vdev_nss; + } + + return QDF_STATUS_SUCCESS; +} + +/** + * hdd_get_sta_tx_nss() - get the sta tx nss + * @hdd_ctx: Pointer to hdd context + * @adapter: Pointer to adapter + * @vdev: Pointer to vdev + * @tx_nss: pointer to tx_nss + * + * get the STA tx nss + * + * Return: None + */ +static QDF_STATUS hdd_get_sta_rx_nss(struct hdd_adapter *adapter, + struct hdd_context *hdd_ctx, + struct wlan_objmgr_vdev *vdev, + uint8_t *rx_nss) +{ + struct wlan_mlme_nss_chains *dynamic_cfg; + enum band_info operating_band; + uint8_t proto_generic_nss; + + proto_generic_nss = wlan_vdev_mlme_get_nss(vdev); + if (hdd_ctx->dynamic_nss_chains_support) { + dynamic_cfg = mlme_get_dynamic_vdev_config(vdev); + if (!dynamic_cfg) { + hdd_debug("nss chain dynamic config NULL"); + return QDF_STATUS_E_INVAL; + } + operating_band = hdd_conn_get_connected_band( + &adapter->session.station); + 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; } if (*rx_nss > proto_generic_nss) *rx_nss = proto_generic_nss; } else *rx_nss = proto_generic_nss; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS hdd_get_rx_nss(struct hdd_adapter *adapter, uint8_t *rx_nss) +{ + struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter); + struct wlan_objmgr_vdev *vdev; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + vdev = hdd_objmgr_get_vdev(adapter); + if (!vdev) + return QDF_STATUS_E_INVAL; + + if (adapter->device_mode == QDF_SAP_MODE || + adapter->device_mode == QDF_P2P_GO_MODE) + status = hdd_get_sap_rx_nss(vdev, hdd_ctx, rx_nss); + else + status = hdd_get_sta_rx_nss(adapter, hdd_ctx, vdev, rx_nss); hdd_objmgr_put_vdev(vdev); return status; diff --git a/core/sme/inc/sme_api.h b/core/sme/inc/sme_api.h index e00a6441365b..2bb4434509d4 100644 --- a/core/sme/inc/sme_api.h +++ b/core/sme/inc/sme_api.h @@ -2130,6 +2130,19 @@ void sme_set_vdev_ies_per_band(mac_handle_t mac_handle, uint8_t vdev_id, void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2); +/** + * sme_get_sap_vdev_type_nss() - get the sap nss per vdev type + * @mac_handle: Opaque handle to the global MAC context + * @vdev_nss: Pointer to vdev_nss + * @band: 5G or 2.4G band + * + * Get SAP vdev nss + * + * Return: None + */ +void sme_get_sap_vdev_type_nss(mac_handle_t mac_handle, uint8_t *vdev_nss, + enum band_info band); + /** * sme_update_vdev_type_nss() - sets the nss per vdev type * @mac_handle: Opaque handle to the global MAC context diff --git a/core/sme/src/common/sme_api.c b/core/sme/src/common/sme_api.c index acf00d0ee6f2..1599dabc5773 100644 --- a/core/sme/src/common/sme_api.c +++ b/core/sme/src/common/sme_api.c @@ -13248,6 +13248,17 @@ void sme_set_pdev_ht_vht_ies(mac_handle_t mac_handle, bool enable2x2) } } +void sme_get_sap_vdev_type_nss(mac_handle_t mac_handle, uint8_t *vdev_nss, + enum band_info band) +{ + struct mac_context *mac_ctx = MAC_CONTEXT(mac_handle); + + if (band == BAND_5G) + *vdev_nss = mac_ctx->vdev_type_nss_5g.sap; + else + *vdev_nss = mac_ctx->vdev_type_nss_2g.sap; +} + void sme_update_vdev_type_nss(mac_handle_t mac_handle, uint8_t max_supp_nss, enum nss_chains_band_info band) {