wifi: mt76: enable page_pool stats
authorLorenzo Bianconi <lorenzo@kernel.org>
Tue, 17 Jan 2023 13:53:17 +0000 (14:53 +0100)
committerFelix Fietkau <nbd@nbd.name>
Fri, 3 Feb 2023 13:47:17 +0000 (14:47 +0100)
Enable page_pool ethtool statistics for mt7915 and mt7921 chipsets.

Tested-by: Felix Fietkau <nbd@nbd.name>
Tested-by: Deren Wu <deren.wu@mediatek.com>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
drivers/net/wireless/mediatek/mt76/mac80211.c
drivers/net/wireless/mediatek/mt76/mt76.h
drivers/net/wireless/mediatek/mt76/mt7915/main.c
drivers/net/wireless/mediatek/mt76/mt7921/main.c

index dc42fff..80c1280 100644 (file)
@@ -1727,6 +1727,21 @@ void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
 }
 EXPORT_SYMBOL_GPL(mt76_ethtool_worker);
 
+void mt76_ethtool_page_pool_stats(struct mt76_dev *dev, u64 *data, int *index)
+{
+#ifdef CONFIG_PAGE_POOL_STATS
+       struct page_pool_stats stats = {};
+       int i;
+
+       mt76_for_each_q_rx(dev, i)
+               page_pool_get_stats(dev->q_rx[i].page_pool, &stats);
+
+       page_pool_ethtool_stats_get(data, &stats);
+       *index += page_pool_ethtool_stats_get_count();
+#endif
+}
+EXPORT_SYMBOL_GPL(mt76_ethtool_page_pool_stats);
+
 enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy)
 {
        struct ieee80211_hw *hw = phy->hw;
index 2ed247e..62ac53e 100644 (file)
@@ -1312,6 +1312,7 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len,
        return usb_bulk_msg(udev, pipe, data, len, actual_len, timeout);
 }
 
+void mt76_ethtool_page_pool_stats(struct mt76_dev *dev, u64 *data, int *index);
 void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
                         struct mt76_sta_stats *stats);
 int mt76_skb_adjust_pad(struct sk_buff *skb, int pad);
index 7589af4..a54921f 100644 (file)
@@ -1291,19 +1291,22 @@ void mt7915_get_et_strings(struct ieee80211_hw *hw,
                           struct ieee80211_vif *vif,
                           u32 sset, u8 *data)
 {
-       if (sset == ETH_SS_STATS)
-               memcpy(data, *mt7915_gstrings_stats,
-                      sizeof(mt7915_gstrings_stats));
+       if (sset != ETH_SS_STATS)
+               return;
+
+       memcpy(data, *mt7915_gstrings_stats, sizeof(mt7915_gstrings_stats));
+       data += sizeof(mt7915_gstrings_stats);
+       page_pool_ethtool_stats_get_strings(data);
 }
 
 static
 int mt7915_get_et_sset_count(struct ieee80211_hw *hw,
                             struct ieee80211_vif *vif, int sset)
 {
-       if (sset == ETH_SS_STATS)
-               return MT7915_SSTATS_LEN;
+       if (sset != ETH_SS_STATS)
+               return 0;
 
-       return 0;
+       return MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
 }
 
 static void mt7915_ethtool_worker(void *wi_data, struct ieee80211_sta *sta)
@@ -1331,7 +1334,7 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
        };
        struct mib_stats *mib = &phy->mib;
        /* See mt7915_ampdu_stat_read_phy, etc */
-       int i, ei = 0;
+       int i, ei = 0, stats_size;
 
        mutex_lock(&dev->mt76.mutex);
 
@@ -1412,9 +1415,12 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
                return;
 
        ei += wi.worker_stat_count;
-       if (ei != MT7915_SSTATS_LEN)
-               dev_err(dev->mt76.dev, "ei: %d  MT7915_SSTATS_LEN: %d",
-                       ei, (int)MT7915_SSTATS_LEN);
+
+       mt76_ethtool_page_pool_stats(&dev->mt76, &data[ei], &ei);
+
+       stats_size = MT7915_SSTATS_LEN + page_pool_ethtool_stats_get_count();
+       if (ei != stats_size)
+               dev_err(dev->mt76.dev, "ei: %d size: %d", ei, stats_size);
 }
 
 static void
index 4d07fe2..1ae90b9 100644 (file)
@@ -1090,17 +1090,34 @@ static void
 mt7921_get_et_strings(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                      u32 sset, u8 *data)
 {
+       struct mt7921_dev *dev = mt7921_hw_dev(hw);
+
        if (sset != ETH_SS_STATS)
                return;
 
        memcpy(data, *mt7921_gstrings_stats, sizeof(mt7921_gstrings_stats));
+
+       if (mt76_is_sdio(&dev->mt76))
+               return;
+
+       data += sizeof(mt7921_gstrings_stats);
+       page_pool_ethtool_stats_get_strings(data);
 }
 
 static int
 mt7921_get_et_sset_count(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                         int sset)
 {
-       return sset == ETH_SS_STATS ? ARRAY_SIZE(mt7921_gstrings_stats) : 0;
+       struct mt7921_dev *dev = mt7921_hw_dev(hw);
+
+       if (sset != ETH_SS_STATS)
+               return 0;
+
+       if (mt76_is_sdio(&dev->mt76))
+               return ARRAY_SIZE(mt7921_gstrings_stats);
+
+       return ARRAY_SIZE(mt7921_gstrings_stats) +
+              page_pool_ethtool_stats_get_count();
 }
 
 static void
@@ -1120,6 +1137,7 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                         struct ethtool_stats *stats, u64 *data)
 {
        struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv;
+       int stats_size = ARRAY_SIZE(mt7921_gstrings_stats);
        struct mt7921_phy *phy = mt7921_hw_phy(hw);
        struct mt7921_dev *dev = phy->dev;
        struct mib_stats *mib = &phy->mib;
@@ -1175,9 +1193,14 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                return;
 
        ei += wi.worker_stat_count;
-       if (ei != ARRAY_SIZE(mt7921_gstrings_stats))
-               dev_err(dev->mt76.dev, "ei: %d  SSTATS_LEN: %zu",
-                       ei, ARRAY_SIZE(mt7921_gstrings_stats));
+
+       if (!mt76_is_sdio(&dev->mt76)) {
+               mt76_ethtool_page_pool_stats(&dev->mt76, &data[ei], &ei);
+               stats_size += page_pool_ethtool_stats_get_count();
+       }
+
+       if (ei != stats_size)
+               dev_err(dev->mt76.dev, "ei: %d  SSTATS_LEN: %d", ei, stats_size);
 }
 
 static u64