Hi Wozi,
Thanks for pointing me in the right direction! That makes perfect sense. I dug into the logs for both of my modules: the ODI DFP-34X-2IY3 and the HALNy HL-GSFP.
One crucial context detail first: neither of these are copper modules with standard PHYs. They are fiber GPON ONT sticks. To achieve 2.5G, they strictly require the host PCS to operate in 2500base-x (HSGMII) mode to negotiate with the internal SoC.
Here is what happens with both modules on your stable build (where they successfully link up, but only at 1G).
1. ODI DFP-34X-2IY3 EEPROM (ethtool -m):
Identifier : 0x03 (SFP)
Transceiver codes : 0x00 0x00 0x00 0x02 0x12 0x00 0x01 0x01 0x00
BR Nominal : 1300MBd
Vendor name : ODI
Vendor PN : DFP-34X-2IY3
dmesg:
[ 60.053405] sfp sfp2: module ODI DFP-34X-2IY3 rev sn XPON26050801 dc 260523
[ 60.079923] mtk_soc_eth 15100000.ethernet eth1: requesting link mode inband/1000base-x with support 00,00000000,00000200,00006440
[ 134.756177] mtk_soc_eth 15100000.ethernet eth1: Link is Up - 1Gbps/Full - flow control off`
2. HALNy HL-GSFP EEPROM (ethtool -m):
Transceiver type : Ethernet: 1000BASE-LX
BR Nominal : 1200MBd
Vendor name : HALNy___________
Vendor PN : HL-GSFP`
dmesg:
[ 1683.362782] sfp sfp2: module HALNy HL-GSFP rev V1.0 sn HALN1063133d dc 20200724
[ 1683.371217] sfp sfp2: module HALNy HL-GSFP rev V1.0 has been found in the quirk list
[ 1683.395387] mtk_soc_eth 15100000.ethernet eth1: requesting link mode inband/1000base-x with support 00,00000000,00000200,00006440
[ 1688.836179] mtk_soc_eth 15100000.ethernet eth1: Link is Up - 1Gbps/Full - flow control off`
Key Takeaways:
- As you predicted, the driver is completely bypassing
2500base-x and dropping straight to 1000base-x for both sticks. The EEPROMs on these Chinese GPON sticks often hardcode 1200/1300MBd to ensure basic compatibility, tricking the driver into 1G mode.
- Interestingly, the
HALNy HL-GSFP module actually hits an existing quirk (has been found in the quirk list). However, whatever that quirk is currently doing, it doesn’t force the interface mode to 2500base-x, as the driver still drops down to 1000base-x immediately after.
It looks like the exact fix is adding an SFP_QUIRK for both vendor/part strings that forces the interface specifically to 2500base-x (like the sfp_quirk_2500basex you mentioned).
Could you point me to the exact C file path in your MTK feed (e.g., inside drivers/net/phy/sfp.c or similar) where these quirks are maintained? I’d love to draft a patch forcing 2500base-x for these modules and test if the MT7988 SerDes switches the lane cleanly.
Thanks again for the incredible support!
Best, Sebastian