I want to use this ONU-SFP with Marvell Macchiatobin double slot.
GE-PONA SFP-ONU<1>S
When I connect this to an SFP port, I get the following error:
SFP2.5GPort:
[ 132.334577] sfp sfp-eth3: module NTT 0000000000000000 rev 0000 sn 0000000000000000 dc 160408
[ 132.344375] mvpp2 f4000000.ethernet eth3: switched to inband/1000base-x link mode
[ 132.364093] sfp sfp-eth3: Failed to read EEPROM: -5
[ 132.471129] sfp sfp-eth3: Failed to read EEPROM: -5
[ 132.579128] sfp sfp-eth3: Failed to read EEPROM: -5
SFP10GPort:
[ 8.078575] sfp sfp-eth1: module NTT 0000000000000000 rev 0000 sn 0000000000000000 dc 160408
[ 8.088367] mv88x3310 f212a600.mdio-mii:08: incompatible SFP module inserted
Anyone have an idea to fix this?
https://openwrt.org/toh/hwdata/marvell/marvell_macchiatobin
19.07 kernel version are 4.19 & 5.4
Fixed it for 4.19 kernel from ARM Linux soruce.
--- aaa/drivers/net/phy/sfp.c
+++ bbb/drivers/net/phy/sfp.c
@@ -1525,39 +1525,64 @@
static int sfp_sm_mod_hpower(struct sfp *sfp, bool enable)
{
+ u32 power;
u8 val;
int err;
+
+ power = 1000;
+ if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_POWER_DECL))
+ power = 1500;
+ if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_HIGH_POWER_LEVEL))
+ power = 2000;
+
+ if (sfp->id.ext.sff8472_compliance == SFP_SFF8472_COMPLIANCE_NONE &&
+ (sfp->id.ext.diagmon & (SFP_DIAGMON_DDM | SFP_DIAGMON_ADDRMODE)) !=
+ SFP_DIAGMON_DDM) {
+ /* The module appears not to implement bus address 0xa2,
+ * or requires an address change sequence, so assume that
+ * the module powers up in the indicated power mode.
+ */
+ if (power > sfp->max_power_mW) {
+ dev_err(sfp->dev,
+ "Host does not support %u.%uW modules\n",
+ power / 1000, (power / 100) % 10);
+ return -EINVAL;
+ }
+ return 0;
+ }
+
+ if (power > sfp->max_power_mW) {
+ dev_warn(sfp->dev,
+ "Host does not support %u.%uW modules, module left in power mode 1\n",
+ power / 1000, (power / 100) % 10);
+ return 0;
+ }
+
+ if (power <= 1000)
+ return 0;
err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
if (err != sizeof(val)) {
dev_err(sfp->dev, "Failed to read EEPROM: %d\n", err);
- return -EAGAIN;
- }
-
- /* DM7052 reports as a high power module, responds to reads (with
- * all bytes 0xff) at 0x51 but does not accept writes. In any case,
- * if the bit is already set, we're already in high power mode.
- */
- if (!!(val & BIT(0)) == enable)
- return 0;
-
- if (enable)
- val |= BIT(0);
- else
- val &= ~BIT(0);
+ err = -EAGAIN;
+ goto err;
+ }
+
+ val |= BIT(0);
err = sfp_write(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
if (err != sizeof(val)) {
dev_err(sfp->dev, "Failed to write EEPROM: %d\n", err);
- return -EAGAIN;
- }
-
- if (enable)
- dev_info(sfp->dev, "Module switched to %u.%uW power level\n",
- sfp->module_power_mW / 1000,
- (sfp->module_power_mW / 100) % 10);
-
- return 0;
+ err = -EAGAIN;
+ goto err;
+ }
+
+ dev_info(sfp->dev, "Module switched to %u.%uW power level\n",
+ power / 1000, (power / 100) % 10);
+ return T_HPOWER_LEVEL;
+
+err:
+ return err;
}
static int sfp_sm_mod_probe(struct sfp *sfp, bool report)
Embarrassing...
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -1593,6 +1593,9 @@
u8 val;
int err;
+
+ return 0;
+
err = sfp_read(sfp, true, SFP_EXT_STATUS, &val, sizeof(val));
if (err != sizeof(val)) {
dev_err(sfp->dev, "Failed to read EEPROM: %d\n", err);
+ if (!memcmp(id.base.vendor_name, "NTT ", 16) &&
+ !memcmp(id.base.vendor_pn, "0000000000000000", 16))
This is not going to work.
If this works,
case SFP_MOD_HPOWER:
I think I can rewrite this to make it work better.
Can anyone tell me how I can make the module decision better?