123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575 |
- From: Felix Fietkau <nbd@nbd.name>
- Date: Sat, 10 Feb 2018 12:43:30 +0100
- Subject: [PATCH] mac80211: minstrel: merge with minstrel_ht, always enable
- VHT support
- Legacy-only devices are not very common and the overhead of the extra
- code for HT and VHT rates is not big enough to justify all those extra
- lines of code to make it optional.
- Signed-off-by: Felix Fietkau <nbd@nbd.name>
- ---
- --- a/net/mac80211/Kconfig
- +++ b/net/mac80211/Kconfig
- @@ -25,20 +25,6 @@ config MAC80211_RC_MINSTREL
- ---help---
- This option enables the 'minstrel' TX rate control algorithm
-
- -config MAC80211_RC_MINSTREL_HT
- - bool "Minstrel 802.11n support" if EXPERT
- - depends on MAC80211_RC_MINSTREL
- - default y
- - ---help---
- - This option enables the 'minstrel_ht' TX rate control algorithm
- -
- -config MAC80211_RC_MINSTREL_VHT
- - bool "Minstrel 802.11ac support" if EXPERT
- - depends on MAC80211_RC_MINSTREL_HT
- - default n
- - ---help---
- - This option enables VHT in the 'minstrel_ht' TX rate control algorithm
- -
- choice
- prompt "Default rate control algorithm"
- depends on MAC80211_HAS_RC
- @@ -60,8 +46,7 @@ endchoice
-
- config MAC80211_RC_DEFAULT
- string
- - default "minstrel_ht" if MAC80211_RC_DEFAULT_MINSTREL && MAC80211_RC_MINSTREL_HT
- - default "minstrel" if MAC80211_RC_DEFAULT_MINSTREL
- + default "minstrel_ht" if MAC80211_RC_DEFAULT_MINSTREL
- default ""
-
- endif
- --- a/net/mac80211/Makefile
- +++ b/net/mac80211/Makefile
- @@ -52,13 +52,14 @@ mac80211-$(CONFIG_PM) += pm.o
-
- CFLAGS_trace.o := -I$(src)
-
- -rc80211_minstrel-y := rc80211_minstrel.o
- -rc80211_minstrel-$(CPTCFG_MAC80211_DEBUGFS) += rc80211_minstrel_debugfs.o
- +rc80211_minstrel-y := \
- + rc80211_minstrel.o \
- + rc80211_minstrel_ht.o
-
- -rc80211_minstrel_ht-y := rc80211_minstrel_ht.o
- -rc80211_minstrel_ht-$(CPTCFG_MAC80211_DEBUGFS) += rc80211_minstrel_ht_debugfs.o
- +rc80211_minstrel-$(CPTCFG_MAC80211_DEBUGFS) += \
- + rc80211_minstrel_debugfs.o \
- + rc80211_minstrel_ht_debugfs.o
-
- mac80211-$(CPTCFG_MAC80211_RC_MINSTREL) += $(rc80211_minstrel-y)
- -mac80211-$(CPTCFG_MAC80211_RC_MINSTREL_HT) += $(rc80211_minstrel_ht-y)
-
- ccflags-y += -DDEBUG
- --- a/net/mac80211/main.c
- +++ b/net/mac80211/main.c
- @@ -1306,18 +1306,12 @@ static int __init ieee80211_init(void)
- if (ret)
- return ret;
-
- - ret = rc80211_minstrel_ht_init();
- - if (ret)
- - goto err_minstrel;
- -
- ret = ieee80211_iface_init();
- if (ret)
- goto err_netdev;
-
- return 0;
- err_netdev:
- - rc80211_minstrel_ht_exit();
- - err_minstrel:
- rc80211_minstrel_exit();
-
- return ret;
- @@ -1325,7 +1319,6 @@ static int __init ieee80211_init(void)
-
- static void __exit ieee80211_exit(void)
- {
- - rc80211_minstrel_ht_exit();
- rc80211_minstrel_exit();
-
- ieee80211s_stop();
- --- a/net/mac80211/rate.h
- +++ b/net/mac80211/rate.h
- @@ -95,18 +95,5 @@ static inline void rc80211_minstrel_exit
- }
- #endif
-
- -#ifdef CPTCFG_MAC80211_RC_MINSTREL_HT
- -int rc80211_minstrel_ht_init(void);
- -void rc80211_minstrel_ht_exit(void);
- -#else
- -static inline int rc80211_minstrel_ht_init(void)
- -{
- - return 0;
- -}
- -static inline void rc80211_minstrel_ht_exit(void)
- -{
- -}
- -#endif
- -
-
- #endif /* IEEE80211_RATE_H */
- --- a/net/mac80211/rc80211_minstrel.c
- +++ b/net/mac80211/rc80211_minstrel.c
- @@ -572,138 +572,6 @@ minstrel_rate_init(void *priv, struct ie
- minstrel_update_rates(mp, mi);
- }
-
- -static void *
- -minstrel_alloc_sta(void *priv, struct ieee80211_sta *sta, gfp_t gfp)
- -{
- - struct ieee80211_supported_band *sband;
- - struct minstrel_sta_info *mi;
- - struct minstrel_priv *mp = priv;
- - struct ieee80211_hw *hw = mp->hw;
- - int max_rates = 0;
- - int i;
- -
- - mi = kzalloc(sizeof(struct minstrel_sta_info), gfp);
- - if (!mi)
- - return NULL;
- -
- - for (i = 0; i < NUM_NL80211_BANDS; i++) {
- - sband = hw->wiphy->bands[i];
- - if (sband && sband->n_bitrates > max_rates)
- - max_rates = sband->n_bitrates;
- - }
- -
- - mi->r = kcalloc(max_rates, sizeof(struct minstrel_rate), gfp);
- - if (!mi->r)
- - goto error;
- -
- - mi->sample_table = kmalloc_array(max_rates, SAMPLE_COLUMNS, gfp);
- - if (!mi->sample_table)
- - goto error1;
- -
- - mi->last_stats_update = jiffies;
- - return mi;
- -
- -error1:
- - kfree(mi->r);
- -error:
- - kfree(mi);
- - return NULL;
- -}
- -
- -static void
- -minstrel_free_sta(void *priv, struct ieee80211_sta *sta, void *priv_sta)
- -{
- - struct minstrel_sta_info *mi = priv_sta;
- -
- - kfree(mi->sample_table);
- - kfree(mi->r);
- - kfree(mi);
- -}
- -
- -static void
- -minstrel_init_cck_rates(struct minstrel_priv *mp)
- -{
- - static const int bitrates[4] = { 10, 20, 55, 110 };
- - struct ieee80211_supported_band *sband;
- - u32 rate_flags = ieee80211_chandef_rate_flags(&mp->hw->conf.chandef);
- - int i, j;
- -
- - sband = mp->hw->wiphy->bands[NL80211_BAND_2GHZ];
- - if (!sband)
- - return;
- -
- - for (i = 0, j = 0; i < sband->n_bitrates; i++) {
- - struct ieee80211_rate *rate = &sband->bitrates[i];
- -
- - if (rate->flags & IEEE80211_RATE_ERP_G)
- - continue;
- -
- - if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
- - continue;
- -
- - for (j = 0; j < ARRAY_SIZE(bitrates); j++) {
- - if (rate->bitrate != bitrates[j])
- - continue;
- -
- - mp->cck_rates[j] = i;
- - break;
- - }
- - }
- -}
- -
- -static void *
- -minstrel_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
- -{
- - struct minstrel_priv *mp;
- -
- - mp = kzalloc(sizeof(struct minstrel_priv), GFP_ATOMIC);
- - if (!mp)
- - return NULL;
- -
- - /* contention window settings
- - * Just an approximation. Using the per-queue values would complicate
- - * the calculations and is probably unnecessary */
- - mp->cw_min = 15;
- - mp->cw_max = 1023;
- -
- - /* number of packets (in %) to use for sampling other rates
- - * sample less often for non-mrr packets, because the overhead
- - * is much higher than with mrr */
- - mp->lookaround_rate = 5;
- - mp->lookaround_rate_mrr = 10;
- -
- - /* maximum time that the hw is allowed to stay in one MRR segment */
- - mp->segment_size = 6000;
- -
- - if (hw->max_rate_tries > 0)
- - mp->max_retry = hw->max_rate_tries;
- - else
- - /* safe default, does not necessarily have to match hw properties */
- - mp->max_retry = 7;
- -
- - if (hw->max_rates >= 4)
- - mp->has_mrr = true;
- -
- - mp->hw = hw;
- - mp->update_interval = 100;
- -
- -#ifdef CPTCFG_MAC80211_DEBUGFS
- - mp->fixed_rate_idx = (u32) -1;
- - debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir,
- - &mp->fixed_rate_idx);
- -#endif
- -
- - minstrel_init_cck_rates(mp);
- -
- - return mp;
- -}
- -
- -static void
- -minstrel_free(void *priv)
- -{
- - kfree(priv);
- -}
- -
- static u32 minstrel_get_expected_throughput(void *priv_sta)
- {
- struct minstrel_sta_info *mi = priv_sta;
- @@ -722,28 +590,8 @@ static u32 minstrel_get_expected_through
- }
-
- const struct rate_control_ops mac80211_minstrel = {
- - .name = "minstrel",
- .tx_status_ext = minstrel_tx_status,
- .get_rate = minstrel_get_rate,
- .rate_init = minstrel_rate_init,
- - .alloc = minstrel_alloc,
- - .free = minstrel_free,
- - .alloc_sta = minstrel_alloc_sta,
- - .free_sta = minstrel_free_sta,
- -#ifdef CPTCFG_MAC80211_DEBUGFS
- - .add_sta_debugfs = minstrel_add_sta_debugfs,
- -#endif
- .get_expected_throughput = minstrel_get_expected_throughput,
- };
- -
- -int __init
- -rc80211_minstrel_init(void)
- -{
- - return ieee80211_rate_control_register(&mac80211_minstrel);
- -}
- -
- -void
- -rc80211_minstrel_exit(void)
- -{
- - ieee80211_rate_control_unregister(&mac80211_minstrel);
- -}
- --- a/net/mac80211/rc80211_minstrel.h
- +++ b/net/mac80211/rc80211_minstrel.h
- @@ -158,7 +158,5 @@ int minstrel_get_tp_avg(struct minstrel_
- /* debugfs */
- int minstrel_stats_open(struct inode *inode, struct file *file);
- int minstrel_stats_csv_open(struct inode *inode, struct file *file);
- -ssize_t minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos);
- -int minstrel_stats_release(struct inode *inode, struct file *file);
-
- #endif
- --- a/net/mac80211/rc80211_minstrel_debugfs.c
- +++ b/net/mac80211/rc80211_minstrel_debugfs.c
- @@ -54,22 +54,6 @@
- #include <net/mac80211.h>
- #include "rc80211_minstrel.h"
-
- -ssize_t
- -minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
- -{
- - struct minstrel_debugfs_info *ms;
- -
- - ms = file->private_data;
- - return simple_read_from_buffer(buf, len, ppos, ms->buf, ms->len);
- -}
- -
- -int
- -minstrel_stats_release(struct inode *inode, struct file *file)
- -{
- - kfree(file->private_data);
- - return 0;
- -}
- -
- int
- minstrel_stats_open(struct inode *inode, struct file *file)
- {
- @@ -135,14 +119,6 @@ minstrel_stats_open(struct inode *inode,
- return 0;
- }
-
- -static const struct file_operations minstrel_stat_fops = {
- - .owner = THIS_MODULE,
- - .open = minstrel_stats_open,
- - .read = minstrel_stats_read,
- - .release = minstrel_stats_release,
- - .llseek = default_llseek,
- -};
- -
- int
- minstrel_stats_csv_open(struct inode *inode, struct file *file)
- {
- @@ -200,21 +176,3 @@ minstrel_stats_csv_open(struct inode *in
-
- return 0;
- }
- -
- -static const struct file_operations minstrel_stat_csv_fops = {
- - .owner = THIS_MODULE,
- - .open = minstrel_stats_csv_open,
- - .read = minstrel_stats_read,
- - .release = minstrel_stats_release,
- - .llseek = default_llseek,
- -};
- -
- -void
- -minstrel_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir)
- -{
- - struct minstrel_sta_info *mi = priv_sta;
- -
- - debugfs_create_file("rc_stats", S_IRUGO, dir, mi, &minstrel_stat_fops);
- - debugfs_create_file("rc_stats_csv", S_IRUGO, dir, mi,
- - &minstrel_stat_csv_fops);
- -}
- --- a/net/mac80211/rc80211_minstrel_ht.c
- +++ b/net/mac80211/rc80211_minstrel_ht.c
- @@ -137,12 +137,10 @@
- } \
- }
-
- -#ifdef CPTCFG_MAC80211_RC_MINSTREL_VHT
- static bool minstrel_vht_only = true;
- module_param(minstrel_vht_only, bool, 0644);
- MODULE_PARM_DESC(minstrel_vht_only,
- "Use only VHT rates when VHT is supported by sta.");
- -#endif
-
- /*
- * To enable sufficiently targeted rate sampling, MCS rates are divided into
- @@ -171,7 +169,6 @@ const struct mcs_group minstrel_mcs_grou
-
- CCK_GROUP,
-
- -#ifdef CPTCFG_MAC80211_RC_MINSTREL_VHT
- VHT_GROUP(1, 0, BW_20),
- VHT_GROUP(2, 0, BW_20),
- VHT_GROUP(3, 0, BW_20),
- @@ -195,7 +192,6 @@ const struct mcs_group minstrel_mcs_grou
- VHT_GROUP(1, 1, BW_80),
- VHT_GROUP(2, 1, BW_80),
- VHT_GROUP(3, 1, BW_80),
- -#endif
- };
-
- static u8 sample_table[SAMPLE_COLUMNS][MCS_GROUP_RATES] __read_mostly;
- @@ -1146,12 +1142,10 @@ minstrel_ht_update_caps(void *priv, stru
-
- BUILD_BUG_ON(ARRAY_SIZE(minstrel_mcs_groups) != MINSTREL_GROUPS_NB);
-
- -#ifdef CPTCFG_MAC80211_RC_MINSTREL_VHT
- if (vht_cap->vht_supported)
- use_vht = vht_cap->vht_mcs.tx_mcs_map != cpu_to_le16(~0);
- else
- -#endif
- - use_vht = 0;
- + use_vht = 0;
-
- msp->is_ht = true;
- memset(mi, 0, sizeof(*mi));
- @@ -1226,10 +1220,9 @@ minstrel_ht_update_caps(void *priv, stru
-
- /* HT rate */
- if (gflags & IEEE80211_TX_RC_MCS) {
- -#ifdef CPTCFG_MAC80211_RC_MINSTREL_VHT
- if (use_vht && minstrel_vht_only)
- continue;
- -#endif
- +
- mi->supported[i] = mcs->rx_mask[nss - 1];
- if (mi->supported[i])
- n_supported++;
- @@ -1349,16 +1342,88 @@ minstrel_ht_free_sta(void *priv, struct
- kfree(msp);
- }
-
- +static void
- +minstrel_ht_init_cck_rates(struct minstrel_priv *mp)
- +{
- + static const int bitrates[4] = { 10, 20, 55, 110 };
- + struct ieee80211_supported_band *sband;
- + u32 rate_flags = ieee80211_chandef_rate_flags(&mp->hw->conf.chandef);
- + int i, j;
- +
- + sband = mp->hw->wiphy->bands[NL80211_BAND_2GHZ];
- + if (!sband)
- + return;
- +
- + for (i = 0, j = 0; i < sband->n_bitrates; i++) {
- + struct ieee80211_rate *rate = &sband->bitrates[i];
- +
- + if (rate->flags & IEEE80211_RATE_ERP_G)
- + continue;
- +
- + if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
- + continue;
- +
- + for (j = 0; j < ARRAY_SIZE(bitrates); j++) {
- + if (rate->bitrate != bitrates[j])
- + continue;
- +
- + mp->cck_rates[j] = i;
- + break;
- + }
- + }
- +}
- +
- static void *
- minstrel_ht_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
- {
- - return mac80211_minstrel.alloc(hw, debugfsdir);
- + struct minstrel_priv *mp;
- +
- + mp = kzalloc(sizeof(struct minstrel_priv), GFP_ATOMIC);
- + if (!mp)
- + return NULL;
- +
- + /* contention window settings
- + * Just an approximation. Using the per-queue values would complicate
- + * the calculations and is probably unnecessary */
- + mp->cw_min = 15;
- + mp->cw_max = 1023;
- +
- + /* number of packets (in %) to use for sampling other rates
- + * sample less often for non-mrr packets, because the overhead
- + * is much higher than with mrr */
- + mp->lookaround_rate = 5;
- + mp->lookaround_rate_mrr = 10;
- +
- + /* maximum time that the hw is allowed to stay in one MRR segment */
- + mp->segment_size = 6000;
- +
- + if (hw->max_rate_tries > 0)
- + mp->max_retry = hw->max_rate_tries;
- + else
- + /* safe default, does not necessarily have to match hw properties */
- + mp->max_retry = 7;
- +
- + if (hw->max_rates >= 4)
- + mp->has_mrr = true;
- +
- + mp->hw = hw;
- + mp->update_interval = 100;
- +
- +#ifdef CPTCFG_MAC80211_DEBUGFS
- + mp->fixed_rate_idx = (u32) -1;
- + debugfs_create_u32("fixed_rate_idx", S_IRUGO | S_IWUGO, debugfsdir,
- + &mp->fixed_rate_idx);
- +#endif
- +
- + minstrel_ht_init_cck_rates(mp);
- +
- + return mp;
- }
-
- static void
- minstrel_ht_free(void *priv)
- {
- - mac80211_minstrel.free(priv);
- + kfree(priv);
- }
-
- static u32 minstrel_ht_get_expected_throughput(void *priv_sta)
- @@ -1417,14 +1482,14 @@ static void __init init_sample_table(voi
- }
-
- int __init
- -rc80211_minstrel_ht_init(void)
- +rc80211_minstrel_init(void)
- {
- init_sample_table();
- return ieee80211_rate_control_register(&mac80211_minstrel_ht);
- }
-
- void
- -rc80211_minstrel_ht_exit(void)
- +rc80211_minstrel_exit(void)
- {
- ieee80211_rate_control_unregister(&mac80211_minstrel_ht);
- }
- --- a/net/mac80211/rc80211_minstrel_ht.h
- +++ b/net/mac80211/rc80211_minstrel_ht.h
- @@ -15,11 +15,7 @@
- */
- #define MINSTREL_MAX_STREAMS 3
- #define MINSTREL_HT_STREAM_GROUPS 4 /* BW(=2) * SGI(=2) */
- -#ifdef CPTCFG_MAC80211_RC_MINSTREL_VHT
- #define MINSTREL_VHT_STREAM_GROUPS 6 /* BW(=3) * SGI(=2) */
- -#else
- -#define MINSTREL_VHT_STREAM_GROUPS 0
- -#endif
-
- #define MINSTREL_HT_GROUPS_NB (MINSTREL_MAX_STREAMS * \
- MINSTREL_HT_STREAM_GROUPS)
- @@ -34,11 +30,7 @@
- #define MINSTREL_CCK_GROUP (MINSTREL_HT_GROUP_0 + MINSTREL_HT_GROUPS_NB)
- #define MINSTREL_VHT_GROUP_0 (MINSTREL_CCK_GROUP + 1)
-
- -#ifdef CPTCFG_MAC80211_RC_MINSTREL_VHT
- #define MCS_GROUP_RATES 10
- -#else
- -#define MCS_GROUP_RATES 8
- -#endif
-
- struct mcs_group {
- u32 flags;
- --- a/net/mac80211/rc80211_minstrel_ht_debugfs.c
- +++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c
- @@ -15,6 +15,22 @@
- #include "rc80211_minstrel.h"
- #include "rc80211_minstrel_ht.h"
-
- +static ssize_t
- +minstrel_stats_read(struct file *file, char __user *buf, size_t len, loff_t *ppos)
- +{
- + struct minstrel_debugfs_info *ms;
- +
- + ms = file->private_data;
- + return simple_read_from_buffer(buf, len, ppos, ms->buf, ms->len);
- +}
- +
- +static int
- +minstrel_stats_release(struct inode *inode, struct file *file)
- +{
- + kfree(file->private_data);
- + return 0;
- +}
- +
- static char *
- minstrel_ht_stats_dump(struct minstrel_ht_sta *mi, int i, char *p)
- {
|