From 8419eb7653b6a9c15bc120f22d17e3c3e93beae1 Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Thu, 25 May 2017 16:08:21 +0000 Subject: [PATCH 1/3] Add implicit retries on i2c read errors. TODO: Make configurable. --- packages/base/any/onlp/src/onlplib/module/src/i2c.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/base/any/onlp/src/onlplib/module/src/i2c.c b/packages/base/any/onlp/src/onlplib/module/src/i2c.c index 6c8ee372..57e1f084 100644 --- a/packages/base/any/onlp/src/onlplib/module/src/i2c.c +++ b/packages/base/any/onlp/src/onlplib/module/src/i2c.c @@ -149,7 +149,12 @@ onlp_i2c_read(int bus, uint8_t addr, uint8_t offset, int size, } for(i = 0; i < size; i++) { - int rv = i2c_smbus_read_byte_data(fd, offset+i); + int rv = -1; + int retries = 3; + + while(retries-- && rv < 0) { + rv = i2c_smbus_read_byte_data(fd, offset+i); + } if(rv < 0) { AIM_LOG_ERROR("i2c-%d: reading address 0x%x, offset %d failed: %{errno}", From 2dab1c0cd8d820490a6e821f95cf0fddc920db40 Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Thu, 25 May 2017 16:09:58 +0000 Subject: [PATCH 2/3] SFF Improvements - Add missing xmacros for SFF enumerations. - Add non-standard part recognition options and types. --- .../base/any/onlp/src/sff/module/auto/sff.yml | 16 +++- .../any/onlp/src/sff/module/inc/sff/sff.h | 6 +- .../any/onlp/src/sff/module/inc/sff/sff.x | 89 ++++++++++++++++++- .../base/any/onlp/src/sff/module/src/sff.c | 50 ++++++++++- .../any/onlp/src/sff/module/src/sff_enums.c | 2 + packages/base/any/onlp/src/sff/sff.mk | 4 +- 6 files changed, 154 insertions(+), 13 deletions(-) diff --git a/packages/base/any/onlp/src/sff/module/auto/sff.yml b/packages/base/any/onlp/src/sff/module/auto/sff.yml index 71843f4e..07b931ea 100644 --- a/packages/base/any/onlp/src/sff/module/auto/sff.yml +++ b/packages/base/any/onlp/src/sff/module/auto/sff.yml @@ -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 diff --git a/packages/base/any/onlp/src/sff/module/inc/sff/sff.h b/packages/base/any/onlp/src/sff/module/inc/sff/sff.h index 3f0461c3..155be466 100644 --- a/packages/base/any/onlp/src/sff/module/inc/sff/sff.h +++ b/packages/base/any/onlp/src/sff/module/inc/sff/sff.h @@ -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[]; diff --git a/packages/base/any/onlp/src/sff/module/inc/sff/sff.x b/packages/base/any/onlp/src/sff/module/inc/sff/sff.x index c2e8fb60..ed354ef1 100644 --- a/packages/base/any/onlp/src/sff/module/inc/sff/sff.x +++ b/packages/base/any/onlp/src/sff/module/inc/sff/sff.x @@ -5,7 +5,92 @@ *****************************************************************************/ #include -/* <--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 /* */ /* */ @@ -17,5 +102,3 @@ SFF_ENUMERATION_ENTRY(sff_sfp_type, "") #undef SFF_ENUMERATION_ENTRY #endif /* */ - - diff --git a/packages/base/any/onlp/src/sff/module/src/sff.c b/packages/base/any/onlp/src/sff/module/src/sff.c index 8a16ed4d..d14556bd 100644 --- a/packages/base/any/onlp/src/sff/module/src/sff.c +++ b/packages/base/any/onlp/src/sff/module/src/sff.c @@ -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; +} diff --git a/packages/base/any/onlp/src/sff/module/src/sff_enums.c b/packages/base/any/onlp/src/sff/module/src/sff_enums.c index c3a0d880..7f4d2b17 100644 --- a/packages/base/any/onlp/src/sff/module/src/sff_enums.c +++ b/packages/base/any/onlp/src/sff/module/src/sff_enums.c @@ -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 } }; diff --git a/packages/base/any/onlp/src/sff/sff.mk b/packages/base/any/onlp/src/sff/sff.mk index ae469813..8becb2c5 100644 --- a/packages/base/any/onlp/src/sff/sff.mk +++ b/packages/base/any/onlp/src/sff/sff.mk @@ -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 From adc6736d9034471dcdf2f2550556e77bd74e3613 Mon Sep 17 00:00:00 2001 From: Jeffrey Townsend Date: Thu, 25 May 2017 16:17:40 +0000 Subject: [PATCH 3/3] Latest --- sm/infra | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sm/infra b/sm/infra index b7974c19..84c9208d 160000 --- a/sm/infra +++ b/sm/infra @@ -1 +1 @@ -Subproject commit b7974c19ed40c484f75974f4ba5975ba1ba9e1a7 +Subproject commit 84c9208d735c2f39950505f8cd3c75037cd5a843