ethtool: Make sure advertise is actually set when autonegotiation is used

This commit is contained in:
Jan Janssen 2019-01-15 15:46:32 +01:00 committed by Zbigniew Jędrzejewski-Szmek
parent fb4986fa95
commit a0e1ad10ea
2 changed files with 7 additions and 5 deletions

View file

@ -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>

View file

@ -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));