[][mac80211][mt76][csi][update connac2 csi]

[Description]
Add new content
1. add mac filter maintain logic
2. non-mt7915 use only 5 mac filter entry per band
3. add netlink api to report driver mac filter status

[Release-log]

Change-Id: Ie9d7f4c6dd67a69fdaf591d947706821f847ede1
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/9129429
diff --git a/feed/app/mt76-vendor/src/csi.c b/feed/app/mt76-vendor/src/csi.c
index ca7732e..f24fa9c 100644
--- a/feed/app/mt76-vendor/src/csi.c
+++ b/feed/app/mt76-vendor/src/csi.c
@@ -17,6 +17,7 @@
 	[MTK_VENDOR_ATTR_CSI_CTRL_STA_INTERVAL] = { .type = NLA_U32 },
 	[MTK_VENDOR_ATTR_CSI_CTRL_DUMP_NUM] = { .type = NLA_U16 },
 	[MTK_VENDOR_ATTR_CSI_CTRL_DATA] = { .type = NLA_NESTED },
+	[MTK_VENDOR_ATTR_CSI_CTRL_DUMP_MAC_FILTER] = { .type = NLA_NESTED },
 };
 
 static struct nla_policy csi_data_policy[NUM_MTK_VENDOR_ATTRS_CSI_DATA] = {
@@ -37,6 +38,10 @@
 	[MTK_VENDOR_ATTR_CSI_DATA_CHAIN_INFO] = { .type = NLA_U32 },
 };
 
+static struct nla_policy csi_filter_policy[NUM_MTK_VENDOR_ATTRS_CSI_MAC_FILTER] = {
+	[MTK_VENDOR_ATTR_CSI_MAC_FILTER_INTERVAL] = { .type = NLA_U32 },
+};
+
 static int mt76_csi_dump_cb(struct nl_msg *msg, void *arg)
 {
 	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_CSI_CTRL];
@@ -335,6 +340,48 @@
 	return 0;
 }
 
+static int mt76_csi_set_cb(struct nl_msg *msg, void *arg)
+{
+	struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_CSI_CTRL];
+	struct nlattr *cur, *tb_entry[NUM_MTK_VENDOR_ATTRS_CSI_MAC_FILTER];
+	int rem;
+	struct nlattr *attr;
+
+	attr = unl_find_attr(&unl, msg, NL80211_ATTR_VENDOR_DATA);
+	if (!attr) {
+		fprintf(stderr, "Testdata attribute not found\n");
+		return NL_SKIP;
+	}
+
+	nla_parse_nested(tb, MTK_VENDOR_ATTR_CSI_CTRL_MAX, attr, csi_ctrl_policy);
+
+	if (!tb[MTK_VENDOR_ATTR_CSI_CTRL_DUMP_MAC_FILTER])
+		return NL_SKIP;
+
+	nla_for_each_nested(cur, tb[MTK_VENDOR_ATTR_CSI_CTRL_DUMP_MAC_FILTER], rem) {
+		struct nlattr *tb[MTK_VENDOR_ATTR_CSI_MAC_FILTER_MAX + 1];
+		u8 entry_mac[ETH_ALEN] = {0};
+		u32 entry_interval = 0;
+
+		nla_parse_nested(tb_entry, MTK_VENDOR_ATTR_CSI_MAC_FILTER_MAX,
+				 cur, csi_filter_policy);
+
+		if (!tb_entry[MTK_VENDOR_ATTR_CSI_MAC_FILTER_MAC] ||
+		    !tb_entry[MTK_VENDOR_ATTR_CSI_MAC_FILTER_INTERVAL])
+			continue;
+
+		memcpy(entry_mac, nla_data(tb_entry[MTK_VENDOR_ATTR_CSI_MAC_FILTER_MAC]), ETH_ALEN);
+		entry_interval = nla_get_u32(tb_entry[MTK_VENDOR_ATTR_CSI_MAC_FILTER_INTERVAL]);
+
+		printf("mac: %02x:%02x:%02x:%02x:%02x:%02x, interval: %d\n",
+			entry_mac[0], entry_mac[1], entry_mac[2],
+			entry_mac[3], entry_mac[4], entry_mac[5],
+			entry_interval);
+	}
+
+	return NL_SKIP;
+}
+
 int mt76_csi_set(int idx, int argc, char **argv)
 {
 	struct nl_msg *msg;
@@ -364,7 +411,7 @@
 
 	nla_nest_end(msg, data);
 
-	ret = unl_genl_request(&unl, msg, NULL, NULL);
+	ret = unl_genl_request(&unl, msg, mt76_csi_set_cb, NULL);
 	if (ret)
 		fprintf(stderr, "nl80211 call failed: %s\n", strerror(-ret));
 
diff --git a/feed/app/mt76-vendor/src/mt76-vendor.h b/feed/app/mt76-vendor/src/mt76-vendor.h
index b591575..cafe32b 100644
--- a/feed/app/mt76-vendor/src/mt76-vendor.h
+++ b/feed/app/mt76-vendor/src/mt76-vendor.h
@@ -57,6 +57,7 @@
 	MTK_VENDOR_ATTR_CSI_CTRL_DUMP_NUM,
 
 	MTK_VENDOR_ATTR_CSI_CTRL_DATA,
+	MTK_VENDOR_ATTR_CSI_CTRL_DUMP_MAC_FILTER,
 
 	/* keep last */
 	NUM_MTK_VENDOR_ATTRS_CSI_CTRL,
@@ -94,6 +95,18 @@
 		NUM_MTK_VENDOR_ATTRS_CSI_DATA - 1
 };
 
+enum mtk_vendor_attr_csi_mac_filter {
+	MTK_VENDOR_ATTR_CSI_MAC_FILTER_UNSPEC,
+
+	MTK_VENDOR_ATTR_CSI_MAC_FILTER_MAC,
+	MTK_VENDOR_ATTR_CSI_MAC_FILTER_INTERVAL,
+
+	/* keep last */
+	NUM_MTK_VENDOR_ATTRS_CSI_MAC_FILTER,
+	MTK_VENDOR_ATTR_CSI_MAC_FILTER_MAX =
+		NUM_MTK_VENDOR_ATTRS_CSI_MAC_FILTER - 1
+};
+
 enum mtk_vendor_attr_mnt_ctrl {
 	MTK_VENDOR_ATTR_AMNT_CTRL_UNSPEC,