Commit e2f64db1 authored by Sujuan Chen's avatar Sujuan Chen Committed by Paolo Abeni
Browse files

net: ethernet: mtk_wed: introduce WED support for MT7988



Similar to MT7986 and MT7622, enable Wireless Ethernet Ditpatcher for
MT7988 in order to offload traffic forwarded from LAN/WLAN to WLAN/LAN

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 avatarPaolo Abeni <pabeni@redhat.com>
parent 9ae7eca9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -197,6 +197,7 @@ static const struct mtk_reg_map mt7988_reg_map = {
	.wdma_base = {
		[0]		= 0x4800,
		[1]		= 0x4c00,
		[2]		= 0x5000,
	},
	.pse_iq_sta		= 0x0180,
	.pse_oq_sta		= 0x01a0,
+1 −1
Original line number Diff line number Diff line
@@ -1132,7 +1132,7 @@ struct mtk_reg_map {
	u32	gdm1_cnt;
	u32	gdma_to_ppe;
	u32	ppe_base;
	u32	wdma_base[2];
	u32	wdma_base[3];
	u32	pse_iq_sta;
	u32	pse_oq_sta;
};
+3 −0
Original line number Diff line number Diff line
@@ -201,6 +201,9 @@ mtk_flow_set_output_device(struct mtk_eth *eth, struct mtk_foe_entry *foe,
			case 1:
				pse_port = PSE_WDMA1_PORT;
				break;
			case 2:
				pse_port = PSE_WDMA2_PORT;
				break;
			default:
				return -EINVAL;
			}
+318 −124

File changed.

Preview size limit exceeded, changes collapsed.

+29 −0
Original line number Diff line number Diff line
@@ -9,6 +9,8 @@
#include <linux/regmap.h>
#include <linux/netdevice.h>

#include "mtk_wed_regs.h"

struct mtk_eth;
struct mtk_wed_wo;

@@ -19,6 +21,7 @@ struct mtk_wed_soc_data {
		u32 reset_idx_tx_mask;
		u32 reset_idx_rx_mask;
	} regmap;
	u32 tx_ring_desc_size;
	u32 wdma_desc_size;
};

@@ -35,6 +38,7 @@ struct mtk_wed_hw {
	struct dentry *debugfs_dir;
	struct mtk_wed_device *wed_dev;
	struct mtk_wed_wo *wed_wo;
	u32 pcie_base;
	u32 debugfs_reg;
	u32 num_flows;
	u8 version;
@@ -61,6 +65,16 @@ static inline bool mtk_wed_is_v2(struct mtk_wed_hw *hw)
	return hw->version == 2;
}

static inline bool mtk_wed_is_v3(struct mtk_wed_hw *hw)
{
	return hw->version == 3;
}

static inline bool mtk_wed_is_v3_or_greater(struct mtk_wed_hw *hw)
{
	return hw->version > 2;
}

static inline void
wed_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
{
@@ -143,6 +157,21 @@ wpdma_txfree_w32(struct mtk_wed_device *dev, u32 reg, u32 val)
	writel(val, dev->txfree_ring.wpdma + reg);
}

static inline u32 mtk_wed_get_pcie_base(struct mtk_wed_device *dev)
{
	if (!mtk_wed_is_v3_or_greater(dev->hw))
		return MTK_WED_PCIE_BASE;

	switch (dev->hw->index) {
	case 1:
		return MTK_WED_PCIE_BASE1;
	case 2:
		return MTK_WED_PCIE_BASE2;
	default:
		return MTK_WED_PCIE_BASE0;
	}
}

void mtk_wed_add_hw(struct device_node *np, struct mtk_eth *eth,
		    void __iomem *wdma, phys_addr_t wdma_phy,
		    int index);
Loading