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

qcacmn: Add support to set MAC address command in WMI

As part of new enhancements, driver is supporting MAC address update
after VDE creation in the FW. To support this feature add WMI support
to send MAC address command to the FW.

Change-Id: Ie4b7291520793c8aa501fefccaf7b91ab22e9054
CRs-Fixed: 3084119
Bapiraju Alla 3 жил өмнө
parent
commit
707fb8a2f8

+ 12 - 0
wmi/inc/wmi_unified_api.h

@@ -4579,4 +4579,16 @@ QDF_STATUS
 wmi_unified_pdev_set_mec_timer(struct wmi_unified *wmi_handle,
 			       struct set_mec_timer_params *param);
 #endif
+
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+/**
+ * wmi_unified_send_set_mac_addr() - Send VDEV set MAC address command to FW
+ * @wmi_handle: WMI handle
+ * @params: Set MAC address command params
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS wmi_unified_send_set_mac_addr(struct wmi_unified *wmi_handle,
+					 struct set_mac_addr_params *params);
+#endif
 #endif /* _WMI_UNIFIED_API_H_ */

+ 20 - 0
wmi/inc/wmi_unified_param.h

@@ -4722,6 +4722,9 @@ typedef enum {
 #endif
 	wmi_pdev_fips_extend_event_id,
 	wmi_roam_frame_event_id,
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+	wmi_vdev_update_mac_addr_conf_eventid,
+#endif
 	wmi_events_max,
 } wmi_conv_event_id;
 
@@ -5336,6 +5339,9 @@ typedef enum {
 	wmi_service_phy_dma_byte_swap_support,
 	wmi_service_spectral_session_info_support,
 	wmi_service_mu_snif,
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+	wmi_service_dynamic_update_vdev_macaddr_support,
+#endif
 	wmi_services_max,
 } wmi_conv_service_ids;
 #define WMI_SERVICE_UNAVAILABLE 0xFFFF
@@ -8301,6 +8307,20 @@ struct set_mec_timer_params {
 };
 #endif
 
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+/**
+ * struct set_mac_addr_params - Set MAC address command parameter
+ * @vdev_id: vdev id
+ * @mac_addr: VDEV MAC address
+ * @mmld_addr: MLD address of the vdev
+ */
+struct set_mac_addr_params {
+	uint8_t vdev_id;
+	struct qdf_mac_addr mac_addr;
+	struct qdf_mac_addr mld_addr;
+};
+#endif
+
 #ifdef WLAN_FEATURE_SON
 /**
  * struct wmi_host_inst_rssi_stats_resp - inst rssi stats

+ 5 - 0
wmi/inc/wmi_unified_priv.h

@@ -2789,6 +2789,11 @@ QDF_STATUS
 (*extract_inst_rssi_stats_resp)(wmi_unified_t wmi_handle, void *evt_buf,
 			struct wmi_host_inst_rssi_stats_resp *inst_rssi_resp);
 #endif
+
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+QDF_STATUS (*send_set_mac_address_cmd)(wmi_unified_t wmi,
+				       struct set_mac_addr_params *params);
+#endif
 };
 
 /* Forward declartion for psoc*/

+ 11 - 0
wmi/src/wmi_unified_api.c

@@ -3662,3 +3662,14 @@ wmi_unified_pdev_set_mec_timer(struct wmi_unified *wmi_handle,
 	return QDF_STATUS_E_FAILURE;
 }
 #endif
+
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+QDF_STATUS wmi_unified_send_set_mac_addr(struct wmi_unified *wmi_handle,
+					 struct set_mac_addr_params *params)
+{
+	if (wmi_handle->ops->send_set_mac_address_cmd)
+		return wmi_handle->ops->send_set_mac_address_cmd(wmi_handle,
+								 params);
+	return QDF_STATUS_E_FAILURE;
+}
+#endif

+ 58 - 0
wmi/src/wmi_unified_tlv.c

