Browse Source

qcacmn: Add functionality to send bridge MAC to firmware

Add functions to send bridge MAC programmed from user
space to firmware.This change is part of a workaround
to fix an looping issue which resulted in wrongly adding
bridge's own MAC address to fw WDS table.Send MAC address
to target to avoid adding our own bridge address to fw
WDS table as part of source port learning.

Change-Id: I815d3c3f106cd2f528ac9172712ec6c2f47f4410
CRs-Fixed: 2070956
Jeevan Kukkalli 7 years ago
parent
commit
e48dc35af0

+ 11 - 0
wmi/inc/wmi_unified_api.h

@@ -1047,6 +1047,17 @@ QDF_STATUS wmi_unified_peer_add_wds_entry_cmd_send(void *wmi_hdl,
 QDF_STATUS wmi_unified_peer_del_wds_entry_cmd_send(void *wmi_hdl,
 				struct peer_del_wds_entry_params *param);
 
+/**
+ *  wmi_unified_set_bridge_mac_addr_cmd_send() - WMI set bridge mac addr cmd function
+ *  @param wmi_hdl      : handle to WMI.
+ *  @param param        : pointer to hold bridge mac addr param
+ *
+ *  @return QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_set_bridge_mac_addr_cmd_send(void *wmi_hdl,
+				struct set_bridge_mac_addr_params *param);
+
+
 QDF_STATUS wmi_unified_peer_update_wds_entry_cmd_send(void *wmi_hdl,
 				struct peer_update_wds_entry_params *param);
 

+ 8 - 0
wmi/inc/wmi_unified_param.h

@@ -3548,6 +3548,14 @@ struct peer_del_wds_entry_params {
 	uint32_t vdev_id;
 };
 
+/**
+ * struct set_bridge_mac_addr_params - set bridge MAC addr params
+ * @dest_addr: Pointer to bridge macaddr
+ */
+struct set_bridge_mac_addr_params {
+	uint8_t *bridge_addr;
+};
+
 /**
  * struct peer_updatewds_entry_params - WDS peer entry update params
  * @wds_macaddr: Pointer to destination macaddr

+ 3 - 0
wmi/inc/wmi_unified_priv.h

@@ -844,6 +844,9 @@ QDF_STATUS (*send_peer_add_wds_entry_cmd)(wmi_unified_t wmi_handle,
 QDF_STATUS (*send_peer_del_wds_entry_cmd)(wmi_unified_t wmi_handle,
 		struct peer_del_wds_entry_params *param);
 
+QDF_STATUS (*send_set_bridge_mac_addr_cmd)(wmi_unified_t wmi_handle,
+		struct set_bridge_mac_addr_params *param);
+
 QDF_STATUS (*send_peer_update_wds_entry_cmd)(wmi_unified_t wmi_handle,
 		struct peer_update_wds_entry_params *param);
 

+ 19 - 0
wmi/src/wmi_unified_api.c

@@ -3840,6 +3840,25 @@ QDF_STATUS wmi_unified_peer_del_wds_entry_cmd_send(void *wmi_hdl,
 	return QDF_STATUS_E_FAILURE;
 }
 
+/**
+ *  wmi_unified_set_bridge_mac_addr_cmd_send() - WMI set bridge mac addr cmd function
+ *  @param wmi_hdl      : handle to WMI.
+ *  @param param        : pointer to hold bridge mac addr param
+ *
+ *  @return QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
+ */
+QDF_STATUS wmi_unified_set_bridge_mac_addr_cmd_send(void *wmi_hdl,
+				struct set_bridge_mac_addr_params *param)
+{
+	wmi_unified_t wmi_handle = (wmi_unified_t) wmi_hdl;
+
+	if (wmi_handle->ops->send_set_bridge_mac_addr_cmd)
+		return wmi_handle->ops->send_set_bridge_mac_addr_cmd(wmi_handle,
+				param);
+
+	return QDF_STATUS_E_FAILURE;
+}
+
 /**
  *  wmi_unified_peer_update_wds_entry_cmd_send() - WMI update wds entry cmd function
  *  @param wmi_handle      : handle to WMI.

+ 31 - 0
wmi/src/wmi_unified_non_tlv.c

@@ -663,6 +663,36 @@ static QDF_STATUS send_peer_del_wds_entry_cmd_non_tlv(wmi_unified_t wmi_handle,
 			WMI_PEER_REMOVE_WDS_ENTRY_CMDID);
 }
 
+/**
+ * send_set_bridge_mac_addr_cmd_non_tlv() - send set bridge MAC addr command to fw
+ * @wmi_handle: wmi handle
+ * @param: pointer holding bridge addr details
+ *
+ * Return: 0 for success or error code
+ */
+QDF_STATUS send_set_bridge_mac_addr_cmd_non_tlv(wmi_unified_t wmi_handle,
+					struct set_bridge_mac_addr_params *param)
+{
+	wmi_peer_add_wds_entry_cmd *cmd;
+	wmi_buf_t buf;
+	uint8_t null_macaddr[IEEE80211_ADDR_LEN];
+	int len = sizeof(wmi_peer_add_wds_entry_cmd);
+
+	buf = wmi_buf_alloc(wmi_handle, len);
+	if (!buf) {
+		qdf_print("%s: wmi_buf_alloc failed\n", __func__);
+		return QDF_STATUS_E_NOMEM;
+	}
+	qdf_mem_zero(null_macaddr, IEEE80211_ADDR_LEN);
+	cmd = (wmi_peer_add_wds_entry_cmd *)wmi_buf_data(buf);
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(param->bridge_addr, &cmd->wds_macaddr);
+	WMI_CHAR_ARRAY_TO_MAC_ADDR(null_macaddr, &cmd->peer_macaddr);
+	cmd->flags = 0xffffffff;
+
+	return wmi_unified_cmd_send(wmi_handle, buf, len,
+			WMI_PEER_ADD_WDS_ENTRY_CMDID);
+}
+
 /**
  * send_peer_update_wds_entry_cmd_non_tlv() - send peer update command to fw
  * @wmi_handle: wmi handle
@@ -8144,6 +8174,7 @@ struct wmi_ops non_tlv_ops =  {
 	.send_mcast_group_update_cmd = send_mcast_group_update_cmd_non_tlv,
 	.send_peer_add_wds_entry_cmd = send_peer_add_wds_entry_cmd_non_tlv,
 	.send_peer_del_wds_entry_cmd = send_peer_del_wds_entry_cmd_non_tlv,
+	.send_set_bridge_mac_addr_cmd = send_set_bridge_mac_addr_cmd_non_tlv,
 	.send_peer_update_wds_entry_cmd =
 				send_peer_update_wds_entry_cmd_non_tlv,
 	.send_phyerr_enable_cmd = send_phyerr_enable_cmd_non_tlv,