Commit baa515ef authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'intel-wired-lan-driver-updates-2025-10-15-ice-iavf-ixgbe-i40e-e1000e'

Jacob Keller says:

====================
Intel Wired LAN Driver Updates 2025-10-15 (ice, iavf, ixgbe, i40e, e1000e) [part]

Jacob revives one-year-old work from Jesse Brandeburg to implement the
standardized statistics interfaces from ethtool in the ice driver.

Vitaly introduces a new private flag to control the K1 power state of ICH
network controllers supported by the e1000e driver. This flag has been
extensively discussed on the list and deemed the best available option to
provide a field workaround without impacting the many configurations that
have no issues with the K1 power state.
====================

Link: https://patch.msgid.link/20251016-jk-iwl-next-2025-10-15-v2-0-ff3a390d9fc6@intel.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents c30fd916 3c7bf5af
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -184,9 +184,11 @@ Protocol-related statistics can be requested in get commands by setting
the `ETHTOOL_FLAG_STATS` flag in `ETHTOOL_A_HEADER_FLAGS`. Currently
statistics are supported in the following commands:

  - `ETHTOOL_MSG_PAUSE_GET`
  - `ETHTOOL_MSG_FEC_GET`
  - `ETHTOOL_MSG_LINKSTATE_GET`
  - `ETHTOOL_MSG_MM_GET`
  - `ETHTOOL_MSG_PAUSE_GET`
  - `ETHTOOL_MSG_TSINFO_GET`

debugfs
-------
+1 −0
Original line number Diff line number Diff line
@@ -461,6 +461,7 @@ s32 e1000e_get_base_timinca(struct e1000_adapter *adapter, u32 *timinca);
#define FLAG2_CHECK_RX_HWTSTAMP           BIT(13)
#define FLAG2_CHECK_SYSTIM_OVERFLOW       BIT(14)
#define FLAG2_ENABLE_S0IX_FLOWS           BIT(15)
#define FLAG2_DISABLE_K1		   BIT(16)

