EN7581 or AN7583 SoCs support connecting multiple external SerDes (e.g.
Ethernet or USB SerDes) to GDM3 or GDM4 ports via a hw arbiter that
manages the traffic in a TDM manner. As a result multiple net_devices can
connect to the same GDM{3,4} port and there is a theoretical "1:n"
relation between GDM ports and net_devices.
┌─────────────────────────────────┐
│ │ ┌──────┐
│ P1 GDM1 ├────►MT7530│
│ │ └──────┘
│ │ ETH0 (DSA conduit)
│ │
│ PSE/FE │
│ │
│ │
│ │ ┌─────┐
│ P0 CDM1 ├────►QDMA0│
│ P4 P9 GDM4 │ └─────┘
└──┬─────────────────────────┬────┘
│ │
┌──▼──┐ ┌────▼────┐
│ PPE │ │ ARB │
└─────┘ └─┬─────┬─┘
│ │
┌──▼──┐┌─▼───┐
│ ETH ││ USB │
└─────┘└─────┘
ETH1 ETH2
This series introduces support for multiple net_devices connected to the
same Frame Engine (FE) GDM port (GDM3 or GDM4) via an external hw
arbiter. Please note GDM1 or GDM2 does not support the connection with
the external arbiter.
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Link: https://github.com/openwrt/openwrt/pull/23481
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
74 lines
2.9 KiB
Diff
74 lines
2.9 KiB
Diff
From 32bfd008c19f9ad55514181d8cd02e14bf384475 Mon Sep 17 00:00:00 2001
|
|
Message-ID: <32bfd008c19f9ad55514181d8cd02e14bf384475.1779348625.git.lorenzo@kernel.org>
|
|
In-Reply-To: <e15783f7c987e199ecf80b3d858ed5a86d33c508.1779348625.git.lorenzo@kernel.org>
|
|
References: <e15783f7c987e199ecf80b3d858ed5a86d33c508.1779348625.git.lorenzo@kernel.org>
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Sat, 13 Dec 2025 10:06:45 +0100
|
|
Subject: [PATCH 03/13] net: airoha: Rely on airoha_gdm_dev pointer in
|
|
airoha_is_lan_gdm_port()
|
|
|
|
Rename airoha_is_lan_gdm_port in airoha_is_lan_gdm_dev. Moreover, rely
|
|
on airoha_gdm_dev pointer in airoha_is_lan_gdm_dev() instead of
|
|
airoha_gdm_port one.
|
|
This is a preliminary patch to support multiple net_devices connected to
|
|
the same GDM{3,4} port via an external hw arbiter.
|
|
|
|
Tested-by: Xuegang Lu <xuegang.lu@airoha.com>
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
---
|
|
drivers/net/ethernet/airoha/airoha_eth.c | 6 ++----
|
|
drivers/net/ethernet/airoha/airoha_eth.h | 4 +++-
|
|
drivers/net/ethernet/airoha/airoha_ppe.c | 2 +-
|
|
3 files changed, 6 insertions(+), 6 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
|
@@ -82,12 +82,10 @@ static bool airhoa_is_phy_external(struc
|
|
|
|
static void airoha_set_macaddr(struct airoha_gdm_dev *dev, const u8 *addr)
|
|
{
|
|
- struct airoha_gdm_port *port = dev->port;
|
|
struct airoha_eth *eth = dev->eth;
|
|
u32 val, reg;
|
|
|
|
- reg = airoha_is_lan_gdm_port(port) ? REG_FE_LAN_MAC_H
|
|
- : REG_FE_WAN_MAC_H;
|
|
+ reg = airoha_is_lan_gdm_dev(dev) ? REG_FE_LAN_MAC_H : REG_FE_WAN_MAC_H;
|
|
val = (addr[0] << 16) | (addr[1] << 8) | addr[2];
|
|
airoha_fe_wr(eth, reg, val);
|
|
|
|
@@ -2028,7 +2026,7 @@ static int airoha_dev_init(struct net_de
|
|
int i;
|
|
|
|
/* QDMA0 is used for lan ports while QDMA1 is used for WAN ports */
|
|
- dev->qdma = ð->qdma[!airoha_is_lan_gdm_port(port)];
|
|
+ dev->qdma = ð->qdma[!airoha_is_lan_gdm_dev(dev)];
|
|
dev->dev->irq = dev->qdma->irq_banks[0].irq;
|
|
airoha_set_macaddr(dev, netdev->dev_addr);
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
|
@@ -663,8 +663,10 @@ static inline u16 airoha_qdma_get_txq(st
|
|
return qid % ARRAY_SIZE(qdma->q_tx);
|
|
}
|
|
|
|
-static inline bool airoha_is_lan_gdm_port(struct airoha_gdm_port *port)
|
|
+static inline bool airoha_is_lan_gdm_dev(struct airoha_gdm_dev *dev)
|
|
{
|
|
+ struct airoha_gdm_port *port = dev->port;
|
|
+
|
|
/* GDM1 port on EN7581 SoC is connected to the lan dsa switch.
|
|
* GDM{2,3,4} can be used as wan port connected to an external
|
|
* phy module.
|
|
--- a/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
@@ -365,7 +365,7 @@ static int airoha_ppe_foe_entry_prepare(
|
|
/* For downlink traffic consume SRAM memory for hw
|
|
* forwarding descriptors queue.
|
|
*/
|
|
- if (airoha_is_lan_gdm_port(port))
|
|
+ if (airoha_is_lan_gdm_dev(dev))
|
|
val |= AIROHA_FOE_IB2_FAST_PATH;
|
|
if (dsa_port >= 0)
|
|
val |= FIELD_PREP(AIROHA_FOE_IB2_NBQ,
|