mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-09 12:17:12 +09:00
ethernet: rockchip: get and save eth addr in vendor storage
Change-Id: I83d8bc81ca8d33e6f2575d0d90a3dc5978500a64 Signed-off-by: huweiguo <hwg@rock-chips.com>
This commit is contained in:
@@ -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))
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user