Browse Source

qcacmn: Add target if interface APIs for WDS DP OL ops

Add target_if layer APIs to send wmi commands to add, delete,
and update AST. The dp_ol_if_ops functions call into target_if
layer for DP-CP interaction.

CRs-Fixed: 2997266
Change-Id: Ie392576e3e46d47f658b741f48732d069ee2847d
Subrat Dash 3 years ago
parent
commit
3947f3f64f
2 changed files with 218 additions and 2 deletions
  1. 78 1
      target_if/dp/inc/target_if_dp.h
  2. 140 1
      target_if/dp/src/target_if_dp.c

+ 78 - 1
target_if/dp/inc/target_if_dp.h

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -126,4 +126,81 @@ QDF_STATUS
 target_if_lro_hash_config(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id,
 			  struct cdp_lro_hash_config *lro_hash_cfg);
 
+#ifdef WDS_CONV_TARGET_IF_OPS_ENABLE
+/**
+ * target_if_add_wds_entry() - send wds peer add command to fw
+ * @soc: SoC handle
+ * @vdev_id: vdev_id
+ * @peer_mac: peer mac address
+ * @dest_mac: MAC address of ast node
+ * @flags: WDS entry type WMI_HOST_WDS_FLAG_STATIC for static entry
+ * @type: type from enum cdp_txrx_ast_entry_type
+ *
+ * This API is used by WDS source port learning function to
+ * add a new AST entry in the fw.
+ *
+ * return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS
+target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			uint8_t *peer_mac, const uint8_t *dest_mac,
+			uint32_t flags, uint8_t type);
+
+/**
+ * target_if_del_wds_entry() - send wds peer del command to fw
+ * @soc: SoC handle
+ * @vdev_id: vdev_id
+ * @dest_mac: MAC address of ast node
+ * @type: type from enum cdp_txrx_ast_entry_type
+ * @delete_in_fw: flag to indicate if entry needs to be deleted in fw
+ *
+ * This API is used to delete an AST entry from fw
+ *
+ * Return: None
+ */
+void
+target_if_del_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			uint8_t *dest_mac, uint8_t type, uint8_t delete_in_fw);
+
+/**
+ * target_if_update_wds_entry() - send wds peer update command to fw
+ * @soc: SoC handle
+ * @vdev_id: vdev_id
+ * @dest_mac: MAC address of ast node
+ * @peer_mac: peer mac address
+ * @flags: WDS entry type WMI_HOST_WDS_FLAG_STATIC for static entry
+ *
+ * This API is used by update the peer mac address for the ast
+ * in the fw.
+ *
+ * return: QDF_STATUS_SUCCESS for success or error code
+ */
+QDF_STATUS
+target_if_update_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			   uint8_t *dest_mac, uint8_t *peer_mac,
+			   uint32_t flags);
+#else
+static inline QDF_STATUS
+target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			uint8_t *peer_mac, uint16_t peer_id,
+			const uint8_t *dest_mac, uint8_t *next_node_mac,
+			uint32_t flags, uint8_t type)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline void
+target_if_del_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			uint8_t *dest_mac, uint8_t type, uint8_t delete_in_fw)
+{
+}
+
+static inline QDF_STATUS
+target_if_update_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			   uint8_t *dest_mac, uint8_t *peer_mac,
+			   uint32_t flags)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* FEATURE_MCL_REPEATER */
 #endif

+ 140 - 1
target_if/dp/src/target_if_dp.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2019-2020 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -288,3 +288,142 @@ target_if_lro_hash_config(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id,
 
 	return status;
 }
