From d567bb7caab8d7b8d77e58465d24b35786b1bc86 Mon Sep 17 00:00:00 2001 From: Zi Zhou Date: Fri, 13 Jan 2017 15:24:42 -0800 Subject: [PATCH] support SFP28 module --- .../base/any/onlp/src/sff/module/auto/sff.yml | 7 +++++-- .../any/onlp/src/sff/module/inc/sff/8472.h | 18 +++++++++++++++++- .../base/any/onlp/src/sff/module/inc/sff/sff.h | 7 +++++-- .../base/any/onlp/src/sff/module/src/sff.c | 10 ++++++++++ .../any/onlp/src/sff/module/src/sff_enums.c | 4 ++++ packages/base/any/onlp/src/sff/sff.mk | 4 ++-- 6 files changed, 43 insertions(+), 7 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 3ccd142c..810848a2 100644 --- a/packages/base/any/onlp/src/sff/module/auto/sff.yml +++ b/packages/base/any/onlp/src/sff/module/auto/sff.yml @@ -67,6 +67,8 @@ sff_module_types: &sff_module_types desc: "40GBASE-CR" - 40G_BASE_SR2: desc: "40GBASE-SR2" +- 25G_BASE_CR: + desc: "25GBASE-CR" - 10G_BASE_SR: desc: "10GBASE-SR" - 10G_BASE_LR: @@ -102,8 +104,9 @@ sff_module_caps: &sff_module_caps - F_100 : 0x1 - F_1G : 0x2 - F_10G : 0x4 -- F_40G : 0x8 -- F_100G : 0x10 +- F_25G : 0x8 +- F_40G : 0x10 +- F_100G : 0x20 sff_sfp_types: &sff_sfp_types - SFP: 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 dbafbbe6..fa7b1ddc 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 @@ -72,6 +72,7 @@ #define SFF8472_CONN_HSSDC_II 0x20 #define SFF8472_CONN_CU_PIGTAIL 0x21 #define SFF8472_CONN_RJ45 0x22 +#define SFF8472_CONN_NOSEP 0x23 /* module compliance codes (SFP type) */ @@ -943,7 +944,7 @@ _sff8472_sfp_10g_aoc(const uint8_t *idprom) static inline int _sff8472_sfp_10g_aoc_length(const uint8_t *idprom) { - /* module should be qsfp */ + /* module should be sfp */ if (!SFF8472_MODULE_SFP(idprom)) return -1; /* does not report a fiber length, but does report a cable length */ @@ -957,4 +958,19 @@ _sff8472_sfp_10g_aoc_length(const uint8_t *idprom) return -1; } +/* + * SFP28 + */ +static inline int +_sff8472_media_sfp28_cr(const uint8_t* idprom) +{ + /* module should be sfp */ + if (!SFF8472_MODULE_SFP(idprom)) return 0; + + if (idprom[2] != SFF8472_CONN_NOSEP) return 0; + if ((idprom[3] & SFF8472_CC3_INF_1X_CU_PASSIVE) == 0) return 0; + if (idprom[12] == 0xFF) 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 20e3b3f4..1e5c332c 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 @@ -68,8 +68,9 @@ typedef enum sff_module_caps_e { SFF_MODULE_CAPS_F_100 = 1, SFF_MODULE_CAPS_F_1G = 2, SFF_MODULE_CAPS_F_10G = 4, - SFF_MODULE_CAPS_F_40G = 8, - SFF_MODULE_CAPS_F_100G = 16, + SFF_MODULE_CAPS_F_25G = 8, + SFF_MODULE_CAPS_F_40G = 16, + SFF_MODULE_CAPS_F_100G = 32, } sff_module_caps_t; /** Enum names. */ @@ -107,6 +108,7 @@ typedef enum sff_module_type_e { SFF_MODULE_TYPE_40G_BASE_ACTIVE, SFF_MODULE_TYPE_40G_BASE_CR, SFF_MODULE_TYPE_40G_BASE_SR2, + SFF_MODULE_TYPE_25G_BASE_CR, SFF_MODULE_TYPE_10G_BASE_SR, SFF_MODULE_TYPE_10G_BASE_LR, SFF_MODULE_TYPE_10G_BASE_LRM, @@ -142,6 +144,7 @@ typedef enum sff_module_type_e { "40G_BASE_ACTIVE", \ "40G_BASE_CR", \ "40G_BASE_SR2", \ + "25G_BASE_CR", \ "10G_BASE_SR", \ "10G_BASE_LR", \ "10G_BASE_LRM", \ 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 74cad3e5..4ddddc8b 100644 --- a/packages/base/any/onlp/src/sff/module/src/sff.c +++ b/packages/base/any/onlp/src/sff/module/src/sff.c @@ -165,6 +165,11 @@ sff_module_type_get(const uint8_t* eeprom) return SFF_MODULE_TYPE_10G_BASE_CR; } + if (SFF8472_MODULE_SFP(eeprom) + && _sff8472_media_sfp28_cr(eeprom)) { + return SFF_MODULE_TYPE_25G_BASE_CR; + } + if (SFF8472_MODULE_SFP(eeprom) && SFF8472_MEDIA_GBE_SX(eeprom)) return SFF_MODULE_TYPE_1G_BASE_SX; @@ -214,6 +219,7 @@ sff_media_type_get(sff_module_type_t mt) case SFF_MODULE_TYPE_100G_BASE_CR4: case SFF_MODULE_TYPE_40G_BASE_CR4: case SFF_MODULE_TYPE_40G_BASE_CR: + case SFF_MODULE_TYPE_25G_BASE_CR: case SFF_MODULE_TYPE_10G_BASE_CR: case SFF_MODULE_TYPE_1G_BASE_CX: case SFF_MODULE_TYPE_1G_BASE_T: @@ -278,6 +284,10 @@ sff_module_caps_get(sff_module_type_t mt, uint32_t *caps) *caps |= SFF_MODULE_CAPS_F_40G; return 0; + case SFF_MODULE_TYPE_25G_BASE_CR: + *caps |= SFF_MODULE_CAPS_F_25G; + return 0; + case SFF_MODULE_TYPE_10G_BASE_SR: case SFF_MODULE_TYPE_10G_BASE_LR: case SFF_MODULE_TYPE_10G_BASE_LRM: 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 d748d162..5eb0a07c 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 @@ -66,6 +66,7 @@ aim_map_si_t sff_module_caps_map[] = { "F_100", SFF_MODULE_CAPS_F_100 }, { "F_1G", SFF_MODULE_CAPS_F_1G }, { "F_10G", SFF_MODULE_CAPS_F_10G }, + { "F_25G", SFF_MODULE_CAPS_F_25G }, { "F_40G", SFF_MODULE_CAPS_F_40G }, { "F_100G", SFF_MODULE_CAPS_F_100G }, { NULL, 0 } @@ -76,6 +77,7 @@ aim_map_si_t sff_module_caps_desc_map[] = { "None", SFF_MODULE_CAPS_F_100 }, { "None", SFF_MODULE_CAPS_F_1G }, { "None", SFF_MODULE_CAPS_F_10G }, + { "None", SFF_MODULE_CAPS_F_25G }, { "None", SFF_MODULE_CAPS_F_40G }, { "None", SFF_MODULE_CAPS_F_100G }, { NULL, 0 } @@ -141,6 +143,7 @@ aim_map_si_t sff_module_type_map[] = { "40G_BASE_ACTIVE", SFF_MODULE_TYPE_40G_BASE_ACTIVE }, { "40G_BASE_CR", SFF_MODULE_TYPE_40G_BASE_CR }, { "40G_BASE_SR2", SFF_MODULE_TYPE_40G_BASE_SR2 }, + { "25G_BASE_CR", SFF_MODULE_TYPE_25G_BASE_CR }, { "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 }, @@ -173,6 +176,7 @@ aim_map_si_t sff_module_type_desc_map[] = { "40GBASE-ACTIVE", SFF_MODULE_TYPE_40G_BASE_ACTIVE }, { "40GBASE-CR", SFF_MODULE_TYPE_40G_BASE_CR }, { "40GBASE-SR2", SFF_MODULE_TYPE_40G_BASE_SR2 }, + { "25GBASE-CR", SFF_MODULE_TYPE_25G_BASE_CR }, { "10GBASE-SR", SFF_MODULE_TYPE_10G_BASE_SR }, { "10GBASE-LR", SFF_MODULE_TYPE_10G_BASE_LR }, { "10GBASE-LRM", SFF_MODULE_TYPE_10G_BASE_LRM }, diff --git a/packages/base/any/onlp/src/sff/sff.mk b/packages/base/any/onlp/src/sff/sff.mk index cfe22be5..0e3b4d8d 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 2016-05-17 17:43:05.843123 +# Autogenerated 2017-01-13 00:00:59.561756 # ############################################################################### sff_BASEDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) include $(sff_BASEDIR)module/make.mk -include $(sff_BASEDIR)module/auto/make.mk include $(sff_BASEDIR)module/src/make.mk +include $(sff_BASEDIR)module/auto/make.mk include $(sff_BASEDIR)utest/_make.mk