xref: /freebsd/sys/net/sff8472.h (revision 9ecd54f24fe9fa373e07c9fd7c052deb2188f545)
1 /*-
2  * Copyright (c) 2013 George V. Neville-Neil
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  *
26  * $FreeBSD$
27  */
28 
29 /*
30  * The following set of constants are from Document SFF-8472
31  * "Diagnostic Monitoring Interface for Optical Transceivers" revision
32  * 11.3 published by the SFF Committee on June 11, 2013
33  *
34  * The SFF standard defines two ranges of addresses, each 255 bytes
35  * long for the storage of data and diagnostics on cables, such as
36  * SFP+ optics and TwinAx cables.  The ranges are defined in the
37  * following way:
38  *
39  * Base Address 0xa0 (Identification Data)
40  * 0-95    Serial ID Defined by SFP MSA
41  * 96-127  Vendor Specific Data
42  * 128-255 Reserved
43  *
44  * Base Address 0xa2 (Diagnostic Data)
45  * 0-55    Alarm and Warning Thresholds
46  * 56-95   Cal Constants
47  * 96-119  Real Time Diagnostic Interface
48  * 120-127 Vendor Specific
49  * 128-247 User Writable EEPROM
50  * 248-255 Vendor Specific
51  *
52  * Note that not all addresses are supported.  Where support is
53  * optional this is noted and instructions for checking for the
54  * support are supplied.
55  *
56  * All these values are read across an I2C (i squared C) bus.  Any
57  * device wishing to read these addresses must first have support for
58  * i2c calls.  The Chelsio T4/T5 driver (dev/cxgbe) is one such
59  * driver.
60  */
61 
62 
63 /* Table 3.1 Two-wire interface ID: Data Fields */
64 
65 enum {
66 	SFF_8472_BASE 		= 0xa0,   /* Base address for all our queries. */
67 	SFF_8472_ID		= 0,  /* Transceiver Type (Table 3.2) */
68 	SFF_8472_EXT_ID		= 1,  /* Extended transceiver type (Table 3.3) */
69 	SFF_8472_CONNECTOR	= 2,  /* Connector type (Table 3.4) */
70 	SFF_8472_TRANS_START	= 3,  /* Elec or Optical Compatibility
71 				    * (Table 3.5) */
72 	SFF_8472_TRANS_END	= 10,
73 	SFF_8472_ENCODING	= 11, /* Encoding Code for high speed
74 				     * serial encoding algorithm (see
75 				     * Table 3.6) */
76 	SFF_8472_BITRATE	= 12, /* Nominal signaling rate, units
77 				     * of 100MBd.  (see details for
78 				     * rates > 25.0Gb/s) */
79 	SFF_8472_RATEID		= 13, /* Type of rate select
80 				     * functionality (see Table
81 				     * 3.6a) */
82 	SFF_8472_LEN_SMF_KM	= 14, /* Link length supported for single
83 				    * mode fiber, units of km */
84 	SFF_8472_LEN_SMF	= 15, /* Link length supported for single
85 				    * mode fiber, units of 100 m */
86 	SFF_8472_LEN_50UM	= 16, /* Link length supported for 50 um
87 				    * OM2 fiber, units of 10 m */
88 	SFF_8472_LEN_625UM	= 17, /* Link length supported for 62.5
89 				    * um OM1 fiber, units of 10 m */
90 	SFF_8472_LEN_OM4	= 18, /* Link length supported for 50um
91 				    * OM4 fiber, units of 10m.
92 				    * Alternatively copper or direct
93 				    * attach cable, units of m */
94 	SFF_8472_LEN_OM3	= 19, /* Link length supported for 50 um OM3 fiber, units of 10 m */
95 	SFF_8472_VENDOR_START 	= 20, /* Vendor name [Address A0h, Bytes
96 				    * 20-35] */
97 	SFF_8472_VENDOR_END 	= 35,
98 	SFF_8472_TRANS		= 36, /* Transceiver Code for electronic
99 				    * or optical compatibility (see
100 				    * Table 3.5) */
101 	SFF_8472_VENDOR_OUI_START	= 37, /* Vendor OUI SFP vendor IEEE
102 				    * company ID */
103 	SFF_8472_VENDOR_OUI_END	= 39,
104 	SFF_8472_PN_START 	= 40, /* Vendor PN */
105 	SFF_8472_PN_END 	= 55,
106 	SFF_8472_REV_START 	= 56, /* Vendor Revision */
107 	SFF_8472_REV_END 	= 59,
108 	SFF_8472_WAVELEN_START	= 60, /* Wavelength Laser wavelength
109 				    * (Passive/Active Cable
110 				    * Specification Compliance) */
111 	SFF_8472_WAVELEN_END	= 61,
112 	SFF_8472_CC_BASE	= 63, /* CC_BASE Check code for Base ID
113 				    * Fields (addresses 0 to 62) */
114 
115 /*
116  * Extension Fields (optional) check the options before reading other
117  * addresses.
118  */
119 	SFF_8472_OPTIONS_MSB	= 64, /* Options Indicates which optional
120 				    * transceiver signals are
121 				    * implemented */
122 	SFF_8472_OPTIONS_LSB	= 65, /* (see Table 3.7) */
123 	SFF_8472_BR_MAX		= 66, /* BR max Upper bit rate margin,
124 				    * units of % (see details for
125 				    * rates > 25.0Gb/s) */
126 	SFF_8472_BR_MIN		= 67, /* Lower bit rate margin, units of
127 				    * % (see details for rates >
128 				    * 25.0Gb/s) */
129 	SFF_8472_SN_START 	= 68, /* Vendor SN [Address A0h, Bytes 68-83] */
130 	SFF_8472_SN_END 	= 83,
131 	SFF_8472_DATE_START	= 84, /* Date code Vendor’s manufacturing
132 				    * date code (see Table 3.8) */
133 	SFF_8472_DATE_END	= 91,
134 	SFF_8472_DIAG_TYPE	= 92, /* Diagnostic Monitoring Type
135 				    * Indicates which type of
136 				    * diagnostic monitoring is
137 				    * implemented (if any) in the
138 				    * transceiver (see Table 3.9)
139 				    */
140 
141 	SFF_8472_ENHANCED	= 93, /* Enhanced Options Indicates which
142 				    * optional enhanced features are
143 				    * implemented (if any) in the
144 				    * transceiver (see Table 3.10) */
145 	SFF_8472_COMPLIANCE	= 94, /* SFF-8472 Compliance Indicates
146 				    * which revision of SFF-8472 the
147 				    * transceiver complies with.  (see
148 				    * Table 3.12)*/
149 	SFF_8472_CC_EXT		= 95, /* Check code for the Extended ID
150 				    * Fields (addresses 64 to 94)
151 				    */
152 
153 	SFF_8472_VENDOR_RSRVD_START	= 96,
154 	SFF_8472_VENDOR_RSRVD_END	= 127,
155 
156 	SFF_8472_RESERVED_START	= 128,
157 	SFF_8472_RESERVED_END	= 255
158 };
159 
160 #define SFF_8472_DIAG_IMPL	(1 << 6) /* Required to be 1 */
161 #define SFF_8472_DIAG_INTERNAL	(1 << 5) /* Internal measurements. */
162 #define SFF_8472_DIAG_EXTERNAL	(1 << 4) /* External measurements. */
163 #define SFF_8472_DIAG_POWER	(1 << 3) /* Power measurement type */
164 #define SFF_8472_DIAG_ADDR_CHG	(1 << 2) /* Address change required.
165 					  * See SFF-8472 doc. */
166 
167  /*
168   * Diagnostics are available at the two wire address 0xa2.  All
169   * diagnostics are OPTIONAL so you should check 0xa0 registers 92 to
170   * see which, if any are supported.
171   */
172 
173 enum {SFF_8472_DIAG = 0xa2};  /* Base address for diagnostics. */
174 
175  /*
176   *  Table 3.15 Alarm and Warning Thresholds All values are 2 bytes
177   * and MUST be read in a single read operation starting at the MSB
178   */
179 
180 enum {
181 	SFF_8472_TEMP_HIGH_ALM		= 0, /* Temp High Alarm  */
182 	SFF_8472_TEMP_LOW_ALM		= 2, /* Temp Low Alarm */
183 	SFF_8472_TEMP_HIGH_WARN		= 4, /* Temp High Warning */
184 	SFF_8472_TEMP_LOW_WARN		= 6, /* Temp Low Warning */
185 	SFF_8472_VOLTAGE_HIGH_ALM	= 8, /* Voltage High Alarm */
186 	SFF_8472_VOLTAGE_LOW_ALM	= 10, /* Voltage Low Alarm */
187 	SFF_8472_VOLTAGE_HIGH_WARN	= 12, /* Voltage High Warning */
188 	SFF_8472_VOLTAGE_LOW_WARN	= 14, /* Voltage Low Warning */
189 	SFF_8472_BIAS_HIGH_ALM		= 16, /* Bias High Alarm */
190 	SFF_8472_BIAS_LOW_ALM		= 18, /* Bias Low Alarm */
191 	SFF_8472_BIAS_HIGH_WARN		= 20, /* Bias High Warning */
192 	SFF_8472_BIAS_LOW_WARN		= 22, /* Bias Low Warning */
193 	SFF_8472_TX_POWER_HIGH_ALM	= 24, /* TX Power High Alarm */
194 	SFF_8472_TX_POWER_LOW_ALM	= 26, /* TX Power Low Alarm */
195 	SFF_8472_TX_POWER_HIGH_WARN	= 28, /* TX Power High Warning */
196 	SFF_8472_TX_POWER_LOW_WARN	= 30, /* TX Power Low Warning */
197 	SFF_8472_RX_POWER_HIGH_ALM	= 32, /* RX Power High Alarm */
198 	SFF_8472_RX_POWER_LOW_ALM	= 34, /* RX Power Low Alarm */
199 	SFF_8472_RX_POWER_HIGH_WARN	= 36, /* RX Power High Warning */
200 	SFF_8472_RX_POWER_LOW_WARN	= 38, /* RX Power Low Warning */
201 
202 	SFF_8472_RX_POWER4	= 56, /* Rx_PWR(4) Single precision
203 				    *  floating point calibration data
204 				    *  - Rx optical power. Bit 7 of
205 				    *  byte 56 is MSB. Bit 0 of byte
206 				    *  59 is LSB. Rx_PWR(4) should be
207 				    *  set to zero for “internally
208 				    *  calibrated” devices. */
209 	SFF_8472_RX_POWER3	= 60, /* Rx_PWR(3) Single precision
210 				    * floating point calibration data
211 				    * - Rx optical power.  Bit 7 of
212 				    * byte 60 is MSB. Bit 0 of byte 63
213 				    * is LSB. Rx_PWR(3) should be set
214 				    * to zero for “internally
215 				    * calibrated” devices.*/
216 	SFF_8472_RX_POWER2	= 64, /* Rx_PWR(2) Single precision
217 				    * floating point calibration data,
218 				    * Rx optical power.  Bit 7 of byte
219 				    * 64 is MSB, bit 0 of byte 67 is
220 				    * LSB. Rx_PWR(2) should be set to
221 				    * zero for “internally calibrated”
222 				    * devices. */
223 	SFF_8472_RX_POWER1	= 68, /* Rx_PWR(1) Single precision
224 				    * floating point calibration data,
225 				    * Rx optical power. Bit 7 of byte
226 				    * 68 is MSB, bit 0 of byte 71 is
227 				    * LSB. Rx_PWR(1) should be set to
228 				    * 1 for “internally calibrated”
229 				    * devices. */
230 	SFF_8472_RX_POWER0	= 72, /* Rx_PWR(0) Single precision
231 				    * floating point calibration data,
232 				    * Rx optical power. Bit 7 of byte
233 				    * 72 is MSB, bit 0 of byte 75 is
234 				    * LSB. Rx_PWR(0) should be set to
235 				    * zero for “internally calibrated”
236 				    * devices. */
237 	SFF_8472_TX_I_SLOPE	= 76, /* Tx_I(Slope) Fixed decimal
238 				    * (unsigned) calibration data,
239 				    * laser bias current. Bit 7 of
240 				    * byte 76 is MSB, bit 0 of byte 77
241 				    * is LSB. Tx_I(Slope) should be
242 				    * set to 1 for “internally
243 				    * calibrated” devices. */
244 	SFF_8472_TX_I_OFFSET	= 78, /* Tx_I(Offset) Fixed decimal
245 				    * (signed two’s complement)
246 				    * calibration data, laser bias
247 				    * current. Bit 7 of byte 78 is
248 				    * MSB, bit 0 of byte 79 is
249 				    * LSB. Tx_I(Offset) should be set
250 				    * to zero for “internally
251 				    * calibrated” devices. */
252 	SFF_8472_TX_POWER_SLOPE	= 80, /* Tx_PWR(Slope) Fixed decimal
253 				    * (unsigned) calibration data,
254 				    * transmitter coupled output
255 				    * power. Bit 7 of byte 80 is MSB,
256 				    * bit 0 of byte 81 is LSB.
257 				    * Tx_PWR(Slope) should be set to 1
258 				    * for “internally calibrated”
259 				    * devices. */
260 	SFF_8472_TX_POWER_OFFSET	= 82, /* Tx_PWR(Offset) Fixed decimal
261 					    * (signed two’s complement)
262 					    * calibration data, transmitter
263 					    * coupled output power. Bit 7 of
264 					    * byte 82 is MSB, bit 0 of byte 83
265 					    * is LSB. Tx_PWR(Offset) should be
266 					    * set to zero for “internally
267 					    * calibrated” devices. */
268 	SFF_8472_T_SLOPE	= 84, /* T (Slope) Fixed decimal
269 				    * (unsigned) calibration data,
270 				    * internal module temperature. Bit
271 				    * 7 of byte 84 is MSB, bit 0 of
272 				    * byte 85 is LSB.  T(Slope) should
273 				    * be set to 1 for “internally
274 				    * calibrated” devices. */
275 	SFF_8472_T_OFFSET	= 86, /* T (Offset) Fixed decimal (signed
276 				    * two’s complement) calibration
277 				    * data, internal module
278 				    * temperature. Bit 7 of byte 86 is
279 				    * MSB, bit 0 of byte 87 is LSB.
280 				    * T(Offset) should be set to zero
281 				    * for “internally calibrated”
282 				    * devices. */
283 	SFF_8472_V_SLOPE	= 88, /* V (Slope) Fixed decimal
284 				    * (unsigned) calibration data,
285 				    * internal module supply
286 				    * voltage. Bit 7 of byte 88 is
287 				    * MSB, bit 0 of byte 89 is
288 				    * LSB. V(Slope) should be set to 1
289 				    * for “internally calibrated”
290 				    * devices. */
291 	SFF_8472_V_OFFSET	= 90, /* V (Offset) Fixed decimal (signed
292 				    * two’s complement) calibration
293 				    * data, internal module supply
294 				    * voltage. Bit 7 of byte 90 is
295 				    * MSB. Bit 0 of byte 91 is
296 				    * LSB. V(Offset) should be set to
297 				    * zero for “internally calibrated”
298 				    * devices. */
299 	SFF_8472_CHECKSUM	= 95, /* Checksum Byte 95 contains the
300 				    * low order 8 bits of the sum of
301 				    * bytes 0 – 94. */
302 	/* Internal measurements. */
303 
304 	SFF_8472_TEMP	 	= 96, /* Internally measured module temperature. */
305 	SFF_8472_VCC 		= 98, /* Internally measured supply
306 				    * voltage in transceiver.
307 				    */
308 	SFF_8472_TX_BIAS	= 100, /* Internally measured TX Bias Current. */
309 	SFF_8472_TX_POWER	= 102, /* Measured TX output power. */
310 	SFF_8472_RX_POWER	= 104, /* Measured RX input power. */
311 
312 	SFF_8472_STATUS		= 110 /* See below */
313 };
314  /* Status Bits Described */
315 
316 /*
317  * TX Disable State Digital state of the TX Disable Input Pin. Updated
318  * within 100ms of change on pin.
319  */
320 #define SFF_8472_STATUS_TX_DISABLE  (1 << 7)
321 
322 /*
323  * Select Read/write bit that allows software disable of
324  * laser. Writing ‘1’ disables laser. See Table 3.11 for
325  * enable/disable timing requirements. This bit is “OR”d with the hard
326  * TX_DISABLE pin value. Note, per SFP MSA TX_DISABLE pin is default
327  * enabled unless pulled low by hardware. If Soft TX Disable is not
328  * implemented, the transceiver ignores the value of this bit. Default
329  * power up value is zero/low.
330  */
331 #define SFF_8472_STATUS_SOFT_TX_DISABLE (1 << 6)
332 
333 /*
334  * RS(1) State Digital state of SFP input pin AS(1) per SFF-8079 or
335  * RS(1) per SFF-8431. Updated within 100ms of change on pin. See A2h
336  * Byte 118, Bit 3 for Soft RS(1) Select control information.
337  */
338 #define SFF_8472_RS_STATE (1 << 5)
339 
340 /*
341  * Rate_Select State [aka. “RS(0)”] Digital state of the SFP
342  * Rate_Select Input Pin. Updated within 100ms of change on pin. Note:
343  * This pin is also known as AS(0) in SFF-8079 and RS(0) in SFF-8431.
344  */
345 #define SFF_8472_STATUS_SELECT_STATE (1 << 4)
346 
347 /*
348  * Read/write bit that allows software rate select control. Writing
349  * ‘1’ selects full bandwidth operation. This bit is “OR’d with the
350  * hard Rate_Select, AS(0) or RS(0) pin value. See Table 3.11 for
351  * timing requirements. Default at power up is logic zero/low. If Soft
352  * Rate Select is not implemented, the transceiver ignores the value
353  * of this bit. Note: Specific transceiver behaviors of this bit are
354  * identified in Table 3.6a and referenced documents. See Table 3.18a,
355  * byte 118, bit 3 for Soft RS(1) Select.
356  */
357 #define SFF_8472_STATUS_SOFT_RATE_SELECT (1 << 3)
358 
359 /*
360  * TX Fault State Digital state of the TX Fault Output Pin. Updated
361  * within 100ms of change on pin.
362  */
363 #define SFF_8472_STATUS_TX_FAULT_STATE (1 << 2)
364 
365 /*
366  * Digital state of the RX_LOS Output Pin. Updated within 100ms of
367  * change on pin.
368  */
369 #define SFF_8472_STATUS_RX_LOS (1 << 1)
370 
371 /*
372  * Indicates transceiver has achieved power up and data is ready. Bit
373  * remains high until data is ready to be read at which time the
374  * device sets the bit low.
375  */
376 #define SFF_8472_STATUS_DATA_READY (1 << 0)
377 
378 /* Table 3.2 Identifier values */
379 enum {
380 	SFF_8472_ID_UNKNOWN	= 0x0, /* Unknown or unspecified */
381 	SFF_8472_ID_GBIC	= 0x1, /* GBIC */
382 	SFF_8472_ID_SFF		= 0x2, /* Module soldered to motherboard (ex: SFF)*/
383 	SFF_8472_ID_SFP		= 0x3, /* SFP or SFP “Plus” */
384 	SFF_8472_ID_XBI		= 0x4, /* Reserved for “300 pin XBI” devices */
385 	SFF_8472_ID_XENPAK	= 0x5, /* Reserved for “Xenpak” devices */
386 	SFF_8472_ID_XFP		= 0x6, /* Reserved for “XFP” devices */
387 	SFF_8472_ID_XFF		= 0x7, /* Reserved for “XFF” devices */
388 	SFF_8472_ID_XFPE	= 0x8, /* Reserved for “XFP-E” devices */
389 	SFF_8472_ID_XPAK	= 0x9, /* Reserved for “XPak” devices */
390 	SFF_8472_ID_X2		= 0xA, /* Reserved for “X2” devices */
391 	SFF_8472_ID_DWDM_SFP	= 0xB, /* Reserved for “DWDM-SFP” devices */
392 	SFF_8472_ID_QSFP	= 0xC, /* Reserved for “QSFP” devices */
393 	SFF_8472_ID_LAST	= SFF_8472_ID_QSFP
394 	};
395 
396 static char *sff_8472_id[SFF_8472_ID_LAST + 1] = {"Unknown",
397 					     "GBIC",
398 					     "SFF",
399 					     "SFP",
400 					     "XBI",
401 					     "Xenpak",
402 					     "XFP",
403 					     "XFF",
404 					     "XFP-E",
405 					     "XPak",
406 					     "X2",
407 					     "DWDM-SFP",
408 					     "QSFP"};
409 
410 /* Table 3.13 and 3.14 Temperature Conversion Values */
411 #define SFF_8472_TEMP_SIGN (1 << 15)
412 #define SFF_8472_TEMP_SHIFT  8
413 #define SFF_8472_TEMP_MSK  0xEF00
414 #define SFF_8472_TEMP_FRAC 0x00FF
415 
416 /* Internal Callibration Conversion factors */
417 
418 /*
419  * Represented as a 16 bit unsigned integer with the voltage defined
420  * as the full 16 bit value (0 – 65535) with LSB equal to 100 uVolt,
421  * yielding a total range of 0 to +6.55 Volts.
422  */
423 #define SFF_8472_VCC_FACTOR 10000.0
424 
425 /*
426  * Represented as a 16 bit unsigned integer with the current defined
427  * as the full 16 bit value (0 – 65535) with LSB equal to 2 uA,
428  * yielding a total range of 0 to 131 mA.
429  */
430 
431 #define SFF_8472_BIAS_FACTOR 2000.0
432 
433 /*
434  * Represented as a 16 bit unsigned integer with the power defined as
435  * the full 16 bit value (0 – 65535) with LSB equal to 0.1 uW,
436  * yielding a total range of 0 to 6.5535 mW (~ -40 to +8.2 dBm).
437  */
438 
439 #define SFF_8472_POWER_FACTOR 10000.0
440