SFF Improvements

- Add missing xmacros for SFF enumerations.
- Add non-standard part recognition options and types.
This commit is contained in:
Jeffrey Townsend
2017-05-25 16:09:58 +00:00
parent 8419eb7653
commit 2dab1c0cd8
6 changed files with 154 additions and 13 deletions

View File

@@ -101,6 +101,8 @@ sff_module_types: &sff_module_types
desc: "100BASE-LX"
- 100_BASE_FX:
desc: "100BASE-FX"
- 4X_MUX:
desc: "4X-MUX"
sff_module_caps: &sff_module_caps
- F_100 : 0x1
@@ -147,5 +149,15 @@ definitions:
members: *sff_media_types
xenum:
SFF_ENUMERATION_ENTRY:
members: *enums
SFF_ENUMERATION_ENTRY:
members: *enums
xmacro:
SFF_SFP_TYPE_ENTRY:
members: *sff_sfp_types
SFF_MODULE_TYPE_ENTRY:
members: *sff_module_types
SFF_MODULE_CAP_ENTRY:
members: *sff_module_caps
SFF_MEDIA_TYPE_ENTRY:
members: *sff_module_types

View File

@@ -125,7 +125,8 @@ typedef enum sff_module_type_e {
SFF_MODULE_TYPE_1G_BASE_T,
SFF_MODULE_TYPE_100_BASE_LX,
SFF_MODULE_TYPE_100_BASE_FX,
SFF_MODULE_TYPE_LAST = SFF_MODULE_TYPE_100_BASE_FX,
SFF_MODULE_TYPE_4X_MUX,
SFF_MODULE_TYPE_LAST = SFF_MODULE_TYPE_4X_MUX,
SFF_MODULE_TYPE_COUNT,
SFF_MODULE_TYPE_INVALID = -1,
} sff_module_type_t;
@@ -162,6 +163,7 @@ typedef enum sff_module_type_e {
"1G_BASE_T", \
"100_BASE_LX", \
"100_BASE_FX", \
"4X_MUX", \
}
/** Enum names. */
const char* sff_module_type_name(sff_module_type_t e);
@@ -174,7 +176,7 @@ const char* sff_module_type_desc(sff_module_type_t e);
/** validator */
#define SFF_MODULE_TYPE_VALID(_e) \
( (0 <= (_e)) && ((_e) <= SFF_MODULE_TYPE_100_BASE_FX))
( (0 <= (_e)) && ((_e) <= SFF_MODULE_TYPE_4X_MUX))
/** sff_module_type_map table. */
extern aim_map_si_t sff_module_type_map[];

View File

