xref: /aosp_15_r20/external/ethtool/sff-common.h (revision 1b481fc3bb1b45d4cf28d1ec12969dc1055f555d)
1*1b481fc3SMaciej Żenczykowski /*
2*1b481fc3SMaciej Żenczykowski  * sff-common.h: 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 specs (ftp://ftp.seagate.com/pub/sff/SFF-8024.PDF)
20*1b481fc3SMaciej Żenczykowski  *   by SFF Committee.
21*1b481fc3SMaciej Żenczykowski  */
22*1b481fc3SMaciej Żenczykowski 
23*1b481fc3SMaciej Żenczykowski #ifndef SFF_COMMON_H__
24*1b481fc3SMaciej Żenczykowski #define SFF_COMMON_H__
25*1b481fc3SMaciej Żenczykowski 
26*1b481fc3SMaciej Żenczykowski #include <stdio.h>
27*1b481fc3SMaciej Żenczykowski #include "internal.h"
28*1b481fc3SMaciej Żenczykowski 
29*1b481fc3SMaciej Żenczykowski /* Revision compliance */
30*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_UNSPECIFIED		0x00
31*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_8436_48			0x01
32*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_8436_8636			0x02
33*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_8636_13			0x03
34*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_8636_14			0x04
35*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_8636_15			0x05
36*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_8636_20			0x06
37*1b481fc3SMaciej Żenczykowski #define  SFF8636_REV_8636_27			0x07
38*1b481fc3SMaciej Żenczykowski 
39*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_OFFSET				0x00
40*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_UNKNOWN				0x00
41*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_GBIC				0x01
42*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_SOLDERED_MODULE		0x02
43*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_SFP					0x03
44*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_300_PIN_XBI			0x04
45*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_XENPAK				0x05
46*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_XFP					0x06
47*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_XFF					0x07
48*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_XFP_E				0x08
49*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_XPAK				0x09
50*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_X2					0x0A
51*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_DWDM_SFP			0x0B
52*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_QSFP				0x0C
53*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_QSFP_PLUS			0x0D
54*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_CXP					0x0E
55*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_HD4X				0x0F
56*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_HD8X				0x10
57*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_QSFP28				0x11
58*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_CXP2				0x12
59*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_CDFP				0x13
60*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_HD4X_FANOUT			0x14
61*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_HD8X_FANOUT			0x15
62*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_CDFP_S3				0x16
63*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_MICRO_QSFP			0x17
64*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_QSFP_DD				0x18
65*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_OSFP				0x19
66*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_DSFP				0x1B
67*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_LAST				SFF8024_ID_DSFP
68*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_UNALLOCATED_LAST	0x7F
69*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_VENDOR_START		0x80
70*1b481fc3SMaciej Żenczykowski #define  SFF8024_ID_VENDOR_LAST			0xFF
71*1b481fc3SMaciej Żenczykowski 
72*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_UNKNOWN			0x00
73*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_SC				0x01
74*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_FC_STYLE_1		0x02
75*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_FC_STYLE_2		0x03
76*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_BNC_TNC			0x04
77*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_FC_COAX			0x05
78*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_FIBER_JACK		0x06
79*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_LC				0x07
80*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_MT_RJ				0x08
81*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_MU				0x09
82*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_SG				0x0A
83*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_OPT_PT			0x0B
84*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_MPO				0x0C
85*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_MPO_2				0x0D
86*1b481fc3SMaciej Żenczykowski /* 0E-1Fh --- Reserved */
87*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_HSDC_II			0x20
88*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_COPPER_PT			0x21
89*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_RJ45				0x22
90*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_NO_SEPARABLE		0x23
91*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_MXC_2x16			0x24
92*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_CS_OPTICAL		0x25
93*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_CS_OPTICAL_MINI		0x26
94*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_MPO_2X12			0x27
95*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_MPO_1X16			0x28
96*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_LAST			SFF8024_CTOR_MPO_1X16
97*1b481fc3SMaciej Żenczykowski 
98*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_NO_SEP_QSFP_DD		0x6F
99*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_UNALLOCATED_LAST		0x7F
100*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_VENDOR_START		0x80
101*1b481fc3SMaciej Żenczykowski #define  SFF8024_CTOR_VENDOR_LAST		0xFF
102*1b481fc3SMaciej Żenczykowski 
103*1b481fc3SMaciej Żenczykowski /* ENCODING Values */
104*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_UNSPEC		0x00
105*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_8B10B			0x01
106*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_4B5B			0x02
107*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_NRZ			0x03
108*1b481fc3SMaciej Żenczykowski /*
109*1b481fc3SMaciej Żenczykowski  * Value: 04h
110*1b481fc3SMaciej Żenczykowski  * SFF-8472      - Manchester
111*1b481fc3SMaciej Żenczykowski  * SFF-8436/8636 - SONET Scrambled
112*1b481fc3SMaciej Żenczykowski  */
113*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_4h			0x04
114*1b481fc3SMaciej Żenczykowski /*
115*1b481fc3SMaciej Żenczykowski  * Value: 05h
116*1b481fc3SMaciej Żenczykowski  * SFF-8472      - SONET Scrambled
117*1b481fc3SMaciej Żenczykowski  * SFF-8436/8636 - 64B/66B
118*1b481fc3SMaciej Żenczykowski  */
119*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_5h			0x05
120*1b481fc3SMaciej Żenczykowski /*
121*1b481fc3SMaciej Żenczykowski  * Value: 06h
122*1b481fc3SMaciej Żenczykowski  * SFF-8472      - 64B/66B
123*1b481fc3SMaciej Żenczykowski  * SFF-8436/8636 - Manchester
124*1b481fc3SMaciej Żenczykowski  */
125*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_6h			0x06
126*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_256B			0x07
127*1b481fc3SMaciej Żenczykowski #define  SFF8024_ENCODING_PAM4			0x08
128*1b481fc3SMaciej Żenczykowski 
129*1b481fc3SMaciej Żenczykowski /* Most common case: 16-bit unsigned integer in a certain unit */
130*1b481fc3SMaciej Żenczykowski #define OFFSET_TO_U16_PTR(ptr, offset) (ptr[offset] << 8 | ptr[(offset) + 1])
131*1b481fc3SMaciej Żenczykowski #define OFFSET_TO_U16(offset) OFFSET_TO_U16_PTR(id, offset)
132*1b481fc3SMaciej Żenczykowski 
133*1b481fc3SMaciej Żenczykowski # define PRINT_xX_PWR(string, var)                             \
134*1b481fc3SMaciej Żenczykowski 		printf("\t%-41s : %.4f mW / %.2f dBm\n", (string),         \
135*1b481fc3SMaciej Żenczykowski 		      (double)((var) / 10000.),                           \
136*1b481fc3SMaciej Żenczykowski 		       convert_mw_to_dbm((double)((var) / 10000.)))
137*1b481fc3SMaciej Żenczykowski 
138*1b481fc3SMaciej Żenczykowski #define PRINT_BIAS(string, bias_cur)                             \
139*1b481fc3SMaciej Żenczykowski 		printf("\t%-41s : %.3f mA\n", (string),                       \
140*1b481fc3SMaciej Żenczykowski 		      (double)(bias_cur / 500.))
141*1b481fc3SMaciej Żenczykowski 
142*1b481fc3SMaciej Żenczykowski #define PRINT_TEMP(string, temp)                                   \
143*1b481fc3SMaciej Żenczykowski 		printf("\t%-41s : %.2f degrees C / %.2f degrees F\n", \
144*1b481fc3SMaciej Żenczykowski 		      (string), (double)(temp / 256.),                \
145*1b481fc3SMaciej Żenczykowski 		      (double)(temp / 256. * 1.8 + 32.))
146*1b481fc3SMaciej Żenczykowski 
147*1b481fc3SMaciej Żenczykowski #define PRINT_VCC(string, sfp_voltage)          \
148*1b481fc3SMaciej Żenczykowski 		printf("\t%-41s : %.4f V\n", (string),       \
149*1b481fc3SMaciej Żenczykowski 		      (double)(sfp_voltage / 10000.))
150*1b481fc3SMaciej Żenczykowski 
151*1b481fc3SMaciej Żenczykowski # define PRINT_xX_THRESH_PWR(string, var, index)                       \
152*1b481fc3SMaciej Żenczykowski 		PRINT_xX_PWR(string, (var)[(index)])
153*1b481fc3SMaciej Żenczykowski 
154*1b481fc3SMaciej Żenczykowski /* Channel Monitoring Fields */
155*1b481fc3SMaciej Żenczykowski struct sff_channel_diags {
156*1b481fc3SMaciej Żenczykowski 	__u16 bias_cur;      /* Measured bias current in 2uA units */
157*1b481fc3SMaciej Żenczykowski 	__u16 rx_power;      /* Measured RX Power */
158*1b481fc3SMaciej Żenczykowski 	__u16 tx_power;      /* Measured TX Power */
159*1b481fc3SMaciej Żenczykowski };
160*1b481fc3SMaciej Żenczykowski 
161*1b481fc3SMaciej Żenczykowski /* Module Monitoring Fields */
162*1b481fc3SMaciej Żenczykowski struct sff_diags {
163*1b481fc3SMaciej Żenczykowski 
164*1b481fc3SMaciej Żenczykowski #define MAX_CHANNEL_NUM 32
165*1b481fc3SMaciej Żenczykowski #define LWARN 0
166*1b481fc3SMaciej Żenczykowski #define HWARN 1
167*1b481fc3SMaciej Żenczykowski #define LALRM 2
168*1b481fc3SMaciej Żenczykowski #define HALRM 3
169*1b481fc3SMaciej Żenczykowski #define MCURR 4
170*1b481fc3SMaciej Żenczykowski 
171*1b481fc3SMaciej Żenczykowski 	/* Supports DOM */
172*1b481fc3SMaciej Żenczykowski 	__u8 supports_dom;
173*1b481fc3SMaciej Żenczykowski 	/* Supports alarm/warning thold */
174*1b481fc3SMaciej Żenczykowski 	__u8 supports_alarms;
175*1b481fc3SMaciej Żenczykowski 	/* RX Power: 0 = OMA, 1 = Average power */
176*1b481fc3SMaciej Żenczykowski 	__u8  rx_power_type;
177*1b481fc3SMaciej Żenczykowski 	/* TX Power: 0 = Not supported, 1 = Average power */
178*1b481fc3SMaciej Żenczykowski 	__u8  tx_power_type;
179*1b481fc3SMaciej Żenczykowski 
180*1b481fc3SMaciej Żenczykowski 	__u8 calibrated_ext;    /* Is externally calibrated */
181*1b481fc3SMaciej Żenczykowski 	/* [5] tables are low/high warn, low/high alarm, current */
182*1b481fc3SMaciej Żenczykowski 	/* SFP voltage in 0.1mV units */
183*1b481fc3SMaciej Żenczykowski 	__u16 sfp_voltage[5];
184*1b481fc3SMaciej Żenczykowski 	/* SFP Temp in 16-bit signed 1/256 Celcius */
185*1b481fc3SMaciej Żenczykowski 	__s16 sfp_temp[5];
186*1b481fc3SMaciej Żenczykowski 	/* Measured bias current in 2uA units */
187*1b481fc3SMaciej Żenczykowski 	__u16 bias_cur[5];
188*1b481fc3SMaciej Żenczykowski 	/* Measured TX Power */
189*1b481fc3SMaciej Żenczykowski 	__u16 tx_power[5];
190*1b481fc3SMaciej Żenczykowski 	/* Measured RX Power */
191*1b481fc3SMaciej Żenczykowski 	__u16 rx_power[5];
192*1b481fc3SMaciej Żenczykowski 	struct sff_channel_diags scd[MAX_CHANNEL_NUM];
193*1b481fc3SMaciej Żenczykowski };
194*1b481fc3SMaciej Żenczykowski 
195*1b481fc3SMaciej Żenczykowski double convert_mw_to_dbm(double mw);
196*1b481fc3SMaciej Żenczykowski void sff_show_value_with_unit(const __u8 *id, unsigned int reg,
197*1b481fc3SMaciej Żenczykowski 			      const char *name, unsigned int mult,
198*1b481fc3SMaciej Żenczykowski 			      const char *unit);
199*1b481fc3SMaciej Żenczykowski void sff_show_ascii(const __u8 *id, unsigned int first_reg,
200*1b481fc3SMaciej Żenczykowski 		    unsigned int last_reg, const char *name);
201*1b481fc3SMaciej Żenczykowski void sff_show_lane_status(const char *name, unsigned int lane_cnt,
202*1b481fc3SMaciej Żenczykowski 			  const char *yes, const char *no, unsigned int value);
203*1b481fc3SMaciej Żenczykowski void sff_show_thresholds(struct sff_diags sd);
204*1b481fc3SMaciej Żenczykowski 
205*1b481fc3SMaciej Żenczykowski void sff8024_show_oui(const __u8 *id, int id_offset);
206*1b481fc3SMaciej Żenczykowski void sff8024_show_identifier(const __u8 *id, int id_offset);
207*1b481fc3SMaciej Żenczykowski void sff8024_show_connector(const __u8 *id, int ctor_offset);
208*1b481fc3SMaciej Żenczykowski void sff8024_show_encoding(const __u8 *id, int encoding_offset, int sff_type);
209*1b481fc3SMaciej Żenczykowski void sff_show_revision_compliance(const __u8 *id, int rev_offset);
210*1b481fc3SMaciej Żenczykowski 
211*1b481fc3SMaciej Żenczykowski #endif /* SFF_COMMON_H__ */
212