Commit c6cde7b7 authored by Sujuan Chen's avatar Sujuan Chen Committed by Felix Fietkau
Browse files

wifi: mt76: mt7915: enable WED RX stats



Introduce the capability to report WED RX stats to mac80211.

Tested-by: default avatarDaniel Golle <daniel@makrotopia.org>
Co-developed-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarSujuan Chen <sujuan.chen@mediatek.com>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent 4f831d18
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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 {
+6 −0
Original line number Diff line number Diff line
@@ -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);
	}

+8 −0
Original line number Diff line number Diff line
@@ -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;
+18 −0
Original line number Diff line number Diff line
@@ -1685,6 +1685,24 @@ int mt7915_mcu_add_sta(struct mt7915_dev *dev, struct ieee80211_vif *vif,
				     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)
{
+26 −0
Original line number Diff line number Diff line
@@ -663,6 +663,31 @@ static u32 mt7915_wed_init_rx_buf(struct mtk_wed_device *wed, int size)
	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;

Loading