#define E1000_RX_DESC_PS(R, i)	    \
	(&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
+40 −5
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ struct e1000_stats {
static const char e1000e_priv_flags_strings[][ETH_GSTRING_LEN] = {
#define E1000E_PRIV_FLAGS_S0IX_ENABLED	BIT(0)
	"s0ix-enabled",
#define E1000E_PRIV_FLAGS_DISABLE_K1	BIT(1)
	"disable-k1",
};

#define E1000E_PRIV_FLAGS_STR_LEN ARRAY_SIZE(e1000e_priv_flags_strings)
@@ -2301,26 +2303,59 @@ static u32 e1000e_get_priv_flags(struct net_device *netdev)
	if (adapter->flags2 & FLAG2_ENABLE_S0IX_FLOWS)
		priv_flags |= E1000E_PRIV_FLAGS_S0IX_ENABLED;

	if (adapter->flags2 & FLAG2_DISABLE_K1)
		priv_flags |= E1000E_PRIV_FLAGS_DISABLE_K1;

	return priv_flags;
}

static int e1000e_set_priv_flags(struct net_device *netdev, u32 priv_flags)
{
	struct e1000_adapter *adapter = netdev_priv(netdev);
	struct e1000_hw *hw = &adapter->hw;
	unsigned int flags2 = adapter->flags2;
	unsigned int changed;

	flags2 &= ~FLAG2_ENABLE_S0IX_FLOWS;
	if (priv_flags & E1000E_PRIV_FLAGS_S0IX_ENABLED) {
		struct e1000_hw *hw = &adapter->hw;
	flags2 &= ~(FLAG2_ENABLE_S0IX_FLOWS | FLAG2_DISABLE_K1);

		if (hw->mac.type < e1000_pch_cnp)
	if (priv_flags & E1000E_PRIV_FLAGS_S0IX_ENABLED) {
		if (hw->mac.type < e1000_pch_cnp) {
			e_err("S0ix is not supported on this device\n");
			return -EINVAL;
		}

		flags2 |= FLAG2_ENABLE_S0IX_FLOWS;
	}

	if (flags2 != adapter->flags2)
	if (priv_flags & E1000E_PRIV_FLAGS_DISABLE_K1) {
		if (hw->mac.type < e1000_ich8lan) {
			e_err("Disabling K1 is not supported on this device\n");
			return -EINVAL;
		}

		flags2 |= FLAG2_DISABLE_K1;
	}

	changed = adapter->flags2 ^ flags2;
	if (changed)
		adapter->flags2 = flags2;

	if (changed & FLAG2_DISABLE_K1) {
		/* reset the hardware to apply the changes */
		while (test_and_set_bit(__E1000_RESETTING,
					&adapter->state))
			usleep_range(1000, 2000);

		if (netif_running(adapter->netdev)) {
			e1000e_down(adapter, true);
			e1000e_up(adapter);
		} else {
			e1000e_reset(adapter);
		}

		clear_bit(__E1000_RESETTING, &adapter->state);
	}

	return 0;
}

+23 −18
Original line number Diff line number Diff line
@@ -286,21 +286,26 @@ static void e1000_toggle_lanphypc_pch_lpt(struct e1000_hw *hw)
}

/**
 * e1000_reconfigure_k1_exit_timeout - reconfigure K1 exit timeout to
 * align to MTP and later platform requirements.
 * e1000_reconfigure_k1_params - reconfigure Kumeran K1 parameters.
 * @hw: pointer to the HW structure
 *
 * By default K1 is enabled after MAC reset, so this function only
 * disables it.
 *
 * Context: PHY semaphore must be held by caller.
 * Return: 0 on success, negative on failure
 */
static s32 e1000_reconfigure_k1_exit_timeout(struct e1000_hw *hw)
static s32 e1000_reconfigure_k1_params(struct e1000_hw *hw)
{
	u16 phy_timeout;
	u32 fextnvm12;
	s32 ret_val;

	if (hw->mac.type < e1000_pch_mtp)
	if (hw->mac.type < e1000_pch_mtp) {
		if (hw->adapter->flags2 & FLAG2_DISABLE_K1)
			return e1000_configure_k1_ich8lan(hw, false);
		return 0;
	}

	/* Change Kumeran K1 power down state from P0s to P1 */
	fextnvm12 = er32(FEXTNVM12);
@@ -310,6 +315,8 @@ static s32 e1000_reconfigure_k1_exit_timeout(struct e1000_hw *hw)

	/* Wait for the interface the settle */
	usleep_range(1000, 1100);
	if (hw->adapter->flags2 & FLAG2_DISABLE_K1)
		return e1000_configure_k1_ich8lan(hw, false);

	/* Change K1 exit timeout */
	ret_val = e1e_rphy_locked(hw, I217_PHY_TIMEOUTS_REG,
@@ -373,8 +380,8 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
		/* At this point the PHY might be inaccessible so don't
		 * propagate the failure
		 */
		if (e1000_reconfigure_k1_exit_timeout(hw))
			e_dbg("Failed to reconfigure K1 exit timeout\n");
		if (e1000_reconfigure_k1_params(hw))
			e_dbg("Failed to reconfigure K1 parameters\n");

		fallthrough;
	case e1000_pch_lpt:
@@ -473,10 +480,10 @@ static s32 e1000_init_phy_workarounds_pchlan(struct e1000_hw *hw)
		if (hw->mac.type >= e1000_pch_mtp) {
			ret_val = hw->phy.ops.acquire(hw);
			if (ret_val) {
				e_err("Failed to reconfigure K1 exit timeout\n");
				e_err("Failed to reconfigure K1 parameters\n");
				goto out;
			}
			ret_val = e1000_reconfigure_k1_exit_timeout(hw);
			ret_val = e1000_reconfigure_k1_params(hw);
			hw->phy.ops.release(hw);
		}
	}
@@ -4948,18 +4955,16 @@ static s32 e1000_init_hw_ich8lan(struct e1000_hw *hw)
	u16 i;

	e1000_initialize_hw_bits_ich8lan(hw);
	if (hw->mac.type >= e1000_pch_mtp) {
	ret_val = hw->phy.ops.acquire(hw);
	if (ret_val)
		return ret_val;

		ret_val = e1000_reconfigure_k1_exit_timeout(hw);
	ret_val = e1000_reconfigure_k1_params(hw);
	hw->phy.ops.release(hw);
	if (ret_val) {
			e_dbg("Error failed to reconfigure K1 exit timeout\n");
		e_dbg("Error failed to reconfigure K1 parameters\n");
		return ret_val;
	}
	}

	/* Initialize identification LED */
	ret_val = mac->ops.id_led_init(hw);
+3 −0
Original line number Diff line number Diff line
@@ -7675,6 +7675,9 @@ static int e1000_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
	/* init PTP hardware clock */
	e1000e_ptp_init(adapter);

	if (hw->mac.type >= e1000_pch_mtp)
		adapter->flags2 |= FLAG2_DISABLE_K1;

	/* reset the hardware with the new settings */
	e1000e_reset(adapter);

Loading