From 215fd015895544c44e07a44c359a30e880f49ebe Mon Sep 17 00:00:00 2001 From: huweiguo Date: Thu, 22 Dec 2016 09:11:56 +0800 Subject: [PATCH] ethernet: rockchip: get and save eth addr in vendor storage Change-Id: I83d8bc81ca8d33e6f2575d0d90a3dc5978500a64 Signed-off-by: huweiguo --- .../net/ethernet/stmicro/stmmac/dwmac-rk.c | 28 ++++++++++++++++++- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 3 ++ .../linux/soc/rockchip/rk_vendor_storage.h | 6 ++++ include/linux/stmmac.h | 1 + 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c index 16416870910d..198932f00d08 100644 --- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c +++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c @@ -31,7 +31,7 @@ #include #include #include - +#include #include "stmmac_platform.h" struct rk_priv_data; @@ -914,6 +914,31 @@ static void rk_fix_speed(void *priv, unsigned int speed) dev_err(dev, "unsupported interface %d", bsp_priv->phy_iface); } +void rk_get_eth_addr_vendor(void *priv, unsigned char *addr) +{ + int ret; + struct rk_priv_data *bsp_priv = priv; + struct device *dev = &bsp_priv->pdev->dev; + + 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 (ret != 0) + dev_err(dev, "%s: rk_vendor_write eth mac address failed (%d)", + __func__, ret); + } else { + dev_err(dev, "%s: rk_vendor_read eth mac address: %02x:%02x:%02x:%02x:%02x:%02x", + __func__, addr[0], addr[1], addr[2], + addr[3], addr[4], addr[5]); + } +} + static int rk_gmac_probe(struct platform_device *pdev) { struct plat_stmmacenet_data *plat_dat; @@ -939,6 +964,7 @@ static int rk_gmac_probe(struct platform_device *pdev) plat_dat->init = rk_gmac_init; plat_dat->exit = rk_gmac_exit; plat_dat->fix_mac_speed = rk_fix_speed; + plat_dat->get_eth_addr = rk_get_eth_addr_vendor; plat_dat->bsp_priv = rk_gmac_setup(pdev, data); if (IS_ERR(plat_dat->bsp_priv)) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index 13e02c375708..fef0b5a883c2 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -1621,6 +1621,9 @@ static void stmmac_check_ether_addr(struct stmmac_priv *priv) if (!is_valid_ether_addr(priv->dev->dev_addr)) { priv->hw->mac->get_umac_addr(priv->hw, priv->dev->dev_addr, 0); + if (likely(priv->plat->get_eth_addr)) + priv->plat->get_eth_addr(priv->plat->bsp_priv, + priv->dev->dev_addr); if (!is_valid_ether_addr(priv->dev->dev_addr)) eth_hw_addr_random(priv->dev); pr_info("%s: device MAC address %pM\n", priv->dev->name, diff --git a/include/linux/soc/rockchip/rk_vendor_storage.h b/include/linux/soc/rockchip/rk_vendor_storage.h index 0931a815c375..0bd4a5eb67f9 100644 --- a/include/linux/soc/rockchip/rk_vendor_storage.h +++ b/include/linux/soc/rockchip/rk_vendor_storage.h @@ -10,6 +10,12 @@ #ifndef __PLAT_RK_VENDOR_STORAGE_H #define __PLAT_RK_VENDOR_STORAGE_H +#define RSV_ID 0 +#define SN_ID 1 +#define WIFI_MAC_ID 2 +#define LAN_MAC_ID 3 +#define BT_MAC_ID 4 + int rk_vendor_read(u32 id, void *pbuf, u32 size); int rk_vendor_write(u32 id, void *pbuf, u32 size); int rk_vendor_register(void *read, void *write); diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h index eead8ab93c0a..cddcbcc7a66f 100644 --- a/include/linux/stmmac.h +++ b/include/linux/stmmac.h @@ -121,6 +121,7 @@ struct plat_stmmacenet_data { void (*bus_setup)(void __iomem *ioaddr); int (*init)(struct platform_device *pdev, void *priv); void (*exit)(struct platform_device *pdev, void *priv); + void (*get_eth_addr)(void *priv, unsigned char *addr); void *bsp_priv; }; #endif -- 2.34.1