Răsfoiți Sursa

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 1 an în urmă
părinte
comite
05c1a207b8
2 a modificat fișierele cu 154 adăugiri și 125 ștergeri
  1. 153 125
      core/hdd/src/wlan_hdd_cfg.c
  2. 1 0
      core/hdd/src/wlan_hdd_cfg80211.c

+ 153 - 125
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

+ 1 - 0
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);