ethernet: rockchip: get and save eth addr in vendor storage
authorhuweiguo <hwg@rock-chips.com>
Thu, 22 Dec 2016 01:11:56 +0000 (09:11 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Thu, 22 Dec 2016 08:07:34 +0000 (16:07 +0800)
Change-Id: I83d8bc81ca8d33e6f2575d0d90a3dc5978500a64
Signed-off-by: huweiguo <hwg@rock-chips.com>
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
include/linux/soc/rockchip/rk_vendor_storage.h
include/linux/stmmac.h

index 16416870910d9aa7e9c5cc3cffc9184324b5b092..198932f00d0895967ed8063c0fd1f80776f38a37 100644 (file)
@@ -31,7 +31,7 @@
 #include <linux/mfd/syscon.h>
 #include <linux/regmap.h>
 #include <linux/pm_runtime.h>
-
+#include <linux/soc/rockchip/rk_vendor_storage.h>
 #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))
index 13e02c375708840e10e318104c576d3a1f2d3b68..fef0b5a883c2be157ed1609c67f50021a829c640 100644 (file)
@@ -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,
index 0931a815c375254f5026446de29940805cdfbcb8..0bd4a5eb67f9a14621d8b535279ed5ff6bd6fa1f 100644 (file)
 #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);
index eead8ab93c0a36e402741ee767d3c3bc70128964..cddcbcc7a66ff31adfda972704b930f300aae784 100644 (file)
@@ -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