diff --git a/doc/net.example.Linux.in b/doc/net.example.Linux.in index 0ee83a6e..d48983ee 100644 --- a/doc/net.example.Linux.in +++ b/doc/net.example.Linux.in @@ -1102,6 +1102,16 @@ # # ${IFACE} is set to the interface being brought up/down # ${IFVAR} is ${IFACE} converted to variable name bash allows +# +# For historical & compatbility reasons, preup is actually normally called in +# the follow sequence: up ; preup ; up +# In that case, the first up causes the kernel to initialize the device, so +# that it is available for use in the preup function. However, for some other +# hardware, eg CAN devices, some configuration is needed before trying to up +# the interface will actually work. For such harware, there are the +# 'up_before_preup' variables, that skips the first up call. +#up_before_preup_IFVAR=no +#up_before_preup=no #preup() { # # Test for link on the interface prior to bringing it up. This diff --git a/init.d/net.lo.in b/init.d/net.lo.in index ae07b52f..02d11a82 100644 --- a/init.d/net.lo.in +++ b/init.d/net.lo.in @@ -488,7 +488,9 @@ start() { local IFACE=${RC_SVCNAME#*.} oneworked=false fallback=false module= local IFVAR=$(shell_var "${IFACE}") cmd= our_metric= - local metric=0 + local metric=0 _up_before_preup + eval _up_before_preup="\$up_before_preup_${IFVAR}" + [ -z "${_up_before_preup}" ] && _up_before_preup=$up_before_preup einfo "Bringing up interface ${IFACE}" eindent @@ -502,7 +504,7 @@ start() # available in preup and afterwards incase the user inadvertently # brings it down if [ "$(command -v preup)" = "preup" ]; then - _up 2>/dev/null + [ "${_up_before_preup}" = "no" ] || _up 2>/dev/null ebegin "Running preup" eindent preup || return 1