@@ -16770,6 +16770,51 @@ send_set_halphy_cal_tlv(wmi_unified_t wmi_handle,
 	return ret;
 }
 
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+/**
+ * send_set_mac_address_cmd_tlv() - send set MAC address command to fw
+ * @wmi: wmi handle
+ * @params: set MAC address command params
+ *
+ * Return: QDF_STATUS_SUCCESS for success or error code
+ */
+static QDF_STATUS
+send_set_mac_address_cmd_tlv(wmi_unified_t wmi,
+			     struct set_mac_addr_params *params)
+{
+	wmi_vdev_update_mac_addr_cmd_fixed_param *cmd;
+	wmi_buf_t buf;
+	int32_t len = sizeof(*cmd);
+
+	buf = wmi_buf_alloc(wmi, len);
+	if (!buf)
+		return QDF_STATUS_E_NOMEM;
+
+	cmd = (wmi_vdev_update_mac_addr_cmd_fixed_param *)wmi_buf_data(buf);
+	WMITLV_SET_HDR(
+		&cmd->tlv_header,
+		WMITLV_TAG_STRUC_wmi_vdev_update_mac_addr_cmd_fixed_param,
+		WMITLV_GET_STRUCT_TLVLEN
+			       (wmi_vdev_update_mac_addr_cmd_fixed_param));
+	cmd->vdev_id = params->vdev_id;
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->mac_addr.bytes, &cmd->vdev_macaddr);
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(params->mld_addr.bytes, &cmd->mld_macaddr);
+
+	wmi_debug("vdev %d mac_addr " QDF_MAC_ADDR_FMT " mld_addr "
+		  QDF_MAC_ADDR_FMT, cmd->vdev_id,
+		  QDF_MAC_ADDR_REF(params->mac_addr.bytes),
+		  QDF_MAC_ADDR_REF(params->mld_addr.bytes));
+	wmi_mtrace(WMI_VDEV_UPDATE_MAC_ADDR_CMDID, cmd->vdev_id, 0);
+	if (wmi_unified_cmd_send(wmi, buf, len,
+				 WMI_VDEV_UPDATE_MAC_ADDR_CMDID)) {
+		wmi_buf_free(buf);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 struct wmi_ops tlv_ops =  {
 	.send_vdev_create_cmd = send_vdev_create_cmd_tlv,
 	.send_vdev_delete_cmd = send_vdev_delete_cmd_tlv,
@@ -17178,9 +17223,14 @@ struct wmi_ops tlv_ops =  {
 	.send_mgmt_rx_reo_filter_config_cmd =
 		send_mgmt_rx_reo_filter_config_cmd_tlv,
 #endif
+
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD
 	.send_roam_set_param_cmd = send_roam_set_param_cmd_tlv,
 #endif /* WLAN_FEATURE_ROAM_OFFLOAD */
+
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+	.send_set_mac_address_cmd = send_set_mac_address_cmd_tlv,
+#endif
 };
 
 /**
@@ -17619,6 +17669,10 @@ event_ids[wmi_roam_scan_chan_list_id] =
 #endif
 	event_ids[wmi_roam_frame_event_id] =
 				WMI_ROAM_FRAME_EVENTID;
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+	event_ids[wmi_vdev_update_mac_addr_conf_eventid] =
+			WMI_VDEV_UPDATE_MAC_ADDR_CONF_EVENTID;
+#endif
 }
 
 #ifdef WLAN_FEATURE_LINK_LAYER_STATS
@@ -18058,6 +18112,10 @@ static void populate_tlv_service(uint32_t *wmi_service)
 	wmi_service[wmi_service_spectral_session_info_support] =
 			WMI_SERVICE_UNAVAILABLE;
 	wmi_service[wmi_service_mu_snif] = WMI_SERVICE_MU_SNIF;
+#ifdef WLAN_FEATURE_DYNAMIC_MAC_ADDR_UPDATE
+	wmi_service[wmi_service_dynamic_update_vdev_macaddr_support] =
+			WMI_SERVICE_DYNAMIC_VDEV_MAC_ADDR_UPDATE_SUPPORT;
+#endif
 }
 
 /**