Ver código fonte

qcacld-3.0: Send HE 6GHZ band Capabilities IE to firmware

Send HE 6GHZ band Capabilities IE to firmware by WMI command.
Firmware will add the IE to probe request during scan.

Change-Id: I4a383a46206a50da244485f71e38ca8e4e847c10
CRs-Fixed: 2621402
Liangwei Dong 5 anos atrás
pai
commit
c1aed9f593

+ 44 - 0
core/mac/src/pe/lim/lim_utils.c

@@ -5756,6 +5756,9 @@ QDF_STATUS lim_send_ies_per_band(struct mac_context *mac_ctx,
 
 	status = lim_send_he_caps_ie(mac_ctx, session, vdev_id);
 
+	if (QDF_IS_STATUS_SUCCESS(status))
+		status = lim_send_he_6g_band_caps_ie(mac_ctx, session, vdev_id);
+
 	return status;
 }
 
@@ -7478,6 +7481,47 @@ QDF_STATUS lim_populate_he_mcs_set(struct mac_context *mac_ctx,
 }
 #endif
 
+#if defined(CONFIG_BAND_6GHZ) && defined(WLAN_FEATURE_11AX)
+QDF_STATUS lim_send_he_6g_band_caps_ie(struct mac_context *mac_ctx,
+				       struct pe_session *session,
+				       uint8_t vdev_id)
+{
+	uint8_t he_6g_band_caps_ie[DOT11F_IE_HE_6GHZ_BAND_CAP_MIN_LEN + 3];
+	tDot11fIEhe_6ghz_band_cap he_6g_band_cap;
+	QDF_STATUS status;
+	uint32_t size = 0;
+	uint32_t result;
+
+	qdf_mem_zero(&he_6g_band_cap, sizeof(he_6g_band_cap));
+	populate_dot11f_he_6ghz_cap(mac_ctx, session, &he_6g_band_cap);
+	if (!he_6g_band_cap.present) {
+		pe_debug("no HE 6g band cap for vdev %d", vdev_id);
+		return QDF_STATUS_SUCCESS;
+	}
+
+	qdf_mem_zero(he_6g_band_caps_ie, sizeof(he_6g_band_caps_ie));
+	result = dot11f_pack_ie_he_6ghz_band_cap(mac_ctx, &he_6g_band_cap,
+						 he_6g_band_caps_ie,
+						 sizeof(he_6g_band_caps_ie),
+						 &size);
+	if (result != DOT11F_PARSE_SUCCESS) {
+		pe_err("pack erro for HE 6g band cap for vdev %d", vdev_id);
+		return QDF_STATUS_E_FAILURE;
+	}
+	pe_debug("send HE 6ghz band cap: 0x%01x 0x%01x for vdev %d",
+		 he_6g_band_caps_ie[3], he_6g_band_caps_ie[4],
+		 vdev_id);
+	status = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_HE_6GHZ_BAND_CAP,
+			     CDS_BAND_5GHZ, &he_6g_band_caps_ie[2],
+			     DOT11F_IE_HE_6GHZ_BAND_CAP_MIN_LEN + 1);
+	if (QDF_IS_STATUS_ERROR(status))
+		pe_err("Unable send HE 6g band Cap IE for 5GHZ band, status: %d",
+		       status);
+
+	return status;
+}
+#endif
+
 int
 lim_assoc_rej_get_remaining_delta(struct sir_rssi_disallow_lst *node)
 {

+ 24 - 0
core/mac/src/pe/lim/lim_utils.h

@@ -1551,6 +1551,30 @@ lim_update_he_6ghz_band_caps(struct mac_context *mac,
 }
 #endif
 
+#if defined(CONFIG_BAND_6GHZ) && defined(WLAN_FEATURE_11AX)
+/**
+ * lim_send_he_6g_band_caps_ie() - Send HE 6ghz band caps to FW
+ * @mac_ctx: Global MAC context
+ * @session: session ptr
+ * @vdev_id: vdev id
+ *
+ * Send HE 6ghz band capabilities IE to firmware
+ *
+ * Return: QDF_STATUS_SUCCESS on success
+ */
+QDF_STATUS lim_send_he_6g_band_caps_ie(struct mac_context *mac_ctx,
+				       struct pe_session *session,
+				       uint8_t vdev_id);
+#else
+static inline
+QDF_STATUS lim_send_he_6g_band_caps_ie(struct mac_context *mac_ctx,
+				       struct pe_session *session,
+				       uint8_t vdev_id)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 /**
  * lim_decrement_pending_mgmt_count: Decrement mgmt frame count
  * @mac_ctx: Pointer to global MAC structure

+ 7 - 3
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -6177,7 +6177,7 @@ populate_dot11f_he_6ghz_cap(struct mac_context *mac_ctx,
 	struct mlme_ht_capabilities_info *ht_cap_info;
 	struct mlme_vht_capabilities_info *vht_cap_info;
 
-	if (!session || !session->he_6ghz_band)
+	if (session && !session->he_6ghz_band)
 		return QDF_STATUS_SUCCESS;
 
 	ht_cap_info = &mac_ctx->mlme_cfg->ht_caps.ht_cap_info;
@@ -6186,8 +6186,12 @@ populate_dot11f_he_6ghz_cap(struct mac_context *mac_ctx,
 	he_6g_cap->present = 1;
 	he_6g_cap->min_mpdu_start_spacing =
 		mac_ctx->mlme_cfg->ht_caps.ampdu_params.mpdu_density;
-	he_6g_cap->max_ampdu_len_exp =
-		session->vht_config.max_ampdu_lenexp;
+	if (session)
+		he_6g_cap->max_ampdu_len_exp =
+			session->vht_config.max_ampdu_lenexp;
+	else
+		he_6g_cap->max_ampdu_len_exp =
+			vht_cap_info->ampdu_len_exponent & 0x7;
 	he_6g_cap->max_mpdu_len = vht_cap_info->ampdu_len;
 	he_6g_cap->sm_pow_save = ht_cap_info->mimo_power_save;
 	he_6g_cap->rd_responder = 0;