diff options
| author | Tom Rini <[email protected]> | 2026-02-09 08:28:01 -0600 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-02-09 08:28:01 -0600 |
| commit | d395ea73dc2814a2ec5b309e90df8c618d89ede0 (patch) | |
| tree | 76a16705818b2e5ae7bae3e7cc4010f96a32a100 /drivers | |
| parent | 42b3ee7fa5248ad89467aaf2585f4a08aedd4731 (diff) | |
| parent | e7b83e64d6bc9f2366669118cb596d75f811eb89 (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/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/net/airoha_eth.c | 7 | ||||
| -rw-r--r-- | drivers/net/dwc_eth_qos.c | 43 | ||||
| -rw-r--r-- | drivers/net/dwc_eth_qos.h | 28 | ||||
| -rw-r--r-- | drivers/net/mdio-mt7531-mmio.c | 7 | ||||
| -rw-r--r-- | drivers/net/phy/mscc.c | 3 |
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; |
