ethtool: Make sure advertise is actually set when autonegotiation is used
This commit is contained in:
parent
fb4986fa95
commit
a0e1ad10ea
|
@ -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>
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in a new issue