Could you test if the attached patch fixes the issue for you? This rearranges the tests in sfp_module_parse_power() so that your module is silently accepted without reconfiguration - like it was before commit 7cfa9c92d0a3.
The module will still be rejected as EINVAL in case the host doesn't support high power. We don't try to configure modules modules requiring the unsupported Address Change Sequence. I see no reason to reject such modules even if the host doesn't support high power, so I moved that block up in front of the host power check. Completely untested since I don't have any such module... This should not change anything for other types of modules. Bjørn
>From f232c37c94239b56aeebfec26da26faf7df39b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= <[email protected]> Date: Mon, 29 Nov 2021 14:43:38 +0100 Subject: [PATCH] phy: sfp: fix high power modules without diag mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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-by: 照山周一郎 <[email protected]> Signed-off-by: Bjørn Mork <[email protected]> --- 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 32c34c728c7a..126c955714cb 100644 --- a/drivers/net/phy/sfp.c +++ b/drivers/net/phy/sfp.c @@ -1595,27 +1595,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. @@ -1627,6 +1606,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
_______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
