aboutsummaryrefslogtreecommitdiff
path: root/sfpid.c
diff options
context:
space:
mode:
authorEd Swierk <eswierk@skyportsystems.com>2015-05-18 19:46:48 -0700
committerBen Hutchings <ben@decadent.org.uk>2015-05-31 21:08:57 +0100
commit8d87f2e21ff7dd6977d99a8c954087f30b49f429 (patch)
tree4382b5baf2a06dd9a7c864404aa42ed2879386c3 /sfpid.c
parentcc1b68790e96503ce169b7a1dc7e67bfd60ae5d4 (diff)
downloadethtool-8d87f2e21ff7dd6977d99a8c954087f30b49f429.tar.gz
ethtool: Include SFP serial number and date in EEPROM dump
ethtool -m currently omits the serial number, date code, and other useful EEPROM fields defined in INF-8074, which is part of the SFF-8079 standard. This patch adds them. It also trims space characters from the end of ASCII text fields. $ ethtool -m eth0 ... Option values : 0x00 0x10 Option : TX_DISABLE implemented BR margin, max : 0% BR margin, min : 0% Vendor SN : AGC143953079 Date code : 140926 Signed-off-by: Ed Swierk <eswierk@skyportsystems.com> Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
Diffstat (limited to 'sfpid.c')
-rw-r--r--sfpid.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/sfpid.c b/sfpid.c
index 4f88aa2..b1a5044 100644
--- a/sfpid.c
+++ b/sfpid.c
@@ -355,6 +355,8 @@ static void sff8079_show_ascii(const __u8 *id, unsigned int first_reg,
unsigned int reg, val;
printf("\t%-41s : ", name);
+ while (first_reg <= last_reg && id[last_reg] == ' ')
+ last_reg--;
for (reg = first_reg; reg <= last_reg; reg++) {
val = id[reg];
putchar(((val >= 32) && (val <= 126)) ? val : '_');
@@ -362,6 +364,40 @@ static void sff8079_show_ascii(const __u8 *id, unsigned int first_reg,
printf("\n");
}
+static void sff8079_show_options(const __u8 *id)
+{
+ static const char *pfx =
+ "\tOption :";
+
+ printf("\t%-41s : 0x%02x 0x%02x\n", "Option values", id[64], id[65]);
+ if (id[65] & (1 << 1))
+ printf("%s RX_LOS implemented\n", pfx);
+ if (id[65] & (1 << 2))
+ printf("%s RX_LOS implemented, inverted\n", pfx);
+ if (id[65] & (1 << 3))
+ printf("%s TX_FAULT implemented\n", pfx);
+ if (id[65] & (1 << 4))
+ printf("%s TX_DISABLE implemented\n", pfx);
+ if (id[65] & (1 << 5))
+ printf("%s RATE_SELECT implemented\n", pfx);
+ if (id[65] & (1 << 6))
+ printf("%s Tunable transmitter technology\n", pfx);
+ if (id[65] & (1 << 7))
+ printf("%s Receiver decision threshold implemented\n", pfx);
+ if (id[64] & (1 << 0))
+ printf("%s Linear receiver output implemented\n", pfx);
+ if (id[64] & (1 << 1))
+ printf("%s Power level 2 requirement\n", pfx);
+ if (id[64] & (1 << 2))
+ printf("%s Cooled transceiver implemented\n", pfx);
+ if (id[64] & (1 << 3))
+ printf("%s Retimer or CDR implemented\n", pfx);
+ if (id[64] & (1 << 4))
+ printf("%s Paging implemented\n", pfx);
+ if (id[64] & (1 << 5))
+ printf("%s Power level 3 requirement\n", pfx);
+}
+
void sff8079_show_all(const __u8 *id)
{
sff8079_show_identifier(id);
@@ -385,5 +421,10 @@ void sff8079_show_all(const __u8 *id)
sff8079_show_oui(id);
sff8079_show_ascii(id, 40, 55, "Vendor PN");
sff8079_show_ascii(id, 56, 59, "Vendor rev");
+ sff8079_show_options(id);
+ sff8079_show_value_with_unit(id, 66, "BR margin, max", 1, "%");
+ sff8079_show_value_with_unit(id, 67, "BR margin, min", 1, "%");
+ sff8079_show_ascii(id, 68, 83, "Vendor SN");
+ sff8079_show_ascii(id, 84, 91, "Date code");
}
}