瀏覽代碼

qcacld-3.0: Add vendor command API for EPCS

Add vendor command API to set EPCS (Emergency Preparedness
Communications Service) capability and trigger EPCS
function enable or disable.

Change-Id: I2ffe4d268731c57dd6e3ddfe0586d4dcb77dc611
CRs-Fixed: 3511170
Paul Zhang 1 年之前
父節點
當前提交
fe32c542b7
共有 2 個文件被更改,包括 129 次插入0 次删除
  1. 30 0
      components/mlme/dispatcher/inc/cfg_mlme_generic.h
  2. 99 0
      core/hdd/src/wlan_hdd_cfg80211.c

+ 30 - 0
components/mlme/dispatcher/inc/cfg_mlme_generic.h

@@ -139,6 +139,36 @@ enum t2lm_negotiation_support {
 	T2LM_NEGOTIATION_MAX = T2LM_NEGOTIATION_LAST - 1,
 };
 
+/**
+ * enum wlan_epcs_capability - EPCS capability
+ * @WLAN_EPCS_CAP_DISABLED: EPCS capability disable
+ * @WLAN_EPCS_CAP_ENABLE: EPCS capability enable
+ * @WLAN_EPCS_CAP_LAST: last value in enum
+ * @WLAN_EPCS_CAP_MAX: max value supported
+ */
+enum wlan_epcs_capability {
+	WLAN_EPCS_CAP_DISABLED  =  0,
+	WLAN_EPCS_CAP_ENABLE  =  1,
+	/* keep this last */
+	WLAN_EPCS_CAP_LAST,
+	WLAN_EPCS_CAP_MAX = WLAN_EPCS_CAP_LAST - 1,
+};
+
+/**
+ * enum wlan_epcs_frame - EPCS frame type
+ * @WLAN_EPCS_FRAME_TEARDOWN: EPCS teardown frame
+ * @WLAN_EPCS_FRAME_REQUEST: EPCS request frame
+ * @WLAN_EPCS_FRAME_LAST: last value in enum
+ * @WLAN_EPCS_FRAME_MAX: max value supported
+ */
+enum wlan_epcs_frame {
+	WLAN_EPCS_FRAME_TEARDOWN  =  0,
+	WLAN_EPCS_FRAME_REQUEST  =  1,
+	/* keep this last */
+	WLAN_EPCS_FRAME_LAST,
+	WLAN_EPCS_FRAME_MAX = WLAN_EPCS_FRAME_LAST - 1,
+};
+
 /*
  * pmfSaQueryMaxRetries - Control PMF SA query retries for SAP
  * @Min: 0

+ 99 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -206,6 +206,8 @@
 #include "wlan_mlo_mgr_roam.h"
 #include "wlan_hdd_mlo.h"
 #include <wlan_psoc_mlme_ucfg_api.h>
+#include "wlan_epcs_api.h"
+#include "wlan_mlo_epcs_ucfg_api.h"
 #include <wlan_ll_sap_ucfg_api.h>
 
 /*
@@ -8223,6 +8225,10 @@ const struct nla_policy wlan_hdd_wifi_config_policy[
 		.type = NLA_U8},
 	[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_SIMULTANEOUS_LINKS] = {
 		.type = NLA_U8},
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_EPCS_CAPABILITY] = {
+		.type = NLA_U8},
+	[QCA_WLAN_VENDOR_ATTR_CONFIG_EPCS_FUNCTION] = {
+		.type = NLA_U8},
 	[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_NUM_LINKS] = {
 		.type = NLA_U8},
 	[QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MODE] = {
@@ -10978,6 +10984,81 @@ hdd_test_config_emlsr_action_mode(struct hdd_adapter *adapter,
 
 	return 0;
 }
+
+/**
+ * hdd_set_epcs_capability() - Set EPCS capability enable or not
+ * @link_info: link info pointer
+ * @attr: pointer to nla attr
+ *
+ * Return: 0 on success, negative on failure
+ */
+static int hdd_set_epcs_capability(struct wlan_hdd_link_info *link_info,
+				   const struct nlattr *attr)
+{
+	uint8_t cfg_val;
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
+	if (!vdev)
+		return -EINVAL;
+
+	cfg_val = nla_get_u8(attr);
+	hdd_debug("Configure EPCS capability %s(%d)",
+		  cfg_val ? "Enable" : "Disable", cfg_val);
+	if (cfg_val < WLAN_EPCS_CAP_DISABLED ||
+	    cfg_val > WLAN_EPCS_CAP_ENABLE) {
+		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
+		return -EINVAL;
+	}
+
+	ucfg_epcs_set_config(vdev, cfg_val);
+	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
+
+	return 0;
+}
+
+/**
+ * hdd_trigger_epcs_function() - Trigger EPCS function to enable or disable
+ * @link_info: link info pointer
+ * @attr: pointer to nla attr
+ *
+ * Return: 0 on success, negative on failure
+ */
+static int hdd_trigger_epcs_function(struct wlan_hdd_link_info *link_info,
+				     const struct nlattr *attr)
+{
+	uint8_t cfg_val;
+	struct wlan_objmgr_vdev *vdev;
+	enum wlan_epcs_evt event;
+	int status = -EINVAL;
+
+	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
+	if (!vdev)
+		return status;
+
+	cfg_val = nla_get_u8(attr);
+	hdd_debug("Trigger EPCS %d", cfg_val);
+
+	switch (cfg_val) {
+	/* enable EPCS function to send request frame */
+	case WLAN_EPCS_FRAME_REQUEST:
+		event = WLAN_EPCS_EV_ACTION_FRAME_TX_REQ;
+		break;
+	/* disable EPCS function to send teardown frame */
+	case WLAN_EPCS_FRAME_TEARDOWN:
+		event = WLAN_EPCS_EV_ACTION_FRAME_TX_TEARDOWN;
+		break;
+	default:
+		goto rel_ref;
+	}
+
+	ucfg_epcs_deliver_cmd(vdev, event);
+	status = 0;
+
+rel_ref:
+	hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
+	return status;
+}
 #else
 static inline int
 hdd_test_config_emlsr_mode(struct hdd_context *hdd_ctx, bool cfg_val)
@@ -11208,6 +11289,20 @@ int hdd_set_emlsr_mode(struct wlan_hdd_link_info *link_info,
 {
 	return 0;
 }
+
+static inline int
+hdd_set_epcs_capability(struct wlan_hdd_link_info *link_info,
+			const struct nlattr *attr)
+{
+	return 0;
+}
+
+static inline int
+hdd_trigger_epcs_function(struct wlan_hdd_link_info *link_info,
+			  const struct nlattr *attr)
+{
+	return 0;
+}
 #endif
 
 /**
@@ -11341,6 +11436,10 @@ static const struct independent_setters independent_setters[] = {
 	 hdd_set_wfc_state},
 	{QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_SIMULTANEOUS_LINKS,
 	 hdd_set_eht_max_simultaneous_links},
+	{QCA_WLAN_VENDOR_ATTR_CONFIG_EPCS_CAPABILITY,
+	 hdd_set_epcs_capability},
+	{QCA_WLAN_VENDOR_ATTR_CONFIG_EPCS_FUNCTION,
+	 hdd_trigger_epcs_function},
 	{QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MAX_NUM_LINKS,
 	 hdd_set_eht_max_num_links},
 	{QCA_WLAN_VENDOR_ATTR_CONFIG_EHT_MLO_MODE,