svn commit: r269359 - stable/9/tools/tools/cxgbetool
Navdeep Parhar
np at FreeBSD.org
Thu Jul 31 23:18:00 UTC 2014
Author: np
Date: Thu Jul 31 23:17:59 2014
New Revision: 269359
URL: http://svnweb.freebsd.org/changeset/base/269359
Log:
MFC r269106:
Add a 'raw' parameter to the 'modinfo' subcommand. This is handy when
trying to figure out why a QSFP+/SFP+ connector or cable wasn't
identified correctly by cxgbe(4). Its output looks like this:
# cxgbetool t5nex0 modinfo 0 raw
00: 03 04 21 00 00 00 00 00 ..!. ....
08: 04 00 00 00 67 00 00 00 .... g...
10: 00 00 05 00 41 6d 70 68 .... Amph
18: 65 6e 6f 6c 20 20 20 20 enol
20: 20 20 20 20 00 41 50 48 .APH
28: 35 37 31 35 34 30 30 30 5715 4000
30: 33 20 20 20 20 20 20 20 3
38: 4b 20 20 20 01 00 00 fa K ....
40: 00 00 00 00 41 50 46 31 .... APF1
48: 30 30 34 30 30 33 30 30 0040 0300
50: 30 33 20 20 31 30 30 31 03 1001
58: 33 30 20 20 00 00 00 97 30 ....
Modified:
stable/9/tools/tools/cxgbetool/cxgbetool.c
Directory Properties:
stable/9/tools/tools/cxgbetool/ (props changed)
Modified: stable/9/tools/tools/cxgbetool/cxgbetool.c
==============================================================================
--- stable/9/tools/tools/cxgbetool/cxgbetool.c Thu Jul 31 23:14:59 2014 (r269358)
+++ stable/9/tools/tools/cxgbetool/cxgbetool.c Thu Jul 31 23:17:59 2014 (r269359)
@@ -95,7 +95,7 @@ usage(FILE *fp)
"\ti2c <port> <devaddr> <addr> [<len>] read from i2c device\n"
"\tloadfw <fw-image.bin> install firmware\n"
"\tmemdump <addr> <len> dump a memory range\n"
- "\tmodinfo <port> optics/cable information\n"
+ "\tmodinfo <port> [raw] optics/cable information\n"
"\treg <address>[=<val>] read/write register\n"
"\treg64 <address>[=<val>] read/write 64 bit register\n"
"\tregdump [<module>] ... dump registers\n"
@@ -1673,6 +1673,41 @@ clearstats(int argc, const char *argv[])
}
static int
+modinfo_raw(int port_id)
+{
+ uint8_t offset;
+ struct t4_i2c_data i2cd;
+ int rc;
+
+ for (offset = 0; offset < 96; offset += sizeof(i2cd.data)) {
+ bzero(&i2cd, sizeof(i2cd));
+ i2cd.port_id = port_id;
+ i2cd.dev_addr = 0xa0;
+ i2cd.offset = offset;
+ i2cd.len = sizeof(i2cd.data);
+ rc = doit(CHELSIO_T4_GET_I2C, &i2cd);
+ if (rc != 0)
+ return (rc);
+ printf("%02x: %02x %02x %02x %02x %02x %02x %02x %02x",
+ offset, i2cd.data[0], i2cd.data[1], i2cd.data[2],
+ i2cd.data[3], i2cd.data[4], i2cd.data[5], i2cd.data[6],
+ i2cd.data[7]);
+
+ printf(" %c%c%c%c %c%c%c%c\n",
+ isprint(i2cd.data[0]) ? i2cd.data[0] : '.',
+ isprint(i2cd.data[1]) ? i2cd.data[1] : '.',
+ isprint(i2cd.data[2]) ? i2cd.data[2] : '.',
+ isprint(i2cd.data[3]) ? i2cd.data[3] : '.',
+ isprint(i2cd.data[4]) ? i2cd.data[4] : '.',
+ isprint(i2cd.data[5]) ? i2cd.data[5] : '.',
+ isprint(i2cd.data[6]) ? i2cd.data[6] : '.',
+ isprint(i2cd.data[7]) ? i2cd.data[7] : '.');
+ }
+
+ return (0);
+}
+
+static int
modinfo(int argc, const char *argv[])
{
long port;
@@ -1681,17 +1716,31 @@ modinfo(int argc, const char *argv[])
int rc, i;
uint16_t temp, vcc, tx_bias, tx_power, rx_power;
- if (argc != 1) {
+ if (argc < 1) {
warnx("must supply a port");
return (EINVAL);
}
+ if (argc > 2) {
+ warnx("too many arguments");
+ return (EINVAL);
+ }
+
p = str_to_number(argv[0], &port, NULL);
if (*p || port > UCHAR_MAX) {
warnx("invalid port id \"%s\"", argv[0]);
return (EINVAL);
}
+ if (argc == 2) {
+ if (!strcmp(argv[1], "raw"))
+ return (modinfo_raw(port));
+ else {
+ warnx("second argument can only be \"raw\"");
+ return (EINVAL);
+ }
+ }
+
bzero(&i2cd, sizeof(i2cd));
i2cd.len = 1;
i2cd.port_id = port;
More information about the svn-src-stable-9
mailing list