blob: 45a50a1cd21b8a310ac94b588561adb4f8dacf89 [file] [log] [blame]
developer8fb759f2022-02-21 16:39:38 +08001/* Copyright (C) 2021 Mediatek Inc. */
2#define _GNU_SOURCE
3
4#include "mtk_vendor_nl80211.h"
5#include "mt76-vendor.h"
6#include "mwctl.h"
7
8static int mt76_ap_rfeatures_set_attr(struct nl_msg *msg, int argc, char **argv)
9{
10 char *val, *s1, *s2, *cur;
11 void *data;
12 int idx = MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_EN;
13
14 val = strchr(argv[0], '=');
15 if (!val)
16 return -EINVAL;
17
18 *(val++) = 0;
19
20 if (!strncmp(argv[0], "he_gi", 5)) {
21 nla_put_u8(msg, MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI, strtoul(val, NULL, 0));
22 } else if (!strncmp(argv[0], "he_ltf", 6)) {
23 nla_put_u8(msg, MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF, strtoul(val, NULL, 0));
24 } else if (!strncmp(argv[0], "trig_type", 9)) {
25 data = nla_nest_start(msg,
26 MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE_CFG | NLA_F_NESTED);
27 if (!data)
28 return -ENOMEM;
29
30 s1 = s2 = strdup(val);
31 while ((cur = strsep(&s1, ",")) != NULL)
32 nla_put_u8(msg, idx++, strtoul(cur, NULL, 0));
33
34 nla_nest_end(msg, data);
35
36 free(s2);
37 } else if (!strncmp(argv[0], "ack_policy", 10)) {
38 nla_put_u8(msg, MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY, strtoul(val, NULL, 0));
39 }
40
41 return 0;
42}
43
44int mt76_ap_rfeatures_set(struct nl_msg *msg, int argc,
45 char **argv, void *ctx)
46{
47 void *data;
48 int ret = 0;
49
50 if (argc < 1)
51 return 1;
52
53 data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA | NLA_F_NESTED);
54 if (!data)
55 return -ENOMEM;
56
57 mt76_ap_rfeatures_set_attr(msg, argc, argv);
58
59 nla_nest_end(msg, data);
60
61 return ret;
62}
63
64static int mt76_ap_wireless_set_attr(struct nl_msg *msg, int argc, char **argv)
65{
66 char *val;
67
68 val = strchr(argv[0], '=');
69 if (!val)
70 return -EINVAL;
71
72 *(val++) = 0;
73
74 if (!strncmp(argv[0], "fixed_mcs", 9)) {
75 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS, strtoul(val, NULL, 0));
76 } else if (!strncmp(argv[0], "ofdma", 5)) {
77 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA, strtoul(val, NULL, 0));
78 } else if (!strncmp(argv[0], "ppdu_type", 9)) {
79 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE, strtoul(val, NULL, 0));
80 } else if (!strncmp(argv[0], "nusers_ofdma", 12)) {
81 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA, strtoul(val, NULL, 0));
82 } else if (!strncmp(argv[0], "add_ba_req_bufsize", 18)) {
83 nla_put_u16(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE,
84 strtoul(val, NULL, 0));
85 } else if (!strncmp(argv[0], "mimo", 4)) {
86 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO, strtoul(val, NULL, 0));
87 } else if (!strncmp(argv[0], "ampdu", 5)) {
88 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_AMPDU, strtoul(val, NULL, 0));
89 } else if (!strncmp(argv[0], "amsdu", 5)) {
90 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU, strtoul(val, NULL, 0));
91 } else if (!strncmp(argv[0], "cert", 4)) {
92 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_CERT, strtoul(val, NULL, 0));
93 }
94
95 return 0;
96}
97
98int mt76_ap_wireless_set(struct nl_msg *msg, int argc,
99 char **argv, void *ctx)
100{
101 void *data;
102 int ret = 0;
103
104 if (argc < 1)
105 return 1;
106
107 data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA | NLA_F_NESTED);
108 if (!data)
109 return -ENOMEM;
110
111 mt76_ap_wireless_set_attr(msg, argc, argv);
112
113 nla_nest_end(msg, data);
114
115 return ret;
116}
117
118DECLARE_SECTION(set);
119
120COMMAND(set, ap_rfeatures, "he_gi=<val>",
121 MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL, 0, CIB_NETDEV, mt76_ap_rfeatures_set,
122 "set ap_rfeatures he_gi=<val>"
123 "set ap_rfeatures he_ltf=<val>"
124 "set ap_rfeatures trig_type=<enable>,<val> (val: 0-7)"
125 "set ap_rfeatures ack_policy=<val> (val: 0-4)");
126
127DECLARE_SECTION(set);
128
129COMMAND(set, ap_wireless, "he_gi=<val>",
130 MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL, 0, CIB_NETDEV, mt76_ap_wireless_set,
131 "set ap_wireless fixed_mcs=<val>"
132 "set ap_wireless ofdma=<val> (0: disable, 1: DL, 2: UL)"
133 "set ap_wireless nusers_ofdma=<val>"
134 "set ap_wireless ppdu_type=<val> (0: SU, 1: MU, 4: LEGACY)"
135 "set ap_wireless add_ba_req_bufsize=<val>"
136 "set ap_wireless mimo=<val> (0: DL, 1: UL)"
137 "set ap_wireless ampdu=<enable>"
138 "set ap_wireless amsdu=<enable>"
139 "set ap_wireless cert=<enable>");