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