]>
Commit | Line | Data |
---|---|---|
386f921c PO |
1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* | |
3 | * Copyright 2022 Marek Vasut <marex@denx.de> | |
4 | * Copyright 2022 DENX Software Engineering GmbH, Philip Oberfichtner <pro@denx.de> | |
5 | */ | |
6 | ||
d678a59d | 7 | #include <common.h> |
386f921c PO |
8 | #include <dm.h> |
9 | #include <i2c_eeprom.h> | |
10 | #include <net.h> | |
11 | ||
12 | #include "dh_common.h" | |
13 | ||
14 | bool dh_mac_is_in_env(const char *env) | |
15 | { | |
16 | unsigned char enetaddr[6]; | |
17 | ||
18 | return eth_env_get_enetaddr(env, enetaddr); | |
19 | } | |
20 | ||
786af90d MV |
21 | int dh_get_mac_is_enabled(const char *alias) |
22 | { | |
23 | ofnode node = ofnode_path(alias); | |
24 | ||
25 | if (!ofnode_valid(node)) | |
26 | return -EINVAL; | |
27 | ||
28 | if (!ofnode_is_enabled(node)) | |
29 | return -ENODEV; | |
30 | ||
31 | return 0; | |
32 | } | |
33 | ||
386f921c PO |
34 | int dh_get_mac_from_eeprom(unsigned char *enetaddr, const char *alias) |
35 | { | |
36 | struct udevice *dev; | |
37 | int ret; | |
38 | ofnode node; | |
39 | ||
40 | node = ofnode_path(alias); | |
41 | if (!ofnode_valid(node)) { | |
42 | printf("%s: ofnode for %s not found!", __func__, alias); | |
43 | return -ENOENT; | |
44 | } | |
45 | ||
46 | ret = uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, node, &dev); | |
47 | if (ret) { | |
48 | printf("%s: Cannot find EEPROM! ret = %d\n", __func__, ret); | |
49 | return ret; | |
50 | } | |
51 | ||
52 | ret = i2c_eeprom_read(dev, 0xfa, enetaddr, 0x6); | |
53 | if (ret) { | |
54 | printf("%s: Error reading EEPROM! ret = %d\n", __func__, ret); | |
55 | return ret; | |
56 | } | |
57 | ||
58 | if (!is_valid_ethaddr(enetaddr)) { | |
59 | printf("%s: Address read from EEPROM is invalid!\n", __func__); | |
60 | return -EINVAL; | |
61 | } | |
62 | ||
63 | return 0; | |
64 | } | |
65 | ||
66 | __weak int dh_setup_mac_address(void) | |
67 | { | |
68 | unsigned char enetaddr[6]; | |
69 | ||
70 | if (dh_mac_is_in_env("ethaddr")) | |
71 | return 0; | |
72 | ||
786af90d MV |
73 | if (dh_get_mac_is_enabled("ethernet0")) |
74 | return 0; | |
75 | ||
386f921c PO |
76 | if (!dh_get_mac_from_eeprom(enetaddr, "eeprom0")) |
77 | return eth_env_set_enetaddr("ethaddr", enetaddr); | |
78 | ||
79 | printf("%s: Unable to set mac address!\n", __func__); | |
80 | return -ENXIO; | |
81 | } |