summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--man/systemd.link.xml6
-rw-r--r--src/udev/net/ethtool-util.c6
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));