From: "Abdul Rahim, Faizal" <faizal.abdul.rahim@linux.intel.com>
To: Simon Horman <horms@kernel.org>, khai.wen.tan@linux.intel.com
Cc: anthony.l.nguyen@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 v4 3/3] igc: add support for forcing link speed without autonegotiation
Date: Wed, 6 May 2026 14:25:23 +0800 [thread overview]
Message-ID: <16b18088-8fe3-4a38-9eb9-d39842e6b94f@linux.intel.com> (raw)
In-Reply-To: <20260430135057.1653330-1-horms@kernel.org>
On 30/4/2026 9:50 pm, 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 allows users to force 10/100 Mb/s link speed and duplex via
> ethtool when autonegotiation is disabled. Previously, the driver rejected
> these requests.
>
>> diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c
>> index cfcbf2fdad6e..9997ebbdf778 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_FULL)
>> + adapter->hw.fc.requested_mode = igc_fc_none;
>
> Does this permanently overwrite the user's flow control preference?
>
> If half-duplex is requested, requested_mode is set to igc_fc_none. Because
> requested_mode represents the persistent state for the user's flow control
> preference, the user might permanently lose their configuration. If they later
> switch back to full-duplex, requested_mode remains igc_fc_none, and flow
> control stays disabled.
>
> Would it be better to dynamically override hw->fc.current_mode to
> igc_fc_none during link configuration instead of mutating requested_mode?
>
Yes you're right, thanks, will update.
>> +}
> [ ... ]
>> @@ -2071,14 +2126,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;
>> + }
>> +
>
> Should we also validate cmd->base.duplex here to prevent a fallback to
> half-duplex?
>
> If a user runs a command like "ethtool -s eth0 speed 100 autoneg off" while
> the link is down, ethtool queries and preserves the current duplex value,
> which is DUPLEX_UNKNOWN (0xff).
>
> In igc_handle_autoneg_disabled(), the code checks if duplex == DUPLEX_FULL,
> which evaluates to false, and forces the interface to 100 Mbps half-duplex.
>
> Could we explicitly check that cmd->base.duplex is either DUPLEX_HALF or
> DUPLEX_FULL and return -EINVAL otherwise?
Will update.
>
>> 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 loop reimplement locking without fairness or lockdep support?
>
> According to the Networking Subsystem Guidelines, using bit operations as a
> substitute for real locks violates core kernel locking rules and introduces
> potential races.
>
> Could this be replaced with a proper concurrency mechanism such as a mutex?
>
Hi Simon, you've raised this issue in v2, and after discussion, you've
agreed that this change doesn't belong in this patch series.
Not sure if I missed anything?
>>
>> - if (cmd->base.autoneg == AUTONEG_ENABLE) {
>> + if (cmd->base.autoneg == AUTONEG_ENABLE)
>> igc_handle_autoneg_enabled(adapter, cmd);
>> - } else {
>> - netdev_info(dev, "Force mode currently not supported\n");
>> - }
>> + else
>> + igc_handle_autoneg_disabled(adapter, cmd->base.speed,
>> + cmd->base.duplex);
>>
>> /* MDI-X => 2; MDI => 1; Auto => 3 */
>> if (cmd->base.eth_tp_mdix_ctrl) {
>
WARNING: multiple messages have this Message-ID (diff)
From: "Abdul Rahim, Faizal" <faizal.abdul.rahim@linux.intel.com>
To: Simon Horman <horms@kernel.org>, khai.wen.tan@linux.intel.com
Cc: anthony.l.nguyen@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 v4 3/3] igc: add support for forcing link speed without autonegotiation
Date: Wed, 6 May 2026 14:25:23 +0800 [thread overview]
Message-ID: <16b18088-8fe3-4a38-9eb9-d39842e6b94f@linux.intel.com> (raw)
In-Reply-To: <20260430135057.1653330-1-horms@kernel.org>
On 30/4/2026 9:50 pm, 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 allows users to force 10/100 Mb/s link speed and duplex via
> ethtool when autonegotiation is disabled. Previously, the driver rejected
> these requests.
>
>> diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c
>> index cfcbf2fdad6e..9997ebbdf778 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_FULL)
>> + adapter->hw.fc.requested_mode = igc_fc_none;
>
> Does this permanently overwrite the user's flow control preference?
>
> If half-duplex is requested, requested_mode is set to igc_fc_none. Because
> requested_mode represents the persistent state for the user's flow control
> preference, the user might permanently lose their configuration. If they later
> switch back to full-duplex, requested_mode remains igc_fc_none, and flow
> control stays disabled.
>
> Would it be better to dynamically override hw->fc.current_mode to
> igc_fc_none during link configuration instead of mutating requested_mode?
>
Yes you're right, thanks, will update.
>> +}
> [ ... ]
>> @@ -2071,14 +2126,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;
>> + }
>> +
>
> Should we also validate cmd->base.duplex here to prevent a fallback to
> half-duplex?
>
> If a user runs a command like "ethtool -s eth0 speed 100 autoneg off" while
> the link is down, ethtool queries and preserves the current duplex value,
> which is DUPLEX_UNKNOWN (0xff).
>
> In igc_handle_autoneg_disabled(), the code checks if duplex == DUPLEX_FULL,
> which evaluates to false, and forces the interface to 100 Mbps half-duplex.
>
> Could we explicitly check that cmd->base.duplex is either DUPLEX_HALF or
> DUPLEX_FULL and return -EINVAL otherwise?
Will update.
>
>> 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 loop reimplement locking without fairness or lockdep support?
>
> According to the Networking Subsystem Guidelines, using bit operations as a
> substitute for real locks violates core kernel locking rules and introduces
> potential races.
>
> Could this be replaced with a proper concurrency mechanism such as a mutex?
>
Hi Simon, you've raised this issue in v2, and after discussion, you've
agreed that this change doesn't belong in this patch series.
Not sure if I missed anything?
>>
>> - if (cmd->base.autoneg == AUTONEG_ENABLE) {
>> + if (cmd->base.autoneg == AUTONEG_ENABLE)
>> igc_handle_autoneg_enabled(adapter, cmd);
>> - } else {
>> - netdev_info(dev, "Force mode currently not supported\n");
>> - }
>> + else
>> + igc_handle_autoneg_disabled(adapter, cmd->base.speed,
>> + cmd->base.duplex);
>>
>> /* MDI-X => 2; MDI => 1; Auto => 3 */
>> if (cmd->base.eth_tp_mdix_ctrl) {
>
next prev parent reply other threads:[~2026-05-06 6:25 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-28 6:00 [Intel-wired-lan] [PATCH iwl-next v4 0/3] igc: add support for forcing link speed without autonegotiation KhaiWenTan
2026-04-28 6:00 ` KhaiWenTan
2026-04-28 6:00 ` [Intel-wired-lan] [PATCH iwl-next v4 1/3] igc: remove unused autoneg_failed field KhaiWenTan
2026-04-28 6:00 ` KhaiWenTan
2026-04-28 6:56 ` [Intel-wired-lan] " Paul Menzel
2026-04-28 10:39 ` Abdul Rahim, Faizal
2026-04-28 15:06 ` Paul Menzel
2026-05-06 6:07 ` Abdul Rahim, Faizal
2026-04-28 6:00 ` [Intel-wired-lan] [PATCH iwl-next v4 2/3] igc: move autoneg-enabled settings into igc_handle_autoneg_enabled() KhaiWenTan
2026-04-28 6:00 ` KhaiWenTan
2026-04-28 6:00 ` [Intel-wired-lan] [PATCH iwl-next v4 3/3] igc: add support for forcing link speed without autonegotiation KhaiWenTan
2026-04-28 6:00 ` KhaiWenTan
2026-04-30 13:50 ` [Intel-wired-lan] " Simon Horman
2026-04-30 13:50 ` Simon Horman
2026-05-06 6:25 ` Abdul Rahim, Faizal [this message]
2026-05-06 6:25 ` Abdul Rahim, Faizal
2026-05-07 10:32 ` [Intel-wired-lan] " Simon Horman
2026-05-07 10:32 ` Simon Horman
2026-04-30 14:41 ` [Intel-wired-lan] [PATCH iwl-next v4 0/3] " David Laight
2026-04-30 14:41 ` David Laight
2026-05-06 6:21 ` [Intel-wired-lan] " Abdul Rahim, Faizal
2026-05-06 6:21 ` Abdul Rahim, Faizal
2026-05-06 9:40 ` [Intel-wired-lan] " David Laight
2026-05-06 9:40 ` David Laight
2026-05-07 9:03 ` [Intel-wired-lan] " Abdul Rahim, Faizal
2026-05-07 9:03 ` Abdul Rahim, Faizal
2026-05-07 12:15 ` [Intel-wired-lan] " Andrew Lunn
2026-05-07 12:15 ` Andrew Lunn
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=16b18088-8fe3-4a38-9eb9-d39842e6b94f@linux.intel.com \
--to=faizal.abdul.rahim@linux.intel.com \
--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=hong.aun.looi@intel.com \
--cc=horms@kernel.org \
--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 \
/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.