From 577779c1e8dcf89262a898223cbeea98c0ac45f6 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Tue, 28 Sep 2021 07:37:56 +0000 Subject: [PATCH 01/13] initial commit Signed-off-by: Dante Su --- doc/sfp-cmis/cmis.md | 308 ++++++++++++++++++++++++++++++++++++ doc/sfp-cmis/images/001.png | Bin 0 -> 22634 bytes doc/sfp-cmis/images/002.png | Bin 0 -> 45188 bytes 3 files changed, 308 insertions(+) create mode 100644 doc/sfp-cmis/cmis.md create mode 100644 doc/sfp-cmis/images/001.png create mode 100644 doc/sfp-cmis/images/002.png diff --git a/doc/sfp-cmis/cmis.md b/doc/sfp-cmis/cmis.md new file mode 100644 index 00000000000..34f683b559d --- /dev/null +++ b/doc/sfp-cmis/cmis.md @@ -0,0 +1,308 @@ +# Feature Name +QSFPDD CMIS support for SONiC + +# High Level Design Document +#### Rev 0.1 (Draft) + +# Table of Contents + * [List of Tables](#list-of-tables) + * [Revision](#revision) + * [About This Manual](#about-this-manual) + * [Scope](#scope) + * [Abbreviation](#abbreviation) + * [References](#references) + * [Requirement Overview](#requirement-overview) + * [Functionality](#functionality) + * [Design](#design) + * [Testing](#testing) + +# List of Tables + * [Table 1: Definitions](#table-1-definitions) + * [Table 2: References](#table-2-references) + +# Revision +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:-------------------:|-----------------------------------| +| 0.1 | 09/27/2021 | Dante (Kuo-Jung) Su | Initial version | + +# About this Manual +This document provides general information about the QSFPDD CMIS support for SONiC. + +# Scope +This document describes functional behavior of the QSFPDD CMIS support for SONiC. + +# Abbreviation + +# Table 1: Definitions +| **Term** | **Definition** | +| -------------- | ------------------------------------------------ | +| pmon | Platform Monitoring Service | +| xcvr | Transceiver | +| xcvrd | Transceiver Daemon | +| CMIS | QSFPDD Common Management Interface Specification | +| QSFPDD | Quad Small Form Factor Pluggable Double Density | + +# References + +# Table 2 References + +| **Document** | **Location** | +|---------------------------------------------------------|---------------| +| QSFPDD Common Management Interface Specification (CMIS) | [CMIS5p0.pdf](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwiL0pT5gqHzAhWWYisKHWI3CNoQFnoECCIQAQ&url=http%3A%2F%2Fwww.qsfp-dd.com%2Fwp-content%2Fuploads%2F2021%2F05%2FCMIS5p0.pdf&usg=AOvVaw3vUjsBDOeUWoYaMn3KDG_w) | + +# Requirement Overview + +This document describes functional behavior of the QSFPDD CMIS support in SONiC. + +The QSFPDD Common Management Interface Specification (CMIS) version 4.0 was finalized +in May of 2019 and provides a variety of features and support for different transceiver +form factors. From a software perspective, a CMIS application initialization sequence +is now mandatory as per the current dynamic port breakout mode activated. And these is +also a new diagnostic support tha could be useful to SONiC users and developers. + +The current SONiC platform API model is such that base classes in **sonic-platform-common** +define a common, platform-independent interface that can be implemented in platform-specific classes. + +![](images/001.png) + +Unfortunately, the legacy SFP libraries (sonic-sfp) do not provide full featured support for the SFP, +and and vendors are having to fill in implementation gaps for themselves. This is resulting in a lot +of duplicate work being done for things that should be common across platforms. + +The goal of this SONIC QSFPDD CMIS support is to + +- Provide an unified common SFP parser for the QSFPDD transceivers +- Enhance the **pmon#xcvrd** for the QSFPDD application initialization sequence +- Enhance the **pmon#xcvrd** for the QSFPDD diagnostics loopback controls + +## 1.1 Functional Requirements + +1. Ability to parse the advertised applications from the transceivers +2. Ability to post the advertised applications to the STATE_DB +3. Ability to decode the current module state from the transceivers +4. Ability to post the current module state to the STATE_DB +5. Ability to decode the error code of the application initialization sequence from the transceivers +6. Ability to post the error code of the application initialization sequence +7. Ability to process the application initialization sequence in multi-thread/process model. +8. Ability to enable / disable the transceiver loopback controls + +**Note:** +The duration of the CMIS application initialization sequence greatly differs from transceivers +to transceivers, while some take 3 seconds for activating the 4x100G mode, some require 15 seconds. +Hence it's mandatory to support multi-threaded/processed models. + +## 1.2 Configuration and Management Requirements + +1. Show commands to display the QSFPDD EEPROM and DOM information, as described in **Show Commands** section below. + +## 1.3 Warm Boot Requirements + +Functionality should continue to work across warm boot. +- To support planned system warm boot. +- To support pmon docker restart. + +# Functionality + +## 2.1 Target Deployment Use Cases +The QSFPDD CMIS support is used to perform application initialization as per the operational +port breakout mode, otherwise the links will be down if the modules is with CMIS v4/v5 firmwares. + +### 2.1.1 CMIS loopback Use Cases +The loopback controls at the transceiver layer can quickly be tested +by a remote user to triage either system-side or line-side issues and help isolate failing hardware. + +## 2.2 Functional Description + +- The **pmon#xcvrd** will detect the module type of the attched transceivers and post the +information to the **STATE_DB** +- If the transceiver is a QSFPDD CMIS module, the **pmon#xcvrd** will activate the desired +application mode as per the current port mode. +- If the transceiver is a QSFPDD CMIS module, the **show interfaces transceiver eeprom** +should display the advertised applications of the transceiver. +- If the transceiver is a QSFPDD CMIS module, the users will be able to enable or disable the +loopbacks at the transceiver layer to triage link issues. +- If the transceiver is a QSFPDD CMIS module, the users will be able to check the state of +the application initialization. + +# Design + +## 3.1 Overview + +![](images/002.png) + +### 3.1.1 sonic-platform-daemons + +#### 3.1.1.1 sonic-xcvrd (modified) + +The transceiver daemon will be enhanced as below: + +- Post the QSFP-DD infomration to STATE_DB +- Add a new CMIS task to handle the multiple CMIS initializations in parallel + +### 3.1.2 sonic-platform-common + +#### 3.1.2.1 sonic_platform_base/sonic_sfp/inf8628.py (modified) + +This library will be enhanced as below + +- Add support for decoding the advertised applications of the QSFPDD CMIS transceiver +- Add support for decoding the DOM information of the QSFPDD CMIS transceiver + +#### 3.1.2.2 sonic_platform_base/sfp_standard.py (new) + +This is a new common SFP base class that's supposed to be inherited by the SFP drivers +of the individual platforms, and it will later be refactored when **sfp-refactor** is +open for business. + +### 3.1.3 sonic-utilities + +#### 3.1.3.1 sfputil (modified) + +This utility will be enhanced to support the following features + +- Show the current application mode of the QSFPDD CMIS transceiver +- Show the current configuration errors of the QSFPDD CMIS transceiver +- Show the loopback capabilities of the QSFPDD CMIS transceiver +- Enable/Disable the loopback controls provided by the QSFPDD CMIS transceiver + +## 3.2 DB Changes + +### 3.2.1 CONFIG_DB + +No modifications made. + +### 3.2.2 APPL_DB + +No modifications made. + +### 3.2.3 STATE_DB + +The **TRANSCEIVER_INFO** table will be extended as below if the transceiver is compliant with CMIS 4.0 onward: + +``` + "TRANSCEIVER_INFO|Ethernet0": { + "type": "hash", + "value": { + "application_advertisement": "{1: {'host_if': '400GAUI-8 C2M (Annex 120E)', 'media_if': '400GBASE-DR4 (Cl 124)'}, 2: {'host_if': '100GAUI-2 C2M (Annex 135G)', 'media_if': '100G-FR/100GBASE-FR1 (Cl 140)'}}", + "cable_length": "0.0", + "cable_type": "Length SMF(km)", + "connector": "SN (Mini CS)", + "connector_type": "SN (Mini CS)", + "encoding": "N/A", + "ext_identifier": "N/A", + "ext_rateselect_compliance": "N/A", + "hardware_rev": "01", + "lane_count": "4", + "manufacturer": "AVAGO", + "media_type": "sm_media_interface", + "memory_pages": "['Diagnostic Pages Implemented', 'Page 03h Implemented', 'Bank 0 Implemented']", + "memory_type": "Paged", + "model": "AFCT-93DRPHZ-AZ2", + "module_state": "Ready State", + "nominal_bit_rate": "N/A", + "revision_compliance": "4.0", + "serial": "FD2038FG0FY", + "specification_compliance": "N/A", + "type": "QSFP56-DD", + "type_abbrv_name": "QSFP-DD", + } + } +``` + +## 3.3 CLI + +### 3.3.1 Show Commands + +The legacy show command, **show interfaces transceiver eeprom**, will be enhanced for QSFPDD support. + +``` +admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 +Ethernet0: SFP EEPROM detected + Application Advertisement: + 1: 400GAUI-8 C2M (Annex 120E) | 400GBASE-DR4 (Cl 124) + 2: 100GAUI-2 C2M (Annex 135G) | 100G-FR/100GBASE-FR1 (Cl 140) + Connector: SN (Mini CS) + Identifier: QSFP56-DD + Implemented Memory Pages: + Bank 0 Implemented + Diagnostic Pages Implemented + Page 03h Implemented + Length SMF(km): 0.0 + Module State: Ready State + Revision Compliance: 4.0 + Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 + Vendor Name: AVAGO + Vendor OUI: 00-17-6A + Vendor PN: AFCT-93DRPHZ-AZ2 + Vendor Rev: 01 + Vendor SN: FD2038FG0FY + +admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 --dom +Ethernet0: SFP EEPROM detected + Application Advertisement: + 1: 400GAUI-8 C2M (Annex 120E) | 400GBASE-DR4 (Cl 124) + 2: 100GAUI-2 C2M (Annex 135G) | 100G-FR/100GBASE-FR1 (Cl 140) + Connector: SN (Mini CS) + Identifier: QSFP56-DD + Implemented Memory Pages: + Bank 0 Implemented + Diagnostic Pages Implemented + Page 03h Implemented + Length SMF(km): 0.0 + Module State: Ready State + Revision Compliance: 4.0 + Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 + Vendor Name: AVAGO + Vendor OUI: 00-17-6A + Vendor PN: AFCT-93DRPHZ-AZ2 + Vendor Rev: 01 + Vendor SN: FD2038FG0FY + ChannelMonitorValues: + RX1Power: 2.9217dBm + RX2Power: 1.9984dBm + RX3Power: -40.0000dBm + RX4Power: -40.0000dBm + TX1Bias: 44.9420mA + TX1Power: 2.8587dBm + TX2Bias: 47.4440mA + TX2Power: 3.0211dBm + TX3Bias: 47.4440mA + TX3Power: 2.9634dBm + TX4Bias: 49.9460mA + TX4Power: 2.7395dBm + ChannelThresholdValues: + RxPowerHighAlarm : 7.5000dBm + RxPowerHighWarning: 4.4999dBm + RxPowerLowAlarm : -10.4001dBm + RxPowerLowWarning : -6.4016dBm + TxBiasHighAlarm : 75.0000mA + TxBiasHighWarning : 70.0000mA + TxBiasLowAlarm : 10.0000mA + TxBiasLowWarning : 15.0000mA + TxPowerHighAlarm : 6.9999dBm + TxPowerHighWarning: 3.9999dBm + TxPowerLowAlarm : -6.4016dBm + TxPowerLowWarning : -2.4003dBm + ModuleMonitorValues: + Temperature: 27.4336C + Vcc: 3.2883Volts + ModuleThresholdValues: + TempHighAlarm : 75.0000C + TempHighWarning: 70.0000C + TempLowAlarm : -5.0000C + TempLowWarning : 0.0000C + VccHighAlarm : 3.6300Volts + VccHighWarning : 3.4650Volts + VccLowAlarm : 2.9700Volts + VccLowWarning : 3.1350Volts +``` + +### 3.3.2 Debug Commands + +The **sfputil** will be enhanced for CMIS debugging + +# Unit Test + +- Verify with QSFPDD static and DOM information with **show interface transceiver eeprom** +- Verify with QSFPDD application initialization by **show logging** when reseating the QSFPDD transceiver +- Verify with QSFPDD application initialization by **sfputil** diff --git a/doc/sfp-cmis/images/001.png b/doc/sfp-cmis/images/001.png new file mode 100644 index 0000000000000000000000000000000000000000..6b5264c7ec33f9d3d237993c0258a0f693758c35 GIT binary patch literal 22634 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⪚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 ODL>FqD3yQq_x}KSB;I5I literal 0 HcmV?d00001 diff --git a/doc/sfp-cmis/images/002.png b/doc/sfp-cmis/images/002.png new file mode 100644 index 0000000000000000000000000000000000000000..43424f3cfa98678bba3d914bc1e2bf5265e12e4d GIT binary patch literal 45188 zcmc$_Wl&u~*DgpD5AMMw!QCyvodkDx4IU0oaF+nV-7UDgLvRZo+#$HbG~|81xwq#2 zm>*L$r*?`{Cwuqq?j`-KwVoCDNk$YA4i^pz3JOtNOh^t2>SYZS)Uzp==inDOxZ7vo z59}8)RXZrCHyw}vp7mJg89+f1L5T}}RQQ^-x8UrmFnPy+&&=#}uqR0oFU6!vtP3ki z0_#nLief`47Fn%Ckl|iXe4Sr)Ai1k`Q&_wYy}Kz-qqZw2{IXeiAcKfX9sT2TG7E8- znG10vig>pJnil>yP4O~OePm?uG^Lvz{1g`{E<-n3QD2uh6N#`9P{EuYKLRks?JCg! zzC&fglned)y5&cM^6y(cvE<9AZ=P1YsE;dwf=a{t|M#};PA(|V(Uq_zYjcx|PA)iX zeL1w%`=f~+7175DGJKC9f37hxV#GM4g1q})C&ZM)g=2~s3aXVn--@zkma896hSgr7 zN(J|F715HFpp@IstL8FQ9xwSrJi5DM7kJ82Zt^X?CZdenRbtvbrT+s5*2$j z)IZ*_GUnbCjP&OB>++>3toa{^@iCSh{_UsE?W*gdVD7mqWG{1e;{>;us}+)MW@8j} zzqEOzgwP>IL?q{1d$SucjGM8^(;QuVBQu3D!x+|Q3Mny%}NK#&Kg>pYc7T>D26q8 zPP&CFO2fs)E{`5Z@I2b?t-B*UP`9>A6gKm)4O1fuaQFaqr)!8nOt}S-}BQW^%EPA<)q0{=?tYuAF`H zeL=;OOPvV`E=@lF9zw{^O~KtNY$&J@e&O8nMlhR?j6L12SjF`OI`6b!FeJQR$s!B8 zY`jNmxjJ!id1$=uf4E+}B@9<737|pILFko=0K{_Jf9*-;1kj{V2I;)V!FN3o_t>ALAqHFb- zIZ4Mb$b(?Mfbz8YcH+GBu;PJ~JVPsuK(#vR472JVfI@{RFtn<5QTom<#LnGuRlcLC z8nIl+laWZ3G|&MiQ_ZH>a$nuJynN9lvJr(@mPU%NCDq+XvO>1v=#3MH`E zwn0|PT8iCPL`xBNMS|Ox3vnMMrt>nXgz|oJjvv;fVGULcMK>wh6vsK}A;vNs|NRWB zYjGMqiVoCPIg5W`{UW8AyN)RpejE0>Et5#G!MY*r2@_ZqnGcI9FCo6=s%Y$D3z@^m z*aUa?wR)Co-PK5?c$HeNhZQB6nnCt?wxw3tLiO*(S6WuC^)eE}Y^uD6t_!v$Go#G2 zO~!*47&%$p;!+xt_nOQb@&Myh|!st_l^&(@aHm0Fc&`Rt88Y1qwHFV;2y@5>qj+eQdipXz+vmX{3 zN#5eq;)IQCF{$1va@Nrm?MVil126+>Nd$C%kY1b5F36Sr%v!XXkT|7cY?|6ds;z@c zg&A!>lCUvLTH9X7;oYReo!GOZW>OU~DYsGMM1$OR#Y77Ud=zg=*1GRR+`bv09WdG| zk|DIT_xpS_rx=}jl|?1cuMm-5f4GD0K_o^RD9@lP$eZb`aq4&}VH>qBX}4l4ACoRU zF2q$NB^g(&-ZTZ_h=HWn`s$}NB)66U2)B+YwE z&eM7R1Lxz|htFb)g6jN00iPwNkkMP)l+3BiqG8wDZnV=3Rglr<3w37Fx&@OHmK0YsMzBi3F>-w1=<0mF|_S zQqv?A+|B5%(%PYgD>?c4G4hIAmD>!v+NQ|Xn3SVKuj5X z`*uh5K{V@y``g)Rw5o36A{>4Npb=pFAwd|*{2FbBx=xa|M)93yI?9r&yMyuBk>xaC z{#r{!%Cn7n<$lQJ>niFdzR*-f{`B@|2;WYiJsJvgjE!}+G%ugGMM1cUvl_eloQ|Ab zz37J$gaz8jtr|xUSJn8qy$pR)Q&~?8UA_L4$nR@u>sa|woyIz)viVcA3dba;%jzKe z<*PwKVOveot|M93R>{x55A2wukupJz`GkCU2}~RuVTA2wqj4|{I!4e~3HDdd+p6j4 zBX>{6?^`tD&IKat$KKsVod`nJNkL; z);_WTaIY01aLw3md|bXN#3;_SAGB*+DM@(5!K??1&cl?ec__q>nP{pTpoqYM^BvRm zDibDm{r3nP{87cbTff@~x$WLj?WnM)2tp1z&3Q^Zl_4n6NMTYc} z@_t6uN^ysUOp?GecHDPkIK$TE_s=Vkx4_Bx6hPcG#-rEVVh%52p^bkOyn^!7?Ye4g zSvqD2v?CFI`3F|``P83>1yQ7?BJ+4?tVad&<*l{cN+YL#r(dWW|L_4 z7}}d6k)2s9AwBwhR{XcQ$Diy%Q>UdfE7j86AS&))D(-EP5};kO3qJ^S6G*oAZG=;1 zfF4F#JAb)$ivm6eu6XH452#nchai~0gq^4;xsLbe9nf0My9<(~h@^GT=rH(=%G<_V z!b$kckM25XI9glrSX~(vbRvPxZ3!Mu~B#|{laM5sEkjXRYM`&kI zgolFaFjgPs-c)Pp&=B&}3XBnuOxr$7rq_fhUgEsK{%IOH;uH(_%{Zr$>&h5UpO@78*e&|;t5Jiq1>XjecqV|zxlpb z-w9z@LDy+5l3B`nxxHH>&AYIb#!ZMSAP~2OAgGKyI5t4g$adzMIIxK%!`chctoNg! zts#_lbtgB@*ykWltbtneEBEEs>`UN0?bQWvMO1QT z4_8;LH$&%gMhz-DzG<#EjXW*ihz$8iUa#x+dIj3Q-FBpq*{Oa{Tg&>|b zvV=IymByI<#zILWJSJ_<7ZIiiSOn+Fv9JU}^sUm={LC5)hwC@VhmD$-Xas$MHgv+gyY!ugsE!rzEGs zzeUZ-sVEcJ<|f~@7BHU z4JAn{R4=Q=x9sE2D{FAWKe&(Gbl`>5MGiN0_%-qb(I}k7An*}{Fi5yL zu93#IQbp=JfrCX~B~onL<01F~|5ueD0b(l$rmnH`7Hl|BXu8pjZ`S!^BcU)1V&z|r zwEKo8gWZ`%3@t|DU>--x9F4TQ!J*VuDKdv+5PSYimvwDCGZ7j>{GWM*F3#N)2x09K zL3MNZhAr6brM^f`28i(SS&?M4&6XonXzGsB_nwj@dOk%Gf43vO9Nv*Ug)yF=H!D_X z1$^nJK0}2-qZaFIMj}Dm!~SPr&9_!_@jH5TO1Qfppt@g_33a~W0giZ78|cf^;Bgu9 zE(W-mE@aOUFv_UDrr9f>u1Efh4z`ZBof1_YioQW%iyGLh(1$-zUmyPm;iH2yh;~CH zP~+|6xJW3Z=!_X#(8+o;?>%9&z7(7f`HIt!0#$mTVY8$+4R?49!j@%}u?ks^K}f@} z7_inhKG_u=l_M;V?G^}yCT!$=3Z5ZJPb=zjE}1bM`B@eQb}kKzd~)fvD&6DS*h8c~ zX*e^?ws(NIG=$)4n<^H?if8P4CO=H22ZS>txzREH*+K8W$Lo{_cfN0Pv{!La6H#LjRGq8cX%``?d1N+3^KtXNbs4vydM- z;d=$>Qc(42x0Rph2rP^HDeeyqOyFJ5Ur7w$N!f9P$KnV13Bfp%1Z za^OXb`qiX40Eol}kf_GSt~x7g-of>MQHuJH>>0=T3El9@PK`Bqyk9Ah;CGVr>O6`A zH9z8VevJ+Et0(EA0BL+uq}>D|OInz*$L+nNNT<7ellgAoL$Cu4+8a`ossy}D%D^{n zo`FLKtCv#Y$Z~SlEjqS=!rso&6LGfb^vE>%HE04GMtPT#B|nOYecl!d2LXj?s%Wqj z5P6J|u^CBXk=tR)NR<%+uyu1g{-!wbfC&I8vmMBa-j1j7;|#(JH-KZh)Di$LSsCuGF@ zlKTAP@etkhe1sOTUCTSDfx=~B&vh~c0eq1W!(Nswr0{>k7+Nm*MJ?)f1|uG>uj_$a zJHEJYY(QX~6PDD~ZNKv3pdWTOcJD$!AfN~9a-~R>29?KFGeM1tYi+EYq$lYNN1^hs7fTm*+^opA;rDZZl!@Q5!$2#+L= z#s`?U!UCQm6S9P6?!s|)%8%FAmh!UfTr22OAd-W*x-E*A-HfU#`i^qC_c-w&t0a?8 z6~8Hf@6!>}NVS`@SQQZH#na}OpMubwPAn+%q^2iY*{Qo%Y|7mKu~=HX<|#Tc88xxfUHZGrLbwWRtr!<;6JAmC3oG8h1^VvSr{vE=&HoKBgc66CYQ$cVs?=G)U^H>(?ygd6c=h=j>qZrfm#Rg-T25 zFuX@oF_l0S|3jK9GM1dZe+W%ekuf_d&|(DdnVI?qi`AfbesP6tP42VUg-t#ppS&y^ zAbN72?^OicqhCB@rA7^ClOgcLS!E~fKvw#8+8Rr?)i%rFbS|F5uq}lPE^b3=@hb7j z5qMLa@yTCo$ab6@Tm-`l$!#Qa?|yg9EZv{8$K=R~bRO$V$g`;W&ajVjJTyKK&*sTk z)ta~2-Et^muRk8u9q@Bxz`PLZUc?ZxJ8BX6&?G}7GpIt5%k?%isZ5iG5APTZCbrHv zYZytUHZS~g0(>ImrI#8TFO0R7EYh_J9-Ndo-&HXb5kopRFH+37-a?W}W6#m9Z?$HH z#qqKU1@Kt8)u#zvnP^`5euh^ifkG%FJ zBYDJvp@$(3*|y|NW$R;q*UZ&7%j#=2JDhFCt?z_Zkb)})d@J0Yfgsw`0tWjbgW|f7 zVZ1BMhx>hibXpkNL9(xvLC?p#ktLfSd0r8hPy6xcrxPx&+e_Th^og)=J9yLv7}LGR zFKNg6&7KmtqVml-L+&~L$O2nLidyUCj~>Y-t%*hc5!Ajz7!z_wgCo#3K7?69e8!Umy9=p z>C0A=UEcH^nTh*qB~2bYER)kA-4fW06tQHTxe23)EeNFeB~psSip!<;!4?gPTHeM= zlmR=yfhZIF8s-3e6obtI(Dmf`5Aqx$oh9)%y{XNOsr&;@#D4qVf5&B3x#Z$)jII3@ z>UhSdx#wVDs(o1(MwL%@U8qy}F&5^_Xi3~*07!66bR-TxT)V_WFvdV4*7Gx&aCDXZ zY&a}2G!_5(tJ+<=sWDRRSnHfuzruo5GbA!XbK2zx{oUN@N%f5Juu@DoK47IYa;v*& zX5`Ro5-{II?K2H`rr-p$nmYN7d~*In(|a~Gg{Os1RZ3;WD@>Efu4*;+m(dl_&YTz zxBRI~yC*LEly2WfLK!!BTCr~GAy~vhgyYrYG_fV^Z95Rhtx2DZb@CLE_iMp+A}|TyLV(-m zepeN7pm}826-)h&)>z0w_k55tp{TrCFLBOdLMkP$Oo~G3{1+6pbT(U!FnQ?e1y6{P z+XRECIlng7nJ80PIm3-n^8BYMH7S_*Xtf{3!wxo%Sew`*UTmQ27*pluno6kf# zuWuK_C6{1$Wo|HFiP<+7MU{)n>S#SUPhSq6mY>y88{HcKcMME_pi`ov;!J1#9WOP% z+KqGX<})XA;=j~-J?9kQyS;F^oQCU&dwt9mFSkS!-tktlc`pGu8qqd zN^jKP7T*ZuiphzuXe8a4Xws{$)J^HD!q%~cledQjun;H3mC*>Y^L~y|GN+?9=M_=U zN>0L>m89QiZ2gP+@>`oq4~Qjjr@-EOqS&3Byoz_eegv#mliz>vxtG;0>0#SE)@;CM z;a`d$pk8(W=tht@scj*5;KYCYKat0x$QJaIa(KeN0$%9pV-K*vzi=;lSJr4i&)aYW7zt53w& zDp%X`SY*`PsO)!Uu*BQ1i)AKV+F_BYZI#we&yP1T9#@JT*Zm>Zq`GcLt(XNP%Q>xU z!|Gt`yLcxg*$(U*{Xt~xuL#`M21YZLOH6qgxUrS5*mIm z3stsAHUj>i9i*4D+%yhTCC3{S4Vf7wb-WA6?BuMv=VW&wA)R~Qy%2q${0S6xAkC45 zF?hW@(r`Wc0*zca!AA->lLtg!3Uvyw6m^vXmhJA~LDp@9%J!}3ub1+7DNqod= zxJ==c>EtQ%zA4YN*IDqE#d@P zE>s*CZTBf|)@qd4dluYNk#8vx+m5+~C1vX~P8T<>d|AOy6Gz^ODiOBDvDOZ&2Mqla6A1w8KNL~h!%b3^AXHJ?v$76#duc-|5py~e@=ThQu*VVU4mS+s2IaUJKYZ{p5T#Q5=7HVz_- z^6gcslRG4fWNNw9L|H+>fCU!~4NaOtzDOUIJwg95?Sq}1(T}QqmA4hD`3{S=k%ybv zt@efYDCwX{Eo2mDK6P zk;lzo;5uWbAKg9SzZr_ttJ~LrzUw>{n#D4G z|LNUiehn&$Ke!SWle|4bV2`(!JBYx8bd?Fz`(%B6}Dio zdH=Wo!A*DPb52Wc>;vWIQ$?Ti71V32+;;MFt1V`1w?>HTGzez(K7RD-(xZI;{yjDI zF3#BT`oO;9%~Y{EEhc=i1Pvy533tCzP*6}Ton}8)UU4z6^YPkG9&Rva&)?h3lDBKS zOqq;0E}9?mPAexYg^eT0Wms@=gvk%Komx`+(2AILqk(j^EdLKd+^;ly+@e}O*sEOhqj;Y z5AE9(EE^k}M0V>p#S-bC_7#3giMv}G>1O*2}vp3t16l>TGvfiBUo12+kPnNnn>`dg}-rhE2T0I&d zb|#5o;Gm_^DgLwJ^`oTH65!+*mKhM34g1kcr_~h|Ss`lTGBWoIhwc{_Ef2uZpFDtb zWVw(RTh*FWJU=panTZYy_h*RTq^^T}z_a?fWx|Kco)mSg6iz#%w5qchat&Nt)d&o986yzOZ^8RGVdXp@G|iko-dOa@CUEH1t)eYh@Fw{BuhP?C_8 zG#*S49#&FN*jsAh=jZoW?~f651JDi%s%&D|F@Pk#n^czT%VmQj^TvCbPswaIZ5=&( z0>z(D2zOOo{Gy++RUC(^ z79kEqKsWCfZe2ebE$W=Jti+_MEIaDNxMP#$x3gLf4XKDShL}l65w@tzTbJc^M=}+K zFmAA@C7QKdL$1GztK$4fV!NMYuS%gTMek>k(+~UL$&V;y0*SdCaemAILqQ33?MEDG z;zPZdv_Jn+B#4dinqlr!5i1LFK+jx`5{VE*s7j<&bU-|lwzPF<h~* z%kkPa3FCeIp`lSY{r)ut8SfikmxDEz8pAt1dhNzjJra=a zSdm@UWngy5;55skhW}2fM>>HNJuu=iKMrDrAH)Nw&dt9n3*ls$E?iF zm>V?c{Kw<<#6A^%w~d#|RV;rq_QUyx3J8jUbG)8lm6ko^7}>-PSVld z=urCtV!U0Be^~YxP8|*7_fKR|R8?}>Aa9JCLEO2&RnDD6qOL5hUpT(}#hFJO)}~0M zXwobTRVh=B3jH{6W_@ej71KO-V0FKICRxURVBeB49+p_GSgBQvN9b2Sf=x69yfBFX zjIBBL8(4|zg@e%lLNvW-@^iA!dE{_sUBf<|C@T&#jqWYk3*B&UJE!*?8}MavB`B4t z*O(}&Dm8Mn?x6$JYFwl=?VX<`J-6#ZO`biV=jmUMu#hv!MpXCZeBc#{FFBd zf+(Lz$TxvV6{@I$E~+xds)ieM$)^lCR4WX2ld4{+ke>MP;2oJb7Jn_irVn!N()8j% zny3jsnRa=HYu2ZXesefl4|jHn5-&>4nfgfqutRR$WPh70!r2 zu)}5)Xscj1%-PKXOb+g8S4R36hIVD^6hq!hE~$xks`FXiP< zGq>O+F-lDB9N%a&lrhPa3uP*eZ670=2PtwWx@@+S#iCrlX!F2Ktd6Th%7{`(CZm;+ zGqfE=kM!GLeom1%y@|xd;||jCMv z$iAx=p!QJZV8it)I-bbQO4ulOAY4ZH@ikBZF-H;Pa!R?wgRlJZk8kZU24L6;Oz-v- zdeW#P8QSA1;f4r#)E0zcj-b60!>a-1Y&#!seDF=G3fbj;K_C8`gNku{K)Pbdv#^U{ z`wdGhW8Jz8Yr$=m(Np@Ph|R35|B-CjTFXjM-U;{>vo%9+%+dN1h`+u|iOKjRDZEZA zGrPPE{}PnDz;)Qb1!`#Bpb+ieeH#wQ0*lD45hI12+!C{#9ue;16+)pQb(HkPIW~`? zYyFFhq`IPF(`69)n5~4Au}7i6mHe72O30k1#EuR{3w}90IDuhM;27iR>fZf!?$a~i z3ven}L~CwNJx)`XzGKm2!s=l>(LqBzmj_X?49%6+$N`57hWLNTSneF_85V;VwyWa~ za@U5@lP5#dw731KKFD0MhhG$@561ETmAz2}xZcjYXxF?gt?|ZnHmD9r$#Y5BM&;QZNKD_%-kVS$!$1OaFL?fMDCam(C zg83t;3$k##t{2NdgviiuzovMdK)XMvF0hWT+QV(grcU$Lkeqa@9%(B(o@2awkRqvU z;L>j4()LJezpnWvoj!f;@HUN}eZ9-WdFYqZyRk;bYT~DT`-0a^Q${4{urx^t$^u1Q z+sn^w;3(|pDF#(wh)*pV<&tpUIYXR9hU+|Dv)-)qKNefF77227#vI0=OQqfRgZ)N? z%5njdjjmVjqdZB6r|xZ^=M(Iv{HCqxAWaIcC1h0!YtM7 zhd;VY&6uf$Z3fl@Un9;jBW5z=4YN5NZKr}N(f$x_efM_p398$@j&#FKipTfdZL+%| z$&mSj|D`?3RfR?DVxy$Ln zU_aLi`d}K$QVqW);Boq+9t_5f7xw=LuUS?fH`#ZD*sOnVOPU7Wo5voL|17pOdQgt6n7^lkZy$=&l;q%8R9 z?vKm9w>8~aoz6XZ&}8PN6R3>z?b?8UIagnsQiEJCy%Moiv!I!cuW9vQ&_ts}Nx{pu z422z$c)YS+w3X9%sRI4vut{~XH_0)lXW90wH6r685(|DwD?0v{HYp_FrPcM?J8NqG zW~86&jOd~$mt;Eii7Qnu*6AHICzgd(4x zdlID@7W#DOzpUw?&k{6>^SAb&i!!mB{&)T~i=R{Ict-zFM!!s^Qu%SY56}ZpVD$hx zKlZwzZ(}ed&S)#EiGr3^v+4Ai$S@&{NM1|Mg4=Y1;ixG0h^i~ElhWIGgks}{B_#)7 z9>as5+#CyDbVz58{tqcz%IrU+Y*0UnkNgn__?8yGmumNG0i73{g$AEMoZlZaQ?e0R z0GDQY!RE!7^4+&!#}CtEZ6#~`*2ETxoy#NU4Y_#u_9Lc2N=(ecy5%;|)I}Xwj}Z;X zCm?}jmc&z`c9V?yk~BS86U+rwz$!iwTkTK3g>F@@Y9P^nPoLJe2=Vv##S1d+%&3@ydkDeIVy$`Yn(bwv}qocrc z;+dj$ESToX%nj&Q*Sp3$CU;7?ha*=*&E?JRnfsEUq`F|8@Nlz(&ZWd=F_J5#+JiuYg$#ee^>-FPGps=6mQ%Y(imue@M=B9!he2~8-u$qy} z&PQm?>UbDB;cG_?Hv>Xnol&mX`yYTGqyG`$s>?kEQIliUV6he`fb2&byDuLbMQ%aGV7^Wf{g8SOrNfU?fsvVxkBze4eij^-fN{d zcvsI^`~dxtp!gu@i{damPWm4}`EFt7z6XEmJ}}Vqz5S$%P0fUsR-NXgqkxU%39@!#Izf{-^6u7IIjUbZbA^Tlu8otG|BtqM9zH^>u@!!a0w+ zoHdg4qN|sVI+iGmcxZHpeHzL>)&7?4%^B6vO8#s*Ekfp}awB`Un% z)%t(*v3kdn{}Xo%(MmT_EAhV6w-3IY?v4Lb?}C@Mbzfc#;F1&DFE53MRpXcL68w;k z^XJrwU5pJAx&^xoCmd2sfgJ^$AZw>d z``>l%6Ja`(v6qR*VY>kbT(`sXhU>BN!7v))MZ<_&g@5pq6a*V7RzJt5P56`%T(GcU zUje6^E}EsMYZ5=g!t_p6W=Uy@f8P5H!wXsNzg&Nnsg=_&UL3Ckxtj{-7Rb*WGnF!w z0~3n~qC-!vUs%zlMFoMh0PD>L{`jS$rBU{Kt2&<1G+pTL@u!pa;!V;+aN8GDyz5VW z2|f{=+Xc`i;<`A*h=CNbiT`wX-r1XI5Y^zn{@xM+7B&`POBWCMIt`3r1% zh6N(APs9OX=(DQJ`5>uSlmv?;r6HjuA#D==wN-~|jJhM{C=9s3fCtr_llVI?9h*>E zy@f|LSY6`iLuFpc=0(C(bOhH1*}$R34=KB@pH4RJPMysKh|;9RGE3f z*5ZmrO-+hBDS)*ETCvst(C2Y`-6)Hu!pxPW;xq_cjk+cIY4>4xsnH|)*_5~ZQY&{Y zoUL3{$aPW9X_O+;)grRr+#QLJi@TpS{rZ{A4?U65*Ufv<=gemuTprjg6~OFtk-6s?Nd8G;Cm{p0Fkeza&G9SaD|~$HpcH?Az=HhjQmCik8ctE6JsaS2e#4XkAnjnCRD9iiA{KFhl}QP~kgN0Az7J7l0Hs zvA6=1&~j55EBpHi=q^SK3fu%mV2)FE-r6=OOHCmQG}n#v%`LpSPo6UeeoY?|l>p+SKnY$q*hv`h>vX1_|zx#7gRhFZwt%t^AGyRB!LhCDNn_pxe@dzoJa42Rw|djvlGA$ zi+g4Z<~sa&FZ%cX2#gb7i$>5i0rFYU>jf6#&b*jkEL3!o@~8qr0?!6ckDW4p!Xy@J z)zJ5PhJu^s)e5$b1j+x%*74Q$UZ=8~6?6w-K z$_Hb>DrLUs?vmjgjcIL0h6&prP(R3?PlRssZo-|Lf8nNnQ@QN|FAw;l6nGaKZNXP$ zns4lprA1BG)I-uX1@Eg1>^{aqto(LBOB!JFf(=AA1FqdCg8dB(ML`#cz3}0q4pbs0 zX4f&`UfOdaKa%0l;a|Bfzs&xD2^!c4v|H1ROyf}`>p|BG@D0wc&jiGhlF~ExAevSN zX}&!XKP`Ti4=T)eg4+@FJ4`%AJRyPUx_sLEhL^eIeW{v}eWk^= zhSe03^mw0wQ0un0Dr(m&&>+d=zv*Y;ofZ%l+Tf_0;Ah2qnc89I6cF;d-X}&p<;^m5 ze04qK0yl_Vp4x!`ubHrpPMQ`2Kd&ORBJ~k=dVa)vQM#JG^}Zpcr*KviI6mpnXdW9u zt_Ad)$)+=uouhx@tQ;IdpYJy-!y=H?;p~HR_r=Sd)}CADo8Fsuo0Y0*PST6W-p%6d zI|l1W3N<_V7Kv4g4#JLaROUm`8@4p;TS=g)BQbR!k(IU~Ih5KKo;}_<_YLu%vf)wGv9AN8&^EB8hA* zNjp~I8*fbqf#Bhp6hw+U31L7_Mdo&?)&6nwjr56!c5+l)4w(;v-e978;-cgH_dFw@ zOu&;T@&BIP&W678`g1`qnWpXux)&3}s_!hyY>+Pw;9qLbem)uR5}EbkN4~ucx#}P- z9$x&8lhCdy5&W5L8R_LhbDG%KBLZizJoiW791-(E3LHOa{PWPRABwHZyqE5vu?B3HgoqxS~-j*WG0|FOfQ^sqG zoxzl5$ZDo@@9oyS*ZKNm8X?4bl}ggb1^^%Is;F10xYy*GuX2a>`0Sf2syn1}nSk(K zsBr<;V>nTs=}1Ezg77b98lg4_Wau7I{BlV@%*qX#!*X%)xh1(1ic*pcUTJc%l4_Yv zoYy7&8X7yND7;8FmnZ%1WfOiN5oGz)7T!)I=~Grbt@tHO!O88fCG{rKShoDQ!x-gj z)vdAoDtxQxP#0a7LEhld+mWdsnbeL2*^v+qPLIE3#WB5Rboiv`BRJvUu+qbStfsbZ zftHKz@SlobxHOxAyEIHRAI3RJgkAvh2da?#UUFI-B!-YzPOl$sh3|G;?{;n@RZicx zzvVG&FLCDfxpwR2sjnOQ((?jJu%y1eJ}oWn=g+^Z;rs*zTo-#Y6-I-&!Cmd;d!WeZ zaI;^7q&Nr#rH@`Ngk8hJM8U2YpIDHkJ*N0&=U2*OQYzSz+p2)M;SguSEENDfpLwf` zO4IS3ot;Zknt}Vv9)9=ZzIVn$Nt{xlO3KQmsukVKUy4*KM5to4YQO0Izzr(eY(f)& zgNG-CY^5s}Ds_>OLH+2BAa55sI#m1;phEWBaULDAqrzOd&iG$0KxlEFTF1{a4Msq; zdLL`(@%I~Ho&uGCn2pWR&0)*K{mr5EY~}Wpx;4IiGGD6o+0LZP`5veJ)<~oCiGb|> zT+OgvnTFn-Ao=McH5JwQ;gZLnRx;|>isAfhS@YRikUuXh!!qV6-PCB=SQrgA%LUb=mTwfVg9A5q~#*5i6STQcq# z+J7XT+1Rgf=p%f?1+UBb{Fe?ykK0v3FMd6INky- zzYZC!K0Z{dn7YT@1eTJ__0f7Di!hIhuA753ujcS;D7}H5)4IA3MVX#uxpj3{(=GQ^ zGP!6lFQ0q;*(ogLgPgwiI3E=y#0c)f=vLoNp@ z;`Jd-fl8VJglL7O&GpNEcrPCu&nA`q9XNrQckS!3w7#a-*F*ZE$e()w4Qn-EI_lZo z-SxN{&>kDGv$NY?KRY|C{P}?hEQmWvW;0@m20X5PgeXoH)o|F%U0M9I;*o^%8VeRG zM1M=t2Ue5@^>3=v_e$&gl2Bw&Lg}I-fgbiVLJNYZDXfv;6bq%;U!=jw0lFSMLVMBaAj zfD)53i+um^a4M_0Qt2y>F!eG$;VrH_78D2|Qfyn{Oam^&N>^}VVj{5UlMz8A-x4im zkNaCuLbuA=+RNsfgG?Nq&!0yZoR*3|y$^fK*{&?M34NY~S7$n&16UJ&ey{mj%IEe^ zFTr%#tmfax4Q#h_0*!cFTdK$X6f*eZeR-?ouSb1T5$K*VDc z@~GfTJ&aM-(p9bAWmNEn2n&NC2=J&@4aDLkTf}8W2nJ zn*Xc73VHO$ru)kmZBulI|C$0jB$x!+WU=rz4GT>AC<-@&?P7cQOEoj)6TP1r+CFb;%xoeYJW|zu0(XpYW zr)>EyMowuytEYP4*LYirx8Wb6Rj2tsXt7`j{9avv#5 zpju<4`Fmc>SD?)0;vmIqeRFdhJrcQ{;TI69$aKx$To-evgXQYS#ZNmsO7Y~-Y;KLp+YKPvHVK>J>=OhwD%&VkR!PuKk@Si2GMQvkC_1h9P@ z8B@vqtO6Hj*U5dbCyG8(JFobij=jF2ZfLl`U$NsU9Cs?2p+toPp*aBDWT;4LR zVlUB23JvxZ`Pn(gtLTzwKG5=IuFdk7677Myq;H3DrdDeJG*2HiaQRx3%e0Z1lij84 zn11lRX2vU|7Q)(&NWYx5ramkNcnrzNRg;MGOuO0_Q(hXZMcS=aGoT6p-WgM9^}< zUyz9I9?{MAi2%H;v-&+V2n1r%DxWJu?gQ9%XEZoU=>q9_B_(e(SM3KASi^bGRU{-N zOyIDVjd1*&R|4Mwov@iyR4&$RIG-_29sKnRp^00d_k4fuVt=kjTfjW8u+WYx8QUHX zYU1}0>eU0gf0N+&^zOXE`YX#0QB^%hW3M(@`6D5#)F zDP7XtB@E?IQlcQ;AzhNvC@l?=Lr8;kcQ?{VcXxOH4|;!h-T(L9kL7YLac16k-gC}# zo@ej5Y70(v{A|D-B5be_fOC1lf1BvMi311nWRSZ4 znw|K&yK)$fKPbbkI`jugaJ;c?4?L|KP!o2~WrP4T4r*D{CueXX&TGrUd-hKJEKNNx zp7x)^gFENooF#xvFEVjX>GKWo#AuWqRlW(Lqx2SMA!Rz@zh6LV-u25*`^W0}3wTLY zk;C2^e6tm`a9Q885u>TBVEF`!&4Z8T%Yw4fvf<)>c}?5d6<==MPj~t1v)SfI&LjBE z!?|Y89;q6AjWT(LB%Pd_LW2^J`m-2GvmLtontW5;ee*TW$NcG>z*M$(RZ5~CH9b)j zp4d(ne|(dM0!?Q~XEZk+<}xnf_$_gGwKTZIYCN1K0Z&glGu1r$&Li7*k@()I-Z63Q zs`vY|r9|J`%gQe;=#zr|sIhVlxIQWkZZ|*-S=YcZgFuVvFBXV9xa9#Rhod{zSua?| zd$V<5)$74^Ds4*I+S*oDR)EIQ+W7B}o7-()0<=m#6?Hfg0_po!*`6)ZnZ(W&hkkf) zW{x_{@WhnUQh^HtmSG^;-YL4=A-m}nx^yCVV_?3`QTNfl_qT*k9raW}mXpZC*)$9c zup2n-v@>r_$Pxth*5AOf+4Yu=-inp}5QxPfr}T=q9JFaL5O69BKo7@Vc*6#neXA%* zd@dUPwz0-g*Tvoim(+_I_Xo3#Tq>pUhwz+V#HTh@BAxC>vx99DVUJ68KBn%PMF^=sEnZ-c zd|sQOh0?_Li#jc=RJMCDepR9m(-Y(fKDX-U(vmx3%x+;#Dzg0+U*X+@qr z)x~+)%4I5Tszvgny_;ih$?cbop{g^4ersCrqR_frV$Qsjmtl&)$IC_2#jDe#q{6=H zQanT6a-m*|5x*p?2#O}9DA`W=+d?wp1q{)JIH4>97w)>(bxOUK!7o64qF&-Qc2Hhz zuh-xk@5nKJ1Kr$mXlmT`tIzQYO+gXWEDm%<=11tw*SP+3LO`Iw#?QvYAjXv9yws82 zNr+7asS!KgshC@R7yUf&Jq;nJ$ww8H*cSUYJ~|+m6GrOl?L9ffoZUY*hzJh{NlZ*a zLa&9#_Q@^;694Exo$Lm8hlRYu`W8D1*hU$OGcov`=-@sSV17qxe=tEWMuqw8f(x3x zcfH{G=w>`F0{3;mY)pM$IV#8y?n29ViG0}Y!SNlpP zF`CQ}vVbhL{G zDTlYWbv3^;!06_gq&+lQQG`uPt&-9??mly7b~X2~tyf7MtkiCLXt6)talFfAIlDdZswgGp8<7DAK06y51*X3Z zffxi=;F}#&*v;d!>d8NQ+P|tb)$FQrUPBLe{STx97H<{v=n6hS4P#u0FV662sotrr z1#qJ%bZ}vCL$EUD zd!*ihzO|{-$4x+-7|WZb^!e6kcCVDH;?=Ng1;w<3)Wf{uoY1G2jNixix;9RgF2CI5 z86Q7TbIzWV3^CJbcQu6W(tUUM@Hj&8Ac31HPH~RMx~yhXj@jmRSL~?-sc5E1$#hV9Y?RqPPjFEyGf@EQcA&uD9LaHJ+)z24~>LH@%i9$#SYXFUF(p5wqn;Sdl*uULs5FVXwJw` zAijJsq(!mNz<>AWGicQ;&w%Y|b?_*?p^d07%KOH(6{_292ak`fYrzW{VS3@s8`OW$ zf~VIxn^ITE7!C`5zdl6g{%EBYDP2#QFkx3Udz$T0`Jr&| zq)V35q@~T}(ne~FRdwgobVqDaGhLjH6m~t-jKS2c4XUdXRMj?aNh*fEVDJZ|&4z`3`O*z~( zD-9f9KHmODi?7$`&r_ovS~<=Sp?;bTH)*D_V(s4PG?Ytn`mW~1xT_#|l4JT4yI+4+ z{gIxQwtO;>w?w(nTe z*xsHU$uE3t{KwoZ73m@s74DN|N1*wCf=2u@pbgZN6V-O~&W}%bQHlB9KKb$EN9{p7 z!FH5X^82j!G{;VLHpxn0QNehm(x5kl1ACqw6y61KaUwRNyVPdQ8^Pma##P2??Tv)> ze?U>3TWZubY24)%DjQP46Cc`#W4F$@M^dH3qO!-}SLdvIy=! zbSAX2OSvJESOt~!HJV-nq0Sv$x~NoQLej=S;Ga}_u#4P{+xXXEa5KL-sebVVH)Y~5 zPcId1#AMvTT2c|*ElQ<)PH2DXirTm#1?<*+I`#sD$Zej93s#)J@!dPVb$@NIN8erD zJ&Z^~O8P9))X`Raxnu7W;jF@;-huKZ=A^F#)hg5lVey?ARr_iGQG(RdrO~-KY*H*j zvjLye@E1UQuBEl-)Z>Ri&I=_9;3`lq(!C!MLnr?J_8Nxw)`6nSOf9WYzCt3n)EbsQ42K zsJsd(CF&YdLFyGoKLg^_tVWpdlK}%DbvO-5H+_oelGySiwY{;@FG%!Gb3lPQc?S3! z_-Gc(4UM$SM;OlktRdc<3^K!mxg(DVU2 z3_nzU6e9$*oZj2E4OEMj<1x$X(d%B^~ zXpB9v=~cx>*EXbjFU~?uMo|*{-^NyT1s#07KQKTTRXwT0m6IFgs?VN}k3ACG-g;JS zYlR2{Hv6mAtz4pNeYH|Q-3t|bkO1GLqyr-+ESIY$tmxT!uxKB6dUsdmzZ?4B>gYMI z36@2pT;a5i_{WD=^7mSc_2@XP*yi6cna z7x~!O969#Rpu#64pLq3Sszu?}==(mn9?=)}JQ<#sqJ;Zh-Y&#yFAa@QZm_-v#~N3c+-8MR<1r67gn zqTmEeA~{gkY()#7AmS{()P?zZ^sA}ko;^3@K~s7Y7oQh_6Ruj_b4cQhbmYiaO_~*1 zVmoNpk^Ks@Rb{cvUeB)1LQ=7H$wtn>W$bdKilqDj(nW0zb$fq*2xjC&4;YeZ8MdAP}o#634?^Jb(CTtfXx-^8F;6K%JdtR*a8(M~=qZF*Lt^1C;p zMrC8r*XQ;-qzMT??mi_cD34??1aIntpsw6hv@R2^h|IE@8U=NCbw|W?t-57e7VLo% z;h!t2tw54*TsFa6iu-u_1x+X`*A?_h-1uEul3KM>?%m#=UGf>DCb}Wu3?0z8+Qj{e z7n>E|NvQKs7L`r)tR8!z=kziy-u*ys?H09-X>W|dRfBoO1aIW=c9WO{`^{&t+!te+gT%vX{HTP0_|7s?C+J zL#`r;HLOaaGPsqFOVz10&Zf4oKY28YUomRb>fi>>q0;4f-=rf$zKW485A*t&_0x@d zW4AnW-nzydIdIyEp}^Z2ShAvFS5*B$y7!0uc|v<=52kPAd>D}D0>sQjLhA}L=+i7A^ZLU;Qp-r)!InxcDwMT&jb^C^Qdi!etzQx)@ z92vOA_2)`F&4xYp92((+{hlBB#9Qb}l_ z`0$009CHpY)go^?wpZK;a0^Lu)PzqayQksCJ8l7F)i&1Ek)J18&ujHnen@{gmm3r8 zv#pfh7?d$vQLu<7a*_%eCA&C?w-}8&Ud4O~HO6DRLiFKrxFte$soQ6T3x%dgPH4mj!sv|YAX?x*x5eey3ABG(|+VpHANrz0uKK-?wJ@G1h{>}Vqj(hQ*1ib@lecu$Dw z@k-E3hureeBBVX(*X777(Z%Po+>ur_cqQqt*Mfr#=syj#c8T)1k|tH`XDH|N?#5T~ z{G_BHdb%_i+wWNxrh?yaL%&^ekB}sFNOe3uG_Q}> zwKTjYX0*z<#Pr5z?e;1jkKXl*!FMS66JZ)d{~udJHY~a4=@!o!ZMrq;_xhxZ10;;c zL@{RKGu+mMUN~HFj##FPpZ(Sz+L=L(wo1gr8^_|W773K5z&`A+u=SlSw}zY{i-c1P zRxQVq>&5l5^F<{1Dw1h6fmsxc+N zxoTE#6RO3=YM!3+HKh6JzXnbYxyiX|Eh(nt;_cpToubJ_ALuFvbWPWDky_$Mbe$~R zRt@juc(yGT6~~_-p$BNubTi-%k^GidXgH)fFcolbO+8Tj{oX9lVckHwA#JzJ8ZI32 z30qC)0OTfXaVIsw6(eP5DqrT3g&-PLHdT2Yb^=STY6cKKrR=xXNq1!)#6ASBI!s>krn_W8$)^N&?6?buA0lwS-2f8=YW%iDBp zU0s`RwNQ2K#{WwHO))QC2&JBo)J7G3x}JzLXH8w}Hn)bFknSlS&+U#%3Fuz+kAJd! zi!Gkx>?n6Kb|MRVVyoF4NIlc8e3SpW2QR2SK0bbYe7waM&DYmAIw~q(qsD%%F9C2i zM-D~<&s5DV%)-q=FO5&WD|)9X@CKBSCspy+jcqWTO6^12J8bb8MDeW0%9LHlDefnw zXd>7aQWsmsH#xy@S8}txy}FsMl^@$<*DGl#FIZ@Z4x+=$tIg-S_!Ot(!HM$Vo0Jlo zP5lJRO!ngFz)$E|;&tncYkyq|^tiI@SF#q!l6Kwq_%f^>5DusxH0@)U9+hKetUBZOeOZ@Mmb^;KkiJRu25fn1fsH$R;iK%;i*7f+NJ4jTgY;=WIH zC0dIZYH!9u?)@M|R2PZ#H&r_`gWn3VWI$AHtx=lg-BT$q7hjvxk;JbAiEkU>kp!QL zCi&^SS7g*y-DD}}k3c>ngLV|%(rbEKv3h&fS3p-+2#`q&Oy^@09Ma{{qCvK(^>u0s+pMym<`h z5VxEtUIC5fC|%sth_%jzT_zPEe9rQ--U8GmZ^i(IG=)+%wt6z_7Z%{=F8PIv#o}S^H&zVq#c+P^Hq>Fr&7}?B$idX+@Q=p$@@Euv9|SHxk3K4tBp2IyC^q zi&<0*Y2rX*%Y&M4rdIxJZf%D8qeNIZtqR80TE_E(Z)`o3uyv@b1`ZQ8it7x%$1Bk( zX;-`Y;nbI`Ai=2SJ-c{d&UO%~pRT{&V16=$lL@U38bz+pT8FgAeEwWCV^IKH1b&NO zDX6GqE9UG~tr71=yr7bP3wUdK`Xi$iIuyL}9eLr*FmwPsyz@ghMd<;U5dEFe{!SwA z3%#l1m9kAI^I|!#(3zxTE;pZ5=+UDUPoj*Vo*w_5pLEI0X7i6FVU<*Ff|+ZvI+ z4j6IE&7WF$uUfjCpK^Zv67NR!qn>sgCzZvL_8ndKdp@vV>XzNvkFB`nL=9gIA#L=_ zb%V8(g!4x$fneyJIaRxTzJ#E$R|?CFrT4b>>z}`6+H?;dH9>vdDQ_Kz4=d$oio7-T(gP8ow_dr$O7Md1K;QKZQkGS(@(!vCJgFs zF2*i!?|$CbqZT%%6)Jd4gm4Du%kpE~s!pvz-eFwa)V9@C?VMgsn--x4gZg|fN_tBA zOp4jWz0Z4k%m7#btLi%&Yr^<5A01-nZPvsW7QHdRe*vJ?Lu-_nT|hX{{Vst20Soo(>ZC?GGqdXM0I3IuBiUVp#Pm*Bnr-ug?$qoUc_?RRPytwZ3k| zYtSBu*QZCgtGhERcP#aUUBI9;|0W)Mmnf5pIq`zNC$vl8WLzopin#-kUm2yxh1NWR+O> zO+|%b=jXb95@0iCW`B74m5Pgm2`}#&l%2wJr9Mm(_=~z{Z@!kB8yOkV(9#0a1OUE+ zAMAj(9HoMKAO_jMo&5cV0h?K?UL9C4OqOlM8YW&G56c>7`a*Xrg)@i2{Y&L34nH6Z zqY)IGyTMI#+RSEDD}Nm?NKWo)PV_-u{sjnqV_Rc+YD!vK4eochfTjO@CgcVvTOiA* zQO(P67~G2a_3Iaih$Twd1qFhRhx!0hufm-k8cG>4ah_>?Z881YiF~(#5%M+gHkDUE z;nv->J>GoiFD^ervhD<@v?7)ALieragzRpW?G=i2YC#!e(HGTqR$u`O-gS1uL@Pge zoXV~eC6K$Vl0UYRber|wgWCo`g%+y8y+2s~9GHtV2Qb&aeQjqnny(>slmp~Nz%#GH z+uNIin!>C0WK@lS%WS;()9=|j=V(SXE&!APe6ymobbGGh&YwDQ-&XXKg2G4?quSxo z(eK~CjoYGu=SM|K3K{7_CbPJSi3v8NYN=iaDn6uFmD_ys81R&X53mDP`k;H$g*pf_ z?eQHfC`Ukw}-F7Uwv>~@epDeBp$oXAL5p%LXB*!<$`W*<_j`K zJje@=jIA$0fV`L&m2nKh*J`gaJ~!|OD1FmLR|FfDt!Ge+{SVEGTy)qt5py2`KpENy zd>SWG5D@K5A$%e^zEj(2^~0S4vC(7!p--ppZWTJ$_<5maG{SF?HU`vg_uvGmv1sOG zJvVD-OM2$0df!XP0d^-76pjuchpQ@s8?{K8VRC&u`8HE!v(~D6aD8#K;r`US8OQ(t6{Jz;6lw4VXpWNpn4Bct zT^n*8VLbH?;XAx1aDgMqi#=%DFvD)uTH+G+qXbSp%MJSC@vyK)1_rcQ zaMvRM_XmEaqX$?u+aE)i1_ZorgUKqN4>N@I9&kKfg#~<#s@LG5{Lr|@<07BW$};__ z7dt1x`HxA7mdO^Y3b5D$+kjcInOQN)qh17Y(IBVEthess570Tnf9Ph1t`(M99(KNk z`32Z_sUu@7n$z1Ly3A&aY5b6mA!c-SdACV$SKF7Nz@14?oDfNdeQ5k>U$f(1B?IGr z9>-8l6C1iixw06_9`ZPXB%nsKR!4j6rxPCIMUnDDXIp8x^KI4-OY$qIE8D8o(q8Cs z65rssK2^3Gn56oE;{;D?`v^NgG*8jyh{LjPPkp!Tjgu4a8J&cL#8XjbHEA_f)nF3A z+l#fN5{zPBFWADcte}RXBA5AO>AkoN{Jy`ZXZtLaeasW6c4lfU!AUVb=24w)FSQ%2 z-vvbFUWkUbump_UHqY|nlpPYDmJY}wILP`5Dvp8J&W~$WYSCN0(RGW8_{ylYQ$&}v zLEcjT1ukh44hbolh2@!&&oky(7PE`$u*9#oIbS-?ak(-Vk2+V%iFb>i`Le~ibeuBCb-|EQEIgvW%8q!jFmPHX45fVEup0#kX6k`{n| z86k?+4YIj=ESNA%a+c_Gc3^444(~OiZ>axeyE|QF!;(L%R2BUo-tgw~1n6_@STlgQ zq_*}NBv?!!V`OCP?eCuh>I04B&BajhwdCKD$x08C%Py`l?gv@fM=$Cv_bfWBas>|* zhRl%~M~6MmvgJ5wT>$E$3i4~TO_?M5H6q>l(JR0+*AZXny}U7_+4r|dJcB>$Y+R&E zrCUcoW#^A6-qmuT5-s^EBV+74R{0CUO}iyfv{Z4=Zo>$U1?vJ&gRhkVr3-4EE1!Q9 zE2wr}u)RFz9AvI$J4%n%qfp)ETT1ffD8vubW` zKAUq-qA~+%F|ap5Z7~442oRH^qN4J^cb_cvw?=wocIa_8Wmu4j>q4umiLlS0aJ9>j&yjM#9Rem#)95*9@cc z?sp$o8HhC{C8havB`Xx_47M87F}u&52}fyZX|K&<^atCr9zA-5P$LdOl4vQ_S_Bl9 zS12IoydM<_@G&x8&%Y-|zy3Cw*AFFUHQM@}XkP&vwMV>>dtwKO>ngH}@8DY`ECmwQs1yh1@S4&YfN(u&}q zC<(+_aj6w5pJC99{&*crV?Q<`;t0qP?d|O+ckCm&N_AQuTlfg8J+hdsok;$wBP!Yk zLf^Wc<>iB++P;NrUsNJpSpf)2%RmZrn_VpRbJMp+(>BE+8idxXPAoGljt7gPb+bk7 z#6(eWIJ8mip~rg;!Zl#X18(uxZw-LMImiZTslGg`Fi|M*{#>P|m<4d5X-yr}b$jv1 zQR||SfiYZM{46zudHT}A?*-KtH`NsBG{VV4s^vr`8Son;b2(ofh3FbU5e{Ca{D&XB z{>Kj@lM*=v#1<9xvef#Y9@`O-w)SfLn3txD+#N5{TWIz^I5^mj01AxW?rz;0$(J}d z1zHVmpn_zJ4YVgORb~KwOVnOg+uxV6lm2smBCkJfpoOWus;##53{ne zfW~yl&EKSKvaL_(iJ8VI$PE}Zsy~9uOqBS-$>e}SukZKo)Qb0NYR*9C3g*1`Gn{IH z<({_rdhCH}m9!@iAGi*0^jjpyHKAdEf9B`NJQUaiMFyY_N{?#EW{R6{P-D!iVS^lp z4o5@o+{|^hc1(==XMlrK7FpH;0quBD(*4OpbbX^>5gg%S*+ip(I6Sp@*z(OBZ8cKF zEp+4E@GI4Bmowx@kA9nV%!T{Nfmds^!I2ABN;7q}wACZ(?soyIBa<>-;A1osB26{? zgv8}NkVR~dv+}M2f(}?uX#vGzljoBP^Qm&Zj^Oa{aNtK|ebfk6EFbWjGAMBbyq$uA z!fvK8EZOR8cLtbAl}l3rsnlAz`4lE5rY2Y<_2H$Oc`7BVH)nI1hU37Y>-=CTghVhg zF|iLdR5BgB9hjWa)OmyV+Jj(FijWo{+=pY$AG4a%XY(s4CO?%Yd=SMB|S z8?t_;b%CXwGyBF(JU~@bjQ>ne0@|V$q%=@93LBZbrYk#Vv?CMh!-TWaa$)qH04W z-m=J~N2~WrpTw;a5Dh+qz>k0=O!HFU80bU!k3)}=G04Si?d^H_Xd@+oRF^1G{V%mf zU)ldUP~yK?GMTlU%Gb+;9sy0u9c-DX2^8?SIFNDZh48P+jG;r2_*;0T(wItd6ECK) zRHt1`6qfT?$75U_OpK>GXQE^QEE_d9M56OgBmAz3zF8`p+eePZ zG|?o%Fd-qeZR~(eMAUmD>!VZXZ_!94n^>#e^bPQds_Ak?0q+E_w%Lo6 z`P^?^?m%|*^|8t#TK(%8RztH==^lr3GsHJ*umDYp`R6|^dU4>2sA7D{3jj-SKc5HU zj|ZN?y#a*S5^R52hCa=)-hTl6MRI#1hpF_m=C|E(SJfUk#)9fJ+uBIiAnGW)oQ0ZT;@TA|+7yON zyrcW8u~}2AF4FlbMHfj70AWC(Yq_3`fc3h59~xcPlYN0*-)8UO+tk6Bh=}2VfqC6P zX{w`Q8C~t_vsq^?r;T(lrfS>*PaMs9-c|(LGR0yP7H7T2TcsSVPI669Q12KGTLnb9k zTEavh#Y;El8c$zT4{VJ#=`=6Q{uh5N*p2{sVEWnsa6`&fMk_yBBjqtUAGf!TkI!(@ z$l`AYt8c&nie*_C@Qymj&nod9V$$!xNbFCY%oQg;)j&fRV(`K^@{(%J0jRA;PE;pf z(v!lZ9m1~-#2MWrp45ED@6Da2xzDMl!3-NTFD*`3(Rq)RLEj3yJ#e}{eE{)*ut~3B zUd@ON?L}doos~9*;#q+!&Nnw$3LBpxkAQUt-VTB6v$uQ(H7*vYaqoY=psA2~A*ogv zTpFb}ARxbaT!N*>f8Y7+6C$7#-!3Z3vPztc8*nyHZC@ipgEU}?4ZaH9+X(VlJQSx0 z87kxfK?l&JL`sFO3hyU5aCiyv%;{%fh4NHqNQE$9R5FOUnz(q3`ebJf{(Jzwr%++Q z4{=t592Sp;(_VP(RO&(IFE`G&VGxu=fs)oK>Q7n>Pzf?!Up9OsD|=6;*)#@s@xg#+ zj83r57>d{iga^1}AYRmW?M9L@$>dlo#G8Hj8!tdd4`KxPgvIMX{<+aVb`CzGB50q4 z&RJsd4GroW5H>_bgA5dz>?xXA4%;#!Z&68wX6|M$8U&ql8d4!1Uju%Ks>JjO zB}yS8X)3l;p+(fN4~=N1uI(l;ac1XYM}(w&du33f>Ywp>X;S4DH4O*sbw3zBas&4R zBqy@4af>qtbO>p;MaeTni#(>!k(6Te&6;;7>dtFe0U!2K8(-0=Fj7fvwcWY=q~I4o zU)wU8iR&!XnY?}h@T(tw-k3F5#$=5@3#a@$uNVOOh0Ew}c>~L?@5-_`71c&}k)EM* zUW?2NnT|@pT-sB1@?FUQ14T;Cu2b5ke*zwTa+hvtM(d|a_TszE(?ga6twdE88(XjB z4L&{Ki^GM4uh_0z`vJ-{dOLgR?LTOdr%mhx(izYSDap22?5LQF_7L|a_6v5l&w)_# znM)}e?5D)HD`~OZpX!fq-=wmrr%7Y`QOt@WJ?QOLj>*RsD{wrWU6iQGzD4c8lD_x2 z_X_{=iB0FrJ?P1CV4i~b3D70{=f4ch#IC9P?@Z>3q^9b#R;92yv4k<{U@1mxk?D7>lP5ZB45JboImhhs?a>;@ixf!&o$q*}l^ zHhtAUP?Y(K`zB}VzGd0uXdTcQb(rDKe6@chy!k%wF(}1BE#@yrtXDE+t_aogz!Qa# z3==rX>9Wt@@ic~vaVYUA+T85Tsq;Brh{UjIX8B=!Z+UFbwNIYYrax4!Ry`$7A;whg zI-Ls_zl4&Zf!)g6Uj)o`^ayz3TuRRKke63bbdONoT^(JrMSVGMsApZASL_csFD-YO z{M1p~U_cT{-JegoB8N1|43dPaqh(DYU^a>tly8naOmwyQFuJ%%`#>!zgE@N2i9r$i zcSU-|&{o;lySn@T#9;G~#VhOCu649PJ#CV!GZG#DUd5dk<2)SnPGcn2RExM~deViK zfvlV9gI^2zBUlBmbt8J=6gcm}C#KY(j!KTIYG<`)!aL$&$)gk~oynhnL+xZi%z5JZ zJ@31Six1*HWsSsZw`E3fi4~vxR-+3IN=JvtWjhn+V2w(*bLp1Y979Ahi{AGpW3hTG2@6Ra&*hF`F60`1N*mr1@cD1!Eh{>5HrzpScY)gL?zf(tARm z{hL|i)6JAvnWx=L*F?U|NM56>N8;B+k5J?vCPxYs;(3*1GFjhw3-e+Lv$uQ8cc8<1 z0#B~X%8yRWqv4#rM877F)?Qjyy`?MLPlHL|YQ4ht{apkrQ(7g?>oqAmHWKwJigo7D z(CGU7Vd5YxRetGdal2t=YiA40W%9|t8&H!pGx)*Kr@#Kg>&eY-Yi$=uo*tq&aOKQo zvEu~CZQe>GRFfbgB6f&K_Dq%m zUE&d$|9b`uKZ@J$j(#e5&-6BnRPfrSzR+(7O&YO}JGl-L?IyH$t+yTpC7 zFvr%aH;F>M`6si7q}b69zIbn7PZwELi8CYrWEjLtu(Wlnm!BFQ_%(PEQ^4VX4(n5w z-*D>j3I#)hM5-J1mg+9qgF3PFCpP(L>8$8(=rgX&c%i4ftSKaZ`w|EP@Nw zO9|P?eFg9pS}_JpKksiT%_6Y3sK|o@?*(49u)w|6AW&Vef0_qgJk% zw|{hygL9c)3rF*?>m2*F5{77E{U9kz#nQ2r41ykX4xPj>bK4Dc*b;~H+b+Z83#k7X zGxjQtAOur0(UFOf?wkyafA}0$OfvMxD=W!bu;(f2IH)X)JiwP{A?%@5y*^7N>0T7! zOKcE+fTWs%TD*Bn&F`x4-oQVRB?jaGkTC6V|2flxk@_r zFt^V*rK}_s$DkMVJYjkJm@DipQWJ^*VgwlSf0+na-@^KB@#3)-Un7eyKqQ>kt9T&~ zz3BaR$L%pjCgt_>&DN+iN#60_c+MiCFW2^qM;2E>+4|{xQKJ3U&Wk;NB`UP}vQA7= zqn{SfK{G4MM>#8Tuh*kldv$WJAjjRh#fO1Ilx=7z+bj1kx{ttrx4f2th=9A{@%ECb zzjKYHbb{n!C4l(k?J_J1sVTX>#Sh@tzyn)e(rmS1<}|SWQO%17)4E0_Gb*-Png)X& z{T>V$-w^%|2#TS6M{g{rMOe|y+-C?PU&JIAmCmBaSezWVB$9IODY;VhhYB#mwO^|V z9C2qK4rVa5&wYg;GNsO9Hc7dBX?mua_(X*a@xh%`8FA_C2DN zc11)Y_H4=T^3JrUd;Q>y>4!xB@-=$R*jl$PdLIHB$EW-3m)KKrYDvUlF-s980InDE zz2Bc8^Y{sI4Jpg48WBY7-yvS;H3{o+=2FxJa9)exfLD-+eL~d(nIP2X=#omlF=c0c)*=VI>R1y@N zc)mG#<|;S%2M_!3&HS&d5B9S;_ta`^TF9mtF=~l(3D-Ho9EJW zFr(rr|978sCeuJm>*mi4KSXf*xj?M+je}=%6p>+#jN>>KN6V$CsOSJ#gD)L?;Ul&L z43;b7p+0WLoDLQi7I3#t)1&xDgXKxIXcpz?2cv?1WV!5*s73!LD|T!~;(lEOSNcp` zXuqTSqx}H{Nr<*6*7Dk5Y^LJ6rn=8;z4RPP2+?A*jjhRNrJM*T7r3sd?MZ2>ClvT5 z>;awyb3ISr+y{>i6I0V?PoEw;-BjCcZEkIy?ac`SY#S&UWaBvep}83uR00CCCxt)< z3yi$Kw=J&xj;4S49q1eQk9ydX+%7j3T6|ktTB?*7z`f>-0Nj+5le3R>=5q%TZ-T{G zzJ^IzT%sfeCTKUTag6*gQVIcF33Ryf(CiUGAm`2TDQ)uYy%$^cy&X)%Kg2K`rEx>n z_F^El+Usm^-nRzL>+WhN(qJtQsJ{dcmJC!Yu+^Vt?cQ(7Y}Wb!;juGb6^HyHPJP@Y`**;I{grlC+V>9Z8*r-d^+uEV z+z263z^W9v_e0Xrfj2BgQ~sLfrAFtm$f-&*cgxx@+3X&;gD&Z03z>a71_pf_L0D%` zEPHB73O+tQVU*D+bQ^SqN2uoA`;2!4|Kn%ge*E}{I?1J(KN4V7z+c_Le$aJS3q<8_ z?`qjD!nEouPZk=msCqwWaT*t}SHC0w1%EToZX0XYI~w(DhNoLiv+`~SN2!**m6ohY zoec4nYQ?I1RM4TrD;9K655m=!b{R15q9 z=lyf->lMgeAd9-7ZsY0xM+=awJio`Hqg=?w70_kE#nRed0{0fH`#_~I9S*J0Ze6a$ z5cT}?aFG1`73zb`6fxJe^LtcA(0EKmcg5|z+|I}zq1q<$UL79CnUkLW34jrBF7uQt z+#(qa$SYibFWoq%{P?R%Z&odEaAW>TifSgW>yGkO&?r+v_uPZ#!dGY!)U9c=@lhl> zZ*dd21UR|mX+sVi-V1ty5G>{D`yssy07ER)FQ1AB;VURA+5>BXCaHG5I!QUXA)sC_ zDJcQ#2b%Tu0iuUo`*X04VMgh z4VZBOV0a`o2REqw(KBqTg4Z57AlyO_ae!_El5A(nbw~Gm?yJWg*8jkmbJNl&K!nyU zGMlSUKxZp7|9VXMKXK+0z|u}vb^mKWSs$F7oJ4qn`too4(7>3(z0WZ^4NElAgXPZ1 z{GzS}P-*-Dvio|=x%!lp6wfDU766O|jjDip01f%eTvE1kfLcj(Jyj{0s09Enhznul z;?*|yZt@BWC+n#pL#cCaS3BTEFtgBkGA^rB}-5bJ&ejP8HFc$PX7FkCfc2 z-pU94qKAOl@O;4x@o-1FA%dWo-q)YPsimd1fOk4R_>(P#eNTcaZfOUdSTBTg&CjK9Acn#>wZ;X9=ECL*Th4SL9LY^$=B8HjnTDb5^| z-z&d=Zv{r9#IXO8o(lp=x}P-iA3Pu9LRi)TRXsZ}0CJcht~#u^L<}lSI7!C4x?&oU+}#u;IkmLvn`0K{d`9~nMrO=VCvM* z%KisU7GhQfN2h3LFk%NN6==EwzndDH$^S)_(=aC}Fy_EvF(EAj-?IPIkub)Rig@Mc36B#k@I-y;2Y zO7tTD^(%PGi-0!ZKx3#?42Z1VZ#`cV>YQ3ZoBa)j=oA5O@LbW zE`%iRa#6(Fr2(TEgy5%O&weF^D43Ns*h7G`vquAYbFdWPA;0`kwfYP*~OR-m%^ zUz+SUyb=S1i4!uF09Q9vT14kGdLE;Wa7G!9&OMQbFig#=XAK-1^QUQ*sO6SkTe?e zFK%3o(p&PUZ(uH4X*QnJGDxAkKra-|3tF z_%H9dyBurat&jlSNvTIDnxzP)`ykWg>Es`(uU+T5&7^gw1bhIMjSB`RL`X;|3Q2ggqnh)cmxi>ofp$USFY^yz zoxu8pkawPwi;GFQun|s6?xSPGh<%EeI=F82?z9MSy?prF=sjQ`ndtqF5FCXLn`9vE0MfLE82Vhbb^5#E_X49HRu32f)y$5Du0I2&dWm;1SY+6SlUtK*a22 z>{|LJZplW^&3!iCN|yWu{tR7QDemF({jS zaxWSM(K9WrmDIqnZkEWEjm7dgM7yz&8N&zl9=t($GB_x>W!K6gZL~cN=W{&#_UKvt z?WJj?WShVRkU{#lErL_Ju2@0kl=SSt)&IG9T;DG7<+-)I@2t@(v4Y)+dd)(ma0`J1 zD@Jyapy~cA%%|-J*M;1|#8iFn{0|mZzCFuRJGz3hT@wKpWt1r77gTAPnV`1;aKye~ zRH?j_8L+EKh7x+eJ_w%KRMFIY$1O2BGGabgKa<@51Uwd`QHF!%6>Qks%<{}48DXTV z*?iND^$cItk;`BvB3Htkk6ykv?`bGu7)>}xmDFL9t>Cmxfj~*a^$R7>;H$tHi@VKM z&dYIq163%8AR>80M!V=x2P?(`dBhK|P%j!$-O_mU@B~Z%N?)-Q3VGZo_@uJ`lQ_m= zOc6$k<+a-ciiT3#4LM6EQvAQY8emt#(E~ZAurXdz&HtM>_H+=1KpK#yUHuK(oo>My zDa(H%v0@Xn~I>sn;Hdg9bbT%q-O@^0wSz<$ujjt zFQMrBxTlmb^rrfIJa6w&xB6n&Z^mlkqsZ0Z9LBg{i0*`-mJs7nzx!+%E`T=Td^5N`}zlbhEr&t&He2fp!e@HkBwoCO%sMgFq; zN9XxBxCQpUuk$CO2T4ijIKoKDcl{&3Hd)kS+&OLG%yzg=D81&JR@pS1OvT#zy0B6} z0pJ-q>WK#7|D`VgpwW!}$sc_F+SXK`hAGsh?8I8$*-6gqi*lthnS{h|!UO`uXCesC zdkKcaUyK{B|9_o*bx<5j*Y`$l1WnKY!GZ-?f;$8W5;Q@B6JU|W-8Dd9aa|n3V!=XK zEVzUaEJ*Oh-2w~27kg)O?|uGws=li4eW$i+s%E>-bf4}y{X5cqh{kct(>3r7Mf~hs zGDL(0o;b)z8(CaT_J29_EVzEh1VH+K-F{f&bQW0RESz1>NMk}F$<}CPrUBD>@*Z^qk)!uQU zyHuIJ9i}=F;IY^+X7MU25*8huCTa#ry-m^aI#OFshMi%u>#Jo_4u&8-h6 zb{SFZvQ(x_6yYmXXSW`$a=sM)I|l%0_dpk}vtLnq_m!cj|Gu}Wt*e2-uWDA}${0S! zaM_OPmD>%{HQyoDExDN1-!2)?MN)H;h0HF(bwe5MavI72u6^JNTv)P$PZsY?X}I~L z>-g_Gao^wH$F-*>rR0D4LMK%wAvr!hIUd*wk?!#En5OY~V9u-xr)oDlUcQkZLxvS3 zz;!z%$kG+?$+Y@=A-4K!em&fDvAnoxqZk|$I9Nm+Wr3^lCg4)g!S}fc2L{HZ;g`ye zz*_48U;YrqOSqLqS%Go(DW)?y^Vh@HCLlMl**kh>vimMbUf@TSp&xM2wXV@sczNCd z`^{B(Vk!4e(?2Xbz3QOKYG9eed`~7gu&XLGw=5)-Q(oYN_T2Xv;84>KiETZK?Ngzi z%lV9u6SvdMKUx2yum{pF>%u+jiSF6Uy71TSAUbvW9Phpm zi5+40JPpBxL}15PQLHw?UgaJD9)Mb0Wu9?NyQk~Lr>CBWb&r@kpDcDiWSE=tv3<)~ zOXZC2HhF56nAX`ceJKAq2t`AVhY; zW1i&=^I;1DlSQ1lugyqbEiXGcGPwuaP*D5#DjdG@o#!8Y?zb<=Wmv!E{Li?r>b7=L z?WEtqk26I6*4K`KrK+M%9=1V0grc8_WPr zNvi{}(u%CPe*mT<_19q;o~t6BxeA9}(X-KrC8WYS>_*eY>+-eD={;hiL*S^nx0R^P zW$YIEV3xIftdqe7@bCgCSz|r>d|vbwtr$0popfQxD=A=TZgUT6XX1n)KCf_3q>qKg zJVuYY5~?dN$cwxf9NtP?|1=s&?EDuZi1F6<3MjUnGVkwO#=_h^c^Kp(24@}wGDFxh zuYa`1vIFLqKrc8Gk+i4Sb51rxmWZ=j%ppL+5EXPX5*&!&J>#5Xuvf;F*=*edz`m3u#oU< zhDTNRk2227-FZ=1uch^7esX+@0~QtA58hkTG!zGR9ew@EtKmmVb^0(%b;jd3EL|%# zEl5(XhQG{T8SwKgMBlK0Y3j&;Vd4B+jhy5BSweo#8TeWGS#Q+Xy^}2}Y`pSz zd2xUbW9+9Sqe>I*ICp^?OU|apAwSR+UP!adW`(Cw+;fa{h%xhES^7>2bezh_9F`g*Hg9L9faYsY)M)3A?(e4Gru8FbwJV*_Q3W==$0Ujot6k}1M8 zFE5T86FFvKgMM9C>ro4&qRKJ^@S8>MOkEFsXahezOqIpd;?BF9S*o4b;R#If&8fdk zeU>mOWXio&;byI;`KGb45n^J(t%g%?@Q}Q`vt+b=e6DzR)YYb;QFLr}>sh&aF&}OR zQ$$k8seyF3r{goqUv4(qEy#244Ai{ZZNy&pm!kQLaljw;MK&$r@-PGNsLQq~M8|qx zr!fH`C4gA(S{OjX@_FJl`7;2i1pX&I?Zz%F2c5Wzd*fos*=YZlM16{ zPU;R(tL#xg<`R}&yz^GnzWuK>7H!=jB?)J|885^3hDf?Ir2Bs5qa(S}norG2{UgMM z-#$#7q$=Zhd4_<+l-URfQ(z$-R_3?q85JogP>qi_Ri&k0rf6I8rA0I68O@t*a2Ge$ zn8v@(4PUs=#M~%JLiRNUCt=xTv-A#>x;W!s8!6xI*Pmo33Kby_4<(pFWF7)h7f}|8 z?bh~o=!g3|6X|+D0z$jGsg8T67oA_Mq{EfTn3FGFbBF$5yib4ghJ=8~=h_}O>jogX zuAefmBqnt&C?w9^Ev3iy;og~I0kE$nM7=7D69_W+c`sf%DU-4*ySG(1H+XrXy4R8Z zpPq*Vf_jO3WQ!hCXD2ZdNr%tc^HREoJZK(wxXWWx{~x1Wy+Lfh|sV^Q#bxlV>yEGxbtSYCJ6ly8W}i!A(j?nxNf~AkX?A( zc_gH^;`CTIA^GL;OQgBNs7b^UefGi)qT7;>BX`1T$hq2X0o1==pTOR`&!0^F<=#Bl zG9kNGj$LZCDUmY$BR&(%2S4QgdGZK&LW~as{%nhofrpQdx zB3_P9@K13Xp!nTc6@XY^as>Dx)NBq5T;Bf0pd^E`dWj7Z(&j?SH%ZFf-?<$MHj4oQW~1M z4YJTMgisL5_)0NN1ktSxeXEqWFYj?9(GfT<+5BsvQXy%~WJk3~2TonU8-z znJ}i#_FnSHN@H``oUW@GHQ|3AU?EgawY=nqJLR;{950%#lJ;x3iIBTeh{9_y$TMuV|jELKKoYnbwuXSS~(Ov*yl#4L$lRaMmTE#O~NC; zd+|`V{3+kM2x3(QjyG+M+Yx~|9)q0{wjvub@4Xv!;UN$FvKO|=yNpC7N*uV*4pNP> zqGhzuYUO7VxbNaO&Wz^qZFWS*CtrE^ROtekv~(oFUWr87^CG_3k#9l`k_x71IUzqf zDj272^|$j9-+$a7bPU_ZaiRVT9!+iY%R<-ts$42PkOxuNsjhFk>3H{$+|v8W`o8?L z!}I6_ld8Vsw>AZ8JR9r2LG$m3wB~7XZhuvymw^Tq7fvR;_IJHn!@wux?i$bCVm@#2--CC^8ZBcIqQr^@>Ocschegs{6N}jODks3U0K{?bOzG z{w|1p^9^0o=0IN(5g;*Bx?bQjPVVRCaWuD<08E*w#{`a_CIq<)_})y}k}-S*J`Nq* zexqPbZU_9h7kVBVOeF*{VM`JZr90Q7#q-)}FKS)(DKV<9%F4>DvS-M#q_Jzir)pz6 z_{ozi_@rl3W#pj1G3aJ36Z0#TTtDX~v!yW?hLhT)y3wi72MjHHE&-I`=-_;OtEhnb zPiRq^*DdGHVVobWuAy9ymhOtHHkvgVMu+Ci=`|Ft1dpwpi?thHK^LT3IdkF5)Woe~ z!c}G+o{$ToLculOV;}yByo(?$4L|aqCIn z>~!Cf{O%=YCpRP}a)c(-U#h^TzQCFNi)GjW@D(tmh)al~$Xn6MIaEx+Bla;R2pd<$ zb4DVqFy;>Y0Wprx5Ir^2d?bbgvWT~Rw{Jrm1VX;uw1DvzJEjIWp6KO4ghqIEZ4)Pw zbXvXSRT^$xh=diXx~bF(2wh!~rND{xAe((T9|_pEc*A^(W@Q8B8iW=I-{+xDGts|F zm1uS}7P+nu+wn054>JsF&p&ZiJms?)^tJSEI8VAOxD&i8(2A^0Bhsq* zkzVrK!GUc~PvgUC8#HT>#Bk#T7~_PR(WzGVNTq95vS~pY1=t5<}m$J1)HkSy#v8>fqGjiwgZWpg2RQW_zGVH3Xm4p;|tXX z#kHeT=&40K_N~MU_w66v0Bg?O;jMmdPy8!F?$t2&W>Dc6i|o*(;nCXAN(^)7{xCW? zKanHSlhPlncpY(a!(ya-lzx(^B6~Dwr4jGf+Y}K|P}ftd!SMeA>CGnR23Ye)_4a0~o+-+sFez zOa?Rw6*|PlJ4o?_SIjR(vUSn zLEUNDJ+s@9WOk%C$S zKPNQdc&h{&7x@n>QAOJ~k{>K)nuYx=0S-yHH>_?sZ(ui4$E|p$3Jjfc?h?(SY2_Jc z;(tj7E2(G_z1YaAnQzKl^UXnjOMLN0;+Lp+sguaOoH1q zvlgYI5BAUEt*CC}hxeVImA{X)JatjEJd;1*V!qNpHZ$T1mR8QpBu>hM3#^ z$njlW3h&EGyF zt>23ztzm}9bc8GtST<%pk2~%C>b3xy*ljFU-nt3~R-M+%40b(-!85mcl~sKq=P6za zO`7H^ZDTw$g)9@`YkXKLqBJVkXN7J$x)ITn0p~!X!>Oc%}asbuOFOdg|CYOr!-RHwq6$VADlW_IGTS8LD0-CTNhU~HZSJTT+(q2 zGt;R|+Mx10(Ww0Hja9gBD(a9|bo0Gs(@8WC55{~za zxNJ&Wc(*`-Q9Az1MCM-Ucdj`=gUdK$gbCgkVX?Qf0O3o&s$?(Rb?t8L-M+R ztqSazSVw-Va9OL50B0Bo)Cu|?A}vv~8m(34Tume=y#o~En3;hyZ2|x+&EWJC)x<~a zM{-WUb*}ak-S(Fuonge=p`=FzBldQIh!J~CM>OdO+zVl5aL;Le;CErkWOrJuAen&B zK|;=!faY3&LqPKtV@lJMGNBynIKmE|IkIaFj+*CYh(f}=Y`BOc!Q%UAZu_kbBvg58 zO>*if_G(DTP@$5-{!{h(88Gs&{}xsDx%x;9KkcSlnxbv{%fq8uwZ!4Q$vM5SvB`0C z2J}(3yJe*DKub$MW~CV)n1G$MSptR!A32?&LlSnv(9jfRi6GvipT<$Vk6R}?jF|w$ zD7@P8y|~Bfw0+hl*ok-vUo|A#-wXqTsOJ(Movl&xqY3}2c54&6dU=uQgM^$;$G%B3 zS1`s%>pwDkW42hV>frpH#VzexDiT@pm z{l(LqL1W{VdX%x-TBbVX!JFMk4}9X14(g&u?hoIPx8$3!%Rkjquk%Ce@dl8Pm`Ig&idJhqfA(<{d`hyb6@^lyjAGeGP^WiV@0^B=RUg$5ZhB@B=2it z*HG~*(}a8b!U#|{mYs8$aOfj`OAx(>aDhL!UqDTbJtw-9Mvdz$=8_6W;4 zEp@}(LFpfy7I0PzVo;REDR(Y=2z6eyI_(%Z3|l^58@14Vjj-0w;q-@b%`V7nNL7mybF6Z>x$k(K&eil3&2MD!N+_&SDhz+Sab3DDM^j%T$GKH6 zf#2D>;k8+<4=V|%Z&q$B#E7+Dd--gXI#qH1@FHV86-+7#kxnh5Vwqu=NLP9;%m`VUJRq&fMpC-GO=>1g=O~A^Jlkdhtz}Z>xp}gRb zkF1rWWcun*1|SRv*Yfq4W=i~*ol0X(!MbPGe0^C0mR|vo!QwxWwyndHSFv-NOY0{L zKw(y(NwrcIM zACEzw9oZcXo`Ap%Rh)^BUg@72=^Jy4R&r1ama}Iz%L9hTZaSn4sJp;VUx`|K8LU*h zRjpdYoVWPCCgxXXt;}eOuKpGdD(q$%{02zU9Sn1Vfj(4r|J2B79WcqV>&X9%@ZbJ+ z>`H#iAicW4KIx32#%k0AS!zz71pq+TZC&d}md3N;oA zOt#jV?Y{xSm5bGslmNTi|kn5^XVWYo5+BCuwH^9RGQHAP^Y-!W*)l<+S_js~~ z{1-U(`MnM-2qzBgrL490=mFlHCai}hzG(TtiU8e` zky1YdQ?#OH^B;_?qIFg$Na|3|db-<3jWH_Ly!)r0H8+Wq;UYdZ!3_QhKT$+|5`GPH zCRr9vk&d0I#?sj~WykupZHTEC7C1x+BRKHA_yXZux+_^xp0O~6M zb7$v1XA}1(NcCxYRB(!TxFw$ic{@*q~lbu5}r$nD^Kr+GL}6}Wj^pd^JDR&sZMAneI-mfP{^&$TjO zr2&DQZ3=3Dk;$Dgi9q9uG!l5c9f%LoD;oI^zSW076Z^=tN9!t7H~4Yr^|pRxl-gm8 zMGY0+yH&fjAI($Aks4S@;Dt9wek3)l`Cx6m#87OVvSo12@N`(T^EdL z``xg!S#r0$+6fl_QH1ZIfa3cIX_q^Z;uG5$sp{jx2L`fmm1h~#RL{Mqsy^~#=ene7 zSv6Sgo)dO~1lI6Qi?g@2>UQPQRbtn{_;QGKA3xwj#TC>RD(kBCH@?8*>*2R{=O+`; znj-4M)(>Q|{p(mre1zBQ8?}|=nz+j~#-+K%G^44oQ)CJEZj(vhO`>na)XM+_22f>> z#&YJ?ZvglWqZUqq73R?EoxQ{4Qwo7bTj}uidCI0CwEhMV#sajfwydqT^QETWQeD<} z)OSEl*S8BQ?f#8A8xA;~KVEQUH_6{Ms6a=E0;y7tWS`+vdWpJ`t%HG zTgqWo(u+R0o#R_0>R%}X&;;pV@BsJomrc9aOGHDxn_6DG`pAU)#ZYWZ=Jr!;0mvYZ z?cbuHA4o8Xee%B*6@ZNhTkZcUY5u!9b2PY;ZV(~U5lM~%r__q>m78P0(l1q_6mA=c zu4z{oTnc?xz`T-Uu+G-!_Qw%}WQzvx&&{ehJ8Ej>MUvygNrD45Dja4L{^_F@rLL)q z;n|Bi2b_iq8B+88n;q&ON`{ACPOwO5H(KiZeKNz2K%CYcEv*sMVjHaQ`UoRjGh{wc z#i_2`UHG(I9tmfmEXx2F?E3mfFZh`y+xj3Nr5Me zmmE1wiwy>0Si2yd%DNy zQMaRG36HKPz{*+4XB>P=fD^{c-*024vMP(&#(z{#rr}E`v?rJ3_bGFizTntwVHtjr!?5tIAO+o0K>e#TV_YR_~)qEdI5Gm;#+NcLodpR+Cj zXWLCTecCEyo;dDe(*r(j5U3wgiR|>WGkjr}^#WZ@SbGv36Z1+02bTf)!wT6;#@+{o zXfu-Bd-c~7sT_s-w|x`Is+vAEc*>iZ17mpHRbn8I<>*_AZaMfPP7*bgNZ5eECYtiM zJ3*A&aV&|*W4S7RTdqE`3`kPiGk&++K*5ryi-8l2PljK&@jl-LyN|*}Yez*hwtA@y z3z*#X?6Hl?XPMSDMIO(^@8<4j(+^ImowTUA`Qp~rafLabFy{4G^XW!0k67=P zl!OGwzve0ldD0#@{DHFL>NVHK!TENnBJS^gjtMPolIaOelAp0yR<(7kK37r}*ur-u z^lk_fGn!n_p)|4%GI=DW@TdG>@^}UDL z>6&>Fj3FfZ_vs5St|Ym1Aa%*)(~3K1+cpt)+Aeve)yPgGUG=!_kJuiRNh)zGW%fYm zM(0GIgjk`e_fz(zW8vfaHyHeJMnQ8|4A703o5m=CI-+UIluYrwD@$ z%AePpqvyAB!--le$7RymQCM0wiAvXvxee8HgJqX0cd+vL?R`Dy-?HT`y$+fNOX&X> hhy1s6_ Date: Mon, 8 Nov 2021 06:21:03 +0000 Subject: [PATCH 02/13] Migrate to sfp-refactoring framework Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 237 +++++++++++++++++++++++++++ doc/sfp-cmis/cmis.md | 308 ------------------------------------ doc/sfp-cmis/images/001.png | Bin 22634 -> 56518 bytes doc/sfp-cmis/images/002.png | Bin 45188 -> 0 bytes 4 files changed, 237 insertions(+), 308 deletions(-) create mode 100644 doc/sfp-cmis/cmis-init.md delete mode 100644 doc/sfp-cmis/cmis.md delete mode 100644 doc/sfp-cmis/images/002.png diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md new file mode 100644 index 00000000000..5ceb0996f83 --- /dev/null +++ b/doc/sfp-cmis/cmis-init.md @@ -0,0 +1,237 @@ +# Feature Name +CMIS Application Initialization + +# High Level Design Document +#### Rev 0.2 (Draft) + +# Table of Contents + * [List of Tables](#list-of-tables) + * [Revision](#revision) + * [About This Manual](#about-this-manual) + * [Scope](#scope) + * [Abbreviation](#abbreviation) + * [References](#references) + * [Requirement Overview](#requirement-overview) + * [Functional Description](#functional-description) + * [Design](#design) + +# List of Tables + * [Table 1: Definitions](#table-1-definitions) + * [Table 2: References](#table-2-references) + +# Revision +| Rev | Date | Author | Change Description | +|:---:|:-----------:|:-------------------:|-------------------------------------------| +| 0.1 | 09/27/2021 | Dante (Kuo-Jung) Su | Initial version | +| 0.2 | 11/08/2021 | Dante (Kuo-Jung) Su | Migrate to the new sfp-refactoring framework | + +# About this Manual +This document provides general information about the CMIS application initialization support for SONiC. + +# Abbreviation + +# Table 1: Definitions +| **Term** | **Definition** | +| -------------- | ------------------------------------------------ | +| pmon | Platform Monitoring Service | +| xcvr | Transceiver | +| xcvrd | Transceiver Daemon | +| CMIS | Common Management Interface Specification | + +# References + +# Table 2 References + +| **Document** | **Location** | +|---------------------------------------------------------|---------------| +| Common Management Interface Specification (CMIS) | [CMIS5p0.pdf](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) | + +# Requirement Overview + +This document describes functional behavior of the CMIS application initialization support in SONiC. + +The Common Management Interface Specification (CMIS) provides a variety of features +and support for different transceiver form factors. A +CMIS transceiver may support multiple application, and the application initialization sequence is now mandatory for the dynamic port breakout mode to correctly update the active CMIS application based on the desired port mode. Otherwise the link will be down if the host port mode does not match the selected application on the CMIS transceiver. + +The feature is built on top of SONiC **sfp-refactor** framework to provide a platform-independent +solution, and the individual platforms could easily enable this feaure by having its **Sfp** inherited from **SfpOptoeBase**. + +**Example:** +``` +from sonic_platform_base.sonic_xcvr.sfp_optoe_base import SfpOptoeBase + +class Sfp(SfpOptoeBase): + + def __init__(self, sfp_index): + SfpOptoeBase.__init__(self) + self.index = sfp_index + + def get_port_type(self): + return self.SFP_PORT_TYPE_QSFPDD + + def get_eeprom_path(self): + # platform-specific per-port I2C bus + i2c_bus = 32 + self.index + return "/sys/bus/i2c/devices/{}-0050/eeprom".format(i2c_bus) +``` + +The scope of this feature is as follow: + +- **sonic-platform-common** + - Enhance the **sonic-xcvr** to support CMIS application advertising and initialization +- **sonic-platform-daemons** + - Enhance the **sonic-xcvrd** to support paralleled CMIS application initialization +- **sonic-utilities** + - Enhance the **sfputil** and **sfpshow** to show CMIS application advertisement + +## Functional Requirements + +1. Ability to parse the advertised applications from the transceivers +2. Ability to post the advertised applications to the STATE_DB +3. Ability to support parallel processing of the application initialization +4. Ability to detect the errors of the application initialization on the transceivers + +**Note:** +The duration of the CMIS application initialization greatly differs from transceivers +to transceivers, while some take 3 seconds for activating the 4x100G mode, some require 15 seconds. +Hence it's mandatory to support parallel processing. + +## Configuration and Management Requirements + +1. Show commands to display the EEPROM and DOM information, as described in **Show Commands** section below. + +## Warm Boot Requirements + +Functionality should continue to work across warm boot. +- The CMIS application initialization should not be performed during WarmBoot. +- The CMIS application initialization should be skipped if no application code updates. + +# Functional Description + +- The **pmon#xcvrd** will detect the module type of the attched transceivers and post the +information to the **STATE_DB** +- If the transceiver is a CMIS module, the **pmon#xcvrd** will activate the appropriate +application mode as per the current port mode. +- If the transceiver is a CMIS module, the **show interfaces transceiver eeprom** +should display the advertised applications of the transceiver. +- If the transceiver is a CMIS module, the **sfputil** should be capable of detecting the errors of the CMIS application initialization. + +# Design + +## Overview + +![](images/001.png) + +## Code Changes + +### sonic-platform-daemons/sonic-xcvrd (modified) + +The transceiver daemon will be enhanced as below: + +- Post the CMIS application advertisement into the **STATE_DB** + The **application_advertisement** of **TRANSCEIVER_INFO** is as follow: + - **CMIS transceiver** +``` + "TRANSCEIVER_INFO|Ethernet0": { + "type": "hash", + "value": { + "application_advertisement": "{1: {'ap_sel_code_id': 1, 'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'ap_sel_code_id': 2, 'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}}", + ...... omitted ...... + } + }, + ...... omitted ...... +``` + + - **Non-CMIS transceiver** +``` + "TRANSCEIVER_INFO|Ethernet0": { + "type": "hash", + "value": { + "application_advertisement": "N/A", + ...... omitted ...... + } + }, + ...... omitted ...... +``` + +- Add a CMIS manager class to handle the application initializations in parallel + +### sonic-platform-common/sonic_platform_base/sfp_base.py (modified) + +Add the following stub routines for the CMIS transceiver +- get_cmis_application_selected(self) +Retrieves the selected application code of this CMIS transceiver +- get_cmis_application_matched(self, host_speed, host_lanes) +Retrieves the matched application code by the host interface config +- set_cmis_application(self, host_speed, host_lanes) +Updates the application selection of this CMIS transceiver + +### sonic-platform-common/sonic_platform_base/sonic_xcvr/api/public/cmis.py (modified) + +- Add support for software reset +- Add support for activating the CMIS application base on the host port mode. + +### sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py (modified) + +- Add register definitions for CMIS application initialization + +### sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/public/cmis.py (modified) + +- Add support for parsing CMIS application advertisement + +### sonic-platform-common/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis.py (modified) + +- Add the meory map for the CMIS registers which is necessary for application initialization + +### sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py (modified) + +- Add support for CMIS application initialization + +### sonic-utilities/sfputil (modified) + +- Add supprot to show the CMIS application advertisement + +## CLI commands + +### CLI Show Commands + +With CMIS application advertisement support, **show interfaces transceiver eeprom** is now as below. + +``` +admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 +Ethernet0: SFP EEPROM detected + Application Advertisement: + 1: 400GAUI-8 C2M (Annex 120E) | 400GBASE-DR4 (Cl 124) + 2: 100GAUI-2 C2M (Annex 135G) | 100G-FR/100GBASE-FR1 (Cl 140) + Connector: SN (Mini CS) + Identifier: QSFP56-DD + Implemented Memory Pages: + Bank 0 Implemented + Diagnostic Pages Implemented + Page 03h Implemented + Length SMF(km): 0.0 + Module State: Ready State + Revision Compliance: 4.0 + Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 + Vendor Name: AVAGO + Vendor OUI: 00-17-6A + Vendor PN: AFCT-93DRPHZ-AZ2 + Vendor Rev: 01 + Vendor SN: FD2038FG0FY +``` + +### CLI Debug Commands + +The legacy **sfputil show error-status** is also enhanced to detect CMIS failures + +``` +admin@sonic:~$ sudo sfputil show error-status +Port Error Status +----------- -------------- +Ethernet0 OK +Ethernet8 CMIS datapath error +Ethernet16 CMIS config error +Ethernet24 Unplugged +Ethernet32 Unplugged +``` diff --git a/doc/sfp-cmis/cmis.md b/doc/sfp-cmis/cmis.md deleted file mode 100644 index 34f683b559d..00000000000 --- a/doc/sfp-cmis/cmis.md +++ /dev/null @@ -1,308 +0,0 @@ -# Feature Name -QSFPDD CMIS support for SONiC - -# High Level Design Document -#### Rev 0.1 (Draft) - -# Table of Contents - * [List of Tables](#list-of-tables) - * [Revision](#revision) - * [About This Manual](#about-this-manual) - * [Scope](#scope) - * [Abbreviation](#abbreviation) - * [References](#references) - * [Requirement Overview](#requirement-overview) - * [Functionality](#functionality) - * [Design](#design) - * [Testing](#testing) - -# List of Tables - * [Table 1: Definitions](#table-1-definitions) - * [Table 2: References](#table-2-references) - -# Revision -| Rev | Date | Author | Change Description | -|:---:|:-----------:|:-------------------:|-----------------------------------| -| 0.1 | 09/27/2021 | Dante (Kuo-Jung) Su | Initial version | - -# About this Manual -This document provides general information about the QSFPDD CMIS support for SONiC. - -# Scope -This document describes functional behavior of the QSFPDD CMIS support for SONiC. - -# Abbreviation - -# Table 1: Definitions -| **Term** | **Definition** | -| -------------- | ------------------------------------------------ | -| pmon | Platform Monitoring Service | -| xcvr | Transceiver | -| xcvrd | Transceiver Daemon | -| CMIS | QSFPDD Common Management Interface Specification | -| QSFPDD | Quad Small Form Factor Pluggable Double Density | - -# References - -# Table 2 References - -| **Document** | **Location** | -|---------------------------------------------------------|---------------| -| QSFPDD Common Management Interface Specification (CMIS) | [CMIS5p0.pdf](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwiL0pT5gqHzAhWWYisKHWI3CNoQFnoECCIQAQ&url=http%3A%2F%2Fwww.qsfp-dd.com%2Fwp-content%2Fuploads%2F2021%2F05%2FCMIS5p0.pdf&usg=AOvVaw3vUjsBDOeUWoYaMn3KDG_w) | - -# Requirement Overview - -This document describes functional behavior of the QSFPDD CMIS support in SONiC. - -The QSFPDD Common Management Interface Specification (CMIS) version 4.0 was finalized -in May of 2019 and provides a variety of features and support for different transceiver -form factors. From a software perspective, a CMIS application initialization sequence -is now mandatory as per the current dynamic port breakout mode activated. And these is -also a new diagnostic support tha could be useful to SONiC users and developers. - -The current SONiC platform API model is such that base classes in **sonic-platform-common** -define a common, platform-independent interface that can be implemented in platform-specific classes. - -![](images/001.png) - -Unfortunately, the legacy SFP libraries (sonic-sfp) do not provide full featured support for the SFP, -and and vendors are having to fill in implementation gaps for themselves. This is resulting in a lot -of duplicate work being done for things that should be common across platforms. - -The goal of this SONIC QSFPDD CMIS support is to - -- Provide an unified common SFP parser for the QSFPDD transceivers -- Enhance the **pmon#xcvrd** for the QSFPDD application initialization sequence -- Enhance the **pmon#xcvrd** for the QSFPDD diagnostics loopback controls - -## 1.1 Functional Requirements - -1. Ability to parse the advertised applications from the transceivers -2. Ability to post the advertised applications to the STATE_DB -3. Ability to decode the current module state from the transceivers -4. Ability to post the current module state to the STATE_DB -5. Ability to decode the error code of the application initialization sequence from the transceivers -6. Ability to post the error code of the application initialization sequence -7. Ability to process the application initialization sequence in multi-thread/process model. -8. Ability to enable / disable the transceiver loopback controls - -**Note:** -The duration of the CMIS application initialization sequence greatly differs from transceivers -to transceivers, while some take 3 seconds for activating the 4x100G mode, some require 15 seconds. -Hence it's mandatory to support multi-threaded/processed models. - -## 1.2 Configuration and Management Requirements - -1. Show commands to display the QSFPDD EEPROM and DOM information, as described in **Show Commands** section below. - -## 1.3 Warm Boot Requirements - -Functionality should continue to work across warm boot. -- To support planned system warm boot. -- To support pmon docker restart. - -# Functionality - -## 2.1 Target Deployment Use Cases -The QSFPDD CMIS support is used to perform application initialization as per the operational -port breakout mode, otherwise the links will be down if the modules is with CMIS v4/v5 firmwares. - -### 2.1.1 CMIS loopback Use Cases -The loopback controls at the transceiver layer can quickly be tested -by a remote user to triage either system-side or line-side issues and help isolate failing hardware. - -## 2.2 Functional Description - -- The **pmon#xcvrd** will detect the module type of the attched transceivers and post the -information to the **STATE_DB** -- If the transceiver is a QSFPDD CMIS module, the **pmon#xcvrd** will activate the desired -application mode as per the current port mode. -- If the transceiver is a QSFPDD CMIS module, the **show interfaces transceiver eeprom** -should display the advertised applications of the transceiver. -- If the transceiver is a QSFPDD CMIS module, the users will be able to enable or disable the -loopbacks at the transceiver layer to triage link issues. -- If the transceiver is a QSFPDD CMIS module, the users will be able to check the state of -the application initialization. - -# Design - -## 3.1 Overview - -![](images/002.png) - -### 3.1.1 sonic-platform-daemons - -#### 3.1.1.1 sonic-xcvrd (modified) - -The transceiver daemon will be enhanced as below: - -- Post the QSFP-DD infomration to STATE_DB -- Add a new CMIS task to handle the multiple CMIS initializations in parallel - -### 3.1.2 sonic-platform-common - -#### 3.1.2.1 sonic_platform_base/sonic_sfp/inf8628.py (modified) - -This library will be enhanced as below - -- Add support for decoding the advertised applications of the QSFPDD CMIS transceiver -- Add support for decoding the DOM information of the QSFPDD CMIS transceiver - -#### 3.1.2.2 sonic_platform_base/sfp_standard.py (new) - -This is a new common SFP base class that's supposed to be inherited by the SFP drivers -of the individual platforms, and it will later be refactored when **sfp-refactor** is -open for business. - -### 3.1.3 sonic-utilities - -#### 3.1.3.1 sfputil (modified) - -This utility will be enhanced to support the following features - -- Show the current application mode of the QSFPDD CMIS transceiver -- Show the current configuration errors of the QSFPDD CMIS transceiver -- Show the loopback capabilities of the QSFPDD CMIS transceiver -- Enable/Disable the loopback controls provided by the QSFPDD CMIS transceiver - -## 3.2 DB Changes - -### 3.2.1 CONFIG_DB - -No modifications made. - -### 3.2.2 APPL_DB - -No modifications made. - -### 3.2.3 STATE_DB - -The **TRANSCEIVER_INFO** table will be extended as below if the transceiver is compliant with CMIS 4.0 onward: - -``` - "TRANSCEIVER_INFO|Ethernet0": { - "type": "hash", - "value": { - "application_advertisement": "{1: {'host_if': '400GAUI-8 C2M (Annex 120E)', 'media_if': '400GBASE-DR4 (Cl 124)'}, 2: {'host_if': '100GAUI-2 C2M (Annex 135G)', 'media_if': '100G-FR/100GBASE-FR1 (Cl 140)'}}", - "cable_length": "0.0", - "cable_type": "Length SMF(km)", - "connector": "SN (Mini CS)", - "connector_type": "SN (Mini CS)", - "encoding": "N/A", - "ext_identifier": "N/A", - "ext_rateselect_compliance": "N/A", - "hardware_rev": "01", - "lane_count": "4", - "manufacturer": "AVAGO", - "media_type": "sm_media_interface", - "memory_pages": "['Diagnostic Pages Implemented', 'Page 03h Implemented', 'Bank 0 Implemented']", - "memory_type": "Paged", - "model": "AFCT-93DRPHZ-AZ2", - "module_state": "Ready State", - "nominal_bit_rate": "N/A", - "revision_compliance": "4.0", - "serial": "FD2038FG0FY", - "specification_compliance": "N/A", - "type": "QSFP56-DD", - "type_abbrv_name": "QSFP-DD", - } - } -``` - -## 3.3 CLI - -### 3.3.1 Show Commands - -The legacy show command, **show interfaces transceiver eeprom**, will be enhanced for QSFPDD support. - -``` -admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 -Ethernet0: SFP EEPROM detected - Application Advertisement: - 1: 400GAUI-8 C2M (Annex 120E) | 400GBASE-DR4 (Cl 124) - 2: 100GAUI-2 C2M (Annex 135G) | 100G-FR/100GBASE-FR1 (Cl 140) - Connector: SN (Mini CS) - Identifier: QSFP56-DD - Implemented Memory Pages: - Bank 0 Implemented - Diagnostic Pages Implemented - Page 03h Implemented - Length SMF(km): 0.0 - Module State: Ready State - Revision Compliance: 4.0 - Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 - Vendor Name: AVAGO - Vendor OUI: 00-17-6A - Vendor PN: AFCT-93DRPHZ-AZ2 - Vendor Rev: 01 - Vendor SN: FD2038FG0FY - -admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 --dom -Ethernet0: SFP EEPROM detected - Application Advertisement: - 1: 400GAUI-8 C2M (Annex 120E) | 400GBASE-DR4 (Cl 124) - 2: 100GAUI-2 C2M (Annex 135G) | 100G-FR/100GBASE-FR1 (Cl 140) - Connector: SN (Mini CS) - Identifier: QSFP56-DD - Implemented Memory Pages: - Bank 0 Implemented - Diagnostic Pages Implemented - Page 03h Implemented - Length SMF(km): 0.0 - Module State: Ready State - Revision Compliance: 4.0 - Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 - Vendor Name: AVAGO - Vendor OUI: 00-17-6A - Vendor PN: AFCT-93DRPHZ-AZ2 - Vendor Rev: 01 - Vendor SN: FD2038FG0FY - ChannelMonitorValues: - RX1Power: 2.9217dBm - RX2Power: 1.9984dBm - RX3Power: -40.0000dBm - RX4Power: -40.0000dBm - TX1Bias: 44.9420mA - TX1Power: 2.8587dBm - TX2Bias: 47.4440mA - TX2Power: 3.0211dBm - TX3Bias: 47.4440mA - TX3Power: 2.9634dBm - TX4Bias: 49.9460mA - TX4Power: 2.7395dBm - ChannelThresholdValues: - RxPowerHighAlarm : 7.5000dBm - RxPowerHighWarning: 4.4999dBm - RxPowerLowAlarm : -10.4001dBm - RxPowerLowWarning : -6.4016dBm - TxBiasHighAlarm : 75.0000mA - TxBiasHighWarning : 70.0000mA - TxBiasLowAlarm : 10.0000mA - TxBiasLowWarning : 15.0000mA - TxPowerHighAlarm : 6.9999dBm - TxPowerHighWarning: 3.9999dBm - TxPowerLowAlarm : -6.4016dBm - TxPowerLowWarning : -2.4003dBm - ModuleMonitorValues: - Temperature: 27.4336C - Vcc: 3.2883Volts - ModuleThresholdValues: - TempHighAlarm : 75.0000C - TempHighWarning: 70.0000C - TempLowAlarm : -5.0000C - TempLowWarning : 0.0000C - VccHighAlarm : 3.6300Volts - VccHighWarning : 3.4650Volts - VccLowAlarm : 2.9700Volts - VccLowWarning : 3.1350Volts -``` - -### 3.3.2 Debug Commands - -The **sfputil** will be enhanced for CMIS debugging - -# Unit Test - -- Verify with QSFPDD static and DOM information with **show interface transceiver eeprom** -- Verify with QSFPDD application initialization by **show logging** when reseating the QSFPDD transceiver -- Verify with QSFPDD application initialization by **sfputil** diff --git a/doc/sfp-cmis/images/001.png b/doc/sfp-cmis/images/001.png index 6b5264c7ec33f9d3d237993c0258a0f693758c35..6058aa7748481f5188c53527621fa7c8390c9414 100644 GIT binary patch literal 56518 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%0Av~9|AO@8>S)yQIRtd$J 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⪚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 ODL>FqD3yQq_x}KSB;I5I diff --git a/doc/sfp-cmis/images/002.png b/doc/sfp-cmis/images/002.png deleted file mode 100644 index 43424f3cfa98678bba3d914bc1e2bf5265e12e4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45188 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 hhy1s6_ Date: Mon, 8 Nov 2021 06:32:27 +0000 Subject: [PATCH 03/13] cosmetic updates Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 44 +++++++++++---------------------------- 1 file changed, 12 insertions(+), 32 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index 5ceb0996f83..5d69233c07c 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -97,10 +97,6 @@ The duration of the CMIS application initialization greatly differs from transce to transceivers, while some take 3 seconds for activating the 4x100G mode, some require 15 seconds. Hence it's mandatory to support parallel processing. -## Configuration and Management Requirements - -1. Show commands to display the EEPROM and DOM information, as described in **Show Commands** section below. - ## Warm Boot Requirements Functionality should continue to work across warm boot. @@ -119,19 +115,13 @@ should display the advertised applications of the transceiver. # Design -## Overview - -![](images/001.png) - -## Code Changes - -### sonic-platform-daemons/sonic-xcvrd (modified) +## sonic-platform-daemons/sonic-xcvrd (modified) The transceiver daemon will be enhanced as below: - Post the CMIS application advertisement into the **STATE_DB** - The **application_advertisement** of **TRANSCEIVER_INFO** is as follow: - - **CMIS transceiver** + In the case of CMIS transceiver, the **application_advertisement** of **TRANSCEIVER_INFO** is as follow: + ``` "TRANSCEIVER_INFO|Ethernet0": { "type": "hash", @@ -143,21 +133,11 @@ The transceiver daemon will be enhanced as below: ...... omitted ...... ``` - - **Non-CMIS transceiver** -``` - "TRANSCEIVER_INFO|Ethernet0": { - "type": "hash", - "value": { - "application_advertisement": "N/A", - ...... omitted ...... - } - }, - ...... omitted ...... -``` +- Add a CMIS manager class to handle the application initializations in parallel -- Add a CMIS manager class to handle the application initializations in parallel + ![](images/001.png) -### sonic-platform-common/sonic_platform_base/sfp_base.py (modified) +## sonic-platform-common/sonic_platform_base/sfp_base.py (modified) Add the following stub routines for the CMIS transceiver - get_cmis_application_selected(self) @@ -167,28 +147,28 @@ Retrieves the matched application code by the host interface config - set_cmis_application(self, host_speed, host_lanes) Updates the application selection of this CMIS transceiver -### sonic-platform-common/sonic_platform_base/sonic_xcvr/api/public/cmis.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/api/public/cmis.py (modified) - Add support for software reset - Add support for activating the CMIS application base on the host port mode. -### sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py (modified) - Add register definitions for CMIS application initialization -### sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/public/cmis.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/public/cmis.py (modified) - Add support for parsing CMIS application advertisement -### sonic-platform-common/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis.py (modified) - Add the meory map for the CMIS registers which is necessary for application initialization -### sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py (modified) - Add support for CMIS application initialization -### sonic-utilities/sfputil (modified) +## sonic-utilities/sfputil (modified) - Add supprot to show the CMIS application advertisement From 8f99da5876ce072e172a3008a88e42ed41f9ae26 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Mon, 8 Nov 2021 07:03:44 +0000 Subject: [PATCH 04/13] update the exmaple output of CMIS EEPROM Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index 5d69233c07c..709f844b119 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -184,18 +184,17 @@ Ethernet0: SFP EEPROM detected Application Advertisement: 1: 400GAUI-8 C2M (Annex 120E) | 400GBASE-DR4 (Cl 124) 2: 100GAUI-2 C2M (Annex 135G) | 100G-FR/100GBASE-FR1 (Cl 140) - Connector: SN (Mini CS) - Identifier: QSFP56-DD - Implemented Memory Pages: - Bank 0 Implemented - Diagnostic Pages Implemented - Page 03h Implemented - Length SMF(km): 0.0 - Module State: Ready State - Revision Compliance: 4.0 + Connector: SN optical connector + Encoding: N/A + Extended Identifier: Power Class 6 (12.0W Max) + Extended RateSelect Compliance: N/A + Identifier: QSFP-DD Double Density 8X Pluggable Transceiver + Length cable Assembly(m): 0.0 + Nominal Bit Rate(100Mbs): 0 + Specification compliance: sm_media_interface Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 Vendor Name: AVAGO - Vendor OUI: 00-17-6A + Vendor OUI: 00-17-6a Vendor PN: AFCT-93DRPHZ-AZ2 Vendor Rev: 01 Vendor SN: FD2038FG0FY From 4e3148668e4974a68ca255f432b7f13d970d1458 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Fri, 12 Nov 2021 08:44:32 +0000 Subject: [PATCH 05/13] Add implementation details and CMIS media settings Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 72 +++++++++++++++++++++++++++++++++++- doc/sfp-cmis/images/002.png | Bin 0 -> 23667 bytes 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 doc/sfp-cmis/images/002.png diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index 709f844b119..742b18fbb90 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -120,8 +120,21 @@ should display the advertised applications of the transceiver. The transceiver daemon will be enhanced as below: - Post the CMIS application advertisement into the **STATE_DB** - In the case of CMIS transceiver, the **application_advertisement** of **TRANSCEIVER_INFO** is as follow: + In the case of CMIS transceiver, the **application_advertisement** of **TRANSCEIVER_INFO** +is updated from plain test into json dictionary format: +**Original:** +``` + "TRANSCEIVER_INFO|Ethernet0": { + "type": "hash", + "value": { + "application_advertisement": "400GAUI-8 C2M (Annex 120E) - 400GBASE-DR4 (Cl 124)\n 100GAUI-2 C2M (Annex 135G) - 100G-FR/100GBASE-FR1 (Cl 140)", + ...... omitted ...... + } + }, +``` + +**Modified:** ``` "TRANSCEIVER_INFO|Ethernet0": { "type": "hash", @@ -133,10 +146,59 @@ The transceiver daemon will be enhanced as below: ...... omitted ...... ``` +- Add **CMIS_MEDIA_SETTINGS** to the media_settings.json for custom CMIS controls + +**Format:** +``` +{ + "CMIS_MEDIA_SETTINGS":{ + "#": { + "application_selection": true|false + } + } +} +``` + +**Example:** +``` +{ + "CMIS_MEDIA_SETTINGS":{ + "AVAGO#AFCT-93DRPHZ-AZ2": { + "application_selection": true + }, + "Amphenol#NDYYYF-0001": { + "application_selection": false + }, + "DELL EMC#6MGDY": { + "application_selection": true + }, + "DELL EMC#DH11M": { + "application_selection": false + } + } +} +``` + As of now, only **application_selection** is supported, and it defaults to **True** if unspecified + - Add a CMIS manager class to handle the application initializations in parallel ![](images/001.png) +- Add **PortChangeEvent.PORT_SET** and **PortChangeEvent.PORT_DEL** events to **xcvrd_utilities/port_mapping.py** + - PortChangeEvent.PORT_SET + Invoke the event callbacks upon **SET** operations, it includes all the port config updates, +not just the port add/remove events. + - PortChangeEvent.PORT_DEL + Invoke the event callbacks upon **DEL** operations. + +- As of now, the number of CmisManagerTask is hard coded to 4 + - Task 0 is dedicated to listen for **PortChangeEvent.PORT_SET** events, and put requests into the shared message queue + - Task 1-N are responsible for handling the CMIS application initializations in parallel, + since all the requests are from the shared message queue, only one request will be processed + by a certain task at a time. + + ![](images/002.png) + ## sonic-platform-common/sonic_platform_base/sfp_base.py (modified) Add the following stub routines for the CMIS transceiver @@ -151,6 +213,8 @@ Updates the application selection of this CMIS transceiver - Add support for software reset - Add support for activating the CMIS application base on the host port mode. +- Detailed CMIS application initialization sequence is available in **Appendix D** of +[Common Management Interface Specification Rev. 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) ## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py (modified) @@ -167,6 +231,12 @@ Updates the application selection of this CMIS transceiver ## sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py (modified) - Add support for CMIS application initialization + - get_cmis_application_selected() + - get_cmis_application_matched() + - set_cmis_application() +- Add mutex lock to the follow routines to serialize CMIS application initializations + - reset() + - set_cmis_application() ## sonic-utilities/sfputil (modified) diff --git a/doc/sfp-cmis/images/002.png b/doc/sfp-cmis/images/002.png new file mode 100644 index 0000000000000000000000000000000000000000..acaf3f4760628d3d45d0ecb9ebd3ee6836a5ecff GIT binary patch literal 23667 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 literal 0 HcmV?d00001 From 2fac62bf53eae0d05016bff121dab5d373307b73 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Fri, 12 Nov 2021 08:52:04 +0000 Subject: [PATCH 06/13] Add example logs of CMIS manager Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index 742b18fbb90..e5e42284c0b 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -274,6 +274,7 @@ Ethernet0: SFP EEPROM detected The legacy **sfputil show error-status** is also enhanced to detect CMIS failures +Example: ``` admin@sonic:~$ sudo sfputil show error-status Port Error Status @@ -284,3 +285,17 @@ Ethernet16 CMIS config error Ethernet24 Unplugged Ethernet32 Unplugged ``` + +Please use **show logging xcvrd | grep CMIS** for the logs of CMIS Manager + +Example: +``` +admin@sonic:~$ show logging xcvrd | grep CMIS +Nov 12 07:37:26.176160 sonic NOTICE pmon#xcvrd[36]: CMIS: Starting... +Nov 12 07:37:26.176513 sonic NOTICE pmon#xcvrd[37]: CMIS: Starting... +Nov 12 07:37:26.178932 sonic NOTICE pmon#xcvrd[38]: CMIS: Starting... +Nov 12 07:37:26.180756 sonic NOTICE pmon#xcvrd[42]: CMIS: Starting... +Nov 12 07:37:26.180882 sonic NOTICE pmon#xcvrd[40]: CMIS: Starting... +Nov 12 07:37:27.317755 sonic NOTICE pmon#xcvrd[37]: CMIS: Ethernet32: application update for 400G, 8-lanes +Nov 12 07:37:27.388256 sonic NOTICE pmon#xcvrd[37]: CMIS: Ethernet32: application update ... ok +``` From c4b77702fc4d2e9e15c8a927d4c6727b68d4b44b Mon Sep 17 00:00:00 2001 From: Dante Su Date: Mon, 15 Nov 2021 08:57:14 +0000 Subject: [PATCH 07/13] Update the scope Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index e5e42284c0b..04be5b12eba 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -51,8 +51,11 @@ This document provides general information about the CMIS application initializa This document describes functional behavior of the CMIS application initialization support in SONiC. The Common Management Interface Specification (CMIS) provides a variety of features -and support for different transceiver form factors. A -CMIS transceiver may support multiple application, and the application initialization sequence is now mandatory for the dynamic port breakout mode to correctly update the active CMIS application based on the desired port mode. Otherwise the link will be down if the host port mode does not match the selected application on the CMIS transceiver. +and support for different transceiver form factors. A CMIS transceiver may support +multiple application, and the application initialization sequence is now mandatory +for the dynamic port breakout mode to correctly update the active CMIS application +based on the desired port mode. Otherwise the link will be down if the host port mode +does not match the selected application on the CMIS transceiver. The feature is built on top of SONiC **sfp-refactor** framework to provide a platform-independent solution, and the individual platforms could easily enable this feaure by having its **Sfp** inherited from **SfpOptoeBase**. @@ -78,6 +81,13 @@ class Sfp(SfpOptoeBase): The scope of this feature is as follow: +- **CMIS application initialization for dynamic port breakout operations.** + - All the lanes of the CMIS module will be reconfigured to use +exactly the same application. Mixed application mode is outside the scope of this document. + - Only staged control set 0 will be supported + - No speed negotiation. + - No custom signal integrity settings + - Implement the procedures defined in Appendix D.1.3 and D.2.2 of [CMIS 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) - **sonic-platform-common** - Enhance the **sonic-xcvr** to support CMIS application advertising and initialization - **sonic-platform-daemons** @@ -213,8 +223,8 @@ Updates the application selection of this CMIS transceiver - Add support for software reset - Add support for activating the CMIS application base on the host port mode. -- Detailed CMIS application initialization sequence is available in **Appendix D** of -[Common Management Interface Specification Rev. 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) +- Detailed CMIS application initialization sequence is available in **Appendix D.1.3 and D.2.2** of +[CMIS 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) ## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py (modified) From d811eb05421614a1ac810cc71bd73bb3da91e2eb Mon Sep 17 00:00:00 2001 From: Dante Su Date: Fri, 19 Nov 2021 08:24:03 +0000 Subject: [PATCH 08/13] Update the HLD to support state-based app init and default app only Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 298 ++++++++++++++++++++++-------------- doc/sfp-cmis/images/001.png | Bin 56518 -> 71280 bytes doc/sfp-cmis/images/002.png | Bin 23667 -> 0 bytes 3 files changed, 187 insertions(+), 111 deletions(-) delete mode 100644 doc/sfp-cmis/images/002.png diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index 04be5b12eba..b873edde176 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -2,7 +2,7 @@ CMIS Application Initialization # High Level Design Document -#### Rev 0.2 (Draft) +#### Rev 0.1 (Draft) # Table of Contents * [List of Tables](#list-of-tables) @@ -22,11 +22,11 @@ CMIS Application Initialization # Revision | Rev | Date | Author | Change Description | |:---:|:-----------:|:-------------------:|-------------------------------------------| -| 0.1 | 09/27/2021 | Dante (Kuo-Jung) Su | Initial version | -| 0.2 | 11/08/2021 | Dante (Kuo-Jung) Su | Migrate to the new sfp-refactoring framework | +| 0.1 | 11/16/2021 | Dante (Kuo-Jung) Su | Initial version | # About this Manual -This document provides general information about the CMIS application initialization support for SONiC. +This document provides general information about the CMIS application initialization +support for SONiC. # Abbreviation @@ -44,21 +44,22 @@ This document provides general information about the CMIS application initializa | **Document** | **Location** | |---------------------------------------------------------|---------------| -| Common Management Interface Specification (CMIS) | [CMIS5p0.pdf](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) | +| CMIS v5 | [CMIS5p0.pdf](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) | # Requirement Overview -This document describes functional behavior of the CMIS application initialization support in SONiC. +This document describes functional behavior of the CMIS application initialization +support in SONiC. The Common Management Interface Specification (CMIS) provides a variety of features and support for different transceiver form factors. A CMIS transceiver may support multiple application, and the application initialization sequence is now mandatory -for the dynamic port breakout mode to correctly update the active CMIS application -based on the desired port mode. Otherwise the link will be down if the host port mode +upon port mode changes. Otherwise the link will be down if the host port mode does not match the selected application on the CMIS transceiver. -The feature is built on top of SONiC **sfp-refactor** framework to provide a platform-independent -solution, and the individual platforms could easily enable this feaure by having its **Sfp** inherited from **SfpOptoeBase**. +The feature is built on top of SONiC **sfp-refactor** framework to provide a +platform-independent solution, and the individual platforms could easily enable +this feaure by having its **Sfp** object inherited from **SfpOptoeBase**. **Example:** ``` @@ -75,37 +76,33 @@ class Sfp(SfpOptoeBase): def get_eeprom_path(self): # platform-specific per-port I2C bus - i2c_bus = 32 + self.index - return "/sys/bus/i2c/devices/{}-0050/eeprom".format(i2c_bus) + bus_id = 32 + self.index + return "/sys/bus/i2c/devices/{}-0050/eeprom".format(bus_id) ``` The scope of this feature is as follow: -- **CMIS application initialization for dynamic port breakout operations.** - - All the lanes of the CMIS module will be reconfigured to use -exactly the same application. Mixed application mode is outside the scope of this document. +- **CMIS software initialization for the default application.** + - All the lanes of the CMIS module will be reconfigured to use the default application. - Only staged control set 0 will be supported - No speed negotiation. - No custom signal integrity settings - Implement the procedures defined in Appendix D.1.3 and D.2.2 of [CMIS 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) -- **sonic-platform-common** - - Enhance the **sonic-xcvr** to support CMIS application advertising and initialization -- **sonic-platform-daemons** - - Enhance the **sonic-xcvrd** to support paralleled CMIS application initialization -- **sonic-utilities** - - Enhance the **sfputil** and **sfpshow** to show CMIS application advertisement +- **sonic-platform-common**: Update **sonic-xcvr** for CMIS application advertising and initialization +- **sonic-platform-daemons**: Update **sonic-xcvrd** for state-based CMIS application initialization +to support multiple CMIS transceivers in one single thread +- **sonic-utilities**: Update the **sfputil** and **sfpshow** for CMIS application advertisement ## Functional Requirements 1. Ability to parse the advertised applications from the transceivers 2. Ability to post the advertised applications to the STATE_DB -3. Ability to support parallel processing of the application initialization +3. Ability to support multiple CMIS transceivers in one single thread. 4. Ability to detect the errors of the application initialization on the transceivers **Note:** The duration of the CMIS application initialization greatly differs from transceivers -to transceivers, while some take 3 seconds for activating the 4x100G mode, some require 15 seconds. -Hence it's mandatory to support parallel processing. +to transceivers, while some take 3 seconds for activating the 4x100G mode, some take 15 seconds. ## Warm Boot Requirements @@ -115,13 +112,17 @@ Functionality should continue to work across warm boot. # Functional Description -- The **pmon#xcvrd** will detect the module type of the attched transceivers and post the -information to the **STATE_DB** -- If the transceiver is a CMIS module, the **pmon#xcvrd** will activate the appropriate -application mode as per the current port mode. -- If the transceiver is a CMIS module, the **show interfaces transceiver eeprom** +- The **pmon#xcvrd** should detect the module type of the attched CMIS transceiver and +post its module information onto the **STATE_DB** +- When a CMIS transceiver is attached, the **show interfaces transceiver eeprom** should display the advertised applications of the transceiver. -- If the transceiver is a CMIS module, the **sfputil** should be capable of detecting the errors of the CMIS application initialization. +- When a CMIS transceiver is attached, the **sfputil** should be capable of reporting +the errors of the CMIS application initialization. +- When a CMIS transceiver is detected, the **pmon#xcvrd** should automatically activate +the appropriate application as per the current port mode. +- Only the default application mode will be supported for now, we'll deal with the dynamic +application update later when the synchronization mechanism between **syncd** and **pmon#xcvrd** +is in place and ready. # Design @@ -129,9 +130,8 @@ should display the advertised applications of the transceiver. The transceiver daemon will be enhanced as below: -- Post the CMIS application advertisement into the **STATE_DB** - In the case of CMIS transceiver, the **application_advertisement** of **TRANSCEIVER_INFO** -is updated from plain test into json dictionary format: +- The **application_advertisement** in the **TRANSCEIVER_INFO** table is now updated +to the json format: **Original:** ``` @@ -149,81 +149,54 @@ is updated from plain test into json dictionary format: "TRANSCEIVER_INFO|Ethernet0": { "type": "hash", "value": { - "application_advertisement": "{1: {'ap_sel_code_id': 1, 'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'ap_sel_code_id': 2, 'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}}", + "application_advertisement": "{1: {'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}}", ...... omitted ...... } }, ...... omitted ...... ``` -- Add **CMIS_MEDIA_SETTINGS** to the media_settings.json for custom CMIS controls - -**Format:** -``` -{ - "CMIS_MEDIA_SETTINGS":{ - "#": { - "application_selection": true|false - } - } -} -``` - -**Example:** -``` -{ - "CMIS_MEDIA_SETTINGS":{ - "AVAGO#AFCT-93DRPHZ-AZ2": { - "application_selection": true - }, - "Amphenol#NDYYYF-0001": { - "application_selection": false - }, - "DELL EMC#6MGDY": { - "application_selection": true - }, - "DELL EMC#DH11M": { - "application_selection": false - } - } -} -``` - As of now, only **application_selection** is supported, and it defaults to **True** if unspecified - -- Add a CMIS manager class to handle the application initializations in parallel +- Add **CmisManagerTask** for the state-based CMIS application initialization to support +multiple CMIS transceivers in one single thread. ![](images/001.png) -- Add **PortChangeEvent.PORT_SET** and **PortChangeEvent.PORT_DEL** events to **xcvrd_utilities/port_mapping.py** - - PortChangeEvent.PORT_SET - Invoke the event callbacks upon **SET** operations, it includes all the port config updates, -not just the port add/remove events. - - PortChangeEvent.PORT_DEL - Invoke the event callbacks upon **DEL** operations. +- Enhance **xcvrd_utilities/port_mapping.py** with **APPL_DB** and **STATE_DB** support + - **port_mapping.subscribe_port_config_change()** only listens to **CONFIG_DB** by default. + - **port_mapping.subscribe_port_config_change(['APPL_DB', 'STATE_DB'])** listens to both **APPL_DB** and **STATE_DB**. + - The port table name associated with the database -- As of now, the number of CmisManagerTask is hard coded to 4 - - Task 0 is dedicated to listen for **PortChangeEvent.PORT_SET** events, and put requests into the shared message queue - - Task 1-N are responsible for handling the CMIS application initializations in parallel, - since all the requests are from the shared message queue, only one request will be processed - by a certain task at a time. + | Database | Table Name | + |:--------- |:---------------------- | + | APPL_DB | PORT_TABLE | + | CONFIG_DB | PORT | + | STATE_DB | TRANSCEIVER_INFO | - ![](images/002.png) +- Introduce the following additional events into **xcvrd_utilities/port_mapping.py** + - **PortChangeEvent.PORT_SET** + The event callbacks for database **SET** operations. + - **PortChangeEvent.PORT_DEL** + The event callbacks for database **DEL** operations. ## sonic-platform-common/sonic_platform_base/sfp_base.py (modified) -Add the following stub routines for the CMIS transceiver -- get_cmis_application_selected(self) -Retrieves the selected application code of this CMIS transceiver -- get_cmis_application_matched(self, host_speed, host_lanes) -Retrieves the matched application code by the host interface config -- set_cmis_application(self, host_speed, host_lanes) -Updates the application selection of this CMIS transceiver +Add the following macro constants to differentiate the port/cage type from the media type fetched from the transceiver +- SFP_PORT_TYPE_UNSPECIFIED +- SFP_PORT_TYPE_SFP +- SFP_PORT_TYPE_QSFP +- SFP_PORT_TYPE_QSFPDD + +Add the following stub routines +- get_port_type(self) + Retrieves the port/cage type of this SFP ## sonic-platform-common/sonic_platform_base/sonic_xcvr/api/public/cmis.py (modified) -- Add support for software reset -- Add support for activating the CMIS application base on the host port mode. -- Detailed CMIS application initialization sequence is available in **Appendix D.1.3 and D.2.2** of +- Add support for low-power mode controls +- Add support for reporting CMIS application advertisement +- Add support for reporting CMIS application initialization failures +- Add support for CMIS application initialization + For more details, please refer to **Appendix D.1.3 and D.2.2** of [CMIS 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) ## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py (modified) @@ -236,17 +209,36 @@ Updates the application selection of this CMIS transceiver ## sonic-platform-common/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis.py (modified) -- Add the meory map for the CMIS registers which is necessary for application initialization +- Add support for CMIS registers those are necessary for application initialization ## sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py (modified) -- Add support for CMIS application initialization - - get_cmis_application_selected() - - get_cmis_application_matched() - - set_cmis_application() -- Add mutex lock to the follow routines to serialize CMIS application initializations - - reset() - - set_cmis_application() +- Add the following routines for CMIS application initialization + - **get_cmis_application_update(self, host_speed, host_lanes)** + Check for CMIS updates and the new application if an update if necessary + - **set_cmis_application_stop(self, host_lanes)** + A non-blocking routine to deinitialize DataPath, put the CMIS module into low-power mode + and finally reactivate high-power mode, the users are supposed to check the module state + prior to configuring application code by **set_cmis_application_apsel()** + - **set_cmis_application_apsel(self, host_lanes, appl_code=1)** + A non-blocking routine to configure the application code, the users are supposed to check + the config error prior to initialize the DataPath by **set_cmis_application_start()** + - **set_cmis_application_start(self, host_lanes)** + A non-blocking routine to configure initialize the DataPath, the users are supposed to check + the DataPath state prior to turn on the Tx power by **set_cmis_application_txon()** + - **set_cmis_application_txon(self, host_lanes)** + A non-blocking routine to turn on the Tx power, the users could later check the DataPath state + to see if the module is correctly brought up. + - **get_cmis_state(self)** + Retrieve the CMIS module state, config error and DataPath state. + - **get_error_description(self)** + Report the CMIS application initialization failures + - **get_lpmode(self)** + Check if the CMIS module is placed in low-power mode + - **set_lpmode(self, lpmode)** + Enable/Disable the low-power mode + - **get_module_state(self)** + Retrieve the CMIS module state ## sonic-utilities/sfputil (modified) @@ -256,8 +248,32 @@ Updates the application selection of this CMIS transceiver ### CLI Show Commands -With CMIS application advertisement support, **show interfaces transceiver eeprom** is now as below. +#### show interfaces transceiver eeprom +This utility is now updated as below. + +**Original** +``` +admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 +Ethernet0: SFP EEPROM detected + Application Advertisement: {1: {'ap_sel_code_id': 1, 'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'ap_sel_code_id': 2, 'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}} + Connector: SN optical connector + Encoding: N/A + Extended Identifier: Power Class 6 (12.0W Max) + Extended RateSelect Compliance: N/A + Identifier: QSFP-DD Double Density 8X Pluggable Transceiver + Length cable Assembly(m): 0.0 + Nominal Bit Rate(100Mbs): 0 + Specification compliance: sm_media_interface + Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 + Vendor Name: AVAGO + Vendor OUI: 00-17-6a + Vendor PN: AFCT-93DRPHZ-AZ2 + Vendor Rev: 01 + Vendor SN: FD2038FG0FY +``` + +**Modified** ``` admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 Ethernet0: SFP EEPROM detected @@ -280,9 +296,59 @@ Ethernet0: SFP EEPROM detected Vendor SN: FD2038FG0FY ``` +#### sudo sfputil show eeprom + +This utility is now updated as below. + +**Original** +``` +admin@sonic:~$ sudo sfputil show eeprom -p Ethernet0 +Ethernet0: SFP EEPROM detected + Application Advertisement: {1: {'ap_sel_code_id': 1, 'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'ap_sel_code_id': 2, 'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}} + Connector: SN optical connector + Encoding: N/A + Extended Identifier: Power Class 6 (12.0W Max) + Extended RateSelect Compliance: N/A + Identifier: QSFP-DD Double Density 8X Pluggable Transceiver + Length cable Assembly(m): 0.0 + Nominal Bit Rate(100Mbs): 0 + Specification compliance: sm_media_interface + Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 + Vendor Name: AVAGO + Vendor OUI: 00-17-6a + Vendor PN: AFCT-93DRPHZ-AZ2 + Vendor Rev: 01 + Vendor SN: FD2038FG0FY +``` + +**Modified** +``` +admin@sonic:~$ sudo sfputil show eeprom -p Ethernet0 +Ethernet0: SFP EEPROM detected + Application Advertisement: + 1: 400GAUI-8 C2M (Annex 120E) | 400GBASE-DR4 (Cl 124) + 2: 100GAUI-2 C2M (Annex 135G) | 100G-FR/100GBASE-FR1 (Cl 140) + Connector: SN optical connector + Encoding: N/A + Extended Identifier: Power Class 6 (12.0W Max) + Extended RateSelect Compliance: N/A + Identifier: QSFP-DD Double Density 8X Pluggable Transceiver + Length cable Assembly(m): 0.0 + Nominal Bit Rate(100Mbs): 0 + Specification compliance: sm_media_interface + Vendor Date Code(YYYY-MM-DD Lot): 2020-10-07 + Vendor Name: AVAGO + Vendor OUI: 00-17-6a + Vendor PN: AFCT-93DRPHZ-AZ2 + Vendor Rev: 01 + Vendor SN: FD2038FG0FY +``` + ### CLI Debug Commands -The legacy **sfputil show error-status** is also enhanced to detect CMIS failures +#### sfputil show error-status + +This utility is also enhanced to detect CMIS failures Example: ``` @@ -290,22 +356,32 @@ admin@sonic:~$ sudo sfputil show error-status Port Error Status ----------- -------------- Ethernet0 OK -Ethernet8 CMIS datapath error -Ethernet16 CMIS config error +Ethernet8 ConfigRejected +Ethernet16 DataPathDeinit Ethernet24 Unplugged Ethernet32 Unplugged ``` -Please use **show logging xcvrd | grep CMIS** for the logs of CMIS Manager +#### show logging xcvrd + +Please use **show logging xcvrd | grep CMIS** for the debug logs Example: ``` admin@sonic:~$ show logging xcvrd | grep CMIS -Nov 12 07:37:26.176160 sonic NOTICE pmon#xcvrd[36]: CMIS: Starting... -Nov 12 07:37:26.176513 sonic NOTICE pmon#xcvrd[37]: CMIS: Starting... -Nov 12 07:37:26.178932 sonic NOTICE pmon#xcvrd[38]: CMIS: Starting... -Nov 12 07:37:26.180756 sonic NOTICE pmon#xcvrd[42]: CMIS: Starting... -Nov 12 07:37:26.180882 sonic NOTICE pmon#xcvrd[40]: CMIS: Starting... -Nov 12 07:37:27.317755 sonic NOTICE pmon#xcvrd[37]: CMIS: Ethernet32: application update for 400G, 8-lanes -Nov 12 07:37:27.388256 sonic NOTICE pmon#xcvrd[37]: CMIS: Ethernet32: application update ... ok +Nov 19 07:28:53.878758 sonic NOTICE pmon#xcvrd[34]: CMIS: Starting... +Nov 19 07:28:54.571593 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet32: 400G, 8-lanes, state=INSERTED +Nov 19 07:28:55.359298 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet0: 400G, 8-lanes, state=INSERTED +Nov 19 07:28:57.203301 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet32: 400G, 8-lanes, state=DP_DEINIT +Nov 19 07:28:57.874821 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet0: 400G, 8-lanes, state=DP_DEINIT +Nov 19 07:28:59.550191 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet32: 400G, 8-lanes, state=DP_DEINIT +Nov 19 07:29:00.287885 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet0: 400G, 8-lanes, state=DP_DEINIT +Nov 19 07:29:02.059347 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet32: 400G, 8-lanes, state=AP_CONFIGURED +Nov 19 07:29:02.781345 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet0: 400G, 8-lanes, state=AP_CONFIGURED +Nov 19 07:29:04.504715 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet32: 400G, 8-lanes, state=DP_INIT +Nov 19 07:29:05.210270 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet0: 400G, 8-lanes, state=DP_INIT +Nov 19 07:29:06.877637 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet32: 400G, 8-lanes, state=DP_TXON +Nov 19 07:29:06.902918 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet32: 400G, 8-lanes, state=READY +Nov 19 07:29:07.545593 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet0: 400G, 8-lanes, state=DP_TXON +Nov 19 07:29:07.581243 sonic NOTICE pmon#xcvrd[34]: CMIS: Ethernet0: 400G, 8-lanes, state=READY ``` diff --git a/doc/sfp-cmis/images/001.png b/doc/sfp-cmis/images/001.png index 6058aa7748481f5188c53527621fa7c8390c9414..c764e234ed96a9eef5cb41949cdb52add6770ad0 100644 GIT binary patch literal 71280 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¹*a*HkY+`#{0*FX!s!yYDU*%^wCdv3>j0 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%0Av~9|AO@8>S)yQIRtd$J zDCfT0X_HtRHEt^kA34xO?G+T=Z0h8vLK4!A>Rwwzn*Y*PoL|DrTj9wIeHgA}`m4XM zGU(O#rRYG)o94745A35ODta(U1H^x?6(mByXX%5{uCA`q>In;Oh*W&zzx%(Ty0;}W zeJVEf>*QY)D`i1+5Yqr57Qx7z-bLUpA(1ZWWI^QY)g}i}P;Ou}_eX)wSp1HV*BxLv zy*xN$>}vXUYI`&yZs)@2A`x+ls$I`9C=4*~C&FF^H51h{?0QhWbC` zA(~(jxh?iL-*AU#*%T#8XBIP=9$?-)_bKs9oue0XB@R%D@H74@y|5Z7?cjeR6ly$# zLZM)t{PN{)J2)-%pw#GAkd@<`C={Te7-4vyuzDzXPyDAiUhRo42h(Wd^9GU^HXhvgiOf?-S7MSWLV)@2!i8hYIbI*Is%kX%;L(8L`cH<@VF8QiK<`hGo zJ)nr0_i5WaRxxB8s#718OmED3E=!bCjlP;GXAEe8sq<+O8bA!by^Er;{uxX$rWeMl1IXRU+y$h}~*hRr6v934gTpUCfY5-dmbWPnrzW zyxspMS1XQ?Ywr5;Y9va8UP>=BCC+iw_>RZt5^&nUine zjQaH31yN!M6WC*4uKkr8S}FOrmSFI9x2o0x?AOx`@w)H zZJQn66p&}pEZg)U0Rzd<+_sLyXSN4?52nIy{OgebS1eLyF{_B*pJBFi=i-`P>w$_# zg1N%4_=$BN8Uaee9~NDC@*;+dE?Wr=R4(@xeJ<3TfOmSHC8icwLGV_t1iIox8AD*h zcZZ>mHZJ=m%c?w9Cvim&FQRtQ_GK$JWu+!{X-~e4k8E3XWrMbD3LCM?rZWT2NFyS{T`Nm)XPY3|TXDvd#i(RElflkY+2{D#395D!81`%#R*H z-G6#7!=oU-cqP9upS7ks&f`-59eLVNorB|Xirs? z+->Mn-L>mL|8TgsPQ&kdo$!h5`-sDBx3#%OXKaG4%^S0SK3;GYHgZK_wMsF|z35bw zxw%)@Y1x^Vw!k`|B$qPRENE56lN(4}>IP$UD+r%f;Ai~pqeq~*8!OYcbqTCHnCmzOo^-Y22v=bJ?E z;jn33T#G6Ju*F6Tq+ZbcKU+G|39me~6rl!GY!wN)NmfTAjdoQ|dkYZ4i59#H11FDh zgk+dBvneQ%i_>#WES4vxz3qM(d^LBQE8V{ypVT6^lg4ykP~;PbS^V)Q8_4sIb3%qc zjO*A5N^(DK-j-Q<7m5-uxOeiNDm~u%1=$VQ9rHcg3x6^5)vCd|EQxh>jmGDwQ%u^k z>+t8<$d|x}wWsbW-G|$M*j9Ij8BT2vLtTv1qA6<8n);%Qtrcwx;!kNjN5nuk*^QJb@k|*xogsfWbSaN+PY$ zP$BC_`aS_uU~}_^(TM4o*dg}04Y6|N?a0v!B9t0@Jfy>Eo#xPO)p#8Es>kwx{ z?PjexJwr3kzD)c4;okTOh>nB_=R(2!s7NhboT|M9p3;a&ty$H$toW0W{DGV{7F~w*7Bt|=%`!Hh@Gx8! zno1#%NpP36wrGDYTWQBglgZRj6$4-Zzb)O@j9>YOEWvtHt^R&N5g1(J8S6YupedXU z4P^(C0^6*mrT?eBvkZ%JZTJ3|AV|0j6a-``AgwS+gA$^EAl)I|Lk|q40-_=%0@5Pg z(#;4;Nq3i&LpRdzIl9)fpS|Dr*n2Cb^%yiN1S>&VEcKn~{xg@L4n6TURDYtCN6^W`E(+f8lQIcB@*;+2-F zrVsvqJFuD$k5}ppSzXS9&6XS z*&7+E5%zXE=PRM&-4p8EPb5B*tF~9`X2ekm`u0K*~Jqx^Ob2by)9Ts zS&P%O;rg=MM%X)tB+CPx@09Du!;MT@s}93?#J-3&pE=wtzQnFw^8L$p@AAWk#nHaI zJz?7MPw0F-f3p41%_(8GLQOHvxl@EGglrSiF|@rma~-Vc&`Z_eMZc<2IGP#C8PMrQ`3e{{ z?qKFu;6=XlHM+xHq=RjZQC?`sBB~g%FuiOK-OU=di&NItEnLRc%G~EihwYcO!b)Sc(`Qg@oH(exE#va1j`E^uT)E5GOVf5C1 z(|WSH&LB3eoNuypKt*-QYN8pMpW%^z%*CM!_Ku_2X?qjRAS_r4&m*! zh>6Ix^D0L|B90a0-$x2x!T)v24-(~0yH5JM%c;{3(9c$GH`S$)XE#H9E|+8+|GuDvUTuiqLP<7&5YzKDZi-Ddga zY)Zh4<@e!ddL$$8Wylers3lkQ$UHlLK3uBwT5 zMZ4};lm7B@_mkRkRJW^>S>sN0S27IAR$b`-dvceTt+Q78iF*V+*@fJQ1$Jd)9`y`OCn;W=GU7}#mDAjZ~fh?f@%!YH=oTO zm}DOqK6%GwapLpqf~ozgKPTObSzdU%lpDe*a1Yb&$@c$~|Gi%qme=9i`$&}j66^S3 z9b2o6T=b7Q4Fu_DN6csU>F7Jj)I7U;Om&hjrXFX|$-cL(y5>w2Xl1)?HRT4DOm zYftdqCh}?ojg2IXd|bW1=*x3t<<9W&E9qae1t;5YW#8Adm}a>zxS;GN4^u&Zk@yYo z@{yNJh`aW1aAMf6oQ+Sn_ynWB73!RpZ}y{Efs0(nE4FEPsw(Tr&oA^8pGR{c5Rc#} zKnXFA7QEm-2Yub(6ghtoFWQ@2)C{;B7^*Bpvou}wB^7~KlSn4elGCK?44@)zi_m|5 zF#+S!WOTJDU^xA~UZAtN<>bS*m=->(eH+>~m_T`Hc%C0qElWOM9zZ!ZpxEsbgxu{JzWXLtX- z_`DtBukN>?!?#~(*m#<+&dw)d@F9wwPnXBcJabQO!ci07A9$fZ*f6WJ{`&F4n`c@d zQ5W!U@ajt$GTw))5?xDfSKu#mpfd-@T(qmG9Dng1q5&I1PNDWGq)4RGY?JZtrikI- z@t>1eaY%f*rK7zxRho}L>;>bVF*xj`o1vdY!?2Eums)7$Aw3h)Vjjg=19Qe*gCO{T z?IT8o_32_5qokpi4|-($twh7@O|A>LNDy$rWr9P5KkvxIZ=7OrZQ6f14pT4=f3Hir5e>0nIlCz87$MPKIGM8PO*jKN%zEP z%zg+Xo}Px%(U!#>>DE5~v|N(!32RrbiaZ#ZLnpj@F2*l?1QHGgAucOeNqbRu90PwC z8$>MKK^GOFSL3d`z?_Rt+BaXW5)yDAVm?6OV3L3b?}k~})n(Kn!ySh6xk{REd>e5v zVYZ0~^(=|FA`sA<`&0O!<3s0I@H@ETXuv|7WY-ZzY<(m~Rey=auQVUZws$SD6i54R zv*WUzVJ&f1F~H=$jkUbR^!Y+`f&h#BeK?R^_U-^XJ8AY#;`X6)V4WCs>|wVbtWBdE=fv#9xgEcgVAFj8`nJ47FYgwnJEt| zaFd#A%*Dvwqc{#_I8!WLER4%$ygSFVi7irp9Tq8b(zu$>d;_; zftSsdcHN_*%N#m1b*&DJ_ll{Kh$r5@J&L8dDg-*tp6n4Z*^A+7*0kL`qg#rpnrYb4 z)s{{P6g}$5*kY~@nx}VD&#%1eLNTF`xM zDW-U|x4t&=kQTcxKRApNYmsm-G=kWxVS?6!c(;!wTY88J^SWcmWw$@>w|?vUZX1zf(bLnVJn2uodstc-SpEMUA@UeOk@nlNf7;jT!W2?Y~?KXF>^{&)`s-}~=bt%|AGIjN_AX&dg7uDu?b+pA)+Dz7Qcy)*z zj^{&Tg=a>aj;2TuFJoJ%)|cN|xuTPXDcAagZgJoOZ$W?;XMK>m+hZ#r8?S^B5x_-2 z{P}1!Okueb8GeX%SvS#4lweMhn{>V>Z`<*3JyV@!jJA0P)_4yOwtC_10(^=4!+jVh zr&~N=F-)4_;_j7&zazUUUA+8uU1)pMD57R)^jv$oGRu14X)$G78kguxp|M006PjJC z@==@3Z#{QMYCn~uvfC^>s(j=L&-LV>{2f2-UBCx~_m2h(%9ls?yT+uCgdyhkoT;&j z^9(IpAEFcqS)XNZcD61e*WXE}*GeRKS_g;wu!?pA8=D<7Sm?bl!OLnPTdA9u33!Yg zX+JN-?_HRnuDp{-6r-cn!`;Y4nP@OeN`-b~Wm7JlNbsMbpQGn-mI}%|-s5$EZ>ec8AKeF*5_JpHE)>pB*A%E_@d~A(`9T(K zXr39Rz+CCYKbn%$Z6O=pQ<)Mj>Tve)$4<-0OWmTVt8q)c;=2Z6B-39bJu-y)I^NIeeGy>)vu^p;nL%Ver97_4kis z5+**PXPw*UYY%m5DIR5PDVcd7`BpA)R}p)~&-vJL6}caVPRm0wd_ecL+~Ryj4%>N~jPE<| zbz=osT4Ef#@nPcju*3fi=atVBUIe6jscx9<#ZuFO=LBM276LauR;o4# zF$~SNLTF7nR-55Bd-n2${M|*embkmHVlh_nTDJ#DrpM9GwtHq44MTKUo=pmagD51e zmn!eyVn}46SjrpMK&s_(?b|n+C-HqMT}at;?js?w;rOF`WxIib>wQ0#85g1ih>;?b zmrRlwWgQ&Z5Cr4TuL?>`@OAaMD92Xd1CD6q?k?eR_w`=7ySFFLEgvwxVNuM0D6OL! z$%8v#FxEC9^X;?Bag2OB;PW-134K$FaT#;@a zdYP6RTW7aqDehW(osKB^)rqH>!MF}VGnTJ#PZJNM(Ao#poB%D4?4}*NKx?flmR9JkRg`<@asrfmv1yiUvgX|!ZHzW5rw zg+=0eU;4Z_NC^TOv!}hm?Jud@P<&SBqh2FABc7~B~$FV z`aAbG*~ij3Dx%i|;}4E&qSFq?AdKOu+K=v9druh!Q&F&3{R32m!B9J2*UVUn?U$a= z8q{%=YP0j#axnxxpFmeTV@kqn?2|`M)oE%F%IVmRN=|d}dIXjAEccS0CB?BGe9=pd z+-NR1z(r_c2fBqmMlIIPZ6tTQp&X4c-kQush2dNXv?FPyCeDmSiGjd~{oT;I;L649w7t4v25 z-y}tpJT3REPH^c`dD%vGrO!mgu}X3En;v~zPWSD)+tkYH z$Avaa^PSRxTdxEn?PUm8m9tla2|S}B^tkohH$_AW-ZXVO40%?RrY|(Bn-y1g$nF31 z6p1K~6G6xCGG%t#LK(rQ`mr)*?oHsgl(EmIO&lk-M!(p*!HC!YjolH%)>_^tr;+PtV8pqBuuDat3M0|^b zLQ_h%uco)|xld-vKH+AqT2k!ZVoyK&f|lsD+q-X0+ane`*_EN+2t>U&l60-p122;P z*%BjU)A=*U!9eEIM-=0wxKjv5D4h-b$~%)Y^%Y^t8>VATS36Nz{mFFnk0!pn69#)E zFBciTf2^mB3hfEHLD3$%+4+<=8N!lVO16z3=mIO&J2Vye!}B(=hpW}Inh+!gozC=q z;q(6d{yd6JtIVd>cR6b;IT5cBPSLESsT)H<5EZYoxUm&|F zQTTM2z|z?uPWMVtC_9>I5_T}AhmWxpt7un_kBKshORvs9-K1w>jNF!Iu8fP>Xoh+W z14=r#c>|&}k&#{b%_QUWxbH>1#jyge6W|xrd4EVwK7llb|7V&fS|O=ZAa&BcsKUME z41Q7x3C2y_;7jp`sd~>^wW5EFWn86dWd8eX-`eL~hrQm)(%I2+Rz>H~W!eg*IZZdu zozF?f=Kl`(IG2svsh|N1o2Nxzrh2$rWP0^5B~~wCFZKi}cBf7mHg3MgY&~OzG67Mk zWbS;bnUT4&r7Fj^=dI(228sxpM*;M++BbJnJNhJ@mHiY{wvRo>aeedDu2D!sZSH7^Gf zN>}@=GPja}Y&_59Z>`aV6%vn!hSeKR!RY;vX3Kct(Ra5}T)t&kG@2flmiy&TkG}e( zXShzoE(U&-fow-jaqW0LfwIWf?;4>htqIwc;F;E{{;`ayJX}nrawM(#!XJpMuVlyw zV9c_OQNfr!b?VcUTga!|$YnO9&+w#UpH;8tquRdvE*I)oyc0V2eFy8|NPBce&OmTgY z3y*ez94k4HXK$x4n)`@8BL*vMzA)675t>tymJz>?WslfSISg*nl@@d!U#ULf>;CVG zdKluOXc#}MbKm*yQ7>z5ZHwc?e)N}q`Ob5+_BFMhS{aCb_ysy8aszNaMtY2Ljo6A z`un|P0$(tdT1v4X=Qi{ot3pQ<_`P<7pYF_|lYa6H3RVh&{d7->%ka zyY+ZTd)n*`f8~#%S0csNT%Q%Q7?ZAz>Kg8=mIXuDqDNeHC?5_{-hAq+F7C8v;d=qK zhdK^CQ1nZhwUtsdpe0Lr*6t=w;M#KeN7hcqM(b$$+a|#nBE(#cBZe?$RLPy6Qo6ON zW_7*p1fxVwfX)l%>TWfph$G~#Zap`=^=wEHgxOtR9@7gCn+WP!!^Q?QfRTA?M2mb-e^UWd~l19XYvNLA7vg53BoIu7-;|-FA#;(f|g=7dr zOrVP0fWvsAJfXaE>$^ylpi9Tsx9glAvp$X5RShe-bzJDbU+pc5l!gVrg$g}=rF^&+ zvxN|(ju^Gq?s}Ezr94AR7L5$RO}48I|FWLAG3x_BM)X@xct3(+01>Km6xUHt>@ zn0`%D%E6eU^<&OR&dS-rU`@wI+e3jbnB#NO-BBfRaj3&JGF@5;nNLt=o*-Buqz`{I zbC-k9rt|WsjxE|kUkK4ALAdhRSM~~Vn|cn(wxdqyGc^uck+EB6==jId-d~)5^ugEn zmeMQgQtoEIkzJt>Be+#|m+MDZuRHb69hy%pZ_Z3U1iJLAr=y<+azzweti3cqHFw8TRCUTr z6k#EvetEii5J?7Uxa!gR7q*828pT_*`~Bm<&?^L5BADm_CmZe9Gb{^wJ2;^4$Ug!$ zc3fLYv(!RcN3kB?eZpgjOD4&(vndz*5lh1XHWx7BUhPa%`orIwH@?2g&OS8`O-nG8 zXSOF2Ub(%HKUps#04kiV?CgN%cK{bZaz5Bw&Y?N%o>V;CuOPM%6}a?7*2a$jhAt_(>F%60*)ln1U< zmHlY>DBAx1U@j9cmU`mm#!Cj#lwVbJ(px5j&m%b6^gq7;QivKmj44)aakk!qV$|-o zHF7Zb6>sUU&qH#L7`HLpt=okiE-Mt)Z(i+DB6@lBOPn(tIX~*?X8cGU^{#91T!3hx zsX4S?K<(~^za0en2gM@%4lAEBSURI0xjd0l+y1l~X}^7Xv`akY19i;jGmC_h@shj* zF~^^tu#KsbAJy5)p zeGJetQqt1E%JC)#@T2HU(5}K!!mo98QdC($KDh-N{V=XMhcW;k0}cz26pV3h3OPW6 z#CiY)1vn`Q_xT2L1`Jjj}g&F9eO1kN_zk9P;3eczJL=Fnb|72n^gVVub9H$5fP;hW_ z?rjf_mYMIOc;yS@va*03HQbFt7HuUZ1u} zrp@~GTQf=5vDZS8+0ff$m(D$xy$Agb+>!PU9@~76U)prD;%x_75U^^Uot;7L&b9~E zfdb&E{Q0uY4m$)RO|@ZYoutnbzD zweWJmD6r@q7uc@TeFe1j{QGw^C&3zIHt9$^+Y|dDfjTA)2ZP}I6b+1O{4ltiTpY)R z-2oRvkln(*NOg4)ZBLG_2%K;%9>p}-#Sq}$_T$Z`qIFcX4GpJ&fS{qS&gZnCW>)%Y zzAuNT;LyJhra0iTBPALO61cdv1#0A@qj5O=cm@C@S%ujL^9QM5dW=Pk8}Fq==GiCt8L-}$5mi@Y=Ffqs+yWw{WBO6 zAZG)1Bc5$^0PiCSrpL|@^&9ZA0O&yJ&w#}L>CP_x-eD^FnFu86lz}oFj3E5w%Be_x zd~+8Nq#%p&5j}VL@=s7916`}z=>sxChVV96s8XrAaN!;9K*kHkizmng+u^g&hrka# zRH_ibM(nQ!e4S2a;%AuPh7G%q@XbT}PLojH@CJ$j`~j;x8W0@kj4;Wq#&qK?ieU~#}?9`p}+`T5GsJ%DotrJoo@_|q$kglh57lGmAlsc4n68CSX$ z;v?Uh>0fcOXi1?yg}@j59AJZ=lq1Z^A&^xzf0O-5X<|F?e81f~tJ(jf8y zdebGmcH64_%Gnn%4Z-O{A5pwkpHYSUPWKHgYHbZ%?A=S z&^+7E`@H!3a~C-)EkFnaVi8p(C1}*1k}uFq@N)2SQmxxa!ryP^DVXtS8v_GC^d->O zR6Wx`cM2XS@$vBhpbqN#rwa;mRyJ+?+tf1gMTNu2(9pDS5L`LnMsozf!Fh7HzXQh8 z!KV}Pa{f?Y9t{G83ceQTCR@ODdJsH)t$XB@Q1YUnzSm>_+6ld)c@L2K+w*;LgQM^U z0O_L*ZhIJaSVxjZKrLZj&cPv2kU&jK8Og)%1OGxG-*)y~T+srn4gjsdZ~-O+sLhe6 zKAZ!vAi(zEH%PjOAJ5E%!`tscgB%dB)S1)-xIsV%P+z(Xf;e?)^& z5RaDw^VZo}6F3?9k}yk!>fAYbC8epAwl3wrMoe_z{6=>7zfEszWv#zv?G~8fV7W}E z{n$6}OG>Tr_%WUi2J9{H^#=52QC^-Mt}{u+70_+~y8?0Vpi_QQDu^b`kdZ*vlG?+s zs_g8tgkZz{6>u_i;;_8HHG$JvsIdqyAJjDVa0U40AiKa%5$VDpK!!0d8F01KX;H&} zSvL9aXM7{GECqiFoSfol8RK8V8UP;x{z7Y#4n%lhcSCsQ%xzR~l|aVw6&ji<+sXUu zwKvRo{O=o7*;-1=`}p{Tg~~IBLbE`FgZ`{D45AIyvJh)w(1S+bv5LfEu|1|5fanFM zau?f-fxo6F8_v4X68sDS+I-OToTH^(o}E<%1YKw-H+1a`*A^9atr8mmj)EZL3>}Ea zRWh=w5GDmRJWQ|7pg zA%-G^A!Kp1vK)v8z$)krjfckQEy4o(33@Y}z^C*y*L+QM=1f{nWPCVfRHVw@9*lQkgDpMESa(68_gV11wlVrFIrUvN)|2FZkf zUIQFV3(weaiEToGmqOYCoLHVFRFb>@*K0r;V*0q`7@|Zxt2DA=`5n_2>nYEk#sxS{ zX2@6G^r{XD5AOqy3K)<;ZjxgN!2$gPzy^i;Dq)xG06y(A9oZuKa${oycoKDeQuqJv zMK5HQFEt19rnzQ^?&vtdS^$Dz;Qh2iYzT9{K&z>=JgCNjoCaz}OAtb}$Qj^Z%N(cOdF<`-gHBmr-2OtT-?Rga(t7jkj&7KiyC9MW z4kIYO;6`l4(rqfxS0`XDi&m!v^bC{8#EQOI{Y*!Iqk!j9&C0!mLJ>1`vgZI_NeI-N ze{XjmEe(GCIU(jv9wjowZ!)+Kr?qrfm#A6=r;?Y9Wdi$QQbHXVD{jBE=C-!YGakEs zGUoWDe?B$UPt~0O(?XaCz70nmY-~RHnV)oZb{0^%k`5CIZ02XH4wH*2T{+97yLd@7 znt!M1Y{Pe2St2^3bw6N=Of-wJA1tpyO?4v_qndu@Cs1i_;kf`UxV*ul53ih^Aunpa zwRO7it#xFMX7Lh0v|K?Go_*<4Yi3??F1Y&NYmaa=Zb&!j-NKvFRBh%2OBNb{B{qOL0rHpthz24F$eAD%nwXQS z_IH*=xBpuB6*x-VcJg{MIt4TeOoLg{PeaB%i(j~bwhOcIy?f85oxG~AO(z1*4!W5d zwX&MpP4CN~nCY6s-2{RQBs*GV4rv)I-}Pd<0$>#ZB)4XvxiZA~@Y=k|0eJ+EzXwL# z+S=SD#BDfI(U%n!f^_1*LP&fVqNPoN_({!KsR+&|05A9mX4JqDwJWdI3#x+ogc;Ok zth#`V1mGID0m0g8W3EkQ1vwHR8U_XiT9%vI><8s@`p5u<0PI|tB_R0%Mi)4yh`z)N z`*t0roEhM*Z^y^=Ai4*30FW@s%h(YsRGgLh54R(ea`^Kh0Ww8W;`o2S@3ZNaLGuGp zY&c1p0+z96%$>KgDVi0|tAOS!&{%|jYH3r~uLn7S7<%~A6EWa)Z6qk9xxt`?IB*l= zZf2HdF@Jh{f^OsnTjdNQVu39vy6XJm4JXTQr>pE*3cV)z>rLyxA}#N8A#f;z$7VE2y<4 z2y-DHV(&R&16$@MioaI-Fax(!v_#k zT|5V*Lg&t%gIH+>B@E{-ma9OKINKayAS|AyB(>d=Raet1pC`Hc*{S*4Hz^qzrN2_B zo6g7O=1FHt=|QS{X|fklav~{%W&G7r*?cwxjS?DTEp2TmAO+40wRcK)e(DChHgK6+ zowq{)WNNB0ggG=F;BqRbq{e(;2!~O@a8jF00&?U>0Dr=rnoz=NHgsP>UJRLJv%vf& zCQF6I--p|Cs7EC)WwpSG74)f4`|%+M`sukNIED+2M<)&r>=65ddXMo@@)HviUsO?-CQw_&cj18P1+YH=9!vUDPWRVLs4UE%qv@e;4g}r55LZ8IzovRFzlE&_!MzwxLdq!0xRvu}osShxXZkrDPXyD`1ll$U>LsYqr zRMHxNj|tD7h2P5Uxqu9nas-~3A~*0X*lEoYx^Qmpn)pJ1L8Sx#h(Vwb!>Qf-!VLNN zqJus!!cm8LVHla>I~5;k zFrr~+FLHaBrsOo&ji2ii6Tjx&T>nA|t_N0v0qOPp3oJIeJt|_DTRiHY6~3 z2mc5oiFdIO#@7*GI^IDUFSlIMSrnaW4aqCanUJoC9BhQR)8nfwC!xwhEpSTRf3qOQ z!7&}?Pk)}#Pn6QkSwyNZX!NR&XM`tOXyZLUroXkoGy-oO6!4HQ7O7t2_qO7 z#8-g|6M&+F0rNYS1@as$bFf5!QnYwd2#BuzzxB{6vW%ckS{%aW zn8XnZkY-XWs`-NYbz!Jjju6isuEO#_D)SffJWVg8b*=rgA96zfkB!Z9c?+P zprmv|d!Lw$3>H+37&cu*4x;(PlK7rarxs29z~3T+jX$Q$+f~fLd^G zA)PQkt#1~#3QO3lGIs`*fCWd)PjB!nQ^+QBn8;K`#{ zwbzPyX1F(BnbtE*7yK%)M^eHUGJwx#_@MmI!Wy@i26CsTr?a!A?O`kujFvE3oiC!p~z=;>S^yHa9j-NyO+am5m^c1=Wzo77F>miB5Fg$-ik{J``Sc{$OCNZ$5d2uEsKX?aQ7qRp92xM!U_D|xtt1ZGz} zv$aaU&&}=27XM7EcdDA5)7Y4ru7aYXfJY zcZ`+T!y^tCNfK`FwJ`j+VE36TrQI?JC)AOlOBp8I$VTZREns~CPAdjY*nj5u*>YMS z2-jgr4u~%V;=fsp`YY^x$~uyIL8^=cfgl$JEptRCPJ%^ORrNRmQ9|%Psdxp^$Ba(R zC)mKjykF{}6M3*TR-jZ`_6PW<3&9=!2TzFGsOhWk35DNW0zc7)PLj$r`ZnM&B1A#3 z06)Ek{+Eh!K}l4hufv!_GVnek!{BiF>zSLlAjN-5j)y@)(U1CHD*8?N*1{KiO3x{D zO+--q5(1(2=YOjp2zUDDO5)Crx`}xs{y9G9fYf3C@|(ZExAkw+=m8_|; z)(q&%6@XD*6FHsmxD$O0e|dO&|7!X2u17Xb{O`^|^80ctt4@yeaHXN&cF+G}=@h;& zqeh|4Kd!I_=Xs=J`QX_+Kw$$<_%GIA*Vgk}9sF`?dJ5rpm!K&d$l9WzE5pIp|MKfb zL89Io(BF{p(T{H&3%_O^ugNHP!q6pm{xJ zi2&PU*PzV^Uuqeu`p3^8PX zoL?~7{P6LRY)#~8^v2wH&$n%~rs=(>`1?0((A3U7zZ9NlD2ZdM89eBH4oALE;%`BC zFL@goMp01mj$X3h+GFa2rlifQ>%W-Y z8|T?KJ~2KK*`^WZb+jQ~ohz!^CrYzK>c4L&8U}-AujBb$#|^(^@;XTcde{fZgAyr}cby=)OMF0+kVaA$r)lwfv#!BnQrcke|bQMV}^> zpB`LxJyG&THsyB)0$aLapsGA~^=bvUj%3WQLe5JeYB^d_ijjx(3ik2HNJ!j&#QV+( zr$NEt#lV}Ze4Q1!Q0CS3*fH|=#N$ZeKrw;V3;@hvE9zHybu{b%7GY`%ig2(#`ML5W zBb<|y6Y2thHJhUrf(;}A$GIE$XfrQouqQMutjMg(xZ|S)+z+-kV8aKJy3YO$u%uHX z87@w**ikc6cvb*A6C>%^`i%{TG#fMXYRH_~ObVBvMhspfGiT1gZdblr&zxF@Y7+lh zsyi~fw$RAjt>;s#M#A(h_SFyw8&(jnadx(c!=?gNeJ)s_1DIP$MI|{gQO)|F_a;6i zU1h3(a&bYxm13ux{~=rVCdU_W&YV#%b1;J^VgS@GFk-<ak4q=<30_cxYIoX=U zt!rw98ba^`aM2sQREF!ziNj(&!9{+Ww9^+r-ca!${-B@X$%;Vm;?sKgdLS;Y&vzZd-0eeLAgM}I70FrZnO<72c!1fxm3H#5`Wt&@C zxP3iX;0Ew?tT*w0ZlT@@Pr(To*d)!rSF3WQMtLNE0-*=Q`-X?V(_^TU;OR|KxA)fwR=M$;Z$H;*Dnj{+QuA~=m8`~~8ukmH<^ z!KEmGZ0q?`#Dj6x|7)kjXs&WTyBs#HF0BVbE*+|>^H5ec;Pq?FOoYkdZXdP?+^8@Q z%SPfA()htEwo+}qB?vl%#o{kq>NaY@nc4aKDPLW>8hh5jK{=DI-HA z%iK*K3jQz;;fcuj<4WL74;5&rCxFqyuN{b4D1cqKpj1Br6A1}_404}=k565LPl?hQ z&THsxP9O_l%;WB+;{4>GGxAfqeoXkpM&%M!!E({WmCV zfz{qc8XBF)kM%gg1W^&L>~Daw?0^>wZG+K_V{mUF$*B(n=3LCMdN=!(gVE@)=xdXabQ1zS(^ON zvl)UL1Gi7D!(I+loI_$;y8p4)k9%HrB4<0Qo)Ah}{xm|E8t*e;-~;|01vz;42%i@( z@LqMXf~8PX1xLae;#v496kwq`3hp4ZLYNJxj13i-K{+%gE{?++taIOmy@!%p=fpp% z4na<-UK@0tU>?#Fe$iY8y5+Cwi#|z#iH(KNwEfzzV@hyR$;M^{vVJi9npgXFpYqB_ zg)|+ovpOAf8|DZOP%UiWV6el3!n6u!Mc`3kcO#x!6Y97C-GWX7Yu9pb))4F* zLfcVk1c2WgoDYGc2(XQG1SBj&6BD`jx9GUI6nBZCU^D}4F&mGIATFM*|!N!Xf0 zl7*@R0t;BQ;^N*8KcSHm5)z;@@SAt1mbDE*--We=PTU`T3*XNWzKU?PX;5cg#D0;H zI3Zd+s*ccdBq?AUq8&=9_{XN-qSn^~>;IjU{_oJ}Uk>a4%U^s1p$=~|ln>J%-_+6u zXiQ|_kac-ak1|3pWF`c+-sZMEhhM!B?4SFo{>!WVub-;;|9AY?@+8IHRgH`=VK}VK zpM`I>*6#GAz>Ew8?+e)WEG;92A0Za%|Ff3dIy%q$sRmX?-;g@xa}dxtOkmly*@$vEE;$lTb#lXP8uCA`O zwzlWbpO=)B3=a>RnVI?f`+xiP&B@7WWo2c0bw|Yai`}QTrOmzF1KbhrII?_z)1~}n zTr;v~p?z#sz_V%22x6bJz5xtwY$iSM149G}YkRLmb}n^I%2Kilk$*U(uKeti>&( zv%F*W$K*N+voN=|i<#c=EEwI`Ju*n{`!S8J?w*&Gm940#(9+UcUtc#jH*accnxCJ) ze*OBTOP8prsqfys`{>alcX#)QhzJ7%0~89?+1Z(rl45UfpMV^Rsu&!a-%9y9`swSK zprBw-P!JFZd{>0Ava(A4KG!(1vAMZP@Qwf9{GBvWWD^mcA#zqzRwu;5|F(Zb{}VL- zK=w_7u(6lzWwo7%h{)Y9jL4Z< zbolM{`b8ohuq%ZI+(Hk=!cUrQ}i~iWdRwN!)3OW^U*v0!Y%=LJoJ zQbex69i@hdbWgpEIDf3d^nuAWV<`lVN%6+|8~%##f?G+_@_wdm4xRiBoij^(?Ull; zcR;en)fu(bmgrs7ik)qfvCQLy*DY5!&bH~CpWYQ6_(nUb>M9$(xDRy@yy68t0?q5x z^YgnSK`nQ@QO_ub`Z-6AzL}cmy<2aJgk&uVRcQBurpvP7MrfA|U9*tNTs@Uh;dJfJ zNvRf#-o;Mm>GtntZ0c*`roE#f63=82v0q{j`G$*2y5oG>ZImJu4SI|lF$FE5K}N}K zL|-Lpe++oC8f`@f)<1B3*m%yT|7a87Qh#lyC2s{{V(V+aZeX{PwLqHJpSh}+vIO6E z0NUFbkoYmsAZF#^=``L$Orde}kVkSZ616?q-6AP1$+gs!FzYxa9?xU`x!m#$-*%6| z1FD`8tbV&q>sm|b5-wj{%Kk@^!d{^n_c=U;`g+Xt~|nc$83Ii(vSdUh5bMb)u#8z{zX~&|oqClSP9c$52DfhK}X;9IHFsi#020PUTfE%G&A6 zFDGjcDVb)oq=-0Vqa3r;&sVQf-~b!ep?1cUPsC!*((axdl;myurMaG6>WA#?a(>Ni zL@?=>h3$y)?mHL@1p(n2Y`5cm*@NHl+e-K73v#U>)_FaT3pWAc>R^QYZm*gToP%$= zI?Ytwm20ckopCpCt~|Zeo#VEsu_+5vddtFg-EN5NPojcY=k{2D?0n^xG=rNy2tFWxZ2<yl(dRgvsr?vV@-2L>+-O1O6Oanm5?Uu$`zV?wlCr=lcN;`c zx6N{9i^-COrx7}M<~SvuR-LTl(3SfhH>^W1vj#jG>KaW$B$#JsoF;qC*4{EbuL)L7QmE+(#;>x7jlm!W26G?kKjBe$|Md_FIWIHM-Y{K6txV@j55xelhAb#b=*#V|D2@ltaZxq1zwuPf;8twbhRCLxNurp7?Z`Z>_7T(0N zgerN@N_5hMg`C7&I2%xE!=$cHhtym(bozR}=h>YbYZRLRE5w-HfkU4|x+Ru*w^5)r z5gS+9w@-E0V2*a9tvLR<+sdv&=8p}FID87#Z9BBtEc;BNb*Lb_0u}VoiBFu3ZHctc zw0RCJYfMC7n`5mw;H@86Z$qca)OY2it0_HKw}V?kiy3T|T%r-j4*cd+^yeqS-0juZ zs5%C#9H+kp*@$;s=x@6v-+>p>4O zt_#FA6Oih+^ZrHJNYl_Rm4sW-RhP(2*XsI=8>8phOfpWc7Ry_BAdUG2=xf+XU#$m_ z96g-g;N4D3nA^p%wdeZnsBHOhVkZpjy8I9}@g!usTWuLFAg@$m*yE9cZtt>h-@v6B zT!S^S1mE=@XZ7LciM1R3P)|_d8vg?3HiVDM_I3ibcI~@@k4%rEeW?!hEF5kh$TvoE zQ}N%nbN$MDFqO;cJ8Ons#_+Fid34I0-O!H`Q&B|W&y?T$oIW=fO#^BV8MdAfcVw(E z4F2k_?VpwP&ERPA^_RgjJUuz++hoB9GD=TGv}0oXmsxl=fMi53jaYb+gDDF8P+L_aJj)%Bm&Ejl%|hY}iF%d0muBsTN<6)w)AE?YCSdx>srB<|=qgf(E)czn)zj*~ z#C88X5uFIg)pg>N>%DLN6E}Dyh+b*x z)#^Ln;`(}lsMOFJvYX0KGb*Z2L42TluW3$bz&mruHtE?ljTr=SIl#L-IrEW4=bhs2 z)W?z6Y#3@MTrW&+p0V$(Z19V-z3e>4FhJaJF$2m6^976#4pt6yRSDP&v3KZXR@`OQ zb=4N`ZQ<16?45M`Ijc=ixM$KP)p2n}Zk#%%J+r3IL%k+^)O)qcjoPF>S89;je=c}r zAU{7ez1MD!({cI=EtSo1v={$DNNdXEW?9-w*;%3?Zdbdp-K$Ez2Cm(0<_s>!`?)?; zQ5B%Y#<6;YsBxqunPSoR?4udDX9yxpAO6${a)@Yq%g5p`Z)GIL|gx4c)#SFMY}HNQQv^*yj)4qsO8vjW!5?C zX`Yj^RXSq|#13oonE76wKw`|rtTxQoC%4u|#m8O`*1Z*_UG+;8Igv*t4u1hxE6J=u z^oP>64c2miN3UaiN{Yr#CR5E^%X@mFIk}&6k*%TnUvty?F4{@Oph-Y5#}V+8Inoz; z!8116nX@i0564PUYtk~psI+Kzq+QQ>rN5asNXfA)22t%|WMP9d-y0CY6?RsBId*$A z)V&?o=608InwP*vV=OV#W5=tK28Slf+okcg)Ha4@Rt)j4dOhyM4?Q2_cWZd!6$wc! z)Ae4b+!#wMP^$3hFY?j%&dDI9qNX0+FlyqV-WFh``E0#1Rv))s`C6N}E4g(Pk1<(; zEb70codV6dM1l@SWiS^MJ%;KudKl^Sr2r@B`>vaS<6wdGW-3#L?2y-CnTx^&Bh>4! zX`$D)+3(eQm$3CLyWWA^mIp7ZPfEjlijlEkKK+F|M`*U?ZC4Pn4ZVJ>(Rfl}MHhvk z`vlFv$*h8IwmY$KjLALeV~NgvknSejA^D}1Aar&Y{r$alAHd8^XCFj$U|IOUQ>t(f zS^^0kzJ|mp=3lzRTm{WP4-8(t z2nCLISNmy>F*dL1oqq}_7$Nh`IQWJG-}Z|3L`zt1AUd!k!?*9vSO^^YmIaAb_}P=# z&2jG`F4|tx+%pBw^DORC=$7m!Ow10C%tEdnymHz1#6v0VTf#iq%bbtudS01~b)(zy zs>xrjm@bChW5;7)K0MX8?Gvc#&UIa>0NGiPK)r|MZ{O>9AUEt=j@<;O1YM7^dAqrGfX5b6-0xOWMutbV{@Q`048 z>-62Q5tHz(dE6{daJF|(bL^l3%8181{yA3Y|jfKI(%A-WuX zHS78qCHtJ;PDxloBUbOj;Xbt1O(Pt?i!=C~!bf*?q}EY*pOo2MBg)a$ zPVY8~y*X48i2y4#}M1&qzIn*tx4kyR1lmL}Gdi#DW9*7rwySa@hZjRV=V5x6B#yZ!9KfNj%){293R#XB<9O%Q7T3= z0Nr)33btZ~F@j}Xyc|y~m;H#`rnU`jT>QHC7rdIFF zE|uZ9b}4Kf`u2Ecx*X9)@A&680i8ypTZpl^WB43RXg4(fKw@tsJEWu@b+*%}XS3wa zTI6j*K;mrAklI%D8^q4X=7zz?1Mp;@p+PL77=5)--3FKY$@Zdub_irKVy_SUQe9&M zS-*Crd}m)dY3mSBCwDi6ffq6R$SDwnz6$#~9`HpL0BO4#cr>LdAWjXt|Cq%$KuP19 zTW8?$@#;&qAL8|pl&0ydRQovsVpjIlAF}|iK(q*<5QZF@&eCqGD)FLMPqaN!&5u=6P zd3m`c&-LfluQYnOPgL z)?D+RIg&l3SVgU1rrTXJMklv-iwF8hqeY!#n@e^Zqw! zS|kqX5i>5pJR+spbed~R0Z*$Y(eu~Z=c&YZbV%=9o;IZ)ib@Bv4FHHLEvyi%Q_S1~ zcX(^N)y6&oxHV8zR*Z&xETJa&OcN15ce7~_f7!mYa_n`rV;-ZXXS$9tzwT^xRfAVG zJbDLFJA?IqyZiChpjl4T%oi(aang5wSP7LdFKk$Alxa zlrRF~z9t0;tQu@Ck=aT|;c6KM2%?G10AxJEH$4LQVmIh}BLPl_RGw^Oc9xreFcxV{1OP?YC4SeRS5{Va7j&TZlT{zs964b!mhsP+Q zXZqUcl)pcOSpZ61ml26FP^C~m6LqUjd8kuDuV{2-$^E}~+ElbsF(YPe5tZ}#ecix5 zC;~=W3`qa{@PpDbxv3`eR@9anpfmX4giExSi{vj8biRWi*|XArddfL348^I({QX%n z3_d=@E|+~y?os_|=|K~OFMhM!VrUH`_}7M+dhIMn5E{^^8e6L+UB`izii^8fh-~9m zFrCKv;7F_En;<`5@xKON^x8r9<&qBol$B*FiOgwNFr(vRLuxd5&%azvX_sB+Nfh#F z&9T9$DNUPj6QgF|hjocg{ZOPI!olzoLH1KXVJ#AHI^^PR?*CSwnO0tWaV7cw9(^AT zx&E>{R?qAH1&5OCB+x(U!Eo6+tHzbnT}ZY-#1{1iTI#zLTH@g5GQsnIzFLQH zEE;iSx-qU$rr?AjzHJ}C8d*;)K>1M*$RO$5qUBygH-JhXB0Mos<-w^7A-ib24%_TYiU z&TRUvkcA{?JZ7tE6`q{P4zZK!i4Y);*}p2ybKBcVJ;{^*<%{(A4tnxJ(8PCl-&5{l z{WNz4(r$bQb*T2RGHnvL263T89a_c>av3MlFTRRQc=)LPn>lZeg~(|(t+79b9@lo= zd%g;hE7D|On6aE0A-~xjue!mmahN>239lZCx@ImnJM*1GN8g&GV*OniJ&~rk8*lFB z2>BVW3(BGM2s^G74R-Sejl6kcRI@HyblIjmZXbH9f3ZxD(27aId8`6ba5|zX*=F~} zFX?aTH6D(Lk=_!IqPMCs_}CglSsdRYE}k#UwsYXdX&HxJa*8I{a-&BA7u=_Id6T-K zXczIsl&8XT^lh%9EI`Ou-ncH5)m~)7oEH&z0lP>t7!z>q- z`+7Wgif54|m}!4DlVANnOS^O(2hVYWKM|C%dZ7>@6JGWe{QBm!;3@`3MWta$h3ban zW1X@_v&#w>i0SRnRLl)Outc%C@!}NYOkDX}h!Jmt$9G}~R;zi^WPzY0q|Jv3x@u2^ zC=Mp9P3wSTo=3Q%23B^IY#quVdk?|7YQ8!J5-4E)jv#XP3GV^7+u7Om4>but&EQ_t ze5RDqwj~(j0eQZJROxzRi1hiU&#xRE9#mE8sj6)}4Qjv{wATSooi+z0ax%aALIgkB zSfOulCHJ_9m0|fhR6gUqf!L7C+Rb84tQO*vBUc2Z%MnvKDJk7~Sql4}Uu$njZIrOu zYAuhgt;R`tkv{>WQx2<3Zu|G13GoM7t|l|Yc;?RwFh)IZaYUtO*LJcBfV~Woa=Gs zdyv)@k9>%U5oe{qvxl0JXx%G{CPT18rf6%91~hXp8iyhH8xSz(84hqf2e)Wn zxl0I3+*h#6h12l-k3W$yGS%g0PP4HA0*oHFpz(E1+_h|S?ft$?B`P|j;dyaG(+u<8pwqpqswtJE;>A>y?oETXnP5FY>PG&CSf9?Pb) zz2!5qcbYhF_FM1uu*&q&=Uf{K|5D`9gsmW+=oO^!D#KTW`88DE+mRSn72v9*Ems+Xx=MNjQ(EV)%rT9SBSFyXzb4-wH??`EE$sK=!k$bO2Jxvxj09NeRtQ@^TV zCZgttStspHxOZ5UwsYoGg>}|bS@y#0m^##wrOXnr3F87B1@n5b7F-)RRb7USF#io< zK0jVVMno-PFVWJgELMth9e+5x7^n+IQOpwmOR!`o-N_MwnGRu(K4rh>7IO4TRXoli@ZMfI3aVR zw_`Q?eGmCB)p`jz5lhn``I$}3QqWSi$cV6i&ToI&bmwrF9bK#1?Ate^Pq0?}DSfcN zkr*zIe2w&E%ewc=vZtk-g)WC~oqn}tGviT&Emki9rOZEI9=XY^C3JDvVage}WIP2TDb_^w zgqRT|JdiDPyjni}eKEVYWdP3Ar&DxEKsO{XPU3B&Dt;B>Zy=&f2)vGy;=W+1%GSVq zci{&V5J*_aC= zKUQAT%XjA^hQ55d`DEAo{IJ8>-QY;uw<7WHr*<}qyu)qdf(1i?sGQos94|h6n2pK` z*oq;v)Xs8Ww|H%GAG2bPm1 z_^6{f~Lne z$1JPKrMJT5qj=@A4wv(V_*<-Q48k*`rMcN7G2o2NLt5!9!20dOtTt2YU zRV^90kRTuZ5PMD6VaCtv$(vO{2g%*s@Cw^rTQV%-#xV@t#PqPB$!861K8FKXY2qe4 zTvOQV?Qd4;UoV4cN0+J0JMFP>8Kzx*>)=?dhD?h}Z2^bXyz2#OE%SpY6~flWl!7-u z0W%dEbpgt8MRZkd0+Cdx`0|uJ(Z4)cklxGX4IPtSg@KPedE$U4P{*g_J!WzQRUC)( zs04cPez{aa!WWPkb5Jz1$!a!Ln?s&5Snj!K2Sz4IBq5Six2Hfk+mhP6Agy=?JxwR+ zjLhnNj3a#D+2vgp(qI0Pj{_9-qja<$Fh`i>D8hxRg zn6nFboB@lzocbciMa<3D!^?&(U)TgdC|uu?;=@+28nZ6(^*D}qvCFV&Z*?HVzNe}S~P3|ReL;t z0GIkg@9YTgtsDxdi_UUQfwX(vyDAN|*+a!m9A|>^Fa5R>@d0R4K6s|@$!ydWiEF(U z42>S(AIJ|aD`OnB!OoTMO~)5v@M%rvPVq_60A!s6h0|*CQcw2V#g!-A5!6=1YzZpJ zlC&|$i?eQg&tv-54kUCMpEfisJr$@d#pkm5QXn+dD&IeIabKn{XBtT0{VSHJQRtY< z@AA#CjG9Am8|6ue6mQoNZ#;#L*nJ*}zUAalj41yyji%*FW@(BZG~h6%e{7lDnS9&C z2Fa_B=-otQKY7-3&nE;H!-PMSP)m!dE>-g`F4qQ5EP%MG7or z1#ZOR2ttjO@|Opw;FeUx&5%d!pmeRUdp*y?HY`Cm1h)cai2J?r&U-}@0OvH(D<8vs zjK^6W#fEQ^p!?Bon(MY(apCb)5w5a@0v3hz4-630ukC3rYlfdDcKOF=C%JFr(fO|m zo`D*kuQU0DTxZ!EF1>C2g;wW*!Q_`JcydMjFFb4_=<+m!FkfVPb1wy8_6BN1Sn-ou z=+nxiO?NNdBCT)e#{`S3uu0z?>Dc#%%X)`U{Jpwyg}vXwVjnI&CA_LnT>J;3a=)g0 z9&y|0dk|i);y|NA>)1^tEOxwPw2t)kubVzQ>Drji4?3vFX6#5UD|5bzi7X=8p zPG(Lm>k3RB&_&Wg;s|$7S1q5!+r&8n91+liJy5$;bZ8u245ZIzwUN$x-{zwaavLh1 z2SsR)zI6N76a@Ro55BILKuhLTwmarGLAgN2>jN zRG!qf#7KCW7vDy_sHuA7k^%%Xua}91zRM?9ndS?=rG$!A@A5EH$-cVzgNHUJkI>Kz zh92cAX|UhHTHW*j9egRc71iLlcmqcpdE0gVU+d@CtBYN~2Zvs%QqI`FAKfSiV}-C2 za2znd{;+qJS#FNAp)I4bioEfyQikFUwgMi6H#gr;U@kq%OiU}=Eq0`07m%)+z6Bcn zGID`u_Er$LSk3a$pP1&NVs{j=%HdWMTV;!W`IG z4Qjg>Gpl;RH!0@3b}e~J)O|bPv>wyqHi$GkHCdygH5T+-hMX`4lB1N&Ls`Y_=4-mX zktx-`cjI?j20zp@$y$?J4Eeeb^wvb3$Tz_R_|-#gL(`4&-YOTx0O*(d7+G|sSMwI=wK$>BVtA|#S_#w^Shi>08yO~>Y^&NlG4HuOy`+242{0#leQk?3h z`X9NtH>1Pz{4(fh z~rf>v7gIys7~@!(hkDZR70}9UO@fIrz5OC%=x}jMg=wS#d%uKsICq6 zyAN95b*;ScZS3=}YIr824)cxu$`d7}E(-}VdG;G6cXFp76c;VnZS}9%6#Dk?_>NS9e1G3iIarr7+*QRw(a|HccgYA*~Q_%df zzu~XDEQ-ty`L7MXwT65w>j_p0YkO`T3q!O^=5n0KS4q`zd_$`nTd`^OrR%VkFe2uC z12bg~DS2|&mx*_*?r=a+_mxck2N;(yc7D_PPx$Lz?hm^f7adn{SBw3{vV&i7#ogb) zTLZO!(EYr;LbT9q1AAq6sq(Ml+Kzd|o6%#}@MP)TpUARf)~o13-aJ_%`UP3FH-20E zKZd6NDASH~WUtXu7XF5|)zGGKzk>Nt5`eN=|{>e${pxn1$7&nC0J$7?P?uh>nQEQuj;L;zMb!{AvDf8T} zICll~8+uPQ;BuSg`2#=%)QqTJg8i>XC-Nsk$q}8RoEX^HfVVJbM@QqKT;t^6V8CIs zywKJ4s(7kx((^wHg11WHgV)Zbgb8EPxwM6(j60+CztCBiOj<&^1g@W!265#4LiluR zw~mDo|3mH$bx|#zj8%;Pp=c1&^Zw7$AhfV0GPG-BsqT1rG1|vv3$0Mtf{H|(S0VX z@#@vDg=ec(a*SrHuiLV(Eh`TzCG`*AmRK?1L{wVh~Nyq7U>C9zF@aK$5 z&z+C{f2Qr9vSF##hdCenk|P?FqVk^CV?2vnEC-7ZrNRBEZnL8yp^rw#7Chg z(8F-SCzIiQorRz>JZAKHcyAN1netvuRSkVvUTq|(93)EJH%KNo`9=u+i<#6=;MPB7E=*Eh4w3j+15oVLI| z6bvPetvoIsJ1wRlswtVsB>-gA?DLk&fW;xE`crqehnZ`z{KK5Q2uOn(O42T$vr}DT z2~90&N%a^I2ldgA>yCa8!CXjfF7gZxT-x*FW0ArI(-3%cGS`SAi`r)ZBSQnbHcY!L zC+5Ad0{N$*R>=|O{>HT~m#V0gJP{rzWsD?EECD59ZW39@Q^n+{Orp zGkV@pjjUAkG{DekP8Ck#QhcuNf_v1L0(w{(jxSANxn=@}16F96M}Q z3D(y%429M(uCql1Ee7VCrR0nlp8zI2&Ryo6BPQXj0X*|D)glPkiT?_IymjM*JvAbr zs~*8-aTG7@n8QsDKWy!@UpVI_7R-XS9hHM!tCQ|SaZ{Cs#0-|^Y_o6TK3()G1NuK< zG%AVZtcC2FP3>&{`Lx4QdbjNv8h^pH_Z%g-)(lbvsyiY6xWN|^fQ2F zKV}!y6u(-pk}}$q4bD8DBNmu0DLPp60Cm7Aui`OQgiVpHz(aRJX}S6jK*mwH%e9dJ zlhn2$fmNZZ(wuS-_!Xo{rJGM;v!N9z^nXE`Zs9cdeXxn8b&IIKrL~)Wk zwy<4>Tw0g?+xG7u8g$tavn~mIYjM>z{F{JzwFd5xW9q%I5P?~$vB6RvuDQ~7VAx9c zmxFK3Fmy)JS=o#a5yri^;uWTX6<{9(L$+kzuuy0mN#H%V310gJi+IxQX5>bR)j6?b zWNz<1&QzbpL%+CMNsh*jyqlp~(VMmte!C7bq~^<`qF375{N#|Vrk_<|@RBj4n6g|u zs~Df#v9P^;2-qs(KDjjoLR>!e5*WkC7J^mYIf2>pwFZ9ma&#K|8tmQY9-lVGHhvmR@7eeLt&@#UMm=rAZ>WhGrfPIXW(^dAJQOEOjN$88~Y^V<|i;yrwK4zuG)NdV) zK1wxf?vDU9xextrQsUsC`Afj1quEPubxS^>Cn&$TEkmRRD=03M3?ShI@r~f#B}PA1 z;@zb(p|j9KUjo;BSq7R83fjANQS8#g_A8VLFTR42{HGLAPa3>FzE;S`j9X?COFiAjl`bX6(7NqTvVRiRf>XjOPYL*&GBztu z;{y@4dNOTOZHfqlIx1dvXPl}Kn&VT0pM^(*#f}n26*Ci!@ip+?u zSKVaekNH+}jMgbTxU2&h|5RnUNS#YX{a5LtOx=_Oyn0p;MvTV97Xg0;MA?@Re%*uF zWxC%qv@%=6)6U4ZI;3D0+rMe+#>Qpy&$Z(H%Ity?M63{kRD&&JZ#xF~tftfKjv}&a-7vzw303UnONDH{8Irci zV%%4MH=4L8*Cc~oiYYxG#kD*~C)`eT^G48p!0V1bpxBb8$vs+7k912_W|rf2v&ckW zzu!MJwD=|pHbBe8$=WX5mt!I+!aqK{32-ybS-uGz=S3J5q+8?$-_~u=q|b~A5RS_O zb%xgv|L(iQ4a48k#pK*QPF4^hm5sK_@aO77$#2uxoT0?3fh*ce6zj(ZJldEX3)UNHP=*euFccKCH`GU-Ia zSm~+#8rp7H-kX|F((=miNpOq@dWg5Spn1WV4niA6JCu}(Sm`# z$K4N<*tkgDF8tP(>}|qvd~PaL)dNn~nBXS#>vhNhIHUux9h?*8$5#?-n9E)LW@=f! z0nI1R9j!r%%_i@cqHlm{zjQGL)B93L(Kj|yg2BaZCW~Z$h(K$ARoZ~BH+wu9MM;vH zIh9atSW~EF%IA^9Q}Qq)wP-4dgD)KZdc8sM-N!(Wy0nYFnL|^GbNy~cOI`O5HJ-2Q z(Yp>pZE%v%o8o?o)c+vDBf!o=lOYtkT%XD5V;Jo`a{x*&14)5{YIYSKQ;7Ph{BtoqBcIs&C+J2*&ADmBNQ)y5-MQ?Y zk{4sjk-4ilc@zW7jq!b+rxQe~azGI~4FXC{)(;BTXz2CGSLXkV1D4s!vn%4{;RmP? z%&r7EDt?LQ$CUcamL;TdD1r-*o3M-N6}EJXmd7oPdfJw7D8Bc+@+if>t#jb;2@bNg z<4lj0Q!8NF%R=KZZ5kVje=Hdi0H>0dyXlXfg2uGuchM#*t(@@?Xq6*JrA>4zNiHL- z!I6lMIxqBRWD&40lrz_=o@&+Pey=rhNNOvsQq4g`f6wa+Hj8wd8$)n?0lBng^6N-x zWaAuFOBFFMDRp7O4>I3~b<*@MA zLp&B6g}nzw&DMb#3{yi}McHxi{C$f2@QNHNz|M~69g1W%helxfatLeFNXEf+1>FFv z!RpExh>6sN&Od!vXZDfq5-(y=?tSDR$-)%2i=&s0AT1lC|GG$txJ_2a{5vOY9DpFy zIJgMg6>#wu&gDV4h8C)mGPx2F&5QNdr{FLia!VVmHAt9TM3$Lw7nEXQCnqg zy|Degpe)IWB{9b_JZ=+bI1($!HCl0?^83r?JCotH@{CV9%Vc;2xUTBwy}e!FC)Aq6#Vv1q-XaX zLDZr?t){#~#>e|SsX?0P8**~PBHkfeZmE8J)uIa@LAfE3#id@whxy!tH%2^M=5)|9 z4%U!aN4OxS z?r4aNj%nojU#*Agfa(vWmmMjsoF-kB%Z+jZ#&RUq!xeRu7)Vm1txni^;AGo#eoMIO znvcz^($R7@L|F~ahNk62>MZa1gWk1}4H(wiP#B@@!?K^Zt!-U`j)&H);`!gsnkrg2 zf$U^J)uhhg#L@F@Z4YhTCa(Xvc@90KDv!{OMil#cN8aNEp3c=;AFC~qwh*b+avxW# z?ug8f!>YHW0{mQT)Mk3ZciVbxHZtU8jh{WXMbJBy(LUBC5rNOo?@fVR)e{-u?XoUc z>_U30-`A+mbzZ0$F@1aJRDDj#@oLzw=6SJhWuG9&gP9)>ldeGr7OPe&fMI8L8ar-Q z-0z>SyQa|nwg9nZxTc3guSr*yAwK!c9@S~Jpi#~+7fdkUh@aNl-0 zI2fhuma6EJ$}qK>2ZAQ;7W10?r5wuN=B%0Pt$t#!?xfcigCP`b9`{#yZ8uhN4~OQa&pafQ-%$WVSaH_T^~c_fADU_luv^^0LQp=mn1)vy-gY= z%|m(aNZ~nK4=M$eAmNPi{gL7HqFj$>;qRnTZ0GyIv_Dqu2-L_B9|@H&Lo$J;6P{GX z82ZTc;6G#C_&ZG6x(wHXTRw-jZo+fD4C@VQkvaorpIsi;z5QXl(yqBAZQXz{O|d2j zc8z^>!Yfr14aVhe?DP)2h|52Q*YuF2DkUwNC-X?-auxrM%n{gUiWhK~+9?ZO^8Urp zUKe)bC|Sl(IB#@Rtn{c%Rb0#!C^xw&<7-Y9@UX1Lec!THl$tUW6#BvAF-yMHa}&{z z4VGG2y4vU$Ic9qY^Hc{$KnE;kl&hegs=ZGEl{UwNTc|Ydg4OeBm2$SDxjf4-eVLs< z2Uk9I$EKyEW9IX zsN1ExmD4^Z)hp%Kr^lgZyV!m*O(Nk7 zr$mzEY1YpZ&oc|RejXMQCH(+PFAbpcIuWD3ir;X~7upQS9fXCpLNqc?HamF=dvITgA-vAbL&Ipm#{)y^GM!UThzY6+G z*d7!gf!B)L$(o~#Ag20J%NumF)U}S#_txB%_qBvHDLlesl*z1mnptksf4~_Cu~$fo zC?Opv!w!$LUOS}*`ls$74r#RcwxWxR<_&UE$L4~3SQ__1)hf!PnA9+_SD(sm5}s0_ zy5d%JLy~zAB+>jZ+9D>~4pI?aX%|65BcQ}5>c>FxShatiyB)~3$%F=m-$n}yOs=Lq zj0g?ZwHP;F>xT$G+Jv`Bx9BT@$7+A|dq3+!E;ol>%;+7_&Ij zx3pRf^SW6$TOrsYIpi|Z&rItL9THBSQ{2g*(+v}Of_Fh^4-qu2KG_(YEB%R(>a|AK zgHXTb0_(MFOYBnLI4j6J#XtCAZc`H~F&e_|gDLuNceBP=rf~&}e`)sKhM28IvA^rK z(SeoxvSi$4H;%;igUlv>SZ_y*r0o2;(OK10#m4QIBT-C79g+*L2(_ZTHi-?nA^Y7D zGfO7L5aT}(S_qS2!FVg=gV_W=zMO^<&fNpc)b+3Dd zL1+i9;%8{+VY=96ki^^(2;`sZzjM-jad1E#ak5=M(QNkGNZ%s z+!nE0@KqQXKI@R|nBhq{US&fqBf07Q!u4?SLRx6UgZfEEAw!n;TWQW8m*k08TZxCR zz{aWk#Z{+5z|Nb`8F32JF4_?t?uJz7=tujb1IjNlv2YS3ZiA(VUt*?m;BGW`ab5I_9Lx zv9Py)JuhK5hsDm>Xvp~LQX9YhQrs=X!rKzi5h(OYCzx>bVyI^P9KV1Ah?%$(eoc`{ zEO6V>!S9*hTfc3A@>20b;(3#krPQf3lg8!ZO}HcNA@D+&GvU=4H-jXs9-N+LgjGOD z$p5c)&Md5nEQ{magDtJ2(27Ef5^zCK5EKJp?Eoz(U_gSH1|(4wLR1JUt6>poWMoz8 z5(6g45)cALgorF5h>Du9h!D1fO*To0?2C|4U5eVy!#vExeBV5Dz16LI?|17v-@R4m z{D0>puR6a3kfWzgnZ&szpWdTgi*+`mX*ayM{%Au*4Z&8m)(q`w<3xF(x$n6$$l-xS zv*sWSH9+Bx4yx1_MCk7$SQ|`f>yG$lO6i;Vx^px#zC%lFD@DfIj1bI3rZZhTPK=#9 z5)ae$_u~#Bs%|7)0OaE%Xbv9~B0E0#&7U5UqeSrLnqU9cqL@9(i=+^mC&t!88V*)l zFzR@{!b7T6Hi&ELNJ49Kbet&>K>9=4{OlQm3c~r;y%k01qSOjgFU9K(VFj?@33^&( z&e7D${fzIqXl0)ecbf@e!)AF-!&{6zZyva2LqNPp!fk4Z)2Dz2hMVO;k|8u`S8~=+ zwPbenL&sSkkVDI`=tZ8hNHh3n@s(D4XdT8s-Iv?Di8LsolPh~{Z!QcA-(n^)i-oOh zPKpCct0|W$7w-lVGLsYhrSGe28L=WOC@^S}pMa}>*BoHioj7^#HlfWI+Q&2`())NG z_lc83y8cv@LAa-ap;8{gPjdZ(4v#df3CMA(6v*^qEcL+?_NDZc)u8YQ1l>U=4L-_cwY`tL*+^2dp!E@pQ6wokR`A<>_EkQ$@nb3w-t^{1w{(m-_5Jya;z~#stGQ z`Dy6#{j{5Lsglb3y+OXQ$;!TZ>|~vA{mC|**nKPM-WHM+eK@uoCb2|EF;_BGvshIgiQs&^U&;wy|4N)Sd;;S ztXip5jxs>m5`61>o2eWRLO-c3 zh-3cDYpc`YeQLHIF-|2O$FZAz9HIrQPoikoC$bPoZ!r&nn0N;ao@YFCZw!E8Ktaox ziniTU%>A8G#XB9j?FTZeMhuMb!YHgAW53c8Plb7~;w1Svi?2a_N_-|2j zuq`GqxIKn=sL@j1of>L*=zUZAD}~G;lXL!$CL@P&dFM{gY7Unz=v8rK+@mb2u<-Ks zBUWa*N)r07kW`%Q)>l4*AwGYDQ(y|%=0ca-b2yr8Wqn@&5k0)BBZ`%@MsNM{H$3bE zCeZdZY_GnTYaQZ!A5#p>DPEN_PWSHc7XSWfrf%jGBU{sZs*_e5Iu@D|Ti+4aFLvI@ ztjvg*N&01!w;7UeATso_TckX=`@kpnX^li$OkT0}FXvTnyk9KFPZoWnwLyK3WrP-d zmB1>Z7aRHWfo+WrrA9~~QLZmFJp3U@r7%2c6g0d)w>;5wYxmH(N(^z|Fr&?nVNWWhm(M17g1R_B2{xoY39p+i6lZT^k+fQu??>-W>0c zLUIZ;|H9GS2wMW4_pE>LY$-(>?p0{>!T47T)Ypgk5mpR1%yhct-np!<%x?MqP^D_F zW^q%13SO^GOo|_owC|`GR~T?9+@6EW5A`xApAc=eC2hgJcI#CY?2MWYILz-k-mbW& z4r^$YZ%dedG>}l$tJKmyQN2t7qi^<`u%M(l@Q!fh;jIq*#d;s;^Bd| z`d`*9NCy25_2p_IE!64V=G%HaYUnYK$1O3&Cwrb%UM*>Qc4Gf8aS$jGC3jm&x0%Ux zr1AcU*10qMgEX()@yOR#Q3iL5&ZdnYtk_-*8|z?!b@rDr4)9IE@7)_GHCv6y>PU-S zB7h%lw|G7WmKLwZ7)6sT192)WZZBX@@hO=oSC+(;Eor#dq#w@b+R}C77X!{aZ#cR( zc9|c7oR++6I5H{?$PtBoAE7BO9JQj?1%ahY=mXWGHb{DxRe7p2dSfAMA zmdbnHJ(C#CD)%9iI38w4a&j|Z?z_`>>z>GxYPmNf7Y5EHxaZg369{ud<42TAvic*J zIqU58Y`rC*l#;G50~J?W*<=QCQekINk`*DxY~K#4&Tyiy`pD=K=JCJI$y`XC{Kq4S z782+=!{U`Zad;z`c>URC3hafLE~RmKyxS5mk#qG@l2cDH2bJXVbctwek#KfMLbdB* z3o*x4JAYhw<+j4HU8{$^;PfgXzhnVt3g(~GxB6-oNTiCXVRMxGF{f1EK~zAAec|Nx zv=e-Nt@U>hM6Lj{>1sE+KvwCBF*hQmALG~r=L-wxdDO(1m7g%M8?KO~2AG1Jjx|0W z@r{$c2`j{veQHS_3# zb!!HQ_|g!QAalE{`+}yjhuZihPT&-axQ##NbA^sFqCe8O#4N*7nJR3~)i9;((pB}A z!4*1m;?O!>=ghh7V(SlicV-r!rcWMCn+v%)acqOum$T&M$jc&3!bMhm^N69$GQD7b zFp(uReakhZB<}z26JIyrKhSfo)v w1AhO%LC%Q0!9uqg%6ENGVY>hRGQ19|?y+nK1jOB2KaRGsvOjR&^2C)t0rkt4@Bjb+ From a07d964df5f7e99247c3875ef253baccef4de169 Mon Sep 17 00:00:00 2001 From: Dante Su Date: Tue, 23 Nov 2021 03:01:10 +0000 Subject: [PATCH 09/13] Add a couple of more implementation details Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 65 ++++++++++++++++++++++++++++++--------- 1 file changed, 51 insertions(+), 14 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index b873edde176..ab76b2b3f46 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -80,7 +80,17 @@ class Sfp(SfpOptoeBase): return "/sys/bus/i2c/devices/{}-0050/eeprom".format(bus_id) ``` -The scope of this feature is as follow: +This feature could also be disabled by the platform-specific **pmon_daemon_control.json** + +**Example:** +``` +$ cat sonic-buildimage/device/VENDOR/PLATFORM/pmon_daemon_control.json +{ + "skip_xcvrd_cmis_manager": true +} +``` + +The scope of this feature are as follows: - **CMIS software initialization for the default application.** - All the lanes of the CMIS module will be reconfigured to use the default application. @@ -156,15 +166,40 @@ to the json format: ...... omitted ...... ``` -- Add **CmisManagerTask** for the state-based CMIS application initialization to support -multiple CMIS transceivers in one single thread. - +- **xcvrd.py**: Add **CmisManagerTask** for the state-based CMIS application initialization +to support multiple CMIS transceivers in one single thread. + - The CMIS states are listed below + + | State | Description | Next State | + |:--------- |:----------------|:----------------------| + | UNKNOWN | Unknown state | N/A | + | INSERTED | Module is newly inserted | DP_DEINIT | + | DP_DEINIT | DatPath is de-initialized with tx-power turned off | AP_CONFIGURED | + | AP_CONFIGURED | Application configured | DP_INIT | + | DP_INIT | DatPath is initialized with tx-power turned off | DP_TXON | + | DP_TXON | DatPath is initialized with tx-power turned on | READY | + | READY | Transceiver is ready in the new application mode | N/A | + | REMOVED | Module is removed | N/A | + | FAILED | Initialization failed | N/A | + + - At each loop iteration of CmisManagerTask.task_worker(), the state will only be advanced by 1 and only 1 state upon success. + - Prior to advancing the state, CmisManagerTask should always double-check the hardware module and datapath states. + - The state transition diagram ![](images/001.png) -- Enhance **xcvrd_utilities/port_mapping.py** with **APPL_DB** and **STATE_DB** support - - **port_mapping.subscribe_port_config_change()** only listens to **CONFIG_DB** by default. - - **port_mapping.subscribe_port_config_change(['APPL_DB', 'STATE_DB'])** listens to both **APPL_DB** and **STATE_DB**. - - The port table name associated with the database + + +- **xcvrd_utilities/port_mapping.py**: Add support for **APPL_DB** and **STATE_DB** + - **subscribe_port_update_event(db_list=['APPL_DB', 'STATE_DB'])** subscribes to both **APPL_DB** and **STATE_DB** by default. + + - **handle_port_update_event(sel, asic_context, stop_event, logger, handler)** is the wrapper for port update event handler, + and the handler routines will be invoked upon all the database SET/DEL commands as follows + - **PortChangeEvent.PORT_SET** + The event for database **SET** operations. + - **PortChangeEvent.PORT_DEL** + The event for database **DEL** operations. + + - The port table names associated with the database is as follows | Database | Table Name | |:--------- |:---------------------- | @@ -172,11 +207,13 @@ multiple CMIS transceivers in one single thread. | CONFIG_DB | PORT | | STATE_DB | TRANSCEIVER_INFO | -- Introduce the following additional events into **xcvrd_utilities/port_mapping.py** - - **PortChangeEvent.PORT_SET** - The event callbacks for database **SET** operations. - - **PortChangeEvent.PORT_DEL** - The event callbacks for database **DEL** operations. + - The port update events from **APPL_DB** should be interpreted as the port config update + notifications from the **swss#orchagent** + - The port update events from **STATE_DB** should be interpreted as the transceiver insertion + and removal notifications from the **xcvrd#SfpStateUpdateTask** + - Upon **WARM-REBOOT** and **pmon** restart, these events will always be replayed to the + **CmisManagerTask** and the initialization sequence will be skipped if the desired application + is already in place and ready ## sonic-platform-common/sonic_platform_base/sfp_base.py (modified) @@ -214,7 +251,7 @@ Add the following stub routines ## sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py (modified) - Add the following routines for CMIS application initialization - - **get_cmis_application_update(self, host_speed, host_lanes)** + - **has_cmis_application_update(self, host_speed, host_lanes)** Check for CMIS updates and the new application if an update if necessary - **set_cmis_application_stop(self, host_lanes)** A non-blocking routine to deinitialize DataPath, put the CMIS module into low-power mode From a91573c39f96e772e086eddd0c3df141dceacefb Mon Sep 17 00:00:00 2001 From: Dante Su Date: Tue, 23 Nov 2021 06:21:30 +0000 Subject: [PATCH 10/13] Add more details for CMIS state transition Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 80 ++++++++++++++++++++++++++------------- 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index ab76b2b3f46..b32dd1ae67a 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -166,29 +166,6 @@ to the json format: ...... omitted ...... ``` -- **xcvrd.py**: Add **CmisManagerTask** for the state-based CMIS application initialization -to support multiple CMIS transceivers in one single thread. - - The CMIS states are listed below - - | State | Description | Next State | - |:--------- |:----------------|:----------------------| - | UNKNOWN | Unknown state | N/A | - | INSERTED | Module is newly inserted | DP_DEINIT | - | DP_DEINIT | DatPath is de-initialized with tx-power turned off | AP_CONFIGURED | - | AP_CONFIGURED | Application configured | DP_INIT | - | DP_INIT | DatPath is initialized with tx-power turned off | DP_TXON | - | DP_TXON | DatPath is initialized with tx-power turned on | READY | - | READY | Transceiver is ready in the new application mode | N/A | - | REMOVED | Module is removed | N/A | - | FAILED | Initialization failed | N/A | - - - At each loop iteration of CmisManagerTask.task_worker(), the state will only be advanced by 1 and only 1 state upon success. - - Prior to advancing the state, CmisManagerTask should always double-check the hardware module and datapath states. - - The state transition diagram - ![](images/001.png) - - - - **xcvrd_utilities/port_mapping.py**: Add support for **APPL_DB** and **STATE_DB** - **subscribe_port_update_event(db_list=['APPL_DB', 'STATE_DB'])** subscribes to both **APPL_DB** and **STATE_DB** by default. @@ -199,7 +176,7 @@ to support multiple CMIS transceivers in one single thread. - **PortChangeEvent.PORT_DEL** The event for database **DEL** operations. - - The port table names associated with the database is as follows + - The port table names associated with the database are as follows | Database | Table Name | |:--------- |:---------------------- | @@ -213,7 +190,56 @@ to support multiple CMIS transceivers in one single thread. and removal notifications from the **xcvrd#SfpStateUpdateTask** - Upon **WARM-REBOOT** and **pmon** restart, these events will always be replayed to the **CmisManagerTask** and the initialization sequence will be skipped if the desired application - is already in place and ready + is already in place and ready. (For more details, please refer to the summary of **xcvrd.py** below) + +- **xcvrd.py**: Add **CmisManagerTask** for the state-based CMIS application initialization +to support multiple CMIS transceivers in one single thread. + - The CMIS states are listed below + + | State | Description | Next State | + |:--------- |:----------------|:----------------------| + | UNKNOWN | Unknown state | N/A | + | INSERTED | Module is newly inserted | DP_DEINIT | + | DP_DEINIT | DatPath is de-initialized with tx-power turned off | AP_CONFIGURED | + | AP_CONFIGURED | Application configured | DP_INIT | + | DP_INIT | DatPath is initialized with tx-power turned off | DP_TXON | + | DP_TXON | DatPath is initialized with tx-power turned on | READY | + | READY | Transceiver is ready in the new application mode | N/A | + | REMOVED | Module is removed | N/A | + | FAILED | Initialization failed | N/A | + + - At each loop iteration of CmisManagerTask.task_worker(), the state will only be advanced by 1 and only 1 state upon success. + - Prior to advancing the state, CmisManagerTask should always double-check the hardware module and datapath states. + - Prior to handling the CMIS state transitions, the following checkers are always performed + - **Check for the transceiver presence** via sfp.get_presence(), + abort the initialization sequence if it's no loner present + - **Validate the transceiver module type** via sfp.get_transceiver_info()['type_abbrv_name'], + abort the initialization sequence if it's not a QSFP-DD + - **Validate the transceiver memory type** via sfp.get_transceiver_info()['memory_type'], + abort the initialization sequence if the **Paged** memory is not available. + - From **INSERTED** to **DP_DEINIT** + Skip the initialization sequence by having the state transitioned to **READY** + if no application code updates and DataPath state is 4 (i.e. DataPathActivated) and + Config state is 1 (i.e. ConfigSuccess), otherwise invoke sfp.set_cmis_application_stop() + and have the state transitioned to **DP_DEINIT** + - From **DP_DEINIT** to **AP_CONFIGURED** + Skip the initialization sequence by staying at **DP_DEINIT** state + if module state != **ModuleReady**, otherwise invoke sfp.set_cmis_application_apsel() and + have the state transitioned to **AP_CONFIGURED** + - From **AP_CONFIGURED** to **DP_INIT** + Skip the initialization sequence by staying at **AP_CONFIGURED** state + if Config state != 1 (i.e. ConfigSuccess), otherwise invoke sfp.set_cmis_application_start() + and have the state transitioned to **DP_INIT** + - From **DP_INIT** to **DP_TXON** + Skip the initialization sequence by staying at **DP_INIT** state + if DataPath state != 7 (i.e. DataPathInitialized), otherwise invoke sfp.set_cmis_application_txon() + and have the state transitioned to **DP_TXON** + - From **DP_TXON** to **READY** + Stay at **DP_TXON** state if DataPath state != 4 (i.e. DataPathActivated), otherwise have the + state transitioned to **READY** + - The CMIS state transition diagram + ![](images/001.png) + ## sonic-platform-common/sonic_platform_base/sfp_base.py (modified) @@ -293,7 +319,7 @@ This utility is now updated as below. ``` admin@sonic:~$ show interfaces transceiver eeprom Ethernet0 Ethernet0: SFP EEPROM detected - Application Advertisement: {1: {'ap_sel_code_id': 1, 'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'ap_sel_code_id': 2, 'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}} + Application Advertisement: {1: {'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}} Connector: SN optical connector Encoding: N/A Extended Identifier: Power Class 6 (12.0W Max) @@ -341,7 +367,7 @@ This utility is now updated as below. ``` admin@sonic:~$ sudo sfputil show eeprom -p Ethernet0 Ethernet0: SFP EEPROM detected - Application Advertisement: {1: {'ap_sel_code_id': 1, 'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'ap_sel_code_id': 2, 'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}} + Application Advertisement: {1: {'host_electrical_interface_id': '400GAUI-8 C2M (Annex 120E)', 'module_media_interface_id': '400GBASE-DR4 (Cl 124)', 'host_lane_count': 8, 'media_lane_count': 4, 'host_lane_assignment_options': 1, 'media_lane_assignment_options': None}, 2: {'host_electrical_interface_id': '100GAUI-2 C2M (Annex 135G)', 'module_media_interface_id': '100G-FR/100GBASE-FR1 (Cl 140)', 'host_lane_count': 2, 'media_lane_count': 1, 'host_lane_assignment_options': 85, 'media_lane_assignment_options': None}} Connector: SN optical connector Encoding: N/A Extended Identifier: Power Class 6 (12.0W Max) From 09dc6bb020b0c53f65c9f8510069902c78971ffb Mon Sep 17 00:00:00 2001 From: Dante Su Date: Tue, 23 Nov 2021 06:30:24 +0000 Subject: [PATCH 11/13] rephrase Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index b32dd1ae67a..970b7b046a4 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -220,20 +220,17 @@ to support multiple CMIS transceivers in one single thread. - From **INSERTED** to **DP_DEINIT** Skip the initialization sequence by having the state transitioned to **READY** if no application code updates and DataPath state is 4 (i.e. DataPathActivated) and - Config state is 1 (i.e. ConfigSuccess), otherwise invoke sfp.set_cmis_application_stop() + config state is 1 (i.e. ConfigSuccess), otherwise invoke sfp.set_cmis_application_stop() and have the state transitioned to **DP_DEINIT** - From **DP_DEINIT** to **AP_CONFIGURED** - Skip the initialization sequence by staying at **DP_DEINIT** state - if module state != **ModuleReady**, otherwise invoke sfp.set_cmis_application_apsel() and - have the state transitioned to **AP_CONFIGURED** + Stay at **DP_DEINIT** state if module state != **ModuleReady**, otherwise invoke + sfp.set_cmis_application_apsel() and have the state transitioned to **AP_CONFIGURED** - From **AP_CONFIGURED** to **DP_INIT** - Skip the initialization sequence by staying at **AP_CONFIGURED** state - if Config state != 1 (i.e. ConfigSuccess), otherwise invoke sfp.set_cmis_application_start() - and have the state transitioned to **DP_INIT** + Stay at **AP_CONFIGURED** state if config state != 1 (i.e. ConfigSuccess), otherwise + invoke sfp.set_cmis_application_start() and have the state transitioned to **DP_INIT** - From **DP_INIT** to **DP_TXON** - Skip the initialization sequence by staying at **DP_INIT** state - if DataPath state != 7 (i.e. DataPathInitialized), otherwise invoke sfp.set_cmis_application_txon() - and have the state transitioned to **DP_TXON** + Stay at **DP_INIT** state if DataPath state != 7 (i.e. DataPathInitialized), otherwise + invoke sfp.set_cmis_application_txon() and have the state transitioned to **DP_TXON** - From **DP_TXON** to **READY** Stay at **DP_TXON** state if DataPath state != 4 (i.e. DataPathActivated), otherwise have the state transitioned to **READY** From 183067be91efd75f6e5a3dfdbaeb051604c603ee Mon Sep 17 00:00:00 2001 From: Dante Su Date: Mon, 29 Nov 2021 04:30:58 +0000 Subject: [PATCH 12/13] Address review comments Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 78 ++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 26 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index 970b7b046a4..7e0db580225 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -8,16 +8,32 @@ CMIS Application Initialization * [List of Tables](#list-of-tables) * [Revision](#revision) * [About This Manual](#about-this-manual) - * [Scope](#scope) * [Abbreviation](#abbreviation) * [References](#references) - * [Requirement Overview](#requirement-overview) + * [Requirement](#requirement) + * [Overview](#overview) + * [Functional Requirements](#functional-requirements) + * [Warm Boot Requirements](#warm-boot-requirements) * [Functional Description](#functional-description) - * [Design](#design) + * [Design](#design) + * [sonic-platform-daemons/sonic-xcvrd](#sonic-platform-daemonssonic-xcvrd) + * [Conditions for Datapath init](#conditions-for-datapath-init) + * [sonic-platform-common/sonic_platform_base/sfp_base.py](#sonic-platform-commonsonic_platform_basesfp_base.py) + * [sonic-platform-common/sonic_platform_base/sonic_xcvr/api/public/cmis.py](#sonic-platform-commonsonic_platform_basesonic_xcvrapipubliccmis.py) + * [sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py](#sonic-platform-commonsonic_platform_basesonic_xcvrfieldsconsts.py) + * [sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/public/cmis.py](#sonic-platform-commonsonic_platform_basesonic_xcvrfieldspubliccmis.py) + * [sonic-platform-common/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis.py](#sonic-platform-commonsonic_platform_basesonic_xcvrmem_mapspubliccmis.py) + * [sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py](#sonic-platform-commonsonic_platform_basesonic_xcvrsfp_optoe_base.py) + * [sonic-utilities/sfputil](#sonic-utilitiessfputil) + * [CLI commands](#cli-commands) + * [CLI Show Commands](#cli-show-commands) + * [CLI Debug Commands](#cli-debug-commands) # List of Tables * [Table 1: Definitions](#table-1-definitions) * [Table 2: References](#table-2-references) + * [Table 3: Port Table Name Mappings](#table-3-port-table-name-mappings) + * [Table 4: CMIS State Table](#table-4-cmis-state-table) # Revision | Rev | Date | Author | Change Description | @@ -46,7 +62,9 @@ support for SONiC. |---------------------------------------------------------|---------------| | CMIS v5 | [CMIS5p0.pdf](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) | -# Requirement Overview +# Requirement + +## Overview This document describes functional behavior of the CMIS application initialization support in SONiC. @@ -80,16 +98,6 @@ class Sfp(SfpOptoeBase): return "/sys/bus/i2c/devices/{}-0050/eeprom".format(bus_id) ``` -This feature could also be disabled by the platform-specific **pmon_daemon_control.json** - -**Example:** -``` -$ cat sonic-buildimage/device/VENDOR/PLATFORM/pmon_daemon_control.json -{ - "skip_xcvrd_cmis_manager": true -} -``` - The scope of this feature are as follows: - **CMIS software initialization for the default application.** @@ -136,7 +144,7 @@ is in place and ready. # Design -## sonic-platform-daemons/sonic-xcvrd (modified) +## sonic-platform-daemons/sonic-xcvrd The transceiver daemon will be enhanced as below: @@ -178,6 +186,7 @@ to the json format: - The port table names associated with the database are as follows + ### Table 3 Port Table Name Mappings | Database | Table Name | |:--------- |:---------------------- | | APPL_DB | PORT_TABLE | @@ -196,6 +205,7 @@ to the json format: to support multiple CMIS transceivers in one single thread. - The CMIS states are listed below + ### Table 4 CMIS State Table | State | Description | Next State | |:--------- |:----------------|:----------------------| | UNKNOWN | Unknown state | N/A | @@ -223,22 +233,38 @@ to support multiple CMIS transceivers in one single thread. config state is 1 (i.e. ConfigSuccess), otherwise invoke sfp.set_cmis_application_stop() and have the state transitioned to **DP_DEINIT** - From **DP_DEINIT** to **AP_CONFIGURED** - Stay at **DP_DEINIT** state if module state != **ModuleReady**, otherwise invoke + Stay at **DP_DEINIT** state if module state != **ModuleReady(3)**, otherwise invoke sfp.set_cmis_application_apsel() and have the state transitioned to **AP_CONFIGURED** - From **AP_CONFIGURED** to **DP_INIT** - Stay at **AP_CONFIGURED** state if config state != 1 (i.e. ConfigSuccess), otherwise + Stay at **AP_CONFIGURED** state if config state != **ConfigSuccess(1)**, otherwise invoke sfp.set_cmis_application_start() and have the state transitioned to **DP_INIT** - From **DP_INIT** to **DP_TXON** - Stay at **DP_INIT** state if DataPath state != 7 (i.e. DataPathInitialized), otherwise + Stay at **DP_INIT** state if DataPath state != **DataPathInitialized(7)**, otherwise invoke sfp.set_cmis_application_txon() and have the state transitioned to **DP_TXON** - From **DP_TXON** to **READY** - Stay at **DP_TXON** state if DataPath state != 4 (i.e. DataPathActivated), otherwise have the + Stay at **DP_TXON** state if DataPath state != **DataPathActivated(4)**, otherwise have the state transitioned to **READY** - The CMIS state transition diagram ![](images/001.png) + ### Conditions for Datapath init + + The datapath should be re-initialized in the following scenarios + + - Transceiver insertion + - Port mode update that requires a CMIS application code update (e.g Dynamic Port Breakout, + outside the scope of this document) + - Port speed update that requires a CMIS application code update + + When the CMIS is in **INSERTED** state, the datapath re-initialization should be skipped + and transitioned to **READY** state if all the following checkers are positive + + - The operational application code matches the desired application mode derived from + the port configurations in the CONFIG_DB/APPL_DB + - The datapath state is **DataPathActivated(4)** + - The configuration error is **ConfigSuccess(1)** -## sonic-platform-common/sonic_platform_base/sfp_base.py (modified) +## sonic-platform-common/sonic_platform_base/sfp_base.py Add the following macro constants to differentiate the port/cage type from the media type fetched from the transceiver - SFP_PORT_TYPE_UNSPECIFIED @@ -250,7 +276,7 @@ Add the following stub routines - get_port_type(self) Retrieves the port/cage type of this SFP -## sonic-platform-common/sonic_platform_base/sonic_xcvr/api/public/cmis.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/api/public/cmis.py - Add support for low-power mode controls - Add support for reporting CMIS application advertisement @@ -259,19 +285,19 @@ Add the following stub routines For more details, please refer to **Appendix D.1.3 and D.2.2** of [CMIS 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) -## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py - Add register definitions for CMIS application initialization -## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/public/cmis.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/public/cmis.py - Add support for parsing CMIS application advertisement -## sonic-platform-common/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/mem_maps/public/cmis.py - Add support for CMIS registers those are necessary for application initialization -## sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py (modified) +## sonic-platform-common/sonic_platform_base/sonic_xcvr/sfp_optoe_base.py - Add the following routines for CMIS application initialization - **has_cmis_application_update(self, host_speed, host_lanes)** @@ -300,7 +326,7 @@ Add the following stub routines - **get_module_state(self)** Retrieve the CMIS module state -## sonic-utilities/sfputil (modified) +## sonic-utilities/sfputil - Add supprot to show the CMIS application advertisement From 0e4516d7bf707a36127438c7f2fa9cc2b504298e Mon Sep 17 00:00:00 2001 From: Dante Su Date: Wed, 1 Dec 2021 07:07:40 +0000 Subject: [PATCH 13/13] Add 'Outside the scope' and a few cosmetic changes Signed-off-by: Dante Su --- doc/sfp-cmis/cmis-init.md | 44 ++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/doc/sfp-cmis/cmis-init.md b/doc/sfp-cmis/cmis-init.md index 7e0db580225..810d55969e9 100644 --- a/doc/sfp-cmis/cmis-init.md +++ b/doc/sfp-cmis/cmis-init.md @@ -12,6 +12,8 @@ CMIS Application Initialization * [References](#references) * [Requirement](#requirement) * [Overview](#overview) + * [Scope](#scope) + * [Outside the Scope](#outside-the-scope) * [Functional Requirements](#functional-requirements) * [Warm Boot Requirements](#warm-boot-requirements) * [Functional Description](#functional-description) @@ -98,6 +100,8 @@ class Sfp(SfpOptoeBase): return "/sys/bus/i2c/devices/{}-0050/eeprom".format(bus_id) ``` +## Scope + The scope of this feature are as follows: - **CMIS software initialization for the default application.** @@ -105,12 +109,25 @@ The scope of this feature are as follows: - Only staged control set 0 will be supported - No speed negotiation. - No custom signal integrity settings - - Implement the procedures defined in Appendix D.1.3 and D.2.2 of [CMIS 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) + - Implement the procedures defined in Appendix D.1.3 and D.2.2 of [CMIS v5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) - **sonic-platform-common**: Update **sonic-xcvr** for CMIS application advertising and initialization - **sonic-platform-daemons**: Update **sonic-xcvrd** for state-based CMIS application initialization to support multiple CMIS transceivers in one single thread - **sonic-utilities**: Update the **sfputil** and **sfpshow** for CMIS application advertisement +## Outside the Scope + +The following items are outside the scope of this document: + +- The synchronization between syncd and xcvrd + The datapath initialization should happen only when the Tx signals from the ASIC/MAC towards + the optics is valid and good for the selected application (i.e. 6.3.3.5 DPInit State of [CMIS v5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf)) + Currently, **pmon#xcvrd** do not have any means to know this at runtime whether the port breakout + configuration is done or ASIC/MAC is ready in the desired mode. +- The non-default application is not supported + Only application 1 (i.e. default application) is supported, the port configurations that + require non-default application code may experience link failures on CMIS v4/v5 optics. + ## Functional Requirements 1. Ability to parse the advertised applications from the transceivers @@ -251,18 +268,17 @@ to support multiple CMIS transceivers in one single thread. The datapath should be re-initialized in the following scenarios - - Transceiver insertion - - Port mode update that requires a CMIS application code update (e.g Dynamic Port Breakout, - outside the scope of this document) - - Port speed update that requires a CMIS application code update - - When the CMIS is in **INSERTED** state, the datapath re-initialization should be skipped - and transitioned to **READY** state if all the following checkers are positive - - - The operational application code matches the desired application mode derived from - the port configurations in the CONFIG_DB/APPL_DB - - The datapath state is **DataPathActivated(4)** - - The configuration error is **ConfigSuccess(1)** + - Transceiver insertion detection + When a CMIS transceiver insertion is detected, it will be placed in **INSERTED** state, + the datapath re-initialization should be skipped and directly transitioned to **READY** state + if all the following checkers are positive + - The operational application code matches the desired application mode derived from + the current port configurations in the CONFIG_DB/APPL_DB + - The datapath state is **DataPathActivated(4)** + - The configuration error is **ConfigSuccess(1)** + - Port mode changes that require a CMIS application code update (e.g Dynamic Port Breakout, + outside the scope of this document) + - Port speed changes that require a CMIS application code update ## sonic-platform-common/sonic_platform_base/sfp_base.py @@ -283,7 +299,7 @@ Add the following stub routines - Add support for reporting CMIS application initialization failures - Add support for CMIS application initialization For more details, please refer to **Appendix D.1.3 and D.2.2** of -[CMIS 5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) +[CMIS v5](http://www.qsfp-dd.com/wp-content/uploads/2021/05/CMIS5p0.pdf) ## sonic-platform-common/sonic_platform_base/sonic_xcvr/fields/consts.py