summaryrefslogtreecommitdiffstats
path: root/net/eth.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/eth.c')
-rw-r--r--net/eth.c88
1 files changed, 60 insertions, 28 deletions
diff --git a/net/eth.c b/net/eth.c
index 8e6acfef89..6c49db583b 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -281,6 +281,31 @@ int eth_get_dev_index(void)
return -1;
}
+static int eth_write_hwaddr(struct udevice *dev)
+{
+ struct eth_pdata *pdata = dev->platdata;
+ int ret = 0;
+
+ if (!dev || !device_active(dev))
+ return -EINVAL;
+
+ /* seq is valid since the device is active */
+ if (eth_get_ops(dev)->write_hwaddr && !eth_mac_skip(dev->seq)) {
+ if (!is_valid_ethaddr(pdata->enetaddr)) {
+ printf("\nError: %s address %pM illegal value\n",
+ dev->name, pdata->enetaddr);
+ return -EINVAL;
+ }
+
+ ret = eth_get_ops(dev)->write_hwaddr(dev);
+ if (ret)
+ printf("\nWarning: %s failed to set MAC address\n",
+ dev->name);
+ }
+
+ return ret;
+}
+
int eth_init(void)
{
struct udevice *current;
@@ -300,13 +325,22 @@ int eth_init(void)
if (device_active(current)) {
uchar env_enetaddr[6];
struct eth_pdata *pdata = current->platdata;
+ int enetaddr_changed = 0;
/* Sync environment with network device */
if (eth_getenv_enetaddr_by_index("eth", current->seq,
- env_enetaddr))
+ env_enetaddr)) {
+ enetaddr_changed = memcmp(pdata->enetaddr,
+ env_enetaddr, 6);
memcpy(pdata->enetaddr, env_enetaddr, 6);
- else
+ } else {
+ memset(env_enetaddr, 0, 6);
+ enetaddr_changed = memcmp(pdata->enetaddr,
+ env_enetaddr, 6);
memset(pdata->enetaddr, 0, 6);
+ }
+ if (enetaddr_changed)
+ eth_write_hwaddr(current);
ret = eth_get_ops(current)->start(current);
if (ret >= 0) {
@@ -401,31 +435,6 @@ int eth_rx(void)
return ret;
}
-static int eth_write_hwaddr(struct udevice *dev)
-{
- struct eth_pdata *pdata = dev->platdata;
- int ret = 0;
-
- if (!dev || !device_active(dev))
- return -EINVAL;
-
- /* seq is valid since the device is active */
- if (eth_get_ops(dev)->write_hwaddr && !eth_mac_skip(dev->seq)) {
- if (!is_valid_ethaddr(pdata->enetaddr)) {
- printf("\nError: %s address %pM illegal value\n",
- dev->name, pdata->enetaddr);
- return -EINVAL;
- }
-
- ret = eth_get_ops(dev)->write_hwaddr(dev);
- if (ret)
- printf("\nWarning: %s failed to set MAC address\n",
- dev->name);
- }
-
- return ret;
-}
-
int eth_initialize(void)
{
int num_devices = 0;
@@ -529,9 +538,15 @@ static int eth_post_probe(struct udevice *dev)
printf("\nWarning: %s using MAC address from ROM\n",
dev->name);
} else if (is_zero_ethaddr(pdata->enetaddr)) {
+#ifdef CONFIG_NET_RANDOM_ETHADDR
+ net_random_ethaddr(pdata->enetaddr);
+ printf("\nWarning: %s (eth%d) using random MAC address - %pM\n",
+ dev->name, dev->seq, pdata->enetaddr);
+#else
printf("\nError: %s address not set.\n",
dev->name);
return -EINVAL;
+#endif
}
return 0;
@@ -657,9 +672,15 @@ int eth_write_hwaddr(struct eth_device *dev, const char *base_name,
printf("\nWarning: %s using MAC address from net device\n",
dev->name);
} else if (is_zero_ethaddr(dev->enetaddr)) {
+#ifdef CONFIG_NET_RANDOM_ETHADDR
+ net_random_ethaddr(dev->enetaddr);
+ printf("\nWarning: %s (eth%d) using random MAC address - %pM\n",
+ dev->name, eth_number, dev->enetaddr);
+#else
printf("\nError: %s address not set.\n",
dev->name);
return -EINVAL;
+#endif
}
if (dev->write_hwaddr && !eth_mac_skip(eth_number)) {
@@ -834,10 +855,21 @@ int eth_init(void)
dev = eth_devices;
do {
uchar env_enetaddr[6];
+ int enetaddr_changed = 0;
if (eth_getenv_enetaddr_by_index("eth", dev->index,
- env_enetaddr))
+ env_enetaddr)) {
+ enetaddr_changed = memcmp(dev->enetaddr,
+ env_enetaddr, 6);
memcpy(dev->enetaddr, env_enetaddr, 6);
+ } else {
+ memset(env_enetaddr, 0, 6);
+ enetaddr_changed = memcmp(dev->enetaddr,
+ env_enetaddr, 6);
+ memset(dev->enetaddr, 0, 6);
+ }
+ if (enetaddr_changed)
+ eth_write_hwaddr(dev, "eth", dev->index);
dev = dev->next;
} while (dev != eth_devices);
OpenPOWER on IntegriCloud