Netdev List
 help / color / mirror / Atom feed
* [PATCH ethtool-next 1/2] sfpid: print all implemented options
@ 2026-07-05 20:06 Aleksander Jan Bajkowski
  2026-07-05 20:06 ` [PATCH ethtool-next 2/2] sfpid: print all compliance codes Aleksander Jan Bajkowski
  0 siblings, 1 reply; 2+ messages in thread
From: Aleksander Jan Bajkowski @ 2026-07-05 20:06 UTC (permalink / raw)
  To: mkubecek, andrew, danieller, kuba, davem, edumazet, pabeni,
	netdev
  Cc: Aleksander Jan Bajkowski

SFP modules implement multiple options. Before the “json” option was
instroduced, 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-lan
...
	Option values                             : 0x00 0x32
	Option                                    : RX_LOS implemented
	Option                                    : TX_DISABLE implemented
	Option                                    : RATE_SELECT implemented
...
$ ethtool --json -m sfp-lan
[ {
..
        "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>
---
 module-common.c |  8 ++++++++
 module-common.h |  1 +
 sfpid.c         | 39 +++++++++++++++++++++++----------------
 3 files changed, 32 insertions(+), 16 deletions(-)

diff --git a/module-common.c b/module-common.c
index 42fccf6..d736c7c 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_array_string(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..6f9da5f 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_array_string(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..d6636ba 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,43 @@ 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_array_string(pfx, "RX_LOS implemented");
 	if (id[65] & (1 << 2))
-		sprintf(value, "%s", "RX_LOS implemented, inverted");
+		module_print_array_string(pfx, "RX_LOS implemented, inverted");
 	if (id[65] & (1 << 3))
-		sprintf(value, "%s", "TX_FAULT implemented");
+		module_print_array_string(pfx, "TX_FAULT implemented");
 	if (id[65] & (1 << 4))
-		sprintf(value, "%s", "TX_DISABLE implemented");
+		module_print_array_string(pfx, "TX_DISABLE implemented");
 	if (id[65] & (1 << 5))
-		sprintf(value, "%s", "RATE_SELECT implemented");
+		module_print_array_string(pfx, "RATE_SELECT implemented");
 	if (id[65] & (1 << 6))
-		sprintf(value, "%s", "Tunable transmitter technology");
+		module_print_array_string(pfx,
+			"Tunable transmitter technology");
 	if (id[65] & (1 << 7))
-		sprintf(value, "%s", "Receiver decision threshold implemented");
+		module_print_array_string(pfx,
+			"Receiver decision threshold implemented");
 	if (id[64] & (1 << 0))
-		sprintf(value, "%s", "Linear receiver output implemented");
+		module_print_array_string(pfx,
+			"Linear receiver output implemented");
 	if (id[64] & (1 << 1))
-		sprintf(value, "%s", "Power level 2 requirement");
+		module_print_array_string(pfx, "Power level 2 requirement");
 	if (id[64] & (1 << 2))
-		sprintf(value, "%s", "Cooled transceiver implemented");
+		module_print_array_string(pfx,
+			"Cooled transceiver implemented");
 	if (id[64] & (1 << 3))
-		sprintf(value, "%s", "Retimer or CDR implemented");
+		module_print_array_string(pfx, "Retimer or CDR implemented");
 	if (id[64] & (1 << 4))
-		sprintf(value, "%s", "Paging implemented");
+		module_print_array_string(pfx, "Paging implemented");
 	if (id[64] & (1 << 5))
-		sprintf(value, "%s", "Power level 3 requirement");
+		module_print_array_string(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] 2+ messages in thread

* [PATCH ethtool-next 2/2] sfpid: print all compliance codes
  2026-07-05 20:06 [PATCH ethtool-next 1/2] sfpid: print all implemented options Aleksander Jan Bajkowski
@ 2026-07-05 20:06 ` Aleksander Jan Bajkowski
  0 siblings, 0 replies; 2+ messages in thread
From: Aleksander Jan Bajkowski @ 2026-07-05 20:06 UTC (permalink / raw)
  To: mkubecek, andrew, danieller, kuba, davem, edumazet, pabeni,
	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-lan
...
	Transceiver codes                         : 0x00 0x00 0x00 0x01 0x20 0x40 0x0c 0x15 0x00
	Transceiver type                          : FC: 100 MBytes/sec</pre>
...
$ 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>
---
 sfpid.c | 231 +++++++++++++++++++++++++++++++-------------------------
 1 file changed, 127 insertions(+), 104 deletions(-)

