1*266c2bebSRobin Zhang /* SPDX-License-Identifier: BSD-3-Clause
2*266c2bebSRobin Zhang * Copyright(c) 2022 Intel Corporation
3*266c2bebSRobin Zhang * Implements SFF-8024 Rev 4.0 of pluggable I/O configuration and some
4*266c2bebSRobin Zhang * common utilities for SFF-8436/8636 and SFF-8472/8079
5*266c2bebSRobin Zhang */
6*266c2bebSRobin Zhang
7*266c2bebSRobin Zhang #include <math.h>
8*266c2bebSRobin Zhang
9*266c2bebSRobin Zhang #include "sff_common.h"
10*266c2bebSRobin Zhang
sff_convert_mw_to_dbm(double mw)11*266c2bebSRobin Zhang double sff_convert_mw_to_dbm(double mw)
12*266c2bebSRobin Zhang {
13*266c2bebSRobin Zhang return (10. * log10(mw / 1000.)) + 30.;
14*266c2bebSRobin Zhang }
15*266c2bebSRobin Zhang
sff_show_value_with_unit(const uint8_t * data,unsigned int reg,const char * name,unsigned int mult,const char * unit,struct rte_tel_data * d)16*266c2bebSRobin Zhang void sff_show_value_with_unit(const uint8_t *data, unsigned int reg,
17*266c2bebSRobin Zhang const char *name, unsigned int mult,
18*266c2bebSRobin Zhang const char *unit, struct rte_tel_data *d)
19*266c2bebSRobin Zhang {
20*266c2bebSRobin Zhang unsigned int val = data[reg];
21*266c2bebSRobin Zhang char val_string[SFF_ITEM_VAL_COMPOSE_SIZE];
22*266c2bebSRobin Zhang
23*266c2bebSRobin Zhang snprintf(val_string, sizeof(val_string), "%u%s", val * mult, unit);
24*266c2bebSRobin Zhang ssf_add_dict_string(d, name, val_string);
25*266c2bebSRobin Zhang }
26*266c2bebSRobin Zhang
sff_show_ascii(const uint8_t * data,unsigned int first_reg,unsigned int last_reg,const char * name,struct rte_tel_data * d)27*266c2bebSRobin Zhang void sff_show_ascii(const uint8_t *data, unsigned int first_reg,
28*266c2bebSRobin Zhang unsigned int last_reg, const char *name, struct rte_tel_data *d)
29*266c2bebSRobin Zhang {
30*266c2bebSRobin Zhang unsigned int reg, val;
31*266c2bebSRobin Zhang char tmp[3];
32*266c2bebSRobin Zhang char val_string[SFF_ITEM_VAL_COMPOSE_SIZE];
33*266c2bebSRobin Zhang
34*266c2bebSRobin Zhang memset(val_string, 0, sizeof(val_string));
35*266c2bebSRobin Zhang
36*266c2bebSRobin Zhang while (first_reg <= last_reg && data[last_reg] == ' ')
37*266c2bebSRobin Zhang last_reg--;
38*266c2bebSRobin Zhang for (reg = first_reg; reg <= last_reg; reg++) {
39*266c2bebSRobin Zhang val = data[reg];
40*266c2bebSRobin Zhang if ((val >= 32) && (val <= 126)) {
41*266c2bebSRobin Zhang snprintf(tmp, sizeof(tmp), "%c", val);
42*266c2bebSRobin Zhang strlcat(val_string, tmp, sizeof(val_string));
43*266c2bebSRobin Zhang } else {
44*266c2bebSRobin Zhang strlcat(val_string, "_", sizeof(val_string));
45*266c2bebSRobin Zhang }
46*266c2bebSRobin Zhang }
47*266c2bebSRobin Zhang ssf_add_dict_string(d, name, val_string);
48*266c2bebSRobin Zhang }
49*266c2bebSRobin Zhang
sff_8024_show_oui(const uint8_t * data,int id_offset,struct rte_tel_data * d)50*266c2bebSRobin Zhang void sff_8024_show_oui(const uint8_t *data, int id_offset, struct rte_tel_data *d)
51*266c2bebSRobin Zhang {
52*266c2bebSRobin Zhang char val_string[SFF_ITEM_VAL_COMPOSE_SIZE];
53*266c2bebSRobin Zhang
54*266c2bebSRobin Zhang snprintf(val_string, sizeof(val_string), "%02x:%02x:%02x",
55*266c2bebSRobin Zhang data[id_offset], data[(id_offset) + 1], data[(id_offset) + 2]);
56*266c2bebSRobin Zhang ssf_add_dict_string(d, "Vendor OUI", val_string);
57*266c2bebSRobin Zhang }
58*266c2bebSRobin Zhang
sff_8024_show_identifier(const uint8_t * data,int id_offset,struct rte_tel_data * d)59*266c2bebSRobin Zhang void sff_8024_show_identifier(const uint8_t *data, int id_offset, struct rte_tel_data *d)
60*266c2bebSRobin Zhang {
61*266c2bebSRobin Zhang char val_string[SFF_ITEM_VAL_COMPOSE_SIZE];
62*266c2bebSRobin Zhang
63*266c2bebSRobin Zhang snprintf(val_string, sizeof(val_string), "0x%02x", data[id_offset]);
64*266c2bebSRobin Zhang
65*266c2bebSRobin Zhang switch (data[id_offset]) {
66*266c2bebSRobin Zhang case SFF_8024_ID_UNKNOWN:
67*266c2bebSRobin Zhang strlcat(val_string, " (no module present, unknown, or unspecified)",
68*266c2bebSRobin Zhang sizeof(val_string));
69*266c2bebSRobin Zhang break;
70*266c2bebSRobin Zhang case SFF_8024_ID_GBIC:
71*266c2bebSRobin Zhang strlcat(val_string, " (GBIC)", sizeof(val_string));
72*266c2bebSRobin Zhang break;
73*266c2bebSRobin Zhang case SFF_8024_ID_SOLDERED_MODULE:
74*266c2bebSRobin Zhang strlcat(val_string, " (module soldered to motherboard)", sizeof(val_string));
75*266c2bebSRobin Zhang break;
76*266c2bebSRobin Zhang case SFF_8024_ID_SFP:
77*266c2bebSRobin Zhang strlcat(val_string, " (SFP)", sizeof(val_string));
78*266c2bebSRobin Zhang break;
79*266c2bebSRobin Zhang case SFF_8024_ID_300_PIN_XBI:
80*266c2bebSRobin Zhang strlcat(val_string, " (300 pin XBI)", sizeof(val_string));
81*266c2bebSRobin Zhang break;
82*266c2bebSRobin Zhang case SFF_8024_ID_XENPAK:
83*266c2bebSRobin Zhang strlcat(val_string, " (XENPAK)", sizeof(val_string));
84*266c2bebSRobin Zhang break;
85*266c2bebSRobin Zhang case SFF_8024_ID_XFP:
86*266c2bebSRobin Zhang strlcat(val_string, " (XFP)", sizeof(val_string));
87*266c2bebSRobin Zhang break;
88*266c2bebSRobin Zhang case SFF_8024_ID_XFF:
89*266c2bebSRobin Zhang strlcat(val_string, " (XFF)", sizeof(val_string));
90*266c2bebSRobin Zhang break;
91*266c2bebSRobin Zhang case SFF_8024_ID_XFP_E:
92*266c2bebSRobin Zhang strlcat(val_string, " (XFP-E)", sizeof(val_string));
93*266c2bebSRobin Zhang break;
94*266c2bebSRobin Zhang case SFF_8024_ID_XPAK:
95*266c2bebSRobin Zhang strlcat(val_string, " (XPAK)", sizeof(val_string));
96*266c2bebSRobin Zhang break;
97*266c2bebSRobin Zhang case SFF_8024_ID_X2:
98*266c2bebSRobin Zhang strlcat(val_string, " (X2)", sizeof(val_string));
99*266c2bebSRobin Zhang break;
100*266c2bebSRobin Zhang case SFF_8024_ID_DWDM_SFP:
101*266c2bebSRobin Zhang strlcat(val_string, " (DWDM-SFP)", sizeof(val_string));
102*266c2bebSRobin Zhang break;
103*266c2bebSRobin Zhang case SFF_8024_ID_QSFP:
104*266c2bebSRobin Zhang strlcat(val_string, " (QSFP)", sizeof(val_string));
105*266c2bebSRobin Zhang break;
106*266c2bebSRobin Zhang case SFF_8024_ID_QSFP_PLUS:
107*266c2bebSRobin Zhang strlcat(val_string, " (QSFP+)", sizeof(val_string));
108*266c2bebSRobin Zhang break;
109*266c2bebSRobin Zhang case SFF_8024_ID_CXP:
110*266c2bebSRobin Zhang strlcat(val_string, " (CXP)", sizeof(val_string));
111*266c2bebSRobin Zhang break;
112*266c2bebSRobin Zhang case SFF_8024_ID_HD4X:
113*266c2bebSRobin Zhang strlcat(val_string, " (Shielded Mini Multilane HD 4X)", sizeof(val_string));
114*266c2bebSRobin Zhang break;
115*266c2bebSRobin Zhang case SFF_8024_ID_HD8X:
116*266c2bebSRobin Zhang strlcat(val_string, " (Shielded Mini Multilane HD 8X)", sizeof(val_string));
117*266c2bebSRobin Zhang break;
118*266c2bebSRobin Zhang case SFF_8024_ID_QSFP28:
119*266c2bebSRobin Zhang strlcat(val_string, " (QSFP28)", sizeof(val_string));
120*266c2bebSRobin Zhang break;
121*266c2bebSRobin Zhang case SFF_8024_ID_CXP2:
122*266c2bebSRobin Zhang strlcat(val_string, " (CXP2/CXP28)", sizeof(val_string));
123*266c2bebSRobin Zhang break;
124*266c2bebSRobin Zhang case SFF_8024_ID_CDFP:
125*266c2bebSRobin Zhang strlcat(val_string, " (CDFP Style 1/Style 2)", sizeof(val_string));
126*266c2bebSRobin Zhang break;
127*266c2bebSRobin Zhang case SFF_8024_ID_HD4X_FANOUT:
128*266c2bebSRobin Zhang strlcat(val_string, " (Shielded Mini Multilane HD 4X Fanout Cable)",
129*266c2bebSRobin Zhang sizeof(val_string));
130*266c2bebSRobin Zhang break;
131*266c2bebSRobin Zhang case SFF_8024_ID_HD8X_FANOUT:
132*266c2bebSRobin Zhang strlcat(val_string, " (Shielded Mini Multilane HD 8X Fanout Cable)",
133*266c2bebSRobin Zhang sizeof(val_string));
134*266c2bebSRobin Zhang break;
135*266c2bebSRobin Zhang case SFF_8024_ID_CDFP_S3:
136*266c2bebSRobin Zhang strlcat(val_string, " (CDFP Style 3)", sizeof(val_string));
137*266c2bebSRobin Zhang break;
138*266c2bebSRobin Zhang case SFF_8024_ID_MICRO_QSFP:
139*266c2bebSRobin Zhang strlcat(val_string, " (microQSFP)", sizeof(val_string));
140*266c2bebSRobin Zhang break;
141*266c2bebSRobin Zhang default:
142*266c2bebSRobin Zhang strlcat(val_string, " (reserved or unknown)", sizeof(val_string));
143*266c2bebSRobin Zhang break;
144*266c2bebSRobin Zhang }
145*266c2bebSRobin Zhang ssf_add_dict_string(d, "Identifier", val_string);
146*266c2bebSRobin Zhang }
147*266c2bebSRobin Zhang
sff_8024_show_connector(const uint8_t * data,int ctor_offset,struct rte_tel_data * d)148*266c2bebSRobin Zhang void sff_8024_show_connector(const uint8_t *data, int ctor_offset, struct rte_tel_data *d)
149*266c2bebSRobin Zhang {
150*266c2bebSRobin Zhang char val_string[SFF_ITEM_VAL_COMPOSE_SIZE];
151*266c2bebSRobin Zhang
152*266c2bebSRobin Zhang snprintf(val_string, sizeof(val_string), "0x%02x", data[ctor_offset]);
153*266c2bebSRobin Zhang
154*266c2bebSRobin Zhang switch (data[ctor_offset]) {
155*266c2bebSRobin Zhang case SFF_8024_CTOR_UNKNOWN:
156*266c2bebSRobin Zhang strlcat(val_string, " (unknown or unspecified)", sizeof(val_string));
157*266c2bebSRobin Zhang break;
158*266c2bebSRobin Zhang case SFF_8024_CTOR_SC:
159*266c2bebSRobin Zhang strlcat(val_string, " (SC)", sizeof(val_string));
160*266c2bebSRobin Zhang break;
161*266c2bebSRobin Zhang case SFF_8024_CTOR_FC_STYLE_1:
162*266c2bebSRobin Zhang strlcat(val_string, " (Fibre Channel Style 1 copper)", sizeof(val_string));
163*266c2bebSRobin Zhang break;
164*266c2bebSRobin Zhang case SFF_8024_CTOR_FC_STYLE_2:
165*266c2bebSRobin Zhang strlcat(val_string, " (Fibre Channel Style 2 copper)", sizeof(val_string));
166*266c2bebSRobin Zhang break;
167*266c2bebSRobin Zhang case SFF_8024_CTOR_BNC_TNC:
168*266c2bebSRobin Zhang strlcat(val_string, " (BNC/TNC)", sizeof(val_string));
169*266c2bebSRobin Zhang break;
170*266c2bebSRobin Zhang case SFF_8024_CTOR_FC_COAX:
171*266c2bebSRobin Zhang strlcat(val_string, " (Fibre Channel coaxial headers)", sizeof(val_string));
172*266c2bebSRobin Zhang break;
173*266c2bebSRobin Zhang case SFF_8024_CTOR_FIBER_JACK:
174*266c2bebSRobin Zhang strlcat(val_string, " (FibreJack)", sizeof(val_string));
175*266c2bebSRobin Zhang break;
176*266c2bebSRobin Zhang case SFF_8024_CTOR_LC:
177*266c2bebSRobin Zhang strlcat(val_string, " (LC)", sizeof(val_string));
178*266c2bebSRobin Zhang break;
179*266c2bebSRobin Zhang case SFF_8024_CTOR_MT_RJ:
180*266c2bebSRobin Zhang strlcat(val_string, " (MT-RJ)", sizeof(val_string));
181*266c2bebSRobin Zhang break;
182*266c2bebSRobin Zhang case SFF_8024_CTOR_MU:
183*266c2bebSRobin Zhang strlcat(val_string, " (MU)", sizeof(val_string));
184*266c2bebSRobin Zhang break;
185*266c2bebSRobin Zhang case SFF_8024_CTOR_SG:
186*266c2bebSRobin Zhang strlcat(val_string, " (SG)", sizeof(val_string));
187*266c2bebSRobin Zhang break;
188*266c2bebSRobin Zhang case SFF_8024_CTOR_OPT_PT:
189*266c2bebSRobin Zhang strlcat(val_string, " (Optical pigtail)", sizeof(val_string));
190*266c2bebSRobin Zhang break;
191*266c2bebSRobin Zhang case SFF_8024_CTOR_MPO:
192*266c2bebSRobin Zhang strlcat(val_string, " (MPO Parallel Optic)", sizeof(val_string));
193*266c2bebSRobin Zhang break;
194*266c2bebSRobin Zhang case SFF_8024_CTOR_MPO_2:
195*266c2bebSRobin Zhang strlcat(val_string, " (MPO Parallel Optic - 2x16)", sizeof(val_string));
196*266c2bebSRobin Zhang break;
197*266c2bebSRobin Zhang case SFF_8024_CTOR_HSDC_II:
198*266c2bebSRobin Zhang strlcat(val_string, " (HSSDC II)", sizeof(val_string));
199*266c2bebSRobin Zhang break;
200*266c2bebSRobin Zhang case SFF_8024_CTOR_COPPER_PT:
201*266c2bebSRobin Zhang strlcat(val_string, " (Copper pigtail)", sizeof(val_string));
202*266c2bebSRobin Zhang break;
203*266c2bebSRobin Zhang case SFF_8024_CTOR_RJ45:
204*266c2bebSRobin Zhang strlcat(val_string, " (RJ45)", sizeof(val_string));
205*266c2bebSRobin Zhang break;
206*266c2bebSRobin Zhang case SFF_8024_CTOR_NO_SEPARABLE:
207*266c2bebSRobin Zhang strlcat(val_string, " (No separable connector)", sizeof(val_string));
208*266c2bebSRobin Zhang break;
209*266c2bebSRobin Zhang case SFF_8024_CTOR_MXC_2x16:
210*266c2bebSRobin Zhang strlcat(val_string, " (MXC 2x16)", sizeof(val_string));
211*266c2bebSRobin Zhang break;
212*266c2bebSRobin Zhang default:
213*266c2bebSRobin Zhang strlcat(val_string, " (reserved or unknown)", sizeof(val_string));
214*266c2bebSRobin Zhang break;
215*266c2bebSRobin Zhang }
216*266c2bebSRobin Zhang ssf_add_dict_string(d, "Connector", val_string);
217*266c2bebSRobin Zhang }
218*266c2bebSRobin Zhang
sff_8024_show_encoding(const uint8_t * data,int encoding_offset,int sff_type,struct rte_tel_data * d)219*266c2bebSRobin Zhang void sff_8024_show_encoding(const uint8_t *data, int encoding_offset,
220*266c2bebSRobin Zhang int sff_type, struct rte_tel_data *d)
221*266c2bebSRobin Zhang {
222*266c2bebSRobin Zhang char val_string[SFF_ITEM_VAL_COMPOSE_SIZE];
223*266c2bebSRobin Zhang
224*266c2bebSRobin Zhang snprintf(val_string, sizeof(val_string), "0x%02x", data[encoding_offset]);
225*266c2bebSRobin Zhang
226*266c2bebSRobin Zhang switch (data[encoding_offset]) {
227*266c2bebSRobin Zhang case SFF_8024_ENCODING_UNSPEC:
228*266c2bebSRobin Zhang strlcat(val_string, " (unspecified)", sizeof(val_string));
229*266c2bebSRobin Zhang break;
230*266c2bebSRobin Zhang case SFF_8024_ENCODING_8B10B:
231*266c2bebSRobin Zhang strlcat(val_string, " (8B/10B)", sizeof(val_string));
232*266c2bebSRobin Zhang break;
233*266c2bebSRobin Zhang case SFF_8024_ENCODING_4B5B:
234*266c2bebSRobin Zhang strlcat(val_string, " (4B/5B)", sizeof(val_string));
235*266c2bebSRobin Zhang break;
236*266c2bebSRobin Zhang case SFF_8024_ENCODING_NRZ:
237*266c2bebSRobin Zhang strlcat(val_string, " (NRZ)", sizeof(val_string));
238*266c2bebSRobin Zhang break;
239*266c2bebSRobin Zhang case SFF_8024_ENCODING_4h:
240*266c2bebSRobin Zhang if (sff_type == RTE_ETH_MODULE_SFF_8472)
241*266c2bebSRobin Zhang strlcat(val_string, " (Manchester)", sizeof(val_string));
242*266c2bebSRobin Zhang else if (sff_type == RTE_ETH_MODULE_SFF_8636)
243*266c2bebSRobin Zhang strlcat(val_string, " (SONET Scrambled)", sizeof(val_string));
244*266c2bebSRobin Zhang break;
245*266c2bebSRobin Zhang case SFF_8024_ENCODING_5h:
246*266c2bebSRobin Zhang if (sff_type == RTE_ETH_MODULE_SFF_8472)
247*266c2bebSRobin Zhang strlcat(val_string, " (SONET Scrambled)", sizeof(val_string));
248*266c2bebSRobin Zhang else if (sff_type == RTE_ETH_MODULE_SFF_8636)
249*266c2bebSRobin Zhang strlcat(val_string, " (64B/66B)", sizeof(val_string));
250*266c2bebSRobin Zhang break;
251*266c2bebSRobin Zhang case SFF_8024_ENCODING_6h:
252*266c2bebSRobin Zhang if (sff_type == RTE_ETH_MODULE_SFF_8472)
253*266c2bebSRobin Zhang strlcat(val_string, " (64B/66B)", sizeof(val_string));
254*266c2bebSRobin Zhang else if (sff_type == RTE_ETH_MODULE_SFF_8636)
255*266c2bebSRobin Zhang strlcat(val_string, " (Manchester)", sizeof(val_string));
256*266c2bebSRobin Zhang break;
257*266c2bebSRobin Zhang case SFF_8024_ENCODING_256B:
258*266c2bebSRobin Zhang strlcat(val_string,
259*266c2bebSRobin Zhang " ((256B/257B (transcoded FEC-enabled data))", sizeof(val_string));
260*266c2bebSRobin Zhang break;
261*266c2bebSRobin Zhang case SFF_8024_ENCODING_PAM4:
262*266c2bebSRobin Zhang strlcat(val_string, " (PAM4)", sizeof(val_string));
263*266c2bebSRobin Zhang break;
264*266c2bebSRobin Zhang default:
265*266c2bebSRobin Zhang strlcat(val_string, " (reserved or unknown)", sizeof(val_string));
266*266c2bebSRobin Zhang break;
267*266c2bebSRobin Zhang }
268*266c2bebSRobin Zhang ssf_add_dict_string(d, "Encoding", val_string);
269*266c2bebSRobin Zhang }
270*266c2bebSRobin Zhang
sff_show_thresholds(struct sff_diags sd,struct rte_tel_data * d)271*266c2bebSRobin Zhang void sff_show_thresholds(struct sff_diags sd, struct rte_tel_data *d)
272*266c2bebSRobin Zhang {
273*266c2bebSRobin Zhang char val_string[SFF_ITEM_VAL_COMPOSE_SIZE];
274*266c2bebSRobin Zhang
275*266c2bebSRobin Zhang SFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_HALRM]);
276*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser bias current high alarm threshold", val_string);
277*266c2bebSRobin Zhang SFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_LALRM]);
278*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser bias current low alarm threshold", val_string);
279*266c2bebSRobin Zhang SFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_HWARN]);
280*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser bias current high warning threshold", val_string);
281*266c2bebSRobin Zhang SFF_SPRINT_BIAS(val_string, sd.bias_cur[SFF_LWARN]);
282*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser bias current low warning threshold", val_string);
283*266c2bebSRobin Zhang
284*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_HALRM]);
285*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser output power high alarm threshold", val_string);
286*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_LALRM]);
287*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser output power low alarm threshold", val_string);
288*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_HWARN]);
289*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser output power high warning threshold", val_string);
290*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.tx_power[SFF_LWARN]);
291*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser output power low warning threshold", val_string);
292*266c2bebSRobin Zhang
293*266c2bebSRobin Zhang SFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_HALRM]);
294*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module temperature high alarm threshold", val_string);
295*266c2bebSRobin Zhang SFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_LALRM]);
296*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module temperature low alarm threshold", val_string);
297*266c2bebSRobin Zhang SFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_HWARN]);
298*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module temperature high warning threshold", val_string);
299*266c2bebSRobin Zhang SFF_SPRINT_TEMP(val_string, sd.sfp_temp[SFF_LWARN]);
300*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module temperature low warning threshold", val_string);
301*266c2bebSRobin Zhang
302*266c2bebSRobin Zhang SFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_HALRM]);
303*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module voltage high alarm threshold", val_string);
304*266c2bebSRobin Zhang SFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_LALRM]);
305*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module voltage low alarm threshold", val_string);
306*266c2bebSRobin Zhang SFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_HWARN]);
307*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module voltage high warning threshold", val_string);
308*266c2bebSRobin Zhang SFF_SPRINT_VCC(val_string, sd.sfp_voltage[SFF_LWARN]);
309*266c2bebSRobin Zhang ssf_add_dict_string(d, "Module voltage low alarm threshold", val_string);
310*266c2bebSRobin Zhang
311*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_HALRM]);
312*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser rx power high alarm threshold", val_string);
313*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_LALRM]);
314*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser rx power low alarm threshold", val_string);
315*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_HWARN]);
316*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser rx power high warning threshold", val_string);
317*266c2bebSRobin Zhang SFF_SPRINT_xX_PWR(val_string, sd.rx_power[SFF_LWARN]);
318*266c2bebSRobin Zhang ssf_add_dict_string(d, "Laser rx power low warning threshold", val_string);
319*266c2bebSRobin Zhang }
320