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