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