diff options
Diffstat (limited to 'net/wireless/util.c')
| -rw-r--r-- | net/wireless/util.c | 57 | 
1 files changed, 53 insertions, 4 deletions
diff --git a/net/wireless/util.c b/net/wireless/util.c index e74837824cea..419eb12c1e93 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -91,6 +91,11 @@ int ieee80211_channel_to_frequency(int chan, enum nl80211_band band)  		else  			return 5000 + chan * 5;  		break; +	case NL80211_BAND_6GHZ: +		/* see 802.11ax D4.1 27.3.22.2 */ +		if (chan <= 253) +			return 5940 + chan * 5; +		break;  	case NL80211_BAND_60GHZ:  		if (chan < 7)  			return 56160 + chan * 2160; @@ -111,8 +116,11 @@ int ieee80211_frequency_to_channel(int freq)  		return (freq - 2407) / 5;  	else if (freq >= 4910 && freq <= 4980)  		return (freq - 4000) / 5; -	else if (freq <= 45000) /* DMG band lower limit */ +	else if (freq < 5945)  		return (freq - 5000) / 5; +	else if (freq <= 45000) /* DMG band lower limit */ +		/* see 802.11ax D4.1 27.3.22.2 */ +		return (freq - 5940) / 5;  	else if (freq >= 58320 && freq <= 70200)  		return (freq - 56160) / 2160;  	else @@ -148,6 +156,7 @@ static void set_mandatory_flags_band(struct ieee80211_supported_band *sband)  	switch (sband->band) {  	case NL80211_BAND_5GHZ: +	case NL80211_BAND_6GHZ:  		want = 3;  		for (i = 0; i < sband->n_bitrates; i++) {  			if (sband->bitrates[i].bitrate == 60 || @@ -960,6 +969,7 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,  		}  		cfg80211_process_rdev_events(rdev); +		cfg80211_mlme_purge_registrations(dev->ieee80211_ptr);  	}  	err = rdev_change_virtual_intf(rdev, dev, ntype, params); @@ -1039,7 +1049,7 @@ static u32 cfg80211_calculate_bitrate_ht(struct rate_info *rate)  	return (bitrate + 50000) / 100000;  } -static u32 cfg80211_calculate_bitrate_60g(struct rate_info *rate) +static u32 cfg80211_calculate_bitrate_dmg(struct rate_info *rate)  {  	static const u32 __mcs2bitrate[] = {  		/* control PHY */ @@ -1086,6 +1096,40 @@ static u32 cfg80211_calculate_bitrate_60g(struct rate_info *rate)  	return __mcs2bitrate[rate->mcs];  } +static u32 cfg80211_calculate_bitrate_edmg(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] = 13475, +		[7] = 15400, +		[8] = 19250, +		[9] = 23100, +		[10] = 25025, +		[11] = 26950, +		[12] = 30800, +		[13] = 38500, +		[14] = 46200, +		[15] = 50050, +		[16] = 53900, +		[17] = 57750, +		[18] = 69300, +		[19] = 75075, +		[20] = 80850, +	}; + +	if (WARN_ON_ONCE(rate->mcs >= ARRAY_SIZE(__mcs2bitrate))) +		return 0; + +	return __mcs2bitrate[rate->mcs] * rate->n_bonded_ch; +} +  static u32 cfg80211_calculate_bitrate_vht(struct rate_info *rate)  {  	static const u32 base[4][10] = { @@ -1258,8 +1302,10 @@ u32 cfg80211_calculate_bitrate(struct rate_info *rate)  {  	if (rate->flags & RATE_INFO_FLAGS_MCS)  		return cfg80211_calculate_bitrate_ht(rate); -	if (rate->flags & RATE_INFO_FLAGS_60G) -		return cfg80211_calculate_bitrate_60g(rate); +	if (rate->flags & RATE_INFO_FLAGS_DMG) +		return cfg80211_calculate_bitrate_dmg(rate); +	if (rate->flags & RATE_INFO_FLAGS_EDMG) +		return cfg80211_calculate_bitrate_edmg(rate);  	if (rate->flags & RATE_INFO_FLAGS_VHT_MCS)  		return cfg80211_calculate_bitrate_vht(rate);  	if (rate->flags & RATE_INFO_FLAGS_HE_MCS) @@ -1471,6 +1517,9 @@ bool ieee80211_operating_class_to_band(u8 operating_class,  	case 128 ... 130:  		*band = NL80211_BAND_5GHZ;  		return true; +	case 131 ... 135: +		*band = NL80211_BAND_6GHZ; +		return true;  	case 81:  	case 82:  	case 83:  |