DPDK patches and discussions
 help / color / mirror / Atom feed
From: Anatoly Burakov <anatoly.burakov@intel.com>
To: dev@dpdk.org
Subject: [PATCH v1 32/42] net/e1000/base: introduce PHY ID retry mechanism
Date: Fri, 31 Jan 2025 12:58:45 +0000	[thread overview]
Message-ID: <b1ae7a898befb1e6b052d0b91b0fe92b11005cc3.1738328108.git.anatoly.burakov@intel.com> (raw)
In-Reply-To: <cover.1738328106.git.anatoly.burakov@intel.com>

From: Nir Efrati <nir.efrati@intel.com>

On some customer platforms it was observed that invalid PHY ID (0x0000) was
returned on first try. This patch introduces PHY ID retry mechanism to
perform retries on PHY ID read for up to a second. Because the original
code was intentionally not checking PHY ID due to a different issue, this
fix only checks if PHY ID is non-zero, but otherwise considers any PHY ID
as valid.

In addition, IEEE standard defines format of PHY ID, so extract these bits
from PHY ID value.

Signed-off-by: Sasha Neftin <sasha.neftin@intel.com>
Signed-off-by: Nir Efrati <nir.efrati@intel.com>
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
 drivers/net/intel/e1000/base/e1000_defines.h |  1 +
 drivers/net/intel/e1000/base/e1000_hw.h      |  1 +
 drivers/net/intel/e1000/base/e1000_i225.c    | 56 +++++++++++++++-----
 3 files changed, 45 insertions(+), 13 deletions(-)

diff --git a/drivers/net/intel/e1000/base/e1000_defines.h b/drivers/net/intel/e1000/base/e1000_defines.h
index 0b370977f3..41922d7477 100644
--- a/drivers/net/intel/e1000/base/e1000_defines.h
+++ b/drivers/net/intel/e1000/base/e1000_defines.h
@@ -1381,6 +1381,7 @@
 #define BCM54616_E_PHY_ID	0x03625D10
 #define M88_VENDOR		0x0141
 #define I225_I_PHY_ID		0x67C9DC00
+#define I225_I_PHY_ID_MASK	0xFFFFFC00
 #define I226_LM_PHY_ID		0x67C9DC10
 
 /* M88E1000 Specific Registers */
