mac80211: minstrel_ht: add support for OFDM rates on non-HT clients
The legacy minstrel code is essentially unmaintained and receives only very little testing. In order to bring the significant algorithm improvements from minstrel_ht to legacy clients, this patch adds support for OFDM rates to minstrel_ht and removes the fallback to the legacy codepath. This also makes it work much better on hardware with rate selection constraints, e.g. mt76. Signed-off-by: Felix Fietkau <nbd@nbd.name> Link: https://lore.kernel.org/r/20210115120242.89616-3-nbd@nbd.name Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
committed by
Johannes Berg
parent
f84de06398
commit
a7844a5384
@@ -52,7 +52,6 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p)
|
||||
|
||||
for (j = 0; j < MCS_GROUP_RATES; j++) {
|
||||
struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
|
||||
static const int bitrates[4] = { 10, 20, 55, 110 };
|
||||
int idx = i * MCS_GROUP_RATES + j;
|
||||
unsigned int duration;
|
||||
|
||||
@@ -67,6 +66,9 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p)
|
||||
p += sprintf(p, "VHT%c0 ", htmode);
|
||||
p += sprintf(p, "%cGI ", gimode);
|
||||
p += sprintf(p, "%d ", mg->streams);
|
||||
} else if (i == MINSTREL_OFDM_GROUP) {
|
||||
p += sprintf(p, "OFDM ");
|
||||
p += sprintf(p, "1 ");
|
||||
} else {
|
||||
p += sprintf(p, "CCK ");
|
||||
p += sprintf(p, "%cP ", j < 4 ? 'L' : 'S');
|
||||
@@ -84,7 +86,12 @@ minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p)
|
||||
} else if (gflags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
p += sprintf(p, " MCS%-1u/%1u", j, mg->streams);
|
||||
} else {
|
||||
int r = bitrates[j % 4];
|
||||
int r;
|
||||
|
||||
if (i == MINSTREL_OFDM_GROUP)
|
||||
r = minstrel_ofdm_bitrates[j % 8];
|
||||
else
|
||||
r = minstrel_cck_bitrates[j % 4];
|
||||
|
||||
p += sprintf(p, " %2u.%1uM", r / 10, r % 10);
|
||||
}
|
||||
@@ -124,16 +131,8 @@ minstrel_ht_stats_open(struct inode *inode, struct file *file)
|
||||
struct minstrel_ht_sta *mi = &msp->ht;
|
||||
struct minstrel_debugfs_info *ms;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
char *p;
|
||||
|
||||
if (!msp->is_ht) {
|
||||
inode->i_private = &msp->legacy;
|
||||
ret = minstrel_stats_open(inode, file);
|
||||
inode->i_private = msp;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ms = kmalloc(32768, GFP_KERNEL);
|
||||
if (!ms)
|
||||
return -ENOMEM;
|
||||
@@ -199,7 +198,6 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p)
|
||||
|
||||
for (j = 0; j < MCS_GROUP_RATES; j++) {
|
||||
struct minstrel_rate_stats *mrs = &mi->groups[i].rates[j];
|
||||
static const int bitrates[4] = { 10, 20, 55, 110 };
|
||||
int idx = i * MCS_GROUP_RATES + j;
|
||||
unsigned int duration;
|
||||
|
||||
@@ -214,6 +212,8 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p)
|
||||
p += sprintf(p, "VHT%c0,", htmode);
|
||||
p += sprintf(p, "%cGI,", gimode);
|
||||
p += sprintf(p, "%d,", mg->streams);
|
||||
} else if (i == MINSTREL_OFDM_GROUP) {
|
||||
p += sprintf(p, "OFDM,,1,");
|
||||
} else {
|
||||
p += sprintf(p, "CCK,");
|
||||
p += sprintf(p, "%cP,", j < 4 ? 'L' : 'S');
|
||||
@@ -231,7 +231,13 @@ minstrel_ht_stats_csv_dump(struct minstrel_ht_sta *mi, int i, char *p)
|
||||
} else if (gflags & IEEE80211_TX_RC_VHT_MCS) {
|
||||
p += sprintf(p, ",MCS%-1u/%1u,", j, mg->streams);
|
||||
} else {
|
||||
int r = bitrates[j % 4];
|
||||
int r;
|
||||
|
||||
if (i == MINSTREL_OFDM_GROUP)
|
||||
r = minstrel_ofdm_bitrates[j % 8];
|
||||
else
|
||||
r = minstrel_cck_bitrates[j % 4];
|
||||
|
||||
p += sprintf(p, ",%2u.%1uM,", r / 10, r % 10);
|
||||
}
|
||||
|
||||
@@ -274,18 +280,9 @@ minstrel_ht_stats_csv_open(struct inode *inode, struct file *file)
|
||||
struct minstrel_ht_sta *mi = &msp->ht;
|
||||
struct minstrel_debugfs_info *ms;
|
||||
unsigned int i;
|
||||
int ret;
|
||||
char *p;
|
||||
|
||||
if (!msp->is_ht) {
|
||||
inode->i_private = &msp->legacy;
|
||||
ret = minstrel_stats_csv_open(inode, file);
|
||||
inode->i_private = msp;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ms = kmalloc(32768, GFP_KERNEL);
|
||||
|
||||
if (!ms)
|
||||
return -ENOMEM;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user