blob: 807d35d0d05dd26a937ed78179f9d0b623c08e8a [file] [log] [blame]
developereaeaa3c2022-08-25 15:06:03 -07001From 74544c474f70e1998043b79e8f15db6a05894bcd Mon Sep 17 00:00:00 2001
2From: mtk27835 <shurong.wen@mediatek.com>
3Date: Thu, 25 Aug 2022 14:25:51 -0700
4Subject: [PATCH] [PATCH 1122] mt76: add ibf control vendor cmd
5
6Signed-off-by: mtk27835 <shurong.wen@mediatek.com>
7---
8 mt7915/vendor.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++
9 mt7915/vendor.h | 23 +++++++++++++++++
10 2 files changed, 92 insertions(+)
11
12diff --git a/mt7915/vendor.c b/mt7915/vendor.c
13index 7acb330..745266f 100644
14--- a/mt7915/vendor.c
15+++ b/mt7915/vendor.c
16@@ -73,6 +73,16 @@ edcca_ctrl_policy[NUM_MTK_VENDOR_ATTRS_EDCCA_CTRL] = {
17 [MTK_VENDOR_ATTR_EDCCA_CTRL_COMPENSATE] = { .type = NLA_S8 },
18 };
19
20+static const struct nla_policy
21+ibf_ctrl_policy[NUM_MTK_VENDOR_ATTRS_IBF_CTRL] = {
22+ [MTK_VENDOR_ATTR_IBF_CTRL_ENABLE] = { .type = NLA_U8 },
23+};
24+
25+static struct nla_policy
26+ibf_dump_policy[NUM_MTK_VENDOR_ATTRS_IBF_DUMP] = {
27+ [MTK_VENDOR_ATTR_IBF_DUMP_ENABLE] = { .type = NLA_U8 },
28+};
29+
30
31 struct csi_null_tone {
32 u8 start;
33@@ -1091,6 +1101,53 @@ static int mt7915_vendor_edcca_ctrl(struct wiphy *wiphy,
34 return 0;
35 }
36
37+static int mt7915_vendor_ibf_ctrl(struct wiphy *wiphy,
38+ struct wireless_dev *wdev,
39+ const void *data,
40+ int data_len)
41+{
42+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
43+ struct mt7915_phy *phy = mt7915_hw_phy(hw);
44+ struct mt7915_dev *dev = phy->dev;
45+ struct nlattr *tb[NUM_MTK_VENDOR_ATTRS_IBF_CTRL];
46+ int err;
47+ u8 val;
48+
49+ err = nla_parse(tb, MTK_VENDOR_ATTR_IBF_CTRL_MAX, data, data_len,
50+ ibf_ctrl_policy, NULL);
51+ if (err)
52+ return err;
53+
54+ if (tb[MTK_VENDOR_ATTR_IBF_CTRL_ENABLE]) {
55+ val = nla_get_u8(tb[MTK_VENDOR_ATTR_IBF_CTRL_ENABLE]);
56+
57+ dev->ibf = !!val;
58+
59+ err = mt7915_mcu_set_txbf(dev, MT_BF_TYPE_UPDATE);
60+ if (err)
61+ return err;
62+ }
63+ return 0;
64+}
65+
66+static int
67+mt7915_vendor_ibf_ctrl_dump(struct wiphy *wiphy, struct wireless_dev *wdev,
68+ struct sk_buff *skb, const void *data, int data_len,
69+ unsigned long *storage)
70+{
71+ struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
72+ struct mt7915_phy *phy = mt7915_hw_phy(hw);
73+ struct mt7915_dev *dev = phy->dev;
74+
75+ if (*storage == 1)
76+ return -ENOENT;
77+ *storage = 1;
78+
79+ if (nla_put_u8(skb, MTK_VENDOR_ATTR_IBF_DUMP_ENABLE, dev->ibf))
80+ return -ENOMEM;
81+
82+ return 1;
83+}
84
85 static const struct wiphy_vendor_command mt7915_vendor_commands[] = {
86 {
87@@ -1172,6 +1229,18 @@ static const struct wiphy_vendor_command mt7915_vendor_commands[] = {
88 .doit = mt7915_vendor_edcca_ctrl,
89 .policy = edcca_ctrl_policy,
90 .maxattr = MTK_VENDOR_ATTR_EDCCA_CTRL_MAX,
91+ },
92+ {
93+ .info = {
94+ .vendor_id = MTK_NL80211_VENDOR_ID,
95+ .subcmd = MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL,
96+ },
97+ .flags = WIPHY_VENDOR_CMD_NEED_NETDEV |
98+ WIPHY_VENDOR_CMD_NEED_RUNNING,
99+ .doit = mt7915_vendor_ibf_ctrl,
100+ .dumpit = mt7915_vendor_ibf_ctrl_dump,
101+ .policy = ibf_ctrl_policy,
102+ .maxattr = MTK_VENDOR_ATTR_IBF_CTRL_MAX,
103 }
104 };
105
106diff --git a/mt7915/vendor.h b/mt7915/vendor.h
107index 57f52f3..2a7e23b 100644
108--- a/mt7915/vendor.h
109+++ b/mt7915/vendor.h
110@@ -11,6 +11,7 @@ enum mtk_nl80211_vendor_subcmds {
111 MTK_NL80211_VENDOR_SUBCMD_HEMU_CTRL = 0xc5,
112 MTK_NL80211_VENDOR_SUBCMD_PHY_CAPA_CTRL = 0xc6,
113 MTK_NL80211_VENDOR_SUBCMD_EDCCA_CTRL = 0xc7,
114+ MTK_NL80211_VENDOR_SUBCMD_IBF_CTRL = 0xc8,
115 };
116
117
118@@ -194,4 +195,26 @@ enum mtk_vendor_attr_phy_capa_dump {
119 NUM_MTK_VENDOR_ATTRS_PHY_CAPA_DUMP - 1
120 };
121
122+enum mtk_vendor_attr_ibf_ctrl {
123+ MTK_VENDOR_ATTR_IBF_CTRL_UNSPEC,
124+
125+ MTK_VENDOR_ATTR_IBF_CTRL_ENABLE,
126+
127+ /* keep last */
128+ NUM_MTK_VENDOR_ATTRS_IBF_CTRL,
129+ MTK_VENDOR_ATTR_IBF_CTRL_MAX =
130+ NUM_MTK_VENDOR_ATTRS_IBF_CTRL - 1
131+};
132+
133+enum mtk_vendor_attr_ibf_dump {
134+ MTK_VENDOR_ATTR_IBF_DUMP_UNSPEC,
135+
136+ MTK_VENDOR_ATTR_IBF_DUMP_ENABLE,
137+
138+ /* keep last */
139+ NUM_MTK_VENDOR_ATTRS_IBF_DUMP,
140+ MTK_VENDOR_ATTR_IBF_DUMP_MAX =
141+ NUM_MTK_VENDOR_ATTRS_IBF_DUMP - 1
142+};
143+
144 #endif
145--
1462.32.0
147