ixp4xx_of_get_platdata() returns NULL on failure, which the probe converts to -ENODEV, discarding the real cause of the failure. Return ERR_PTR() with the appropriate error so callers can distinguish cases such as missing DT properties (-EINVAL) and, importantly, handle -EPROBE_DEFER from of_get_mac_address(). Fixes: 95aafe911db6 ("net: ethernet: ixp4xx: Support device tree probing") Assisted-by: opencode:hy3-free Signed-off-by: Rosen Penev --- drivers/net/ethernet/xscale/ixp4xx_eth.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c index b0faa0f1780d..b8889f87ca03 100644 --- a/drivers/net/ethernet/xscale/ixp4xx_eth.c +++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c @@ -1444,13 +1444,13 @@ static struct eth_plat_info *ixp4xx_of_get_platdata(struct device *dev) plat = devm_kzalloc(dev, sizeof(*plat), GFP_KERNEL); if (!plat) - return NULL; + return ERR_PTR(-ENOMEM); ret = of_parse_phandle_with_fixed_args(np, "intel,npe-handle", 1, 0, &npe_spec); if (ret) { dev_err(dev, "no NPE engine specified\n"); - return NULL; + return ERR_PTR(-EINVAL); } /* NPE ID 0x00, 0x10, 0x20... */ plat->npe = (npe_spec.args[0] << 4); @@ -1468,7 +1468,7 @@ static struct eth_plat_info *ixp4xx_of_get_platdata(struct device *dev) &queue_spec); if (ret) { dev_err(dev, "no rx queue phandle\n"); - return NULL; + return ERR_PTR(-EINVAL); } plat->rxq = queue_spec.args[0]; @@ -1477,11 +1477,13 @@ static struct eth_plat_info *ixp4xx_of_get_platdata(struct device *dev) &queue_spec); if (ret) { dev_err(dev, "no txready queue phandle\n"); - return NULL; + return ERR_PTR(-EINVAL); } plat->txreadyq = queue_spec.args[0]; ret = of_get_mac_address(np, mac); + if (ret == -EPROBE_DEFER) + return ERR_PTR(ret); if (!ret) { dev_info(dev, "Setting macaddr from DT %pM\n", mac); memcpy(plat->hwaddr, mac, ETH_ALEN); @@ -1501,8 +1503,8 @@ static int ixp4xx_eth_probe(struct platform_device *pdev) int err; plat = ixp4xx_of_get_platdata(dev); - if (!plat) - return -ENODEV; + if (IS_ERR(plat)) + return PTR_ERR(plat); if (!(ndev = devm_alloc_etherdev(dev, sizeof(struct port)))) return -ENOMEM; -- 2.55.0