Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can u-boot support more than one ethernet port?

Tags:

u-boot

I want to ping out of multiple ethernet ports. Is there an inherent restriction where u-boot only supports a single ethernet port?

like image 828
tarabyte Avatar asked Feb 09 '23 23:02

tarabyte


1 Answers

Can u-boot support more than one ethernet port?

Yes, in recent versions of U-Boot (going back to at least 2012.10).
Salient code is eth_current_changed() and eth_set_current() in net/eth.c.

Is there an inherent restriction where u-boot only supports a single ethernet port?

No, recent versions of U-Boot can support more than one Ethernet port on the board.

When more than one Ethernet interface is available (as reported by the "Net" device list on startup, e.g. "Net: macb0, gmac0, usb_ether"), the environment variable ethact is used to define the selected Ethernet interface that is active.
Use the printenv ethact command to view the current selection.
Use the setenv ethact <port name> to change the active Ethernet port.

The U-Boot network commands, such as ping and tftpboot, will use the Ethernet port defined by the ethact variable. This preserves the command syntax with older versions of U-Boot, and the syntax is consistent regardless of the number of available ports (e.g. scripts do not change).

Each Ethernet port is assigned its own MAC address, using the following environment variables:

ethaddr: Ethernet MAC address for first/only ethernet interface (= eth0 in Linux).
         This variable can be set only once (usually during manufacturing of the board). U-Boot refuses to delete or overwrite this variable once it has been set.

eth1addr: Ethernet MAC address for second ethernet interface (= eth1 in Linux).

eth2addr: Ethernet MAC address for third ethernet interface (= eth2 in Linux).

Obviously you can only (easily) access one port at a time.
There is also only one static IP address assignment, i.e. the ipaddr environment variable.
(I don't know what happens with an IP address acquired by DHCP using one port, and then the active port is changed.)

U-Boot> printenv ethact
ethact=macb0
U-Boot> setenv ethact gmac0
U-Boot> ping 192.168.1.1
gmac0: PHY present at 7
gmac0: Starting autonegotiation...
gmac0: Autonegotiation complete
gmac0: link up, 1000Mbps full-duplex (lpa: 0x2800)
Using gmac0 device
host 192.168.1.1 is alive
U-Boot>

Note that there also a rotation scheme that automatically changes the active port when the ports are down:

U-Boot> printenv ethact
ethact=gmac0
U-Boot> ping 192.168.1.1
gmac0: PHY present at 7
gmac0: Starting autonegotiation...
gmac0: Autonegotiation timed out (status=0x7949)
gmac0: link down (status: 0x7949)
ERROR: Need valid 'usbnet_devaddr' to be set
at drivers/usb/gadget/ether.c:2362/usb_eth_init()
macb0: PHY present at 0
macb0:0 is connected to macb0.  Reconnecting to macb0
macb0: Starting autonegotiation...
macb0: Autonegotiation timed out (status=0x7849)
macb0: link up, 100Mbps full-duplex (lpa: 0x41e1)
Using macb0 device
ping failed; host 192.168.1.1 is not alive
U-Boot> printenv ethact
ethact=macb0
U-Boot> 
like image 129
sawdust Avatar answered May 16 '23 05:05

sawdust