Commit 192ad406 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

wifi: mt76: enable page_pool stats

Enable page_pool ethtool statistics for mt7915 and mt7921 chipsets.
Tested-by: default avatarFelix Fietkau <nbd@nbd.name>
Tested-by: default avatarDeren Wu <deren.wu@mediatek.com>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 2f5c3c77
...@@ -1727,6 +1727,21 @@ void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi, ...@@ -1727,6 +1727,21 @@ void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
} }
EXPORT_SYMBOL_GPL(mt76_ethtool_worker); 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) enum mt76_dfs_state mt76_phy_dfs_state(struct mt76_phy *phy)
{ {
struct ieee80211_hw *hw = phy->hw; struct ieee80211_hw *hw = phy->hw;
......
...@@ -1312,6 +1312,7 @@ mt76u_bulk_msg(struct mt76_dev *dev, void *data, int len, int *actual_len, ...@@ -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); 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, void mt76_ethtool_worker(struct mt76_ethtool_worker_info *wi,
struct mt76_sta_stats *stats); struct mt76_sta_stats *stats);
int mt76_skb_adjust_pad(struct sk_buff *skb, int pad); int mt76_skb_adjust_pad(struct sk_buff *skb, int pad);
......
...@@ -1291,19 +1291,22 @@ void mt7915_get_et_strings(struct ieee80211_hw *hw, ...@@ -1291,19 +1291,22 @@ void mt7915_get_et_strings(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
u32 sset, u8 *data) u32 sset, u8 *data)
{ {
if (sset == ETH_SS_STATS) if (sset != ETH_SS_STATS)
memcpy(data, *mt7915_gstrings_stats, return;
sizeof(mt7915_gstrings_stats));
memcpy(data, *mt7915_gstrings_stats, sizeof(mt7915_gstrings_stats));
data += sizeof(mt7915_gstrings_stats);
page_pool_ethtool_stats_get_strings(data);
} }
static static
int mt7915_get_et_sset_count(struct ieee80211_hw *hw, int mt7915_get_et_sset_count(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, int sset) struct ieee80211_vif *vif, int sset)
{ {
if (sset == ETH_SS_STATS) if (sset != ETH_SS_STATS)
return MT7915_SSTATS_LEN; 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) 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, ...@@ -1331,7 +1334,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, ei = 0; int i, ei = 0, stats_size;
mutex_lock(&dev->mt76.mutex); mutex_lock(&dev->mt76.mutex);
...@@ -1412,9 +1415,12 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw, ...@@ -1412,9 +1415,12 @@ void mt7915_get_et_stats(struct ieee80211_hw *hw,
return; return;
ei += wi.worker_stat_count; ei += wi.worker_stat_count;
if (ei != MT7915_SSTATS_LEN)
dev_err(dev->mt76.dev, "ei: %d MT7915_SSTATS_LEN: %d", mt76_ethtool_page_pool_stats(&dev->mt76, &data[ei], &ei);
ei, (int)MT7915_SSTATS_LEN);
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 static void
......
...@@ -1090,17 +1090,34 @@ static void ...@@ -1090,17 +1090,34 @@ static void
mt7921_get_et_strings(struct ieee80211_hw *hw, struct ieee80211_vif *vif, mt7921_get_et_strings(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
u32 sset, u8 *data) u32 sset, u8 *data)
{ {
struct mt7921_dev *dev = mt7921_hw_dev(hw);
if (sset != ETH_SS_STATS) if (sset != ETH_SS_STATS)
return; return;
memcpy(data, *mt7921_gstrings_stats, sizeof(mt7921_gstrings_stats)); 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 static int
mt7921_get_et_sset_count(struct ieee80211_hw *hw, struct ieee80211_vif *vif, mt7921_get_et_sset_count(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
int sset) 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 static void
...@@ -1120,6 +1137,7 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -1120,6 +1137,7 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ethtool_stats *stats, u64 *data) struct ethtool_stats *stats, u64 *data)
{ {
struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; 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_phy *phy = mt7921_hw_phy(hw);
struct mt7921_dev *dev = phy->dev; struct mt7921_dev *dev = phy->dev;
struct mib_stats *mib = &phy->mib; struct mib_stats *mib = &phy->mib;
...@@ -1175,9 +1193,14 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -1175,9 +1193,14 @@ void mt7921_get_et_stats(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
return; return;
ei += wi.worker_stat_count; ei += wi.worker_stat_count;
if (ei != ARRAY_SIZE(mt7921_gstrings_stats))
dev_err(dev->mt76.dev, "ei: %d SSTATS_LEN: %zu", if (!mt76_is_sdio(&dev->mt76)) {
ei, ARRAY_SIZE(mt7921_gstrings_stats)); 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 static u64
......
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