@@ -5,7 +5,92 @@
*****************************************************************************/
#include <sff/sff_config.h>
/* <--auto.start.xmacro(ALL).define> */
/* <auto.start.xmacro(ALL).define> */
#ifdef SFF_MEDIA_TYPE_ENTRY
SFF_MEDIA_TYPE_ENTRY(100G_AOC, 100G-AOC)
SFF_MEDIA_TYPE_ENTRY(100G_BASE_CR4, 100GBASE-CR4)
SFF_MEDIA_TYPE_ENTRY(100G_BASE_SR4, 100GBASE-SR4)
SFF_MEDIA_TYPE_ENTRY(100G_BASE_LR4, 100GBASE-LR4)
SFF_MEDIA_TYPE_ENTRY(100G_CWDM4, 100G-CWDM4)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_CR4, 40GBASE-CR4)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SR4, 40GBASE-SR4)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_LR4, 40GBASE-LR4)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_LM4, 40GBASE-LM4)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_ACTIVE, 40GBASE-ACTIVE)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_CR, 40GBASE-CR)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SR2, 40GBASE-SR2)
SFF_MEDIA_TYPE_ENTRY(40G_BASE_SM4, 40GBASE-SM4)
SFF_MEDIA_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SR, 10GBASE-SR)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LR, 10GBASE-LR)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LRM, 10GBASE-LRM)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_ER, 10GBASE-ER)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_CR, 10GBASE-CR)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SX, 10GBASE-SX)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_LX, 10GBASE-LX)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_ZR, 10GBASE-ZR)
SFF_MEDIA_TYPE_ENTRY(10G_BASE_SRL, 10GBASE-SRL)
SFF_MEDIA_TYPE_ENTRY(1G_BASE_SX, 1GBASE-SX)
SFF_MEDIA_TYPE_ENTRY(1G_BASE_LX, 1GBASE-LX)
SFF_MEDIA_TYPE_ENTRY(1G_BASE_CX, 1GBASE-CX)
SFF_MEDIA_TYPE_ENTRY(1G_BASE_T, 1GBASE-T)
SFF_MEDIA_TYPE_ENTRY(100_BASE_LX, 100BASE-LX)
SFF_MEDIA_TYPE_ENTRY(100_BASE_FX, 100BASE-FX)
SFF_MEDIA_TYPE_ENTRY(4X_MUX, 4X-MUX)
#undef SFF_MEDIA_TYPE_ENTRY
#endif
#ifdef SFF_MODULE_CAP_ENTRY
SFF_MODULE_CAP_ENTRY(F_100, 1)
SFF_MODULE_CAP_ENTRY(F_1G, 2)
SFF_MODULE_CAP_ENTRY(F_10G, 4)
SFF_MODULE_CAP_ENTRY(F_25G, 8)
SFF_MODULE_CAP_ENTRY(F_40G, 16)
SFF_MODULE_CAP_ENTRY(F_100G, 32)
#undef SFF_MODULE_CAP_ENTRY
#endif
#ifdef SFF_MODULE_TYPE_ENTRY
SFF_MODULE_TYPE_ENTRY(100G_AOC, 100G-AOC)
SFF_MODULE_TYPE_ENTRY(100G_BASE_CR4, 100GBASE-CR4)
SFF_MODULE_TYPE_ENTRY(100G_BASE_SR4, 100GBASE-SR4)
SFF_MODULE_TYPE_ENTRY(100G_BASE_LR4, 100GBASE-LR4)
SFF_MODULE_TYPE_ENTRY(100G_CWDM4, 100G-CWDM4)
SFF_MODULE_TYPE_ENTRY(40G_BASE_CR4, 40GBASE-CR4)
SFF_MODULE_TYPE_ENTRY(40G_BASE_SR4, 40GBASE-SR4)
SFF_MODULE_TYPE_ENTRY(40G_BASE_LR4, 40GBASE-LR4)
SFF_MODULE_TYPE_ENTRY(40G_BASE_LM4, 40GBASE-LM4)
SFF_MODULE_TYPE_ENTRY(40G_BASE_ACTIVE, 40GBASE-ACTIVE)
SFF_MODULE_TYPE_ENTRY(40G_BASE_CR, 40GBASE-CR)
SFF_MODULE_TYPE_ENTRY(40G_BASE_SR2, 40GBASE-SR2)
SFF_MODULE_TYPE_ENTRY(40G_BASE_SM4, 40GBASE-SM4)
SFF_MODULE_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR)
SFF_MODULE_TYPE_ENTRY(10G_BASE_SR, 10GBASE-SR)
SFF_MODULE_TYPE_ENTRY(10G_BASE_LR, 10GBASE-LR)
SFF_MODULE_TYPE_ENTRY(10G_BASE_LRM, 10GBASE-LRM)
SFF_MODULE_TYPE_ENTRY(10G_BASE_ER, 10GBASE-ER)
SFF_MODULE_TYPE_ENTRY(10G_BASE_CR, 10GBASE-CR)
SFF_MODULE_TYPE_ENTRY(10G_BASE_SX, 10GBASE-SX)
SFF_MODULE_TYPE_ENTRY(10G_BASE_LX, 10GBASE-LX)
SFF_MODULE_TYPE_ENTRY(10G_BASE_ZR, 10GBASE-ZR)
SFF_MODULE_TYPE_ENTRY(10G_BASE_SRL, 10GBASE-SRL)
SFF_MODULE_TYPE_ENTRY(1G_BASE_SX, 1GBASE-SX)
SFF_MODULE_TYPE_ENTRY(1G_BASE_LX, 1GBASE-LX)
SFF_MODULE_TYPE_ENTRY(1G_BASE_CX, 1GBASE-CX)
SFF_MODULE_TYPE_ENTRY(1G_BASE_T, 1GBASE-T)
SFF_MODULE_TYPE_ENTRY(100_BASE_LX, 100BASE-LX)
SFF_MODULE_TYPE_ENTRY(100_BASE_FX, 100BASE-FX)
SFF_MODULE_TYPE_ENTRY(4X_MUX, 4X-MUX)
#undef SFF_MODULE_TYPE_ENTRY
#endif
#ifdef SFF_SFP_TYPE_ENTRY
SFF_SFP_TYPE_ENTRY(SFP, SFP)
SFF_SFP_TYPE_ENTRY(QSFP, QSFP)
SFF_SFP_TYPE_ENTRY(QSFP_PLUS, QSFP+)
SFF_SFP_TYPE_ENTRY(QSFP28, QSFP28)
#undef SFF_SFP_TYPE_ENTRY
#endif
/* <auto.end.xmacro(ALL).define> */
/* <auto.start.xenum(ALL).define> */
@@ -17,5 +102,3 @@ SFF_ENUMERATION_ENTRY(sff_sfp_type, "")
#undef SFF_ENUMERATION_ENTRY
#endif
/* <auto.end.xenum(ALL).define> */

