diff options
| author | Adam Ford <aford173@gmail.com> | 2023-10-22 10:19:11 -0500 | 
|---|---|---|
| committer | Paolo Abeni <pabeni@redhat.com> | 2023-10-24 11:26:08 +0200 | 
| commit | f30a51a41828986687997a5aa95b9f8085228cff (patch) | |
| tree | ce702450066a916f11c1a2d079e9a494051a881d | |
| parent | 66e6369e312d161708786123fb44ecd53ff32d82 (diff) | |
net: ethernet: davinci_emac: Use MAC Address from Device Tree
Currently there is a device tree entry called "local-mac-address"
which can be filled by the bootloader or manually set.This is
useful when the user does not want to use the MAC address
programmed into the SoC.
Currently, the davinci_emac reads the MAC from the DT, copies
it from pdata->mac_addr to priv->mac_addr, then blindly overwrites
it by reading from registers in the SoC, and falls back to a
random MAC if it's still not valid.  This completely ignores any
MAC address in the device tree.
In order to use the local-mac-address, check to see if the contents
of priv->mac_addr are valid before falling back to reading from the
SoC when the MAC address is not valid.
Signed-off-by: Adam Ford <aford173@gmail.com>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://lore.kernel.org/r/20231022151911.4279-1-aford173@gmail.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
| -rw-r--r-- | drivers/net/ethernet/ti/davinci_emac.c | 22 | 
1 files changed, 12 insertions, 10 deletions
| diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c index 23f8bc1cd20d..b0950a318c42 100644 --- a/drivers/net/ethernet/ti/davinci_emac.c +++ b/drivers/net/ethernet/ti/davinci_emac.c @@ -1928,18 +1928,20 @@ static int davinci_emac_probe(struct platform_device *pdev)  		goto err_free_rxchan;  	ndev->irq = rc; -	rc = davinci_emac_try_get_mac(pdev, res_ctrl ? 0 : 1, priv->mac_addr); -	if (!rc) -		eth_hw_addr_set(ndev, priv->mac_addr); - +	/* If the MAC address is not present, read the registers from the SoC */  	if (!is_valid_ether_addr(priv->mac_addr)) { -		/* Use random MAC if still none obtained. */ -		eth_hw_addr_random(ndev); -		memcpy(priv->mac_addr, ndev->dev_addr, ndev->addr_len); -		dev_warn(&pdev->dev, "using random MAC addr: %pM\n", -			 priv->mac_addr); +		rc = davinci_emac_try_get_mac(pdev, res_ctrl ? 0 : 1, priv->mac_addr); +		if (!rc) +			eth_hw_addr_set(ndev, priv->mac_addr); + +		if (!is_valid_ether_addr(priv->mac_addr)) { +			/* Use random MAC if still none obtained. */ +			eth_hw_addr_random(ndev); +			memcpy(priv->mac_addr, ndev->dev_addr, ndev->addr_len); +			dev_warn(&pdev->dev, "using random MAC addr: %pM\n", +				 priv->mac_addr); +		}  	} -  	ndev->netdev_ops = &emac_netdev_ops;  	ndev->ethtool_ops = ðtool_ops;  	netif_napi_add(ndev, &priv->napi, emac_poll); | 
