Site Tools


projects:homelab:sfp_gpon_onu:eeprom_editing

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
projects:homelab:sfp_gpon_onu:eeprom_editing [2026/03/21 16:35] – Remove SFPTotal Wizard dependency, do all calculations in OpenWrt, don't hardcode i2c bus number Andrew Yongprojects:homelab:sfp_gpon_onu:eeprom_editing [2026/03/21 17:21] (current) – clarification on 1000BASE-X linux limitation Andrew Yong
Line 30: Line 30:
             serial="$serial$(printf "\\x$(i2cget -y $b 0x50 $reg | sed 's/0x//')")"             serial="$serial$(printf "\\x$(i2cget -y $b 0x50 $reg | sed 's/0x//')")"
         done         done
 +        echo ""
         echo "Bus: $b"         echo "Bus: $b"
         echo "├─▶ Vendor: $vendor"         echo "├─▶ Vendor: $vendor"
         echo "└─▶ S/N: $serial"         echo "└─▶ S/N: $serial"
-        echo "" 
     fi     fi
 done</code> done</code>
Line 52: Line 52:
  
 ^  Address  ^  Field  ^  Old Value  ^  New Value  ^  Reason  ^ ^  Address  ^  Field  ^  Old Value  ^  New Value  ^  Reason  ^
-|  ''0x06''  |  Ethernet Compliance  |  ''0x02''  |  ''0x00''  |  Disable 1000BASE-LX so Linux prefers 2500BASE-X  |+|  ''0x06''  |  Ethernet Compliance  |  ''0x02''  |  ''0x00''  |  Clear 1000BASE-LX to avoid advertising conflicting speeds alongside 2500BASE-X  |
 |  ''0x0A''  |  Extended Compliance  |  ''0x00''  |  ''0x05''  |  Declare 2500BASE-X support  | |  ''0x0A''  |  Extended Compliance  |  ''0x00''  |  ''0x05''  |  Declare 2500BASE-X support  |
-|  ''0x0C''  |  Nominal Bit Rate     |  ''0x0D''  |  ''0x1F''  |  Set to 3100MBd (correct value for 2500BASE-X) +|  ''0x0C''  |  Nominal Bit Rate  |  ''0x0D''  |  ''0x1F''  |  Set to 3100MBd (correct value for 2500BASE-X) 
-|  ''0x3F''  |  CC_BASE Checksum     |  (varies)  |  (recalculated by ''awk'' |  Sum of bytes 0x00–0x3E mod 256  |+|  ''0x3F''  |  CC_BASE Checksum  |  (varies)  |  (recalculated by ''awk'' |  Sum of bytes 0x00–0x3E mod 256  | 
 +|  ''0x5F''  |  CC_EXT Checksum  |  (varies)  |  (unchanged)  |  Not affected by these changes 
 + 
 +==== EEPROM Bits (XG-PON/XGS-PON) ==== 
 + 
 +> ⚠️ **Warning:** These settings are untested. Proceed with caution. 
 + 
 +Notes: 
 + 
 +  * Due to Linux kernel limitations, only a single speed can be advertised via EEPROM for XG-PON/XGS-PON. Multi-rate combinations (e.g. 2.5/5Gbps, 5/10Gbps, 2.5/5/10Gbps) are not achievable through EEPROM editing alone((Linux's SFP bus driver derives supported speeds solely from EEPROM compliance codes, which only allows a single speed to be declared via the compliance code bytes. Multi-rate support requires either a kernel quirk (hardcoded per vendor/part number in ''sfp.c''), a PHY-emulating module that negotiates speeds independently, or a NIC driver that bypasses the generic SFP bus logic entirely.)) 
 +  * You do not have to update the 0x5F checksum (CC_EXT) unless you edit addresses ''0x40''–''0x5E'', which are out of scope of this guide; but in case you need it, this command will update CC_EXT:\\ ''%%i2cset -y $BUS 0x50 0x5f $(i2cdump -y -r 64-94 $BUS 0x50 b | awk 'NR>1 {for(i=2;i<=NF;i++) if($i~/^[0-9a-f]{2}$/) {cmd="printf \"%d\" 0x"$i; cmd|getline d; close(cmd); sum+=d}} END {printf "0x%02x", sum % 256}')%%'' 
 + 
 +=== Fiber Rates (No PHY) === 
 + 
 +^  Address  ^  Field  ^  Choose only ONE column of values  ^^^^^^ 
 +^  :::  ^  :::  ^  1000BASE-X  ^  2500BASE-X  ^  10GBASE-LR  ^  10GBASE-SR  ^  10GBASE-LRM  ^  10GBASE-ER 
 +|  ''0x03''  |  10G Ethernet Compliance  |  ''0x00''  |  ''0x00''  |  ''0x20''  |  ''0x10''  |  ''0x40''  |  ''0x80'' 
 +|  ''0x06''  |  Ethernet Compliance  |  ''0x02''  |  ''0x00''  |  ''0x00''  |  ''0x00''  |  ''0x00''  |  ''0x00'' 
 +|  ''0x0A''  |  Extended Compliance  |  ''0x00''  |  ''0x05''  |  ''0x00''  |  ''0x00''  |  ''0x00''  |  ''0x00'' 
 +|  ''0x0C''  |  Nominal Bit Rate  |  ''0x0D'' (1300MBd)  |  ''0x1F'' (3100MBd)  |  ''0x67'' (10300MBd)  |  ''0x67'' (10300MBd)  |  ''0x67'' (10300MBd)  |  ''0x67'' (10300MBd) 
 +|  ''0x3F''  |  CC_BASE Checksum  |  (recalculated by ''awk'' |||||| 
 + 
 +Notes: 
 + 
 +  * Set ''0x06'' to ''0x00'' (clear 1000BASE-LX) for all configurations above except 1000BASE-X, to avoid advertising conflicting speeds alongside the selected rate
  
 +=== Copper Rates (PHY Emulation Required) ===
  
 +^  Address  ^  Field  ^  Choose only ONE column of values  ^^^^
 +^  :::  ^  :::  ^  2500BASE-T  ^  5GBASE-T  ^  10GBASE-T (SFI)  ^  10GBASE-T (SR, 30m)  ^
 +|  ''0x03''  |  10G Ethernet Compliance  |  ''0x00''  |  ''0x00''  |  ''0x00''  |  ''0x00''  |
 +|  ''0x06''  |  Ethernet Compliance  |  ''0x00''  |  ''0x00''  |  ''0x00''  |  ''0x00''  |
 +|  ''0x0A''  |  Extended Compliance  |  ''0x1E''  |  ''0x1D''  |  ''0x16''  |  ''0x1C''  |
 +|  ''0x0C''  |  Nominal Bit Rate  |  ''0x1F'' (3100MBd)  |  ''0x32'' (5000MBd)  |  ''0x67'' (10300MBd)  |  ''0x67'' (10300MBd)  |
 +|  ''0x3F''  |  CC_BASE Checksum  |  (recalculated by ''awk'' ||||
projects/homelab/sfp_gpon_onu/eeprom_editing.1774110900.txt.gz · Last modified: by Andrew Yong