Support for GE-PON<M>A SFP-ONU<1>S

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?