1*1b481fc3SMaciej Żenczykowski /*
2*1b481fc3SMaciej Żenczykowski * sff-common.c: Implements SFF-8024 Rev 4.0 i.e. Specifcation
3*1b481fc3SMaciej Żenczykowski * of pluggable I/O configuration
4*1b481fc3SMaciej Żenczykowski *
5*1b481fc3SMaciej Żenczykowski * Common utilities across SFF-8436/8636 and SFF-8472/8079
6*1b481fc3SMaciej Żenczykowski * are defined in this file
7*1b481fc3SMaciej Żenczykowski *
8*1b481fc3SMaciej Żenczykowski * Copyright 2010 Solarflare Communications Inc.
9*1b481fc3SMaciej Żenczykowski * Aurelien Guillaume <[email protected]> (C) 2012
10*1b481fc3SMaciej Żenczykowski * Copyright (C) 2014 Cumulus networks Inc.
11*1b481fc3SMaciej Żenczykowski *
12*1b481fc3SMaciej Żenczykowski * This program is free software; you can redistribute it and/or modify
13*1b481fc3SMaciej Żenczykowski * it under the terms of the GNU General Public License as published by
14*1b481fc3SMaciej Żenczykowski * the Freeoftware Foundation; either version 2 of the License, or
15*1b481fc3SMaciej Żenczykowski * (at your option) any later version.
16*1b481fc3SMaciej Żenczykowski *
17*1b481fc3SMaciej Żenczykowski * Vidya Sagar Ravipati <[email protected]>
18*1b481fc3SMaciej Żenczykowski * This implementation is loosely based on current SFP parser
19*1b481fc3SMaciej Żenczykowski * and SFF-8024 Rev 4.0 spec (ftp://ftp.seagate.com/pub/sff/SFF-8024.PDF)
20*1b481fc3SMaciej Żenczykowski * by SFF Committee.
21*1b481fc3SMaciej Żenczykowski */
22*1b481fc3SMaciej Żenczykowski
23*1b481fc3SMaciej Żenczykowski #include <stdio.h>
24*1b481fc3SMaciej Żenczykowski #include <math.h>
25*1b481fc3SMaciej Żenczykowski #include "sff-common.h"
26*1b481fc3SMaciej Żenczykowski
convert_mw_to_dbm(double mw)27*1b481fc3SMaciej Żenczykowski double convert_mw_to_dbm(double mw)
28*1b481fc3SMaciej Żenczykowski {
29*1b481fc3SMaciej Żenczykowski return (10. * log10(mw / 1000.)) + 30.;
30*1b481fc3SMaciej Żenczykowski }
31*1b481fc3SMaciej Żenczykowski
sff_show_value_with_unit(const __u8 * id,unsigned int reg,const char * name,unsigned int mult,const char * unit)32*1b481fc3SMaciej Żenczykowski void sff_show_value_with_unit(const __u8 *id, unsigned int reg,
33*1b481fc3SMaciej Żenczykowski const char *name, unsigned int mult,
34*1b481fc3SMaciej Żenczykowski const char *unit)
35*1b481fc3SMaciej Żenczykowski {
36*1b481fc3SMaciej Żenczykowski unsigned int val = id[reg];
37*1b481fc3SMaciej Żenczykowski
38*1b481fc3SMaciej Żenczykowski printf("\t%-41s : %u%s\n", name, val * mult, unit);
39*1b481fc3SMaciej Żenczykowski }
40*1b481fc3SMaciej Żenczykowski
sff_show_ascii(const __u8 * id,unsigned int first_reg,unsigned int last_reg,const char * name)41*1b481fc3SMaciej Żenczykowski void sff_show_ascii(const __u8 *id, unsigned int first_reg,
42*1b481fc3SMaciej Żenczykowski unsigned int last_reg, const char *name)
43*1b481fc3SMaciej Żenczykowski {
44*1b481fc3SMaciej Żenczykowski unsigned int reg, val;
45*1b481fc3SMaciej Żenczykowski
46*1b481fc3SMaciej Żenczykowski printf("\t%-41s : ", name);
47*1b481fc3SMaciej Żenczykowski while (first_reg <= last_reg && id[last_reg] == ' ')
48*1b481fc3SMaciej Żenczykowski last_reg--;
49*1b481fc3SMaciej Żenczykowski for (reg = first_reg; reg <= last_reg; reg++) {
50*1b481fc3SMaciej Żenczykowski val = id[reg];
51*1b481fc3SMaciej Żenczykowski putchar(((val >= 32) && (val <= 126)) ? val : '_');
52*1b481fc3SMaciej Żenczykowski }
53*1b481fc3SMaciej Żenczykowski printf("\n");
54*1b481fc3SMaciej Żenczykowski }
55*1b481fc3SMaciej Żenczykowski
sff_show_lane_status(const char * name,unsigned int lane_cnt,const char * yes,const char * no,unsigned int value)56*1b481fc3SMaciej Żenczykowski void sff_show_lane_status(const char *name, unsigned int lane_cnt,
57*1b481fc3SMaciej Żenczykowski const char *yes, const char *no, unsigned int value)
58*1b481fc3SMaciej Żenczykowski {
59*1b481fc3SMaciej Żenczykowski printf("\t%-41s : ", name);
60*1b481fc3SMaciej Żenczykowski if (!value) {
61*1b481fc3SMaciej Żenczykowski printf("None\n");
62*1b481fc3SMaciej Żenczykowski return;
63*1b481fc3SMaciej Żenczykowski }
64*1b481fc3SMaciej Żenczykowski
65*1b481fc3SMaciej Żenczykowski printf("[");
66*1b481fc3SMaciej Żenczykowski while (lane_cnt--) {
67*1b481fc3SMaciej Żenczykowski printf(" %s%c", value & 1 ? yes : no, lane_cnt ? ',': ' ');
68*1b481fc3SMaciej Żenczykowski value >>= 1;
69*1b481fc3SMaciej Żenczykowski }
70*1b481fc3SMaciej Żenczykowski printf("]\n");
71*1b481fc3SMaciej Żenczykowski }
72*1b481fc3SMaciej Żenczykowski
sff8024_show_oui(const __u8 * id,int id_offset)73*1b481fc3SMaciej Żenczykowski void sff8024_show_oui(const __u8 *id, int id_offset)
74*1b481fc3SMaciej Żenczykowski {
75*1b481fc3SMaciej Żenczykowski printf("\t%-41s : %02x:%02x:%02x\n", "Vendor OUI",
76*1b481fc3SMaciej Żenczykowski id[id_offset], id[(id_offset) + 1],
77*1b481fc3SMaciej Żenczykowski id[(id_offset) + 2]);
78*1b481fc3SMaciej Żenczykowski }
79*1b481fc3SMaciej Żenczykowski
sff8024_show_identifier(const __u8 * id,int id_offset)80*1b481fc3SMaciej Żenczykowski void sff8024_show_identifier(const __u8 *id, int id_offset)
81*1b481fc3SMaciej Żenczykowski {
82*1b481fc3SMaciej Żenczykowski printf("\t%-41s : 0x%02x", "Identifier", id[id_offset]);
83*1b481fc3SMaciej Żenczykowski switch (id[id_offset]) {
84*1b481fc3SMaciej Żenczykowski case SFF8024_ID_UNKNOWN:
85*1b481fc3SMaciej Żenczykowski printf(" (no module present, unknown, or unspecified)\n");
86*1b481fc3SMaciej Żenczykowski break;
87*1b481fc3SMaciej Żenczykowski case SFF8024_ID_GBIC:
88*1b481fc3SMaciej Żenczykowski printf(" (GBIC)\n");
89*1b481fc3SMaciej Żenczykowski break;
90*1b481fc3SMaciej Żenczykowski case SFF8024_ID_SOLDERED_MODULE:
91*1b481fc3SMaciej Żenczykowski printf(" (module soldered to motherboard)\n");
92*1b481fc3SMaciej Żenczykowski break;
93*1b481fc3SMaciej Żenczykowski case SFF8024_ID_SFP:
94*1b481fc3SMaciej Żenczykowski printf(" (SFP)\n");
95*1b481fc3SMaciej Żenczykowski break;
96*1b481fc3SMaciej Żenczykowski case SFF8024_ID_300_PIN_XBI:
97*1b481fc3SMaciej Żenczykowski printf(" (300 pin XBI)\n");
98*1b481fc3SMaciej Żenczykowski break;
99*1b481fc3SMaciej Żenczykowski case SFF8024_ID_XENPAK:
100*1b481fc3SMaciej Żenczykowski printf(" (XENPAK)\n");
101*1b481fc3SMaciej Żenczykowski break;
102*1b481fc3SMaciej Żenczykowski case SFF8024_ID_XFP:
103*1b481fc3SMaciej Żenczykowski printf(" (XFP)\n");
104*1b481fc3SMaciej Żenczykowski break;
105*1b481fc3SMaciej Żenczykowski case SFF8024_ID_XFF:
106*1b481fc3SMaciej Żenczykowski printf(" (XFF)\n");
107*1b481fc3SMaciej Żenczykowski break;
108*1b481fc3SMaciej Żenczykowski case SFF8024_ID_XFP_E:
109*1b481fc3SMaciej Żenczykowski printf(" (XFP-E)\n");
110*1b481fc3SMaciej Żenczykowski break;
111*1b481fc3SMaciej Żenczykowski case SFF8024_ID_XPAK:
112*1b481fc3SMaciej Żenczykowski printf(" (XPAK)\n");
113*1b481fc3SMaciej Żenczykowski break;
114*1b481fc3SMaciej Żenczykowski case SFF8024_ID_X2:
115*1b481fc3SMaciej Żenczykowski printf(" (X2)\n");
116*1b481fc3SMaciej Żenczykowski break;
117*1b481fc3SMaciej Żenczykowski case SFF8024_ID_DWDM_SFP:
118*1b481fc3SMaciej Żenczykowski printf(" (DWDM-SFP)\n");
119*1b481fc3SMaciej Żenczykowski break;
120*1b481fc3SMaciej Żenczykowski case SFF8024_ID_QSFP:
121*1b481fc3SMaciej Żenczykowski printf(" (QSFP)\n");
122*1b481fc3SMaciej Żenczykowski break;
123*1b481fc3SMaciej Żenczykowski case SFF8024_ID_QSFP_PLUS:
124*1b481fc3SMaciej Żenczykowski printf(" (QSFP+)\n");
125*1b481fc3SMaciej Żenczykowski break;
126*1b481fc3SMaciej Żenczykowski case SFF8024_ID_CXP:
127*1b481fc3SMaciej Żenczykowski printf(" (CXP)\n");
128*1b481fc3SMaciej Żenczykowski break;
129*1b481fc3SMaciej Żenczykowski case SFF8024_ID_HD4X:
130*1b481fc3SMaciej Żenczykowski printf(" (Shielded Mini Multilane HD 4X)\n");
131*1b481fc3SMaciej Żenczykowski break;
132*1b481fc3SMaciej Żenczykowski case SFF8024_ID_HD8X:
133*1b481fc3SMaciej Żenczykowski printf(" (Shielded Mini Multilane HD 8X)\n");
134*1b481fc3SMaciej Żenczykowski break;
135*1b481fc3SMaciej Żenczykowski case SFF8024_ID_QSFP28:
136*1b481fc3SMaciej Żenczykowski printf(" (QSFP28)\n");
137*1b481fc3SMaciej Żenczykowski break;
138*1b481fc3SMaciej Żenczykowski case SFF8024_ID_CXP2:
139*1b481fc3SMaciej Żenczykowski printf(" (CXP2/CXP28)\n");
140*1b481fc3SMaciej Żenczykowski break;
141*1b481fc3SMaciej Żenczykowski case SFF8024_ID_CDFP:
142*1b481fc3SMaciej Żenczykowski printf(" (CDFP Style 1/Style 2)\n");
143*1b481fc3SMaciej Żenczykowski break;
144*1b481fc3SMaciej Żenczykowski case SFF8024_ID_HD4X_FANOUT:
145*1b481fc3SMaciej Żenczykowski printf(" (Shielded Mini Multilane HD 4X Fanout Cable)\n");
146*1b481fc3SMaciej Żenczykowski break;
147*1b481fc3SMaciej Żenczykowski case SFF8024_ID_HD8X_FANOUT:
148*1b481fc3SMaciej Żenczykowski printf(" (Shielded Mini Multilane HD 8X Fanout Cable)\n");
149*1b481fc3SMaciej Żenczykowski break;
150*1b481fc3SMaciej Żenczykowski case SFF8024_ID_CDFP_S3:
151*1b481fc3SMaciej Żenczykowski printf(" (CDFP Style 3)\n");
152*1b481fc3SMaciej Żenczykowski break;
153*1b481fc3SMaciej Żenczykowski case SFF8024_ID_MICRO_QSFP:
154*1b481fc3SMaciej Żenczykowski printf(" (microQSFP)\n");
155*1b481fc3SMaciej Żenczykowski break;
156*1b481fc3SMaciej Żenczykowski case SFF8024_ID_QSFP_DD:
157*1b481fc3SMaciej Żenczykowski printf(" (QSFP-DD Double Density 8X Pluggable Transceiver (INF-8628))\n");
158*1b481fc3SMaciej Żenczykowski break;
159*1b481fc3SMaciej Żenczykowski case SFF8024_ID_OSFP:
160*1b481fc3SMaciej Żenczykowski printf(" (OSFP 8X Pluggable Transceiver)\n");
161*1b481fc3SMaciej Żenczykowski break;
162*1b481fc3SMaciej Żenczykowski case SFF8024_ID_DSFP:
163*1b481fc3SMaciej Żenczykowski printf(" (DSFP Dual Small Form Factor Pluggable Transceiver)\n");
164*1b481fc3SMaciej Żenczykowski break;
165*1b481fc3SMaciej Żenczykowski default:
166*1b481fc3SMaciej Żenczykowski printf(" (reserved or unknown)\n");
167*1b481fc3SMaciej Żenczykowski break;
168*1b481fc3SMaciej Żenczykowski }
169*1b481fc3SMaciej Żenczykowski }
170*1b481fc3SMaciej Żenczykowski
sff8024_show_connector(const __u8 * id,int ctor_offset)171*1b481fc3SMaciej Żenczykowski void sff8024_show_connector(const __u8 *id, int ctor_offset)
172*1b481fc3SMaciej Żenczykowski {
173*1b481fc3SMaciej Żenczykowski printf("\t%-41s : 0x%02x", "Connector", id[ctor_offset]);
174*1b481fc3SMaciej Żenczykowski switch (id[ctor_offset]) {
175*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_UNKNOWN:
176*1b481fc3SMaciej Żenczykowski printf(" (unknown or unspecified)\n");
177*1b481fc3SMaciej Żenczykowski break;
178*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_SC:
179*1b481fc3SMaciej Żenczykowski printf(" (SC)\n");
180*1b481fc3SMaciej Żenczykowski break;
181*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_FC_STYLE_1:
182*1b481fc3SMaciej Żenczykowski printf(" (Fibre Channel Style 1 copper)\n");
183*1b481fc3SMaciej Żenczykowski break;
184*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_FC_STYLE_2:
185*1b481fc3SMaciej Żenczykowski printf(" (Fibre Channel Style 2 copper)\n");
186*1b481fc3SMaciej Żenczykowski break;
187*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_BNC_TNC:
188*1b481fc3SMaciej Żenczykowski printf(" (BNC/TNC)\n");
189*1b481fc3SMaciej Żenczykowski break;
190*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_FC_COAX:
191*1b481fc3SMaciej Żenczykowski printf(" (Fibre Channel coaxial headers)\n");
192*1b481fc3SMaciej Żenczykowski break;
193*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_FIBER_JACK:
194*1b481fc3SMaciej Żenczykowski printf(" (FibreJack)\n");
195*1b481fc3SMaciej Żenczykowski break;
196*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_LC:
197*1b481fc3SMaciej Żenczykowski printf(" (LC)\n");
198*1b481fc3SMaciej Żenczykowski break;
199*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_MT_RJ:
200*1b481fc3SMaciej Żenczykowski printf(" (MT-RJ)\n");
201*1b481fc3SMaciej Żenczykowski break;
202*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_MU:
203*1b481fc3SMaciej Żenczykowski printf(" (MU)\n");
204*1b481fc3SMaciej Żenczykowski break;
205*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_SG:
206*1b481fc3SMaciej Żenczykowski printf(" (SG)\n");
207*1b481fc3SMaciej Żenczykowski break;
208*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_OPT_PT:
209*1b481fc3SMaciej Żenczykowski printf(" (Optical pigtail)\n");
210*1b481fc3SMaciej Żenczykowski break;
211*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_MPO:
212*1b481fc3SMaciej Żenczykowski printf(" (MPO Parallel Optic)\n");
213*1b481fc3SMaciej Żenczykowski break;
214*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_MPO_2:
215*1b481fc3SMaciej Żenczykowski printf(" (MPO Parallel Optic - 2x16)\n");
216*1b481fc3SMaciej Żenczykowski break;
217*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_HSDC_II:
218*1b481fc3SMaciej Żenczykowski printf(" (HSSDC II)\n");
219*1b481fc3SMaciej Żenczykowski break;
220*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_COPPER_PT:
221*1b481fc3SMaciej Żenczykowski printf(" (Copper pigtail)\n");
222*1b481fc3SMaciej Żenczykowski break;
223*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_RJ45:
224*1b481fc3SMaciej Żenczykowski printf(" (RJ45)\n");
225*1b481fc3SMaciej Żenczykowski break;
226*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_NO_SEPARABLE:
227*1b481fc3SMaciej Żenczykowski printf(" (No separable connector)\n");
228*1b481fc3SMaciej Żenczykowski break;
229*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_MXC_2x16:
230*1b481fc3SMaciej Żenczykowski printf(" (MXC 2x16)\n");
231*1b481fc3SMaciej Żenczykowski break;
232*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_CS_OPTICAL:
233*1b481fc3SMaciej Żenczykowski printf(" (CS optical connector)\n");
234*1b481fc3SMaciej Żenczykowski break;
235*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_CS_OPTICAL_MINI:
236*1b481fc3SMaciej Żenczykowski printf(" (Mini CS optical connector)\n");
237*1b481fc3SMaciej Żenczykowski break;
238*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_MPO_2X12:
239*1b481fc3SMaciej Żenczykowski printf(" (MPO 2x12)\n");
240*1b481fc3SMaciej Żenczykowski break;
241*1b481fc3SMaciej Żenczykowski case SFF8024_CTOR_MPO_1X16:
242*1b481fc3SMaciej Żenczykowski printf(" (MPO 1x16)\n");
243*1b481fc3SMaciej Żenczykowski break;
244*1b481fc3SMaciej Żenczykowski default:
245*1b481fc3SMaciej Żenczykowski printf(" (reserved or unknown)\n");
246*1b481fc3SMaciej Żenczykowski break;
247*1b481fc3SMaciej Żenczykowski }
248*1b481fc3SMaciej Żenczykowski }
249*1b481fc3SMaciej Żenczykowski
sff8024_show_encoding(const __u8 * id,int encoding_offset,int sff_type)250*1b481fc3SMaciej Żenczykowski void sff8024_show_encoding(const __u8 *id, int encoding_offset, int sff_type)
251*1b481fc3SMaciej Żenczykowski {
252*1b481fc3SMaciej Żenczykowski printf("\t%-41s : 0x%02x", "Encoding", id[encoding_offset]);
253*1b481fc3SMaciej Żenczykowski switch (id[encoding_offset]) {
254*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_UNSPEC:
255*1b481fc3SMaciej Żenczykowski printf(" (unspecified)\n");
256*1b481fc3SMaciej Żenczykowski break;
257*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_8B10B:
258*1b481fc3SMaciej Żenczykowski printf(" (8B/10B)\n");
259*1b481fc3SMaciej Żenczykowski break;
260*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_4B5B:
261*1b481fc3SMaciej Żenczykowski printf(" (4B/5B)\n");
262*1b481fc3SMaciej Żenczykowski break;
263*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_NRZ:
264*1b481fc3SMaciej Żenczykowski printf(" (NRZ)\n");
265*1b481fc3SMaciej Żenczykowski break;
266*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_4h:
267*1b481fc3SMaciej Żenczykowski if (sff_type == ETH_MODULE_SFF_8472)
268*1b481fc3SMaciej Żenczykowski printf(" (Manchester)\n");
269*1b481fc3SMaciej Żenczykowski else if (sff_type == ETH_MODULE_SFF_8636)
270*1b481fc3SMaciej Żenczykowski printf(" (SONET Scrambled)\n");
271*1b481fc3SMaciej Żenczykowski break;
272*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_5h:
273*1b481fc3SMaciej Żenczykowski if (sff_type == ETH_MODULE_SFF_8472)
274*1b481fc3SMaciej Żenczykowski printf(" (SONET Scrambled)\n");
275*1b481fc3SMaciej Żenczykowski else if (sff_type == ETH_MODULE_SFF_8636)
276*1b481fc3SMaciej Żenczykowski printf(" (64B/66B)\n");
277*1b481fc3SMaciej Żenczykowski break;
278*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_6h:
279*1b481fc3SMaciej Żenczykowski if (sff_type == ETH_MODULE_SFF_8472)
280*1b481fc3SMaciej Żenczykowski printf(" (64B/66B)\n");
281*1b481fc3SMaciej Żenczykowski else if (sff_type == ETH_MODULE_SFF_8636)
282*1b481fc3SMaciej Żenczykowski printf(" (Manchester)\n");
283*1b481fc3SMaciej Żenczykowski break;
284*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_256B:
285*1b481fc3SMaciej Żenczykowski printf(" ((256B/257B (transcoded FEC-enabled data))\n");
286*1b481fc3SMaciej Żenczykowski break;
287*1b481fc3SMaciej Żenczykowski case SFF8024_ENCODING_PAM4:
288*1b481fc3SMaciej Żenczykowski printf(" (PAM4)\n");
289*1b481fc3SMaciej Żenczykowski break;
290*1b481fc3SMaciej Żenczykowski default:
291*1b481fc3SMaciej Żenczykowski printf(" (reserved or unknown)\n");
292*1b481fc3SMaciej Żenczykowski break;
293*1b481fc3SMaciej Żenczykowski }
294*1b481fc3SMaciej Żenczykowski }
295*1b481fc3SMaciej Żenczykowski
sff_show_thresholds(struct sff_diags sd)296*1b481fc3SMaciej Żenczykowski void sff_show_thresholds(struct sff_diags sd)
297*1b481fc3SMaciej Żenczykowski {
298*1b481fc3SMaciej Żenczykowski PRINT_BIAS("Laser bias current high alarm threshold",
299*1b481fc3SMaciej Żenczykowski sd.bias_cur[HALRM]);
300*1b481fc3SMaciej Żenczykowski PRINT_BIAS("Laser bias current low alarm threshold",
301*1b481fc3SMaciej Żenczykowski sd.bias_cur[LALRM]);
302*1b481fc3SMaciej Żenczykowski PRINT_BIAS("Laser bias current high warning threshold",
303*1b481fc3SMaciej Żenczykowski sd.bias_cur[HWARN]);
304*1b481fc3SMaciej Żenczykowski PRINT_BIAS("Laser bias current low warning threshold",
305*1b481fc3SMaciej Żenczykowski sd.bias_cur[LWARN]);
306*1b481fc3SMaciej Żenczykowski
307*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser output power high alarm threshold",
308*1b481fc3SMaciej Żenczykowski sd.tx_power[HALRM]);
309*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser output power low alarm threshold",
310*1b481fc3SMaciej Żenczykowski sd.tx_power[LALRM]);
311*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser output power high warning threshold",
312*1b481fc3SMaciej Żenczykowski sd.tx_power[HWARN]);
313*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser output power low warning threshold",
314*1b481fc3SMaciej Żenczykowski sd.tx_power[LWARN]);
315*1b481fc3SMaciej Żenczykowski
316*1b481fc3SMaciej Żenczykowski PRINT_TEMP("Module temperature high alarm threshold",
317*1b481fc3SMaciej Żenczykowski sd.sfp_temp[HALRM]);
318*1b481fc3SMaciej Żenczykowski PRINT_TEMP("Module temperature low alarm threshold",
319*1b481fc3SMaciej Żenczykowski sd.sfp_temp[LALRM]);
320*1b481fc3SMaciej Żenczykowski PRINT_TEMP("Module temperature high warning threshold",
321*1b481fc3SMaciej Żenczykowski sd.sfp_temp[HWARN]);
322*1b481fc3SMaciej Żenczykowski PRINT_TEMP("Module temperature low warning threshold",
323*1b481fc3SMaciej Żenczykowski sd.sfp_temp[LWARN]);
324*1b481fc3SMaciej Żenczykowski
325*1b481fc3SMaciej Żenczykowski PRINT_VCC("Module voltage high alarm threshold",
326*1b481fc3SMaciej Żenczykowski sd.sfp_voltage[HALRM]);
327*1b481fc3SMaciej Żenczykowski PRINT_VCC("Module voltage low alarm threshold",
328*1b481fc3SMaciej Żenczykowski sd.sfp_voltage[LALRM]);
329*1b481fc3SMaciej Żenczykowski PRINT_VCC("Module voltage high warning threshold",
330*1b481fc3SMaciej Żenczykowski sd.sfp_voltage[HWARN]);
331*1b481fc3SMaciej Żenczykowski PRINT_VCC("Module voltage low warning threshold",
332*1b481fc3SMaciej Żenczykowski sd.sfp_voltage[LWARN]);
333*1b481fc3SMaciej Żenczykowski
334*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser rx power high alarm threshold",
335*1b481fc3SMaciej Żenczykowski sd.rx_power[HALRM]);
336*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser rx power low alarm threshold",
337*1b481fc3SMaciej Żenczykowski sd.rx_power[LALRM]);
338*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser rx power high warning threshold",
339*1b481fc3SMaciej Żenczykowski sd.rx_power[HWARN]);
340*1b481fc3SMaciej Żenczykowski PRINT_xX_PWR("Laser rx power low warning threshold",
341*1b481fc3SMaciej Żenczykowski sd.rx_power[LWARN]);
342*1b481fc3SMaciej Żenczykowski }
343*1b481fc3SMaciej Żenczykowski
sff_show_revision_compliance(const __u8 * id,int rev_offset)344*1b481fc3SMaciej Żenczykowski void sff_show_revision_compliance(const __u8 *id, int rev_offset)
345*1b481fc3SMaciej Żenczykowski {
346*1b481fc3SMaciej Żenczykowski static const char *pfx =
347*1b481fc3SMaciej Żenczykowski "\tRevision Compliance :";
348*1b481fc3SMaciej Żenczykowski
349*1b481fc3SMaciej Żenczykowski switch (id[rev_offset]) {
350*1b481fc3SMaciej Żenczykowski case SFF8636_REV_UNSPECIFIED:
351*1b481fc3SMaciej Żenczykowski printf("%s Revision not specified\n", pfx);
352*1b481fc3SMaciej Żenczykowski break;
353*1b481fc3SMaciej Żenczykowski case SFF8636_REV_8436_48:
354*1b481fc3SMaciej Żenczykowski printf("%s SFF-8436 Rev 4.8 or earlier\n", pfx);
355*1b481fc3SMaciej Żenczykowski break;
356*1b481fc3SMaciej Żenczykowski case SFF8636_REV_8436_8636:
357*1b481fc3SMaciej Żenczykowski printf("%s SFF-8436 Rev 4.8 or earlier\n", pfx);
358*1b481fc3SMaciej Żenczykowski break;
359*1b481fc3SMaciej Żenczykowski case SFF8636_REV_8636_13:
360*1b481fc3SMaciej Żenczykowski printf("%s SFF-8636 Rev 1.3 or earlier\n", pfx);
361*1b481fc3SMaciej Żenczykowski break;
362*1b481fc3SMaciej Żenczykowski case SFF8636_REV_8636_14:
363*1b481fc3SMaciej Żenczykowski printf("%s SFF-8636 Rev 1.4\n", pfx);
364*1b481fc3SMaciej Żenczykowski break;
365*1b481fc3SMaciej Żenczykowski case SFF8636_REV_8636_15:
366*1b481fc3SMaciej Żenczykowski printf("%s SFF-8636 Rev 1.5\n", pfx);
367*1b481fc3SMaciej Żenczykowski break;
368*1b481fc3SMaciej Żenczykowski case SFF8636_REV_8636_20:
369*1b481fc3SMaciej Żenczykowski printf("%s SFF-8636 Rev 2.0\n", pfx);
370*1b481fc3SMaciej Żenczykowski break;
371*1b481fc3SMaciej Żenczykowski case SFF8636_REV_8636_27:
372*1b481fc3SMaciej Żenczykowski printf("%s SFF-8636 Rev 2.5/2.6/2.7\n", pfx);
373*1b481fc3SMaciej Żenczykowski break;
374*1b481fc3SMaciej Żenczykowski default:
375*1b481fc3SMaciej Żenczykowski printf("%s Unallocated\n", pfx);
376*1b481fc3SMaciej Żenczykowski break;
377*1b481fc3SMaciej Żenczykowski }
378*1b481fc3SMaciej Żenczykowski }
379