Commit d107501a authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

wifi: mt76: move aggr_stats array in mt76_phy

Move aggregation stats array per-phy instead of share it between multiple
interfaces. This is a preliminary patch to add mt7996 driver support.
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 1b9ba30e
...@@ -693,6 +693,8 @@ struct mt76_phy { ...@@ -693,6 +693,8 @@ struct mt76_phy {
enum mt76_dfs_state dfs_state; enum mt76_dfs_state dfs_state;
ktime_t survey_time; ktime_t survey_time;
u32 aggr_stats[32];
struct mt76_hw_cap cap; struct mt76_hw_cap cap;
struct mt76_sband sband_2g; struct mt76_sband sband_2g;
struct mt76_sband sband_5g; struct mt76_sband sband_5g;
...@@ -781,8 +783,6 @@ struct mt76_dev { ...@@ -781,8 +783,6 @@ struct mt76_dev {
u32 rev; u32 rev;
u32 aggr_stats[32];
struct tasklet_struct pre_tbtt_tasklet; struct tasklet_struct pre_tbtt_tasklet;
int beacon_int; int beacon_int;
u8 beacon_mask; u8 beacon_mask;
......
...@@ -85,7 +85,7 @@ mt7603_ampdu_stat_show(struct seq_file *file, void *data) ...@@ -85,7 +85,7 @@ mt7603_ampdu_stat_show(struct seq_file *file, void *data)
bound[i], bound[i + 1]); bound[i], bound[i + 1]);
seq_puts(file, "\nCount: "); seq_puts(file, "\nCount: ");
for (i = 0; i < ARRAY_SIZE(bound); i++) for (i = 0; i < ARRAY_SIZE(bound); i++)
seq_printf(file, "%8d | ", dev->mt76.aggr_stats[i]); seq_printf(file, "%8d | ", dev->mphy.aggr_stats[i]);
seq_puts(file, "\n"); seq_puts(file, "\n");
return 0; return 0;
......
...@@ -39,7 +39,7 @@ void mt7603_mac_reset_counters(struct mt7603_dev *dev) ...@@ -39,7 +39,7 @@ void mt7603_mac_reset_counters(struct mt7603_dev *dev)
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
mt76_rr(dev, MT_TX_AGG_CNT(i)); mt76_rr(dev, MT_TX_AGG_CNT(i));
memset(dev->mt76.aggr_stats, 0, sizeof(dev->mt76.aggr_stats)); memset(dev->mphy.aggr_stats, 0, sizeof(dev->mphy.aggr_stats));
} }
void mt7603_mac_set_timing(struct mt7603_dev *dev) void mt7603_mac_set_timing(struct mt7603_dev *dev)
...@@ -1827,8 +1827,8 @@ void mt7603_mac_work(struct work_struct *work) ...@@ -1827,8 +1827,8 @@ void mt7603_mac_work(struct work_struct *work)
for (i = 0, idx = 0; i < 2; i++) { for (i = 0, idx = 0; i < 2; i++) {
u32 val = mt76_rr(dev, MT_TX_AGG_CNT(i)); u32 val = mt76_rr(dev, MT_TX_AGG_CNT(i));
dev->mt76.aggr_stats[idx++] += val & 0xffff; dev->mphy.aggr_stats[idx++] += val & 0xffff;
dev->mt76.aggr_stats[idx++] += val >> 16; dev->mphy.aggr_stats[idx++] += val >> 16;
} }
if (dev->mphy.mac_work_count == 10) if (dev->mphy.mac_work_count == 10)
......
...@@ -278,7 +278,6 @@ mt7615_ampdu_stat_read_phy(struct mt7615_phy *phy, ...@@ -278,7 +278,6 @@ mt7615_ampdu_stat_read_phy(struct mt7615_phy *phy,
{ {
struct mt7615_dev *dev = file->private; struct mt7615_dev *dev = file->private;
u32 reg = is_mt7663(&dev->mt76) ? MT_MIB_ARNG(0) : MT_AGG_ASRCR0; u32 reg = is_mt7663(&dev->mt76) ? MT_MIB_ARNG(0) : MT_AGG_ASRCR0;
bool ext_phy = phy != &dev->phy;
int bound[7], i, range; int bound[7], i, range;
if (!phy) if (!phy)
...@@ -292,7 +291,7 @@ mt7615_ampdu_stat_read_phy(struct mt7615_phy *phy, ...@@ -292,7 +291,7 @@ mt7615_ampdu_stat_read_phy(struct mt7615_phy *phy,
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
bound[i + 4] = MT_AGG_ASRCR_RANGE(range, i) + 1; bound[i + 4] = MT_AGG_ASRCR_RANGE(range, i) + 1;
seq_printf(file, "\nPhy %d\n", ext_phy); seq_printf(file, "\nPhy %d\n", phy != &dev->phy);
seq_printf(file, "Length: %8d | ", bound[0]); seq_printf(file, "Length: %8d | ", bound[0]);
for (i = 0; i < ARRAY_SIZE(bound) - 1; i++) for (i = 0; i < ARRAY_SIZE(bound) - 1; i++)
...@@ -300,9 +299,8 @@ mt7615_ampdu_stat_read_phy(struct mt7615_phy *phy, ...@@ -300,9 +299,8 @@ mt7615_ampdu_stat_read_phy(struct mt7615_phy *phy,
bound[i], bound[i + 1]); bound[i], bound[i + 1]);
seq_puts(file, "\nCount: "); seq_puts(file, "\nCount: ");
range = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
for (i = 0; i < ARRAY_SIZE(bound); i++) for (i = 0; i < ARRAY_SIZE(bound); i++)
seq_printf(file, "%8d | ", dev->mt76.aggr_stats[i + range]); seq_printf(file, "%8d | ", phy->mt76->aggr_stats[i]);
seq_puts(file, "\n"); seq_puts(file, "\n");
seq_printf(file, "BA miss count: %d\n", phy->mib.ba_miss_cnt); seq_printf(file, "BA miss count: %d\n", phy->mib.ba_miss_cnt);
......
...@@ -117,7 +117,7 @@ void mt7615_mac_reset_counters(struct mt7615_phy *phy) ...@@ -117,7 +117,7 @@ void mt7615_mac_reset_counters(struct mt7615_phy *phy)
mt76_rr(dev, MT_TX_AGG_CNT(1, i)); mt76_rr(dev, MT_TX_AGG_CNT(1, i));
} }
memset(dev->mt76.aggr_stats, 0, sizeof(dev->mt76.aggr_stats)); memset(phy->mt76->aggr_stats, 0, sizeof(phy->mt76->aggr_stats));
phy->mt76->survey_time = ktime_get_boottime(); phy->mt76->survey_time = ktime_get_boottime();
/* reset airtime counters */ /* reset airtime counters */
...@@ -2012,7 +2012,7 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy) ...@@ -2012,7 +2012,7 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy)
struct mt7615_dev *dev = phy->dev; struct mt7615_dev *dev = phy->dev;
struct mib_stats *mib = &phy->mib; struct mib_stats *mib = &phy->mib;
bool ext_phy = phy != &dev->phy; bool ext_phy = phy != &dev->phy;
int i, aggr; int i, aggr = 0;
u32 val, val2; u32 val, val2;
mib->fcs_err_cnt += mt76_get_field(dev, MT_MIB_SDR3(ext_phy), mib->fcs_err_cnt += mt76_get_field(dev, MT_MIB_SDR3(ext_phy),
...@@ -2026,7 +2026,6 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy) ...@@ -2026,7 +2026,6 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy)
mib->aggr_per = 1000 * (val - val2) / val; mib->aggr_per = 1000 * (val - val2) / val;
} }
aggr = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
val = mt76_rr(dev, MT_MIB_MB_SDR1(ext_phy, i)); val = mt76_rr(dev, MT_MIB_MB_SDR1(ext_phy, i));
mib->ba_miss_cnt += FIELD_GET(MT_MIB_BA_MISS_COUNT_MASK, val); mib->ba_miss_cnt += FIELD_GET(MT_MIB_BA_MISS_COUNT_MASK, val);
...@@ -2039,8 +2038,8 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy) ...@@ -2039,8 +2038,8 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy)
val); val);
val = mt76_rr(dev, MT_TX_AGG_CNT(ext_phy, i)); val = mt76_rr(dev, MT_TX_AGG_CNT(ext_phy, i));
dev->mt76.aggr_stats[aggr++] += val & 0xffff; phy->mt76->aggr_stats[aggr++] += val & 0xffff;
dev->mt76.aggr_stats[aggr++] += val >> 16; phy->mt76->aggr_stats[aggr++] += val >> 16;
} }
} }
......
...@@ -20,7 +20,7 @@ mt76x02_ampdu_stat_show(struct seq_file *file, void *data) ...@@ -20,7 +20,7 @@ mt76x02_ampdu_stat_show(struct seq_file *file, void *data)
seq_puts(file, "Count: "); seq_puts(file, "Count: ");
for (j = 0; j < 8; j++) for (j = 0; j < 8; j++)
seq_printf(file, "%8d | ", seq_printf(file, "%8d | ",
dev->mt76.aggr_stats[i * 8 + j]); dev->mphy.aggr_stats[i * 8 + j]);
seq_puts(file, "\n"); seq_puts(file, "\n");
seq_puts(file, "--------"); seq_puts(file, "--------");
for (j = 0; j < 8; j++) for (j = 0; j < 8; j++)
......
...@@ -25,7 +25,7 @@ void mt76x02_mac_reset_counters(struct mt76x02_dev *dev) ...@@ -25,7 +25,7 @@ void mt76x02_mac_reset_counters(struct mt76x02_dev *dev)
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
mt76_rr(dev, MT_TX_STAT_FIFO); mt76_rr(dev, MT_TX_STAT_FIFO);
memset(dev->mt76.aggr_stats, 0, sizeof(dev->mt76.aggr_stats)); memset(dev->mphy.aggr_stats, 0, sizeof(dev->mphy.aggr_stats));
} }
EXPORT_SYMBOL_GPL(mt76x02_mac_reset_counters); EXPORT_SYMBOL_GPL(mt76x02_mac_reset_counters);
...@@ -1191,8 +1191,8 @@ void mt76x02_mac_work(struct work_struct *work) ...@@ -1191,8 +1191,8 @@ void mt76x02_mac_work(struct work_struct *work)
for (i = 0, idx = 0; i < 16; i++) { for (i = 0, idx = 0; i < 16; i++) {
u32 val = mt76_rr(dev, MT_TX_AGG_CNT(i)); u32 val = mt76_rr(dev, MT_TX_AGG_CNT(i));
dev->mt76.aggr_stats[idx++] += val & 0xffff; dev->mphy.aggr_stats[idx++] += val & 0xffff;
dev->mt76.aggr_stats[idx++] += val >> 16; dev->mphy.aggr_stats[idx++] += val >> 16;
} }
mt76x02_check_mac_err(dev); mt76x02_check_mac_err(dev);
......
...@@ -639,7 +639,7 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy, ...@@ -639,7 +639,7 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
{ {
struct mt7915_dev *dev = phy->dev; struct mt7915_dev *dev = phy->dev;
bool ext_phy = phy != &dev->phy; bool ext_phy = phy != &dev->phy;
int bound[15], range[4], i, n; int bound[15], range[4], i;
/* Tx ampdu stat */ /* Tx ampdu stat */
for (i = 0; i < ARRAY_SIZE(range); i++) for (i = 0; i < ARRAY_SIZE(range); i++)
...@@ -656,9 +656,8 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy, ...@@ -656,9 +656,8 @@ mt7915_ampdu_stat_read_phy(struct mt7915_phy *phy,
bound[i] + 1, bound[i + 1]); bound[i] + 1, bound[i + 1]);
seq_puts(file, "\nCount: "); seq_puts(file, "\nCount: ");
n = phy->band_idx ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
for (i = 0; i < ARRAY_SIZE(bound); i++) for (i = 0; i < ARRAY_SIZE(bound); i++)
seq_printf(file, "%8d | ", dev->mt76.aggr_stats[i + n]); seq_printf(file, "%8d | ", phy->mt76->aggr_stats[i]);
seq_puts(file, "\n"); seq_puts(file, "\n");
seq_printf(file, "BA miss count: %d\n", phy->mib.ba_miss_cnt); seq_printf(file, "BA miss count: %d\n", phy->mib.ba_miss_cnt);
......
...@@ -1159,12 +1159,8 @@ void mt7915_mac_reset_counters(struct mt7915_phy *phy) ...@@ -1159,12 +1159,8 @@ void mt7915_mac_reset_counters(struct mt7915_phy *phy)
mt76_rr(dev, MT_TX_AGG_CNT2(phy->band_idx, i)); mt76_rr(dev, MT_TX_AGG_CNT2(phy->band_idx, i));
} }
i = 0;
phy->mt76->survey_time = ktime_get_boottime(); phy->mt76->survey_time = ktime_get_boottime();
if (phy->band_idx) memset(phy->mt76->aggr_stats, 0, sizeof(phy->mt76->aggr_stats));
i = ARRAY_SIZE(dev->mt76.aggr_stats) / 2;
memset(&dev->mt76.aggr_stats[i], 0, sizeof(dev->mt76.aggr_stats) / 2);
/* reset airtime counters */ /* reset airtime counters */
mt76_set(dev, MT_WF_RMAC_MIB_AIRTIME0(phy->band_idx), mt76_set(dev, MT_WF_RMAC_MIB_AIRTIME0(phy->band_idx),
...@@ -1507,7 +1503,7 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) ...@@ -1507,7 +1503,7 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
{ {
struct mt7915_dev *dev = phy->dev; struct mt7915_dev *dev = phy->dev;
struct mib_stats *mib = &phy->mib; struct mib_stats *mib = &phy->mib;
int i, aggr0, aggr1, cnt; int i, aggr0 = 0, aggr1, cnt;
u32 val; u32 val;
cnt = mt76_rr(dev, MT_MIB_SDR3(phy->band_idx)); cnt = mt76_rr(dev, MT_MIB_SDR3(phy->band_idx));
...@@ -1639,7 +1635,6 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) ...@@ -1639,7 +1635,6 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
mib->tx_amsdu_cnt += cnt; mib->tx_amsdu_cnt += cnt;
} }
aggr0 = phy->band_idx ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
if (is_mt7915(&dev->mt76)) { if (is_mt7915(&dev->mt76)) {
for (i = 0, aggr1 = aggr0 + 8; i < 4; i++) { for (i = 0, aggr1 = aggr0 + 8; i < 4; i++) {
val = mt76_rr(dev, MT_MIB_MB_SDR1(phy->band_idx, (i << 4))); val = mt76_rr(dev, MT_MIB_MB_SDR1(phy->band_idx, (i << 4)));
...@@ -1654,12 +1649,12 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) ...@@ -1654,12 +1649,12 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
FIELD_GET(MT_MIB_RTS_RETRIES_COUNT_MASK, val); FIELD_GET(MT_MIB_RTS_RETRIES_COUNT_MASK, val);
val = mt76_rr(dev, MT_TX_AGG_CNT(phy->band_idx, i)); val = mt76_rr(dev, MT_TX_AGG_CNT(phy->band_idx, i));
dev->mt76.aggr_stats[aggr0++] += val & 0xffff; phy->mt76->aggr_stats[aggr0++] += val & 0xffff;
dev->mt76.aggr_stats[aggr0++] += val >> 16; phy->mt76->aggr_stats[aggr0++] += val >> 16;
val = mt76_rr(dev, MT_TX_AGG_CNT2(phy->band_idx, i)); val = mt76_rr(dev, MT_TX_AGG_CNT2(phy->band_idx, i));
dev->mt76.aggr_stats[aggr1++] += val & 0xffff; phy->mt76->aggr_stats[aggr1++] += val & 0xffff;
dev->mt76.aggr_stats[aggr1++] += val >> 16; phy->mt76->aggr_stats[aggr1++] += val >> 16;
} }
cnt = mt76_rr(dev, MT_MIB_SDR32(phy->band_idx)); cnt = mt76_rr(dev, MT_MIB_SDR32(phy->band_idx));
...@@ -1706,8 +1701,8 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy) ...@@ -1706,8 +1701,8 @@ void mt7915_mac_update_stats(struct mt7915_phy *phy)
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
val = mt76_rr(dev, MT_TX_AGG_CNT(phy->band_idx, i)); val = mt76_rr(dev, MT_TX_AGG_CNT(phy->band_idx, i));
dev->mt76.aggr_stats[aggr0++] += FIELD_GET(GENMASK(15, 0), val); phy->mt76->aggr_stats[aggr0++] += FIELD_GET(GENMASK(15, 0), val);
dev->mt76.aggr_stats[aggr0++] += FIELD_GET(GENMASK(31, 16), val); phy->mt76->aggr_stats[aggr0++] += FIELD_GET(GENMASK(31, 16), val);
} }
cnt = mt76_rr(dev, MT_MIB_SDR32(phy->band_idx)); cnt = mt76_rr(dev, MT_MIB_SDR32(phy->band_idx));
......
...@@ -1267,7 +1267,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, ...@@ -1267,7 +1267,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
}; };
struct mib_stats *mib = &phy->mib; struct mib_stats *mib = &phy->mib;
/* See mt7915_ampdu_stat_read_phy, etc */ /* See mt7915_ampdu_stat_read_phy, etc */
int i, n, ei = 0; int i, ei = 0;
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
...@@ -1283,9 +1283,8 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, ...@@ -1283,9 +1283,8 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
data[ei++] = mib->tx_pkt_ibf_cnt; data[ei++] = mib->tx_pkt_ibf_cnt;
/* Tx ampdu stat */ /* Tx ampdu stat */
n = phy->band_idx ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0;
for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++) for (i = 0; i < 15 /*ARRAY_SIZE(bound)*/; i++)
data[ei++] = dev->mt76.aggr_stats[i + n]; data[ei++] = phy->mt76->aggr_stats[i];
data[ei++] = phy->mib.ba_miss_cnt; data[ei++] = phy->mib.ba_miss_cnt;
......
...@@ -85,7 +85,7 @@ mt7921_ampdu_stat_read_phy(struct mt7921_phy *phy, ...@@ -85,7 +85,7 @@ mt7921_ampdu_stat_read_phy(struct mt7921_phy *phy,
seq_puts(file, "\nCount: "); seq_puts(file, "\nCount: ");
for (i = 0; i < ARRAY_SIZE(bound); i++) for (i = 0; i < ARRAY_SIZE(bound); i++)
seq_printf(file, "%8d | ", dev->mt76.aggr_stats[i]); seq_printf(file, "%8d | ", phy->mt76->aggr_stats[i]);
seq_puts(file, "\n"); seq_puts(file, "\n");
seq_printf(file, "BA miss count: %d\n", phy->mib.ba_miss_cnt); seq_printf(file, "BA miss count: %d\n", phy->mib.ba_miss_cnt);
......
...@@ -745,7 +745,7 @@ void mt7921_mac_reset_counters(struct mt7921_phy *phy) ...@@ -745,7 +745,7 @@ void mt7921_mac_reset_counters(struct mt7921_phy *phy)
} }
dev->mt76.phy.survey_time = ktime_get_boottime(); dev->mt76.phy.survey_time = ktime_get_boottime();
memset(&dev->mt76.aggr_stats[0], 0, sizeof(dev->mt76.aggr_stats) / 2); memset(phy->mt76->aggr_stats, 0, sizeof(phy->mt76->aggr_stats));
/* reset airtime counters */ /* reset airtime counters */
mt76_rr(dev, MT_MIB_SDR9(0)); mt76_rr(dev, MT_MIB_SDR9(0));
...@@ -990,10 +990,10 @@ void mt7921_mac_update_mib_stats(struct mt7921_phy *phy) ...@@ -990,10 +990,10 @@ void mt7921_mac_update_mib_stats(struct mt7921_phy *phy)
val = mt76_rr(dev, MT_TX_AGG_CNT(0, i)); val = mt76_rr(dev, MT_TX_AGG_CNT(0, i));
val2 = mt76_rr(dev, MT_TX_AGG_CNT2(0, i)); val2 = mt76_rr(dev, MT_TX_AGG_CNT2(0, i));
dev->mt76.aggr_stats[aggr0++] += val & 0xffff; phy->mt76->aggr_stats[aggr0++] += val & 0xffff;
dev->mt76.aggr_stats[aggr0++] += val >> 16; phy->mt76->aggr_stats[aggr0++] += val >> 16;
dev->mt76.aggr_stats[aggr1++] += val2 & 0xffff; phy->mt76->aggr_stats[aggr1++] += val2 & 0xffff;
dev->mt76.aggr_stats[aggr1++] += val2 >> 16; phy->mt76->aggr_stats[aggr1++] += val2 >> 16;
} }
} }
......
...@@ -1075,7 +1075,7 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -1075,7 +1075,7 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
/* Tx ampdu stat */ /* Tx ampdu stat */
for (i = 0; i < 15; i++) for (i = 0; i < 15; i++)
data[ei++] = dev->mt76.aggr_stats[i]; data[ei++] = phy->mt76->aggr_stats[i];
data[ei++] = phy->mib.ba_miss_cnt; data[ei++] = phy->mib.ba_miss_cnt;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment