Some cards are slow to get the connection link up after the
"rtifconfig rteth0 up" command, e.g. on an Atom-x5 with an Intel I210
(rt_igb driver) I detected approximately 3 seconds to get the link up.

On master, the "rtifconfig rteth0 up" is followed by TDMA configuration and
start. After the TDMA start, the sync packet is sent at the defined cycle time.

Sometimes, after "rtnet start", the dmesg fills with this error:

  TDMA: Failed to transmit sync frame!

and the rt driver locks. Then, the kernel watchdog is triggered and the
NIC is hw-reset by the kernel, producing more errors and another lock.
Sometimes the dmesg only fills with the error message and the NIC does
not lock.
This happens because the interface is not up and ready to handle
the sync packets when TDMA is started.

This patch introduces a configurable delay between the "rtifconfig rteth0 up" and the TDMA start on master host. This allows to avoid these kind of problems.

Signed-off-by: Mauro Salvini <mau.sa...@tin.it>
---
 utils/net/rtnet.in | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/utils/net/rtnet.in b/utils/net/rtnet.in
index f81a7bb0a..8c2dcdf6e 100644
--- a/utils/net/rtnet.in
+++ b/utils/net/rtnet.in
@@ -15,15 +15,19 @@ debug_func() {
 usage() {
     cat << EOF
 Usage:
-    $0 [-cf <config-file>] [-v] [-c] {start|stop}
+    $0 [-cf <config-file>] [-d <delay>] [-v] [-c] {start|stop}
        Start or stop station according to configuration file

-    $0 [-cf <config-file>] [-v] [-c] master <slave_ip1> [<slave_ip2> ...]
+ $0 [-cf <config-file>] [-d <delay>] [-v] [-c] master <slave_ip1> [<slave_ip2> ...]
        Start station as master for given list of slaves

     $0 [-cf <config-file>] [-v] capture
        Start only passive realtime capturing

+    The parameter -d allows to introduce a delay in seconds between the
+       "rtifconfig rtethX up" command and the TDMA start on the host
+       configured as master. Useful to avoid errors/card locks when the
+       RT NIC is slow to get the link up.
     The additional switch -v enables verbose output.
The additional switch -c enables capturing mode to allow use of a network
        analyzer such as Wireshark (if rtnet was built with --enable-rtcap).
@@ -76,6 +80,10 @@ submit_cfg() {
        master)
            $RTIFCONFIG rteth0 up $STATION_IP

+           if [ -n "$UPDELAY" ]; then
+               sleep $UPDELAY
+           fi
+
            $TDMACFG rteth0 master $TDMA_CYCLE
            eval "$TDMA_SLOTS"

@@ -144,6 +152,10 @@ start_master() {

        $RTIFCONFIG rteth0 up $IPADDR $NETMASK_OPT

+       if [ -n "$UPDELAY" ]; then
+           sleep $UPDELAY
+       fi
+
        $TDMACFG rteth0 master $TDMA_CYCLE
        $TDMACFG rteth0 slot 0 0

@@ -258,6 +270,11 @@ else
     exit 1
 fi

+if [ "$1" = "-d" ]; then
+    UPDELAY="$2"
+    shift 2
+fi
+
 if [ "$1" = "-v" ]; then
     echo "Turning on verbose mode"
     RTIFCONFIG="debug_func $RTIFCONFIG"
--
2.17.1

Reply via email to