Browse Source

qcacld-3.0: refine lim_set_eht_caps with new eht cap IE definition

Refine lim_set_eht_caps as wlan_eht_cap_info is updated according to
draft 1.3.

Change-Id: I2361caa928bfbdf4d6fdf0ef35bc76cebb041d99
CRs-Fixed: 3108905
Bing Sun 3 years ago
parent
commit
3f3362dc79
1 changed files with 32 additions and 20 deletions
  1. 32 20
      core/mac/src/pe/lim/lim_utils.c

+ 32 - 20
core/mac/src/pe/lim/lim_utils.c

@@ -8420,9 +8420,11 @@ void lim_set_eht_caps(struct mac_context *mac, struct pe_session *session,
 {
 	const uint8_t *ie = NULL;
 	tDot11fIEeht_cap dot11_cap;
+	tDot11fIEhe_cap dot11_he_cap;
 	struct wlan_eht_cap_info *eht_cap;
 
 	populate_dot11f_eht_caps(mac, session, &dot11_cap);
+	populate_dot11f_he_caps(mac, session, &dot11_he_cap);
 	lim_log_eht_cap(mac, &dot11_cap);
 
 	ie = wlan_get_ext_ie_ptr_from_ext_id(EHT_CAP_OUI_TYPE,
@@ -8496,25 +8498,35 @@ void lim_set_eht_caps(struct mac_context *mac, struct pe_session *session,
 			dot11_cap.mu_bformer_le_80mhz;
 		eht_cap->mu_bformer_160mhz = dot11_cap.mu_bformer_160mhz;
 		eht_cap->mu_bformer_320mhz = dot11_cap.mu_bformer_320mhz;
-		eht_cap->num_eht_mcs_map_20 = dot11_cap.num_eht_mcs_map_20;
-		eht_cap->num_eht_mcs_map_le_80 =
-			dot11_cap.num_eht_mcs_map_le_80;
-		eht_cap->num_eht_mcs_map_160 =
-			dot11_cap.num_eht_mcs_map_160;
-		eht_cap->eht_mcs_map_20 =
-			*((uint32_t *)dot11_cap.eht_mcs_map_20);
-		ie_start[1] += EHT_CAP_20M_MCS_MAP_LEN;
-		eht_cap->eht_mcs_map_le_80 =
-			*((uint32_t *)dot11_cap.eht_mcs_map_le_80);
-		ie_start[1] += EHT_CAP_80M_MCS_MAP_LEN;
-		eht_cap->eht_mcs_map_160 =
-			*((uint32_t *)dot11_cap.eht_mcs_map_160);
-		ie_start[1] += EHT_CAP_160M_MCS_MAP_LEN;
-		eht_cap->eht_mcs_map_320 =
-			*((uint32_t *)dot11_cap.eht_mcs_map_320);
-		ie_start[1] += EHT_CAP_320M_MCS_MAP_LEN;
-	}
 
+		if (!dot11_he_cap.chan_width_0 ||
+		    (!dot11_he_cap.chan_width_1 &&
+		     !dot11_he_cap.chan_width_2 &&
+		     !dot11_he_cap.chan_width_3)) {
+			qdf_mem_copy(eht_cap->eht_mcs_map_20,
+				     dot11_cap.eht_mcs_map_20,
+				     EHT_CAP_20M_MCS_MAP_LEN);
+			ie_start[1] += EHT_CAP_20M_MCS_MAP_LEN;
+		}
+		if (dot11_he_cap.chan_width_0 || dot11_he_cap.chan_width_1) {
+			qdf_mem_copy(eht_cap->eht_mcs_map_le_80,
+				     dot11_cap.eht_mcs_map_le_80,
+				     EHT_CAP_80M_MCS_MAP_LEN);
+			ie_start[1] += EHT_CAP_80M_MCS_MAP_LEN;
+		}
+		if (dot11_he_cap.chan_width_2) {
+			qdf_mem_copy(eht_cap->eht_mcs_map_160,
+				     dot11_cap.eht_mcs_map_160,
+				     EHT_CAP_160M_MCS_MAP_LEN);
+			ie_start[1] += EHT_CAP_160M_MCS_MAP_LEN;
+		}
+		if (eht_cap->support_320mhz_6ghz) {
+			qdf_mem_copy(eht_cap->eht_mcs_map_320,
+				     dot11_cap.eht_mcs_map_320,
+				     EHT_CAP_320M_MCS_MAP_LEN);
+			ie_start[1] += EHT_CAP_320M_MCS_MAP_LEN;
+		}
+	}
 }
 
 QDF_STATUS lim_send_eht_caps_ie(struct mac_context *mac_ctx,
@@ -8542,11 +8554,11 @@ QDF_STATUS lim_send_eht_caps_ie(struct mac_context *mac_ctx,
 
 	status_2g = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_EHT_CAP,
 				CDS_BAND_2GHZ, &eht_caps[2],
-				DOT11F_IE_EHT_CAP_MIN_LEN + 1);
+				eht_caps[1]);
 
 	status_5g = lim_send_ie(mac_ctx, vdev_id, DOT11F_EID_EHT_CAP,
 				CDS_BAND_5GHZ, &eht_caps[2],
-				DOT11F_IE_EHT_CAP_MIN_LEN + 1);
+				eht_caps[1]);
 
 	if (QDF_IS_STATUS_SUCCESS(status_2g) &&
 	    QDF_IS_STATUS_SUCCESS(status_5g)) {