Commit 254416aae70ab2e6b57fd79782c8a67196234d02

Authored by John W. Linville
1 parent a252e749f1

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

... ... @@ -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  
... ... @@ -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 }