mirror of
https://github.com/Telecominfraproject/OpenNetworkLinux.git
synced 2025-12-25 17:27:01 +00:00
SFF Improvements
- Add missing xmacros for SFF enumerations. - Add non-standard part recognition options and types.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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[];
|
||||
|
||||
@@ -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> */
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 }
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user