+
+#ifdef WDS_CONV_TARGET_IF_OPS_ENABLE
+QDF_STATUS
+target_if_add_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			uint8_t *peer_mac, const uint8_t *dest_mac,
+			uint32_t flags, uint8_t type)
+{
+	struct peer_add_wds_entry_params wmi_wds_param = {0};
+	struct wmi_unified *pdev_wmi_handle;
+	struct wlan_objmgr_pdev *pdev;
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_psoc *psoc = (struct wlan_objmgr_psoc *)soc;
+	QDF_STATUS status;
+
+	if (type == CDP_TXRX_AST_TYPE_WDS_HM_SEC)
+		return QDF_STATUS_E_FAILURE;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_WDS_ID);
+	if (!vdev) {
+		target_if_err("vdev with id %d is NULL", vdev_id);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+		target_if_err("pdev is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
+	if (!pdev_wmi_handle) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+		target_if_err("pdev_wmi_handle is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	qdf_mem_copy(&wmi_wds_param.dest_addr, dest_mac, QDF_MAC_ADDR_SIZE);
+	qdf_mem_copy(&wmi_wds_param.peer_addr, peer_mac, QDF_MAC_ADDR_SIZE);
+	wmi_wds_param.vdev_id = vdev_id;
+	wmi_wds_param.flags = flags;
+
+	status = wmi_unified_peer_add_wds_entry_cmd(pdev_wmi_handle,
+						    &wmi_wds_param);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+
+	return status;
+}
+
+void
+target_if_del_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			uint8_t *dest_mac, uint8_t type, uint8_t delete_in_fw)
+{
+	struct peer_del_wds_entry_params wmi_wds_param = {0};
+	struct wmi_unified *pdev_wmi_handle;
+	struct wlan_objmgr_pdev *pdev;
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_psoc *psoc = (struct wlan_objmgr_psoc *)soc;
+
+	if (!delete_in_fw || type == CDP_TXRX_AST_TYPE_WDS_HM_SEC) {
+		target_if_err("delete_in_fw: %d type: %d", delete_in_fw, type);
+		return;
+	}
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_WDS_ID);
+	if (!vdev) {
+		target_if_err("vdev with id %d is NULL", vdev_id);
+		return;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+		target_if_err("pdev is NULL");
+		return;
+	}
+
+	pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
+	if (!pdev_wmi_handle) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+		target_if_err("pdev_wmi_handle is NULL");
+		return;
+	}
+
+	qdf_mem_copy(&wmi_wds_param.dest_addr, dest_mac, QDF_MAC_ADDR_SIZE);
+	wmi_wds_param.vdev_id = vdev_id;
+
+	wmi_unified_peer_del_wds_entry_cmd(pdev_wmi_handle,
+					   &wmi_wds_param);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+}
+
+QDF_STATUS
+target_if_update_wds_entry(struct cdp_ctrl_objmgr_psoc *soc, uint8_t vdev_id,
+			   uint8_t *dest_mac, uint8_t *peer_mac,
+			   uint32_t flags)
+{
+	struct peer_update_wds_entry_params wmi_wds_param = {0};
+	struct wmi_unified *pdev_wmi_handle;
+	struct wlan_objmgr_pdev *pdev;
+	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_psoc *psoc = (struct wlan_objmgr_psoc *)soc;
+	QDF_STATUS status;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_WDS_ID);
+	if (!vdev) {
+		target_if_err("vdev with id %d is NULL", vdev_id);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+		target_if_err("pdev is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	pdev_wmi_handle = lmac_get_pdev_wmi_handle(pdev);
+	if (!pdev_wmi_handle) {
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+		target_if_err("pdev_wmi_handle is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	qdf_mem_copy(&wmi_wds_param.dest_addr, dest_mac, QDF_MAC_ADDR_SIZE);
+	qdf_mem_copy(&wmi_wds_param.peer_addr, peer_mac, QDF_MAC_ADDR_SIZE);
+	wmi_wds_param.vdev_id = vdev_id;
+	wmi_wds_param.flags = flags;
+
+	status = wmi_unified_update_wds_entry_cmd(pdev_wmi_handle,
+						  &wmi_wds_param);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_WDS_ID);
+
+	return status;
+}
+#endif