From 7cbb32b991c1fdb525eec22c18140b4449a75bd8 Mon Sep 17 00:00:00 2001 From: Zi Zhou Date: Thu, 3 May 2018 15:49:27 -0700 Subject: [PATCH] support 25G-AOC --- .../base/any/onlp/src/sff/module/auto/sff.yml | 2 ++ .../any/onlp/src/sff/module/inc/sff/8472.h | 16 +++++++++ .../any/onlp/src/sff/module/inc/sff/sff.h | 2 ++ .../any/onlp/src/sff/module/inc/sff/sff.x | 2 ++ .../src/sff/module/python/onlp/sff/enums.py | 33 ++++++++++--------- .../base/any/onlp/src/sff/module/src/sff.c | 9 +++++ .../any/onlp/src/sff/module/src/sff_enums.c | 2 ++ 7 files changed, 50 insertions(+), 16 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 1161f80f..69ef9e50 100644 --- a/packages/base/any/onlp/src/sff/module/auto/sff.yml +++ b/packages/base/any/onlp/src/sff/module/auto/sff.yml @@ -79,6 +79,8 @@ sff_module_types: &sff_module_types desc: "25GBASE-SR" - 25G_BASE_LR: desc: "25GBASE-LR" +- 25G_BASE_AOC: + desc: "25GBASE-AOC" - 10G_BASE_SR: desc: "10GBASE-SR" - 10G_BASE_LR: diff --git a/packages/base/any/onlp/src/sff/module/inc/sff/8472.h b/packages/base/any/onlp/src/sff/module/inc/sff/8472.h index c750a6f2..0e2f73d0 100644 --- a/packages/base/any/onlp/src/sff/module/inc/sff/8472.h +++ b/packages/base/any/onlp/src/sff/module/inc/sff/8472.h @@ -150,6 +150,8 @@ #define SFF8472_CC36_UNALLOCATED1 0xF7 #define SFF8472_CC36_100G_25G_SR 0x02 #define SFF8472_CC36_100G_25G_LR 0x03 +#define SFF8472_CC36_100G_25G_AOC_1 0x01 +#define SFF8472_CC36_100G_25G_AOC_2 0x18 #define SFF8471_CC60_FC_PI_4_LIMITING 0x08 #define SFF8471_CC60_SFF8431_LIMITING 0x04 @@ -999,4 +1001,18 @@ _sff8472_media_sfp28_lr(const uint8_t* idprom) return 0; } +static inline int +_sff8472_media_sfp28_aoc(const uint8_t* idprom) +{ + /* module should be sfp */ + if (!SFF8472_MODULE_SFP(idprom)) return 0; + + if (idprom[12] != 0xFF) return 0; + if ((idprom[36] == SFF8472_CC36_100G_25G_AOC_1) || + (idprom[36] == SFF8472_CC36_100G_25G_AOC_2)) { + return 1; + } + + return 0; +} #endif 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 1e57a012..8971a36d 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 @@ -115,6 +115,7 @@ typedef enum sff_module_type_e { SFF_MODULE_TYPE_25G_BASE_CR, SFF_MODULE_TYPE_25G_BASE_SR, SFF_MODULE_TYPE_25G_BASE_LR, + SFF_MODULE_TYPE_25G_BASE_AOC, SFF_MODULE_TYPE_10G_BASE_SR, SFF_MODULE_TYPE_10G_BASE_LR, SFF_MODULE_TYPE_10G_BASE_LRM, @@ -157,6 +158,7 @@ typedef enum sff_module_type_e { "25G_BASE_CR", \ "25G_BASE_SR", \ "25G_BASE_LR", \ + "25G_BASE_AOC", \ "10G_BASE_SR", \ "10G_BASE_LR", \ "10G_BASE_LRM", \ 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 05945de5..40499305 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 @@ -25,6 +25,7 @@ SFF_MEDIA_TYPE_ENTRY(40G_BASE_ER4, 40GBASE-ER4) SFF_MEDIA_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR) SFF_MEDIA_TYPE_ENTRY(25G_BASE_SR, 25GBASE-SR) SFF_MEDIA_TYPE_ENTRY(25G_BASE_LR, 25GBASE-LR) +SFF_MEDIA_TYPE_ENTRY(25G_BASE_AOC, 25GBASE-AOC) 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) @@ -73,6 +74,7 @@ SFF_MODULE_TYPE_ENTRY(40G_BASE_ER4, 40GBASE-ER4) SFF_MODULE_TYPE_ENTRY(25G_BASE_CR, 25GBASE-CR) SFF_MODULE_TYPE_ENTRY(25G_BASE_SR, 25GBASE-SR) SFF_MODULE_TYPE_ENTRY(25G_BASE_LR, 25GBASE-LR) +SFF_MODULE_TYPE_ENTRY(25G_BASE_AOC, 25GBASE-AOC) 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) diff --git a/packages/base/any/onlp/src/sff/module/python/onlp/sff/enums.py b/packages/base/any/onlp/src/sff/module/python/onlp/sff/enums.py index e9ab9bc3..31ddcda5 100644 --- a/packages/base/any/onlp/src/sff/module/python/onlp/sff/enums.py +++ b/packages/base/any/onlp/src/sff/module/python/onlp/sff/enums.py @@ -45,22 +45,23 @@ class SFF_MODULE_TYPE(Enumeration): _25G_BASE_CR = 15 _25G_BASE_SR = 16 _25G_BASE_LR = 17 - _10G_BASE_SR = 18 - _10G_BASE_LR = 19 - _10G_BASE_LRM = 20 - _10G_BASE_ER = 21 - _10G_BASE_CR = 22 - _10G_BASE_SX = 23 - _10G_BASE_LX = 24 - _10G_BASE_ZR = 25 - _10G_BASE_SRL = 26 - _1G_BASE_SX = 27 - _1G_BASE_LX = 28 - _1G_BASE_CX = 29 - _1G_BASE_T = 30 - _100_BASE_LX = 31 - _100_BASE_FX = 32 - _4X_MUX = 33 + _25G_BASE_AOC = 18 + _10G_BASE_SR = 19 + _10G_BASE_LR = 20 + _10G_BASE_LRM = 21 + _10G_BASE_ER = 22 + _10G_BASE_CR = 23 + _10G_BASE_SX = 24 + _10G_BASE_LX = 25 + _10G_BASE_ZR = 26 + _10G_BASE_SRL = 27 + _1G_BASE_SX = 28 + _1G_BASE_LX = 29 + _1G_BASE_CX = 30 + _1G_BASE_T = 31 + _100_BASE_LX = 32 + _100_BASE_FX = 33 + _4X_MUX = 34 class SFF_SFP_TYPE(Enumeration): 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 65a58e6f..b21ace8f 100644 --- a/packages/base/any/onlp/src/sff/module/src/sff.c +++ b/packages/base/any/onlp/src/sff/module/src/sff.c @@ -158,6 +158,11 @@ sff_module_type_get(const uint8_t* eeprom) return SFF_MODULE_TYPE_25G_BASE_LR; } + if (SFF8472_MODULE_SFP(eeprom) + && _sff8472_media_sfp28_aoc(eeprom)) { + return SFF_MODULE_TYPE_25G_BASE_AOC; + } + if (SFF8472_MODULE_SFP(eeprom) && SFF8472_MEDIA_XGE_SR(eeprom) && !_sff8472_media_gbe_sx_fc_hack(eeprom)) @@ -267,6 +272,7 @@ sff_media_type_get(sff_module_type_t mt) case SFF_MODULE_TYPE_40G_BASE_ER4: case SFF_MODULE_TYPE_25G_BASE_SR: case SFF_MODULE_TYPE_25G_BASE_LR: + case SFF_MODULE_TYPE_25G_BASE_AOC: case SFF_MODULE_TYPE_10G_BASE_SR: case SFF_MODULE_TYPE_10G_BASE_LR: case SFF_MODULE_TYPE_10G_BASE_LRM: @@ -323,6 +329,7 @@ sff_module_caps_get(sff_module_type_t mt, uint32_t *caps) case SFF_MODULE_TYPE_25G_BASE_CR: case SFF_MODULE_TYPE_25G_BASE_SR: + case SFF_MODULE_TYPE_25G_BASE_AOC: *caps |= SFF_MODULE_CAPS_F_25G; return 0; @@ -496,6 +503,7 @@ sff_eeprom_parse_standard__(sff_eeprom_t* se, uint8_t* eeprom) break; case SFF_SFP_TYPE_QSFP_PLUS: case SFF_SFP_TYPE_SFP: + case SFF_SFP_TYPE_SFP28: aoc_length = _sff8436_qsfp_40g_aoc_length(se->eeprom); if (aoc_length < 0) aoc_length = _sff8472_sfp_10g_aoc_length(se->eeprom); @@ -747,6 +755,7 @@ sff_info_init(sff_info_t* info, sff_module_type_t mt, case SFF_MODULE_TYPE_25G_BASE_SR: case SFF_MODULE_TYPE_25G_BASE_LR: + case SFF_MODULE_TYPE_25G_BASE_AOC: info->sfp_type = SFF_SFP_TYPE_SFP28; info->media_type = SFF_MEDIA_TYPE_FIBER; info->caps = SFF_MODULE_CAPS_F_25G; 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 e80102dd..d499582c 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 @@ -149,6 +149,7 @@ aim_map_si_t sff_module_type_map[] = { "25G_BASE_CR", SFF_MODULE_TYPE_25G_BASE_CR }, { "25G_BASE_SR", SFF_MODULE_TYPE_25G_BASE_SR }, { "25G_BASE_LR", SFF_MODULE_TYPE_25G_BASE_LR }, + { "25G_BASE_AOC", SFF_MODULE_TYPE_25G_BASE_AOC }, { "10G_BASE_SR", SFF_MODULE_TYPE_10G_BASE_SR }, { "10G_BASE_LR", SFF_MODULE_TYPE_10G_BASE_LR }, { "10G_BASE_LRM", SFF_MODULE_TYPE_10G_BASE_LRM }, @@ -188,6 +189,7 @@ aim_map_si_t sff_module_type_desc_map[] = { "25GBASE-CR", SFF_MODULE_TYPE_25G_BASE_CR }, { "25GBASE-SR", SFF_MODULE_TYPE_25G_BASE_SR }, { "25GBASE-LR", SFF_MODULE_TYPE_25G_BASE_LR }, + { "25GBASE-AOC", SFF_MODULE_TYPE_25G_BASE_AOC }, { "10GBASE-SR", SFF_MODULE_TYPE_10G_BASE_SR }, { "10GBASE-LR", SFF_MODULE_TYPE_10G_BASE_LR }, { "10GBASE-LRM", SFF_MODULE_TYPE_10G_BASE_LRM },