Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 7 May 2018 21:26:06 +0000 (UTC)
From:      Eric Joyner <erj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject:   svn commit: r333336 - in stable/11: sbin/ifconfig sys/net
Message-ID:  <201805072126.w47LQ6Zm029739@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: erj
Date: Mon May  7 21:26:05 2018
New Revision: 333336
URL: https://svnweb.freebsd.org/changeset/base/333336

Log:
  MFC r326571:  ifconfig(8): Display extended compliance code string for SFP transceivers
  
  Approved by:	re (marius, gjb)

Modified:
  stable/11/sbin/ifconfig/sfp.c
  stable/11/sys/net/sff8472.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sbin/ifconfig/sfp.c
==============================================================================
--- stable/11/sbin/ifconfig/sfp.c	Mon May  7 21:09:21 2018	(r333335)
+++ stable/11/sbin/ifconfig/sfp.c	Mon May  7 21:26:05 2018	(r333336)
@@ -69,7 +69,7 @@ struct _nv {
 const char *find_value(struct _nv *x, int value);
 const char *find_zero_bit(struct _nv *x, int value, int sz);
 
-/* SFF-8472 Rev. 11.4 table 3.4: Connector values */
+/* SFF-8024 Rev. 4.1 Table 4-3: Connector Types */
 static struct _nv conn[] = {
 	{ 0x00, "Unknown" },
 	{ 0x01, "SC" },
@@ -87,7 +87,8 @@ static struct _nv conn[] = {
 	{ 0x20, "HSSDC II" },
 	{ 0x21, "Copper pigtail" },
 	{ 0x22, "RJ45" },
-	{ 0x23, "No separate connector" }, /* SFF-8436 */
+	{ 0x23, "No separable connector" },
+	{ 0x24, "MXC 2x16" },
 	{ 0, NULL }
 };
 
@@ -183,10 +184,17 @@ static struct _nv eth_1040g[] = {
 };
 #define	SFF_8636_EXT_COMPLIANCE	0x80
 
-/* SFF-8024 Rev. 3.4 table 4.4: Extended Specification Compliance */
+/* SFF-8024 Rev. 4.2 table 4-4: Extended Specification Compliance */
 static struct _nv eth_extended_comp[] = {
 	{ 0xFF, "Reserved" },
-	{ 0x1A, "2 lambda DWDM 100G" },
+	{ 0x21, "100G PAM4 BiDi" },
+	{ 0x20, "100G SWDM4" },
+	{ 0x1F, "40G SWDM4" },
+	{ 0x1E, "2.5GBASE-T" },
+	{ 0x1D, "5GBASE-T" },
+	{ 0x1C, "10GBASE-T Short Reach" },
+	{ 0x1B, "100G 1550nm WDM" },
+	{ 0x1A, "100GE-DWDM2" },
 	{ 0x19, "100G ACC or 25GAUI C2M ACC" },
 	{ 0x18, "100G AOC or 25GAUI C2M AOC" },
 	{ 0x17, "100G CLR4" },
@@ -198,23 +206,24 @@ static struct _nv eth_extended_comp[] = {
 	{ 0x11, "4 x 10GBASE-SR" },
 	{ 0x10, "40GBASE-ER4" },
 	{ 0x0F, "Reserved" },
+	{ 0x0E, "Reserved" },
 	{ 0x0D, "25GBASE-CR CA-N" },
 	{ 0x0C, "25GBASE-CR CA-S" },
 	{ 0x0B, "100GBASE-CR4 or 25GBASE-CR CA-L" },
 	{ 0x0A, "Reserved" },
-	{ 0x09, "100G CWDM4 MSA without FEC" },
-	{ 0x08, "100G ACC (Active Copper Cable)" },
+	{ 0x09, "Obsolete" },
+	{ 0x08, "100G ACC (Active Copper Cable) or 25GAUI C2M ACC" },
 	{ 0x07, "100G PSM4 Parallel SMF" },
-	{ 0x06, "100G CWDM4 MSA with FEC" },
+	{ 0x06, "100G CWDM4" },
 	{ 0x05, "100GBASE-SR10" },
-	{ 0x04, "100GBASE-ER4" },
-	{ 0x03, "100GBASE-LR4" },
-	{ 0x02, "100GBASE-SR4" },
-	{ 0x01, "100G AOC (Active Optical Cable) or 25GAUI C2M ACC" },
+	{ 0x04, "100GBASE-ER4 or 25GBASE-ER" },
+	{ 0x03, "100GBASE-LR4 or 25GBASE-LR" },
+	{ 0x02, "100GBASE-SR4 or 25GBASE-SR" },
+	{ 0x01, "100G AOC (Active Optical Cable) or 25GAUI C2M AOC" },
 	{ 0x00, "Unspecified" }
 };
 
-/* SFF-8636 Rev. 2.5 table 6.3: Revision compliance */
+/* SFF-8636 Rev. 2.9 table 6.3: Revision compliance */
 static struct _nv rev_compl[] = {
 	{ 0x1, "SFF-8436 rev <=4.8" },
 	{ 0x2, "SFF-8436 rev <=4.8" },
@@ -222,7 +231,8 @@ static struct _nv rev_compl[] = {
 	{ 0x4, "SFF-8636 rev <=1.4" },
 	{ 0x5, "SFF-8636 rev <=1.5" },
 	{ 0x6, "SFF-8636 rev <=2.0" },
-	{ 0x7, "SFF-8636 rev <=2.5" },
+	{ 0x7, "SFF-8636 rev <=2.7" },
+	{ 0x8, "SFF-8636 rev >=2.8" },
 	{ 0x0, "Unspecified" }
 };
 
@@ -378,17 +388,20 @@ get_sfp_transceiver_class(struct i2c_info *ii, char *b
 	const char *tech_class;
 	uint8_t code;
 
-	unsigned char qbuf[8];
-	read_i2c(ii, SFF_8472_BASE, SFF_8472_TRANS_START, 8, (uint8_t *)qbuf);
-
-	/* Check 10G Ethernet/IB first */
-	read_i2c(ii, SFF_8472_BASE, SFF_8472_TRANS_START, 1, &code);
-	tech_class = find_zero_bit(eth_10g, code, 1);
-	if (tech_class == NULL) {
-		/* No match. Try Ethernet 1G */
-		read_i2c(ii, SFF_8472_BASE, SFF_8472_TRANS_START + 3,
-		    1, (caddr_t)&code);
-		tech_class = find_zero_bit(eth_compat, code, 1);
+	/* Use extended compliance code if it's valid */
+	read_i2c(ii, SFF_8472_BASE, SFF_8472_TRANS, 1, &code);
+	if (code != 0)
+		tech_class = find_value(eth_extended_comp, code);
+	else {
+		/* Next, check 10G Ethernet/IB CCs */
+		read_i2c(ii, SFF_8472_BASE, SFF_8472_TRANS_START, 1, &code);
+		tech_class = find_zero_bit(eth_10g, code, 1);
+		if (tech_class == NULL) {
+			/* No match. Try Ethernet 1G */
+			read_i2c(ii, SFF_8472_BASE, SFF_8472_TRANS_START + 3,
+			    1, (caddr_t)&code);
+			tech_class = find_zero_bit(eth_compat, code, 1);
+		}
 	}
 
 	if (tech_class == NULL)

Modified: stable/11/sys/net/sff8472.h
==============================================================================
--- stable/11/sys/net/sff8472.h	Mon May  7 21:09:21 2018	(r333335)
+++ stable/11/sys/net/sff8472.h	Mon May  7 21:26:05 2018	(r333336)
@@ -377,7 +377,7 @@ enum {
 
 /*
  * Table 3.2 Identifier values.
- * Identifier constants has taken from SFF-8024 rev 2.9 table 4.1
+ * Identifier constants has taken from SFF-8024 rev 4.2 table 4.1
  * (as referenced by table 3.2 footer)
  * */
 enum {
@@ -398,13 +398,15 @@ enum {
 	SFF_8024_ID_CXP		= 0xE, /* CXP */
 	SFF_8024_ID_HD4X	= 0xF, /* Shielded Mini Multilane HD 4X */ 
 	SFF_8024_ID_HD8X	= 0x10, /* Shielded Mini Multilane HD 8X */ 
-	SFF_8024_ID_QSFP28	= 0x11, /* QSFP28 */
+	SFF_8024_ID_QSFP28	= 0x11, /* QSFP28 or later */
 	SFF_8024_ID_CXP2	= 0x12, /* CXP2 (aka CXP28) */
 	SFF_8024_ID_CDFP	= 0x13, /* CDFP (Style 1/Style 2) */
 	SFF_8024_ID_SMM4	= 0x14, /* Shielded Mini Multilate HD 4X Fanout */
 	SFF_8024_ID_SMM8	= 0x15, /* Shielded Mini Multilate HD 8X Fanout */
 	SFF_8024_ID_CDFP3	= 0x16, /* CDFP (Style3) */
-	SFF_8024_ID_LAST	= SFF_8024_ID_CDFP3
+	SFF_8024_ID_MICROQSFP	= 0x17, /* microQSFP */
+	SFF_8024_ID_QSFP_DD	= 0x18, /* QSFP-DD 8X Pluggable Transceiver */
+	SFF_8024_ID_LAST	= SFF_8024_ID_QSFP_DD
 	};
 
 static const char *sff_8024_id[SFF_8024_ID_LAST + 1] = {"Unknown",
@@ -429,7 +431,9 @@ static const char *sff_8024_id[SFF_8024_ID_LAST + 1] =
 					     "CDFP",
 					     "SMM4",
 					     "SMM8",
-					     "CDFP3"};
+					     "CDFP3",
+					     "microQSFP",
+					     "QSFP-DD"};
 
 /* Keep compatibility with old definitions */
 #define	SFF_8472_ID_UNKNOWN	SFF_8024_ID_UNKNOWN



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805072126.w47LQ6Zm029739>