[U-Boot] [PATCH v3 2/2] net: eth-uclass: Support device tree MAC addresses
Joe Hershberger
joe.hershberger at ni.com
Wed May 15 18:33:39 UTC 2019
On Thu, Apr 25, 2019 at 10:50 AM Thierry Reding
<thierry.reding at gmail.com> wrote:
>
> From: Thierry Reding <treding at nvidia.com>
>
> Add the standard Ethernet device tree bindings (imported from v5.0 of
> the Linux kernel) and implement support for reading the MAC address for
> Ethernet devices in the Ethernet uclass. If the "mac-address" property
> exists, the MAC address will be parsed from that. If that property does
> not exist, the "local-mac-address" property will be tried as fallback.
>
> MAC addresses from device tree take precedence over the ones stored in
> a network interface card's ROM.
>
> Acked-by: Joe Hershberger <joe.hershberger at ni.com>
> Signed-off-by: Thierry Reding <treding at nvidia.com>
This seems to introduce a few build failures.
https://travis-ci.org/jhershbe/u-boot/builds/532478716
Please have a look and submit a v4.
Thanks,
-Joe
> ---
> Changes in v3:
> - add additional check to make sure the MAC address read from device
> tree is a valid MAC address
>
> Changes in v2:
> - use dev_read_u8_array_ptr()
>
> .../devicetree/bindings/net/ethernet.txt | 66 +++++++++++++++++++
> net/eth-uclass.c | 27 +++++++-
> 2 files changed, 90 insertions(+), 3 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/net/ethernet.txt
>
> diff --git a/Documentation/devicetree/bindings/net/ethernet.txt b/Documentation/devicetree/bindings/net/ethernet.txt
> new file mode 100644
> index 000000000000..cfc376bc977a
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/net/ethernet.txt
> @@ -0,0 +1,66 @@
> +The following properties are common to the Ethernet controllers:
> +
> +NOTE: All 'phy*' properties documented below are Ethernet specific. For the
> +generic PHY 'phys' property, see
> +Documentation/devicetree/bindings/phy/phy-bindings.txt.
> +
> +- local-mac-address: array of 6 bytes, specifies the MAC address that was
> + assigned to the network device;
> +- mac-address: array of 6 bytes, specifies the MAC address that was last used by
> + the boot program; should be used in cases where the MAC address assigned to
> + the device by the boot program is different from the "local-mac-address"
> + property;
> +- nvmem-cells: phandle, reference to an nvmem node for the MAC address;
> +- nvmem-cell-names: string, should be "mac-address" if nvmem is to be used;
> +- max-speed: number, specifies maximum speed in Mbit/s supported by the device;
> +- max-frame-size: number, maximum transfer unit (IEEE defined MTU), rather than
> + the maximum frame size (there's contradiction in the Devicetree
> + Specification).
> +- phy-mode: string, operation mode of the PHY interface. This is now a de-facto
> + standard property; supported values are:
> + * "internal"
> + * "mii"
> + * "gmii"
> + * "sgmii"
> + * "qsgmii"
> + * "tbi"
> + * "rev-mii"
> + * "rmii"
> + * "rgmii" (RX and TX delays are added by the MAC when required)
> + * "rgmii-id" (RGMII with internal RX and TX delays provided by the PHY, the
> + MAC should not add the RX or TX delays in this case)
> + * "rgmii-rxid" (RGMII with internal RX delay provided by the PHY, the MAC
> + should not add an RX delay in this case)
> + * "rgmii-txid" (RGMII with internal TX delay provided by the PHY, the MAC
> + should not add an TX delay in this case)
> + * "rtbi"
> + * "smii"
> + * "xgmii"
> + * "trgmii"
> + * "2000base-x",
> + * "2500base-x",
> + * "rxaui"
> + * "xaui"
> + * "10gbase-kr" (10GBASE-KR, XFI, SFI)
> +- phy-connection-type: the same as "phy-mode" property but described in the
> + Devicetree Specification;
> +- phy-handle: phandle, specifies a reference to a node representing a PHY
> + device; this property is described in the Devicetree Specification and so
> + preferred;
> +- phy: the same as "phy-handle" property, not recommended for new bindings.
> +- phy-device: the same as "phy-handle" property, not recommended for new
> + bindings.
> +- rx-fifo-depth: the size of the controller's receive fifo in bytes. This
> + is used for components that can have configurable receive fifo sizes,
> + and is useful for determining certain configuration settings such as
> + flow control thresholds.
> +- tx-fifo-depth: the size of the controller's transmit fifo in bytes. This
> + is used for components that can have configurable fifo sizes.
> +- managed: string, specifies the PHY management type. Supported values are:
> + "auto", "in-band-status". "auto" is the default, it usess MDIO for
> + management if fixed-link is not specified.
> +
> +Child nodes of the Ethernet controller are typically the individual PHY devices
> +connected via the MDIO bus (sometimes the MDIO bus controller is separate).
> +They are described in the phy.txt file in this same directory.
> +For non-MDIO PHY management see fixed-link.txt.
> diff --git a/net/eth-uclass.c b/net/eth-uclass.c
> index 4225aabf1fa1..28a82d7fc8d3 100644
> --- a/net/eth-uclass.c
> +++ b/net/eth-uclass.c
> @@ -455,6 +455,23 @@ static int eth_pre_unbind(struct udevice *dev)
> return 0;
> }
>
> +static bool eth_dev_get_mac_address(struct udevice *dev, u8 mac[ARP_HLEN])
> +{
> + const uint8_t *p;
> +
> + p = dev_read_u8_array_ptr(dev, "mac-address", ARP_HLEN);
> + if (!p)
> + p = dev_read_u8_array_ptr(dev, "local-mac-address", ARP_HLEN);
> +
> + if (!p) {
> + memset(mac, 0, ARP_HLEN);
> + return false;
> + }
> +
> + memcpy(mac, p, ARP_HLEN);
> + return true;
> +}
> +
> static int eth_post_probe(struct udevice *dev)
> {
> struct eth_device_priv *priv = dev->uclass_priv;
> @@ -489,9 +506,13 @@ static int eth_post_probe(struct udevice *dev)
>
> priv->state = ETH_STATE_INIT;
>
> - /* Check if the device has a MAC address in ROM */
> - if (eth_get_ops(dev)->read_rom_hwaddr)
> - eth_get_ops(dev)->read_rom_hwaddr(dev);
> + /* Check if the device has a valid MAC address in device tree */
> + if (!eth_dev_get_mac_address(dev, pdata->enetaddr) ||
> + !is_valid_ethaddr(pdata->enetaddr)) {
> + /* Check if the device has a MAC address in ROM */
> + if (eth_get_ops(dev)->read_rom_hwaddr)
> + eth_get_ops(dev)->read_rom_hwaddr(dev);
> + }
>
> eth_env_get_enetaddr_by_index("eth", dev->seq, env_enetaddr);
> if (!is_zero_ethaddr(env_enetaddr)) {
> --
> 2.21.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> https://lists.denx.de/listinfo/u-boot
More information about the U-Boot
mailing list