Message ID | 20190520155957.22068-2-thierry.reding@gmail.com |
---|---|
State | Accepted |
Commit | 379af67ab3ba1a16e032c8d082fe85efa4bf21fe |
Delegated to: | Joe Hershberger |
Headers | show |
Series | [U-Boot,v4,1/2] net: eth-uclass: Write MAC address to hardware after probe | expand |
On Mon, May 20, 2019 at 05:59:57PM +0200, Thierry Reding wrote: > From: Thierry Reding <treding@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@ni.com> > Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com> > Signed-off-by: Thierry Reding <treding@nvidia.com> > --- > Changes in v4: > - do not clear MAC address on failure to avoid overwriting existing MAC > - fix build on xtensa (missing CONFIG_OF_CONTROL) > > 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 | 30 ++++++++- > 2 files changed, 93 insertions(+), 3 deletions(-) > create mode 100644 Documentation/devicetree/bindings/net/ethernet.txt Hi Joe, did you have a chance to look at this updated version? I've manually verified that the qemu-x86_64 test failure is no longer there and the build failure for xtensa is also gone. A fairly largish series for Tom's Tegra tree is currently blocked on this because without these two patches it will cause a test failure. Thierry > 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..031d55862583 100644 > --- a/net/eth-uclass.c > +++ b/net/eth-uclass.c > @@ -455,6 +455,26 @@ static int eth_pre_unbind(struct udevice *dev) > return 0; > } > > +static bool eth_dev_get_mac_address(struct udevice *dev, u8 mac[ARP_HLEN]) > +{ > +#if IS_ENABLED(CONFIG_OF_CONTROL) > + 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) > + return false; > + > + memcpy(mac, p, ARP_HLEN); > + > + return true; > +#else > + return false; > +#endif > +} > + > static int eth_post_probe(struct udevice *dev) > { > struct eth_device_priv *priv = dev->uclass_priv; > @@ -489,9 +509,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 >
On Tue, May 28, 2019 at 4:26 PM Thierry Reding <thierry.reding@gmail.com> wrote: > > On Mon, May 20, 2019 at 05:59:57PM +0200, Thierry Reding wrote: > > From: Thierry Reding <treding@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@ni.com> > > Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com> > > Signed-off-by: Thierry Reding <treding@nvidia.com> > > --- > > Changes in v4: > > - do not clear MAC address on failure to avoid overwriting existing MAC > > - fix build on xtensa (missing CONFIG_OF_CONTROL) > > > > 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 | 30 ++++++++- > > 2 files changed, 93 insertions(+), 3 deletions(-) > > create mode 100644 Documentation/devicetree/bindings/net/ethernet.txt > > Hi Joe, > > did you have a chance to look at this updated version? I've manually > verified that the qemu-x86_64 test failure is no longer there and the > build failure for xtensa is also gone. > > A fairly largish series for Tom's Tegra tree is currently blocked on > this because without these two patches it will cause a test failure. I've tested v2 of this series, I have on my list to rebase and test v4 later this week if that will help. Peter > Thierry > > > 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..031d55862583 100644 > > --- a/net/eth-uclass.c > > +++ b/net/eth-uclass.c > > @@ -455,6 +455,26 @@ static int eth_pre_unbind(struct udevice *dev) > > return 0; > > } > > > > +static bool eth_dev_get_mac_address(struct udevice *dev, u8 mac[ARP_HLEN]) > > +{ > > +#if IS_ENABLED(CONFIG_OF_CONTROL) > > + 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) > > + return false; > > + > > + memcpy(mac, p, ARP_HLEN); > > + > > + return true; > > +#else > > + return false; > > +#endif > > +} > > + > > static int eth_post_probe(struct udevice *dev) > > { > > struct eth_device_priv *priv = dev->uclass_priv; > > @@ -489,9 +509,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@lists.denx.de > https://lists.denx.de/listinfo/u-boot
On Tue, May 28, 2019 at 10:26 AM Thierry Reding <thierry.reding@gmail.com> wrote: > > On Mon, May 20, 2019 at 05:59:57PM +0200, Thierry Reding wrote: > > From: Thierry Reding <treding@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@ni.com> > > Reviewed-by: Grygorii Strashko <grygorii.strashko@ti.com> > > Signed-off-by: Thierry Reding <treding@nvidia.com> > > --- > > Changes in v4: > > - do not clear MAC address on failure to avoid overwriting existing MAC > > - fix build on xtensa (missing CONFIG_OF_CONTROL) > > > > 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 | 30 ++++++++- > > 2 files changed, 93 insertions(+), 3 deletions(-) > > create mode 100644 Documentation/devicetree/bindings/net/ethernet.txt > > Hi Joe, > > did you have a chance to look at this updated version? I've manually > verified that the qemu-x86_64 test failure is no longer there and the > build failure for xtensa is also gone. > > A fairly largish series for Tom's Tegra tree is currently blocked on > this because without these two patches it will cause a test failure. I'll be build testing this soon. Cheers, -Joe
Hi Thierry, https://patchwork.ozlabs.org/patch/1102110/ was applied to http://git.denx.de/?p=u-boot/u-boot-net.git Thanks! -Joe
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..031d55862583 100644 --- a/net/eth-uclass.c +++ b/net/eth-uclass.c @@ -455,6 +455,26 @@ static int eth_pre_unbind(struct udevice *dev) return 0; } +static bool eth_dev_get_mac_address(struct udevice *dev, u8 mac[ARP_HLEN]) +{ +#if IS_ENABLED(CONFIG_OF_CONTROL) + 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) + return false; + + memcpy(mac, p, ARP_HLEN); + + return true; +#else + return false; +#endif +} + static int eth_post_probe(struct udevice *dev) { struct eth_device_priv *priv = dev->uclass_priv; @@ -489,9 +509,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)) {