1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Copyright (C) 2017 Microchip
4 * Wenyou Yang <wenyou.yang@microchip.com>
5 */
6
7 #include <common.h>
8 #include <dm.h>
9 #include <eeprom.h>
10 #include <env.h>
11 #include <i2c_eeprom.h>
12 #include <net.h>
13 #include <netdev.h>
14
at91_set_ethaddr(int offset)15 int at91_set_ethaddr(int offset)
16 {
17 const int ETH_ADDR_LEN = 6;
18 unsigned char ethaddr[ETH_ADDR_LEN];
19 const char *ETHADDR_NAME = "ethaddr";
20 struct udevice *dev;
21 int ret;
22
23 if (env_get(ETHADDR_NAME))
24 return 0;
25
26 ret = uclass_first_device_err(UCLASS_I2C_EEPROM, &dev);
27 if (ret)
28 return ret;
29
30 ret = i2c_eeprom_read(dev, offset, ethaddr, 6);
31 if (ret)
32 return ret;
33
34 if (is_valid_ethaddr(ethaddr))
35 eth_env_set_enetaddr(ETHADDR_NAME, ethaddr);
36
37 return 0;
38 }
39
40 /* this function will set eth1addr from a second eeprom, if available */
at91_set_eth1addr(int offset)41 int at91_set_eth1addr(int offset)
42 {
43 const int ETH_ADDR_LEN = 6;
44 unsigned char ethaddr[ETH_ADDR_LEN];
45 /* configure eth1addr for second interface */
46 const char *ETHADDR_NAME = "eth1addr";
47 struct udevice *dev;
48 int ret;
49
50 if (env_get(ETHADDR_NAME))
51 return 0;
52
53 /* first eeprom is retrieved, this is for the first interface */
54 ret = uclass_first_device_err(UCLASS_I2C_EEPROM, &dev);
55 if (ret)
56 return ret;
57
58 /* attempt to obtain a second eeprom device */
59 ret = uclass_next_device(&dev);
60 if (ret)
61 return ret;
62
63 ret = i2c_eeprom_read(dev, offset, ethaddr, 6);
64 if (ret)
65 return ret;
66
67 if (is_valid_ethaddr(ethaddr))
68 eth_env_set_enetaddr(ETHADDR_NAME, ethaddr);
69
70 return 0;
71 }
72