meta-ampere: ampere-usbnet: Add delay and restart policy
When ampere-usbnet starts too soon, phosphor-networkd does not yet sync
the MAC address from inventory to u-boot, making ampere-usbnet fail.
This commit updates the service to restart 3 times, with a 5s delay
between restarts, on failure of invalid MAC or no MAC Address available.
Tested:
1. When FRU has valid MAC address, usb should be configured correctly:
[ 62.986382] configfs-gadget.usbnet gadget.0: HOST MAC 02:e2:84:8f:e3:56
[ 62.993978] configfs-gadget.usbnet gadget.0: MAC 06:e2:84:8f:e3:56
- Check MAC Address using ifconfig:
root@mtmitchell:~# ifconfig usb0 | grep HWaddr
usb0 Link encap:Ethernet HWaddr 06:E2:84:8F:E3:56
2. When FRU has invalid MAC address, usb should be configured with a
random MAC address after three restarts:
[ 63.417629] configfs-gadget.usbnet gadget.0: HOST MAC 02:c2:49:a6:09:3b
[ 63.425133] configfs-gadget.usbnet gadget.0: MAC 06:c2:49:a6:09:3b
[ 69.017538] configfs-gadget.usbnet gadget.0: HOST MAC 02:c2:49:a6:09:3b
[ 69.025012] configfs-gadget.usbnet gadget.0: MAC 06:c2:49:a6:09:3b
[ 74.530780] configfs-gadget.usbnet gadget.0: HOST MAC 02:c2:49:a6:09:3b
[ 74.538353] configfs-gadget.usbnet gadget.0: MAC 06:c2:49:a6:09:3b
- Check MAC Address using ifconfig:
root@mtmitchell:~# ifconfig usb0 | grep HWaddr
usb0 Link encap:Ethernet HWaddr 06:C2:49:A6:09:3B
- u-boot env should be unset:
root@mtmitchell:~# fw_printenv -n ethaddr
## Error: "ethaddr" not defined
Change-Id: If10045485bfd8d6803d6df305805924284740889
Signed-off-by: Khang Nguyen <khangng@amperecomputing.com>
Signed-off-by: Thang Q. Nguyen <thang@os.amperecomputing.com>
diff --git a/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere-usbnet.service b/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere-usbnet.service
index 3499543..461d423 100644
--- a/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere-usbnet.service
+++ b/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere-usbnet.service
@@ -1,12 +1,14 @@
[Unit]
Description=Ampere Ethernet over USB gadget device
-After=phosphor-ipmi-host.service
+After=multi-user.target
+StartLimitIntervalSec=20
+StartLimitBurst=3
[Service]
-Type=oneshot
-RemainAfterExit=yes
ExecStart=/usr/sbin/ampere_usbnet.sh
-ExecStop=/usr/bin/usb-ctrl ecm usbnet off
+Restart=on-failure
+RestartMode=direct
+RestartSec=5
[Install]
WantedBy=multi-user.target
diff --git a/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere_usbnet.sh b/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere_usbnet.sh
index ca9357f..fb886c2 100644
--- a/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere_usbnet.sh
+++ b/meta-ampere/meta-common/recipes-ampere/network/ampere-usbnet/ampere_usbnet.sh
@@ -1,18 +1,22 @@
#!/bin/bash
-ENV_MAC_ADDR=$(fw_printenv ethaddr eth1addr)
+# Get MAC Address from uboot, or fallback to a random
+ENV_MAC_ADDR=
+ENV_MAC_ADDR=${ENV_MAC_ADDR:-"$(fw_printenv -n ethaddr)"}
+ENV_MAC_ADDR=${ENV_MAC_ADDR:-"$(fw_printenv -n eth1addr)"}
+MAC_ADDR=${ENV_MAC_ADDR:-"F8:C2:49:A6:09:3B"}
-MAC_ADDR=$(echo "$ENV_MAC_ADDR" | cut -d "=" -f 2)
-
-if [ -n "$MAC_ADDR" ]; then
- # Generate MAC Address from eth1addr using locally administered MAC
- # https://en.wikipedia.org/wiki/MAC_address#Universal_vs._local_(U/L_bit
- SUBMAC=$(echo "$MAC_ADDR" | cut -d ":" -f 2-6)
- /usr/bin/usb-ctrl ecm usbnet on "06:$SUBMAC" "02:$SUBMAC"
-else
- /usr/bin/usb-ctrl ecm usbnet on
-fi
+# Generate MAC Address using locally administered MAC
+# https://en.wikipedia.org/wiki/MAC_address#Universal_vs._local_(U/L_bit
+SUBMAC=$(echo "$MAC_ADDR" | cut -d ":" -f 2-5)
+/usr/bin/usb-ctrl ecm usbnet off
+/usr/bin/usb-ctrl ecm usbnet on "06:$SUBMAC:01" "06:$SUBMAC:00"
# Use NCM (Ethernet) Gadget instead of FunctionFS Gadget
echo 0x0103 > /sys/kernel/config/usb_gadget/usbnet/idProduct
echo "OpenBMC usbnet Device" > /sys/kernel/config/usb_gadget/usbnet/strings/0x409/product
+
+if [ "$MAC_ADDR" != "$ENV_MAC_ADDR" ]; then
+ # fail and wait for systemd to restart this service
+ exit 1
+fi