lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Date:   Tue, 30 Nov 2021 08:39:29 +0100
From:   Bjørn Mork <bjorn@...k.no>
To:     netdev@...r.kernel.org
Cc:     Bjørn Mork <bjorn@...k.no>,
        照山周一郎 
        <teruyama@...ingboard-inc.jp>,
        Russell King <rmk+kernel@...linux.org.uk>
Subject: [PATCH net,stable] phy: sfp: fix high power modules without diag mode

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@...ingboard-inc.jp>
Cc: Russell King <rmk+kernel@...linux.org.uk>
Signed-off-by: Bjørn Mork <bjorn@...k.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

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