Intel-Wired-Lan Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Tony Nguyen <anthony.l.nguyen@intel.com>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [PATCH S58 05/13] ice: Reimplement module reads used by ethtool
Date: Wed, 31 Mar 2021 14:17:00 -0700	[thread overview]
Message-ID: <20210331211708.55205-5-anthony.l.nguyen@intel.com> (raw)
In-Reply-To: <20210331211708.55205-1-anthony.l.nguyen@intel.com>

From: Scott W Taylor <scott.w.taylor@intel.com>

There was an excessive increment of the QSFP page, which is
now fixed. Additionally, this new update now reads 8 bytes
at a time and will retry each request if the module/bus is
busy.

Also, prevent reading from upper pages if module does not
support those pages.

Signed-off-by: Scott W Taylor <scott.w.taylor@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
---
 drivers/net/ethernet/intel/ice/ice_ethtool.c | 49 ++++++++++++++++----
 1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
index 68c8ad8d157e..06cb86746415 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
@@ -3914,30 +3914,33 @@ ice_get_module_eeprom(struct net_device *netdev,
 		      struct ethtool_eeprom *ee, u8 *data)
 {
 	struct ice_netdev_priv *np = netdev_priv(netdev);
+#define SFF_READ_BLOCK_SIZE 8
+	u8 value[SFF_READ_BLOCK_SIZE] = { 0 };
 	u8 addr = ICE_I2C_EEPROM_DEV_ADDR;
 	struct ice_vsi *vsi = np->vsi;
 	struct ice_pf *pf = vsi->back;
 	struct ice_hw *hw = &pf->hw;
 	enum ice_status status;
 	bool is_sfp = false;
-	unsigned int i;
+	unsigned int i, j;
 	u16 offset = 0;
-	u8 value = 0;
 	u8 page = 0;
 
 	if (!ee || !ee->len || !data)
 		return -EINVAL;
 
-	status = ice_aq_sff_eeprom(hw, 0, addr, offset, page, 0, &value, 1, 0,
+	status = ice_aq_sff_eeprom(hw, 0, addr, offset, page, 0, value, 1, 0,
 				   NULL);
 	if (status)
 		return -EIO;
 
-	if (value == ICE_MODULE_TYPE_SFP)
+	if (value[0] == ICE_MODULE_TYPE_SFP)
 		is_sfp = true;
 
-	for (i = 0; i < ee->len; i++) {
+	memset(data, 0, ee->len);
+	for (i = 0; i < ee->len; i += SFF_READ_BLOCK_SIZE) {
 		offset = i + ee->offset;
+		page = 0;
 
 		/* Check if we need to access the other memory page */
 		if (is_sfp) {
@@ -3953,11 +3956,37 @@ ice_get_module_eeprom(struct net_device *netdev,
 			}
 		}
 
-		status = ice_aq_sff_eeprom(hw, 0, addr, offset, page, !is_sfp,
-					   &value, 1, 0, NULL);
-		if (status)
-			value = 0;
-		data[i] = value;
+		/* Bit 2 of eeprom address 0x02 declares upper
+		 * pages are disabled on QSFP modules.
+		 * SFP modules only ever use page 0.
+		 */
+		if (page == 0 || !(data[0x2] & 0x4)) {
+			/* If i2c bus is busy due to slow page change or
+			 * link management access, call can fail. This is normal.
+			 * So we retry this a few times.
+			 */
+			for (j = 0; j < 4; j++) {
+				status = ice_aq_sff_eeprom(hw, 0, addr, offset, page,
+							   !is_sfp, value,
+							   SFF_READ_BLOCK_SIZE,
+							   0, NULL);
+				netdev_dbg(netdev, "SFF %02X %02X %02X %X = %02X%02X%02X%02X.%02X%02X%02X%02X (%X)\n",
+					   addr, offset, page, is_sfp,
+					   value[0], value[1], value[2], value[3],
+					   value[4], value[5], value[6], value[7],
+					   status);
+				if (status) {
+					usleep_range(1500, 2500);
+					memset(value, 0, SFF_READ_BLOCK_SIZE);
+					continue;
+				}
+				break;
+			}
+
+			/* Make sure we have enough room for the new block */
+			if ((i + SFF_READ_BLOCK_SIZE) < ee->len)
+				memcpy(data + i, value, SFF_READ_BLOCK_SIZE);
+		}
 	}
 	return 0;
 }
-- 
2.20.1


  parent reply	other threads:[~2021-03-31 21:17 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-31 21:16 [Intel-wired-lan] [PATCH S58 01/13] ice: refactor interrupt moderation writes Tony Nguyen
2021-03-31 21:16 ` [Intel-wired-lan] [PATCH S58 02/13] ice: replace custom AIM algorithm with kernel's DIM library Tony Nguyen
2021-04-14 23:19   ` Brelinski, TonyX
2021-03-31 21:16 ` [Intel-wired-lan] [PATCH S58 03/13] ice: manage interrupts during poll exit Tony Nguyen
2021-04-12 17:27   ` Brelinski, TonyX
2021-03-31 21:16 ` [Intel-wired-lan] [PATCH S58 04/13] ice: refactor ITR data structures Tony Nguyen
2021-04-12 17:18   ` Brelinski, TonyX
2021-03-31 21:17 ` Tony Nguyen [this message]
2021-04-08 21:31   ` [Intel-wired-lan] [PATCH S58 05/13] ice: Reimplement module reads used by ethtool Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 06/13] ice: print name in /proc/iomem Tony Nguyen
2021-04-08 21:35   ` Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 07/13] ice: use local for consistency Tony Nguyen
2021-04-08 21:38   ` Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 08/13] ice: remove unused struct member Tony Nguyen
2021-04-08 21:41   ` Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 09/13] ice: Set vsi->vf_id as ICE_INVAL_VFID for non VF VSI types Tony Nguyen
2021-04-08 22:24   ` Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 10/13] ice: suppress false cppcheck issues Tony Nguyen
2021-04-08 22:26   ` Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 11/13] ice: fix clang warning regarding deadcode.DeadStores Tony Nguyen
2021-04-08 22:30   ` Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 12/13] ice: remove return variable Tony Nguyen
2021-04-08 22:33   ` Brelinski, TonyX
2021-03-31 21:17 ` [Intel-wired-lan] [PATCH S58 13/13] ice: reduce scope of variable Tony Nguyen
2021-04-08 22:37   ` Brelinski, TonyX
2021-04-08 19:54 ` [Intel-wired-lan] [PATCH S58 01/13] ice: refactor interrupt moderation writes Brelinski, TonyX

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=20210331211708.55205-5-anthony.l.nguyen@intel.com \
    --to=anthony.l.nguyen@intel.com \
    --cc=intel-wired-lan@osuosl.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