diff --git a/sfpid.c b/sfpid.c
index d6636ba..72c44cf 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,266 @@ 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_array_string(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_array_string(pfx, "10G Ethernet: 10G Base-LRM");
 	if (id[3] & (1 << 5))
-		sprintf(value, "%s", "10G Ethernet: 10G Base-LR");
+		module_print_array_string(pfx, "10G Ethernet: 10G Base-LR");
 	if (id[3] & (1 << 4))
-		sprintf(value, "%s", "10G Ethernet: 10G Base-SR");
+		module_print_array_string(pfx, "10G Ethernet: 10G Base-SR");
 	/* Infiniband Compliance Codes */
 	if (id[3] & (1 << 3))
-		sprintf(value, "%s", "Infiniband: 1X SX");
+		module_print_array_string(pfx, "Infiniband: 1X SX");
 	if (id[3] & (1 << 2))
-		sprintf(value, "%s", "Infiniband: 1X LX");
+		module_print_array_string(pfx, "Infiniband: 1X LX");
 	if (id[3] & (1 << 1))
-		sprintf(value, "%s", "Infiniband: 1X Copper Active");
+		module_print_array_string(pfx, "Infiniband: 1X Copper Active");
 	if (id[3] & (1 << 0))
-		sprintf(value, "%s", "Infiniband: 1X Copper Passive");
+		module_print_array_string(pfx,
+			"Infiniband: 1X Copper Passive");
 	/* ESCON Compliance Codes */
 	if (id[4] & (1 << 7))
-		sprintf(value, "%s", "ESCON: ESCON MMF, 1310nm LED");
+		module_print_array_string(pfx, "ESCON: ESCON MMF, 1310nm LED");
 	if (id[4] & (1 << 6))
-		sprintf(value, "%s", "ESCON: ESCON SMF, 1310nm Laser");
+		module_print_array_string(pfx,
+			"ESCON: ESCON SMF, 1310nm Laser");
 	/* SONET Compliance Codes */
 	if (id[4] & (1 << 5))
-		sprintf(value, "%s", "SONET: OC-192, short reach");
+		module_print_array_string(pfx, "SONET: OC-192, short reach");
 	if (id[4] & (1 << 4))
-		sprintf(value, "%s", "SONET: SONET reach specifier bit 1");
+		module_print_array_string(pfx,
+			"SONET: SONET reach specifier bit 1");
 	if (id[4] & (1 << 3))
-		sprintf(value, "%s", "SONET: SONET reach specifier bit 2");
+		module_print_array_string(pfx,
+			"SONET: SONET reach specifier bit 2");
 	if (id[4] & (1 << 2))
-		sprintf(value, "%s", "SONET: OC-48, long reach");
+		module_print_array_string(pfx, "SONET: OC-48, long reach");
 	if (id[4] & (1 << 1))
-		sprintf(value, "%s", "SONET: OC-48, intermediate reach");
+		module_print_array_string(pfx,
+			"SONET: OC-48, intermediate reach");
 	if (id[4] & (1 << 0))
-		sprintf(value, "%s", "SONET: OC-48, short reach");
+		module_print_array_string(pfx, "SONET: OC-48, short reach");
 	if (id[5] & (1 << 6))
-		sprintf(value, "%s", "SONET: OC-12, single mode, long reach");
+		module_print_array_string(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_array_string(pfx,
+			"SONET: OC-12, single mode, inter. reach");
 	if (id[5] & (1 << 4))
-		sprintf(value, "%s", "SONET: OC-12, short reach");
+		module_print_array_string(pfx, "SONET: OC-12, short reach");
 	if (id[5] & (1 << 2))
-		sprintf(value, "%s", "SONET: OC-3, single mode, long reach");
+		module_print_array_string(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_array_string(pfx,
+			"SONET: OC-3, single mode, inter. reach");
 	if (id[5] & (1 << 0))
-		sprintf(value, "%s", "SONET: OC-3, short reach");
+		module_print_array_string(pfx, "SONET: OC-3, short reach");
 	/* Ethernet Compliance Codes */
 	if (id[6] & (1 << 7))
-		sprintf(value, "%s", "Ethernet: BASE-PX");
+		module_print_array_string(pfx, "Ethernet: BASE-PX");
 	if (id[6] & (1 << 6))
-		sprintf(value, "%s", "Ethernet: BASE-BX10");
+		module_print_array_string(pfx, "Ethernet: BASE-BX10");
 	if (id[6] & (1 << 5))
-		sprintf(value, "%s", "Ethernet: 100BASE-FX");
+		module_print_array_string(pfx, "Ethernet: 100BASE-FX");
 	if (id[6] & (1 << 4))
-		sprintf(value, "%s", "Ethernet: 100BASE-LX/LX10");
+		module_print_array_string(pfx, "Ethernet: 100BASE-LX/LX10");
 	if (id[6] & (1 << 3))
-		sprintf(value, "%s", "Ethernet: 1000BASE-T");
+		module_print_array_string(pfx, "Ethernet: 1000BASE-T");
 	if (id[6] & (1 << 2))
-		sprintf(value, "%s", "Ethernet: 1000BASE-CX");
+		module_print_array_string(pfx, "Ethernet: 1000BASE-CX");
 	if (id[6] & (1 << 1))
-		sprintf(value, "%s", "Ethernet: 1000BASE-LX");
+		module_print_array_string(pfx, "Ethernet: 1000BASE-LX");
 	if (id[6] & (1 << 0))
-		sprintf(value, "%s", "Ethernet: 1000BASE-SX");
+		module_print_array_string(pfx, "Ethernet: 1000BASE-SX");
 	/* Fibre Channel link length */
 	if (id[7] & (1 << 7))
-		sprintf(value, "%s", "FC: very long distance (V)");
+		module_print_array_string(pfx, "FC: very long distance (V)");
 	if (id[7] & (1 << 6))
-		sprintf(value, "%s", "FC: short distance (S)");
+		module_print_array_string(pfx, "FC: short distance (S)");
 	if (id[7] & (1 << 5))
-		sprintf(value, "%s", "FC: intermediate distance (I)");
+		module_print_array_string(pfx,
+			"FC: intermediate distance (I)");
 	if (id[7] & (1 << 4))
-		sprintf(value, "%s", "FC: long distance (L)");
+		module_print_array_string(pfx, "FC: long distance (L)");
 	if (id[7] & (1 << 3))
-		sprintf(value, "%s", "FC: medium distance (M)");
+		module_print_array_string(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_array_string(pfx,
+			"FC: Shortwave laser, linear Rx (SA)");
 	if (id[7] & (1 << 1))
-		sprintf(value, "%s", "FC: Longwave laser (LC)");
+		module_print_array_string(pfx, "FC: Longwave laser (LC)");
 	if (id[7] & (1 << 0))
-		sprintf(value, "%s", "FC: Electrical inter-enclosure (EL)");
+		module_print_array_string(pfx,
+			"FC: Electrical inter-enclosure (EL)");
 	if (id[8] & (1 << 7))
-		sprintf(value, "%s", "FC: Electrical intra-enclosure (EL)");
+		module_print_array_string(pfx,
+			"FC: Electrical intra-enclosure (EL)");
 	if (id[8] & (1 << 6))
-		sprintf(value, "%s", "FC: Shortwave laser w/o OFC (SN)");
+		module_print_array_string(pfx,
+			"FC: Shortwave laser w/o OFC (SN)");
 	if (id[8] & (1 << 5))
-		sprintf(value, "%s", "FC: Shortwave laser with OFC (SL)");
+		module_print_array_string(pfx,
+			"FC: Shortwave laser with OFC (SL)");
 	if (id[8] & (1 << 4))
-		sprintf(value, "%s", "FC: Longwave laser (LL)");
+		module_print_array_string(pfx, "FC: Longwave laser (LL)");
 	if (id[8] & (1 << 3))
-		sprintf(value, "%s", "Active Cable");
+		module_print_array_string(pfx, "Active Cable");
 	if (id[8] & (1 << 2))
-		sprintf(value, "%s", "Passive Cable");
+		module_print_array_string(pfx, "Passive Cable");
 	if (id[8] & (1 << 1))
-		sprintf(value, "%s", "FC: Copper FC-BaseT");
+		module_print_array_string(pfx, "FC: Copper FC-BaseT");
 	/* Fibre Channel transmission media */
 	if (id[9] & (1 << 7))
-		sprintf(value, "%s", "FC: Twin Axial Pair (TW)");
+		module_print_array_string(pfx, "FC: Twin Axial Pair (TW)");
 	if (id[9] & (1 << 6))
-		sprintf(value, "%s", "FC: Twisted Pair (TP)");
+		module_print_array_string(pfx, "FC: Twisted Pair (TP)");
 	if (id[9] & (1 << 5))
-		sprintf(value, "%s", "FC: Miniature Coax (MI)");
+		module_print_array_string(pfx, "FC: Miniature Coax (MI)");
 	if (id[9] & (1 << 4))
-		sprintf(value, "%s", "FC: Video Coax (TV)");
+		module_print_array_string(pfx, "FC: Video Coax (TV)");
 	if (id[9] & (1 << 3))
-		sprintf(value, "%s", "FC: Multimode, 62.5um (M6)");
+		module_print_array_string(pfx, "FC: Multimode, 62.5um (M6)");
 	if (id[9] & (1 << 2))
-		sprintf(value, "%s", "FC: Multimode, 50um (M5)");
+		module_print_array_string(pfx, "FC: Multimode, 50um (M5)");
 	if (id[9] & (1 << 0))
-		sprintf(value, "%s", "FC: Single Mode (SM)");
+		module_print_array_string(pfx, "FC: Single Mode (SM)");
 	/* Fibre Channel speed */
 	if (id[10] & (1 << 7))
-		sprintf(value, "%s", "FC: 1200 MBytes/sec");
+		module_print_array_string(pfx, "FC: 1200 MBytes/sec");
 	if (id[10] & (1 << 6))
-		sprintf(value, "%s", "FC: 800 MBytes/sec");
+		module_print_array_string(pfx, "FC: 800 MBytes/sec");
 	if (id[10] & (1 << 5))
-		sprintf(value, "%s", "FC: 1600 MBytes/sec");
+		module_print_array_string(pfx, "FC: 1600 MBytes/sec");
 	if (id[10] & (1 << 4))
-		sprintf(value, "%s", "FC: 400 MBytes/sec");
+		module_print_array_string(pfx, "FC: 400 MBytes/sec");
 	if (id[10] & (1 << 3))
-		sprintf(value, "%s", "FC: 3200 MBytes/sec");
+		module_print_array_string(pfx, "FC: 3200 MBytes/sec");
 	if (id[10] & (1 << 2))
-		sprintf(value, "%s", "FC: 200 MBytes/sec");
+		module_print_array_string(pfx, "FC: 200 MBytes/sec");
 	if (id[10] & (1 << 0))
-		sprintf(value, "%s", "FC: 100 MBytes/sec");
+		module_print_array_string(pfx, "FC: 100 MBytes/sec");
 	/* Extended Specification Compliance Codes from SFF-8024 */
 	if (id[36] == 0x1)
-		sprintf(value, "%s",
+		module_print_array_string(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_array_string(pfx,
+			"Extended: 100G Base-SR4 or 25GBase-SR");
 	if (id[36] == 0x3)
-		sprintf(value, "%s", "Extended: 100G Base-LR4 or 25GBase-LR");
+		module_print_array_string(pfx,
+			"Extended: 100G Base-LR4 or 25GBase-LR");
 	if (id[36] == 0x4)
-		sprintf(value, "%s", "Extended: 100G Base-ER4 or 25GBase-ER");
+		module_print_array_string(pfx,
+			"Extended: 100G Base-ER4 or 25GBase-ER");
 	if (id[36] == 0x8)
-		sprintf(value, "%s",
+		module_print_array_string(pfx,
 			"Extended: 100G ACC or 25GAUI C2M ACC with worst BER of 5x10^(-5)");
 	if (id[36] == 0xb)
-		sprintf(value, "%s",
+		module_print_array_string(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_array_string(pfx, "Extended: 25G Base-CR CA-S");
 	if (id[36] == 0xd)
-		sprintf(value, "%s", "Extended: 25G Base-CR CA-N");
+		module_print_array_string(pfx, "Extended: 25G Base-CR CA-N");
 	if (id[36] == 0x16)
-		sprintf(value, "%s",
+		module_print_array_string(pfx,
 			"Extended: 10Gbase-T with SFI electrical interface");
 	if (id[36] == 0x18)
-		sprintf(value, "%s",
+		module_print_array_string(pfx,
 			"Extended: 100G AOC or 25GAUI C2M AOC with worst BER of 10^(-12)");
 	if (id[36] == 0x19)
-		sprintf(value, "%s",
+		module_print_array_string(pfx,
 			"Extended: 100G ACC or 25GAUI C2M ACC with worst BER of 10^(-12)");
 	if (id[36] == 0x1a)
-		sprintf(value, "%s",
+		module_print_array_string(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_array_string(pfx,
 			"Extended: 100G 1550nm WDM (4 wavelengths)");
 	if (id[36] == 0x1c)
-		sprintf(value, "%s", "Extended: 10Gbase-T Short Reach");
+		module_print_array_string(pfx,
+			"Extended: 10Gbase-T Short Reach");
 	if (id[36] == 0x1d)
-		sprintf(value, "%s", "Extended: 5GBASE-T");
+		module_print_array_string(pfx, "Extended: 5GBASE-T");
 	if (id[36] == 0x1e)
-		sprintf(value, "%s", "Extended: 2.5GBASE-T");
+		module_print_array_string(pfx, "Extended: 2.5GBASE-T");
 	if (id[36] == 0x1f)
-		sprintf(value, "%s", "Extended: 40G SWDM4");
+		module_print_array_string(pfx, "Extended: 40G SWDM4");
 	if (id[36] == 0x20)
-		sprintf(value, "%s", "Extended: 100G SWDM4");
+		module_print_array_string(pfx, "Extended: 100G SWDM4");
 	if (id[36] == 0x21)
-		sprintf(value, "%s", "Extended: 100G PAM4 BiDi");
+		module_print_array_string(pfx, "Extended: 100G PAM4 BiDi");
 	if (id[36] == 0x22)
-		sprintf(value, "%s",
+		module_print_array_string(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_array_string(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_array_string(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_array_string(pfx,
 			"Extended: 100GBASE-DR (clause 140), CAUI-4 (no FEC)");
 	if (id[36] == 0x26)
-		sprintf(value, "%s",
+		module_print_array_string(pfx,
 			"Extended: 100G-FR or 100GBASE-FR1 (clause 140), CAUI-4 (no FEC)");
 	if (id[36] == 0x27)
-		sprintf(value, "%s",
+		module_print_array_string(pfx,
 			"Extended: 100G-LR or 100GBASE-LR1 (clause 140), CAUI-4 (no FEC)");
 	if (id[36] == 0x30)
-		sprintf(value, "%s",
+		module_print_array_string(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_array_string(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_array_string(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_array_string(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_array_string(pfx,
 			"Extended: 50GBASE-CR, 100GBASE-CR2, or 200GBASE-CR4");
 	if (id[36] == 0x41)
-		sprintf(value, "%s",
+		module_print_array_string(pfx,
 			"Extended: 50GBASE-SR, 100GBASE-SR2, or 200GBASE-SR4");
 	if (id[36] == 0x42)
-		sprintf(value, "%s", "Extended: 50GBASE-FR or 200GBASE-DR4");
+		module_print_array_string(pfx,
+			"Extended: 50GBASE-FR or 200GBASE-DR4");
 	if (id[36] == 0x43)
-		sprintf(value, "%s", "Extended: 200GBASE-FR4");
+		module_print_array_string(pfx, "Extended: 200GBASE-FR4");
 	if (id[36] == 0x44)
-		sprintf(value, "%s", "Extended: 200G 1550 nm PSM4");
+		module_print_array_string(pfx, "Extended: 200G 1550 nm PSM4");
 	if (id[36] == 0x45)
-		sprintf(value, "%s", "Extended: 50GBASE-LR");
+		module_print_array_string(pfx, "Extended: 50GBASE-LR");
 	if (id[36] == 0x46)
-		sprintf(value, "%s", "Extended: 200GBASE-LR4");
+		module_print_array_string(pfx, "Extended: 200GBASE-LR4");
 	if (id[36] == 0x50)
-		sprintf(value, "%s", "Extended: 64GFC EA");
+		module_print_array_string(pfx, "Extended: 64GFC EA");
 	if (id[36] == 0x51)
-		sprintf(value, "%s", "Extended: 64GFC SW");
+		module_print_array_string(pfx, "Extended: 64GFC SW");
 	if (id[36] == 0x52)
-		sprintf(value, "%s", "Extended: 64GFC LW");
+		module_print_array_string(pfx, "Extended: 64GFC LW");
 	if (id[36] == 0x53)
-		sprintf(value, "%s", "Extended: 128GFC EA");
+		module_print_array_string(pfx, "Extended: 128GFC EA");
 	if (id[36] == 0x54)
-		sprintf(value, "%s", "Extended: 128GFC SW");
+		module_print_array_string(pfx, "Extended: 128GFC SW");
 	if (id[36] == 0x55)
-		sprintf(value, "%s", "Extended: 128GFC LW");
+		module_print_array_string(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] 2+ messages in thread

end of thread, other threads:[~2026-07-05 20:06 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-05 20:06 [PATCH ethtool-next 1/2] sfpid: print all implemented options Aleksander Jan Bajkowski
2026-07-05 20:06 ` [PATCH ethtool-next 2/2] sfpid: print all compliance codes Aleksander Jan Bajkowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox