mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From: Felix Fietkau <nbd@nbd.name>
 | |
| Date: Thu, 1 Mar 2018 13:28:48 +0100
 | |
| Subject: [PATCH] mac80211: minstrel: fix sampling/reporting of CCK rates
 | |
|  in HT mode
 | |
| 
 | |
| Long/short preamble selection cannot be sampled separately, since it
 | |
| depends on the BSS state. Because of that, sampling attempts to
 | |
| currently not used preamble modes are not counted in the statistics,
 | |
| which leads to CCK rates being sampled too often.
 | |
| 
 | |
| Fix statistics accounting for long/short preamble by increasing the
 | |
| index where necessary.
 | |
| Fix excessive CCK rate sampling by dropping unsupported sample attempts.
 | |
| 
 | |
| This improves throughput on 2.4 GHz channels
 | |
| 
 | |
| Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | |
| ---
 | |
| 
 | |
| --- a/net/mac80211/rc80211_minstrel_ht.c
 | |
| +++ b/net/mac80211/rc80211_minstrel_ht.c
 | |
| @@ -281,7 +281,8 @@ minstrel_ht_get_stats(struct minstrel_pr
 | |
|  				break;
 | |
|  
 | |
|  		/* short preamble */
 | |
| -		if (!(mi->supported[group] & BIT(idx)))
 | |
| +		if ((mi->supported[group] & BIT(idx + 4)) &&
 | |
| +		    (rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE))
 | |
|  			idx += 4;
 | |
|  	}
 | |
|  	return &mi->groups[group].rates[idx];
 | |
| @@ -1080,18 +1081,23 @@ minstrel_ht_get_rate(void *priv, struct
 | |
|  		return;
 | |
|  
 | |
|  	sample_group = &minstrel_mcs_groups[sample_idx / MCS_GROUP_RATES];
 | |
| +	sample_idx %= MCS_GROUP_RATES;
 | |
| +
 | |
| +	if (sample_group == &minstrel_mcs_groups[MINSTREL_CCK_GROUP] &&
 | |
| +	    (sample_idx >= 4) != txrc->short_preamble)
 | |
| +		return;
 | |
| +
 | |
|  	info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
 | |
|  	rate->count = 1;
 | |
|  
 | |
| -	if (sample_idx / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) {
 | |
| +	if (sample_group == &minstrel_mcs_groups[MINSTREL_CCK_GROUP]) {
 | |
|  		int idx = sample_idx % ARRAY_SIZE(mp->cck_rates);
 | |
|  		rate->idx = mp->cck_rates[idx];
 | |
|  	} else if (sample_group->flags & IEEE80211_TX_RC_VHT_MCS) {
 | |
|  		ieee80211_rate_set_vht(rate, sample_idx % MCS_GROUP_RATES,
 | |
|  				       sample_group->streams);
 | |
|  	} else {
 | |
| -		rate->idx = sample_idx % MCS_GROUP_RATES +
 | |
| -			    (sample_group->streams - 1) * 8;
 | |
| +		rate->idx = sample_idx + (sample_group->streams - 1) * 8;
 | |
|  	}
 | |
|  
 | |
|  	rate->flags = sample_group->flags;
 |