mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2025-11-01 12:48:52 +00:00
Backport upstream patch for AN7583 Ethernet support. While at it also backport some additional fixes required to apply the AN7583 patches cleanly. Refresh all affected patch automatically (aside from the XSI patch that changed the implementation) Link: https://github.com/openwrt/openwrt/pull/20489 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
186 lines
5.6 KiB
Diff
186 lines
5.6 KiB
Diff
From e4e5ce823bdd4601bd75ae7c206ae35e7c2fa60b Mon Sep 17 00:00:00 2001
|
|
From: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Date: Fri, 17 Oct 2025 11:06:22 +0200
|
|
Subject: [PATCH 12/12] net: airoha: Add AN7583 SoC support
|
|
|
|
Introduce support for AN7583 ethernet controller to airoha-eth dirver.
|
|
|
|
Reviewed-by: Simon Horman <horms@kernel.org>
|
|
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
|
|
Link: https://patch.msgid.link/20251017-an7583-eth-support-v3-13-f28319666667@kernel.org
|
|
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
|
|
---
|
|
drivers/net/ethernet/airoha/airoha_eth.c | 68 ++++++++++++++++++++++--
|
|
drivers/net/ethernet/airoha/airoha_eth.h | 11 ++++
|
|
drivers/net/ethernet/airoha/airoha_ppe.c | 3 ++
|
|
3 files changed, 77 insertions(+), 5 deletions(-)
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
|
@@ -1689,10 +1689,8 @@ static int airoha_dev_set_macaddr(struct
|
|
|
|
static int airhoha_set_gdm2_loopback(struct airoha_gdm_port *port)
|
|
{
|
|
- u32 val, pse_port, chan = port->id == AIROHA_GDM3_IDX ? 4 : 0;
|
|
struct airoha_eth *eth = port->qdma->eth;
|
|
- /* XXX: handle XSI_USB_PORT and XSI_PCE1_PORT */
|
|
- u32 nbq = port->id == AIROHA_GDM3_IDX ? 4 : 0;
|
|
+ u32 val, pse_port, chan, nbq;
|
|
int src_port;
|
|
|
|
/* Forward the traffic to the proper GDM port */
|
|
@@ -1704,6 +1702,8 @@ static int airhoha_set_gdm2_loopback(str
|
|
/* Enable GDM2 loopback */
|
|
airoha_fe_wr(eth, REG_GDM_TXCHN_EN(2), 0xffffffff);
|
|
airoha_fe_wr(eth, REG_GDM_RXCHN_EN(2), 0xffff);
|
|
+
|
|
+ chan = port->id == AIROHA_GDM3_IDX ? airoha_is_7581(eth) ? 4 : 3 : 0;
|
|
airoha_fe_rmw(eth, REG_GDM_LPBK_CFG(2),
|
|
LPBK_CHAN_MASK | LPBK_MODE_MASK | LPBK_EN_MASK,
|
|
FIELD_PREP(LPBK_CHAN_MASK, chan) |
|
|
@@ -1718,6 +1718,8 @@ static int airhoha_set_gdm2_loopback(str
|
|
airoha_fe_clear(eth, REG_FE_VIP_PORT_EN, BIT(2));
|
|
airoha_fe_clear(eth, REG_FE_IFC_PORT_EN, BIT(2));
|
|
|
|
+ /* XXX: handle XSI_USB_PORT and XSI_PCE1_PORT */
|
|
+ nbq = port->id == AIROHA_GDM3_IDX && airoha_is_7581(eth) ? 4 : 0;
|
|
src_port = eth->soc->ops.get_src_port_id(port, nbq);
|
|
if (src_port < 0)
|
|
return src_port;
|
|
@@ -1731,7 +1733,7 @@ static int airhoha_set_gdm2_loopback(str
|
|
SP_CPORT_MASK(val),
|
|
FE_PSE_PORT_CDM2 << __ffs(SP_CPORT_MASK(val)));
|
|
|
|
- if (port->id != AIROHA_GDM3_IDX)
|
|
+ if (port->id != AIROHA_GDM3_IDX && airoha_is_7581(eth))
|
|
airoha_fe_rmw(eth, REG_SRC_PORT_FC_MAP6,
|
|
FC_ID_OF_SRC_PORT24_MASK,
|
|
FIELD_PREP(FC_ID_OF_SRC_PORT24_MASK, 2));
|
|
@@ -1900,6 +1902,22 @@ static bool airoha_dev_tx_queue_busy(str
|
|
return index >= tail;
|
|
}
|
|
|
|
+static int airoha_get_fe_port(struct airoha_gdm_port *port)
|
|
+{
|
|
+ struct airoha_qdma *qdma = port->qdma;
|
|
+ struct airoha_eth *eth = qdma->eth;
|
|
+
|
|
+ switch (eth->soc->version) {
|
|
+ case 0x7583:
|
|
+ return port->id == AIROHA_GDM3_IDX ? FE_PSE_PORT_GDM3
|
|
+ : port->id;
|
|
+ case 0x7581:
|
|
+ default:
|
|
+ return port->id == AIROHA_GDM4_IDX ? FE_PSE_PORT_GDM4
|
|
+ : port->id;
|
|
+ }
|
|
+}
|
|
+
|
|
static netdev_tx_t airoha_dev_xmit(struct sk_buff *skb,
|
|
struct net_device *dev)
|
|
{
|
|
@@ -1940,7 +1958,7 @@ static netdev_tx_t airoha_dev_xmit(struc
|
|
}
|
|
}
|
|
|
|
- fport = port->id == 4 ? FE_PSE_PORT_GDM4 : port->id;
|
|
+ fport = airoha_get_fe_port(port);
|
|
msg1 = FIELD_PREP(QDMA_ETH_TXMSG_FPORT_MASK, fport) |
|
|
FIELD_PREP(QDMA_ETH_TXMSG_METER_MASK, 0x7f);
|
|
|
|
@@ -3102,6 +3120,35 @@ static int airoha_en7581_get_src_port_id
|
|
return -EINVAL;
|
|
}
|
|
|
|
+static const char * const an7583_xsi_rsts_names[] = {
|
|
+ "xsi-mac",
|
|
+ "hsi0-mac",
|
|
+ "hsi1-mac",
|
|
+ "xfp-mac",
|
|
+};
|
|
+
|
|
+static int airoha_an7583_get_src_port_id(struct airoha_gdm_port *port, int nbq)
|
|
+{
|
|
+ switch (port->id) {
|
|
+ case 3:
|
|
+ /* 7583 SoC supports eth serdes on GDM3 port */
|
|
+ if (!nbq)
|
|
+ return HSGMII_LAN_7583_ETH_SRCPORT;
|
|
+ break;
|
|
+ case 4:
|
|
+ /* 7583 SoC supports PCIe and USB serdes on GDM4 port */
|
|
+ if (!nbq)
|
|
+ return HSGMII_LAN_7583_PCIE_SRCPORT;
|
|
+ if (nbq == 1)
|
|
+ return HSGMII_LAN_7583_USB_SRCPORT;
|
|
+ break;
|
|
+ default:
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ return -EINVAL;
|
|
+}
|
|
+
|
|
static const struct airoha_eth_soc_data en7581_soc_data = {
|
|
.version = 0x7581,
|
|
.xsi_rsts_names = en7581_xsi_rsts_names,
|
|
@@ -3112,8 +3159,19 @@ static const struct airoha_eth_soc_data
|
|
},
|
|
};
|
|
|
|
+static const struct airoha_eth_soc_data an7583_soc_data = {
|
|
+ .version = 0x7583,
|
|
+ .xsi_rsts_names = an7583_xsi_rsts_names,
|
|
+ .num_xsi_rsts = ARRAY_SIZE(an7583_xsi_rsts_names),
|
|
+ .num_ppe = 1,
|
|
+ .ops = {
|
|
+ .get_src_port_id = airoha_an7583_get_src_port_id,
|
|
+ },
|
|
+};
|
|
+
|
|
static const struct of_device_id of_airoha_match[] = {
|
|
{ .compatible = "airoha,en7581-eth", .data = &en7581_soc_data },
|
|
+ { .compatible = "airoha,an7583-eth", .data = &an7583_soc_data },
|
|
{ /* sentinel */ }
|
|
};
|
|
MODULE_DEVICE_TABLE(of, of_airoha_match);
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
|
@@ -74,6 +74,12 @@ enum {
|
|
};
|
|
|
|
enum {
|
|
+ HSGMII_LAN_7583_ETH_SRCPORT = 0x16,
|
|
+ HSGMII_LAN_7583_PCIE_SRCPORT = 0x18,
|
|
+ HSGMII_LAN_7583_USB_SRCPORT,
|
|
+};
|
|
+
|
|
+enum {
|
|
XSI_PCIE0_VIP_PORT_MASK = BIT(22),
|
|
XSI_PCIE1_VIP_PORT_MASK = BIT(23),
|
|
XSI_USB_VIP_PORT_MASK = BIT(25),
|
|
@@ -629,6 +635,11 @@ static inline bool airoha_is_7581(struct
|
|
return eth->soc->version == 0x7581;
|
|
}
|
|
|
|
+static inline bool airoha_is_7583(struct airoha_eth *eth)
|
|
+{
|
|
+ return eth->soc->version == 0x7583;
|
|
+}
|
|
+
|
|
bool airoha_is_valid_gdm_port(struct airoha_eth *eth,
|
|
struct airoha_gdm_port *port);
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_ppe.c
|
|
@@ -37,6 +37,9 @@ static int airoha_ppe_get_num_stats_entr
|
|
if (!IS_ENABLED(CONFIG_NET_AIROHA_FLOW_STATS))
|
|
return -EOPNOTSUPP;
|
|
|
|
+ if (airoha_is_7583(ppe->eth))
|
|
+ return -EOPNOTSUPP;
|
|
+
|
|
return PPE_STATS_NUM_ENTRIES;
|
|
}
|
|
|