summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2026-02-09 08:28:01 -0600
committerTom Rini <[email protected]>2026-02-09 08:28:01 -0600
commitd395ea73dc2814a2ec5b309e90df8c618d89ede0 (patch)
tree76a16705818b2e5ae7bae3e7cc4010f96a32a100 /drivers
parent42b3ee7fa5248ad89467aaf2585f4a08aedd4731 (diff)
parente7b83e64d6bc9f2366669118cb596d75f811eb89 (diff)
Merge tag 'net-20260209' of https://source.denx.de/u-boot/custodians/u-boot-net
Pull request net-20260209. net: - airoha: mdio support for the switch - phy: mscc: allow RGMII with internal delay for the VSC8541 - dwc_eth_qos: Update tail pointer handling net-legacy: - Stop conflating return value with file size in net_loop() net-lwip: - wget: rework the '#' printing - tftp: add support of tsize option to client
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/Kconfig2
-rw-r--r--drivers/net/airoha_eth.c7
-rw-r--r--drivers/net/dwc_eth_qos.c43
-rw-r--r--drivers/net/dwc_eth_qos.h28
-rw-r--r--drivers/net/mdio-mt7531-mmio.c7
-rw-r--r--drivers/net/phy/mscc.c3
6 files changed, 58 insertions, 32 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index eb6a1cab565..fce8004e134 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -127,7 +127,7 @@ config AIROHA_ETH
select PHYLIB
select DEVRES
select DM_RESET
- select MDIO_MT7531
+ select MDIO_MT7531_MMIO
help
This Driver support Airoha Ethernet QDMA Driver
Say Y to enable support for the Airoha Ethernet QDMA.
diff --git a/drivers/net/airoha_eth.c b/drivers/net/airoha_eth.c
index 046b677d78e..3a0ac7ce368 100644
--- a/drivers/net/airoha_eth.c
+++ b/drivers/net/airoha_eth.c
@@ -985,15 +985,16 @@ static int arht_eth_write_hwaddr(struct udevice *dev)
static int airoha_eth_bind(struct udevice *dev)
{
+ struct airoha_eth_soc_data *data = (void *)dev_get_driver_data(dev);
ofnode switch_node, mdio_node;
struct udevice *mdio_dev;
int ret = 0;
- if (!CONFIG_IS_ENABLED(MDIO_MT7531))
+ if (!CONFIG_IS_ENABLED(MDIO_MT7531_MMIO))
return 0;
switch_node = ofnode_by_compatible(ofnode_null(),
- "airoha,en7581-switch");
+ data->switch_compatible);
if (!ofnode_valid(switch_node)) {
debug("Warning: missing switch node\n");
return 0;
@@ -1005,7 +1006,7 @@ static int airoha_eth_bind(struct udevice *dev)
return 0;
}
- ret = device_bind_driver_to_node(dev, "mt7531-mdio", "mdio",
+ ret = device_bind_driver_to_node(dev, "mt7531-mdio-mmio", "mdio",
mdio_node, &mdio_dev);
if (ret)
debug("Warning: failed to bind mdio controller\n");
diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
index 551ee0ea6a0..8a396d0b29e 100644
--- a/drivers/net/dwc_eth_qos.c
+++ b/drivers/net/dwc_eth_qos.c
@@ -683,7 +683,6 @@ static int eqos_start(struct udevice *dev)
int ret, i;
ulong rate;
u32 val, tx_fifo_sz, rx_fifo_sz, tqs, rqs, pbl;
- ulong last_rx_desc;
ulong desc_pad;
ulong addr64;
@@ -891,11 +890,11 @@ static int eqos_start(struct udevice *dev)
EQOS_MAC_RXQ_CTRL0_RXQ0EN_SHIFT);
/* Multicast and Broadcast Queue Enable */
- setbits_le32(&eqos->mac_regs->unused_0a4,
- 0x00100000);
- /* enable promise mode */
- setbits_le32(&eqos->mac_regs->unused_004[1],
- 0x1);
+ setbits_le32(&eqos->mac_regs->rxq_ctrl1,
+ EQOS_MAC_RXQ_CTRL1_MCBCQEN);
+ /* Promiscuous Mode Enable */
+ setbits_le32(&eqos->mac_regs->packet_filter,
+ EQOS_MAC_PACKET_FILTER_PR);
/* Set TX flow control parameters */
/* Set Pause Time */
@@ -1004,6 +1003,21 @@ static int eqos_start(struct udevice *dev)
writel(EQOS_DESCRIPTORS_RX - 1,
&eqos->dma_regs->ch0_rxdesc_ring_length);
+ /*
+ * Point TX tail pointer at the first descriptor, implying no descriptor
+ * are owned by the DMA. We advance the tail pointer when we need to TX
+ * a packet in eqos_send().
+ */
+ addr64 = (ulong)eqos_get_desc(eqos, 0, false);
+ writel(lower_32_bits(addr64), &eqos->dma_regs->ch0_txdesc_tail_pointer);
+
+ /*
+ * Point RX tail pointer at the last descriptor, implying all
+ * descriptors are owned by the DMA.
+ */
+ addr64 = (ulong)eqos_get_desc(eqos, EQOS_DESCRIPTORS_RX - 1, true);
+ writel(lower_32_bits(addr64), &eqos->dma_regs->ch0_rxdesc_tail_pointer);
+
/* Enable everything */
setbits_le32(&eqos->dma_regs->ch0_tx_control,
EQOS_DMA_CH0_TX_CONTROL_ST);
@@ -1012,16 +1026,6 @@ static int eqos_start(struct udevice *dev)
setbits_le32(&eqos->mac_regs->configuration,
EQOS_MAC_CONFIGURATION_TE | EQOS_MAC_CONFIGURATION_RE);
- /* TX tail pointer not written until we need to TX a packet */
- /*
- * Point RX tail pointer at last descriptor. Ideally, we'd point at the
- * first descriptor, implying all descriptors were available. However,
- * that's not distinguishable from none of the descriptors being
- * available.
- */
- last_rx_desc = (ulong)eqos_get_desc(eqos, EQOS_DESCRIPTORS_RX - 1, true);
- writel(last_rx_desc, &eqos->dma_regs->ch0_rxdesc_tail_pointer);
-
eqos->started = true;
debug("%s: OK\n", __func__);
@@ -1116,8 +1120,8 @@ static int eqos_send(struct udevice *dev, void *packet, int length)
tx_desc->des3 = EQOS_DESC3_OWN | EQOS_DESC3_FD | EQOS_DESC3_LD | length;
eqos->config->ops->eqos_flush_desc(tx_desc);
- writel((ulong)eqos_get_desc(eqos, eqos->tx_desc_idx, false),
- &eqos->dma_regs->ch0_txdesc_tail_pointer);
+ writel(lower_32_bits((ulong)eqos_get_desc(eqos, eqos->tx_desc_idx, false)),
+ &eqos->dma_regs->ch0_txdesc_tail_pointer);
for (i = 0; i < 1000000; i++) {
eqos->config->ops->eqos_inval_desc(tx_desc);
@@ -1198,7 +1202,8 @@ static int eqos_free_pkt(struct udevice *dev, uchar *packet, int length)
rx_desc->des3 = EQOS_DESC3_OWN | EQOS_DESC3_BUF1V;
eqos->config->ops->eqos_flush_desc(rx_desc);
}
- writel((ulong)rx_desc, &eqos->dma_regs->ch0_rxdesc_tail_pointer);
+ writel(lower_32_bits((ulong)rx_desc),
+ &eqos->dma_regs->ch0_rxdesc_tail_pointer);
}
eqos->rx_desc_idx++;
diff --git a/drivers/net/dwc_eth_qos.h b/drivers/net/dwc_eth_qos.h
index c239a5c7aca..ba16f1a37cb 100644
--- a/drivers/net/dwc_eth_qos.h
+++ b/drivers/net/dwc_eth_qos.h
@@ -14,23 +14,31 @@
#define EQOS_MAC_REGS_BASE 0x000
struct eqos_mac_regs {
u32 configuration; /* 0x000 */
- u32 unused_004[(0x070 - 0x004) / 4]; /* 0x004 */
+ u32 ext_configuration; /* 0x004 */
+ u32 packet_filter; /* 0x008 */
+ u32 watchdog_timeout; /* 0x00c */
+ u32 unused_010[(0x070 - 0x010) / 4]; /* 0x010 */
u32 q0_tx_flow_ctrl; /* 0x070 */
- u32 unused_070[(0x090 - 0x074) / 4]; /* 0x074 */
+ u32 unused_074[(0x090 - 0x074) / 4]; /* 0x074 */
u32 rx_flow_ctrl; /* 0x090 */
- u32 unused_094; /* 0x094 */
+ u32 rxq_ctrl4; /* 0x094 */
u32 txq_prty_map0; /* 0x098 */
- u32 unused_09c; /* 0x09c */
+ u32 txq_prty_map1; /* 0x09c */
u32 rxq_ctrl0; /* 0x0a0 */
- u32 unused_0a4; /* 0x0a4 */
+ u32 rxq_ctrl1; /* 0x0a4 */
u32 rxq_ctrl2; /* 0x0a8 */
- u32 unused_0ac[(0x0dc - 0x0ac) / 4]; /* 0x0ac */
+ u32 rxq_ctrl3; /* 0x0ac */
+ u32 unused_0b0[(0x0dc - 0x0b0) / 4]; /* 0x0b0 */
u32 us_tic_counter; /* 0x0dc */
- u32 unused_0e0[(0x11c - 0x0e0) / 4]; /* 0x0e0 */
+ u32 unused_0e0[(0x110 - 0x0e0) / 4]; /* 0x0e0 */
+ u32 version; /* 0x110 */
+ u32 debug; /* 0x114 */
+ u32 unused_118; /* 0x118 */
u32 hw_feature0; /* 0x11c */
u32 hw_feature1; /* 0x120 */
u32 hw_feature2; /* 0x124 */
- u32 unused_128[(0x200 - 0x128) / 4]; /* 0x128 */
+ u32 hw_feature3; /* 0x128 */
+ u32 unused_12c[(0x200 - 0x12c) / 4]; /* 0x12c */
u32 mdio_address; /* 0x200 */
u32 mdio_data; /* 0x204 */
u32 unused_208[(0x300 - 0x208) / 4]; /* 0x208 */
@@ -51,6 +59,8 @@ struct eqos_mac_regs {
#define EQOS_MAC_CONFIGURATION_TE BIT(1)
#define EQOS_MAC_CONFIGURATION_RE BIT(0)
+#define EQOS_MAC_PACKET_FILTER_PR BIT(0)
+
#define EQOS_MAC_Q0_TX_FLOW_CTRL_PT_SHIFT 16
#define EQOS_MAC_Q0_TX_FLOW_CTRL_PT_MASK 0xffff
#define EQOS_MAC_Q0_TX_FLOW_CTRL_TFE BIT(1)
@@ -66,6 +76,8 @@ struct eqos_mac_regs {
#define EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_DCB 2
#define EQOS_MAC_RXQ_CTRL0_RXQ0EN_ENABLED_AV 1
+#define EQOS_MAC_RXQ_CTRL1_MCBCQEN BIT(20)
+
#define EQOS_MAC_RXQ_CTRL2_PSRQ0_SHIFT 0
#define EQOS_MAC_RXQ_CTRL2_PSRQ0_MASK 0xff
diff --git a/drivers/net/mdio-mt7531-mmio.c b/drivers/net/mdio-mt7531-mmio.c
index 3e325ca58da..5a0725010f2 100644
--- a/drivers/net/mdio-mt7531-mmio.c
+++ b/drivers/net/mdio-mt7531-mmio.c
@@ -151,8 +151,13 @@ static const struct mdio_ops mt7531_mdio_ops = {
static int mt7531_mdio_probe(struct udevice *dev)
{
struct mt7531_mdio_priv *priv = dev_get_priv(dev);
+ ofnode switch_node;
- priv->switch_regs = dev_read_addr(dev);
+ switch_node = ofnode_get_parent(dev_ofnode(dev));
+ if (!ofnode_valid(switch_node))
+ return -EINVAL;
+
+ priv->switch_regs = ofnode_get_addr(switch_node);
if (priv->switch_regs == FDT_ADDR_T_NONE)
return -EINVAL;
diff --git a/drivers/net/phy/mscc.c b/drivers/net/phy/mscc.c
index bd9cd952975..7263887b9ce 100644
--- a/drivers/net/phy/mscc.c
+++ b/drivers/net/phy/mscc.c
@@ -1371,6 +1371,9 @@ static int vsc8541_config(struct phy_device *phydev)
case PHY_INTERFACE_MODE_GMII:
case PHY_INTERFACE_MODE_RMII:
case PHY_INTERFACE_MODE_RGMII:
+ case PHY_INTERFACE_MODE_RGMII_TXID:
+ case PHY_INTERFACE_MODE_RGMII_RXID:
+ case PHY_INTERFACE_MODE_RGMII_ID:
retval = vsc8531_vsc8541_mac_config(phydev);
if (retval != 0)
return retval;