As the SG2042 has an internal rx delay, the delay should be remove when init the mac, otherwise the phy will be misconfigurated. Fixes: 543009e2d4cd ("net: stmmac: dwmac-sophgo: Add support for Sophgo SG2042 SoC") Signed-off-by: Inochi Amaoto Tested-by: Han Gao --- .../ethernet/stmicro/stmmac/dwmac-sophgo.c | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sophgo.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sophgo.c index 3b7947a7a7ba..b2dee1399eb0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sophgo.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sophgo.c @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -29,8 +30,23 @@ static int sophgo_sg2044_dwmac_init(struct platform_device *pdev, return 0; } +static int sophgo_sg2042_set_mode(struct plat_stmmacenet_data *plat_dat) +{ + switch (plat_dat->phy_interface) { + case PHY_INTERFACE_MODE_RGMII_ID: + plat_dat->phy_interface = PHY_INTERFACE_MODE_RGMII_TXID; + return 0; + case PHY_INTERFACE_MODE_RGMII_RXID: + plat_dat->phy_interface = PHY_INTERFACE_MODE_RGMII; + return 0; + default: + return -EINVAL; + } +} + static int sophgo_dwmac_probe(struct platform_device *pdev) { + int (*plat_set_mode)(struct plat_stmmacenet_data *plat_dat); struct plat_stmmacenet_data *plat_dat; struct stmmac_resources stmmac_res; struct device *dev = &pdev->dev; @@ -50,11 +66,18 @@ static int sophgo_dwmac_probe(struct platform_device *pdev) if (ret) return ret; + plat_set_mode = device_get_match_data(&pdev->dev); + if (plat_set_mode) { + ret = plat_set_mode(plat_dat); + if (ret) + return ret; + } + return stmmac_dvr_probe(dev, plat_dat, &stmmac_res); } static const struct of_device_id sophgo_dwmac_match[] = { - { .compatible = "sophgo,sg2042-dwmac" }, + { .compatible = "sophgo,sg2042-dwmac", .data = sophgo_sg2042_set_mode }, { .compatible = "sophgo,sg2044-dwmac" }, { /* sentinel */ } }; -- 2.51.0