mirror of
https://github.com/openwrt/openwrt.git
synced 2026-05-05 22:25:44 +04:00
3169ffa4c7
Backport upstream patch fixing out of order DMA access for ethernet driver. This is relevant in the context of QoS when packets doesn't follow linear handling by QDMA HW. Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
146 lines
4.0 KiB
Diff
146 lines
4.0 KiB
Diff
From 843e2892f2d9353bf039e0dfb5442a600e75009e Mon Sep 17 00:00:00 2001
|
|
From: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|
Date: Thu, 9 Oct 2025 23:46:08 +0300
|
|
Subject: [PATCH] net: airoha: disable external phy code if PCS_AIROHA is not
|
|
enabled
|
|
|
|
External phy code breaks building for EN7523, so disable it if
|
|
PCS_AIROHA is not selected.
|
|
|
|
Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
|
|
---
|
|
drivers/net/ethernet/airoha/airoha_eth.c | 16 ++++++++++++++++
|
|
drivers/net/ethernet/airoha/airoha_eth.h | 2 ++
|
|
2 files changed, 18 insertions(+)
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.c
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.c
|
|
@@ -72,10 +72,12 @@ static void airoha_qdma_irq_disable(stru
|
|
airoha_qdma_set_irqmask(irq_bank, index, mask, 0);
|
|
}
|
|
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
static bool airhoa_is_phy_external(struct airoha_gdm_port *port)
|
|
{
|
|
return port->id != 1;
|
|
}
|
|
+#endif
|
|
|
|
static void airoha_set_macaddr(struct airoha_gdm_port *port, const u8 *addr)
|
|
{
|
|
@@ -1630,6 +1632,7 @@ static int airoha_dev_open(struct net_de
|
|
struct airoha_gdm_port *port = netdev_priv(dev);
|
|
struct airoha_qdma *qdma = port->qdma;
|
|
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
if (airhoa_is_phy_external(port)) {
|
|
err = phylink_of_phy_connect(port->phylink, dev->dev.of_node, 0);
|
|
if (err) {
|
|
@@ -1640,6 +1643,7 @@ static int airoha_dev_open(struct net_de
|
|
|
|
phylink_start(port->phylink);
|
|
}
|
|
+#endif
|
|
|
|
netif_tx_start_all_queues(dev);
|
|
err = airoha_set_vip_for_gdm_port(port, true);
|
|
@@ -1694,10 +1698,12 @@ static int airoha_dev_stop(struct net_de
|
|
}
|
|
}
|
|
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
if (airhoa_is_phy_external(port)) {
|
|
phylink_stop(port->phylink);
|
|
phylink_disconnect_phy(port->phylink);
|
|
}
|
|
+#endif
|
|
|
|
return 0;
|
|
}
|
|
@@ -2841,6 +2847,7 @@ static const struct ethtool_ops airoha_e
|
|
.get_link = ethtool_op_get_link,
|
|
};
|
|
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
static struct phylink_pcs *airoha_phylink_mac_select_pcs(struct phylink_config *config,
|
|
phy_interface_t interface)
|
|
{
|
|
@@ -2854,6 +2861,7 @@ static void airoha_mac_config(struct phy
|
|
const struct phylink_link_state *state)
|
|
{
|
|
}
|
|
+#endif
|
|
|
|
static int airoha_metadata_dst_alloc(struct airoha_gdm_port *port)
|
|
{
|
|
@@ -2899,6 +2907,7 @@ bool airoha_is_valid_gdm_port(struct air
|
|
return false;
|
|
}
|
|
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
static void airoha_mac_link_up(struct phylink_config *config, struct phy_device *phy,
|
|
unsigned int mode, phy_interface_t interface,
|
|
int speed, int duplex, bool tx_pause, bool rx_pause)
|
|
@@ -2991,6 +3000,7 @@ static int airoha_setup_phylink(struct n
|
|
|
|
return 0;
|
|
}
|
|
+#endif
|
|
|
|
static int airoha_alloc_gdm_port(struct airoha_eth *eth,
|
|
struct device_node *np, int index)
|
|
@@ -3070,11 +3080,13 @@ static int airoha_alloc_gdm_port(struct
|
|
if (err)
|
|
return err;
|
|
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
if (airhoa_is_phy_external(port)) {
|
|
err = airoha_setup_phylink(dev);
|
|
if (err)
|
|
goto free_metadata_dst;
|
|
}
|
|
+#endif
|
|
|
|
err = register_netdev(dev);
|
|
if (err)
|
|
@@ -3191,10 +3203,12 @@ error_hw_cleanup:
|
|
if (port && port->dev->reg_state == NETREG_REGISTERED) {
|
|
unregister_netdev(port->dev);
|
|
airoha_metadata_dst_free(port);
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
if (airhoa_is_phy_external(port)) {
|
|
phylink_destroy(port->phylink);
|
|
airoha_pcs_destroy(port->pcs);
|
|
}
|
|
+#endif
|
|
}
|
|
}
|
|
free_netdev(eth->napi_dev);
|
|
@@ -3222,10 +3236,12 @@ static void airoha_remove(struct platfor
|
|
airoha_dev_stop(port->dev);
|
|
unregister_netdev(port->dev);
|
|
airoha_metadata_dst_free(port);
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
if (airhoa_is_phy_external(port)) {
|
|
phylink_destroy(port->phylink);
|
|
airoha_pcs_destroy(port->pcs);
|
|
}
|
|
+#endif
|
|
}
|
|
free_netdev(eth->napi_dev);
|
|
|
|
--- a/drivers/net/ethernet/airoha/airoha_eth.h
|
|
+++ b/drivers/net/ethernet/airoha/airoha_eth.h
|
|
@@ -536,9 +536,11 @@ struct airoha_gdm_port {
|
|
struct net_device *dev;
|
|
int id;
|
|
|
|
+#if defined(CONFIG_PCS_AIROHA)
|
|
struct phylink *phylink;
|
|
struct phylink_config phylink_config;
|
|
struct phylink_pcs *pcs;
|
|
+#endif
|
|
|
|
struct airoha_hw_stats stats;
|
|
|