Specification revisions & version bytes
Specifications are living documents. A module declares which revision its memory map follows, and a host parses the map according to the revision it knows. Most of the time the two agree well enough; when they do not, a byte gets read as something it is not. This page lists the version bytes, how to decode them, and — roughly — what each generation added, so that you can tell whether a field you are looking at even exists for the module in front of you.
Where the version is declared
| Family | Byte | Encoding |
|---|---|---|
| SFF-8472 (SFP) | A0h byte 94 | enumerated code (table below) |
| SFF-8636 (QSFP) | byte 1 | enumerated code (table below) |
| CMIS | byte 1 | major nibble . minor nibble (50h = 5.0) |
| MIS (SFP-DD) | byte 1 | as CMIS |
| INF-8077i (XFP) | none | the identifier 06h implies INF-8077i rev 4.x |
SFF-8472 — byte 94
| Value | Revision | Notable additions, roughly |
|---|---|---|
| 00h | not specified | pre-diagnostic modules; identity only |
| 01h | 9.3 | first digital diagnostics: A2h thresholds, monitors, flags |
| 02h | 9.5 | clarifications, optional laser temperature / TEC monitors |
| 03h | 10.2 | SFP+ era: rate select, linear receiver option, byte 93 enhanced options |
| 04h | 10.4 | soft rate select per SFF-8431, power level 2, application select per SFF-8079 |
| 05h | 11.0 | 10G copper (DAC) coding — cable technology bits, attenuation in 60–61 |
| 06h | 11.3 | extended options, tunable transmitter option, 16GFC speed codes |
| 07h | 11.4 | paged A2h memory (byte 64 bit 4), SFF-8690 tunable page 02h |
| 08h | 12.0 | byte 36 extended specification compliance via SFF-8024; 25G/100G-era codes |
| 09h | 12.4 | power level 3 (2.0 W), FC speed 2 in byte 62, PAM4 encoding code, alignment with SFF-8024 |
Rule of thumb: a module claiming 08h or 09h must have byte 36 meaningful (or zero) and the ×250 Mb/s rate in byte 66 when byte 12 = FFh; a module claiming 03h or below has no byte 36 semantics at all — hosts ignore it.
SFF-8636 — byte 1
| Value | Map follows | Notable additions |
|---|---|---|
| 00h | not specified (SFF-8436 rev 4.8 or earlier) | original QSFP+ map |
| 01h | SFF-8436 rev 4.8 or earlier | — |
| 02h | SFF-8436 rev 4.8 with bytes 186–189 per SFF-8636 | wavelength and tolerance fields |
| 03h | SFF-8636 rev 1.3 or earlier | first SFF-8636 |
| 04h | rev 1.4 | — |
| 05h | rev 1.5 | — |
| 06h | rev 2.0 | QSFP28 / 100G: byte 192 extended compliance, power classes 5–7, CDR control and LOL flags |
| 07h | rev 2.5, 2.6, 2.7 | pages 20h–21h, Tx-disable fast mode, more Table 4-4 codes |
| 08h | rev 2.8, 2.9, 2.10 | power class 8 and byte 107 max power, 200G (QSFP56) codes, PAM4 encoding |
Hosts that predate rev 2.0 will not look at byte 192 — a 100G module in a 40G-era switch is "unknown" for that reason alone, whatever the vendor block says.
CMIS — byte 1
| Value | Version | Notable changes |
|---|---|---|
| 30h | 3.0 (2018, QSFP-DD MSA) | first common model: lower/upper pages, applications, module and data-path state machines, CDB |
| 40h | 4.0 (2019) | staged control sets, VDM pages 20h–2Fh, extended application descriptors, clearer durations |
| 41h | 4.1 | corrections and clarifications |
| 50h | 5.0 (2021, OIF) | banks up to 32 lanes, refined data-path and lane-flag model, expanded VDM observables, diagnostic pages 13h–14h |
| 51h–53h | 5.1, 5.2, 5.3 | incremental: additional VDM types, coherent (ZR) monitoring hooks, firmware-management refinements |
A CMIS 5.x module in a host that implements 4.0 usually works for the basic flow (state machine, application select) but the host will not read newer VDM pages; a 3.0-only host may fail to bring up a 5.x module at all — CMIS issues. MIS versions track CMIS: MIS.
Compatibility rules
- Newer module, older host — unknown codes decode as unknown; a higher byte 94 / byte 1 value is normally tolerated. Problems start when the host needs a field that only exists in the new revision (byte 192, applications).
- Older module, newer host — fine; hosts keep backward parsing.
- Claimed revision inconsistent with content — the real trap. Declaring 12.x with an empty byte 66 while byte 12 = FFh gives a host "0 Gb/s"; declaring rev 2.0+ with garbage in byte 192 gives unknown type. When coding, set the revision byte to match the fields you actually use.
- SFF-8024 has no version byte in the module; the host's table revision decides which codes it can name.
Other documents and their cadence
| Document | Current generation | Notes |
|---|---|---|
| SFF-8024 | rev 4.x, revised several times a year | new identifiers, connectors and interface IDs land here first |
| INF-8077i | rev 4.5 (2005) | XFP; stable, no further revisions expected — XFP |
| SFF-8690 / SFF-TA-1004 | 1.x | tunable maps — Tunable maps |
| SFF-8079 / SFF-8089 | 1.x | rate/application select — Rate select |
| Hardware specs (SFF-8431, SFF-8679, QSFP-DD HW, OSFP) | see catalog | SFP, QSFP hardware families |
Document numbers and titles: MSA specification catalog.
In CodingBox
CodingBox reads the revision byte first and applies the matching field definitions, so fields that do not exist for the declared revision are shown as reserved rather than mis-labelled. The EEPROM editor lets you set the revision byte together with the fields it governs.