svn commit: r283009 - in head: sbin/ifconfig sys/net

Alexander V. Chernikov melifaro at FreeBSD.org
Sat May 16 13:11:37 UTC 2015


Author: melifaro
Date: Sat May 16 13:11:35 2015
New Revision: 283009
URL: https://svnweb.freebsd.org/changeset/base/283009

Log:
  * Update SFF-8024 Identifier constants.
  * Fix SFF_8436_CC_EXT in SFF-8436 memory map.
  * Add SFF-8436/8636 bits (revision compliance/nominal bitrate).
  * Do some small style/type fixes.

Modified:
  head/sbin/ifconfig/sfp.c
  head/sys/net/sff8436.h
  head/sys/net/sff8472.h

Modified: head/sbin/ifconfig/sfp.c
==============================================================================
--- head/sbin/ifconfig/sfp.c	Sat May 16 12:05:26 2015	(r283008)
+++ head/sbin/ifconfig/sfp.c	Sat May 16 13:11:35 2015	(r283009)
@@ -182,6 +182,18 @@ static struct _nv eth_1040g[] = {
 	{ 0, NULL }
 };
 
+/* SFF-8636 Rev. 2.5 table 6.3: Revision compliance */
+static struct _nv rev_compl[] = {
+	{ 0x1, "SFF-8436 rev <=4.8" },
+	{ 0x2, "SFF-8436 rev <=4.8" },
+	{ 0x3, "SFF-8636 rev <=1.3" },
+	{ 0x4, "SFF-8636 rev <=1.4" },
+	{ 0x5, "SFF-8636 rev <=1.5" },
+	{ 0x6, "SFF-8636 rev <=2.0" },
+	{ 0x7, "SFF-8636 rev <=2.5" },
+	{ 0x0, "Unspecified" }
+};
+
 const char *
 find_value(struct _nv *x, int value)
 {
@@ -246,6 +258,19 @@ convert_sff_connector(char *buf, size_t 
 }
 
 static void
+convert_sff_rev_compliance(char *buf, size_t size, uint8_t value)
+{
+	const char *x;
+
+	if (value > 0x07)
+		x = "Unallocated";
+	else
+		x = find_value(rev_compl, value);
+
+	snprintf(buf, size, "%s", x);
+}
+
+static void
 get_sfp_identifier(struct i2c_info *ii, char *buf, size_t size)
 {
 	uint8_t data;
@@ -604,23 +629,50 @@ get_sfp_tx_power(struct i2c_info *ii, ch
 static void
 get_qsfp_rx_power(struct i2c_info *ii, char *buf, size_t size, int chan)
 {
-	char xbuf[2];
+	uint8_t xbuf[2];
 
 	memset(xbuf, 0, sizeof(xbuf));
-	read_i2c(ii, SFF_8436_BASE, SFF_8436_RX_CH1_MSB + (chan - 1) * 2, 2, xbuf);
+	read_i2c(ii, SFF_8436_BASE, SFF_8436_RX_CH1_MSB + (chan-1)*2, 2, xbuf);
 	convert_sff_power(ii, buf, size, xbuf);
 }
 
 static void
 get_qsfp_tx_power(struct i2c_info *ii, char *buf, size_t size, int chan)
 {
-	char xbuf[2];
+	uint8_t xbuf[2];
 
 	memset(xbuf, 0, sizeof(xbuf));
-	read_i2c(ii, SFF_8436_BASE, SFF_8436_TX_CH1_MSB + (chan -1) * 2, 2, xbuf);
+	read_i2c(ii, SFF_8436_BASE, SFF_8436_TX_CH1_MSB + (chan-1)*2, 2, xbuf);
 	convert_sff_power(ii, buf, size, xbuf);
 }
 
+static void
+get_qsfp_rev_compliance(struct i2c_info *ii, char *buf, size_t size)
+{
+	uint8_t xbuf;
+
+	xbuf = 0;
+	read_i2c(ii, SFF_8436_BASE, SFF_8436_STATUS, 1, &xbuf);
+	convert_sff_rev_compliance(buf, size, xbuf);
+}
+
+static uint32_t 
+get_qsfp_br(struct i2c_info *ii)
+{
+	uint8_t xbuf;
+	uint32_t rate;
+
+	xbuf = 0;
+	read_i2c(ii, SFF_8436_BASE, SFF_8436_BITRATE, 1, &xbuf);
+	rate = xbuf * 100;
+	if (xbuf == 0xFF) {
+		read_i2c(ii, SFF_8436_BASE, SFF_8636_BITRATE, 1, &xbuf);
+		rate = xbuf * 250;
+	}
+
+	return (rate);
+}
+
 /*
  * Reads i2c data from opened kernel socket.
  */
@@ -689,6 +741,7 @@ print_qsfp_status(struct i2c_info *ii, i
 {
 	char buf[80], buf2[40], buf3[40];
 	uint8_t diag_type;
+	uint32_t bitrate;
 	int i;
 
 	/* Read diagnostic monitoring type */
@@ -715,6 +768,16 @@ print_qsfp_status(struct i2c_info *ii, i
 	if (ii->error == 0)
 		printf("\t%s\n", buf);
 
+	if (verbose > 1) {
+		get_qsfp_rev_compliance(ii, buf, sizeof(buf));
+		if (ii->error == 0)
+			printf("\tcompliance level: %s\n", buf);
+
+		bitrate = get_qsfp_br(ii);
+		if (ii->error == 0 && bitrate > 0)
+			printf("\tnominal bitrate: %u Mbps\n", bitrate);
+	}
+
 	/* Request current measurements if they are provided: */
 	if (ii->do_diag != 0) {
 		get_qsfp_temp(ii, buf, sizeof(buf));

Modified: head/sys/net/sff8436.h
==============================================================================
--- head/sys/net/sff8436.h	Sat May 16 12:05:26 2015	(r283008)
+++ head/sys/net/sff8436.h	Sat May 16 13:11:35 2015	(r283009)
@@ -202,7 +202,9 @@ enum {
 					* optional features are implemented
 					* (if any) in the transceiver
 					* (see Table 42) */
-	SFF_8436_CC_EXT		= 222,	/* Check code for the Extended ID
+	SFF_8636_BITRATE	= 222,	/* Nominal bit rate per channel, units
+					* of 250 Mbps */
+	SFF_8436_CC_EXT		= 223,	/* Check code for the Extended ID
 					* Fields (bytes 192-222 incl) */
 	SFF_8436_VENDOR_RSRVD_START	= 224,
 	SFF_8436_VENDOR_RSRVD_END	= 255,

Modified: head/sys/net/sff8472.h
==============================================================================
--- head/sys/net/sff8472.h	Sat May 16 12:05:26 2015	(r283008)
+++ head/sys/net/sff8472.h	Sat May 16 13:11:35 2015	(r283009)
@@ -377,7 +377,7 @@ enum {
 
 /*
  * Table 3.2 Identifier values.
- * Identifier constants has taken from SFF-8024 rev 2.2 table 4.1
+ * Identifier constants has taken from SFF-8024 rev 2.9 table 4.1
  * (as referenced by table 3.2 footer)
  * */
 enum {
@@ -400,28 +400,36 @@ enum {
 	SFF_8024_ID_HD8X	= 0x10, /* Shielded Mini Multilane HD 8X */ 
 	SFF_8024_ID_QSFP28	= 0x11, /* QSFP28 */
 	SFF_8024_ID_CXP2	= 0x12, /* CXP2 (aka CXP28) */
-	SFF_8024_ID_LAST	= SFF_8024_ID_CXP2
+	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
 	};
 
 static const char *sff_8024_id[SFF_8024_ID_LAST + 1] = {"Unknown",
 					     "GBIC",
 					     "SFF",
-					     "SFP/SFP+",
+					     "SFP/SFP+/SFP28",
 					     "XBI",
 					     "Xenpak",
 					     "XFP",
 					     "XFF",
 					     "XFP-E",
-					     "XPAk",
+					     "XPAK",
 					     "X2",
-					     "DWDM-SFP",
+					     "DWDM-SFP/SFP+",
 					     "QSFP",
 					     "QSFP+",
 					     "CXP",
 					     "HD4X",
 					     "HD8X",
 					     "QSFP28",
-					     "CXP2"};
+					     "CXP2",
+					     "CDFP",
+					     "SMM4",
+					     "SMM8",
+					     "CDFP3"};
 
 /* Keep compability with old definitions */
 #define	SFF_8472_ID_UNKNOWN	SFF_8024_ID_UNKNOWN


More information about the svn-src-all mailing list