diff --git a/drivers/net/intel/e1000/base/e1000_hw.h b/drivers/net/intel/e1000/base/e1000_hw.h
index 2777922a6b..2c425fd799 100644
--- a/drivers/net/intel/e1000/base/e1000_hw.h
+++ b/drivers/net/intel/e1000/base/e1000_hw.h
@@ -1040,6 +1040,7 @@ struct e1000_dev_spec_vf {
 struct e1000_dev_spec_i225 {
 	bool global_device_reset;
 	bool eee_disable;
+	bool wait_for_valid_phy_id_read;
 	bool clear_semaphore_once;
 	bool module_plugged;
 	u8 media_port;
diff --git a/drivers/net/intel/e1000/base/e1000_i225.c b/drivers/net/intel/e1000/base/e1000_i225.c
index 1dc7138856..aff334230f 100644
--- a/drivers/net/intel/e1000/base/e1000_i225.c
+++ b/drivers/net/intel/e1000/base/e1000_i225.c
@@ -143,8 +143,10 @@ STATIC s32 e1000_init_mac_params_i225(struct e1000_hw *hw)
 STATIC s32 e1000_init_phy_params_i225(struct e1000_hw *hw)
 {
 	struct e1000_phy_info *phy = &hw->phy;
+	u16 phy_id_retries = 1, phy_id_retries_interval_ms = 100;
 	s32 ret_val = E1000_SUCCESS;
 	u32 ctrl_ext;
+	u16 i = 0;
 
 	DEBUGFUNC("e1000_init_phy_params_i225");
 
@@ -184,20 +186,48 @@ STATIC s32 e1000_init_phy_params_i225(struct e1000_hw *hw)
 	phy->ops.read_reg = e1000_read_phy_reg_gpy;
 	phy->ops.write_reg = e1000_write_phy_reg_gpy;
 
-	ret_val = e1000_get_phy_id(hw);
-
-	/*
-	 * IGC/IGB merge note: in base code, there was a PHY ID check for I225
-	 * at this point. However, in DPDK version of IGC this check was
-	 * removed because it interfered with some i225-based NICs, and it was
-	 * deemed unnecessary because only the i225 NIC would've called this
-	 * code anyway because it was in the IGC driver.
-	 *
-	 * In merged IGB/IGC, this code is still only called by i225-based NICs,
-	 * so the previous fix is applicable.
-	 */
-	phy->type = e1000_phy_i225;
+	if (hw->dev_spec._i225.wait_for_valid_phy_id_read) {
+		phy_id_retries = 10;
+		DEBUGOUT1("Going to wait %d ms for a valid PHY ID read...\n",
+			  phy_id_retries * phy_id_retries_interval_ms);
+	}
 
+	for (i = 0; i < phy_id_retries; i++) {
+		ret_val = e1000_get_phy_id(hw);
+		phy->id &= I225_I_PHY_ID_MASK;
+		DEBUGOUT1("PHY ID value = 0x%08x\n", phy->id);
+
+		/*
+		* IGC/IGB merge note: in base code, there was a PHY ID check for
+		* I225 at this point. However, in DPDK version of IGC this check
+		* was removed because it interfered with some i225-based NICs,
+		* and it was deemed unnecessary because only the i225 NIC
+		* would've called this code anyway because it was in the IGC
+		* driver.
+		*
+		* This code was then amended apparently because there were
+		* issues wih reading PHY ID on some platforms, and PHY ID read
+		* was to be retried multiple times. However, the original fix in
+		* the base code still had the PHY ID check, and it is now
+		* necessary because there is a chance to read an invalid PHY ID.
+		* So, in backport, it was decided to replace the equality check
+		* with a non-zero condition, because the "invalid" PHY ID as
+		* reported in the original issue, was 0. So, as long as we read
+		* a non-zero PHY ID, we consider it valid.
+		*/
+		if (phy->id != 0) {
+			phy->type = e1000_phy_i225;
+			phy->ops.set_d0_lplu_state = e1000_set_d0_lplu_state_i225;
+			phy->ops.set_d3_lplu_state = e1000_set_d3_lplu_state_i225;
+
+			return ret_val;
+		}
+
+		msec_delay(phy_id_retries_interval_ms);
+	}
+
+	DEBUGOUT("Failed to read PHY ID\n");
+	ret_val = E1000_ERR_PHY;
 out:
 	return ret_val;
 }
-- 
2.43.5


  parent reply	other threads:[~2025-01-31 13:03 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-31 12:58 [PATCH v1 00/42] Merge Intel IGC and E1000 drivers, and update E1000 base code Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 01/42] net/e1000/base: fix semaphore timeout value Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 02/42] net/e1000/base: add initial support for i225 Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 03/42] net/e1000/base: add link bringup " Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 04/42] net/e1000/base: add LED blink " Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 05/42] net/e1000/base: add NVM/EEPROM " Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 06/42] net/e1000/base: add LTR support in i225 Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 07/42] net/e1000/base: add eee support for i225 Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 08/42] net/e1000/base: add misc definitions " Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 09/42] net/e1000: merge igc with e1000 Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 10/42] net/e1000: add missing i225 devices Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 11/42] net/e1000: add missing hardware support Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 12/42] net/e1000: add support for more I219 devices Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 13/42] net/e1000/base: correct minor formatting issues Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 14/42] net/e1000/base: correct mPHY access logic Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 15/42] net/e1000/base: skip MANC check for 82575 Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 16/42] net/e1000/base: correct disable k1 logic Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 17/42] net/e1000/base: workaround for packet loss Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 18/42] net/e1000/base: add EEE common API function Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 19/42] net/e1000/base: add queue select definitions Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 20/42] net/e1000/base: add profile information field Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 21/42] net/e1000/base: add LPI counters Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 22/42] net/e1000/base: improve code flow in ICH8LAN Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 23/42] net/e1000/base: add definition for EXFWSM register Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 24/42] net/e1000/base: use longer ULP exit timeout on more HW Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 25/42] net/e1000/base: make e1000_access_phy_wakeup_reg_bm non-static Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 26/42] net/e1000/base: make debug prints more informative Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 27/42] net/e1000/base: add WoL definitions Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 28/42] net/e1000/base: hardcode bus parameters for ICH8 Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 29/42] net/e1000/base: improve NVM checksum handling Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 30/42] net/e1000/base: remove redundant access to RO register Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 31/42] net/e1000/base: remove non-inclusive language Anatoly Burakov
2025-01-31 12:58 ` Anatoly Burakov [this message]
2025-01-31 12:58 ` [PATCH v1 33/42] net/e1000/base: add PHY read/write retry mechanism Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 34/42] net/e1000/base: fix iterator type Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 35/42] net/e1000/base: fix static analysis warnings Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 36/42] net/e1000/base: fix reset for 82580 Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 37/42] net/e1000/base: fix mac addr hash bit_shift Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 38/42] net/e1000/base: fix uninitialized variable usage Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 39/42] net/e1000/base: fix unchecked return Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 40/42] net/e1000/base: fix data type in MAC hash Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 41/42] net/e1000/base: rename NVM version variable Anatoly Burakov
2025-01-31 12:58 ` [PATCH v1 42/42] net/e1000/base: update readme Anatoly Burakov
2025-01-31 13:11 ` [PATCH v1 00/42] Merge Intel IGC and E1000 drivers, and update E1000 base code Bruce Richardson
2025-01-31 13:13   ` David Marchand

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=b1ae7a898befb1e6b052d0b91b0fe92b11005cc3.1738328108.git.anatoly.burakov@intel.com \
    --to=anatoly.burakov@intel.com \
    --cc=dev@dpdk.org \
    /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;
as well as URLs for NNTP newsgroup(s).