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