All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net,stable] phy: sfp: fix high power modules without diag mode
@ 2021-11-30  7:39 Bjørn Mork
  2021-12-03  1:58 ` Jakub Kicinski
  0 siblings, 1 reply; 17+ messages in thread
From: Bjørn Mork @ 2021-11-30  7:39 UTC (permalink / raw)
  To: netdev
  Cc: Bjørn Mork, 照山周一郎, Russell King

Commit 7cfa9c92d0a3 ("net: sfp: avoid power switch on address-change
modules") changed semantics for high power modules without diag mode.
We repeatedly try to read the current power status from the non-existing
0xa2 address, in the futile hope this failure is temporary:

[    8.856051] sfp sfp-eth3: module NTT              0000000000000000 rev 0000 sn 0000000000000000 dc 160408
[    8.865843] mvpp2 f4000000.ethernet eth3: switched to inband/1000base-x link mode
[    8.873469] sfp sfp-eth3: Failed to read EEPROM: -5
[    8.983251] sfp sfp-eth3: Failed to read EEPROM: -5
[    9.103250] sfp sfp-eth3: Failed to read EEPROM: -5

Eeprom dump:

0x0000: 03 04 01 00 00 00 80 00 00 00 00 01 0d 00 0a 64
0x0010: 00 00 00 00 4e 54 54 20 20 20 20 20 20 20 20 20
0x0020: 20 20 20 20 00 00 00 00 30 30 30 30 30 30 30 30
0x0030: 30 30 30 30 30 30 30 30 30 30 30 30 05 1e 00 7d
0x0040: 02 00 00 00 30 30 30 30 30 30 30 30 30 30 30 30
0x0050: 30 30 30 30 31 36 30 34 30 38 20 20 00 00 00 75
0x0060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x00f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Previously we assumed such modules were powered up in the correct
mode, continuing without further configuration as long as the
required power class was supported by the host.

Revert to that behaviour, refactoring to keep the improved
diagnostic messages.

Fixes: 7cfa9c92d0a3 ("net: sfp: avoid power switch on address-change modules")
Reported-and-tested-by: 照山周一郎 <teruyama@springboard-inc.jp>
Cc: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: Bjørn Mork <bjorn@mork.no>
---
 drivers/net/phy/sfp.c | 42 +++++++++++++++++++++---------------------
 1 file changed, 21 insertions(+), 21 deletions(-)

diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index ab77a9f439ef..9742469a1e58 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -1647,27 +1647,6 @@ static int sfp_module_parse_power(struct sfp *sfp)
 	if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
 		power_mW = 2000;
 
-	if (power_mW > sfp->max_power_mW) {
-		/* Module power specification exceeds the allowed maximum. */
-		if (sfp->id.ext.sff8472_compliance ==
-			SFP_SFF8472_COMPLIANCE_NONE &&
-		    !(sfp->id.ext.diagmon & SFP_DIAGMON_DDM)) {
-			/* The module appears not to implement bus address
-			 * 0xa2, so assume that the module powers up in the
-			 * indicated mode.
-			 */
-			dev_err(sfp->dev,
-				"Host does not support %u.%uW modules\n",
-				power_mW / 1000, (power_mW / 100) % 10);
-			return -EINVAL;
-		} else {
-			dev_warn(sfp->dev,
-				 "Host does not support %u.%uW modules, module left in power mode 1\n",
-				 power_mW / 1000, (power_mW / 100) % 10);
-			return 0;
-		}
-	}
-
 	/* If the module requires a higher power mode, but also requires
 	 * an address change sequence, warn the user that the module may
 	 * not be functional.
@@ -1679,6 +1658,27 @@ static int sfp_module_parse_power(struct sfp *sfp)
 		return 0;
 	}
 
+	if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE &&
+	    !(sfp->id.ext.diagmon & SFP_DIAGMON_DDM)) {
+		/* The module appears not to implement bus address
+		 * 0xa2, so assume that the module powers up in the
+		 * indicated mode.
+		 */
+		if (power_mW <= sfp->max_power_mW)
+			return 0;
+
+		dev_err(sfp->dev, "Host does not support %u.%uW modules\n",
+			power_mW / 1000, (power_mW / 100) % 10);
+		return -EINVAL;
+	}
+
+	if (power_mW > sfp->max_power_mW) {
+		dev_warn(sfp->dev,
+			 "Host does not support %u.%uW modules, module left in power mode 1\n",
+			 power_mW / 1000, (power_mW / 100) % 10);
+		return 0;
+	}
+
 	sfp->module_power_mW = power_mW;
 
 	return 0;
-- 
2.30.2


^ permalink raw reply related	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2022-01-18  6:58 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-30  7:39 [PATCH net,stable] phy: sfp: fix high power modules without diag mode Bjørn Mork
2021-12-03  1:58 ` Jakub Kicinski
2021-12-03 11:54   ` Russell King (Oracle)
2021-12-03 12:58     ` Russell King (Oracle)
2021-12-03 13:55       ` Bjørn Mork
2021-12-04 12:38         ` Russell King (Oracle)
2021-12-06 10:35           ` Bjørn Mork
2021-12-06 15:39             ` 照山周一郎
2021-12-30 11:43               ` Bjørn Mork
2021-12-30 11:55                 ` Russell King (Oracle)
2021-12-30 12:00                   ` 照山周一郎
2022-01-15 16:58       ` Christian Lamparter
2022-01-17 14:24         ` Russell King (Oracle)
2022-01-17 14:44           ` Bjørn Mork
2022-01-17 14:49           ` Christian Lamparter
2022-01-18  6:58             ` 照山周一郎
2021-12-03 13:41     ` Bjørn Mork

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.