* [PATCH ethtool-next v2 1/2] sfpid: print all implemented options
@ 2026-07-11 9:54 Aleksander Jan Bajkowski
2026-07-11 9:54 ` [PATCH ethtool-next v2 2/2] sfpid: print all compliance codes Aleksander Jan Bajkowski
2026-07-12 18:15 ` [PATCH ethtool-next v2 1/2] sfpid: print all implemented options Danielle Ratson
0 siblings, 2 replies; 4+ messages in thread
From: Aleksander Jan Bajkowski @ 2026-07-11 9:54 UTC (permalink / raw)
To: danieller, mkubecek, andrew, davem, edumazet, kuba, pabeni, jbe,
netdev
Cc: Aleksander Jan Bajkowski
SFP modules implement multiple options. Before the “json” option was
introduced, all options were listed. Currently, only the last option
is listed. This commit fixes this bug. Options are represented as array.
Before:
$ ethtool -m sfp-wan
...
Option values : 0x00 0x32
Option : RATE_SELECT implemented
...
$ ethtool --json -m sfp-wan
[ {
...
"option_values": [ 0,50 ],
"option": "RATE_SELECT implemented",
...
} ]
After:
$ ethtool -m sfp-wan
...
Option values : 0x00 0x32
Option : RX_LOS implemented
Option : TX_DISABLE implemented
Option : RATE_SELECT implemented
...
$ ethtool --json -m sfp-wan
[ {
...
"option_values": [ 0,50 ],
"option": [ "RX_LOS implemented","TX_DISABLE implemented","RATE_SELECT implemented" ],
...
} ]
Fixes: 4071862f58d8 ("sfpid: Add JSON output handling to --module-info in SFF8079 modules")
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
---
Changes in v2:
- fix typo introduced -> introduced
- renamr module_print_array_string() -> module_print_any_array_string_entry()
---
module-common.c | 8 ++++++++
module-common.h | 1 +
sfpid.c | 48 ++++++++++++++++++++++++++++++++----------------
3 files changed, 41 insertions(+), 16 deletions(-)
diff --git a/module-common.c b/module-common.c
index 42fccf6..43ff649 100644
--- a/module-common.c
+++ b/module-common.c
@@ -258,6 +258,14 @@ void module_print_any_bool(const char *fn, char *given_json_fn, bool value,
printf("\t%-41s : %s\n", fn, str_value);
}
+void module_print_any_array_string_entry(const char *fn, const char *value)
+{
+ if (is_json_context())
+ print_string(PRINT_JSON, NULL, "%s", value);
+ else
+ printf("\t%-41s : %s\n", fn, value);
+}
+
void module_show_value_with_unit(const __u8 *id, unsigned int reg,
const char *name, unsigned int mult,
const char *unit)
diff --git a/module-common.h b/module-common.h
index 4063448..f3baf2a 100644
--- a/module-common.h
+++ b/module-common.h
@@ -281,6 +281,7 @@ void module_print_any_string(const char *fn, const char *value);
void module_print_any_float(const char *fn, float value, const char *unit);
void module_print_any_bool(const char *fn, char *given_json_fn, bool value,
const char *str_value);
+void module_print_any_array_string_entry(const char *fn, const char *value);
void module_show_value_with_unit(const __u8 *id, unsigned int reg,
const char *name, unsigned int mult,
const char *unit);
diff --git a/sfpid.c b/sfpid.c
index 74a6f51..ec5dd95 100644
--- a/sfpid.c
+++ b/sfpid.c
@@ -396,7 +396,6 @@ static void sff8079_show_wavelength_or_copper_compliance(const __u8 *id)
static void sff8079_show_options(const __u8 *id)
{
static const char *pfx = "Option";
- char value[64] = "";
if (is_json_context()) {
open_json_array("option_values", "");
@@ -407,35 +406,52 @@ static void sff8079_show_options(const __u8 *id)
printf("\t%-41s : 0x%02x 0x%02x\n", "Option values", id[64],
id[65]);
}
+
+ if (is_json_context())
+ open_json_array("option", "");
+
if (id[65] & (1 << 1))
- sprintf(value, "%s", "RX_LOS implemented");
+ module_print_any_array_string_entry(pfx,
+ "RX_LOS implemented");
if (id[65] & (1 << 2))
- sprintf(value, "%s", "RX_LOS implemented, inverted");
+ module_print_any_array_string_entry(pfx,
+ "RX_LOS implemented, inverted");
if (id[65] & (1 << 3))
- sprintf(value, "%s", "TX_FAULT implemented");
+ module_print_any_array_string_entry(pfx,
+ "TX_FAULT implemented");
if (id[65] & (1 << 4))
- sprintf(value, "%s", "TX_DISABLE implemented");
+ module_print_any_array_string_entry(pfx,
+ "TX_DISABLE implemented");
if (id[65] & (1 << 5))
- sprintf(value, "%s", "RATE_SELECT implemented");
+ module_print_any_array_string_entry(pfx,
+ "RATE_SELECT implemented");
if (id[65] & (1 << 6))
- sprintf(value, "%s", "Tunable transmitter technology");
+ module_print_any_array_string_entry(pfx,
+ "Tunable transmitter technology");
if (id[65] & (1 << 7))
- sprintf(value, "%s", "Receiver decision threshold implemented");
+ module_print_any_array_string_entry(pfx,
+ "Receiver decision threshold implemented");
if (id[64] & (1 << 0))
- sprintf(value, "%s", "Linear receiver output implemented");
+ module_print_any_array_string_entry(pfx,
+ "Linear receiver output implemented");
if (id[64] & (1 << 1))
- sprintf(value, "%s", "Power level 2 requirement");
+ module_print_any_array_string_entry(pfx,
+ "Power level 2 requirement");
if (id[64] & (1 << 2))
- sprintf(value, "%s", "Cooled transceiver implemented");
+ module_print_any_array_string_entry(pfx,
+ "Cooled transceiver implemented");
if (id[64] & (1 << 3))
- sprintf(value, "%s", "Retimer or CDR implemented");
+ module_print_any_array_string_entry(pfx,
+ "Retimer or CDR implemented");
if (id[64] & (1 << 4))
- sprintf(value, "%s", "Paging implemented");
+ module_print_any_array_string_entry(pfx,
+ "Paging implemented");
if (id[64] & (1 << 5))
- sprintf(value, "%s", "Power level 3 requirement");
+ module_print_any_array_string_entry(pfx,
+ "Power level 3 requirement");
- if (value[0] != '\0')
- module_print_any_string(pfx, value);
+ if (is_json_context())
+ close_json_array("");
}
static void sff8079_show_all_common(const __u8 *id)
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH ethtool-next v2 2/2] sfpid: print all compliance codes
2026-07-11 9:54 [PATCH ethtool-next v2 1/2] sfpid: print all implemented options Aleksander Jan Bajkowski
@ 2026-07-11 9:54 ` Aleksander Jan Bajkowski
2026-07-12 18:16 ` Danielle Ratson
2026-07-12 18:15 ` [PATCH ethtool-next v2 1/2] sfpid: print all implemented options Danielle Ratson
1 sibling, 1 reply; 4+ messages in thread
From: Aleksander Jan Bajkowski @ 2026-07-11 9:54 UTC (permalink / raw)
To: danieller, mkubecek, andrew, davem, edumazet, kuba, pabeni, jbe,
netdev
Cc: Aleksander Jan Bajkowski
SFP modules implement multiple compliance codes. This is common for
dual-rate modules. Before the `json` option was introduced, all
compliance codes were displayed. Currently, only the last code is
displayed. This commit fixes that bug. Compliance codes are
represented as array.
Before:
$ ethtool -m sfp-wan
...
Transceiver codes : 0x00 0x00 0x00 0x01 0x20 0x40 0x0c 0x15 0x00
Transceiver type : FC: 100 MBytes/sec
...
$ ethtool --json -m sfp-wan
[ {
...
"transceiver_codes": [ 0,0,0,1,32,64,12,21,0 ],
"transceiver_type": "FC: 100 MBytes/sec",
...
} ]
After:
$ ethtool -m sfp-wan
...
Transceiver codes : 0x00 0x00 0x00 0x01 0x20 0x40 0x0c 0x15 0x00
Transceiver type : Ethernet: 1000BASE-SX
Transceiver type : FC: intermediate distance (I)
Transceiver type : FC: Shortwave laser w/o OFC (SN)
Transceiver type : FC: Multimode, 62.5um (M6)
Transceiver type : FC: Multimode, 50um (M5)
Transceiver type : FC: 400 MBytes/sec
Transceiver type : FC: 200 MBytes/sec
Transceiver type : FC: 100 MBytes/sec
...
$ ethtool --json -m sfp-wan
[ {
...
"transceiver_codes": [ 0,0,0,1,32,64,12,21,0 ],
"transceiver_type": [ "Ethernet: 1000BASE-SX","FC: intermediate distance (I)","FC: Shortwave laser w/o OFC (SN)","FC: Multimode, 62.5um (M6)","FC: Multimode, 50um (M5)","FC: 400 MBytes/sec","FC: 200 MBytes/sec","FC: 100 MBytes/sec" ],
...
} ]
Fixes: 4071862f58d8 ("sfpid: Add JSON output handling to --module-info in SFF8079 modules")
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
---
Changes in v2:
- drop </pre> leftover
- use single sfp module in Before/After
- rename module_print_array_string() -> module_print_any_array_string_entry()
---
sfpid.c | 291 ++++++++++++++++++++++++++++++++++++--------------------
1 file changed, 187 insertions(+), 104 deletions(-)
diff --git a/sfpid.c b/sfpid.c
index ec5dd95..25ddd57 100644
--- a/sfpid.c
+++ b/sfpid.c
@@ -50,7 +50,6 @@ static void sff8079_show_connector(const __u8 *id)
static void sff8079_show_transceiver(const __u8 *id)
{
static const char *pfx = "Transceiver type";
- char value[140] = "";
if (is_json_context()) {
open_json_array("transceiver_codes", "");
@@ -70,242 +69,326 @@ static void sff8079_show_transceiver(const __u8 *id)
"Transceiver codes", id[3], id[4], id[5], id[6],
id[7], id[8], id[9], id[10], id[36]);
}
+
+ if (is_json_context())
+ open_json_array("transceiver_type", "");
+
/* 10G Ethernet Compliance Codes */
if (id[3] & (1 << 7))
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"10G Ethernet: 10G Base-ER [SFF-8472 rev10.4 onwards]");
if (id[3] & (1 << 6))
- sprintf(value, "%s", "10G Ethernet: 10G Base-LRM");
+ module_print_any_array_string_entry(pfx,
+ "10G Ethernet: 10G Base-LRM");
if (id[3] & (1 << 5))
- sprintf(value, "%s", "10G Ethernet: 10G Base-LR");
+ module_print_any_array_string_entry(pfx,
+ "10G Ethernet: 10G Base-LR");
if (id[3] & (1 << 4))
- sprintf(value, "%s", "10G Ethernet: 10G Base-SR");
+ module_print_any_array_string_entry(pfx,
+ "10G Ethernet: 10G Base-SR");
/* Infiniband Compliance Codes */
if (id[3] & (1 << 3))
- sprintf(value, "%s", "Infiniband: 1X SX");
+ module_print_any_array_string_entry(pfx,
+ "Infiniband: 1X SX");
if (id[3] & (1 << 2))
- sprintf(value, "%s", "Infiniband: 1X LX");
+ module_print_any_array_string_entry(pfx,
+ "Infiniband: 1X LX");
if (id[3] & (1 << 1))
- sprintf(value, "%s", "Infiniband: 1X Copper Active");
+ module_print_any_array_string_entry(pfx,
+ "Infiniband: 1X Copper Active");
if (id[3] & (1 << 0))
- sprintf(value, "%s", "Infiniband: 1X Copper Passive");
+ module_print_any_array_string_entry(pfx,
+ "Infiniband: 1X Copper Passive");
/* ESCON Compliance Codes */
if (id[4] & (1 << 7))
- sprintf(value, "%s", "ESCON: ESCON MMF, 1310nm LED");
+ module_print_any_array_string_entry(pfx,
+ "ESCON: ESCON MMF, 1310nm LED");
if (id[4] & (1 << 6))
- sprintf(value, "%s", "ESCON: ESCON SMF, 1310nm Laser");
+ module_print_any_array_string_entry(pfx,
+ "ESCON: ESCON SMF, 1310nm Laser");
/* SONET Compliance Codes */
if (id[4] & (1 << 5))
- sprintf(value, "%s", "SONET: OC-192, short reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-192, short reach");
if (id[4] & (1 << 4))
- sprintf(value, "%s", "SONET: SONET reach specifier bit 1");
+ module_print_any_array_string_entry(pfx,
+ "SONET: SONET reach specifier bit 1");
if (id[4] & (1 << 3))
- sprintf(value, "%s", "SONET: SONET reach specifier bit 2");
+ module_print_any_array_string_entry(pfx,
+ "SONET: SONET reach specifier bit 2");
if (id[4] & (1 << 2))
- sprintf(value, "%s", "SONET: OC-48, long reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-48, long reach");
if (id[4] & (1 << 1))
- sprintf(value, "%s", "SONET: OC-48, intermediate reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-48, intermediate reach");
if (id[4] & (1 << 0))
- sprintf(value, "%s", "SONET: OC-48, short reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-48, short reach");
if (id[5] & (1 << 6))
- sprintf(value, "%s", "SONET: OC-12, single mode, long reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-12, single mode, long reach");
if (id[5] & (1 << 5))
- sprintf(value, "%s", "SONET: OC-12, single mode, inter. reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-12, single mode, inter. reach");
if (id[5] & (1 << 4))
- sprintf(value, "%s", "SONET: OC-12, short reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-12, short reach");
if (id[5] & (1 << 2))
- sprintf(value, "%s", "SONET: OC-3, single mode, long reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-3, single mode, long reach");
if (id[5] & (1 << 1))
- sprintf(value, "%s", "SONET: OC-3, single mode, inter. reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-3, single mode, inter. reach");
if (id[5] & (1 << 0))
- sprintf(value, "%s", "SONET: OC-3, short reach");
+ module_print_any_array_string_entry(pfx,
+ "SONET: OC-3, short reach");
/* Ethernet Compliance Codes */
if (id[6] & (1 << 7))
- sprintf(value, "%s", "Ethernet: BASE-PX");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: BASE-PX");
if (id[6] & (1 << 6))
- sprintf(value, "%s", "Ethernet: BASE-BX10");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: BASE-BX10");
if (id[6] & (1 << 5))
- sprintf(value, "%s", "Ethernet: 100BASE-FX");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: 100BASE-FX");
if (id[6] & (1 << 4))
- sprintf(value, "%s", "Ethernet: 100BASE-LX/LX10");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: 100BASE-LX/LX10");
if (id[6] & (1 << 3))
- sprintf(value, "%s", "Ethernet: 1000BASE-T");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: 1000BASE-T");
if (id[6] & (1 << 2))
- sprintf(value, "%s", "Ethernet: 1000BASE-CX");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: 1000BASE-CX");
if (id[6] & (1 << 1))
- sprintf(value, "%s", "Ethernet: 1000BASE-LX");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: 1000BASE-LX");
if (id[6] & (1 << 0))
- sprintf(value, "%s", "Ethernet: 1000BASE-SX");
+ module_print_any_array_string_entry(pfx,
+ "Ethernet: 1000BASE-SX");
/* Fibre Channel link length */
if (id[7] & (1 << 7))
- sprintf(value, "%s", "FC: very long distance (V)");
+ module_print_any_array_string_entry(pfx,
+ "FC: very long distance (V)");
if (id[7] & (1 << 6))
- sprintf(value, "%s", "FC: short distance (S)");
+ module_print_any_array_string_entry(pfx,
+ "FC: short distance (S)");
if (id[7] & (1 << 5))
- sprintf(value, "%s", "FC: intermediate distance (I)");
+ module_print_any_array_string_entry(pfx,
+ "FC: intermediate distance (I)");
if (id[7] & (1 << 4))
- sprintf(value, "%s", "FC: long distance (L)");
+ module_print_any_array_string_entry(pfx,
+ "FC: long distance (L)");
if (id[7] & (1 << 3))
- sprintf(value, "%s", "FC: medium distance (M)");
+ module_print_any_array_string_entry(pfx,
+ "FC: medium distance (M)");
/* Fibre Channel transmitter technology */
if (id[7] & (1 << 2))
- sprintf(value, "%s", "FC: Shortwave laser, linear Rx (SA)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Shortwave laser, linear Rx (SA)");
if (id[7] & (1 << 1))
- sprintf(value, "%s", "FC: Longwave laser (LC)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Longwave laser (LC)");
if (id[7] & (1 << 0))
- sprintf(value, "%s", "FC: Electrical inter-enclosure (EL)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Electrical inter-enclosure (EL)");
if (id[8] & (1 << 7))
- sprintf(value, "%s", "FC: Electrical intra-enclosure (EL)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Electrical intra-enclosure (EL)");
if (id[8] & (1 << 6))
- sprintf(value, "%s", "FC: Shortwave laser w/o OFC (SN)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Shortwave laser w/o OFC (SN)");
if (id[8] & (1 << 5))
- sprintf(value, "%s", "FC: Shortwave laser with OFC (SL)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Shortwave laser with OFC (SL)");
if (id[8] & (1 << 4))
- sprintf(value, "%s", "FC: Longwave laser (LL)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Longwave laser (LL)");
if (id[8] & (1 << 3))
- sprintf(value, "%s", "Active Cable");
+ module_print_any_array_string_entry(pfx,
+ "Active Cable");
if (id[8] & (1 << 2))
- sprintf(value, "%s", "Passive Cable");
+ module_print_any_array_string_entry(pfx,
+ "Passive Cable");
if (id[8] & (1 << 1))
- sprintf(value, "%s", "FC: Copper FC-BaseT");
+ module_print_any_array_string_entry(pfx,
+ "FC: Copper FC-BaseT");
/* Fibre Channel transmission media */
if (id[9] & (1 << 7))
- sprintf(value, "%s", "FC: Twin Axial Pair (TW)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Twin Axial Pair (TW)");
if (id[9] & (1 << 6))
- sprintf(value, "%s", "FC: Twisted Pair (TP)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Twisted Pair (TP)");
if (id[9] & (1 << 5))
- sprintf(value, "%s", "FC: Miniature Coax (MI)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Miniature Coax (MI)");
if (id[9] & (1 << 4))
- sprintf(value, "%s", "FC: Video Coax (TV)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Video Coax (TV)");
if (id[9] & (1 << 3))
- sprintf(value, "%s", "FC: Multimode, 62.5um (M6)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Multimode, 62.5um (M6)");
if (id[9] & (1 << 2))
- sprintf(value, "%s", "FC: Multimode, 50um (M5)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Multimode, 50um (M5)");
if (id[9] & (1 << 0))
- sprintf(value, "%s", "FC: Single Mode (SM)");
+ module_print_any_array_string_entry(pfx,
+ "FC: Single Mode (SM)");
/* Fibre Channel speed */
if (id[10] & (1 << 7))
- sprintf(value, "%s", "FC: 1200 MBytes/sec");
+ module_print_any_array_string_entry(pfx,
+ "FC: 1200 MBytes/sec");
if (id[10] & (1 << 6))
- sprintf(value, "%s", "FC: 800 MBytes/sec");
+ module_print_any_array_string_entry(pfx,
+ "FC: 800 MBytes/sec");
if (id[10] & (1 << 5))
- sprintf(value, "%s", "FC: 1600 MBytes/sec");
+ module_print_any_array_string_entry(pfx,
+ "FC: 1600 MBytes/sec");
if (id[10] & (1 << 4))
- sprintf(value, "%s", "FC: 400 MBytes/sec");
+ module_print_any_array_string_entry(pfx,
+ "FC: 400 MBytes/sec");
if (id[10] & (1 << 3))
- sprintf(value, "%s", "FC: 3200 MBytes/sec");
+ module_print_any_array_string_entry(pfx,
+ "FC: 3200 MBytes/sec");
if (id[10] & (1 << 2))
- sprintf(value, "%s", "FC: 200 MBytes/sec");
+ module_print_any_array_string_entry(pfx,
+ "FC: 200 MBytes/sec");
if (id[10] & (1 << 0))
- sprintf(value, "%s", "FC: 100 MBytes/sec");
+ module_print_any_array_string_entry(pfx,
+ "FC: 100 MBytes/sec");
/* Extended Specification Compliance Codes from SFF-8024 */
if (id[36] == 0x1)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G AOC or 25GAUI C2M AOC with worst BER of 5x10^(-5)");
if (id[36] == 0x2)
- sprintf(value, "%s", "Extended: 100G Base-SR4 or 25GBase-SR");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 100G Base-SR4 or 25GBase-SR");
if (id[36] == 0x3)
- sprintf(value, "%s", "Extended: 100G Base-LR4 or 25GBase-LR");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 100G Base-LR4 or 25GBase-LR");
if (id[36] == 0x4)
- sprintf(value, "%s", "Extended: 100G Base-ER4 or 25GBase-ER");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 100G Base-ER4 or 25GBase-ER");
if (id[36] == 0x8)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G ACC or 25GAUI C2M ACC with worst BER of 5x10^(-5)");
if (id[36] == 0xb)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G Base-CR4 or 25G Base-CR CA-L");
if (id[36] == 0xc)
- sprintf(value, "%s", "Extended: 25G Base-CR CA-S");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 25G Base-CR CA-S");
if (id[36] == 0xd)
- sprintf(value, "%s", "Extended: 25G Base-CR CA-N");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 25G Base-CR CA-N");
if (id[36] == 0x16)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 10Gbase-T with SFI electrical interface");
if (id[36] == 0x18)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G AOC or 25GAUI C2M AOC with worst BER of 10^(-12)");
if (id[36] == 0x19)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G ACC or 25GAUI C2M ACC with worst BER of 10^(-12)");
if (id[36] == 0x1a)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100GE-DWDM2 (DWDM transceiver using 2 wavelengths on a 1550 nm DWDM grid with a reach up to 80 km)");
if (id[36] == 0x1b)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G 1550nm WDM (4 wavelengths)");
if (id[36] == 0x1c)
- sprintf(value, "%s", "Extended: 10Gbase-T Short Reach");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 10Gbase-T Short Reach");
if (id[36] == 0x1d)
- sprintf(value, "%s", "Extended: 5GBASE-T");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 5GBASE-T");
if (id[36] == 0x1e)
- sprintf(value, "%s", "Extended: 2.5GBASE-T");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 2.5GBASE-T");
if (id[36] == 0x1f)
- sprintf(value, "%s", "Extended: 40G SWDM4");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 40G SWDM4");
if (id[36] == 0x20)
- sprintf(value, "%s", "Extended: 100G SWDM4");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 100G SWDM4");
if (id[36] == 0x21)
- sprintf(value, "%s", "Extended: 100G PAM4 BiDi");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 100G PAM4 BiDi");
if (id[36] == 0x22)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 4WDM-10 MSA (10km version of 100G CWDM4 with same RS(528,514) FEC in host system)");
if (id[36] == 0x23)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 4WDM-20 MSA (20km version of 100GBASE-LR4 with RS(528,514) FEC in host system)");
if (id[36] == 0x24)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 4WDM-40 MSA (40km reach with APD receiver and RS(528,514) FEC in host system)");
if (id[36] == 0x25)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100GBASE-DR (clause 140), CAUI-4 (no FEC)");
if (id[36] == 0x26)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G-FR or 100GBASE-FR1 (clause 140), CAUI-4 (no FEC)");
if (id[36] == 0x27)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 100G-LR or 100GBASE-LR1 (clause 140), CAUI-4 (no FEC)");
if (id[36] == 0x30)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: Active Copper Cable with 50GAUI, 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 10-6 or below");
if (id[36] == 0x31)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: Active Optical Cable with 50GAUI, 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 10-6 or below");
if (id[36] == 0x32)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: Active Copper Cable with 50GAUI, 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 2.6x10-4 for ACC, 10-5 for AUI, or below");
if (id[36] == 0x33)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: Active Optical Cable with 50GAUI, 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 2.6x10-4 for ACC, 10-5 for AUI, or below");
if (id[36] == 0x40)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 50GBASE-CR, 100GBASE-CR2, or 200GBASE-CR4");
if (id[36] == 0x41)
- sprintf(value, "%s",
+ module_print_any_array_string_entry(pfx,
"Extended: 50GBASE-SR, 100GBASE-SR2, or 200GBASE-SR4");
if (id[36] == 0x42)
- sprintf(value, "%s", "Extended: 50GBASE-FR or 200GBASE-DR4");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 50GBASE-FR or 200GBASE-DR4");
if (id[36] == 0x43)
- sprintf(value, "%s", "Extended: 200GBASE-FR4");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 200GBASE-FR4");
if (id[36] == 0x44)
- sprintf(value, "%s", "Extended: 200G 1550 nm PSM4");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 200G 1550 nm PSM4");
if (id[36] == 0x45)
- sprintf(value, "%s", "Extended: 50GBASE-LR");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 50GBASE-LR");
if (id[36] == 0x46)
- sprintf(value, "%s", "Extended: 200GBASE-LR4");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 200GBASE-LR4");
if (id[36] == 0x50)
- sprintf(value, "%s", "Extended: 64GFC EA");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 64GFC EA");
if (id[36] == 0x51)
- sprintf(value, "%s", "Extended: 64GFC SW");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 64GFC SW");
if (id[36] == 0x52)
- sprintf(value, "%s", "Extended: 64GFC LW");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 64GFC LW");
if (id[36] == 0x53)
- sprintf(value, "%s", "Extended: 128GFC EA");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 128GFC EA");
if (id[36] == 0x54)
- sprintf(value, "%s", "Extended: 128GFC SW");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 128GFC SW");
if (id[36] == 0x55)
- sprintf(value, "%s", "Extended: 128GFC LW");
+ module_print_any_array_string_entry(pfx,
+ "Extended: 128GFC LW");
- if (value[0] != '\0')
- module_print_any_string(pfx, value);
+ if (is_json_context())
+ close_json_array("");
}
static void sff8079_show_encoding(const __u8 *id)
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* RE: [PATCH ethtool-next v2 1/2] sfpid: print all implemented options
2026-07-11 9:54 [PATCH ethtool-next v2 1/2] sfpid: print all implemented options Aleksander Jan Bajkowski
2026-07-11 9:54 ` [PATCH ethtool-next v2 2/2] sfpid: print all compliance codes Aleksander Jan Bajkowski
@ 2026-07-12 18:15 ` Danielle Ratson
1 sibling, 0 replies; 4+ messages in thread
From: Danielle Ratson @ 2026-07-12 18:15 UTC (permalink / raw)
To: Aleksander Jan Bajkowski, mkubecek@suse.cz, andrew@lunn.ch,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, jbe@pengutronix.de, netdev@vger.kernel.org
> -----Original Message-----
> From: Aleksander Jan Bajkowski <olek2@wp.pl>
> Sent: Saturday, 11 July 2026 12:54
> To: Danielle Ratson <danieller@nvidia.com>; mkubecek@suse.cz;
> andrew@lunn.ch; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com; jbe@pengutronix.de;
> netdev@vger.kernel.org
> Cc: Aleksander Jan Bajkowski <olek2@wp.pl>
> Subject: [PATCH ethtool-next v2 1/2] sfpid: print all implemented options
>
> SFP modules implement multiple options. Before the “json” option was
> introduced, all options were listed. Currently, only the last option is listed. This
> commit fixes this bug. Options are represented as array.
>
> Before:
> $ ethtool -m sfp-wan
> ...
> Option values : 0x00 0x32
> Option : RATE_SELECT implemented
> ...
> $ ethtool --json -m sfp-wan
> [ {
> ...
> "option_values": [ 0,50 ],
> "option": "RATE_SELECT implemented", ...
> } ]
>
> After:
> $ ethtool -m sfp-wan
> ...
> Option values : 0x00 0x32
> Option : RX_LOS implemented
> Option : TX_DISABLE implemented
> Option : RATE_SELECT implemented
> ...
> $ ethtool --json -m sfp-wan
> [ {
> ...
> "option_values": [ 0,50 ],
> "option": [ "RX_LOS implemented","TX_DISABLE
> implemented","RATE_SELECT implemented" ], ...
> } ]
>
> Fixes: 4071862f58d8 ("sfpid: Add JSON output handling to --module-info in
> SFF8079 modules")
> Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
> ---
> Changes in v2:
> - fix typo introduced -> introduced
> - renamr module_print_array_string() ->
> module_print_any_array_string_entry()
> ---
> module-common.c | 8 ++++++++
> module-common.h | 1 +
> sfpid.c | 48 ++++++++++++++++++++++++++++++++----------------
> 3 files changed, 41 insertions(+), 16 deletions(-)
>
> diff --git a/module-common.c b/module-common.c index 42fccf6..43ff649
> 100644
> --- a/module-common.c
> +++ b/module-common.c
> @@ -258,6 +258,14 @@ void module_print_any_bool(const char *fn, char
> *given_json_fn, bool value,
> printf("\t%-41s : %s\n", fn, str_value); }
>
> +void module_print_any_array_string_entry(const char *fn, const char
> +*value) {
> + if (is_json_context())
> + print_string(PRINT_JSON, NULL, "%s", value);
> + else
> + printf("\t%-41s : %s\n", fn, value);
> +}
> +
> void module_show_value_with_unit(const __u8 *id, unsigned int reg,
> const char *name, unsigned int mult,
> const char *unit)
> diff --git a/module-common.h b/module-common.h index 4063448..f3baf2a
> 100644
> --- a/module-common.h
> +++ b/module-common.h
> @@ -281,6 +281,7 @@ void module_print_any_string(const char *fn, const
> char *value); void module_print_any_float(const char *fn, float value, const
> char *unit); void module_print_any_bool(const char *fn, char *given_json_fn,
> bool value,
> const char *str_value);
> +void module_print_any_array_string_entry(const char *fn, const char
> +*value);
> void module_show_value_with_unit(const __u8 *id, unsigned int reg,
> const char *name, unsigned int mult,
> const char *unit);
> diff --git a/sfpid.c b/sfpid.c
> index 74a6f51..ec5dd95 100644
> --- a/sfpid.c
> +++ b/sfpid.c
> @@ -396,7 +396,6 @@ static void
> sff8079_show_wavelength_or_copper_compliance(const __u8 *id) static void
> sff8079_show_options(const __u8 *id) {
> static const char *pfx = "Option";
> - char value[64] = "";
>
> if (is_json_context()) {
> open_json_array("option_values", ""); @@ -407,35 +406,52
> @@ static void sff8079_show_options(const __u8 *id)
> printf("\t%-41s : 0x%02x 0x%02x\n", "Option values", id[64],
> id[65]);
> }
> +
> + if (is_json_context())
> + open_json_array("option", "");
> +
> if (id[65] & (1 << 1))
> - sprintf(value, "%s", "RX_LOS implemented");
> + module_print_any_array_string_entry(pfx,
> + "RX_LOS implemented");
Indentation, here and a lot more similar places on both patches, is wrong and needs to be aligned to the open paren. Checkpatch flags that, please run it on the patchset.
Also, like in this case and also some other places are unnecessarily wrapped, even though they fit in 80 cols.
> if (id[65] & (1 << 2))
> - sprintf(value, "%s", "RX_LOS implemented, inverted");
> + module_print_any_array_string_entry(pfx,
> + "RX_LOS implemented, inverted");
> if (id[65] & (1 << 3))
> - sprintf(value, "%s", "TX_FAULT implemented");
> + module_print_any_array_string_entry(pfx,
> + "TX_FAULT implemented");
> if (id[65] & (1 << 4))
> - sprintf(value, "%s", "TX_DISABLE implemented");
> + module_print_any_array_string_entry(pfx,
> + "TX_DISABLE implemented");
> if (id[65] & (1 << 5))
> - sprintf(value, "%s", "RATE_SELECT implemented");
> + module_print_any_array_string_entry(pfx,
> + "RATE_SELECT implemented");
> if (id[65] & (1 << 6))
> - sprintf(value, "%s", "Tunable transmitter technology");
> + module_print_any_array_string_entry(pfx,
> + "Tunable transmitter technology");
> if (id[65] & (1 << 7))
> - sprintf(value, "%s", "Receiver decision threshold
> implemented");
> + module_print_any_array_string_entry(pfx,
> + "Receiver decision threshold implemented");
> if (id[64] & (1 << 0))
> - sprintf(value, "%s", "Linear receiver output implemented");
> + module_print_any_array_string_entry(pfx,
> + "Linear receiver output implemented");
> if (id[64] & (1 << 1))
> - sprintf(value, "%s", "Power level 2 requirement");
> + module_print_any_array_string_entry(pfx,
> + "Power level 2 requirement");
> if (id[64] & (1 << 2))
> - sprintf(value, "%s", "Cooled transceiver implemented");
> + module_print_any_array_string_entry(pfx,
> + "Cooled transceiver implemented");
> if (id[64] & (1 << 3))
> - sprintf(value, "%s", "Retimer or CDR implemented");
> + module_print_any_array_string_entry(pfx,
> + "Retimer or CDR implemented");
> if (id[64] & (1 << 4))
> - sprintf(value, "%s", "Paging implemented");
> + module_print_any_array_string_entry(pfx,
> + "Paging implemented");
> if (id[64] & (1 << 5))
> - sprintf(value, "%s", "Power level 3 requirement");
> + module_print_any_array_string_entry(pfx,
> + "Power level 3 requirement");
>
> - if (value[0] != '\0')
> - module_print_any_string(pfx, value);
> + if (is_json_context())
> + close_json_array("");
> }
>
> static void sff8079_show_all_common(const __u8 *id)
> --
> 2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [PATCH ethtool-next v2 2/2] sfpid: print all compliance codes
2026-07-11 9:54 ` [PATCH ethtool-next v2 2/2] sfpid: print all compliance codes Aleksander Jan Bajkowski
@ 2026-07-12 18:16 ` Danielle Ratson
0 siblings, 0 replies; 4+ messages in thread
From: Danielle Ratson @ 2026-07-12 18:16 UTC (permalink / raw)
To: Aleksander Jan Bajkowski, mkubecek@suse.cz, andrew@lunn.ch,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, jbe@pengutronix.de, netdev@vger.kernel.org
> -----Original Message-----
> From: Aleksander Jan Bajkowski <olek2@wp.pl>
> Sent: Saturday, 11 July 2026 12:54
> To: Danielle Ratson <danieller@nvidia.com>; mkubecek@suse.cz;
> andrew@lunn.ch; davem@davemloft.net; edumazet@google.com;
> kuba@kernel.org; pabeni@redhat.com; jbe@pengutronix.de;
> netdev@vger.kernel.org
> Cc: Aleksander Jan Bajkowski <olek2@wp.pl>
> Subject: [PATCH ethtool-next v2 2/2] sfpid: print all compliance codes
>
> SFP modules implement multiple compliance codes. This is common for dual-
> rate modules. Before the `json` option was introduced, all compliance codes
> were displayed. Currently, only the last code is displayed. This commit fixes
> that bug. Compliance codes are represented as array.
>
> Before:
> $ ethtool -m sfp-wan
> ...
> Transceiver codes : 0x00 0x00 0x00 0x01 0x20 0x40 0x0c
> 0x15 0x00
> Transceiver type : FC: 100 MBytes/sec
> ...
> $ ethtool --json -m sfp-wan
> [ {
> ...
> "transceiver_codes": [ 0,0,0,1,32,64,12,21,0 ],
> "transceiver_type": "FC: 100 MBytes/sec", ...
> } ]
>
> After:
> $ ethtool -m sfp-wan
> ...
> Transceiver codes : 0x00 0x00 0x00 0x01 0x20 0x40 0x0c
> 0x15 0x00
> Transceiver type : Ethernet: 1000BASE-SX
> Transceiver type : FC: intermediate distance (I)
> Transceiver type : FC: Shortwave laser w/o OFC (SN)
> Transceiver type : FC: Multimode, 62.5um (M6)
> Transceiver type : FC: Multimode, 50um (M5)
> Transceiver type : FC: 400 MBytes/sec
> Transceiver type : FC: 200 MBytes/sec
> Transceiver type : FC: 100 MBytes/sec
> ...
> $ ethtool --json -m sfp-wan
> [ {
> ...
> "transceiver_codes": [ 0,0,0,1,32,64,12,21,0 ],
> "transceiver_type": [ "Ethernet: 1000BASE-SX","FC: intermediate distance
> (I)","FC: Shortwave laser w/o OFC (SN)","FC: Multimode, 62.5um (M6)","FC:
> Multimode, 50um (M5)","FC: 400 MBytes/sec","FC: 200 MBytes/sec","FC:
> 100 MBytes/sec" ], ...
> } ]
>
> Fixes: 4071862f58d8 ("sfpid: Add JSON output handling to --module-info in
> SFF8079 modules")
> Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
> ---
> Changes in v2:
> - drop </pre> leftover
> - use single sfp module in Before/After
> - rename module_print_array_string() ->
> module_print_any_array_string_entry()
> ---
> sfpid.c | 291 ++++++++++++++++++++++++++++++++++++--------------------
> 1 file changed, 187 insertions(+), 104 deletions(-)
>
> diff --git a/sfpid.c b/sfpid.c
It seems like qsfp suffers from the same exact issue in the equivalent sff8636_show_transceiver(). I think it is worth to address that too since it fixes the same issue.
> index ec5dd95..25ddd57 100644
> --- a/sfpid.c
> +++ b/sfpid.c
> @@ -50,7 +50,6 @@ static void sff8079_show_connector(const __u8 *id)
> static void sff8079_show_transceiver(const __u8 *id) {
> static const char *pfx = "Transceiver type";
> - char value[140] = "";
>
> if (is_json_context()) {
> open_json_array("transceiver_codes", ""); @@ -70,242
> +69,326 @@ static void sff8079_show_transceiver(const __u8 *id)
> "Transceiver codes", id[3], id[4], id[5], id[6],
> id[7], id[8], id[9], id[10], id[36]);
> }
> +
> + if (is_json_context())
> + open_json_array("transceiver_type", "");
> +
> /* 10G Ethernet Compliance Codes */
> if (id[3] & (1 << 7))
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
Indentation again, please run checkpatch to address all the errors.
> "10G Ethernet: 10G Base-ER [SFF-8472 rev10.4
> onwards]");
> if (id[3] & (1 << 6))
> - sprintf(value, "%s", "10G Ethernet: 10G Base-LRM");
> + module_print_any_array_string_entry(pfx,
> + "10G Ethernet: 10G Base-LRM");
> if (id[3] & (1 << 5))
> - sprintf(value, "%s", "10G Ethernet: 10G Base-LR");
> + module_print_any_array_string_entry(pfx,
> + "10G Ethernet: 10G Base-LR");
> if (id[3] & (1 << 4))
> - sprintf(value, "%s", "10G Ethernet: 10G Base-SR");
> + module_print_any_array_string_entry(pfx,
> + "10G Ethernet: 10G Base-SR");
> /* Infiniband Compliance Codes */
> if (id[3] & (1 << 3))
> - sprintf(value, "%s", "Infiniband: 1X SX");
> + module_print_any_array_string_entry(pfx,
> + "Infiniband: 1X SX");
> if (id[3] & (1 << 2))
> - sprintf(value, "%s", "Infiniband: 1X LX");
> + module_print_any_array_string_entry(pfx,
> + "Infiniband: 1X LX");
> if (id[3] & (1 << 1))
> - sprintf(value, "%s", "Infiniband: 1X Copper Active");
> + module_print_any_array_string_entry(pfx,
> + "Infiniband: 1X Copper Active");
> if (id[3] & (1 << 0))
> - sprintf(value, "%s", "Infiniband: 1X Copper Passive");
> + module_print_any_array_string_entry(pfx,
> + "Infiniband: 1X Copper Passive");
> /* ESCON Compliance Codes */
> if (id[4] & (1 << 7))
> - sprintf(value, "%s", "ESCON: ESCON MMF, 1310nm LED");
> + module_print_any_array_string_entry(pfx,
> + "ESCON: ESCON MMF, 1310nm LED");
> if (id[4] & (1 << 6))
> - sprintf(value, "%s", "ESCON: ESCON SMF, 1310nm Laser");
> + module_print_any_array_string_entry(pfx,
> + "ESCON: ESCON SMF, 1310nm Laser");
> /* SONET Compliance Codes */
> if (id[4] & (1 << 5))
> - sprintf(value, "%s", "SONET: OC-192, short reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-192, short reach");
> if (id[4] & (1 << 4))
> - sprintf(value, "%s", "SONET: SONET reach specifier bit 1");
> + module_print_any_array_string_entry(pfx,
> + "SONET: SONET reach specifier bit 1");
> if (id[4] & (1 << 3))
> - sprintf(value, "%s", "SONET: SONET reach specifier bit 2");
> + module_print_any_array_string_entry(pfx,
> + "SONET: SONET reach specifier bit 2");
> if (id[4] & (1 << 2))
> - sprintf(value, "%s", "SONET: OC-48, long reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-48, long reach");
> if (id[4] & (1 << 1))
> - sprintf(value, "%s", "SONET: OC-48, intermediate reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-48, intermediate reach");
> if (id[4] & (1 << 0))
> - sprintf(value, "%s", "SONET: OC-48, short reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-48, short reach");
> if (id[5] & (1 << 6))
> - sprintf(value, "%s", "SONET: OC-12, single mode, long reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-12, single mode, long reach");
> if (id[5] & (1 << 5))
> - sprintf(value, "%s", "SONET: OC-12, single mode, inter.
> reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-12, single mode, inter. reach");
> if (id[5] & (1 << 4))
> - sprintf(value, "%s", "SONET: OC-12, short reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-12, short reach");
> if (id[5] & (1 << 2))
> - sprintf(value, "%s", "SONET: OC-3, single mode, long reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-3, single mode, long reach");
> if (id[5] & (1 << 1))
> - sprintf(value, "%s", "SONET: OC-3, single mode, inter. reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-3, single mode, inter. reach");
> if (id[5] & (1 << 0))
> - sprintf(value, "%s", "SONET: OC-3, short reach");
> + module_print_any_array_string_entry(pfx,
> + "SONET: OC-3, short reach");
> /* Ethernet Compliance Codes */
> if (id[6] & (1 << 7))
> - sprintf(value, "%s", "Ethernet: BASE-PX");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: BASE-PX");
> if (id[6] & (1 << 6))
> - sprintf(value, "%s", "Ethernet: BASE-BX10");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: BASE-BX10");
> if (id[6] & (1 << 5))
> - sprintf(value, "%s", "Ethernet: 100BASE-FX");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: 100BASE-FX");
> if (id[6] & (1 << 4))
> - sprintf(value, "%s", "Ethernet: 100BASE-LX/LX10");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: 100BASE-LX/LX10");
> if (id[6] & (1 << 3))
> - sprintf(value, "%s", "Ethernet: 1000BASE-T");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: 1000BASE-T");
> if (id[6] & (1 << 2))
> - sprintf(value, "%s", "Ethernet: 1000BASE-CX");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: 1000BASE-CX");
> if (id[6] & (1 << 1))
> - sprintf(value, "%s", "Ethernet: 1000BASE-LX");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: 1000BASE-LX");
> if (id[6] & (1 << 0))
> - sprintf(value, "%s", "Ethernet: 1000BASE-SX");
> + module_print_any_array_string_entry(pfx,
> + "Ethernet: 1000BASE-SX");
> /* Fibre Channel link length */
> if (id[7] & (1 << 7))
> - sprintf(value, "%s", "FC: very long distance (V)");
> + module_print_any_array_string_entry(pfx,
> + "FC: very long distance (V)");
> if (id[7] & (1 << 6))
> - sprintf(value, "%s", "FC: short distance (S)");
> + module_print_any_array_string_entry(pfx,
> + "FC: short distance (S)");
> if (id[7] & (1 << 5))
> - sprintf(value, "%s", "FC: intermediate distance (I)");
> + module_print_any_array_string_entry(pfx,
> + "FC: intermediate distance (I)");
> if (id[7] & (1 << 4))
> - sprintf(value, "%s", "FC: long distance (L)");
> + module_print_any_array_string_entry(pfx,
> + "FC: long distance (L)");
> if (id[7] & (1 << 3))
> - sprintf(value, "%s", "FC: medium distance (M)");
> + module_print_any_array_string_entry(pfx,
> + "FC: medium distance (M)");
> /* Fibre Channel transmitter technology */
> if (id[7] & (1 << 2))
> - sprintf(value, "%s", "FC: Shortwave laser, linear Rx (SA)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Shortwave laser, linear Rx (SA)");
> if (id[7] & (1 << 1))
> - sprintf(value, "%s", "FC: Longwave laser (LC)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Longwave laser (LC)");
> if (id[7] & (1 << 0))
> - sprintf(value, "%s", "FC: Electrical inter-enclosure (EL)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Electrical inter-enclosure (EL)");
> if (id[8] & (1 << 7))
> - sprintf(value, "%s", "FC: Electrical intra-enclosure (EL)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Electrical intra-enclosure (EL)");
> if (id[8] & (1 << 6))
> - sprintf(value, "%s", "FC: Shortwave laser w/o OFC (SN)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Shortwave laser w/o OFC (SN)");
> if (id[8] & (1 << 5))
> - sprintf(value, "%s", "FC: Shortwave laser with OFC (SL)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Shortwave laser with OFC (SL)");
> if (id[8] & (1 << 4))
> - sprintf(value, "%s", "FC: Longwave laser (LL)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Longwave laser (LL)");
> if (id[8] & (1 << 3))
> - sprintf(value, "%s", "Active Cable");
> + module_print_any_array_string_entry(pfx,
> + "Active Cable");
> if (id[8] & (1 << 2))
> - sprintf(value, "%s", "Passive Cable");
> + module_print_any_array_string_entry(pfx,
> + "Passive Cable");
> if (id[8] & (1 << 1))
> - sprintf(value, "%s", "FC: Copper FC-BaseT");
> + module_print_any_array_string_entry(pfx,
> + "FC: Copper FC-BaseT");
> /* Fibre Channel transmission media */
> if (id[9] & (1 << 7))
> - sprintf(value, "%s", "FC: Twin Axial Pair (TW)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Twin Axial Pair (TW)");
> if (id[9] & (1 << 6))
> - sprintf(value, "%s", "FC: Twisted Pair (TP)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Twisted Pair (TP)");
> if (id[9] & (1 << 5))
> - sprintf(value, "%s", "FC: Miniature Coax (MI)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Miniature Coax (MI)");
> if (id[9] & (1 << 4))
> - sprintf(value, "%s", "FC: Video Coax (TV)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Video Coax (TV)");
> if (id[9] & (1 << 3))
> - sprintf(value, "%s", "FC: Multimode, 62.5um (M6)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Multimode, 62.5um (M6)");
> if (id[9] & (1 << 2))
> - sprintf(value, "%s", "FC: Multimode, 50um (M5)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Multimode, 50um (M5)");
> if (id[9] & (1 << 0))
> - sprintf(value, "%s", "FC: Single Mode (SM)");
> + module_print_any_array_string_entry(pfx,
> + "FC: Single Mode (SM)");
> /* Fibre Channel speed */
> if (id[10] & (1 << 7))
> - sprintf(value, "%s", "FC: 1200 MBytes/sec");
> + module_print_any_array_string_entry(pfx,
> + "FC: 1200 MBytes/sec");
> if (id[10] & (1 << 6))
> - sprintf(value, "%s", "FC: 800 MBytes/sec");
> + module_print_any_array_string_entry(pfx,
> + "FC: 800 MBytes/sec");
> if (id[10] & (1 << 5))
> - sprintf(value, "%s", "FC: 1600 MBytes/sec");
> + module_print_any_array_string_entry(pfx,
> + "FC: 1600 MBytes/sec");
> if (id[10] & (1 << 4))
> - sprintf(value, "%s", "FC: 400 MBytes/sec");
> + module_print_any_array_string_entry(pfx,
> + "FC: 400 MBytes/sec");
> if (id[10] & (1 << 3))
> - sprintf(value, "%s", "FC: 3200 MBytes/sec");
> + module_print_any_array_string_entry(pfx,
> + "FC: 3200 MBytes/sec");
> if (id[10] & (1 << 2))
> - sprintf(value, "%s", "FC: 200 MBytes/sec");
> + module_print_any_array_string_entry(pfx,
> + "FC: 200 MBytes/sec");
> if (id[10] & (1 << 0))
> - sprintf(value, "%s", "FC: 100 MBytes/sec");
> + module_print_any_array_string_entry(pfx,
> + "FC: 100 MBytes/sec");
> /* Extended Specification Compliance Codes from SFF-8024 */
> if (id[36] == 0x1)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G AOC or 25GAUI C2M AOC with
> worst BER of 5x10^(-5)");
> if (id[36] == 0x2)
> - sprintf(value, "%s", "Extended: 100G Base-SR4 or 25GBase-
> SR");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 100G Base-SR4 or 25GBase-SR");
> if (id[36] == 0x3)
> - sprintf(value, "%s", "Extended: 100G Base-LR4 or 25GBase-
> LR");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 100G Base-LR4 or 25GBase-LR");
> if (id[36] == 0x4)
> - sprintf(value, "%s", "Extended: 100G Base-ER4 or 25GBase-
> ER");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 100G Base-ER4 or 25GBase-ER");
> if (id[36] == 0x8)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G ACC or 25GAUI C2M ACC with worst
> BER of 5x10^(-5)");
> if (id[36] == 0xb)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G Base-CR4 or 25G Base-CR CA-L");
> if (id[36] == 0xc)
> - sprintf(value, "%s", "Extended: 25G Base-CR CA-S");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 25G Base-CR CA-S");
> if (id[36] == 0xd)
> - sprintf(value, "%s", "Extended: 25G Base-CR CA-N");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 25G Base-CR CA-N");
> if (id[36] == 0x16)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 10Gbase-T with SFI electrical interface");
> if (id[36] == 0x18)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G AOC or 25GAUI C2M AOC with
> worst BER of 10^(-12)");
> if (id[36] == 0x19)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G ACC or 25GAUI C2M ACC with worst
> BER of 10^(-12)");
> if (id[36] == 0x1a)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100GE-DWDM2 (DWDM transceiver using
> 2 wavelengths on a 1550 nm DWDM grid with a reach up to 80 km)");
> if (id[36] == 0x1b)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G 1550nm WDM (4 wavelengths)");
> if (id[36] == 0x1c)
> - sprintf(value, "%s", "Extended: 10Gbase-T Short Reach");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 10Gbase-T Short Reach");
> if (id[36] == 0x1d)
> - sprintf(value, "%s", "Extended: 5GBASE-T");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 5GBASE-T");
> if (id[36] == 0x1e)
> - sprintf(value, "%s", "Extended: 2.5GBASE-T");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 2.5GBASE-T");
> if (id[36] == 0x1f)
> - sprintf(value, "%s", "Extended: 40G SWDM4");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 40G SWDM4");
> if (id[36] == 0x20)
> - sprintf(value, "%s", "Extended: 100G SWDM4");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 100G SWDM4");
> if (id[36] == 0x21)
> - sprintf(value, "%s", "Extended: 100G PAM4 BiDi");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 100G PAM4 BiDi");
> if (id[36] == 0x22)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 4WDM-10 MSA (10km version of 100G
> CWDM4 with same RS(528,514) FEC in host system)");
> if (id[36] == 0x23)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 4WDM-20 MSA (20km version of
> 100GBASE-LR4 with RS(528,514) FEC in host system)");
> if (id[36] == 0x24)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 4WDM-40 MSA (40km reach with APD
> receiver and RS(528,514) FEC in host system)");
> if (id[36] == 0x25)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100GBASE-DR (clause 140), CAUI-4 (no
> FEC)");
> if (id[36] == 0x26)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G-FR or 100GBASE-FR1 (clause 140),
> CAUI-4 (no FEC)");
> if (id[36] == 0x27)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 100G-LR or 100GBASE-LR1 (clause 140),
> CAUI-4 (no FEC)");
> if (id[36] == 0x30)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: Active Copper Cable with 50GAUI,
> 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 10-6 or below");
> if (id[36] == 0x31)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: Active Optical Cable with 50GAUI,
> 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 10-6 or below");
> if (id[36] == 0x32)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: Active Copper Cable with 50GAUI,
> 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 2.6x10-4 for ACC,
> 10-5 for AUI, or below");
> if (id[36] == 0x33)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: Active Optical Cable with 50GAUI,
> 100GAUI-2 or 200GAUI-4 C2M. Providing a worst BER of 2.6x10-4 for ACC,
> 10-5 for AUI, or below");
> if (id[36] == 0x40)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 50GBASE-CR, 100GBASE-CR2, or
> 200GBASE-CR4");
> if (id[36] == 0x41)
> - sprintf(value, "%s",
> + module_print_any_array_string_entry(pfx,
> "Extended: 50GBASE-SR, 100GBASE-SR2, or
> 200GBASE-SR4");
> if (id[36] == 0x42)
> - sprintf(value, "%s", "Extended: 50GBASE-FR or 200GBASE-
> DR4");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 50GBASE-FR or 200GBASE-DR4");
> if (id[36] == 0x43)
> - sprintf(value, "%s", "Extended: 200GBASE-FR4");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 200GBASE-FR4");
> if (id[36] == 0x44)
> - sprintf(value, "%s", "Extended: 200G 1550 nm PSM4");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 200G 1550 nm PSM4");
> if (id[36] == 0x45)
> - sprintf(value, "%s", "Extended: 50GBASE-LR");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 50GBASE-LR");
> if (id[36] == 0x46)
> - sprintf(value, "%s", "Extended: 200GBASE-LR4");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 200GBASE-LR4");
> if (id[36] == 0x50)
> - sprintf(value, "%s", "Extended: 64GFC EA");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 64GFC EA");
> if (id[36] == 0x51)
> - sprintf(value, "%s", "Extended: 64GFC SW");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 64GFC SW");
> if (id[36] == 0x52)
> - sprintf(value, "%s", "Extended: 64GFC LW");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 64GFC LW");
> if (id[36] == 0x53)
> - sprintf(value, "%s", "Extended: 128GFC EA");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 128GFC EA");
> if (id[36] == 0x54)
> - sprintf(value, "%s", "Extended: 128GFC SW");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 128GFC SW");
> if (id[36] == 0x55)
> - sprintf(value, "%s", "Extended: 128GFC LW");
> + module_print_any_array_string_entry(pfx,
> + "Extended: 128GFC LW");
>
> - if (value[0] != '\0')
> - module_print_any_string(pfx, value);
> + if (is_json_context())
> + close_json_array("");
> }
>
> static void sff8079_show_encoding(const __u8 *id)
> --
> 2.53.0
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-07-12 18:16 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-11 9:54 [PATCH ethtool-next v2 1/2] sfpid: print all implemented options Aleksander Jan Bajkowski
2026-07-11 9:54 ` [PATCH ethtool-next v2 2/2] sfpid: print all compliance codes Aleksander Jan Bajkowski
2026-07-12 18:16 ` Danielle Ratson
2026-07-12 18:15 ` [PATCH ethtool-next v2 1/2] sfpid: print all implemented options Danielle Ratson
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox