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