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 <david.wu@rock-chips.com>
This commit is contained in:
David Wu
2020-12-01 18:07:46 +08:00
committed by Tao Huang
parent 1d4790c731
commit a0da19e42f

View File

@@ -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(&ethaddr[id * ETH_ALEN])) {
dev_err(dev, "%s: rk_vendor_read eth mac address failed (%d)\n",
__func__, ret);
random_ether_addr(&ethaddr[id * ETH_ALEN]);
memcpy(addr, &ethaddr[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, &ethaddr[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)