blob: 11b71bdb62815cf880b4e6adca6845facb6ea337 [file] [log] [blame]
/*
* module-common.c: Implements common utilities across CMIS, SFF-8436/8636
* and SFF-8472/8079.
*/
#include <stdio.h>
#include <math.h>
#include <ctype.h>
#include "module-common.h"
const struct module_aw_mod module_aw_mod_flags[] = {
{ MODULE_TYPE_CMIS, "Module temperature high alarm",
CMIS_TEMP_AW_OFFSET, CMIS_TEMP_HALARM_STATUS },
{ MODULE_TYPE_CMIS, "Module temperature low alarm",
CMIS_TEMP_AW_OFFSET, CMIS_TEMP_LALARM_STATUS },
{ MODULE_TYPE_CMIS, "Module temperature high warning",
CMIS_TEMP_AW_OFFSET, CMIS_TEMP_HWARN_STATUS },
{ MODULE_TYPE_CMIS, "Module temperature low warning",
CMIS_TEMP_AW_OFFSET, CMIS_TEMP_LWARN_STATUS },
{ MODULE_TYPE_CMIS, "Module voltage high alarm",
CMIS_VCC_AW_OFFSET, CMIS_VCC_HALARM_STATUS },
{ MODULE_TYPE_CMIS, "Module voltage low alarm",
CMIS_VCC_AW_OFFSET, CMIS_VCC_LALARM_STATUS },
{ MODULE_TYPE_CMIS, "Module voltage high warning",
CMIS_VCC_AW_OFFSET, CMIS_VCC_HWARN_STATUS },
{ MODULE_TYPE_CMIS, "Module voltage low warning",
CMIS_VCC_AW_OFFSET, CMIS_VCC_LWARN_STATUS },
{ MODULE_TYPE_SFF8636, "Module temperature high alarm",
SFF8636_TEMP_AW_OFFSET, (SFF8636_TEMP_HALARM_STATUS) },
{ MODULE_TYPE_SFF8636, "Module temperature low alarm",
SFF8636_TEMP_AW_OFFSET, (SFF8636_TEMP_LALARM_STATUS) },
{ MODULE_TYPE_SFF8636, "Module temperature high warning",
SFF8636_TEMP_AW_OFFSET, (SFF8636_TEMP_HWARN_STATUS) },
{ MODULE_TYPE_SFF8636, "Module temperature low warning",
SFF8636_TEMP_AW_OFFSET, (SFF8636_TEMP_LWARN_STATUS) },
{ MODULE_TYPE_SFF8636, "Module voltage high alarm",
SFF8636_VCC_AW_OFFSET, (SFF8636_VCC_HALARM_STATUS) },
{ MODULE_TYPE_SFF8636, "Module voltage low alarm",
SFF8636_VCC_AW_OFFSET, (SFF8636_VCC_LALARM_STATUS) },
{ MODULE_TYPE_SFF8636, "Module voltage high warning",
SFF8636_VCC_AW_OFFSET, (SFF8636_VCC_HWARN_STATUS) },
{ MODULE_TYPE_SFF8636, "Module voltage low warning",
SFF8636_VCC_AW_OFFSET, (SFF8636_VCC_LWARN_STATUS) },
{ 0, NULL, 0, 0 },
};
const struct module_aw_chan module_aw_chan_flags[] = {
{ MODULE_TYPE_CMIS, "Laser bias current high alarm",
CMIS_TX_BIAS_AW_HALARM_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_BIAS_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser bias current low alarm",
CMIS_TX_BIAS_AW_LALARM_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_BIAS_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser bias current high warning",
CMIS_TX_BIAS_AW_HWARN_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_BIAS_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser bias current low warning",
CMIS_TX_BIAS_AW_LWARN_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_BIAS_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser tx power high alarm",
CMIS_TX_PWR_AW_HALARM_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_PWR_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser tx power low alarm",
CMIS_TX_PWR_AW_LALARM_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_PWR_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser tx power high warning",
CMIS_TX_PWR_AW_HWARN_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_PWR_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser tx power low warning",
CMIS_TX_PWR_AW_LWARN_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_TX_PWR_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser rx power high alarm",
CMIS_RX_PWR_AW_HALARM_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_RX_PWR_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser rx power low alarm",
CMIS_RX_PWR_AW_LALARM_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_RX_PWR_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser rx power high warning",
CMIS_RX_PWR_AW_HWARN_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_RX_PWR_MON_MASK },
{ MODULE_TYPE_CMIS, "Laser rx power low warning",
CMIS_RX_PWR_AW_LWARN_OFFSET, CMIS_DIAG_CHAN_ADVER_OFFSET,
CMIS_RX_PWR_MON_MASK },
{ MODULE_TYPE_SFF8636, "Laser bias current high alarm",
SFF8636_TX_BIAS_12_AW_OFFSET, 0, (SFF8636_TX_BIAS_1_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current high alarm",
SFF8636_TX_BIAS_12_AW_OFFSET, 0, (SFF8636_TX_BIAS_2_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current high alarm",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_3_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current high alarm",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_4_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current low alarm",
SFF8636_TX_BIAS_12_AW_OFFSET, 0,(SFF8636_TX_BIAS_1_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current low alarm",
SFF8636_TX_BIAS_12_AW_OFFSET, 0, (SFF8636_TX_BIAS_2_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current low alarm",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_3_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current low alarm",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_4_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser bias current high warning",
SFF8636_TX_BIAS_12_AW_OFFSET, 0, (SFF8636_TX_BIAS_1_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser bias current high warning",
SFF8636_TX_BIAS_12_AW_OFFSET, 0, (SFF8636_TX_BIAS_2_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser bias current high warning",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_3_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser bias current high warning",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_4_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser bias current low warning",
SFF8636_TX_BIAS_12_AW_OFFSET, 0, (SFF8636_TX_BIAS_1_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser bias current low warning",
SFF8636_TX_BIAS_12_AW_OFFSET, 0, (SFF8636_TX_BIAS_2_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser bias current low warning",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_3_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser bias current low warning",
SFF8636_TX_BIAS_34_AW_OFFSET, 0, (SFF8636_TX_BIAS_4_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power high alarm",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_1_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power high alarm",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_2_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power high alarm",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_3_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power high alarm",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_4_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power low alarm",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_1_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power low alarm",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_2_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power low alarm",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_3_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power low alarm",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_4_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser tx power high warning",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_1_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power high warning",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_2_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power high warning",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_3_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power high warning",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_4_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power low warning",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_1_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power low warning",
SFF8636_TX_PWR_12_AW_OFFSET, 0, (SFF8636_TX_PWR_2_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power low warning",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_3_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser tx power low warning",
SFF8636_TX_PWR_34_AW_OFFSET, 0, (SFF8636_TX_PWR_4_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power high alarm",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_1_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power high alarm",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_2_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power high alarm",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_3_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power high alarm",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_4_HALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power low alarm",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_1_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power low alarm",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_2_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power low alarm",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_3_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power low alarm",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_4_LALARM) },
{ MODULE_TYPE_SFF8636, "Laser rx power high warning",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_1_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power high warning",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_2_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power high warning",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_3_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power high warning",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_4_HWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power low warning",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_1_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power low warning",
SFF8636_RX_PWR_12_AW_OFFSET, 0, (SFF8636_RX_PWR_2_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power low warning",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_3_LWARN) },
{ MODULE_TYPE_SFF8636, "Laser rx power low warning",
SFF8636_RX_PWR_34_AW_OFFSET, 0, (SFF8636_RX_PWR_4_LWARN) },
{ 0, NULL, 0, 0, 0 },
};
void convert_json_field_name(const char *str, char *json_str)
{
for (size_t i = 0; i < strlen(str); i++)
json_str[i] = (str[i] == ' ') ?
'_' : tolower((unsigned char)str[i]);
}
void module_print_any_uint(const char *fn, int value, const char *unit)
{
char json_fn[100] = "";
if (is_json_context()) {
convert_json_field_name(fn, json_fn);
print_uint(PRINT_JSON, json_fn, "%u", value);
} else {
printf("\t%-41s : %u%s\n", fn, value, unit ? unit : "");
}
}
void module_print_any_string(const char *fn, const char *value)
{
char json_fn[100] = "";
if (is_json_context()) {
convert_json_field_name(fn, json_fn);
print_string(PRINT_JSON, json_fn, "%s", value);
} else {
printf("\t%-41s : %s\n", fn, value);
}
}
void module_print_any_float(const char *fn, float value, const char *unit)
{
char json_fn[100] = "";
if (is_json_context()) {
convert_json_field_name(fn, json_fn);
print_float(PRINT_JSON, json_fn, "%.04f", value);
} else {
printf("\t%-41s : %.04f%s\n", fn, value, unit ? unit : "");
}
}
void module_print_any_bool(const char *fn, char *given_json_fn, bool value,
const char *str_value)
{
char json_fn[100] = "";
if (!given_json_fn)
convert_json_field_name(fn, json_fn);
else
strcpy(json_fn, given_json_fn);
if (is_json_context())
print_bool(PRINT_JSON, json_fn, NULL, value);
else
printf("\t%-41s : %s\n", fn, str_value);
}
void module_show_value_with_unit(const __u8 *id, unsigned int reg,
const char *name, unsigned int mult,
const char *unit)
{
unsigned int val = id[reg];
module_print_any_uint(name, val * mult, unit);
}
void module_show_ascii(const __u8 *id, unsigned int first_reg,
unsigned int last_reg, const char *name)
{
char json_fn[100] = "";
char val_str[32] = "";
unsigned int reg, val;
if (is_json_context())
convert_json_field_name(name, json_fn);
else
printf("\t%-41s : ", name);
while (first_reg <= last_reg && id[last_reg] == ' ')
last_reg--;
for (reg = first_reg; reg <= last_reg; reg++) {
char val_char;
val = id[reg];
val_char = (char)val;
if (is_json_context())
val_str[reg - first_reg] = (((val >= 32) && (val <= 126)) ?
val_char : '_');
else
putchar(((val >= 32) && (val <= 126)) ? val : '_');
}
if (is_json_context())
print_string(PRINT_JSON, json_fn, "%s", val_str);
else
printf("\n");
}
void module_show_lane_status(const char *name, unsigned int lane_cnt,
const char *yes, const char *no,
unsigned int value)
{
char json_fn[100] = "";
convert_json_field_name(name, json_fn);
if (!value && !is_json_context()) {
printf("\t%-41s : None\n", name);
return;
}
if (is_json_context()) {
open_json_array(json_fn, "");
while (lane_cnt--) {
print_bool(PRINT_JSON, NULL, NULL, value & 1);
value >>= 1;
}
close_json_array("");
} else {
printf("\t%-41s : [", name);
while (lane_cnt--) {
printf(" %s%c", value & 1 ? yes : no, lane_cnt ? ',': ' ');
value >>= 1;
}
printf("]\n");
}
}
void module_show_oui(const __u8 *id, int id_offset)
{
char oui_value[16];
if (is_json_context()) {
open_json_array("vendor_oui", "");
print_int(PRINT_JSON, NULL, NULL, id[id_offset]);
print_int(PRINT_JSON, NULL, NULL, id[(id_offset) + 1]);
print_int(PRINT_JSON, NULL, NULL, id[(id_offset) + 2]);
close_json_array("");
} else {
snprintf(oui_value, 16, "%02x:%02x:%02x", id[id_offset],
id[(id_offset) + 1], id[(id_offset) + 2]);
printf("\t%-41s : %s\n", "Vendor OUI", oui_value);
}
}
void module_show_identifier(const __u8 *id, int id_offset)
{
char id_description[SFF_MAX_DESC_LEN];
switch (id[id_offset]) {
case MODULE_ID_UNKNOWN:
strncpy(id_description,
"no module present, unknown, or unspecified",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_GBIC:
strncpy(id_description, "GBIC", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_SOLDERED_MODULE:
strncpy(id_description,
"module soldered to motherboard", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_SFP:
strncpy(id_description, "SFP", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_300_PIN_XBI:
strncpy(id_description, "300 pin XBI", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_XENPAK:
strncpy(id_description, "XENPAK", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_XFP:
strncpy(id_description, "XFP", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_XFF:
strncpy(id_description, "XFF", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_XFP_E:
strncpy(id_description, "XFP-E", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_XPAK:
strncpy(id_description, "XPAK", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_X2:
strncpy(id_description, "X2", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_DWDM_SFP:
strncpy(id_description, "DWDM-SFP", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_QSFP:
strncpy(id_description, "QSFP", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_QSFP_PLUS:
strncpy(id_description, "QSFP+", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_CXP:
strncpy(id_description, "CXP", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_HD4X:
strncpy(id_description, "Shielded Mini Multilane HD 4X",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_HD8X:
strncpy(id_description, "Shielded Mini Multilane HD 8X",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_QSFP28:
strncpy(id_description, "QSFP28", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_CXP2:
strncpy(id_description, "CXP2/CXP28", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_CDFP:
strncpy(id_description, "CDFP Style 1/Style 2",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_HD4X_FANOUT:
strncpy(id_description,
"Shielded Mini Multilane HD 4X Fanout Cable",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_HD8X_FANOUT:
strncpy(id_description,
"Shielded Mini Multilane HD 8X Fanout Cable",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_CDFP_S3:
strncpy(id_description, "CDFP Style 3", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_MICRO_QSFP:
strncpy(id_description, "microQSFP", SFF_MAX_DESC_LEN);
break;
case MODULE_ID_QSFP_DD:
strncpy(id_description,
"QSFP-DD Double Density 8X Pluggable Transceiver (INF-8628)",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_OSFP:
strncpy(id_description, "OSFP 8X Pluggable Transceiver",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_DSFP:
strncpy(id_description,
"DSFP Dual Small Form Factor Pluggable Transceiver",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_QSFP_PLUS_CMIS:
strncpy(id_description,
"QSFP+ or later with Common Management Interface Specification (CMIS)",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_SFP_DD_CMIS:
strncpy(id_description,
"SFP-DD Double Density 2X Pluggable Transceiver with Common Management Interface Specification (CMIS)",
SFF_MAX_DESC_LEN);
break;
case MODULE_ID_SFP_PLUS_CMIS:
strncpy(id_description,
"SFP+ and later with Common Management Interface Specification (CMIS)",
SFF_MAX_DESC_LEN);
break;
default:
strncpy(id_description, "reserved or unknown",
SFF_MAX_DESC_LEN);
break;
}
sff_print_any_hex_field("Identifier", "identifier", id[id_offset],
id_description);
}
void module_show_connector(const __u8 *id, int ctor_offset)
{
char ctor_description[SFF_MAX_DESC_LEN];
switch (id[ctor_offset]) {
case MODULE_CTOR_UNKNOWN:
strncpy(ctor_description, "unknown or unspecified",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_SC:
strncpy(ctor_description, "SC", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_FC_STYLE_1:
strncpy(ctor_description, "Fibre Channel Style 1 copper",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_FC_STYLE_2:
strncpy(ctor_description, "Fibre Channel Style 2 copper",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_BNC_TNC:
strncpy(ctor_description, "BNC/TNC", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_FC_COAX:
strncpy(ctor_description, "Fibre Channel coaxial headers",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_FIBER_JACK:
strncpy(ctor_description, "FibreJack", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_LC:
strncpy(ctor_description, "LC", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_MT_RJ:
strncpy(ctor_description, "MT-RJ", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_MU:
strncpy(ctor_description, "MU", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_SG:
strncpy(ctor_description, "SG", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_OPT_PT:
strncpy(ctor_description, "Optical pigtail",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_MPO:
strncpy(ctor_description, "MPO Parallel Optic",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_MPO_2:
strncpy(ctor_description, "MPO Parallel Optic - 2x16",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_HSDC_II:
strncpy(ctor_description, "HSSDC II", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_COPPER_PT:
strncpy(ctor_description, "Copper pigtail",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_RJ45:
strncpy(ctor_description, "RJ45", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_NO_SEPARABLE:
strncpy(ctor_description, "No separable connector",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_MXC_2x16:
strncpy(ctor_description, "MXC 2x16", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_CS_OPTICAL:
strncpy(ctor_description, "CS optical connector",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_CS_OPTICAL_MINI:
strncpy(ctor_description, "Mini CS optical connector",
SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_MPO_2X12:
strncpy(ctor_description, "MPO 2x12", SFF_MAX_DESC_LEN);
break;
case MODULE_CTOR_MPO_1X16:
strncpy(ctor_description, "MPO 1x16", SFF_MAX_DESC_LEN);
break;
default:
strncpy(ctor_description, "reserved or unknown",
SFF_MAX_DESC_LEN);
break;
}
sff_print_any_hex_field("Connector", "connector", id[ctor_offset],
ctor_description);
}
void module_show_mit_compliance(u16 value)
{
static const char *cc = "Copper cable,";
char description[SFF_MAX_DESC_LEN];
switch (value) {
case MODULE_850_VCSEL:
strncpy(description, "850 nm VCSEL", SFF_MAX_DESC_LEN);
break;
case CMIS_1310_VCSEL:
case SFF8636_TRANS_1310_VCSEL:
strncpy(description, "1310 nm VCSEL", SFF_MAX_DESC_LEN);
break;
case CMIS_1550_VCSEL:
case SFF8636_TRANS_1550_VCSEL:
strncpy(description, "1550 nm VCSEL", SFF_MAX_DESC_LEN);
break;
case CMIS_1310_FP:
case SFF8636_TRANS_1310_FP:
strncpy(description, "1310 nm FP", SFF_MAX_DESC_LEN);
break;
case CMIS_1310_DFB:
case SFF8636_TRANS_1310_DFB:
strncpy(description, "1310 nm DFB", SFF_MAX_DESC_LEN);
break;
case CMIS_1550_DFB:
case SFF8636_TRANS_1550_DFB:
strncpy(description, "1550 nm DFB", SFF_MAX_DESC_LEN);
break;
case CMIS_1310_EML:
case SFF8636_TRANS_1310_EML:
strncpy(description, "1310 nm EML", SFF_MAX_DESC_LEN);
break;
case CMIS_1550_EML:
case SFF8636_TRANS_1550_EML:
strncpy(description, "1550 nm EML", SFF_MAX_DESC_LEN);
break;
case CMIS_OTHERS:
case SFF8636_TRANS_OTHERS:
strncpy(description, "Others/Undefined", SFF_MAX_DESC_LEN);
break;
case CMIS_1490_DFB:
case SFF8636_TRANS_1490_DFB:
strncpy(description, "1490 nm DFB", SFF_MAX_DESC_LEN);
break;
case CMIS_COPPER_UNEQUAL:
case SFF8636_TRANS_COPPER_PAS_UNEQUAL:
snprintf(description, SFF_MAX_DESC_LEN, "%s unequalized", cc);
break;
case CMIS_COPPER_PASS_EQUAL:
case SFF8636_TRANS_COPPER_PAS_EQUAL:
snprintf(description, SFF_MAX_DESC_LEN, "%s passive equalized",
cc);
break;
case CMIS_COPPER_NF_EQUAL:
case SFF8636_TRANS_COPPER_LNR_FAR_EQUAL:
snprintf(description, SFF_MAX_DESC_LEN,
"%s near and far end limiting active equalizers", cc);
break;
case CMIS_COPPER_F_EQUAL:
case SFF8636_TRANS_COPPER_FAR_EQUAL:
snprintf(description, SFF_MAX_DESC_LEN,
"%s far end limiting active equalizers", cc);
break;
case CMIS_COPPER_N_EQUAL:
case SFF8636_TRANS_COPPER_NEAR_EQUAL:
snprintf(description, SFF_MAX_DESC_LEN,
"%s near end limiting active equalizers", cc);
break;
case CMIS_COPPER_LINEAR_EQUAL:
case SFF8636_TRANS_COPPER_LNR_EQUAL:
snprintf(description, SFF_MAX_DESC_LEN, "%s linear active equalizers",
cc);
break;
}
sff_print_any_hex_field("Transmitter technology",
"transmitter_technology", value, description);
}
void module_show_dom_mod_lvl_monitors(const struct sff_diags *sd)
{
PRINT_TEMP_ALL("Module temperature", "module_temperature",
sd->sfp_temp[MCURR]);
PRINT_VCC_ALL("Module voltage", "module_voltage",
sd->sfp_voltage[MCURR]);
}