[PATCH v2 7/9] net: dwc_eth_qos: Add mediatek support

David Lechner dlechner at baylibre.com
Tue Apr 28 21:00:03 CEST 2026


On 4/28/26 8:17 AM, Julien Stephan wrote:
> Synopsys DWC Ethernet QOS device support for MediaTek SoCs.
> in particular this initial commit adds support for Genio 520/720 and
> Genio 510/700 EVKs
> 
> Signed-off-by: fanyi zhang <fanyi.zhang at mediatek.com>
> Signed-off-by: Julien Stephan <jstephan at baylibre.com>
> ---

...

> +static int mtk_config_dt(struct udevice *dev)
> +{	struct eth_pdata *pdata = dev_get_plat(dev);
> +	struct eqos_mtk_priv *mtk_pdata = pdata->priv_pdata;
> +	struct ofnode_phandle_args args;
> +	u32 tx_delay_ps, rx_delay_ps;
> +	int ret;
> +
> +	if (!dev_read_u32(dev, "mediatek,tx-delay-ps", &tx_delay_ps)) {
> +		if (tx_delay_ps > DELAY_MAX_PS) {
> +			pr_err("%s: dev=%p Invalid TX clock delay: %dps\n",
> +			       __func__, dev, tx_delay_ps);
> +			return -EINVAL;
> +		}
> +	}
> +
> +	if (!dev_read_u32(dev, "mediatek,rx-delay-ps", &rx_delay_ps)) {
> +		if (rx_delay_ps > DELAY_MAX_PS) {
> +			pr_err("%s: dev=%p Invalid RX clock delay: %dps\n",
> +			       __func__, dev, rx_delay_ps);
> +			return -EINVAL;
> +		}
> +	}
> +
> +	mtk_pdata->tx_delay_stage = tx_delay_ps / DELAY_PS_PER_STAGE;
> +	mtk_pdata->rx_delay_stage = rx_delay_ps / DELAY_PS_PER_STAGE;

Possible uninitialized use of tx_delay_ps and rx_delay_ps.

> +
> +	mtk_pdata->tx_inv = dev_read_bool(dev, "mediatek,txc-inverse");
> +	mtk_pdata->rx_inv = dev_read_bool(dev, "mediatek,rxc-inverse");
> +	mtk_pdata->rmii_clk_from_mac = dev_read_bool(dev, "mediatek,rmii-clk-from-mac");
> +	mtk_pdata->rmii_rxc = dev_read_bool(dev, "mediatek,rmii-rxc");
> +
> +	ret = dev_read_phandle_with_args(dev, "mediatek,pericfg", NULL, 0, 0, &args);
> +	if (ret) {
> +		pr_err("Failed to get mediatek,pericfg property: %d\n", ret);
> +		return ret;
> +	}
> +
> +	mtk_pdata->peri_regmap = syscon_node_to_regmap(args.node);
> +	if (IS_ERR(mtk_pdata->peri_regmap)) {
> +		pr_err("%s: dev=%p Invalid perif_cfg reg\n", __func__, dev);

This error message is a bit misleading. The actual problem is that
syscon_node_to_regmap() failed.

> +		return -EINVAL;

Why not return PTR_ERR(mtk_pdata->peri_regmap)?

> +	}
> +
> +	return 0;
> +}
> +
> +static int eqos_probe_resources_mtk(struct udevice *dev)
> +{
> +	struct eqos_priv *eqos = dev_get_priv(dev);
> +	struct eth_pdata *pdata = dev_get_plat(dev);
> +	struct eqos_mtk_priv *mtk_pdata;
> +	int ret;
> +
> +	debug("%s(dev=%p):\n", __func__, dev);
> +
> +	ret = eqos_get_base_addr_dt(dev);
> +	if (ret) {
> +		dev_err(dev, "eqos_get_base_addr_dt failed: %d\n", ret);
> +		return ret;
> +	}
> +
> +	mtk_pdata = calloc(1, sizeof(struct eqos_mtk_priv));
> +	if (!mtk_pdata)
> +		return -ENOMEM;
> +
> +	pdata->priv_pdata = mtk_pdata;
> +
> +	ret = mtk_config_dt(dev);
> +	if (ret) {
> +		dev_err(dev, "mtk config dt failed: %d\n", ret);
> +		goto err;
> +	}
> +
> +	ret = mtk_clk_init(dev);
> +	if (ret)
> +		goto err;
> +
> +	pdata->phy_interface = eqos->config->interface(dev);
> +	if (pdata->phy_interface == PHY_INTERFACE_MODE_NA) {
> +		dev_err(dev, "Invalid PHY interface\n");
> +		ret = -EINVAL;
> +		goto err;
> +	}
> +
> +	ret = mtk_set_interface(dev);
> +	if (ret)
> +		goto err;
> +
> +	ret = mtk_set_delay(dev);
> +	if (ret)
> +		goto err;
> +
> +	debug("%s: OK\n", __func__);

FWIW, log_msg_ret() is good for debugging return values.

> +	return 0;
> +err:
> +	free(mtk_pdata);
> +	return ret;
> +}
> +


More information about the U-Boot mailing list