diff options
| author | Vladimir Kondratiev <qca_vkondrat@qca.qualcomm.com> | 2012-07-05 14:25:50 +0300 | 
|---|---|---|
| committer | Johannes Berg <johannes.berg@intel.com> | 2012-07-05 15:18:32 +0200 | 
| commit | 95ddc1fc4519ed48ddc7d622bd5c84dff3eebb0a (patch) | |
| tree | daf30d3a4e3b1371c268f0aaac1c95e795fda53c | |
| parent | 8eb41c8dfb9e2396d2452ada9023a83d610b9051 (diff) | |
| download | olio-linux-3.10-95ddc1fc4519ed48ddc7d622bd5c84dff3eebb0a.tar.xz olio-linux-3.10-95ddc1fc4519ed48ddc7d622bd5c84dff3eebb0a.zip  | |
cfg80211: bitrate calculation for 60g
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>
| -rw-r--r-- | include/net/cfg80211.h | 2 | ||||
| -rw-r--r-- | net/wireless/util.c | 49 | 
2 files changed, 51 insertions, 0 deletions
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 8837efc368f..51f67a9003a 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -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,  };  /** diff --git a/net/wireless/util.c b/net/wireless/util.c index 6e52726f7fe..e31f1dba79e 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -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))  |