aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2015-01-19 16:22:19 -0500
committerDavid S. Miller <davem@davemloft.net>2015-01-19 16:22:19 -0500
commit0c49087462e8587c12ecfeaf1dd46fdc0ddc4532 (patch)
treeb91fa846e41c80cd948c9d8fa636bd352ed98a31 /net/wireless
parent926e9878a360fc57112259949c44c74c31709cc6 (diff)
parentc1e140bf79d817d4a7aa9932eb98b0359c87af33 (diff)
Merge tag 'mac80211-next-for-davem-2015-01-19' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Some further updates for net-next: * fix network-manager which was broken by the previous changes * fix delete-station events, which were broken by me making the genlmsg_end() mistake * fix a timer left running during suspend in some race conditions that would cause an annoying (but harmless) warning * (less important, but in the tree already) remove 80+80 MHz rate reporting since the spec doesn't distinguish it from 160 MHz; as the bitrate they're both 160 MHz bandwidth Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/core.c6
-rw-r--r--net/wireless/nl80211.c45
-rw-r--r--net/wireless/util.c25
3 files changed, 48 insertions, 28 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 456e4c38c279..3af0ecf1cc16 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -21,7 +21,6 @@
21#include <linux/sched.h> 21#include <linux/sched.h>
22#include <net/genetlink.h> 22#include <net/genetlink.h>
23#include <net/cfg80211.h> 23#include <net/cfg80211.h>
24#include <net/rtnetlink.h>
25#include "nl80211.h" 24#include "nl80211.h"
26#include "core.h" 25#include "core.h"
27#include "sysfs.h" 26#include "sysfs.h"
@@ -964,10 +963,6 @@ void cfg80211_stop_iface(struct wiphy *wiphy, struct wireless_dev *wdev,
964} 963}
965EXPORT_SYMBOL(cfg80211_stop_iface); 964EXPORT_SYMBOL(cfg80211_stop_iface);
966 965
967static const struct rtnl_link_ops wireless_link_ops = {
968 .kind = "wlan",
969};
970
971static int cfg80211_netdev_notifier_call(struct notifier_block *nb, 966static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
972 unsigned long state, void *ptr) 967 unsigned long state, void *ptr)
973{ 968{
@@ -986,7 +981,6 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
986 switch (state) { 981 switch (state) {
987 case NETDEV_POST_INIT: 982 case NETDEV_POST_INIT:
988 SET_NETDEV_DEVTYPE(dev, &wiphy_type); 983 SET_NETDEV_DEVTYPE(dev, &wiphy_type);
989 dev->rtnl_link_ops = &wireless_link_ops;
990 break; 984 break;
991 case NETDEV_REGISTER: 985 case NETDEV_REGISTER:
992 /* 986 /*
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 4ed9039bd5f9..4fc812f2b583 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3580,6 +3580,7 @@ static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
3580 struct nlattr *rate; 3580 struct nlattr *rate;
3581 u32 bitrate; 3581 u32 bitrate;
3582 u16 bitrate_compat; 3582 u16 bitrate_compat;
3583 enum nl80211_attrs rate_flg;
3583 3584
3584 rate = nla_nest_start(msg, attr); 3585 rate = nla_nest_start(msg, attr);
3585 if (!rate) 3586 if (!rate)
@@ -3596,12 +3597,36 @@ static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
3596 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat)) 3597 nla_put_u16(msg, NL80211_RATE_INFO_BITRATE, bitrate_compat))
3597 return false; 3598 return false;
3598 3599
3600 switch (info->bw) {
3601 case RATE_INFO_BW_5:
3602 rate_flg = NL80211_RATE_INFO_5_MHZ_WIDTH;
3603 break;
3604 case RATE_INFO_BW_10:
3605 rate_flg = NL80211_RATE_INFO_10_MHZ_WIDTH;
3606 break;
3607 default:
3608 WARN_ON(1);
3609 /* fall through */
3610 case RATE_INFO_BW_20:
3611 rate_flg = 0;
3612 break;
3613 case RATE_INFO_BW_40:
3614 rate_flg = NL80211_RATE_INFO_40_MHZ_WIDTH;
3615 break;
3616 case RATE_INFO_BW_80:
3617 rate_flg = NL80211_RATE_INFO_80_MHZ_WIDTH;
3618 break;
3619 case RATE_INFO_BW_160:
3620 rate_flg = NL80211_RATE_INFO_160_MHZ_WIDTH;
3621 break;
3622 }
3623
3624 if (rate_flg && nla_put_flag(msg, rate_flg))
3625 return false;
3626
3599 if (info->flags & RATE_INFO_FLAGS_MCS) { 3627 if (info->flags & RATE_INFO_FLAGS_MCS) {
3600 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs)) 3628 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
3601 return false; 3629 return false;
3602 if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH &&
3603 nla_put_flag(msg, NL80211_RATE_INFO_40_MHZ_WIDTH))
3604 return false;
3605 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 3630 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
3606 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 3631 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
3607 return false; 3632 return false;
@@ -3610,18 +3635,6 @@ static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
3610 return false; 3635 return false;
3611 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss)) 3636 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
3612 return false; 3637 return false;
3613 if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH &&
3614 nla_put_flag(msg, NL80211_RATE_INFO_40_MHZ_WIDTH))
3615 return false;
3616 if (info->flags & RATE_INFO_FLAGS_80_MHZ_WIDTH &&
3617 nla_put_flag(msg, NL80211_RATE_INFO_80_MHZ_WIDTH))
3618 return false;
3619 if (info->flags & RATE_INFO_FLAGS_80P80_MHZ_WIDTH &&
3620 nla_put_flag(msg, NL80211_RATE_INFO_80P80_MHZ_WIDTH))
3621 return false;
3622 if (info->flags & RATE_INFO_FLAGS_160_MHZ_WIDTH &&
3623 nla_put_flag(msg, NL80211_RATE_INFO_160_MHZ_WIDTH))
3624 return false;
3625 if (info->flags & RATE_INFO_FLAGS_SHORT_GI && 3638 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
3626 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI)) 3639 nla_put_flag(msg, NL80211_RATE_INFO_SHORT_GI))
3627 return false; 3640 return false;
@@ -11784,7 +11797,7 @@ void cfg80211_del_sta_sinfo(struct net_device *dev, const u8 *mac_addr,
11784 return; 11797 return;
11785 11798
11786 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0, 11799 if (nl80211_send_station(msg, NL80211_CMD_DEL_STATION, 0, 0, 0,
11787 rdev, dev, mac_addr, sinfo)) { 11800 rdev, dev, mac_addr, sinfo) < 0) {
11788 nlmsg_free(msg); 11801 nlmsg_free(msg);
11789 return; 11802 return;
11790 } 11803 }
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 1d2fcfad06cc..97c744eeac4f 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -1073,10 +1073,24 @@ static u32 cfg80211_calculate_bitrate_vht(struct rate_info *rate)
1073 if (WARN_ON_ONCE(rate->mcs > 9)) 1073 if (WARN_ON_ONCE(rate->mcs > 9))
1074 return 0; 1074 return 0;
1075 1075
1076 idx = rate->flags & (RATE_INFO_FLAGS_160_MHZ_WIDTH | 1076 switch (rate->bw) {
1077 RATE_INFO_FLAGS_80P80_MHZ_WIDTH) ? 3 : 1077 case RATE_INFO_BW_160:
1078 rate->flags & RATE_INFO_FLAGS_80_MHZ_WIDTH ? 2 : 1078 idx = 3;
1079 rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH ? 1 : 0; 1079 break;
1080 case RATE_INFO_BW_80:
1081 idx = 2;
1082 break;
1083 case RATE_INFO_BW_40:
1084 idx = 1;
1085 break;
1086 case RATE_INFO_BW_5:
1087 case RATE_INFO_BW_10:
1088 default:
1089 WARN_ON(1);
1090 /* fall through */
1091 case RATE_INFO_BW_20:
1092 idx = 0;
1093 }
1080 1094
1081 bitrate = base[idx][rate->mcs]; 1095 bitrate = base[idx][rate->mcs];
1082 bitrate *= rate->nss; 1096 bitrate *= rate->nss;
@@ -1107,8 +1121,7 @@ u32 cfg80211_calculate_bitrate(struct rate_info *rate)
1107 modulation = rate->mcs & 7; 1121 modulation = rate->mcs & 7;
1108 streams = (rate->mcs >> 3) + 1; 1122 streams = (rate->mcs >> 3) + 1;
1109 1123
1110 bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ? 1124 bitrate = (rate->bw == RATE_INFO_BW_40) ? 13500000 : 6500000;
1111 13500000 : 6500000;
1112 1125
1113 if (modulation < 4) 1126 if (modulation < 4)
1114 bitrate *= (modulation + 1); 1127 bitrate *= (modulation + 1);