aboutsummaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorOleksandr Tymoshenko <gonzo@FreeBSD.org>2017-10-27 21:22:38 +0000
committerOleksandr Tymoshenko <gonzo@FreeBSD.org>2017-10-27 21:22:38 +0000
commite13043513912edb902a698f63b047722a5e32b64 (patch)
tree64de117b934a3494eef4bc734f9d925900841fab /sys
parent8448a47dcbf80f15aa9e649b86aa13484013b975 (diff)
Notes
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/usb/net/if_smsc.c62
1 files changed, 39 insertions, 23 deletions
diff --git a/sys/dev/usb/net/if_smsc.c b/sys/dev/usb/net/if_smsc.c
index 4fe9dea1e493..1b4c2e353740 100644
--- a/sys/dev/usb/net/if_smsc.c
+++ b/sys/dev/usb/net/if_smsc.c
@@ -1637,6 +1637,37 @@ smsc_fdt_find_eth_node_by_path(phandle_t start)
return (-1);
}
+/*
+ * Look through known names that can contain mac address
+ * return 0 if valid MAC address has been found
+ */
+static int
+smsc_fdt_read_mac_property(phandle_t node, unsigned char *mac)
+{
+ int len;
+
+ /* Check if there is property */
+ if ((len = OF_getproplen(node, "local-mac-address")) > 0) {
+ if (len != ETHER_ADDR_LEN)
+ return (EINVAL);
+
+ OF_getprop(node, "local-mac-address", mac,
+ ETHER_ADDR_LEN);
+ return (0);
+ }
+
+ if ((len = OF_getproplen(node, "mac-address")) > 0) {
+ if (len != ETHER_ADDR_LEN)
+ return (EINVAL);
+
+ OF_getprop(node, "mac-address", mac,
+ ETHER_ADDR_LEN);
+ return (0);
+ }
+
+ return (ENXIO);
+}
+
/**
* Get MAC address from FDT blob. Firmware or loader should fill
* mac-address or local-mac-address property. Returns 0 if MAC address
@@ -1646,37 +1677,22 @@ static int
smsc_fdt_find_mac(unsigned char *mac)
{
phandle_t node, root;
- int len;
root = OF_finddevice("/");
node = smsc_fdt_find_eth_node(root);
+ if (node != -1) {
+ if (smsc_fdt_read_mac_property(node, mac) == 0)
+ return (0);
+ }
+
/*
* If it's not FreeBSD FDT blob for RPi, try more
* generic .../usb/hub/ethernet
*/
- if (node == -1)
- node = smsc_fdt_find_eth_node_by_path(root);
-
- if (node != -1) {
- /* Check if there is property */
- if ((len = OF_getproplen(node, "local-mac-address")) > 0) {
- if (len != ETHER_ADDR_LEN)
- return (EINVAL);
-
- OF_getprop(node, "local-mac-address", mac,
- ETHER_ADDR_LEN);
- return (0);
- }
+ node = smsc_fdt_find_eth_node_by_path(root);
- if ((len = OF_getproplen(node, "mac-address")) > 0) {
- if (len != ETHER_ADDR_LEN)
- return (EINVAL);
-
- OF_getprop(node, "mac-address", mac,
- ETHER_ADDR_LEN);
- return (0);
- }
- }
+ if (node != -1)
+ return smsc_fdt_read_mac_property(node, mac);
return (ENXIO);
}