From a0da19e42f903e6f8b4d349dc015867ecf85ff09 Mon Sep 17 00:00:00 2001 From: David Wu Date: Tue, 1 Dec 2020 18:07:46 +0800 Subject: [PATCH] ethernet: stmicro: stmmac: dwmac-rk: Support more ethernet mac address The RK3568 has two gmac, but the driver only support one mac address right now, define the more ethernet mac address at vendor storage to support it. Change-Id: If47df961136da6fe13ede1e5817717db2c0ad2f6 Signed-off-by: David Wu --- .../net/ethernet/stmicro/stmmac/dwmac-rk.c | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index 21b55049f236..33ea3bd4bcc9 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c @@ -26,6 +26,8 @@ #include "stmmac_platform.h" #include "dwmac-rk-tool.h" +#define MAX_ETH 2 + struct rk_priv_data; struct rk_gmac_ops { void (*set_to_rgmii)(struct rk_priv_data *bsp_priv, @@ -1824,31 +1826,43 @@ EXPORT_SYMBOL(dwmac_rk_get_phy_interface); static void rk_get_eth_addr(void *priv, unsigned char *addr) { - int ret; struct rk_priv_data *bsp_priv = priv; struct device *dev = &bsp_priv->pdev->dev; + unsigned char ethaddr[ETH_ALEN * MAX_ETH] = {0}; + int ret, id = bsp_priv->bus_id; if (is_valid_ether_addr(addr)) goto out; - ret = rk_vendor_read(LAN_MAC_ID, addr, 6); - if (ret != 6 || is_zero_ether_addr(addr)) { - dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)", - __func__, ret); - random_ether_addr(addr); - dev_err(dev, "%s: generate random eth mac address: %02x:%02x:%02x:%02x:%02x:%02x", - __func__, addr[0], addr[1], addr[2], - addr[3], addr[4], addr[5]); - ret = rk_vendor_write(LAN_MAC_ID, addr, 6); + if (id < 0 || id >= MAX_ETH) { + dev_err(dev, "%s: Invalid ethernet bus id %d\n", __func__, id); + return; + } + + ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH); + if (ret <= 0 || + !is_valid_ether_addr(ðaddr[id * ETH_ALEN])) { + dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)\n", + __func__, ret); + random_ether_addr(ðaddr[id * ETH_ALEN]); + memcpy(addr, ðaddr[id * ETH_ALEN], ETH_ALEN); + dev_err(dev, "%s: generate random eth mac address: %pM\n", __func__, addr); + + ret = rk_vendor_write(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH); if (ret != 0) - dev_err(dev, "%s: rk_vendor_write eth mac address failed (%d)", - __func__, ret); + dev_err(dev, "%s: rk_vendor_write eth mac address failed (%d)\n", + __func__, ret); + + ret = rk_vendor_read(LAN_MAC_ID, ethaddr, ETH_ALEN * MAX_ETH); + if (ret != ETH_ALEN * MAX_ETH) + dev_err(dev, "%s: id: %d rk_vendor_read eth mac address failed (%d)\n", + __func__, id, ret); + } else { + memcpy(addr, ðaddr[id * ETH_ALEN], ETH_ALEN); } out: - dev_err(dev, "%s: mac address: %02x:%02x:%02x:%02x:%02x:%02x", - __func__, addr[0], addr[1], addr[2], - addr[3], addr[4], addr[5]); + dev_err(dev, "%s: mac address: %pM\n", __func__, addr); } static int rk_gmac_probe(struct platform_device *pdev)