Commit 254416aae70ab2e6b57fd79782c8a67196234d02
1 parent
a252e749f1
Exists in
master
and in
7 other branches
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>
Showing 4 changed files with 38 additions and 39 deletions Side-by-side Diff
net/wireless/core.h
... | ... | @@ -378,6 +378,8 @@ |
378 | 378 | struct wireless_dev *for_wdev, |
379 | 379 | int freq, enum nl80211_channel_type channel_type); |
380 | 380 | |
381 | +u16 cfg80211_calculate_bitrate(struct rate_info *rate); | |
382 | + | |
381 | 383 | #ifdef CONFIG_CFG80211_DEVELOPER_WARNINGS |
382 | 384 | #define CFG80211_DEV_WARN_ON(cond) WARN_ON(cond) |
383 | 385 | #else |
net/wireless/nl80211.c
... | ... | @@ -1637,39 +1637,6 @@ |
1637 | 1637 | return 0; |
1638 | 1638 | } |
1639 | 1639 | |
1640 | -static u16 nl80211_calculate_bitrate(struct rate_info *rate) | |
1641 | -{ | |
1642 | - int modulation, streams, bitrate; | |
1643 | - | |
1644 | - if (!(rate->flags & RATE_INFO_FLAGS_MCS)) | |
1645 | - return rate->legacy; | |
1646 | - | |
1647 | - /* the formula below does only work for MCS values smaller than 32 */ | |
1648 | - if (rate->mcs >= 32) | |
1649 | - return 0; | |
1650 | - | |
1651 | - modulation = rate->mcs & 7; | |
1652 | - streams = (rate->mcs >> 3) + 1; | |
1653 | - | |
1654 | - bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ? | |
1655 | - 13500000 : 6500000; | |
1656 | - | |
1657 | - if (modulation < 4) | |
1658 | - bitrate *= (modulation + 1); | |
1659 | - else if (modulation == 4) | |
1660 | - bitrate *= (modulation + 2); | |
1661 | - else | |
1662 | - bitrate *= (modulation + 3); | |
1663 | - | |
1664 | - bitrate *= streams; | |
1665 | - | |
1666 | - if (rate->flags & RATE_INFO_FLAGS_SHORT_GI) | |
1667 | - bitrate = (bitrate / 9) * 10; | |
1668 | - | |
1669 | - /* do NOT round down here */ | |
1670 | - return (bitrate + 50000) / 100000; | |
1671 | -} | |
1672 | - | |
1673 | 1640 | static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq, |
1674 | 1641 | int flags, struct net_device *dev, |
1675 | 1642 | u8 *mac_addr, struct station_info *sinfo) |
... | ... | @@ -1716,8 +1683,8 @@ |
1716 | 1683 | if (!txrate) |
1717 | 1684 | goto nla_put_failure; |
1718 | 1685 | |
1719 | - /* nl80211_calculate_bitrate will return 0 for mcs >= 32 */ | |
1720 | - bitrate = nl80211_calculate_bitrate(&sinfo->txrate); | |
1686 | + /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */ | |
1687 | + bitrate = cfg80211_calculate_bitrate(&sinfo->txrate); | |
1721 | 1688 | if (bitrate > 0) |
1722 | 1689 | NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate); |
1723 | 1690 |
net/wireless/util.c
... | ... | @@ -720,4 +720,37 @@ |
720 | 720 | |
721 | 721 | return err; |
722 | 722 | } |
723 | + | |
724 | +u16 cfg80211_calculate_bitrate(struct rate_info *rate) | |
725 | +{ | |
726 | + int modulation, streams, bitrate; | |
727 | + | |
728 | + if (!(rate->flags & RATE_INFO_FLAGS_MCS)) | |
729 | + return rate->legacy; | |
730 | + | |
731 | + /* the formula below does only work for MCS values smaller than 32 */ | |
732 | + if (rate->mcs >= 32) | |
733 | + return 0; | |
734 | + | |
735 | + modulation = rate->mcs & 7; | |
736 | + streams = (rate->mcs >> 3) + 1; | |
737 | + | |
738 | + bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ? | |
739 | + 13500000 : 6500000; | |
740 | + | |
741 | + if (modulation < 4) | |
742 | + bitrate *= (modulation + 1); | |
743 | + else if (modulation == 4) | |
744 | + bitrate *= (modulation + 2); | |
745 | + else | |
746 | + bitrate *= (modulation + 3); | |
747 | + | |
748 | + bitrate *= streams; | |
749 | + | |
750 | + if (rate->flags & RATE_INFO_FLAGS_SHORT_GI) | |
751 | + bitrate = (bitrate / 9) * 10; | |
752 | + | |
753 | + /* do NOT round down here */ | |
754 | + return (bitrate + 50000) / 100000; | |
755 | +} |
net/wireless/wext-compat.c
... | ... | @@ -1256,10 +1256,7 @@ |
1256 | 1256 | if (!(sinfo.filled & STATION_INFO_TX_BITRATE)) |
1257 | 1257 | return -EOPNOTSUPP; |
1258 | 1258 | |
1259 | - rate->value = 0; | |
1260 | - | |
1261 | - if (!(sinfo.txrate.flags & RATE_INFO_FLAGS_MCS)) | |
1262 | - rate->value = 100000 * sinfo.txrate.legacy; | |
1259 | + rate->value = 100000 * cfg80211_calculate_bitrate(&sinfo.txrate); | |
1263 | 1260 | |
1264 | 1261 | return 0; |
1265 | 1262 | } |