Netdev List
 help / color / mirror / Atom feed
From: "Ruinskiy, Dima" <dima.ruinskiy@intel.com>
To: KhaiWenTan <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>
Cc: <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>, <hector.blanco.alcaine@intel.com>,
	<khai.wen.tan@intel.com>,
	Faizal Rahim <faizal.abdul.rahim@linux.intel.com>
Subject: Re: [Intel-wired-lan] [PATCH iwl-next v5 4/4] igc: add support for forcing link speed without autonegotiation
Date: Sun, 14 Jun 2026 10:17:40 +0300	[thread overview]
Message-ID: <d8f4f16c-adf6-4d99-bb76-09c047ba19eb@intel.com> (raw)
In-Reply-To: <20260507214706.309984-5-khai.wen.tan@linux.intel.com>

On 08/05/2026 0:47, KhaiWenTan wrote:
> From: Faizal Rahim <faizal.abdul.rahim@linux.intel.com>
> 
> Allow users to force 10/100 Mb/s link speed and duplex via ethtool
> when autonegotiation is disabled. Previously, the driver rejected
> these requests with "Force mode currently not supported.".
> 
> Forcing at 1000 Mb/s and 2500 Mb/s is not supported.
> 
> Reviewed-by: Looi Hong Aun <hong.aun.looi@intel.com>
> Signed-off-by: Faizal Rahim <faizal.abdul.rahim@linux.intel.com>
> Signed-off-by: Khai Wen Tan <khai.wen.tan@linux.intel.com>
> ---
>   drivers/net/ethernet/intel/igc/igc_base.c    |  35 ++++-
>   drivers/net/ethernet/intel/igc/igc_defines.h |   9 +-
>   drivers/net/ethernet/intel/igc/igc_ethtool.c | 138 ++++++++++++++-----
>   drivers/net/ethernet/intel/igc/igc_hw.h      |   9 ++
>   drivers/net/ethernet/intel/igc/igc_mac.c     |  12 ++
>   drivers/net/ethernet/intel/igc/igc_main.c    |   2 +-
>   drivers/net/ethernet/intel/igc/igc_phy.c     |  65 ++++++++-
>   drivers/net/ethernet/intel/igc/igc_phy.h     |   1 +
>   8 files changed, 220 insertions(+), 51 deletions(-)
> 
> diff --git a/drivers/net/ethernet/intel/igc/igc_base.c b/drivers/net/ethernet/intel/igc/igc_base.c
> index 1613b562d17c..ab9120a3127f 100644
> --- a/drivers/net/ethernet/intel/igc/igc_base.c
> +++ b/drivers/net/ethernet/intel/igc/igc_base.c
> @@ -114,11 +114,35 @@ static s32 igc_setup_copper_link_base(struct igc_hw *hw)
>   	u32 ctrl;
>   
>   	ctrl = rd32(IGC_CTRL);
> -	ctrl |= IGC_CTRL_SLU;
> -	ctrl &= ~(IGC_CTRL_FRCSPD | IGC_CTRL_FRCDPX);
> -	wr32(IGC_CTRL, ctrl);
> -
> -	ret_val = igc_setup_copper_link(hw);
> +	ctrl &= ~(IGC_CTRL_FRCSPD | IGC_CTRL_FRCDPX |
> +		  IGC_CTRL_SPEED_MASK | IGC_CTRL_FD);
> +
> +	if (hw->mac.autoneg_enabled) {
> +		ctrl |= IGC_CTRL_SLU;
> +		wr32(IGC_CTRL, ctrl);
> +		ret_val = igc_setup_copper_link(hw);
> +	} else {
> +		ctrl |= IGC_CTRL_SLU | IGC_CTRL_FRCSPD | IGC_CTRL_FRCDPX;
> +
> +		switch (hw->mac.forced_speed_duplex) {
> +		case IGC_FORCED_10H:
> +			ctrl |= IGC_CTRL_SPEED_10;
> +			break;
> +		case IGC_FORCED_10F:
> +			ctrl |= IGC_CTRL_SPEED_10 | IGC_CTRL_FD;
> +			break;
> +		case IGC_FORCED_100H:
> +			ctrl |= IGC_CTRL_SPEED_100;
> +			break;
> +		case IGC_FORCED_100F:
> +			ctrl |= IGC_CTRL_SPEED_100 | IGC_CTRL_FD;
> +			break;
> +		default:
> +			return -IGC_ERR_CONFIG;
> +		}
> +		wr32(IGC_CTRL, ctrl);
> +		ret_val = igc_setup_copper_link(hw);
> +	}
>   
>   	return ret_val;
>   }
> @@ -443,6 +467,7 @@ static const struct igc_phy_operations igc_phy_ops_base = {
>   	.reset			= igc_phy_hw_reset,
>   	.read_reg		= igc_read_phy_reg_gpy,
>   	.write_reg		= igc_write_phy_reg_gpy,
> +	.force_speed_duplex	= igc_force_speed_duplex,
>   };
>   
>   const struct igc_info igc_base_info = {
> diff --git a/drivers/net/ethernet/intel/igc/igc_defines.h b/drivers/net/ethernet/intel/igc/igc_defines.h
> index 9482ab11f050..3f504751c2d9 100644
> --- a/drivers/net/ethernet/intel/igc/igc_defines.h
> +++ b/drivers/net/ethernet/intel/igc/igc_defines.h
> @@ -129,10 +129,13 @@
>   #define IGC_ERR_SWFW_SYNC		13
>   
>   /* Device Control */
> +#define IGC_CTRL_FD		BIT(0)  /* Full Duplex */
>   #define IGC_CTRL_RST		0x04000000  /* Global reset */
> -
>   #define IGC_CTRL_PHY_RST	0x80000000  /* PHY Reset */
>   #define IGC_CTRL_SLU		0x00000040  /* Set link up (Force Link) */
> +#define IGC_CTRL_SPEED_MASK	GENMASK(10, 8)
> +#define IGC_CTRL_SPEED_10	FIELD_PREP(IGC_CTRL_SPEED_MASK, 0)
> +#define IGC_CTRL_SPEED_100	FIELD_PREP(IGC_CTRL_SPEED_MASK, 1)
>   #define IGC_CTRL_FRCSPD		0x00000800  /* Force Speed */
>   #define IGC_CTRL_FRCDPX		0x00001000  /* Force Duplex */
>   #define IGC_CTRL_VME		0x40000000  /* IEEE VLAN mode enable */
> @@ -673,6 +676,10 @@
>   #define IGC_GEN_POLL_TIMEOUT	1920
>   
>   /* PHY Control Register */
> +#define MII_CR_SPEED_MASK	(BIT(6) | BIT(13))
> +#define MII_CR_SPEED_10		0x0000	/* SSM=0, SSL=0: 10 Mb/s */
> +#define MII_CR_SPEED_100	BIT(13)	/* SSM=0, SSL=1: 100 Mb/s */
> +#define MII_CR_DUPLEX_EN	BIT(8)	/* 0 = Half Duplex, 1 = Full Duplex */
>   #define MII_CR_RESTART_AUTO_NEG	0x0200  /* Restart auto negotiation */
>   #define MII_CR_POWER_DOWN	0x0800  /* Power down */
>   #define MII_CR_AUTO_NEG_EN	0x1000  /* Auto Neg Enable */
> diff --git a/drivers/net/ethernet/intel/igc/igc_ethtool.c b/drivers/net/ethernet/intel/igc/igc_ethtool.c
> index cfcbf2fdad6e..b103836a895f 100644
> --- a/drivers/net/ethernet/intel/igc/igc_ethtool.c
> +++ b/drivers/net/ethernet/intel/igc/igc_ethtool.c
> @@ -1914,44 +1914,58 @@ static int igc_ethtool_get_link_ksettings(struct net_device *netdev,
>   	ethtool_link_ksettings_add_link_mode(cmd, supported, TP);
>   	ethtool_link_ksettings_add_link_mode(cmd, advertising, TP);
>   
> -	/* advertising link modes */
> -	if (hw->phy.autoneg_advertised & ADVERTISE_10_HALF)
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, 10baseT_Half);
> -	if (hw->phy.autoneg_advertised & ADVERTISE_10_FULL)
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, 10baseT_Full);
> -	if (hw->phy.autoneg_advertised & ADVERTISE_100_HALF)
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, 100baseT_Half);
> -	if (hw->phy.autoneg_advertised & ADVERTISE_100_FULL)
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, 100baseT_Full);
> -	if (hw->phy.autoneg_advertised & ADVERTISE_1000_FULL)
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, 1000baseT_Full);
> -	if (hw->phy.autoneg_advertised & ADVERTISE_2500_FULL)
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, 2500baseT_Full);
> -
>   	/* set autoneg settings */
>   	ethtool_link_ksettings_add_link_mode(cmd, supported, Autoneg);
> -	ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg);
> +	if (hw->mac.autoneg_enabled) {
> +		ethtool_link_ksettings_add_link_mode(cmd, advertising, Autoneg);
> +		cmd->base.autoneg = AUTONEG_ENABLE;
> +
> +		/* advertising link modes only apply when autoneg is on */
> +		if (hw->phy.autoneg_advertised & ADVERTISE_10_HALF)
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     10baseT_Half);
> +		if (hw->phy.autoneg_advertised & ADVERTISE_10_FULL)
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     10baseT_Full);
> +		if (hw->phy.autoneg_advertised & ADVERTISE_100_HALF)
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     100baseT_Half);
> +		if (hw->phy.autoneg_advertised & ADVERTISE_100_FULL)
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     100baseT_Full);
> +		if (hw->phy.autoneg_advertised & ADVERTISE_1000_FULL)
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     1000baseT_Full);
> +		if (hw->phy.autoneg_advertised & ADVERTISE_2500_FULL)
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     2500baseT_Full);
> +
> +		/* Set pause flow control advertising */
> +		switch (hw->fc.requested_mode) {
> +		case igc_fc_full:
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     Pause);
> +			break;
> +		case igc_fc_rx_pause:
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     Pause);
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     Asym_Pause);
> +			break;
> +		case igc_fc_tx_pause:
> +			ethtool_link_ksettings_add_link_mode(cmd, advertising,
> +							     Asym_Pause);
> +			break;
> +		default:
> +			break;
> +		}
> +	} else {
> +		cmd->base.autoneg = AUTONEG_DISABLE;
> +	}
>   
> -	/* Set pause flow control settings */
> +	/* Pause is always supported */
>   	ethtool_link_ksettings_add_link_mode(cmd, supported, Pause);
>   
> -	switch (hw->fc.requested_mode) {
> -	case igc_fc_full:
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
> -		break;
> -	case igc_fc_rx_pause:
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising, Pause);
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising,
> -						     Asym_Pause);
> -		break;
> -	case igc_fc_tx_pause:
> -		ethtool_link_ksettings_add_link_mode(cmd, advertising,
> -						     Asym_Pause);
> -		break;
> -	default:
> -		break;
> -	}
> -
>   	status = pm_runtime_suspended(&adapter->pdev->dev) ?
>   		 0 : rd32(IGC_STATUS);
>   
> @@ -1983,7 +1997,6 @@ static int igc_ethtool_get_link_ksettings(struct net_device *netdev,
>   		cmd->base.duplex = DUPLEX_UNKNOWN;
>   	}
>   	cmd->base.speed = speed;
> -	cmd->base.autoneg = AUTONEG_ENABLE;
>   
>   	/* MDI-X => 2; MDI =>1; Invalid =>0 */
>   	if (hw->phy.media_type == igc_media_type_copper)
> @@ -2000,6 +2013,37 @@ 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;
> +}
> +
>   /**
>    * igc_handle_autoneg_enabled - Configure autonegotiation advertisement
>    * @adapter: private driver structure
> @@ -2038,6 +2082,7 @@ static void igc_handle_autoneg_enabled(struct igc_adapter *adapter,
>   						  10baseT_Half))
>   		advertised |= ADVERTISE_10_HALF;
>   
> +	hw->mac.autoneg_enabled = true;
>   	hw->phy.autoneg_advertised = advertised;
>   	if (adapter->fc_autoneg)
>   		hw->fc.requested_mode = igc_fc_default;
> @@ -2059,6 +2104,12 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
>   		return -EINVAL;
>   	}
>   
> +	if (cmd->base.autoneg != AUTONEG_ENABLE &&
> +	    cmd->base.autoneg != AUTONEG_DISABLE) {
> +		netdev_info(dev, "Unsupported autoneg setting\n");
> +		return -EINVAL;
> +	}
> +
>   	/* MDI setting is only allowed when autoneg enabled because
>   	 * some hardware doesn't allow MDI setting when speed or
>   	 * duplex is forced.
> @@ -2071,14 +2122,25 @@ igc_ethtool_set_link_ksettings(struct net_device *netdev,
>   		}
>   	}
>   
> +	if (cmd->base.autoneg == AUTONEG_DISABLE) {
> +		if (cmd->base.speed != SPEED_10 && cmd->base.speed != SPEED_100) {
> +			netdev_info(dev, "Unsupported speed for forced link\n");
> +			return -EINVAL;
> +		}
> +		if (cmd->base.duplex != DUPLEX_HALF && cmd->base.duplex != DUPLEX_FULL) {
> +			netdev_info(dev, "Duplex must be half or full for forced link\n");
> +			return -EINVAL;
> +		}
> +	}
> +
>   	while (test_and_set_bit(__IGC_RESETTING, &adapter->state))
>   		usleep_range(1000, 2000);
>   
> -	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) {
> diff --git a/drivers/net/ethernet/intel/igc/igc_hw.h b/drivers/net/ethernet/intel/igc/igc_hw.h
> index 86ab8f566f44..62aaee55668a 100644
> --- a/drivers/net/ethernet/intel/igc/igc_hw.h
> +++ b/drivers/net/ethernet/intel/igc/igc_hw.h
> @@ -73,6 +73,13 @@ struct igc_info {
>   
>   extern const struct igc_info igc_base_info;
>   
> +enum igc_forced_speed_duplex {
> +	IGC_FORCED_10H,
> +	IGC_FORCED_10F,
> +	IGC_FORCED_100H,
> +	IGC_FORCED_100F,
> +};
> +
>   struct igc_mac_info {
>   	struct igc_mac_operations ops;
>   
> @@ -93,6 +100,8 @@ struct igc_mac_info {
>   	bool arc_subsystem_valid;
>   
>   	bool get_link_status;
> +	bool autoneg_enabled;
> +	enum igc_forced_speed_duplex forced_speed_duplex;
>   };
>   
>   struct igc_nvm_operations {
> diff --git a/drivers/net/ethernet/intel/igc/igc_mac.c b/drivers/net/ethernet/intel/igc/igc_mac.c
> index 0a3d3f357505..d6f3f6618469 100644
> --- a/drivers/net/ethernet/intel/igc/igc_mac.c
> +++ b/drivers/net/ethernet/intel/igc/igc_mac.c
> @@ -446,6 +446,17 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw)
>   	u16 speed, duplex;
>   	s32 ret_val = 0;
>   
> +	/* Without autoneg, flow control capability is not exchanged with the
> +	 * link partner. IEEE 802.3 prohibits flow control in half-duplex mode.
> +	 */
> +	if (!hw->mac.autoneg_enabled) {
> +		if (hw->mac.forced_speed_duplex == IGC_FORCED_10H ||
> +		    hw->mac.forced_speed_duplex == IGC_FORCED_100H)
> +			hw->fc.current_mode = igc_fc_none;
> +
> +		goto force_fc;
> +	}
> +
>   	/* In auto-neg, we need to check and see if Auto-Neg has completed,
>   	 * and if so, how the PHY and link partner has flow control
>   	 * configured.
> @@ -607,6 +618,7 @@ s32 igc_config_fc_after_link_up(struct igc_hw *hw)
>   	/* Now we call a subroutine to actually force the MAC
>   	 * controller to use the correct flow control settings.
>   	 */
> +force_fc:
>   	ret_val = igc_force_mac_fc(hw);
>   	if (ret_val) {
>   		hw_dbg("Error forcing flow control settings\n");
> diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
> index 72bc5128d8b8..437e1d1ef1e4 100644
> --- a/drivers/net/ethernet/intel/igc/igc_main.c
> +++ b/drivers/net/ethernet/intel/igc/igc_main.c
> @@ -7298,7 +7298,7 @@ static int igc_probe(struct pci_dev *pdev,
>   	/* Initialize link properties that are user-changeable */
>   	adapter->fc_autoneg = true;
>   	hw->phy.autoneg_advertised = 0xaf;
> -
> +	hw->mac.autoneg_enabled = true;
>   	hw->fc.requested_mode = igc_fc_default;
>   	hw->fc.current_mode = igc_fc_default;
>   
> diff --git a/drivers/net/ethernet/intel/igc/igc_phy.c b/drivers/net/ethernet/intel/igc/igc_phy.c
> index 6c4d204aecfa..4cf737fb3b21 100644
> --- a/drivers/net/ethernet/intel/igc/igc_phy.c
> +++ b/drivers/net/ethernet/intel/igc/igc_phy.c
> @@ -494,12 +494,20 @@ s32 igc_setup_copper_link(struct igc_hw *hw)
>   	s32 ret_val = 0;
>   	bool link;
>   
> -	/* Setup autoneg and flow control advertisement and perform
> -	 * autonegotiation.
> -	 */
> -	ret_val = igc_copper_link_autoneg(hw);
> -	if (ret_val)
> -		goto out;
> +	if (hw->mac.autoneg_enabled) {
> +		/* Setup autoneg and flow control advertisement and perform
> +		 * autonegotiation.
> +		 */
> +		ret_val = igc_copper_link_autoneg(hw);
> +		if (ret_val)
> +			goto out;
> +	} else {
> +		ret_val = hw->phy.ops.force_speed_duplex(hw);
> +		if (ret_val) {
> +			hw_dbg("Error Forcing Speed/Duplex\n");
> +			goto out;
> +		}
> +	}
>   
>   	/* Check link status. Wait up to 100 microseconds for link to become
>   	 * valid.
> @@ -778,3 +786,48 @@ u16 igc_read_phy_fw_version(struct igc_hw *hw)
>   
>   	return gphy_version;
>   }
> +
> +/**
> + * igc_force_speed_duplex - Force PHY speed and duplex settings
> + * @hw: pointer to the HW structure
> + *
> + * Programs the GPY PHY control register to disable autonegotiation
> + * and force the speed/duplex indicated by hw->mac.forced_speed_duplex.
> + */
> +s32 igc_force_speed_duplex(struct igc_hw *hw)
> +{
> +	struct igc_phy_info *phy = &hw->phy;
> +	u16 phy_ctrl;
> +	s32 ret_val;
> +
> +	ret_val = phy->ops.read_reg(hw, PHY_CONTROL, &phy_ctrl);
> +	if (ret_val)
> +		return ret_val;
> +
> +	phy_ctrl &= ~(MII_CR_SPEED_MASK | MII_CR_DUPLEX_EN |
> +		      MII_CR_AUTO_NEG_EN | MII_CR_RESTART_AUTO_NEG);
> +
> +	switch (hw->mac.forced_speed_duplex) {
> +	case IGC_FORCED_10H:
> +		phy_ctrl |= MII_CR_SPEED_10;
> +		break;
> +	case IGC_FORCED_10F:
> +		phy_ctrl |= MII_CR_SPEED_10 | MII_CR_DUPLEX_EN;
> +		break;
> +	case IGC_FORCED_100H:
> +		phy_ctrl |= MII_CR_SPEED_100;
> +		break;
> +	case IGC_FORCED_100F:
> +		phy_ctrl |= MII_CR_SPEED_100 | MII_CR_DUPLEX_EN;
> +		break;
> +	default:
> +		return -IGC_ERR_CONFIG;
> +	}
> +
> +	ret_val = phy->ops.write_reg(hw, PHY_CONTROL, phy_ctrl);
> +	if (ret_val)
> +		return ret_val;
> +
> +	hw->mac.get_link_status = true;
> +	return 0;
> +}
> diff --git a/drivers/net/ethernet/intel/igc/igc_phy.h b/drivers/net/ethernet/intel/igc/igc_phy.h
> index 832a7e359f18..d37a89174826 100644
> --- a/drivers/net/ethernet/intel/igc/igc_phy.h
> +++ b/drivers/net/ethernet/intel/igc/igc_phy.h
> @@ -18,5 +18,6 @@ void igc_power_down_phy_copper(struct igc_hw *hw);
>   s32 igc_write_phy_reg_gpy(struct igc_hw *hw, u32 offset, u16 data);
>   s32 igc_read_phy_reg_gpy(struct igc_hw *hw, u32 offset, u16 *data);
>   u16 igc_read_phy_fw_version(struct igc_hw *hw);
> +s32 igc_force_speed_duplex(struct igc_hw *hw);
>   
>   #endif
Reviewed-by: Dima Ruinskiy <dima.ruinskiy@intel.com>

  reply	other threads:[~2026-06-14  7:17 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-07 21:47 [PATCH iwl-next v5 0/4] igc: add support for forcing link speed without autonegotiation KhaiWenTan
2026-05-07 21:47 ` [PATCH iwl-next v5 1/4] igc: remove unused autoneg_failed field KhaiWenTan
2026-06-14  7:16   ` [Intel-wired-lan] " Ruinskiy, Dima
2026-05-07 21:47 ` [PATCH iwl-next v5 2/4] igc: move autoneg-enabled settings into igc_handle_autoneg_enabled() KhaiWenTan
2026-06-14  7:17   ` [Intel-wired-lan] " Ruinskiy, Dima
2026-05-07 21:47 ` [PATCH iwl-next v5 3/4] igc: replace goto out with direct returns in igc_config_fc_after_link_up() KhaiWenTan
2026-06-14  7:17   ` [Intel-wired-lan] " Ruinskiy, Dima
2026-05-07 21:47 ` [PATCH iwl-next v5 4/4] igc: add support for forcing link speed without autonegotiation KhaiWenTan
2026-06-14  7:17   ` Ruinskiy, Dima [this message]
2026-05-11 16:28 ` [PATCH iwl-next v5 0/4] " 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=d8f4f16c-adf6-4d99-bb76-09c047ba19eb@intel.com \
    --to=dima.ruinskiy@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=faizal.abdul.rahim@linux.intel.com \
    --cc=hector.blanco.alcaine@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox