mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
wifi: mt76: mt7915: enable WED RX stats
Introduce the capability to report WED RX stats to mac80211. Tested-by: Daniel Golle <daniel@makrotopia.org> Co-developed-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org> Signed-off-by: Sujuan Chen <sujuan.chen@mediatek.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
committed by
Felix Fietkau
parent
4f831d18d1
commit
c6cde7b751
@@ -273,9 +273,15 @@ struct mt76_sta_stats {
|
||||
u64 tx_nss[4]; /* 1, 2, 3, 4 */
|
||||
u64 tx_mcs[16]; /* mcs idx */
|
||||
u64 tx_bytes;
|
||||
/* WED TX */
|
||||
u32 tx_packets;
|
||||
u32 tx_retries;
|
||||
u32 tx_failed;
|
||||
/* WED RX */
|
||||
u64 rx_bytes;
|
||||
u32 rx_packets;
|
||||
u32 rx_errors;
|
||||
u32 rx_drops;
|
||||
};
|
||||
|
||||
enum mt76_wcid_flags {
|
||||
|
||||
@@ -361,12 +361,18 @@ static int mt7915_dma_enable(struct mt7915_dev *dev)
|
||||
|
||||
if (mtk_wed_device_active(&dev->mt76.mmio.wed)) {
|
||||
u32 wed_irq_mask = irq_mask;
|
||||
int ret;
|
||||
|
||||
wed_irq_mask |= MT_INT_TX_DONE_BAND0 | MT_INT_TX_DONE_BAND1;
|
||||
if (!is_mt7986(&dev->mt76))
|
||||
mt76_wr(dev, MT_INT_WED_MASK_CSR, wed_irq_mask);
|
||||
else
|
||||
mt76_wr(dev, MT_INT_MASK_CSR, wed_irq_mask);
|
||||
|
||||
ret = mt7915_mcu_wed_enable_rx_stats(dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
mtk_wed_device_start(&dev->mt76.mmio.wed, wed_irq_mask);
|
||||
}
|
||||
|
||||
|
||||
@@ -1037,6 +1037,14 @@ static void mt7915_sta_statistics(struct ieee80211_hw *hw,
|
||||
|
||||
sinfo->tx_retries = msta->wcid.stats.tx_retries;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_RETRIES);
|
||||
|
||||
if (mtk_wed_get_rx_capa(&phy->dev->mt76.mmio.wed)) {
|
||||
sinfo->rx_bytes = msta->wcid.stats.rx_bytes;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_BYTES64);
|
||||
|
||||
sinfo->rx_packets = msta->wcid.stats.rx_packets;
|
||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_RX_PACKETS);
|
||||
}
|
||||
}
|
||||
|
||||
sinfo->ack_signal = (s8)msta->ack_signal;
|
||||
|
||||
@@ -1685,6 +1685,24 @@ out:
|
||||
MCU_EXT_CMD(STA_REC_UPDATE), true);
|
||||
}
|
||||
|
||||
int mt7915_mcu_wed_enable_rx_stats(struct mt7915_dev *dev)
|
||||
{
|
||||
#ifdef CONFIG_NET_MEDIATEK_SOC_WED
|
||||
struct mtk_wed_device *wed = &dev->mt76.mmio.wed;
|
||||
struct {
|
||||
__le32 args[2];
|
||||
} req = {
|
||||
.args[0] = cpu_to_le32(1),
|
||||
.args[1] = cpu_to_le32(6),
|
||||
};
|
||||
|
||||
return mtk_wed_device_update_msg(wed, MTK_WED_WO_CMD_RXCNT_CTRL,
|
||||
&req, sizeof(req));
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
int mt7915_mcu_add_dev_info(struct mt7915_phy *phy,
|
||||
struct ieee80211_vif *vif, bool enable)
|
||||
{
|
||||
|
||||
@@ -663,6 +663,31 @@ unmap:
|
||||
mt7915_wed_release_rx_buf(wed);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void mt7915_mmio_wed_update_rx_stats(struct mtk_wed_device *wed,
|
||||
struct mtk_wed_wo_rx_stats *stats)
|
||||
{
|
||||
int idx = le16_to_cpu(stats->wlan_idx);
|
||||
struct mt7915_dev *dev;
|
||||
struct mt76_wcid *wcid;
|
||||
|
||||
dev = container_of(wed, struct mt7915_dev, mt76.mmio.wed);
|
||||
|
||||
if (idx >= mt7915_wtbl_size(dev))
|
||||
return;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
wcid = rcu_dereference(dev->mt76.wcid[idx]);
|
||||
if (wcid) {
|
||||
wcid->stats.rx_bytes += le32_to_cpu(stats->rx_byte_cnt);
|
||||
wcid->stats.rx_packets += le32_to_cpu(stats->rx_pkt_cnt);
|
||||
wcid->stats.rx_errors += le32_to_cpu(stats->rx_err_cnt);
|
||||
wcid->stats.rx_drops += le32_to_cpu(stats->rx_drop_cnt);
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
}
|
||||
#endif
|
||||
|
||||
int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
|
||||
@@ -744,6 +769,7 @@ int mt7915_mmio_wed_init(struct mt7915_dev *dev, void *pdev_ptr,
|
||||
wed->wlan.offload_disable = mt7915_mmio_wed_offload_disable;
|
||||
wed->wlan.init_rx_buf = mt7915_wed_init_rx_buf;
|
||||
wed->wlan.release_rx_buf = mt7915_wed_release_rx_buf;
|
||||
wed->wlan.update_wo_rx_stats = mt7915_mmio_wed_update_rx_stats;
|
||||
|
||||
dev->mt76.rx_token_size = wed->wlan.rx_npkt;
|
||||
|
||||
|
||||
@@ -630,6 +630,7 @@ void mt7915_set_stream_vht_txbf_caps(struct mt7915_phy *phy);
|
||||
void mt7915_update_channel(struct mt76_phy *mphy);
|
||||
int mt7915_mcu_muru_debug_set(struct mt7915_dev *dev, bool enable);
|
||||
int mt7915_mcu_muru_debug_get(struct mt7915_phy *phy, void *ms);
|
||||
int mt7915_mcu_wed_enable_rx_stats(struct mt7915_dev *dev);
|
||||
int mt7915_init_debugfs(struct mt7915_phy *phy);
|
||||
void mt7915_debugfs_rx_fw_monitor(struct mt7915_dev *dev, const void *data, int len);
|
||||
bool mt7915_debugfs_rx_log(struct mt7915_dev *dev, const void *data, int len);
|
||||
|
||||
Reference in New Issue
Block a user