View File

@@ -254,6 +254,7 @@ sff_media_type_get(sff_module_type_t mt)
case SFF_MODULE_TYPE_1G_BASE_LX:
case SFF_MODULE_TYPE_100_BASE_LX:
case SFF_MODULE_TYPE_100_BASE_FX:
case SFF_MODULE_TYPE_4X_MUX:
return SFF_MEDIA_TYPE_FIBER;
case SFF_MODULE_TYPE_COUNT:
@@ -346,9 +347,8 @@ make_printable__(char* string, int size)
* @note if eeprom is NULL it is assumed the rv->eeprom buffer
* has already been initialized.
*/
int
sff_eeprom_parse(sff_eeprom_t* se, uint8_t* eeprom)
static int
sff_eeprom_parse_standard__(sff_eeprom_t* se, uint8_t* eeprom)
{
if(se == NULL) {
return -1;
@@ -432,7 +432,6 @@ sff_eeprom_parse(sff_eeprom_t* se, uint8_t* eeprom)
se->info.module_type = sff_module_type_get(se->eeprom);
if(se->info.module_type == SFF_MODULE_TYPE_INVALID) {
AIM_LOG_ERROR("sff_info_init() failed: invalid module type");
return -1;
}
@@ -615,3 +614,46 @@ sff_eeprom_validate(sff_eeprom_t *se, int verbose)
return 1;
}
static int
sff_eeprom_parse_nonstandard__(sff_eeprom_t* se, uint8_t* eeprom)
{
if(se == NULL) {
return -1;
}
se->identified = 0;
if(eeprom) {
SFF_MEMCPY(se->eeprom, eeprom, 256);
}
if (strncmp(se->info.vendor, "Amphenol", 8) == 0 &&
strncmp(se->info.model, "625960001", 9) == 0 &&
(se->eeprom[240] == 0x0f) &&
(se->eeprom[241] == 0x10) &&
((se->eeprom[243] & 0xF0) == 0xE0)) {
/* 4X_MUX */
se->identified = 1;
se->info.module_type = SFF_MODULE_TYPE_4X_MUX;
se->info.module_type_name = sff_module_type_desc(se->info.module_type);
se->info.media_type = SFF_MEDIA_TYPE_COPPER;
se->info.media_type_name = sff_media_type_desc(se->info.media_type);
se->info.caps = SFF_MODULE_CAPS_F_1G;
se->info.length = se->eeprom[146];
SFF_SNPRINTF(se->info.length_desc, sizeof(se->info.length_desc), "%dm",
se->info.length);
return 0;
}
return -1;
}
int
sff_eeprom_parse(sff_eeprom_t* se, uint8_t* eeprom)
{
int rv = sff_eeprom_parse_standard__(se, eeprom);
if(!se->identified) {
rv = sff_eeprom_parse_nonstandard__(se, eeprom);
}
return rv;
}

View File

@@ -160,6 +160,7 @@ aim_map_si_t sff_module_type_map[] =
{ "1G_BASE_T", SFF_MODULE_TYPE_1G_BASE_T },
{ "100_BASE_LX", SFF_MODULE_TYPE_100_BASE_LX },
{ "100_BASE_FX", SFF_MODULE_TYPE_100_BASE_FX },
{ "4X_MUX", SFF_MODULE_TYPE_4X_MUX },
{ NULL, 0 }
};
@@ -194,6 +195,7 @@ aim_map_si_t sff_module_type_desc_map[] =
{ "1GBASE-T", SFF_MODULE_TYPE_1G_BASE_T },
{ "100BASE-LX", SFF_MODULE_TYPE_100_BASE_LX },
{ "100BASE-FX", SFF_MODULE_TYPE_100_BASE_FX },
{ "4X-MUX", SFF_MODULE_TYPE_4X_MUX },
{ NULL, 0 }
};

View File

@@ -3,12 +3,12 @@
#
# Inclusive Makefile for the sff module.
#
# Autogenerated 2017-01-31 00:32:39.650740
# Autogenerated 2017-05-22 21:57:32.679978
#
###############################################################################
sff_BASEDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
include $(sff_BASEDIR)module/make.mk
include $(sff_BASEDIR)module/src/make.mk
include $(sff_BASEDIR)module/auto/make.mk
include $(sff_BASEDIR)module/src/make.mk
include $(sff_BASEDIR)utest/_make.mk