Commit 95ddc1fc authored by Vladimir Kondratiev's avatar Vladimir Kondratiev Committed by Johannes Berg

cfg80211: bitrate calculation for 60g

60g band uses different from .11n MCS scheme, so bitrate
should be calculated differently
Signed-off-by: default avatarVladimir Kondratiev <qca_vkondrat@qca.qualcomm.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 8eb41c8d
...@@ -580,11 +580,13 @@ enum station_info_flags { ...@@ -580,11 +580,13 @@ enum station_info_flags {
* @RATE_INFO_FLAGS_MCS: @tx_bitrate_mcs filled * @RATE_INFO_FLAGS_MCS: @tx_bitrate_mcs filled
* @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 Mhz width transmission * @RATE_INFO_FLAGS_40_MHZ_WIDTH: 40 Mhz width transmission
* @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval * @RATE_INFO_FLAGS_SHORT_GI: 400ns guard interval
* @RATE_INFO_FLAGS_60G: 60gHz MCS
*/ */
enum rate_info_flags { enum rate_info_flags {
RATE_INFO_FLAGS_MCS = 1<<0, RATE_INFO_FLAGS_MCS = 1<<0,
RATE_INFO_FLAGS_40_MHZ_WIDTH = 1<<1, RATE_INFO_FLAGS_40_MHZ_WIDTH = 1<<1,
RATE_INFO_FLAGS_SHORT_GI = 1<<2, RATE_INFO_FLAGS_SHORT_GI = 1<<2,
RATE_INFO_FLAGS_60G = 1<<3,
}; };
/** /**
......
...@@ -900,12 +900,61 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev, ...@@ -900,12 +900,61 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
return err; 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) u32 cfg80211_calculate_bitrate(struct rate_info *rate)
{ {
int modulation, streams, bitrate; int modulation, streams, bitrate;
if (!(rate->flags & RATE_INFO_FLAGS_MCS)) if (!(rate->flags & RATE_INFO_FLAGS_MCS))
return rate->legacy; 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 */ /* the formula below does only work for MCS values smaller than 32 */
if (WARN_ON_ONCE(rate->mcs >= 32)) if (WARN_ON_ONCE(rate->mcs >= 32))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment