OpenWrt – Blame information for rev 4
?pathlinks?
Rev | Author | Line No. | Line |
---|---|---|---|
4 | office | 1 | --- a/include/net/cfg80211.h |
2 | +++ b/include/net/cfg80211.h |
||
3 | @@ -2750,6 +2750,7 @@ struct cfg80211_pmk_conf { |
||
4 | * (as advertised by the nl80211 feature flag.) |
||
5 | * @get_tx_power: store the current TX power into the dbm variable; |
||
6 | * return 0 if successful |
||
7 | + * @set_antenna_gain: set antenna gain to reduce maximum tx power if necessary |
||
8 | * |
||
9 | * @set_wds_peer: set the WDS peer for a WDS interface |
||
10 | * |
||
11 | @@ -3041,6 +3042,7 @@ struct cfg80211_ops { |
||
12 | enum nl80211_tx_power_setting type, int mbm); |
||
13 | int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, |
||
14 | int *dbm); |
||
15 | + int (*set_antenna_gain)(struct wiphy *wiphy, int dbi); |
||
16 | |||
17 | int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev, |
||
18 | const u8 *addr); |
||
19 | --- a/include/net/mac80211.h |
||
20 | +++ b/include/net/mac80211.h |
||
21 | @@ -1338,6 +1338,7 @@ enum ieee80211_smps_mode { |
||
22 | * |
||
23 | * @power_level: requested transmit power (in dBm), backward compatibility |
||
24 | * value only that is set to the minimum of all interfaces |
||
25 | + * @max_antenna_gain: maximum antenna gain adjusted by user config (in dBi) |
||
26 | * |
||
27 | * @chandef: the channel definition to tune to |
||
28 | * @radar_enabled: whether radar detection is enabled |
||
29 | @@ -1358,6 +1359,7 @@ enum ieee80211_smps_mode { |
||
30 | struct ieee80211_conf { |
||
31 | u32 flags; |
||
32 | int power_level, dynamic_ps_timeout; |
||
33 | + int max_antenna_gain; |
||
34 | |||
35 | u16 listen_interval; |
||
36 | u8 ps_dtim_period; |
||
37 | --- a/include/uapi/linux/nl80211.h |
||
38 | +++ b/include/uapi/linux/nl80211.h |
||
39 | @@ -2153,6 +2153,9 @@ enum nl80211_commands { |
||
40 | * @NL80211_ATTR_PMKR0_NAME: PMK-R0 Name for offloaded FT. |
||
41 | * @NL80211_ATTR_PORT_AUTHORIZED: (reserved) |
||
42 | * |
||
43 | + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce |
||
44 | + * transmit power to stay within regulatory limits. u32, dBi. |
||
45 | + * |
||
46 | * @NUM_NL80211_ATTR: total number of nl80211_attrs available |
||
47 | * @NL80211_ATTR_MAX: highest attribute number currently defined |
||
48 | * @__NL80211_ATTR_AFTER_LAST: internal use |
||
49 | @@ -2579,6 +2582,8 @@ enum nl80211_attrs { |
||
50 | NL80211_ATTR_PMKR0_NAME, |
||
51 | NL80211_ATTR_PORT_AUTHORIZED, |
||
52 | |||
53 | + NL80211_ATTR_WIPHY_ANTENNA_GAIN, |
||
54 | + |
||
55 | /* add attributes here, update the policy in nl80211.c */ |
||
56 | |||
57 | __NL80211_ATTR_AFTER_LAST, |
||
58 | --- a/net/mac80211/cfg.c |
||
59 | +++ b/net/mac80211/cfg.c |
||
60 | @@ -2447,6 +2447,19 @@ static int ieee80211_get_tx_power(struct |
||
61 | return 0; |
||
62 | } |
||
63 | |||
64 | +static int ieee80211_set_antenna_gain(struct wiphy *wiphy, int dbi) |
||
65 | +{ |
||
66 | + struct ieee80211_local *local = wiphy_priv(wiphy); |
||
67 | + |
||
68 | + if (dbi < 0) |
||
69 | + return -EINVAL; |
||
70 | + |
||
71 | + local->user_antenna_gain = dbi; |
||
72 | + ieee80211_hw_config(local, 0); |
||
73 | + |
||
74 | + return 0; |
||
75 | +} |
||
76 | + |
||
77 | static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, |
||
78 | const u8 *addr) |
||
79 | { |
||
80 | @@ -3721,6 +3734,7 @@ const struct cfg80211_ops mac80211_confi |
||
81 | .set_wiphy_params = ieee80211_set_wiphy_params, |
||
82 | .set_tx_power = ieee80211_set_tx_power, |
||
83 | .get_tx_power = ieee80211_get_tx_power, |
||
84 | + .set_antenna_gain = ieee80211_set_antenna_gain, |
||
85 | .set_wds_peer = ieee80211_set_wds_peer, |
||
86 | .rfkill_poll = ieee80211_rfkill_poll, |
||
87 | CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) |
||
88 | --- a/net/mac80211/ieee80211_i.h |
||
89 | +++ b/net/mac80211/ieee80211_i.h |
||
90 | @@ -1348,6 +1348,7 @@ struct ieee80211_local { |
||
91 | int dynamic_ps_forced_timeout; |
||
92 | |||
93 | int user_power_level; /* in dBm, for all interfaces */ |
||
94 | + int user_antenna_gain; /* in dBi */ |
||
95 | |||
96 | enum ieee80211_smps_mode smps_mode; |
||
97 | |||
98 | --- a/net/mac80211/main.c |
||
99 | +++ b/net/mac80211/main.c |
||
100 | @@ -93,7 +93,7 @@ static u32 ieee80211_hw_conf_chan(struct |
||
101 | struct ieee80211_sub_if_data *sdata; |
||
102 | struct cfg80211_chan_def chandef = {}; |
||
103 | u32 changed = 0; |
||
104 | - int power; |
||
105 | + int power, max_power; |
||
106 | u32 offchannel_flag; |
||
107 | |||
108 | offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; |
||
109 | @@ -150,6 +150,12 @@ static u32 ieee80211_hw_conf_chan(struct |
||
110 | } |
||
111 | rcu_read_unlock(); |
||
112 | |||
113 | + max_power = chandef.chan->max_reg_power; |
||
114 | + if (local->user_antenna_gain > 0) { |
||
115 | + max_power -= local->user_antenna_gain; |
||
116 | + power = min(power, max_power); |
||
117 | + } |
||
118 | + |
||
119 | if (local->hw.conf.power_level != power) { |
||
120 | changed |= IEEE80211_CONF_CHANGE_POWER; |
||
121 | local->hw.conf.power_level = power; |
||
122 | @@ -592,6 +598,7 @@ struct ieee80211_hw *ieee80211_alloc_hw_ |
||
123 | IEEE80211_RADIOTAP_MCS_HAVE_BW; |
||
124 | local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | |
||
125 | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; |
||
126 | + local->user_antenna_gain = 0; |
||
127 | local->hw.uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES; |
||
128 | local->hw.uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN; |
||
129 | local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; |
||
130 | --- a/net/wireless/nl80211.c |
||
131 | +++ b/net/wireless/nl80211.c |
||
132 | @@ -420,6 +420,7 @@ static const struct nla_policy nl80211_p |
||
133 | [NL80211_ATTR_FILS_CACHE_ID] = { .len = 2 }, |
||
134 | [NL80211_ATTR_PMK] = { .type = NLA_BINARY, .len = PMK_MAX_LEN }, |
||
135 | [NL80211_ATTR_SCHED_SCAN_MULTI] = { .type = NLA_FLAG }, |
||
136 | + [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, |
||
137 | }; |
||
138 | |||
139 | /* policy for the key attributes */ |
||
140 | @@ -2395,6 +2396,20 @@ static int nl80211_set_wiphy(struct sk_b |
||
141 | if (result) |
||
142 | return result; |
||
143 | } |
||
144 | + |
||
145 | + if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) { |
||
146 | + int idx, dbi = 0; |
||
147 | + |
||
148 | + if (!rdev->ops->set_antenna_gain) |
||
149 | + return -EOPNOTSUPP; |
||
150 | + |
||
151 | + idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN; |
||
152 | + dbi = nla_get_u32(info->attrs[idx]); |
||
153 | + |
||
154 | + result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi); |
||
155 | + if (result) |
||
156 | + return result; |
||
157 | + } |
||
158 | |||
159 | if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && |
||
160 | info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { |