Author: hselasky
Date: Tue Mar 15 15:24:55 2016
New Revision: 296902
URL: https://svnweb.freebsd.org/changeset/base/296902

Log:
  Improve detection of extended QSFP diagnostics.
  
  The standards in the QSFP diagnostics area are not clear when the
  additional measurements are present or not. Use a valid temperature
  reading as an indicator for the presence of voltage and TX/RX power
  measurements.
  
  MFC after:    1 week
  Sponsored by: Mellanox Technologies
  Tested by:    Netflix
  Differential Revision:        https://reviews.freebsd.org/D5391
  Reviewed by:  gallatin

Modified:
  head/sbin/ifconfig/sfp.c

Modified: head/sbin/ifconfig/sfp.c
==============================================================================
--- head/sbin/ifconfig/sfp.c    Tue Mar 15 15:24:18 2016        (r296901)
+++ head/sbin/ifconfig/sfp.c    Tue Mar 15 15:24:55 2016        (r296902)
@@ -625,14 +625,17 @@ get_sfp_voltage(struct i2c_info *ii, cha
        convert_sff_voltage(buf, size, xbuf);
 }
 
-static void
+static int
 get_qsfp_temp(struct i2c_info *ii, char *buf, size_t size)
 {
        uint8_t xbuf[2];
 
        memset(xbuf, 0, sizeof(xbuf));
        read_i2c(ii, SFF_8436_BASE, SFF_8436_TEMP, 2, xbuf);
+       if ((xbuf[0] == 0xFF && xbuf[1] == 0xFF) || (xbuf[0] == 0 && xbuf[1] == 
0))
+               return (-1);
        convert_sff_temp(buf, size, xbuf);
+       return (0);
 }
 
 static void
@@ -779,22 +782,9 @@ static void
 print_qsfp_status(struct i2c_info *ii, int verbose)
 {
        char buf[80], buf2[40], buf3[40];
-       uint8_t diag_type;
        uint32_t bitrate;
        int i;
 
-       /* Read diagnostic monitoring type */
-       read_i2c(ii, SFF_8436_BASE, SFF_8436_DIAG_TYPE, 1, (caddr_t)&diag_type);
-       if (ii->error != 0)
-               return;
-
-       /*
-        * Read monitoring data it is supplied.
-        * XXX: It is not exactly clear from standard
-        * how one can specify lack of measurements (passive cables case).
-        */
-       if (diag_type != 0)
-               ii->do_diag = 1;
        ii->qsfp = 1;
 
        /* Transceiver type */
@@ -817,9 +807,13 @@ print_qsfp_status(struct i2c_info *ii, i
                        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));
+       /*
+        * The standards in this area are not clear when the
+        * additional measurements are present or not. Use a valid
+        * temperature reading as an indicator for the presence of
+        * voltage and TX/RX power measurements.
+        */
+       if (get_qsfp_temp(ii, buf, sizeof(buf)) == 0) {
                get_qsfp_voltage(ii, buf2, sizeof(buf2));
                printf("\tmodule temperature: %s voltage: %s\n", buf, buf2);
                for (i = 1; i <= 4; i++) {
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to