ethernet: rockchip: get and save eth addr in vendor storage
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / stmicro / stmmac / dwmac-rk.c
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))