blob: 91efbd85584b59e2aa1fb7a1b70c1cc546e31e46 [file] [log] [blame]
developer5f18e6c2021-07-28 11:55:08 +08001/* Copyright (C) 2021 Mediatek Inc. */
2#define _GNU_SOURCE
3
4#include "mt76-vendor.h"
5
6static int mt76_ap_rfeatures_set_attr(struct nl_msg *msg, int argc, char **argv)
7{
8 char *val;
9
10 val = strchr(argv[0], '=');
developer6f8cffd2021-09-29 19:48:25 +080011 if (!val)
12 return -EINVAL;
13
14 *(val++) = 0;
developer5f18e6c2021-07-28 11:55:08 +080015
16 if (!strncmp(argv[0], "he_gi", 5)) {
17 nla_put_u8(msg, MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_GI, strtoul(val, NULL, 0));
18 } else if (!strncmp(argv[0], "he_ltf", 6)) {
19 nla_put_u8(msg, MTK_VENDOR_ATTR_RFEATURE_CTRL_HE_LTF, strtoul(val, NULL, 0));
developer31b1a282021-08-04 14:13:00 +080020 } else if (!strncmp(argv[0], "trig_type", 9)) {
21 nla_put_u8(msg, MTK_VENDOR_ATTR_RFEATURE_CTRL_TRIG_TYPE, strtoul(val, NULL, 0));
22 } else if (!strncmp(argv[0], "ack_policy", 10)) {
23 nla_put_u8(msg, MTK_VENDOR_ATTR_RFEATURE_CTRL_ACK_PLCY, strtoul(val, NULL, 0));
developer5f18e6c2021-07-28 11:55:08 +080024 }
25
26 return 0;
27}
28
29int mt76_ap_rfeatures_set(int idx, int argc, char **argv)
30{
31 struct nl_msg *msg;
32 void *data;
33 int ret;
34
35 if (argc < 1)
36 return 1;
37
38 if (unl_genl_init(&unl, "nl80211") < 0) {
39 fprintf(stderr, "Failed to connect to nl80211\n");
40 return 2;
41 }
42
43 msg = unl_genl_msg(&unl, NL80211_CMD_VENDOR, false);
44
45 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, idx) ||
46 nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, MTK_NL80211_VENDOR_ID) ||
47 nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_RFEATURE_CTRL))
48 return false;
49
50 data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA | NLA_F_NESTED);
51
52 mt76_ap_rfeatures_set_attr(msg, argc, argv);
53
54 nla_nest_end(msg, data);
55
56 ret = unl_genl_request(&unl, msg, NULL, NULL);
57 if (ret)
58 fprintf(stderr, "nl80211 call failed: %s\n", strerror(-ret));
59
60 unl_free(&unl);
61
62 return ret;
63}
64
65static int mt76_ap_wireless_set_attr(struct nl_msg *msg, int argc, char **argv)
66{
67 char *val;
68
69 val = strchr(argv[0], '=');
developer6f8cffd2021-09-29 19:48:25 +080070 if (!val)
71 return -EINVAL;
72
73 *(val++) = 0;
developer5f18e6c2021-07-28 11:55:08 +080074
75 if (!strncmp(argv[0], "fixed_mcs", 9)) {
76 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_MCS, strtoul(val, NULL, 0));
developer507ff0c2021-07-30 14:51:55 +080077 } else if (!strncmp(argv[0], "ofdma", 5)) {
78 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_FIXED_OFDMA, strtoul(val, NULL, 0));
developerb72be592021-08-16 10:58:59 +080079 } else if (!strncmp(argv[0], "ppdu_type", 9)) {
80 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_PPDU_TX_TYPE, strtoul(val, NULL, 0));
81 } else if (!strncmp(argv[0], "nusers_ofdma", 12)) {
82 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_NUSERS_OFDMA, strtoul(val, NULL, 0));
developer786d9292021-09-22 11:03:21 +080083 } else if (!strncmp(argv[0], "add_ba_req_bufsize", 18)) {
84 nla_put_u16(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_BA_BUFFER_SIZE,
85 strtoul(val, NULL, 0));
86 } else if (!strncmp(argv[0], "mimo", 4)) {
87 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_MIMO, strtoul(val, NULL, 0));
developer3a5765c2021-09-23 16:19:12 +080088 } else if (!strncmp(argv[0], "ampdu", 5)) {
89 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_AMPDU, strtoul(val, NULL, 0));
90 } else if (!strncmp(argv[0], "amsdu", 5)) {
91 nla_put_u8(msg, MTK_VENDOR_ATTR_WIRELESS_CTRL_AMSDU, strtoul(val, NULL, 0));
developer5f18e6c2021-07-28 11:55:08 +080092 }
93
94 return 0;
95}
96
97int mt76_ap_wireless_set(int idx, int argc, char **argv)
98{
99 struct nl_msg *msg;
100 void *data;
101 int ret;
102
103 if (argc < 1)
104 return 1;
105
106 if (unl_genl_init(&unl, "nl80211") < 0) {
107 fprintf(stderr, "Failed to connect to nl80211\n");
108 return 2;
109 }
110
111 msg = unl_genl_msg(&unl, NL80211_CMD_VENDOR, false);
112
113 if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, idx) ||
114 nla_put_u32(msg, NL80211_ATTR_VENDOR_ID, MTK_NL80211_VENDOR_ID) ||
115 nla_put_u32(msg, NL80211_ATTR_VENDOR_SUBCMD, MTK_NL80211_VENDOR_SUBCMD_WIRELESS_CTRL))
116 return false;
117
118 data = nla_nest_start(msg, NL80211_ATTR_VENDOR_DATA | NLA_F_NESTED);
119
120 mt76_ap_wireless_set_attr(msg, argc, argv);
121
122 nla_nest_end(msg, data);
123
124 ret = unl_genl_request(&unl, msg, NULL, NULL);
125 if (ret)
126 fprintf(stderr, "nl80211 call failed: %s\n", strerror(-ret));
127
128 unl_free(&unl);
129
130 return ret;
131}