Эх сурвалжийг харах

qcacmn: Critical update signaling for 20TU Probe Response

Critical update is the explicit signaling for STA to notify
any change in BSS param.

Present support is there for beacon, host notify to FW by
updating current link CU param in wmi_bcn_tmpl_ml_info TLV
of BCN TMPL CMD by setting the corresponding cu_vdev_map
for category 1 / category 2 based on change in critical
update params of ML VDEV.

The same Critical update signaling is extended to 20TU
unsolicited broadcast probe response.
In 6 GHz link host notify the same category 1 / category 2
cu_vdev_map critical update params of ML VDEVs in 20TU
enabled group wmi_prb_tmpl_ml_info TLV of WMI_PRB_TMPL_CMD.

CRs-Fixed: 3314429
Change-Id: I84dbd1901c5a3f2ef28f981c581fd7350d147829
Basamma Yakkanahalli 2 жил өмнө
parent
commit
23001226b9

+ 31 - 1
wmi/inc/wmi_unified_11be_tlv.h

@@ -87,7 +87,7 @@ uint8_t *bcn_tmpl_add_ml_partner_links(uint8_t *buf_ptr,
 size_t bcn_tmpl_ml_info_size(struct beacon_tmpl_params *param);
 
 /**
- * bcn_tmpl_add_ml_info - Add MLO info to update Critical Update info in
+ * bcn_tmpl_add_ml_info() - Add MLO info to update Critical Update info in
  *                                 beacon template command
  * @buf_ptr: pointer to beacon cmd buffer.
  * @param: pointer to beacon template params
@@ -96,6 +96,24 @@ size_t bcn_tmpl_ml_info_size(struct beacon_tmpl_params *param);
  */
 uint8_t *bcn_tmpl_add_ml_info(uint8_t *buf_ptr,
 			      struct beacon_tmpl_params *param);
+/**
+ * prb_resp_tmpl_ml_info_size() - Get ML info size in 20TU probe resp template
+ * @param: Pointer to 20TU probe response template param
+ *
+ * Return: size of ML info in 20TU probe response template
+ */
+size_t prb_resp_tmpl_ml_info_size(struct wmi_probe_resp_params *param);
+
+/**
+ * prb_resp_tmpl_add_ml_info() - Add MLO info to update Critical Update info in
+ *                             20TU probe response template command
+ * @buf_ptr: pointer to 20TU probe response cmd buffer.
+ * @param: pointer to 20TU probe response template params
+ *
+ * Return: pointer to new offset of cmd buffer
+ */
+uint8_t *prb_resp_tmpl_add_ml_info(uint8_t *buf_ptr,
+				   struct wmi_probe_resp_params *param);
 /**
  *  peer_create_add_mlo_params() - Add MLO params in peer create cmd
  *  @buf_ptr: pointer to peer create cmd buffer.
@@ -232,6 +250,18 @@ static uint8_t *bcn_tmpl_add_ml_info(uint8_t *buf_ptr,
 	return buf_ptr + WMI_TLV_HDR_SIZE;
 }
 
+static size_t prb_resp_tmpl_ml_info_size(struct wmi_probe_resp_params *param)
+{
+	return WMI_TLV_HDR_SIZE;
+}
+
+static uint8_t *prb_resp_tmpl_add_ml_info(uint8_t *buf_ptr,
+					  struct wmi_probe_resp_params *param)
+{
+	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC, 0);
+	return buf_ptr + WMI_TLV_HDR_SIZE;
+}
+
 static uint8_t *peer_create_add_mlo_params(uint8_t *buf_ptr,
 					  struct peer_create_params *req)
 {

+ 24 - 0
wmi/inc/wmi_unified_param.h

@@ -1779,14 +1779,38 @@ struct wmi_lro_config_cmd_t {
 	uint32_t pdev_id;
 };
 
+#ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * struct mlo_prb_resp_tmpl_ml_info - Impacted link critical update information
+ * @hw_link_id: Unique hw link id across SoCs
+ * CU vdev map for the Critical update category-1 (Inclusion of CU IES)
+ * @cu_vdev_map_cat1_lo: bits 31:0 to represent vdev ids 0 to 31
+ * @cu_vdev_map_cat1_hi: bits 63:32 to represent vdev ids 32 to 63
+ * CU vdev map for the Critical update category-2 (modification of CU IES)
+ * @cu_vdev_map_cat2_lo: bits 31:0 to represent vdev ids 0 to 31
+ * @cu_vdev_map_cat2_hi: bits 63:32 to represent vdev ids 32 to 63
+ */
+struct mlo_prb_resp_tmpl_ml_info {
+	uint32_t hw_link_id;
+	uint32_t cu_vdev_map_cat1_lo;
+	uint32_t cu_vdev_map_cat1_hi;
+	uint32_t cu_vdev_map_cat2_lo;
+	uint32_t cu_vdev_map_cat2_hi;
+};
+#endif
+
 /**
  * struct wmi_probe_resp_params - send probe response parameters
  * @prb_rsp_template_frm: pointer to template probe response template
  * @prb_rsp_template_len: length of probe response template
+ * @cu_ml_info: Impacted link critical update information
  */
 struct wmi_probe_resp_params {
 	uint8_t *prb_rsp_template_frm;
 	uint32_t prb_rsp_template_len;
+#ifdef WLAN_FEATURE_11BE_MLO
+	struct mlo_prb_resp_tmpl_ml_info cu_ml_info;
+#endif
 };
 
 /* struct set_key_params: structure containing

+ 29 - 0
wmi/src/wmi_unified_11be_tlv.c

@@ -181,6 +181,35 @@ uint8_t *bcn_tmpl_add_ml_info(uint8_t *buf_ptr,
 	return buf_ptr + sizeof(wmi_bcn_tmpl_ml_info);
 }
 
+size_t prb_resp_tmpl_ml_info_size(struct wmi_probe_resp_params *param)
+{
+	return (WMI_TLV_HDR_SIZE + sizeof(wmi_prb_resp_tmpl_ml_info));
+}
+
+uint8_t *prb_resp_tmpl_add_ml_info(uint8_t *buf_ptr,
+				   struct wmi_probe_resp_params *param)
+{
+	wmi_prb_resp_tmpl_ml_info *ml_info;
+
+	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_STRUC,
+		       sizeof(wmi_prb_resp_tmpl_ml_info));
+	buf_ptr += WMI_TLV_HDR_SIZE;
+
+	ml_info = (wmi_prb_resp_tmpl_ml_info *)buf_ptr;
+
+	WMITLV_SET_HDR(&ml_info->tlv_header,
+		       WMITLV_TAG_STRUC_wmi_prb_resp_tmpl_ml_info,
+		       WMITLV_GET_STRUCT_TLVLEN(wmi_prb_resp_tmpl_ml_info));
+
+	ml_info->hw_link_id = param->cu_ml_info.hw_link_id;
+	ml_info->cu_vdev_map_cat1_lo = param->cu_ml_info.cu_vdev_map_cat1_lo;
+	ml_info->cu_vdev_map_cat1_hi = param->cu_ml_info.cu_vdev_map_cat1_hi;
+	ml_info->cu_vdev_map_cat2_lo = param->cu_ml_info.cu_vdev_map_cat2_lo;
+	ml_info->cu_vdev_map_cat2_hi = param->cu_ml_info.cu_vdev_map_cat2_hi;
+
+	return buf_ptr + sizeof(wmi_prb_resp_tmpl_ml_info);
+}
+
 size_t peer_create_mlo_params_size(struct peer_create_params *req)
 {
 	return sizeof(wmi_peer_create_mlo_params) + WMI_TLV_HDR_SIZE;

+ 4 - 1
wmi/src/wmi_unified_tlv.c

@@ -5353,7 +5353,8 @@ static QDF_STATUS send_probe_rsp_tmpl_send_cmd_tlv(wmi_unified_t wmi_handle,
 
 	wmi_buf_len = sizeof(wmi_prb_tmpl_cmd_fixed_param) +
 			sizeof(wmi_bcn_prb_info) + WMI_TLV_HDR_SIZE +
-			tmpl_len_aligned;
+			tmpl_len_aligned +
+			prb_resp_tmpl_ml_info_size(probe_rsp_info);
 
 	if (wmi_buf_len > WMI_BEACON_TX_BUFFER_SIZE) {
 		wmi_err("wmi_buf_len: %d > %d. Can't send wmi cmd",
@@ -5386,6 +5387,8 @@ static QDF_STATUS send_probe_rsp_tmpl_send_cmd_tlv(wmi_unified_t wmi_handle,
 	WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE, tmpl_len_aligned);
 	buf_ptr += WMI_TLV_HDR_SIZE;
 	qdf_mem_copy(buf_ptr, probe_rsp_info->prb_rsp_template_frm, tmpl_len);
+	buf_ptr += tmpl_len_aligned;
+	buf_ptr = prb_resp_tmpl_add_ml_info(buf_ptr, probe_rsp_info);
 
 	wmi_mtrace(WMI_PRB_TMPL_CMDID, cmd->vdev_id, 0);
 	ret = wmi_unified_cmd_send(wmi_handle,