[PATCH] [SRU][X/raspi2] RaspberryPi3+: read ethernet mac adress from device tree

Paolo Pisati paolo.pisati at canonical.com
Thu Oct 18 13:24:13 UTC 2018


BugLink: http://bugs.launchpad.net/bugs/1798578

Impact:

The RaspberryPi3+ board came with an usb's to ethernet lan78xx nic adapter -
this chip has no external eeprom, nor internal preprogrammed mac address and
as such, after every reboot, it generates a random ethernet mac address.

The lan78xx driver is able to read its mac address from the device tree passed
to the kernel (see d093067 "lan78xx: Read MAC address from DT if present"),
making it possible to have reproducible/fixed mac addresses, but unfortunately
this feature isn't working in our Xenial/raspi2 kernel (while it's working fine
in Bionc/raspi2).

After some debugging i found that the usb_net struct backing the lan78xx
driver, had no clue about the dt node it was associated, making this piece of
code constantly evaluates to NULL:

static void lan78xx_init_mac_address(struct lan78xx_net *dev)
...
mac_addr = of_get_mac_address(dev->udev->dev.of_node);
...

There "of_node" was always NULL.

After more debugging, i found that the feature to bind usb_net devices and
device tree nodes was introduced in the Linux 4.6 cycle, and as such Xenial
didn't have it.

Fix:

Apply the patch and recompile

How to test:

Upon boot of the RaspberryPi3+ board (and after the dtb has been loaded into
memory), stop at the uboot prompt and check the usbeether device node:

U-Boot> fdt print /soc/usb/usb1 at 1/usb1_1 at 1/usbether at 1
usbether at 1 {
        local-mac-address = [b8 27 eb ce 07 ba];
        compatible = "usb424,7800";
        reg = <0x00000001>;
        microchip,eee-enabled;
        microchip,tx-lpi-timer = <0x00000258>;
        phandle = <0x00000024>;
};

the "local-mac-address" has been filled by the Broadcom bootloader, and
contains the lan78xx's mac address.

Then proceed with the boot routine, read the user prompt, and check eth0's mac
address:

$ ifconfig eth0 | grep HWaddr eth0 Link encap:Ethernet HWaddr b8:27:eb:ce:07:ba

If it's the same as above, the fix worked.

Regression:

The patch has been in upstream since v4.6-rc1, and it changes a very small
portion of code, so i'll say it's regression potential is very low / none.

Peter Chen (1):
  USB: core: let USB device know device node

 .../devicetree/bindings/usb/usb-device.txt         | 28 +++++++++++++
 drivers/usb/core/Makefile                          |  2 +-
 drivers/usb/core/of.c                              | 47 ++++++++++++++++++++++
 drivers/usb/core/usb.c                             | 10 +++++
 include/linux/usb/of.h                             |  7 ++++
 5 files changed, 93 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/usb/usb-device.txt
 create mode 100644 drivers/usb/core/of.c

-- 
2.7.4





More information about the kernel-team mailing list