From 2042c4c1f405149058e49f24492415ca47e846ec Mon Sep 17 00:00:00 2001 From: Zi Zhou Date: Mon, 30 Jan 2017 22:30:25 -0800 Subject: [PATCH] support QSFP SM4 type --- .../base/any/onlp/src/sff/module/auto/sff.yml | 2 ++ .../base/any/onlp/src/sff/module/inc/sff/8436.h | 17 +++++++++++++++++ .../base/any/onlp/src/sff/module/inc/sff/sff.h | 2 ++ packages/base/any/onlp/src/sff/module/src/sff.c | 7 +++++++ .../any/onlp/src/sff/module/src/sff_enums.c | 2 ++ packages/base/any/onlp/src/sff/sff.mk | 2 +- 6 files changed, 31 insertions(+), 1 deletion(-) 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 810848a2..71843f4e 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" +- 40G_BASE_SM4: + desc: "40GBASE-SM4" - 25G_BASE_CR: desc: "25GBASE-CR" - 10G_BASE_SR: diff --git a/packages/base/any/onlp/src/sff/module/inc/sff/8436.h b/packages/base/any/onlp/src/sff/module/inc/sff/8436.h index d2c0e35f..cf389351 100644 --- a/packages/base/any/onlp/src/sff/module/inc/sff/8436.h +++ b/packages/base/any/onlp/src/sff/module/inc/sff/8436.h @@ -270,6 +270,23 @@ _sff8436_qsfp_40g_lm4(const uint8_t* idprom) return SFF8436_MEDIA_NONE(idprom); } +static inline int +_sff8436_qsfp_40g_sm4(const uint8_t* idprom) +{ + if(!SFF8436_MODULE_QSFP_PLUS_V2(idprom)) { + return 0; + } + + if (!SFF8436_MEDIA_NONE(idprom)) return 0; + /* 850nm tx technology */ + if (idprom[147] & 0xF0) return 0; + /* length is 200m(OM3) or 250m(OM4) */ + if ((idprom[143] != 100) && (idprom[146] != 125)) { + return 0; + } + return 1; +} + static inline int _sff8436_bitrate(const uint8_t *idprom) { 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 1e5c332c..3f0461c3 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 @@ -108,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_40G_BASE_SM4, SFF_MODULE_TYPE_25G_BASE_CR, SFF_MODULE_TYPE_10G_BASE_SR, SFF_MODULE_TYPE_10G_BASE_LR, @@ -144,6 +145,7 @@ typedef enum sff_module_type_e { "40G_BASE_ACTIVE", \ "40G_BASE_CR", \ "40G_BASE_SR2", \ + "40G_BASE_SM4", \ "25G_BASE_CR", \ "10G_BASE_SR", \ "10G_BASE_LR", \ 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 4ddddc8b..52c08a21 100644 --- a/packages/base/any/onlp/src/sff/module/src/sff.c +++ b/packages/base/any/onlp/src/sff/module/src/sff.c @@ -125,6 +125,11 @@ sff_module_type_get(const uint8_t* eeprom) return SFF_MODULE_TYPE_40G_BASE_LM4; } + if (SFF8436_MODULE_QSFP_PLUS_V2(eeprom) + && _sff8436_qsfp_40g_sm4(eeprom)) { + return SFF_MODULE_TYPE_40G_BASE_SM4; + } + if (SFF8472_MODULE_SFP(eeprom) && SFF8472_MEDIA_XGE_SR(eeprom) && !_sff8472_media_gbe_sx_fc_hack(eeprom)) @@ -234,6 +239,7 @@ sff_media_type_get(sff_module_type_t mt) case SFF_MODULE_TYPE_40G_BASE_LM4: case SFF_MODULE_TYPE_40G_BASE_ACTIVE: case SFF_MODULE_TYPE_40G_BASE_SR2: + case SFF_MODULE_TYPE_40G_BASE_SM4: case SFF_MODULE_TYPE_10G_BASE_SR: case SFF_MODULE_TYPE_10G_BASE_LR: case SFF_MODULE_TYPE_10G_BASE_LRM: @@ -281,6 +287,7 @@ sff_module_caps_get(sff_module_type_t mt, uint32_t *caps) case SFF_MODULE_TYPE_40G_BASE_ACTIVE: case SFF_MODULE_TYPE_40G_BASE_CR: case SFF_MODULE_TYPE_40G_BASE_SR2: + case SFF_MODULE_TYPE_40G_BASE_SM4: *caps |= SFF_MODULE_CAPS_F_40G; return 0; 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 5eb0a07c..c3a0d880 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 @@ -143,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 }, + { "40G_BASE_SM4", SFF_MODULE_TYPE_40G_BASE_SM4 }, { "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 }, @@ -176,6 +177,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 }, + { "40GBASE-SM4", SFF_MODULE_TYPE_40G_BASE_SM4 }, { "25GBASE-CR", SFF_MODULE_TYPE_25G_BASE_CR }, { "10GBASE-SR", SFF_MODULE_TYPE_10G_BASE_SR }, { "10GBASE-LR", SFF_MODULE_TYPE_10G_BASE_LR }, diff --git a/packages/base/any/onlp/src/sff/sff.mk b/packages/base/any/onlp/src/sff/sff.mk index 0e3b4d8d..ae469813 100644 --- a/packages/base/any/onlp/src/sff/sff.mk +++ b/packages/base/any/onlp/src/sff/sff.mk @@ -3,7 +3,7 @@ # # Inclusive Makefile for the sff module. # -# Autogenerated 2017-01-13 00:00:59.561756 +# Autogenerated 2017-01-31 00:32:39.650740 # ############################################################################### sff_BASEDIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))