summaryrefslogtreecommitdiffstats
path: root/sbin/ifconfig
diff options
context:
space:
mode:
authormelifaro <melifaro@FreeBSD.org>2014-10-23 11:01:49 +0000
committermelifaro <melifaro@FreeBSD.org>2014-10-23 11:01:49 +0000
commit9dce247ae14d4507f7b487b99b4a91c0ceb7f783 (patch)
tree911d0f21dcd3970cc8842df7433af2d6077fcef5 /sbin/ifconfig
parent4c4ec283aa7d04cf04ab16213b7269fce89e4b62 (diff)
downloadFreeBSD-src-9dce247ae14d4507f7b487b99b4a91c0ceb7f783.zip
FreeBSD-src-9dce247ae14d4507f7b487b99b4a91c0ceb7f783.tar.gz
Show SFP+/QSFP memory map dump on higher verbose levels.
Sponsored by: Yandex LLC MFC after: 1 week
Diffstat (limited to 'sbin/ifconfig')
-rw-r--r--sbin/ifconfig/sfp.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/sbin/ifconfig/sfp.c b/sbin/ifconfig/sfp.c
index abe71d6..d4da8c3 100644
--- a/sbin/ifconfig/sfp.c
+++ b/sbin/ifconfig/sfp.c
@@ -67,6 +67,9 @@ struct i2c_info {
int chip_id;
};
+static void dump_i2c_data(struct i2c_info *ii, uint8_t addr, uint8_t off,
+ uint8_t len);
+
struct _nv {
int v;
const char *n;
@@ -327,6 +330,9 @@ get_sfp_transceiver_class(struct i2c_info *ii, char *buf, size_t size)
const char *tech_class;
uint8_t code;
+ unsigned char qbuf[8];
+ ii->f(ii, SFF_8472_BASE, SFF_8472_TRANS_START, 8, (caddr_t)qbuf);
+
/* Check 10G Ethernet/IB first */
ii->f(ii, SFF_8472_BASE, SFF_8472_TRANS_START, 1, (caddr_t)&code);
tech_class = find_zero_bit(eth_10g, code, 1);
@@ -662,6 +668,30 @@ read_i2c_generic(struct i2c_info *ii, uint8_t addr, uint8_t off, uint8_t len,
}
static void
+dump_i2c_data(struct i2c_info *ii, uint8_t addr, uint8_t off, uint8_t len)
+{
+ unsigned char buf[16];
+ int i, read;
+
+ while (len > 0) {
+ memset(buf, 0, sizeof(buf));
+ read = (len > sizeof(buf)) ? sizeof(buf) : len;
+ ii->f(ii, addr, off, read, buf);
+ if (ii->error != 0) {
+ fprintf(stderr, "Error reading i2c info\n");
+ return;
+ }
+
+ printf("\t");
+ for (i = 0; i < read; i++)
+ printf("%02X ", buf[i]);
+ printf("\n");
+ len -= read;
+ off += read;
+ }
+}
+
+static void
print_qsfp_status(struct i2c_info *ii, int verbose)
{
char buf[80], buf2[40], buf3[40];
@@ -703,6 +733,13 @@ print_qsfp_status(struct i2c_info *ii, int verbose)
printf("\tlane %d: RX: %s TX: %s\n", i, buf, buf2);
}
}
+
+ if (verbose > 2) {
+ printf("\n\tSFF8436 DUMP (0xA0 128..255 range):\n");
+ dump_i2c_data(ii, SFF_8436_BASE, 128, 128);
+ printf("\n\tSFF8436 DUMP (0xA0 0..81 range):\n");
+ dump_i2c_data(ii, SFF_8436_BASE, 0, 82);
+ }
}
static void
@@ -730,12 +767,12 @@ print_sfp_status(struct i2c_info *ii, int verbose)
get_sfp_connector(ii, buf3, sizeof(buf3));
if (ii->error == 0)
printf("\tplugged: %s %s (%s)\n", buf, buf2, buf3);
- if (verbose > 2)
- printf_sfp_transceiver_descr(ii, buf, sizeof(buf));
print_sfp_vendor(ii, buf, sizeof(buf));
if (ii->error == 0)
printf("\t%s\n", buf);
+ if (verbose > 5)
+ printf_sfp_transceiver_descr(ii, buf, sizeof(buf));
/*
* Request current measurements iff they are provided:
*/
@@ -747,6 +784,11 @@ print_sfp_status(struct i2c_info *ii, int verbose)
get_sfp_tx_power(ii, buf2, sizeof(buf2));
printf("\tRX: %s TX: %s\n", buf, buf2);
}
+
+ if (verbose > 2) {
+ printf("\n\tSFF8472 DUMP (0xA0 0..127 range):\n");
+ dump_i2c_data(ii, SFF_8472_BASE, 0, 128);
+ }
}
void
OpenPOWER on IntegriCloud