cfg80211: bitrate calculation for 60g
authorVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Thu, 5 Jul 2012 11:25:50 +0000 (14:25 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 5 Jul 2012 13:18:32 +0000 (15:18 +0200)
60g band uses different from .11n MCS scheme, so bitrate
should be calculated differently

Signed-off-by: Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
net/wireless/util.c

index 8837efc..51f67a9 100644 (file)
@@ -580,11 +580,13 @@ enum station_info_flags {
  * @RATE_INFO_FLAGS_MCS: @tx_bitrate_mcs filled
  * @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 Mhz width transmission
  * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
+ * @RATE_INFO_FLAGS_60G: 60gHz MCS
  */
 enum rate_info_flags {
        RATE_INFO_FLAGS_MCS             = 1<<0,
        RATE_INFO_FLAGS_40_MHZ_WIDTH    = 1<<1,
        RATE_INFO_FLAGS_SHORT_GI        = 1<<2,
+       RATE_INFO_FLAGS_60G             = 1<<3,
 };
 
 /**
index 6e52726..e31f1db 100644 (file)
@@ -900,12 +900,61 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
        return err;
 }
 
+static u32 cfg80211_calculate_bitrate_60g(struct rate_info *rate)
+{
+       static const u32 __mcs2bitrate[] = {
+               /* control PHY */
+               [0] =   275,
+               /* SC PHY */
+               [1] =  3850,
+               [2] =  7700,
+               [3] =  9625,
+               [4] = 11550,
+               [5] = 12512, /* 1251.25 mbps */
+               [6] = 15400,
+               [7] = 19250,
+               [8] = 23100,
+               [9] = 25025,
+               [10] = 30800,
+               [11] = 38500,
+               [12] = 46200,
+               /* OFDM PHY */
+               [13] =  6930,
+               [14] =  8662, /* 866.25 mbps */
+               [15] = 13860,
+               [16] = 17325,
+               [17] = 20790,
+               [18] = 27720,
+               [19] = 34650,
+               [20] = 41580,
+               [21] = 45045,
+               [22] = 51975,
+               [23] = 62370,
+               [24] = 67568, /* 6756.75 mbps */
+               /* LP-SC PHY */
+               [25] =  6260,
+               [26] =  8340,
+               [27] = 11120,
+               [28] = 12510,
+               [29] = 16680,
+               [30] = 22240,
+               [31] = 25030,
+       };
+
+       if (WARN_ON_ONCE(rate->mcs >= ARRAY_SIZE(__mcs2bitrate)))
+               return 0;
+
+       return __mcs2bitrate[rate->mcs];
+}
+
 u32 cfg80211_calculate_bitrate(struct rate_info *rate)
 {
        int modulation, streams, bitrate;
 
        if (!(rate->flags & RATE_INFO_FLAGS_MCS))
                return rate->legacy;
+       if (rate->flags & RATE_INFO_FLAGS_60G)
+               return cfg80211_calculate_bitrate_60g(rate);
 
        /* the formula below does only work for MCS values smaller than 32 */
        if (WARN_ON_ONCE(rate->mcs >= 32))