Communication with Ethernet PHYs over MDIO does not work when reset controls are held in asserted state. This prevents i.e. the mdio/mii commands from working, unless the network stack is in running state.
Change to only assert the reset controls for a short period when the network stack is starting to allow for the mdio/mii commands to work. With reset controls held asserted (before): => mdio read 1 PHY at address 1: 1 - 0x0 => mii info PHY 0x00: OUI = 0x0000, Model = 0x00, Rev = 0x00, 10baseT, HDX [...] PHY 0x1F: OUI = 0x0000, Model = 0x00, Rev = 0x00, 10baseT, HDX With reset controls not helt asserted (after): => mdio read 1 PHY at address 1: 1 - 0x7989 => mii info PHY 0x00: OUI = 0x0732, Model = 0x11, Rev = 0x06, 10baseT, HDX PHY 0x01: OUI = 0x0732, Model = 0x11, Rev = 0x06, 10baseT, HDX Signed-off-by: Jonas Karlman <[email protected]> --- drivers/net/dwc_eth_qos_rockchip.c | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/net/dwc_eth_qos_rockchip.c b/drivers/net/dwc_eth_qos_rockchip.c index 04bc6006bc3c..78623ed78fb0 100644 --- a/drivers/net/dwc_eth_qos_rockchip.c +++ b/drivers/net/dwc_eth_qos_rockchip.c @@ -747,8 +747,6 @@ static int eqos_probe_resources_rk(struct udevice *dev) if (ret && ret != -ENOENT && ret != -ENOTSUPP) goto err_free; - reset_assert_bulk(&data->resets); - ret = clk_get_by_name(dev, "stmmaceth", &eqos->clk_master_bus); if (ret) { dev_dbg(dev, "clk_get_by_name(stmmaceth) failed: %d", ret); @@ -803,18 +801,17 @@ static int eqos_remove_resources_rk(struct udevice *dev) return 0; } -static int eqos_stop_resets_rk(struct udevice *dev) +static int eqos_start_resets_rk(struct udevice *dev) { struct eth_pdata *pdata = dev_get_plat(dev); struct rockchip_platform_data *data = pdata->priv_pdata; + int ret; - return reset_assert_bulk(&data->resets); -} + ret = reset_assert_bulk(&data->resets); + if (ret) + return ret; -static int eqos_start_resets_rk(struct udevice *dev) -{ - struct eth_pdata *pdata = dev_get_plat(dev); - struct rockchip_platform_data *data = pdata->priv_pdata; + udelay(10); return reset_deassert_bulk(&data->resets); } @@ -891,7 +888,7 @@ static struct eqos_ops eqos_rockchip_ops = { .eqos_flush_buffer = eqos_flush_buffer_generic, .eqos_probe_resources = eqos_probe_resources_rk, .eqos_remove_resources = eqos_remove_resources_rk, - .eqos_stop_resets = eqos_stop_resets_rk, + .eqos_stop_resets = eqos_null_ops, .eqos_start_resets = eqos_start_resets_rk, .eqos_stop_clks = eqos_stop_clks_rk, .eqos_start_clks = eqos_start_clks_rk, -- 2.55.0
