| From bb512fd139c26d82a309ce8b6fbf8d361610a325 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 23 Feb 2021 11:42:49 +0100 |
| Subject: mt76: mt7615: fix mib stats counter reporting to mac80211 |
| |
| From: Lorenzo Bianconi <lorenzo@kernel.org> |
| |
| [ Upstream commit 2eb6f6c437745bce46bd7a8f3a22a732d5b9becb ] |
| |
| In order to properly report MIB counters to mac80211, resets stats in |
| mt7615_get_stats routine and hold mt76 mutex accessing MIB counters. |
| Sum up MIB counters in mt7615_mac_update_mib_stats routine. |
| |
| Fixes: c388d8584bc83 ("mt76: mt7615: add a get_stats() callback") |
| Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> |
| Signed-off-by: Felix Fietkau <nbd@nbd.name> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../net/wireless/mediatek/mt76/mt7615/mac.c | 26 ++++++------------- |
| .../net/wireless/mediatek/mt76/mt7615/main.c | 6 +++++ |
| .../wireless/mediatek/mt76/mt7615/mt7615.h | 10 +++---- |
| 3 files changed, 19 insertions(+), 23 deletions(-) |
| |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c |
| index 34a88eab74ab..052d96f6fd66 100644 |
| --- a/drivers/net/wireless/mediatek/mt76/mt7615/mac.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mac.c |
| @@ -1819,10 +1819,8 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy) |
| int i, aggr; |
| u32 val, val2; |
| |
| - memset(mib, 0, sizeof(*mib)); |
| - |
| - mib->fcs_err_cnt = mt76_get_field(dev, MT_MIB_SDR3(ext_phy), |
| - MT_MIB_SDR3_FCS_ERR_MASK); |
| + mib->fcs_err_cnt += mt76_get_field(dev, MT_MIB_SDR3(ext_phy), |
| + MT_MIB_SDR3_FCS_ERR_MASK); |
| |
| val = mt76_get_field(dev, MT_MIB_SDR14(ext_phy), |
| MT_MIB_AMPDU_MPDU_COUNT); |
| @@ -1835,24 +1833,16 @@ mt7615_mac_update_mib_stats(struct mt7615_phy *phy) |
| aggr = ext_phy ? ARRAY_SIZE(dev->mt76.aggr_stats) / 2 : 0; |
| for (i = 0; i < 4; i++) { |
| val = mt76_rr(dev, MT_MIB_MB_SDR1(ext_phy, i)); |
| - |
| - val2 = FIELD_GET(MT_MIB_ACK_FAIL_COUNT_MASK, val); |
| - if (val2 > mib->ack_fail_cnt) |
| - mib->ack_fail_cnt = val2; |
| - |
| - val2 = FIELD_GET(MT_MIB_BA_MISS_COUNT_MASK, val); |
| - if (val2 > mib->ba_miss_cnt) |
| - mib->ba_miss_cnt = val2; |
| + mib->ba_miss_cnt += FIELD_GET(MT_MIB_BA_MISS_COUNT_MASK, val); |
| + mib->ack_fail_cnt += FIELD_GET(MT_MIB_ACK_FAIL_COUNT_MASK, |
| + val); |
| |
| val = mt76_rr(dev, MT_MIB_MB_SDR0(ext_phy, i)); |
| - val2 = FIELD_GET(MT_MIB_RTS_RETRIES_COUNT_MASK, val); |
| - if (val2 > mib->rts_retries_cnt) { |
| - mib->rts_cnt = FIELD_GET(MT_MIB_RTS_COUNT_MASK, val); |
| - mib->rts_retries_cnt = val2; |
| - } |
| + mib->rts_cnt += FIELD_GET(MT_MIB_RTS_COUNT_MASK, val); |
| + mib->rts_retries_cnt += FIELD_GET(MT_MIB_RTS_RETRIES_COUNT_MASK, |
| + val); |
| |
| val = mt76_rr(dev, MT_TX_AGG_CNT(ext_phy, i)); |
| - |
| dev->mt76.aggr_stats[aggr++] += val & 0xffff; |
| dev->mt76.aggr_stats[aggr++] += val >> 16; |
| } |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/main.c b/drivers/net/wireless/mediatek/mt76/mt7615/main.c |
| index 56dd0b4e4460..a42b4d96860d 100644 |
| --- a/drivers/net/wireless/mediatek/mt76/mt7615/main.c |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7615/main.c |
| @@ -827,11 +827,17 @@ mt7615_get_stats(struct ieee80211_hw *hw, |
| struct mt7615_phy *phy = mt7615_hw_phy(hw); |
| struct mib_stats *mib = &phy->mib; |
| |
| + mt7615_mutex_acquire(phy->dev); |
| + |
| stats->dot11RTSSuccessCount = mib->rts_cnt; |
| stats->dot11RTSFailureCount = mib->rts_retries_cnt; |
| stats->dot11FCSErrorCount = mib->fcs_err_cnt; |
| stats->dot11ACKFailureCount = mib->ack_fail_cnt; |
| |
| + memset(mib, 0, sizeof(*mib)); |
| + |
| + mt7615_mutex_release(phy->dev); |
| + |
| return 0; |
| } |
| |
| diff --git a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h |
| index d697ff2ea56e..b56b82279f98 100644 |
| --- a/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h |
| +++ b/drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h |
| @@ -143,11 +143,11 @@ struct mt7615_vif { |
| }; |
| |
| struct mib_stats { |
| - u16 ack_fail_cnt; |
| - u16 fcs_err_cnt; |
| - u16 rts_cnt; |
| - u16 rts_retries_cnt; |
| - u16 ba_miss_cnt; |
| + u32 ack_fail_cnt; |
| + u32 fcs_err_cnt; |
| + u32 rts_cnt; |
| + u32 rts_retries_cnt; |
| + u32 ba_miss_cnt; |
| unsigned long aggr_per; |
| }; |
| |
| -- |
| 2.30.2 |
| |