Browse Source

qcacld-3.0: Properly populate EHT PHY and MAC caps to wiphy

If EHT cfg is not present, there's no need to populate EHT PHY
and MAC caps to wiphy.

Change-Id: If4d002976f23d1fb847c7976cce6d2c1d5c42260
CRs-Fixed: 2998476
Jia Ding 3 years ago
parent
commit
3b5b3b6af5
3 changed files with 51 additions and 45 deletions
  1. 2 5
      core/hdd/inc/wlan_hdd_eht.h
  2. 48 39
      core/hdd/src/wlan_hdd_eht.c
  3. 1 1
      core/hdd/src/wlan_hdd_main.c

+ 2 - 5
core/hdd/inc/wlan_hdd_eht.h

@@ -72,14 +72,12 @@ void wlan_hdd_check_11be_support(struct hdd_beacon_data *beacon,
 /**
  * hdd_update_wiphy_eht_cap() - update the wiphy with eht capabilities
  * @hdd_ctx: HDD context
- * @cfg: WMA target configuration
  *
  * update wiphy with the eht capabilties.
  *
  * Return: None
  */
-void hdd_update_wiphy_eht_cap(struct hdd_context *hdd_ctx,
-			      struct wma_tgt_cfg *cfg);
+void hdd_update_wiphy_eht_cap(struct hdd_context *hdd_ctx);
 
 /**
  * wlan_hdd_get_mlo_link_id() - get link id and number of links
@@ -104,8 +102,7 @@ static inline void wlan_hdd_check_11be_support(struct hdd_beacon_data *beacon,
 }
 
 static inline
-void hdd_update_wiphy_eht_cap(struct hdd_context *hdd_ctx,
-			      struct wma_tgt_cfg *cfg)
+void hdd_update_wiphy_eht_cap(struct hdd_context *hdd_ctx)
 {
 }
 #endif

+ 48 - 39
core/hdd/src/wlan_hdd_eht.c

@@ -28,6 +28,15 @@
 #include "wlan_utility.h"
 #include "wlan_mlme_ucfg_api.h"
 
+#define CHAN_WIDTH_SET_40MHZ_IN_2G \
+	IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G
+#define CHAN_WIDTH_SET_40MHZ_80MHZ_IN_5G \
+	IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G
+#define CHAN_WIDTH_SET_160MHZ_IN_5G \
+	IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G
+#define CHAN_WIDTH_SET_80PLUS80_MHZ_IN_5G \
+	IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G
+
 void hdd_update_tgt_eht_cap(struct hdd_context *hdd_ctx,
 			    struct wma_tgt_cfg *cfg)
 {
@@ -89,7 +98,7 @@ void wlan_hdd_check_11be_support(struct hdd_beacon_data *beacon,
 
 static void
 hdd_update_wiphy_eht_caps_6ghz(struct hdd_context *hdd_ctx,
-			       struct wma_tgt_cfg *cfg)
+			       tDot11fIEeht_cap eht_cap)
 {
 	struct ieee80211_supported_band *band_6g =
 		   hdd_ctx->wiphy->bands[HDD_NL80211_BAND_6GHZ];
@@ -104,25 +113,24 @@ hdd_update_wiphy_eht_caps_6ghz(struct hdd_context *hdd_ctx,
 
 	hdd_ctx->iftype_data_6g->types_mask =
 		(BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP));
-	hdd_ctx->iftype_data_6g->eht_cap.has_eht = true;
-	hdd_ctx->iftype_data_6g->he_cap.has_he = true;
 	band_6g->n_iftype_data = 1;
+	band_6g->iftype_data = hdd_ctx->iftype_data_6g;
+
+	hdd_ctx->iftype_data_6g->eht_cap.has_eht = eht_cap.present;
+	if (!hdd_ctx->iftype_data_6g->eht_cap.has_eht)
+		return;
+
+	hdd_ctx->iftype_data_6g->he_cap.has_he = true;
 
 	if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
-		phy_info[0] |=
-		      IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G;
+		phy_info[0] |= CHAN_WIDTH_SET_40MHZ_80MHZ_IN_5G;
 	if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
-		phy_info[0] |=
-			IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
+		phy_info[0] |= CHAN_WIDTH_SET_160MHZ_IN_5G;
 	if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
-		phy_info[0] |=
-		     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
-
-	band_6g->iftype_data = hdd_ctx->iftype_data_6g;
+		phy_info[0] |= CHAN_WIDTH_SET_80PLUS80_MHZ_IN_5G;
 }
 
-void hdd_update_wiphy_eht_cap(struct hdd_context *hdd_ctx,
-			      struct wma_tgt_cfg *cfg)
+void hdd_update_wiphy_eht_cap(struct hdd_context *hdd_ctx)
 {
 	tDot11fIEeht_cap eht_cap_cfg;
 	struct ieee80211_supported_band *band_2g =
@@ -140,49 +148,50 @@ void hdd_update_wiphy_eht_cap(struct hdd_context *hdd_ctx,
 	hdd_enter();
 
 	status = ucfg_mlme_cfg_get_eht_caps(hdd_ctx->psoc, &eht_cap_cfg);
-
 	if (QDF_IS_STATUS_ERROR(status))
 		return;
 
 	if (band_2g) {
 		hdd_ctx->iftype_data_2g->types_mask =
 			(BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP));
-		hdd_ctx->iftype_data_2g->eht_cap.has_eht = eht_cap_cfg.present;
-		hdd_ctx->iftype_data_2g->he_cap.has_he = true;
 		band_2g->n_iftype_data = 1;
 		band_2g->iftype_data = hdd_ctx->iftype_data_2g;
 
-		ucfg_mlme_get_channel_bonding_24ghz(hdd_ctx->psoc,
-						    &channel_bonding_mode_2g);
-		if (channel_bonding_mode_2g)
-			phy_info_2g[0] |=
-			    IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_IN_2G;
-		qdf_mem_copy(
-		 &hdd_ctx->iftype_data_2g->eht_cap.eht_cap_elem.mac_cap_info[0],
-		 &cfg->eht_cap.eht_mac_cap, 6);
-		qdf_mem_copy(
-		 &hdd_ctx->iftype_data_2g->eht_cap.eht_cap_elem.phy_cap_info[0],
-		 &cfg->eht_cap.phy_cap_bytes, 11);
+		hdd_ctx->iftype_data_2g->eht_cap.has_eht = eht_cap_cfg.present;
+		if (hdd_ctx->iftype_data_2g->eht_cap.has_eht) {
+			hdd_ctx->iftype_data_2g->he_cap.has_he = true;
+
+			ucfg_mlme_get_channel_bonding_24ghz(
+					hdd_ctx->psoc,
+					&channel_bonding_mode_2g);
+			if (channel_bonding_mode_2g)
+				phy_info_2g[0] |= CHAN_WIDTH_SET_40MHZ_IN_2G;
+		}
 	}
+
 	if (band_5g) {
 		hdd_ctx->iftype_data_5g->types_mask =
 			(BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_AP));
-		hdd_ctx->iftype_data_5g->eht_cap.has_eht = eht_cap_cfg.present;
-		hdd_ctx->iftype_data_5g->he_cap.has_he = true;
 		band_5g->n_iftype_data = 1;
 		band_5g->iftype_data = hdd_ctx->iftype_data_5g;
-		if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
-			phy_info_5g[0] |=
-				IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_40MHZ_80MHZ_IN_5G;
-		if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
-			phy_info_5g[0] |=
-				IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
-		if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
-			phy_info_5g[0] |=
-			     IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
+
+		hdd_ctx->iftype_data_5g->eht_cap.has_eht = eht_cap_cfg.present;
+		if (hdd_ctx->iftype_data_5g->eht_cap.has_eht) {
+			hdd_ctx->iftype_data_5g->he_cap.has_he = true;
+			if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ)
+				phy_info_5g[0] |=
+					CHAN_WIDTH_SET_40MHZ_80MHZ_IN_5G;
+			if (max_fw_bw >= WNI_CFG_VHT_CHANNEL_WIDTH_160MHZ)
+				phy_info_5g[0] |=
+					CHAN_WIDTH_SET_160MHZ_IN_5G;
+			if (max_fw_bw >=
+				WNI_CFG_VHT_CHANNEL_WIDTH_80_PLUS_80MHZ)
+				phy_info_5g[0] |=
+					CHAN_WIDTH_SET_80PLUS80_MHZ_IN_5G;
+		}
 	}
 
-	hdd_update_wiphy_eht_caps_6ghz(hdd_ctx, cfg);
+	hdd_update_wiphy_eht_caps_6ghz(hdd_ctx, eht_cap_cfg);
 
 	hdd_exit();
 }

+ 1 - 1
core/hdd/src/wlan_hdd_main.c

@@ -2732,7 +2732,7 @@ int hdd_update_tgt_cfg(hdd_handle_t hdd_handle, struct wma_tgt_cfg *cfg)
 	}
 	hdd_update_tgt_twt_cap(hdd_ctx, cfg);
 	hdd_update_tgt_eht_cap(hdd_ctx, cfg);
-	hdd_update_wiphy_eht_cap(hdd_ctx, cfg);
+	hdd_update_wiphy_eht_cap(hdd_ctx);
 
 	for (band = NSS_CHAINS_BAND_2GHZ; band < NSS_CHAINS_BAND_MAX; band++) {
 		sme_modify_nss_chains_tgt_cfg(hdd_ctx->mac_handle,