diff options
-rw-r--r-- | man/systemd.link.xml | 6 | ||||
-rw-r--r-- | src/udev/net/ethtool-util.c | 6 |
2 files changed, 7 insertions, 5 deletions
diff --git a/man/systemd.link.xml b/man/systemd.link.xml index f74edd0186..ec0314dec3 100644 --- a/man/systemd.link.xml +++ b/man/systemd.link.xml @@ -369,8 +369,8 @@ common transmission parameters, such as speed, duplex mode, and flow control. When unset, the kernel's default will be used.</para> - <para>Note that if autonegotiation is enabled, speed, duplex and advertise settings are - read-only. If autonegotation is disabled, speed, duplex and advertise settings are writable + <para>Note that if autonegotiation is enabled, speed and duplex settings are + read-only. If autonegotation is disabled, speed and duplex settings are writable if the driver supports multiple link modes.</para> </listitem> </varlistentry> @@ -481,7 +481,7 @@ <term><varname>Advertise=</varname></term> <listitem> <para>This sets what speeds and duplex modes of operation are advertised for auto-negotiation. - The supported values are: + This implies <literal>AutoNegotiation=yes</literal>. The supported values are: <table> <title>Supported advertise values</title> diff --git a/src/udev/net/ethtool-util.c b/src/udev/net/ethtool-util.c index a1eb6902aa..0dcec03f67 100644 --- a/src/udev/net/ethtool-util.c +++ b/src/udev/net/ethtool-util.c @@ -583,7 +583,7 @@ int ethtool_set_glinksettings(int *fd, const char *ifname, struct link_config *l struct ifreq ifr = {}; int r; - if (link->autonegotiation != 0) { + if (link->autonegotiation != AUTONEG_DISABLE && eqzero(link->advertise)) { log_info("link_config: autonegotiation is unset or enabled, the speed and duplex are not writable."); return 0; } @@ -612,9 +612,11 @@ int ethtool_set_glinksettings(int *fd, const char *ifname, struct link_config *l if (link->port != _NET_DEV_PORT_INVALID) u->base.port = link->port; - u->base.autoneg = link->autonegotiation; + if (link->autonegotiation >= 0) + u->base.autoneg = link->autonegotiation; if (!eqzero(link->advertise)) { + u->base.autoneg = AUTONEG_ENABLE; memcpy(&u->link_modes.advertising, link->advertise, sizeof(link->advertise)); memzero((uint8_t*) &u->link_modes.advertising + sizeof(link->advertise), ETHTOOL_LINK_MODE_MASK_MAX_KERNEL_NBYTES - sizeof(link->advertise)); |