BPI-R3 SFP port stuck at 1G with FS 2.5G module

Hi everyone,

I’m currently facing an issue with the sfp2 port on my Banana Pi R3 running OpenWrt. I’m trying to establish a 2.5G optical link between the BPI-R3 and a MikroTik CRS310-8G+2S+ switch, but the BPI-R3 refuses to recognize the module’s 2.5G capability, falling back to 1G or completely disabling the port.

Hardware Setup:

  • Router: Banana Pi R3 (OpenWrt 24.10.4)
  • Switch: MikroTik CRS310-8G+2S+
  • SFP Modules (Both ends): FS SFP2.5G-SX-85 (2.5G Multi-Mode, 850nm)
# ethtool sfp2
Settings for sfp2:
	Supported ports: [ FIBRE ]
	Supported link modes:   1000baseX/Full 
	Supported pause frame use: Symmetric Receive-only
	Supports auto-negotiation: Yes
	Supported FEC modes: Not reported
	Advertised link modes:  1000baseX/Full 
	Advertised pause frame use: No
	Advertised auto-negotiation: Yes
	Advertised FEC modes: Not reported
	Link partner advertised link modes:  1000baseX/Full 
	Link partner advertised pause frame use: Symmetric
	Link partner advertised auto-negotiation: Yes
	Link partner advertised FEC modes: Not reported
	Speed: 1000Mb/s
	Duplex: Full
	Port: FIBRE
	PHYAD: 0
	Transceiver: internal
	Auto-negotiation: on
	Supports Wake-on: d
	Wake-on: d
	Link detected: yes

The Problem: When I plug in the SFP module, OpenWrt reads the EEPROM but fails to ascertain the 2500baseX link mode. It attempts to fall back to 1000baseX, but ultimately disables the port and stops the laser.

Here is the relevant dmesg output:

[6013727.135208] sfp sfp-2: module FS               SFP2.5G-SX-85    rev 3.0  sn C2512707604      dc 260120  
[6014666.687132] sfp sfp-2: Unable to ascertain link mode
[6014666.692274] mt7530-mdio mdio-bus:1f sfp2: selection of interface failed, advertisement 00,00000000,00000000,00006400
[6012132.041736] mt7530-mdio mdio-bus:1f sfp2: switched to inband/1000base-x link mode
[6012966.159226] br-lan: port 5(sfp2) entered blocking state
[6012966.164628] br-lan: port 5(sfp2) entered disabled state

What I have tried:

  1. 1G Link Works Perfectly: To rule out physical layer issues (bad fiber, dead module, wrong wavelengths), I forced the MikroTik switch to advertise only 1G Full with Auto-Negotiation enabled. Then, on the BPI-R3, I manually ran ip link set sfp2 up and brctl addif br-lan sfp2. The link comes up successfully at 1G, and traffic passes through perfectly. This proves the hardware and fibers are 100% functional.
  2. ethtool Fails: Running ethtool -s sfp2 speed 2500 duplex full autoneg off returns Invalid argument. The driver outright rejects it.
  3. Network config fails: Setting option speed ‘2500’ and option autoneg ‘0’ in /etc/config/network for sfp2 is also ignored/rejected by the kernel during initialization.

My question: I’m not sure what the next step is to enable the 2.5G mode. Build a modified OpenWRT, ask for a modified EEPROM from FS support, or something I missed? All ideas are appreciated. Thanks.

I have the same module and can reproduce the issue. Linux (OpenWrt) identifies the available SFP speeds in sfp_module_parse_support(). This module advertises:

  • 1000baseX
  • bitrate min/max/nominal = 2500

With that the outcome of the above function is "can only do 1G". So I added the following quirk into sfp_quirks[ ] (see drivers/net/phy/sfp.c) :

...
SFP_QUIRK_S("FS", "SFP2.5G-SX-85", sfp_quirk_2500basex),
...

With that I see:

root@OpenWrt:~# ethtool lan11
Settings for lan11:
        Supported ports: [ FIBRE ]
        Supported link modes:   2500baseX/Full
                                1000baseX/Full
        Supported pause frame use: Symmetric Receive-only
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  2500baseX/Full
        Advertised pause frame use: Symmetric Receive-only
        Advertised auto-negotiation: No
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Unknown! (255)
        Port: FIBRE
        PHYAD: 0
        Transceiver: internal
        Auto-negotiation: off
        Supports Wake-on: d
        Wake-on: d
        Link detected: no

Your quirk works, thank you very much!

On 24.10.5, the kernel version is 6.6.119, and I had to make a minor change to get it working:

...
SFP_QUIRK_M("FS", "SFP2.5G-SX-85", sfp_quirk_2500basex),
...

Have you submitted this quirk upstream? It would be great to avoid building a custom image for each release.

There is a way to modify the SFP eeprom to make it announce 2500, I have modified the eeprom to get it working on a difference device and no modification is required in openwrt.

Sounds pretty cool. Could you share more details about how you modified the SFP EEPROM to make it announce 2.5G?

Sorry, I read it incorrectly, I modified the EEPROM of FS ONU SFP module.

I can try to help you with this one, I am guessing it has physical EEPROM, right?

If yes you can try the instructions on this page: https://ndoo.sg/projects:homelab:sfp_gpon_onu:eeprom_editing

Let me know how it goes.