From: Simon Horman <horms@kernel.org>
To: "Abdul Rahim, Faizal" <faizal.abdul.rahim@linux.intel.com>
Cc: khai.wen.tan@linux.intel.com, anthony.l.nguyen@intel.com,
przemyslaw.kitszel@intel.com, andrew+netdev@lunn.ch,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, intel-wired-lan@lists.osuosl.org,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
faizal.abdul.rahim@intel.com, hong.aun.looi@intel.com,
khai.wen.tan@intel.com
Subject: Re: [Intel-wired-lan] [PATCH iwl-next v2 3/3] igc: add support for forcing link speed without autonegotiation
Date: Mon, 20 Apr 2026 16:35:20 +0100 [thread overview]
Message-ID: <20260420153520.GR280379@horms.kernel.org> (raw)
In-Reply-To: <3481ae84-5c36-4591-94c1-78b70fff4d7b@linux.intel.com>
On Mon, Apr 20, 2026 at 11:20:07AM +0800, Abdul Rahim, Faizal wrote:
>
>
> On 19/4/2026 12:48 am, Simon Horman wrote:
> > From: 'Simon Horman' <horms@kernel.org>
> >
> > This is an AI-generated review of your patch. The human sending this
> > email has considered the AI review valid, or at least plausible.
> > Full review at: https://sashiko.dev
> > ---
> > igc: add support for forcing link speed without autonegotiation
> >
> > This commit adds support to allow users to force 10/100 Mb/s link speed
> > and duplex via ethtool when autonegotiation is disabled.
> >
> > > diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c
> > > index cfcbf2fdad6ea..5bd37d1be1688 100644
> > > --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c
> > > +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c
> >
> > [ ... ]
> >
> > > @@ -2000,6 +2013,41 @@ static int igc_ethtool_get_link_ksettings(struct net_device *netdev,
> > > return 0;
> > > }
> > > +/**
> > > + * igc_handle_autoneg_disabled - Configure forced speed/duplex settings
> > > + * @adapter: private driver structure
> > > + * @speed: requested speed (must be SPEED_10 or SPEED_100)
> > > + * @duplex: requested duplex
> > > + *
> > > + * Records forced speed/duplex when autoneg is disabled.
> > > + * Caller must validate speed before calling this function.
> > > + */
> > > +static void igc_handle_autoneg_disabled(struct igc_adapter *adapter, u32 speed,
> > > + u8 duplex)
> > > +{
> > > + struct igc_mac_info *mac = &adapter->hw.mac;
> > > +
> > > + switch (speed) {
> > > + case SPEED_10:
> > > + mac->forced_speed_duplex = (duplex == DUPLEX_FULL) ?
> > > + IGC_FORCED_10F : IGC_FORCED_10H;
> > > + break;
> > > + case SPEED_100:
> > > + mac->forced_speed_duplex = (duplex == DUPLEX_FULL) ?
> > > + IGC_FORCED_100F : IGC_FORCED_100H;
> > > + break;
> > > + default:
> > > + WARN_ONCE(1, "Unsupported speed %u\n", speed);
> > > + return;
> > > + }
> > > +
> > > + mac->autoneg_enabled = false;
> > > +
> > > + /* Half-duplex cannot support flow control per IEEE 802.3 */
> > > + if (duplex == DUPLEX_HALF)
> > > + adapter->hw.fc.requested_mode = igc_fc_none;
> > > +}
> >
> > If userspace issues an ethtool command without specifying duplex, the duplex
> > value can be DUPLEX_UNKNOWN. In this case, forced_speed_duplex correctly
> > defaults to half-duplex since duplex == DUPLEX_FULL evaluates to false.
> >
> > However, since DUPLEX_UNKNOWN is not equal to DUPLEX_HALF, the check above
> > fails, and the requested flow control mode remains unchanged. Could this leave
> > flow control enabled on a forced half-duplex link, violating IEEE 802.3?
> > Should this check be based on the resolved mac->forced_speed_duplex state
> > instead?
> >
>
> You're right, thanks for pointing that out.
>
> That said, it feels simpler to address it with [1]:
> if (duplex != DUPLEX_FULL)
> adapter->hw.fc.requested_mode = igc_fc_none;
>
> Rather than [2]:
> if (mac->forced_speed_duplex == IGC_FORCED_10H ||
> mac->forced_speed_duplex == IGC_FORCED_100H)
> adapter->hw.fc.requested_mode = igc_fc_none;
>
> Are you okay with [1] ?
Yes, [1] sounds sensible to me.
>
> > [ ... ]
> >
> > > @@ -2071,14 +2120,20 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
> > > }
> > > }
> > > + if (cmd->base.autoneg == AUTONEG_DISABLE &&
> > > + cmd->base.speed != SPEED_10 && cmd->base.speed != SPEED_100) {
> > > + netdev_info(dev, "Unsupported speed for forced link\n");
> > > + return -EINVAL;
> > > + }
> > > +
> > > while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
> > > usleep_range(1000, 2000);
> >
> > This isn't a bug introduced by this patch, but does this ad-hoc
> > synchronization using bit flags circumvent proper locking guarantees? The
> > networking subsystem guidelines forbid using bit flags as ad-hoc locks.
> >
> > Using a bit flag in a polling loop bypasses lockdep analysis, fairness, and
> > strict memory ordering. Could this be replaced with a real synchronization
> > mechanism like a mutex?
>
> It looks like a worthwhile cleanup. However, it likely doesn’t belong in
> this series, since the synchronization pattern predates these patches and is
> used throughout the igc driver (set_ringparam, set_pauseparam, set_channels,
> etc.). We could address it in different patch series and align the other
> code paths at the same time ?
Yes, agreed.
WARNING: multiple messages have this Message-ID (diff)
From: Simon Horman <horms@kernel.org>
To: "Abdul Rahim, Faizal" <faizal.abdul.rahim@linux.intel.com>
Cc: khai.wen.tan@linux.intel.com, anthony.l.nguyen@intel.com,
przemyslaw.kitszel@intel.com, andrew+netdev@lunn.ch,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, intel-wired-lan@lists.osuosl.org,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
faizal.abdul.rahim@intel.com, hong.aun.looi@intel.com,
khai.wen.tan@intel.com
Subject: Re: [PATCH iwl-next v2 3/3] igc: add support for forcing link speed without autonegotiation
Date: Mon, 20 Apr 2026 16:35:20 +0100 [thread overview]
Message-ID: <20260420153520.GR280379@horms.kernel.org> (raw)
In-Reply-To: <3481ae84-5c36-4591-94c1-78b70fff4d7b@linux.intel.com>
On Mon, Apr 20, 2026 at 11:20:07AM +0800, Abdul Rahim, Faizal wrote:
>
>
> On 19/4/2026 12:48 am, Simon Horman wrote:
> > From: 'Simon Horman' <horms@kernel.org>
> >
> > This is an AI-generated review of your patch. The human sending this
> > email has considered the AI review valid, or at least plausible.
> > Full review at: https://sashiko.dev
> > ---
> > igc: add support for forcing link speed without autonegotiation
> >
> > This commit adds support to allow users to force 10/100 Mb/s link speed
> > and duplex via ethtool when autonegotiation is disabled.
> >
> > > diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c
> > > index cfcbf2fdad6ea..5bd37d1be1688 100644
> > > --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c
> > > +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c
> >
> > [ ... ]
> >
> > > @@ -2000,6 +2013,41 @@ static int igc_ethtool_get_link_ksettings(struct net_device *netdev,
> > > return 0;
> > > }
> > > +/**
> > > + * igc_handle_autoneg_disabled - Configure forced speed/duplex settings
> > > + * @adapter: private driver structure
> > > + * @speed: requested speed (must be SPEED_10 or SPEED_100)
> > > + * @duplex: requested duplex
> > > + *
> > > + * Records forced speed/duplex when autoneg is disabled.
> > > + * Caller must validate speed before calling this function.
> > > + */
> > > +static void igc_handle_autoneg_disabled(struct igc_adapter *adapter, u32 speed,
> > > + u8 duplex)
> > > +{
> > > + struct igc_mac_info *mac = &adapter->hw.mac;
> > > +
> > > + switch (speed) {
> > > + case SPEED_10:
> > > + mac->forced_speed_duplex = (duplex == DUPLEX_FULL) ?
> > > + IGC_FORCED_10F : IGC_FORCED_10H;
> > > + break;
> > > + case SPEED_100:
> > > + mac->forced_speed_duplex = (duplex == DUPLEX_FULL) ?
> > > + IGC_FORCED_100F : IGC_FORCED_100H;
> > > + break;
> > > + default:
> > > + WARN_ONCE(1, "Unsupported speed %u\n", speed);
> > > + return;
> > > + }
> > > +
> > > + mac->autoneg_enabled = false;
> > > +
> > > + /* Half-duplex cannot support flow control per IEEE 802.3 */
> > > + if (duplex == DUPLEX_HALF)
> > > + adapter->hw.fc.requested_mode = igc_fc_none;
> > > +}
> >
> > If userspace issues an ethtool command without specifying duplex, the duplex
> > value can be DUPLEX_UNKNOWN. In this case, forced_speed_duplex correctly
> > defaults to half-duplex since duplex == DUPLEX_FULL evaluates to false.
> >
> > However, since DUPLEX_UNKNOWN is not equal to DUPLEX_HALF, the check above
> > fails, and the requested flow control mode remains unchanged. Could this leave
> > flow control enabled on a forced half-duplex link, violating IEEE 802.3?
> > Should this check be based on the resolved mac->forced_speed_duplex state
> > instead?
> >
>
> You're right, thanks for pointing that out.
>
> That said, it feels simpler to address it with [1]:
> if (duplex != DUPLEX_FULL)
> adapter->hw.fc.requested_mode = igc_fc_none;
>
> Rather than [2]:
> if (mac->forced_speed_duplex == IGC_FORCED_10H ||
> mac->forced_speed_duplex == IGC_FORCED_100H)
> adapter->hw.fc.requested_mode = igc_fc_none;
>
> Are you okay with [1] ?
Yes, [1] sounds sensible to me.
>
> > [ ... ]
> >
> > > @@ -2071,14 +2120,20 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
> > > }
> > > }
> > > + if (cmd->base.autoneg == AUTONEG_DISABLE &&
> > > + cmd->base.speed != SPEED_10 && cmd->base.speed != SPEED_100) {
> > > + netdev_info(dev, "Unsupported speed for forced link\n");
> > > + return -EINVAL;
> > > + }
> > > +
> > > while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
> > > usleep_range(1000, 2000);
> >
> > This isn't a bug introduced by this patch, but does this ad-hoc
> > synchronization using bit flags circumvent proper locking guarantees? The
> > networking subsystem guidelines forbid using bit flags as ad-hoc locks.
> >
> > Using a bit flag in a polling loop bypasses lockdep analysis, fairness, and
> > strict memory ordering. Could this be replaced with a real synchronization
> > mechanism like a mutex?
>
> It looks like a worthwhile cleanup. However, it likely doesn’t belong in
> this series, since the synchronization pattern predates these patches and is
> used throughout the igc driver (set_ringparam, set_pauseparam, set_channels,
> etc.). We could address it in different patch series and align the other
> code paths at the same time ?
Yes, agreed.
next prev parent reply other threads:[~2026-04-20 15:35 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-16 1:55 [Intel-wired-lan] [PATCH iwl-next v2 0/3] igc: add support for forcing link speed without autonegotiation KhaiWenTan
2026-04-16 1:55 ` KhaiWenTan
2026-04-16 1:55 ` [Intel-wired-lan] [PATCH iwl-next v2 1/3] igc: remove unused autoneg_failed field KhaiWenTan
2026-04-16 1:55 ` KhaiWenTan
2026-04-16 9:04 ` [Intel-wired-lan] " Loktionov, Aleksandr
2026-04-16 9:04 ` Loktionov, Aleksandr
2026-04-16 1:55 ` [Intel-wired-lan] [PATCH iwl-next v2 2/3] igc: move autoneg-enabled settings into igc_handle_autoneg_enabled() KhaiWenTan
2026-04-16 1:55 ` KhaiWenTan
2026-04-16 9:05 ` [Intel-wired-lan] " Loktionov, Aleksandr
2026-04-16 9:05 ` Loktionov, Aleksandr
2026-04-16 1:55 ` [Intel-wired-lan] [PATCH iwl-next v2 3/3] igc: add support for forcing link speed without autonegotiation KhaiWenTan
2026-04-16 1:55 ` KhaiWenTan
2026-04-18 16:48 ` [Intel-wired-lan] " Simon Horman
2026-04-18 16:48 ` Simon Horman
2026-04-20 3:20 ` [Intel-wired-lan] " Abdul Rahim, Faizal
2026-04-20 3:20 ` Abdul Rahim, Faizal
2026-04-20 15:35 ` Simon Horman [this message]
2026-04-20 15:35 ` Simon Horman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260420153520.GR280379@horms.kernel.org \
--to=horms@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=anthony.l.nguyen@intel.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=faizal.abdul.rahim@intel.com \
--cc=faizal.abdul.rahim@linux.intel.com \
--cc=hong.aun.looi@intel.com \
--cc=intel-wired-lan@lists.osuosl.org \
--cc=khai.wen.tan@intel.com \
--cc=khai.wen.tan@linux.intel.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=przemyslaw.kitszel@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.