From: Jan Janssen Date: Tue, 15 Jan 2019 14:46:32 +0000 (+0100) Subject: ethtool: Make sure advertise is actually set when autonegotiation is used X-Git-Tag: v241~119 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a0e1ad10eab7324637d5cbbc6ca2e89e5d826137;p=platform%2Fupstream%2Fsystemd.git ethtool: Make sure advertise is actually set when autonegotiation is used --- diff --git a/man/systemd.link.xml b/man/systemd.link.xml index f74edd0..ec0314d 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. - 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 + 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. @@ -481,7 +481,7 @@ Advertise= This sets what speeds and duplex modes of operation are advertised for auto-negotiation. - The supported values are: + This implies AutoNegotiation=yes. The supported values are: Supported advertise values diff --git a/src/udev/net/ethtool-util.c b/src/udev/net/ethtool-util.c index a1eb690..0dcec03 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));