From 5f1c42d8b61c88533fe3dceba81b2634623ecceb Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Tue, 12 Nov 2013 22:11:33 +0000 Subject: mac80211: update to wireless-testing 2013-11-05 Signed-off-by: Felix Fietkau SVN-Revision: 38783 --- .../523-mac80211_configure_antenna_gain.patch | 159 +++++++++++---------- 1 file changed, 80 insertions(+), 79 deletions(-) (limited to 'package/kernel/mac80211/patches/523-mac80211_configure_antenna_gain.patch') diff --git a/package/kernel/mac80211/patches/523-mac80211_configure_antenna_gain.patch b/package/kernel/mac80211/patches/523-mac80211_configure_antenna_gain.patch index f223f7e78b..6901184e3e 100644 --- a/package/kernel/mac80211/patches/523-mac80211_configure_antenna_gain.patch +++ b/package/kernel/mac80211/patches/523-mac80211_configure_antenna_gain.patch @@ -1,6 +1,24 @@ +--- a/include/net/cfg80211.h ++++ b/include/net/cfg80211.h +@@ -2081,6 +2081,7 @@ struct cfg80211_update_ft_ies_params { + * (as advertised by the nl80211 feature flag.) + * @get_tx_power: store the current TX power into the dbm variable; + * return 0 if successful ++ * @set_antenna_gain: set antenna gain to reduce maximum tx power if necessary + * + * @set_wds_peer: set the WDS peer for a WDS interface + * +@@ -2303,6 +2304,7 @@ struct cfg80211_ops { + enum nl80211_tx_power_setting type, int mbm); + int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, + int *dbm); ++ int (*set_antenna_gain)(struct wiphy *wiphy, int dbi); + + int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev, + const u8 *addr); --- a/include/net/mac80211.h +++ b/include/net/mac80211.h -@@ -1002,6 +1002,7 @@ enum ieee80211_smps_mode { +@@ -1029,6 +1029,7 @@ enum ieee80211_smps_mode { * * @power_level: requested transmit power (in dBm), backward compatibility * value only that is set to the minimum of all interfaces @@ -8,7 +26,7 @@ * * @chandef: the channel definition to tune to * @radar_enabled: whether radar detection is enabled -@@ -1023,6 +1024,7 @@ struct ieee80211_conf { +@@ -1050,6 +1051,7 @@ struct ieee80211_conf { u32 flags; int power_level, dynamic_ps_timeout; int max_sleep_period; @@ -16,73 +34,30 @@ u16 listen_interval; u8 ps_dtim_period; ---- a/net/mac80211/ieee80211_i.h -+++ b/net/mac80211/ieee80211_i.h -@@ -1130,6 +1130,7 @@ struct ieee80211_local { - int dynamic_ps_forced_timeout; - - int user_power_level; /* in dBm, for all interfaces */ -+ int user_antenna_gain; /* in dBi */ - - enum ieee80211_smps_mode smps_mode; - --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h -@@ -1460,6 +1460,9 @@ enum nl80211_commands { - * @NL80211_ATTR_CSA_C_OFF_PRESP: Offset of the channel switch counter - * field in the probe response (%NL80211_ATTR_PROBE_RESP). +@@ -1511,6 +1511,9 @@ enum nl80211_commands { + * @NL80211_ATTR_SUPPORT_5_10_MHZ: A flag indicating that the device supports + * 5 MHz and 10 MHz channel bandwidth. * + * @NL80211_ATTR_WIPHY_ANTENNA_GAIN: Configured antenna gain. Used to reduce -+ * transmit power to stay within regulatory limits. ++ * transmit power to stay within regulatory limits. u32, dBi. + * * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use */ -@@ -1766,6 +1769,8 @@ enum nl80211_attrs { - NL80211_ATTR_CSA_C_OFF_BEACON, - NL80211_ATTR_CSA_C_OFF_PRESP, +@@ -1829,6 +1832,8 @@ enum nl80211_attrs { + + NL80211_ATTR_SUPPORT_5_10_MHZ, + NL80211_ATTR_WIPHY_ANTENNA_GAIN, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST, ---- a/net/wireless/nl80211.c -+++ b/net/wireless/nl80211.c -@@ -354,6 +354,7 @@ static const struct nla_policy nl80211_p - [NL80211_ATTR_CSA_IES] = { .type = NLA_NESTED }, - [NL80211_ATTR_CSA_C_OFF_BEACON] = { .type = NLA_U16 }, - [NL80211_ATTR_CSA_C_OFF_PRESP] = { .type = NLA_U16 }, -+ [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, - }; - - /* policy for the key attributes */ -@@ -2000,6 +2001,22 @@ static int nl80211_set_wiphy(struct sk_b - goto bad_res; - } - -+ if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) { -+ int idx, dbi = 0; -+ -+ if (!rdev->ops->set_antenna_gain) { -+ result = -EOPNOTSUPP; -+ goto bad_res; -+ } -+ -+ idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN; -+ dbi = nla_get_u32(info->attrs[idx]); -+ -+ result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi); -+ if (result) -+ goto bad_res; -+ } -+ - if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && - info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { - u32 tx_ant, rx_ant; --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c -@@ -2293,6 +2293,19 @@ static int ieee80211_get_tx_power(struct +@@ -2304,6 +2304,19 @@ static int ieee80211_get_tx_power(struct return 0; } @@ -102,7 +77,7 @@ static int ieee80211_set_wds_peer(struct wiphy *wiphy, struct net_device *dev, const u8 *addr) { -@@ -3656,6 +3669,7 @@ struct cfg80211_ops mac80211_config_ops +@@ -3839,6 +3852,7 @@ struct cfg80211_ops mac80211_config_ops .set_wiphy_params = ieee80211_set_wiphy_params, .set_tx_power = ieee80211_set_tx_power, .get_tx_power = ieee80211_get_tx_power, @@ -110,37 +85,30 @@ .set_wds_peer = ieee80211_set_wds_peer, .rfkill_poll = ieee80211_rfkill_poll, CFG80211_TESTMODE_CMD(ieee80211_testmode_cmd) ---- a/include/net/cfg80211.h -+++ b/include/net/cfg80211.h -@@ -1994,6 +1994,7 @@ struct cfg80211_update_ft_ies_params { - * (as advertised by the nl80211 feature flag.) - * @get_tx_power: store the current TX power into the dbm variable; - * return 0 if successful -+ * @set_antenna_gain: set antenna gain to reduce maximum tx power if necessary - * - * @set_wds_peer: set the WDS peer for a WDS interface - * -@@ -2215,6 +2216,7 @@ struct cfg80211_ops { - enum nl80211_tx_power_setting type, int mbm); - int (*get_tx_power)(struct wiphy *wiphy, struct wireless_dev *wdev, - int *dbm); -+ int (*set_antenna_gain)(struct wiphy *wiphy, int dbi); +--- a/net/mac80211/ieee80211_i.h ++++ b/net/mac80211/ieee80211_i.h +@@ -1179,6 +1179,7 @@ struct ieee80211_local { + int dynamic_ps_forced_timeout; + + int user_power_level; /* in dBm, for all interfaces */ ++ int user_antenna_gain; /* in dBi */ + + enum ieee80211_smps_mode smps_mode; - int (*set_wds_peer)(struct wiphy *wiphy, struct net_device *dev, - const u8 *addr); --- a/net/mac80211/main.c +++ b/net/mac80211/main.c -@@ -102,6 +102,7 @@ static u32 ieee80211_hw_conf_chan(struct +@@ -101,7 +101,7 @@ static u32 ieee80211_hw_conf_chan(struct + struct ieee80211_sub_if_data *sdata; struct cfg80211_chan_def chandef = {}; u32 changed = 0; - int power = 0; -+ int ant_gain, max_power; +- int power; ++ int power, ant_gain, max_power; u32 offchannel_flag; offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; -@@ -165,8 +166,21 @@ static u32 ieee80211_hw_conf_chan(struct - - power = min(power, chandef.chan->max_power); +@@ -156,8 +156,21 @@ static u32 ieee80211_hw_conf_chan(struct + } + rcu_read_unlock(); - if (local->hw.conf.power_level != power) { + max_power = chandef.chan->max_reg_power; @@ -155,13 +123,13 @@ + } + + if (local->hw.conf.power_level != power || -+ local->hw.conf.max_antenna_gain != ant_gain) { ++ local->hw.conf.max_antenna_gain != ant_gain) { changed |= IEEE80211_CONF_CHANGE_POWER; + local->hw.conf.max_antenna_gain = ant_gain; local->hw.cur_power_level = power; local->hw.conf.power_level = power; } -@@ -597,6 +611,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( +@@ -588,6 +601,7 @@ struct ieee80211_hw *ieee80211_alloc_hw( IEEE80211_RADIOTAP_MCS_HAVE_BW; local->hw.radiotap_vht_details = IEEE80211_RADIOTAP_VHT_KNOWN_GI | IEEE80211_RADIOTAP_VHT_KNOWN_BANDWIDTH; @@ -169,3 +137,36 @@ local->hw.uapsd_queues = IEEE80211_DEFAULT_UAPSD_QUEUES; local->hw.uapsd_max_sp_len = IEEE80211_DEFAULT_MAX_SP_LEN; local->user_power_level = IEEE80211_UNSET_POWER_LEVEL; +--- a/net/wireless/nl80211.c ++++ b/net/wireless/nl80211.c +@@ -357,6 +357,7 @@ static const struct nla_policy nl80211_p + [NL80211_ATTR_STA_SUPPORTED_CHANNELS] = { .type = NLA_BINARY }, + [NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES] = { .type = NLA_BINARY }, + [NL80211_ATTR_HANDLE_DFS] = { .type = NLA_FLAG }, ++ [NL80211_ATTR_WIPHY_ANTENNA_GAIN] = { .type = NLA_U32 }, + }; + + /* policy for the key attributes */ +@@ -2038,6 +2039,22 @@ static int nl80211_set_wiphy(struct sk_b + goto bad_res; + } + ++ if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_GAIN]) { ++ int idx, dbi = 0; ++ ++ if (!rdev->ops->set_antenna_gain) { ++ result = -EOPNOTSUPP; ++ goto bad_res; ++ } ++ ++ idx = NL80211_ATTR_WIPHY_ANTENNA_GAIN; ++ dbi = nla_get_u32(info->attrs[idx]); ++ ++ result = rdev->ops->set_antenna_gain(&rdev->wiphy, dbi); ++ if (result) ++ goto bad_res; ++ } ++ + if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] && + info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) { + u32 tx_ant, rx_ant; -- cgit v1.2.3