aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaximilian Attems <maks@debian.org>2010-02-16 12:20:49 +0000
committerMaximilian Attems <maks@debian.org>2010-02-16 12:20:49 +0000
commit7e9f27fb1ddf390ba555db63321ca6ca08be9092 (patch)
tree20a38be1217deb93def04896325877d9d58b8b07
parent361375effc3a513c4e1a5118901f9f483766a414 (diff)
downloadkernel_replicant_linux-7e9f27fb1ddf390ba555db63321ca6ca08be9092.tar.gz
kernel_replicant_linux-7e9f27fb1ddf390ba555db63321ca6ca08be9092.tar.bz2
kernel_replicant_linux-7e9f27fb1ddf390ba555db63321ca6ca08be9092.zip
wireless: report reasonable bitrate for MCS rates through wext
patch from linux-next, can be feeded to stable once hit linux-2.6. discovered on linux-2.6.32 F12 branch. svn path=/dists/trunk/linux-2.6/; revision=15176
-rw-r--r--debian/changelog1
-rw-r--r--debian/patches/features/all/wireless-report-reasonable-bitrate-for-MCS-rates-th.patch147
-rw-r--r--debian/patches/series/91
3 files changed, 149 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog
index 9deb0e6cb068..204b7ec1927b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -12,6 +12,7 @@ linux-2.6 (2.6.32-9) UNRELEASED; urgency=low
* Postinst only write kernel-img.conf for palo boxes.
* Enable VT_HW_CONSOLE_BINDING for unbinding efifb. (closes: #569314)
* hwmon: Add driver for VIA CPU core temperature.
+ * wireless: report reasonable bitrate for MCS rates through wext.
[ Bastian Blank ]
* Restrict access to sensitive SysRq keys by default.
diff --git a/debian/patches/features/all/wireless-report-reasonable-bitrate-for-MCS-rates-th.patch b/debian/patches/features/all/wireless-report-reasonable-bitrate-for-MCS-rates-th.patch
new file mode 100644
index 000000000000..91838670357b
--- /dev/null
+++ b/debian/patches/features/all/wireless-report-reasonable-bitrate-for-MCS-rates-th.patch
@@ -0,0 +1,147 @@
+From 254416aae70ab2e6b57fd79782c8a67196234d02 Mon Sep 17 00:00:00 2001
+From: John W. Linville <linville@tuxdriver.com>
+Date: Wed, 9 Dec 2009 16:43:52 -0500
+Subject: [PATCH] wireless: report reasonable bitrate for MCS rates through wext
+
+Previously, cfg80211 had reported "0" for MCS (i.e. 802.11n) bitrates
+through the wireless extensions interface. However, nl80211 was
+converting MCS rates into a reasonable bitrate number. This patch moves
+the nl80211 code to cfg80211 where it is now shared between both the
+nl80211 interface and the wireless extensions interface.
+
+Signed-off-by: John W. Linville <linville@tuxdriver.com>
+---
+ net/wireless/core.h | 2 ++
+ net/wireless/nl80211.c | 37 ++-----------------------------------
+ net/wireless/util.c | 33 +++++++++++++++++++++++++++++++++
+ net/wireless/wext-compat.c | 5 +----
+ 4 files changed, 38 insertions(+), 39 deletions(-)
+
+diff --git a/net/wireless/core.h b/net/wireless/core.h
+index 4ef3efc..35b7121 100644
+--- a/net/wireless/core.h
++++ b/net/wireless/core.h
+@@ -378,6 +378,8 @@ int rdev_set_freq(struct cfg80211_registered_device *rdev,
+ struct wireless_dev *for_wdev,
+ int freq, enum nl80211_channel_type channel_type);
+
++u16 cfg80211_calculate_bitrate(struct rate_info *rate);
++
+ #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS
+ #define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond)
+ #else
+diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
+index a602843..7cb0d64 100644
+--- a/net/wireless/nl80211.c
++++ b/net/wireless/nl80211.c
+@@ -1637,39 +1637,6 @@ static int parse_station_flags(struct genl_info *info,
+ return 0;
+ }
+
+-static u16 nl80211_calculate_bitrate(struct rate_info *rate)
+-{
+- int modulation, streams, bitrate;
+-
+- if (!(rate->flags & RATE_INFO_FLAGS_MCS))
+- return rate->legacy;
+-
+- /* the formula below does only work for MCS values smaller than 32 */
+- if (rate->mcs >= 32)
+- return 0;
+-
+- modulation = rate->mcs & 7;
+- streams = (rate->mcs >> 3) + 1;
+-
+- bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
+- 13500000 : 6500000;
+-
+- if (modulation < 4)
+- bitrate *= (modulation + 1);
+- else if (modulation == 4)
+- bitrate *= (modulation + 2);
+- else
+- bitrate *= (modulation + 3);
+-
+- bitrate *= streams;
+-
+- if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
+- bitrate = (bitrate / 9) * 10;
+-
+- /* do NOT round down here */
+- return (bitrate + 50000) / 100000;
+-}
+-
+ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
+ int flags, struct net_device *dev,
+ u8 *mac_addr, struct station_info *sinfo)
+@@ -1716,8 +1683,8 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
+ if (!txrate)
+ goto nla_put_failure;
+
+- /* nl80211_calculate_bitrate will return 0 for mcs >= 32 */
+- bitrate = nl80211_calculate_bitrate(&sinfo->txrate);
++ /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
++ bitrate = cfg80211_calculate_bitrate(&sinfo->txrate);
+ if (bitrate > 0)
+ NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate);
+
+diff --git a/net/wireless/util.c b/net/wireless/util.c
+index 59361fd..a3c841a 100644
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -720,3 +720,36 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
+
+ return err;
+ }
++
++u16 cfg80211_calculate_bitrate(struct rate_info *rate)
++{
++ int modulation, streams, bitrate;
++
++ if (!(rate->flags & RATE_INFO_FLAGS_MCS))
++ return rate->legacy;
++
++ /* the formula below does only work for MCS values smaller than 32 */
++ if (rate->mcs >= 32)
++ return 0;
++
++ modulation = rate->mcs & 7;
++ streams = (rate->mcs >> 3) + 1;
++
++ bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
++ 13500000 : 6500000;
++
++ if (modulation < 4)
++ bitrate *= (modulation + 1);
++ else if (modulation == 4)
++ bitrate *= (modulation + 2);
++ else
++ bitrate *= (modulation + 3);
++
++ bitrate *= streams;
++
++ if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
++ bitrate = (bitrate / 9) * 10;
++
++ /* do NOT round down here */
++ return (bitrate + 50000) / 100000;
++}
+diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
+index 584eb48..2fa8de1 100644
+--- a/net/wireless/wext-compat.c
++++ b/net/wireless/wext-compat.c
+@@ -1256,10 +1256,7 @@ int cfg80211_wext_giwrate(struct net_device *dev,
+ if (!(sinfo.filled & STATION_INFO_TX_BITRATE))
+ return -EOPNOTSUPP;
+
+- rate->value = 0;
+-
+- if (!(sinfo.txrate.flags & RATE_INFO_FLAGS_MCS))
+- rate->value = 100000 * sinfo.txrate.legacy;
++ rate->value = 100000 * cfg80211_calculate_bitrate(&sinfo.txrate);
+
+ return 0;
+ }
+--
+1.5.6.5
+
diff --git a/debian/patches/series/9 b/debian/patches/series/9
index 9c5eaa1863cc..74cfcdca332b 100644
--- a/debian/patches/series/9
+++ b/debian/patches/series/9
@@ -6,3 +6,4 @@
+ features/all/macvlan-implement-bridge-VEPA-and-private-mode.patch
+ features/all/macvlan-export-macvlan-mode-through-netlink.patch
+ features/all/hwmon-Add-driver-for-VIA-CPU-core-temperature.patch
++ features/all/wireless-report-reasonable-bitrate-for-MCS-rates-th.patch