Create a new debugfs entry called 'rc_fixed_txpower_idx' in debugfs dir for each station. By writing a positive static tx-power idx into this file, minstrel_ht applies this tx-power idx to each packet or each mrr stage, depending on what the hardware supports. By writing (u32)-1 to the file, minstrel will return to automatic mode which currently just passes -1 as tx-power idx, indicating that the driver should use a default. The debugfs entry will only be created if either tpc per packet or per mrr is supported. Signed-off-by: Jonas Jelonek <jelonek.jonas@xxxxxxxxx> --- net/mac80211/rc80211_minstrel_ht.c | 14 ++++++++++++++ net/mac80211/rc80211_minstrel_ht.h | 11 +++++++++++ net/mac80211/rc80211_minstrel_ht_debugfs.c | 11 +++++++++++ 3 files changed, 36 insertions(+) diff --git a/net/mac80211/rc80211_minstrel_ht.c b/net/mac80211/rc80211_minstrel_ht.c index 24c3c055db6d..222b51e7d9ee 100644 --- a/net/mac80211/rc80211_minstrel_ht.c +++ b/net/mac80211/rc80211_minstrel_ht.c @@ -1486,6 +1486,14 @@ minstrel_ht_set_rate(struct minstrel_priv *mp, struct minstrel_ht_sta *mi, ratetbl->rate[offset].idx = idx; ratetbl->rate[offset].flags = flags; + +#ifdef CONFIG_MAC80211_DEBUGFS + if (mi->fixed_txpower_idx != -1) { + ratetbl->rate[offset].txpower_idx = mi->fixed_txpower_idx; + return; + } +#endif + ratetbl->rate[offset].txpower_idx = -1; } static inline int @@ -1603,8 +1611,14 @@ minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, info->flags |= mi->tx_flags; #ifdef CONFIG_MAC80211_DEBUGFS + if (mi->fixed_txpower_idx != -1) + info->control.txpower_idx = mi->fixed_txpower_idx; + if (mp->fixed_rate_idx != -1) return; +#else + /* Pass -1 to indicate 'ignore txpower' or 'use default' */ + info->control.txpower_idx = -1; #endif /* Don't use EAPOL frames for sampling on non-mrr hw */ diff --git a/net/mac80211/rc80211_minstrel_ht.h b/net/mac80211/rc80211_minstrel_ht.h index 1766ff0c78d3..15222d66c4b8 100644 --- a/net/mac80211/rc80211_minstrel_ht.h +++ b/net/mac80211/rc80211_minstrel_ht.h @@ -194,6 +194,17 @@ struct minstrel_ht_sta { /* MCS rate group info and statistics */ struct minstrel_mcs_group_data groups[MINSTREL_GROUPS_NB]; + +#ifdef CONFIG_MAC80211_DEBUGFS + /* + * enable fixed tx-power processing per STA + * - write static index to debugfs:ieee80211/phyX/netdev:wlanY + * /stations/<MAC>/rc_fixed_txpower_idx + * - write -1 to enable automatic processing again + * - setting will be applied on next update + */ + u32 fixed_txpower_idx; +#endif }; void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir); diff --git a/net/mac80211/rc80211_minstrel_ht_debugfs.c b/net/mac80211/rc80211_minstrel_ht_debugfs.c index 25b8a67a63a4..d625d860d01a 100644 --- a/net/mac80211/rc80211_minstrel_ht_debugfs.c +++ b/net/mac80211/rc80211_minstrel_ht_debugfs.c @@ -329,8 +329,19 @@ static const struct file_operations minstrel_ht_stat_csv_fops = { void minstrel_ht_add_sta_debugfs(void *priv, void *priv_sta, struct dentry *dir) { + struct minstrel_priv *mp = priv; + struct minstrel_ht_sta *mi = priv_sta; + debugfs_create_file("rc_stats", 0444, dir, priv_sta, &minstrel_ht_stat_fops); debugfs_create_file("rc_stats_csv", 0444, dir, priv_sta, &minstrel_ht_stat_csv_fops); + + if (ieee80211_hw_check(mp->hw, SUPPORTS_TPC_PER_PACKET) || + ieee80211_hw_check(mp->hw, SUPPORTS_TPC_PER_MRR)) + { + mi->fixed_txpower_idx = (u32)-1; + debugfs_create_u32("rc_fixed_txpower_idx", S_IRUGO | S_IWUGO, + dir, &mi->fixed_txpower_idx); + } } -- 2.30.2