linux/include/linux/sfp.h
<<
>>
Prefs
   1#ifndef LINUX_SFP_H
   2#define LINUX_SFP_H
   3
   4#include <linux/phy.h>
   5
   6struct __packed sfp_eeprom_base {
   7        u8 phys_id;
   8        u8 phys_ext_id;
   9        u8 connector;
  10#if defined __BIG_ENDIAN_BITFIELD
  11        u8 e10g_base_er:1;
  12        u8 e10g_base_lrm:1;
  13        u8 e10g_base_lr:1;
  14        u8 e10g_base_sr:1;
  15        u8 if_1x_sx:1;
  16        u8 if_1x_lx:1;
  17        u8 if_1x_copper_active:1;
  18        u8 if_1x_copper_passive:1;
  19
  20        u8 escon_mmf_1310_led:1;
  21        u8 escon_smf_1310_laser:1;
  22        u8 sonet_oc192_short_reach:1;
  23        u8 sonet_reach_bit1:1;
  24        u8 sonet_reach_bit2:1;
  25        u8 sonet_oc48_long_reach:1;
  26        u8 sonet_oc48_intermediate_reach:1;
  27        u8 sonet_oc48_short_reach:1;
  28
  29        u8 unallocated_5_7:1;
  30        u8 sonet_oc12_smf_long_reach:1;
  31        u8 sonet_oc12_smf_intermediate_reach:1;
  32        u8 sonet_oc12_short_reach:1;
  33        u8 unallocated_5_3:1;
  34        u8 sonet_oc3_smf_long_reach:1;
  35        u8 sonet_oc3_smf_intermediate_reach:1;
  36        u8 sonet_oc3_short_reach:1;
  37
  38        u8 e_base_px:1;
  39        u8 e_base_bx10:1;
  40        u8 e100_base_fx:1;
  41        u8 e100_base_lx:1;
  42        u8 e1000_base_t:1;
  43        u8 e1000_base_cx:1;
  44        u8 e1000_base_lx:1;
  45        u8 e1000_base_sx:1;
  46
  47        u8 fc_ll_v:1;
  48        u8 fc_ll_s:1;
  49        u8 fc_ll_i:1;
  50        u8 fc_ll_l:1;
  51        u8 fc_ll_m:1;
  52        u8 fc_tech_sa:1;
  53        u8 fc_tech_lc:1;
  54        u8 fc_tech_electrical_inter_enclosure:1;
  55
  56        u8 fc_tech_electrical_intra_enclosure:1;
  57        u8 fc_tech_sn:1;
  58        u8 fc_tech_sl:1;
  59        u8 fc_tech_ll:1;
  60        u8 sfp_ct_active:1;
  61        u8 sfp_ct_passive:1;
  62        u8 unallocated_8_1:1;
  63        u8 unallocated_8_0:1;
  64
  65        u8 fc_media_tw:1;
  66        u8 fc_media_tp:1;
  67        u8 fc_media_mi:1;
  68        u8 fc_media_tv:1;
  69        u8 fc_media_m6:1;
  70        u8 fc_media_m5:1;
  71        u8 unallocated_9_1:1;
  72        u8 fc_media_sm:1;
  73
  74        u8 fc_speed_1200:1;
  75        u8 fc_speed_800:1;
  76        u8 fc_speed_1600:1;
  77        u8 fc_speed_400:1;
  78        u8 fc_speed_3200:1;
  79        u8 fc_speed_200:1;
  80        u8 unallocated_10_1:1;
  81        u8 fc_speed_100:1;
  82#elif defined __LITTLE_ENDIAN_BITFIELD
  83        u8 if_1x_copper_passive:1;
  84        u8 if_1x_copper_active:1;
  85        u8 if_1x_lx:1;
  86        u8 if_1x_sx:1;
  87        u8 e10g_base_sr:1;
  88        u8 e10g_base_lr:1;
  89        u8 e10g_base_lrm:1;
  90        u8 e10g_base_er:1;
  91
  92        u8 sonet_oc3_short_reach:1;
  93        u8 sonet_oc3_smf_intermediate_reach:1;
  94        u8 sonet_oc3_smf_long_reach:1;
  95        u8 unallocated_5_3:1;
  96        u8 sonet_oc12_short_reach:1;
  97        u8 sonet_oc12_smf_intermediate_reach:1;
  98        u8 sonet_oc12_smf_long_reach:1;
  99        u8 unallocated_5_7:1;
 100
 101        u8 sonet_oc48_short_reach:1;
 102        u8 sonet_oc48_intermediate_reach:1;
 103        u8 sonet_oc48_long_reach:1;
 104        u8 sonet_reach_bit2:1;
 105        u8 sonet_reach_bit1:1;
 106        u8 sonet_oc192_short_reach:1;
 107        u8 escon_smf_1310_laser:1;
 108        u8 escon_mmf_1310_led:1;
 109
 110        u8 e1000_base_sx:1;
 111        u8 e1000_base_lx:1;
 112        u8 e1000_base_cx:1;
 113        u8 e1000_base_t:1;
 114        u8 e100_base_lx:1;
 115        u8 e100_base_fx:1;
 116        u8 e_base_bx10:1;
 117        u8 e_base_px:1;
 118
 119        u8 fc_tech_electrical_inter_enclosure:1;
 120        u8 fc_tech_lc:1;
 121        u8 fc_tech_sa:1;
 122        u8 fc_ll_m:1;
 123        u8 fc_ll_l:1;
 124        u8 fc_ll_i:1;
 125        u8 fc_ll_s:1;
 126        u8 fc_ll_v:1;
 127
 128        u8 unallocated_8_0:1;
 129        u8 unallocated_8_1:1;
 130        u8 sfp_ct_passive:1;
 131        u8 sfp_ct_active:1;
 132        u8 fc_tech_ll:1;
 133        u8 fc_tech_sl:1;
 134        u8 fc_tech_sn:1;
 135        u8 fc_tech_electrical_intra_enclosure:1;
 136
 137        u8 fc_media_sm:1;
 138        u8 unallocated_9_1:1;
 139        u8 fc_media_m5:1;
 140        u8 fc_media_m6:1;
 141        u8 fc_media_tv:1;
 142        u8 fc_media_mi:1;
 143        u8 fc_media_tp:1;
 144        u8 fc_media_tw:1;
 145
 146        u8 fc_speed_100:1;
 147        u8 unallocated_10_1:1;
 148        u8 fc_speed_200:1;
 149        u8 fc_speed_3200:1;
 150        u8 fc_speed_400:1;
 151        u8 fc_speed_1600:1;
 152        u8 fc_speed_800:1;
 153        u8 fc_speed_1200:1;
 154#else
 155#error Unknown Endian
 156#endif
 157        u8 encoding;
 158        u8 br_nominal;
 159        u8 rate_id;
 160        u8 link_len[6];
 161        char vendor_name[16];
 162        u8 extended_cc;
 163        char vendor_oui[3];
 164        char vendor_pn[16];
 165        char vendor_rev[4];
 166        union {
 167                __be16 optical_wavelength;
 168                u8 cable_spec;
 169        };
 170        u8 reserved62;
 171        u8 cc_base;
 172};
 173
 174struct __packed sfp_eeprom_ext {
 175        __be16 options;
 176        u8 br_max;
 177        u8 br_min;
 178        char vendor_sn[16];
 179        char datecode[8];
 180        u8 diagmon;
 181        u8 enhopts;
 182        u8 sff8472_compliance;
 183        u8 cc_ext;
 184};
 185
 186struct __packed sfp_eeprom_id {
 187        struct sfp_eeprom_base base;
 188        struct sfp_eeprom_ext ext;
 189};
 190
 191/* SFP EEPROM registers */
 192enum {
 193        SFP_PHYS_ID                     = 0x00,
 194        SFP_PHYS_EXT_ID                 = 0x01,
 195        SFP_CONNECTOR                   = 0x02,
 196        SFP_COMPLIANCE                  = 0x03,
 197        SFP_ENCODING                    = 0x0b,
 198        SFP_BR_NOMINAL                  = 0x0c,
 199        SFP_RATE_ID                     = 0x0d,
 200        SFP_LINK_LEN_SM_KM              = 0x0e,
 201        SFP_LINK_LEN_SM_100M            = 0x0f,
 202        SFP_LINK_LEN_50UM_OM2_10M       = 0x10,
 203        SFP_LINK_LEN_62_5UM_OM1_10M     = 0x11,
 204        SFP_LINK_LEN_COPPER_1M          = 0x12,
 205        SFP_LINK_LEN_50UM_OM4_10M       = 0x12,
 206        SFP_LINK_LEN_50UM_OM3_10M       = 0x13,
 207        SFP_VENDOR_NAME                 = 0x14,
 208        SFP_VENDOR_OUI                  = 0x25,
 209        SFP_VENDOR_PN                   = 0x28,
 210        SFP_VENDOR_REV                  = 0x38,
 211        SFP_OPTICAL_WAVELENGTH_MSB      = 0x3c,
 212        SFP_OPTICAL_WAVELENGTH_LSB      = 0x3d,
 213        SFP_CABLE_SPEC                  = 0x3c,
 214        SFP_CC_BASE                     = 0x3f,
 215        SFP_OPTIONS                     = 0x40, /* 2 bytes, MSB, LSB */
 216        SFP_BR_MAX                      = 0x42,
 217        SFP_BR_MIN                      = 0x43,
 218        SFP_VENDOR_SN                   = 0x44,
 219        SFP_DATECODE                    = 0x54,
 220        SFP_DIAGMON                     = 0x5c,
 221        SFP_ENHOPTS                     = 0x5d,
 222        SFP_SFF8472_COMPLIANCE          = 0x5e,
 223        SFP_CC_EXT                      = 0x5f,
 224
 225        SFP_PHYS_ID_SFP                 = 0x03,
 226        SFP_PHYS_EXT_ID_SFP             = 0x04,
 227        SFP_CONNECTOR_UNSPEC            = 0x00,
 228        /* codes 01-05 not supportable on SFP, but some modules have single SC */
 229        SFP_CONNECTOR_SC                = 0x01,
 230        SFP_CONNECTOR_FIBERJACK         = 0x06,
 231        SFP_CONNECTOR_LC                = 0x07,
 232        SFP_CONNECTOR_MT_RJ             = 0x08,
 233        SFP_CONNECTOR_MU                = 0x09,
 234        SFP_CONNECTOR_SG                = 0x0a,
 235        SFP_CONNECTOR_OPTICAL_PIGTAIL   = 0x0b,
 236        SFP_CONNECTOR_MPO_1X12          = 0x0c,
 237        SFP_CONNECTOR_MPO_2X16          = 0x0d,
 238        SFP_CONNECTOR_HSSDC_II          = 0x20,
 239        SFP_CONNECTOR_COPPER_PIGTAIL    = 0x21,
 240        SFP_CONNECTOR_RJ45              = 0x22,
 241        SFP_CONNECTOR_NOSEPARATE        = 0x23,
 242        SFP_CONNECTOR_MXC_2X16          = 0x24,
 243        SFP_ENCODING_UNSPEC             = 0x00,
 244        SFP_ENCODING_8B10B              = 0x01,
 245        SFP_ENCODING_4B5B               = 0x02,
 246        SFP_ENCODING_NRZ                = 0x03,
 247        SFP_ENCODING_8472_MANCHESTER    = 0x04,
 248        SFP_ENCODING_8472_SONET         = 0x05,
 249        SFP_ENCODING_8472_64B66B        = 0x06,
 250        SFP_ENCODING_256B257B           = 0x07,
 251        SFP_ENCODING_PAM4               = 0x08,
 252        SFP_OPTIONS_HIGH_POWER_LEVEL    = BIT(13),
 253        SFP_OPTIONS_PAGING_A2           = BIT(12),
 254        SFP_OPTIONS_RETIMER             = BIT(11),
 255        SFP_OPTIONS_COOLED_XCVR         = BIT(10),
 256        SFP_OPTIONS_POWER_DECL          = BIT(9),
 257        SFP_OPTIONS_RX_LINEAR_OUT       = BIT(8),
 258        SFP_OPTIONS_RX_DECISION_THRESH  = BIT(7),
 259        SFP_OPTIONS_TUNABLE_TX          = BIT(6),
 260        SFP_OPTIONS_RATE_SELECT         = BIT(5),
 261        SFP_OPTIONS_TX_DISABLE          = BIT(4),
 262        SFP_OPTIONS_TX_FAULT            = BIT(3),
 263        SFP_OPTIONS_LOS_INVERTED        = BIT(2),
 264        SFP_OPTIONS_LOS_NORMAL          = BIT(1),
 265        SFP_DIAGMON_DDM                 = BIT(6),
 266        SFP_DIAGMON_INT_CAL             = BIT(5),
 267        SFP_DIAGMON_EXT_CAL             = BIT(4),
 268        SFP_DIAGMON_RXPWR_AVG           = BIT(3),
 269        SFP_DIAGMON_ADDRMODE            = BIT(2),
 270        SFP_ENHOPTS_ALARMWARN           = BIT(7),
 271        SFP_ENHOPTS_SOFT_TX_DISABLE     = BIT(6),
 272        SFP_ENHOPTS_SOFT_TX_FAULT       = BIT(5),
 273        SFP_ENHOPTS_SOFT_RX_LOS         = BIT(4),
 274        SFP_ENHOPTS_SOFT_RATE_SELECT    = BIT(3),
 275        SFP_ENHOPTS_APP_SELECT_SFF8079  = BIT(2),
 276        SFP_ENHOPTS_SOFT_RATE_SFF8431   = BIT(1),
 277        SFP_SFF8472_COMPLIANCE_NONE     = 0x00,
 278        SFP_SFF8472_COMPLIANCE_REV9_3   = 0x01,
 279        SFP_SFF8472_COMPLIANCE_REV9_5   = 0x02,
 280        SFP_SFF8472_COMPLIANCE_REV10_2  = 0x03,
 281        SFP_SFF8472_COMPLIANCE_REV10_4  = 0x04,
 282        SFP_SFF8472_COMPLIANCE_REV11_0  = 0x05,
 283        SFP_SFF8472_COMPLIANCE_REV11_3  = 0x06,
 284        SFP_SFF8472_COMPLIANCE_REV11_4  = 0x07,
 285        SFP_SFF8472_COMPLIANCE_REV12_0  = 0x08,
 286};
 287
 288/* SFP Diagnostics */
 289enum {
 290        /* Alarm and warnings stored MSB at lower address then LSB */
 291        SFP_TEMP_HIGH_ALARM             = 0x00,
 292        SFP_TEMP_LOW_ALARM              = 0x02,
 293        SFP_TEMP_HIGH_WARN              = 0x04,
 294        SFP_TEMP_LOW_WARN               = 0x06,
 295        SFP_VOLT_HIGH_ALARM             = 0x08,
 296        SFP_VOLT_LOW_ALARM              = 0x0a,
 297        SFP_VOLT_HIGH_WARN              = 0x0c,
 298        SFP_VOLT_LOW_WARN               = 0x0e,
 299        SFP_BIAS_HIGH_ALARM             = 0x10,
 300        SFP_BIAS_LOW_ALARM              = 0x12,
 301        SFP_BIAS_HIGH_WARN              = 0x14,
 302        SFP_BIAS_LOW_WARN               = 0x16,
 303        SFP_TXPWR_HIGH_ALARM            = 0x18,
 304        SFP_TXPWR_LOW_ALARM             = 0x1a,
 305        SFP_TXPWR_HIGH_WARN             = 0x1c,
 306        SFP_TXPWR_LOW_WARN              = 0x1e,
 307        SFP_RXPWR_HIGH_ALARM            = 0x20,
 308        SFP_RXPWR_LOW_ALARM             = 0x22,
 309        SFP_RXPWR_HIGH_WARN             = 0x24,
 310        SFP_RXPWR_LOW_WARN              = 0x26,
 311        SFP_LASER_TEMP_HIGH_ALARM       = 0x28,
 312        SFP_LASER_TEMP_LOW_ALARM        = 0x2a,
 313        SFP_LASER_TEMP_HIGH_WARN        = 0x2c,
 314        SFP_LASER_TEMP_LOW_WARN         = 0x2e,
 315        SFP_TEC_CUR_HIGH_ALARM          = 0x30,
 316        SFP_TEC_CUR_LOW_ALARM           = 0x32,
 317        SFP_TEC_CUR_HIGH_WARN           = 0x34,
 318        SFP_TEC_CUR_LOW_WARN            = 0x36,
 319        SFP_CAL_RXPWR4                  = 0x38,
 320        SFP_CAL_RXPWR3                  = 0x3c,
 321        SFP_CAL_RXPWR2                  = 0x40,
 322        SFP_CAL_RXPWR1                  = 0x44,
 323        SFP_CAL_RXPWR0                  = 0x48,
 324        SFP_CAL_TXI_SLOPE               = 0x4c,
 325        SFP_CAL_TXI_OFFSET              = 0x4e,
 326        SFP_CAL_TXPWR_SLOPE             = 0x50,
 327        SFP_CAL_TXPWR_OFFSET            = 0x52,
 328        SFP_CAL_T_SLOPE                 = 0x54,
 329        SFP_CAL_T_OFFSET                = 0x56,
 330        SFP_CAL_V_SLOPE                 = 0x58,
 331        SFP_CAL_V_OFFSET                = 0x5a,
 332        SFP_CHKSUM                      = 0x5f,
 333
 334        SFP_TEMP                        = 0x60,
 335        SFP_VCC                         = 0x62,
 336        SFP_TX_BIAS                     = 0x64,
 337        SFP_TX_POWER                    = 0x66,
 338        SFP_RX_POWER                    = 0x68,
 339        SFP_LASER_TEMP                  = 0x6a,
 340        SFP_TEC_CUR                     = 0x6c,
 341
 342        SFP_STATUS                      = 0x6e,
 343        SFP_ALARM                       = 0x70,
 344
 345        SFP_EXT_STATUS                  = 0x76,
 346        SFP_VSL                         = 0x78,
 347        SFP_PAGE                        = 0x7f,
 348};
 349
 350struct device_node;
 351struct ethtool_eeprom;
 352struct ethtool_modinfo;
 353struct net_device;
 354struct sfp_bus;
 355
 356struct sfp_upstream_ops {
 357        int (*module_insert)(void *, const struct sfp_eeprom_id *id);
 358        void (*module_remove)(void *);
 359        void (*link_down)(void *);
 360        void (*link_up)(void *);
 361        int (*connect_phy)(void *, struct phy_device *);
 362        void (*disconnect_phy)(void *);
 363};
 364
 365#if IS_ENABLED(CONFIG_SFP)
 366int sfp_parse_port(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
 367                   unsigned long *support);
 368phy_interface_t sfp_parse_interface(struct sfp_bus *bus,
 369                                    const struct sfp_eeprom_id *id);
 370void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
 371                       unsigned long *support);
 372
 373int sfp_get_module_info(struct sfp_bus *bus, struct ethtool_modinfo *modinfo);
 374int sfp_get_module_eeprom(struct sfp_bus *bus, struct ethtool_eeprom *ee,
 375                          u8 *data);
 376void sfp_upstream_start(struct sfp_bus *bus);
 377void sfp_upstream_stop(struct sfp_bus *bus);
 378struct sfp_bus *sfp_register_upstream(struct device_node *np,
 379                                      struct net_device *ndev, void *upstream,
 380                                      const struct sfp_upstream_ops *ops);
 381void sfp_unregister_upstream(struct sfp_bus *bus);
 382#else
 383static inline int sfp_parse_port(struct sfp_bus *bus,
 384                                 const struct sfp_eeprom_id *id,
 385                                 unsigned long *support)
 386{
 387        return PORT_OTHER;
 388}
 389
 390static inline phy_interface_t sfp_parse_interface(struct sfp_bus *bus,
 391                                                const struct sfp_eeprom_id *id)
 392{
 393        return PHY_INTERFACE_MODE_NA;
 394}
 395
 396static inline void sfp_parse_support(struct sfp_bus *bus,
 397                                     const struct sfp_eeprom_id *id,
 398                                     unsigned long *support)
 399{
 400}
 401
 402static inline int sfp_get_module_info(struct sfp_bus *bus,
 403                                      struct ethtool_modinfo *modinfo)
 404{
 405        return -EOPNOTSUPP;
 406}
 407
 408static inline int sfp_get_module_eeprom(struct sfp_bus *bus,
 409                                        struct ethtool_eeprom *ee, u8 *data)
 410{
 411        return -EOPNOTSUPP;
 412}
 413
 414static inline void sfp_upstream_start(struct sfp_bus *bus)
 415{
 416}
 417
 418static inline void sfp_upstream_stop(struct sfp_bus *bus)
 419{
 420}
 421
 422static inline struct sfp_bus *sfp_register_upstream(struct device_node *np,
 423        struct net_device *ndev, void *upstream,
 424        const struct sfp_upstream_ops *ops)
 425{
 426        return (struct sfp_bus *)-1;
 427}
 428
 429static inline void sfp_unregister_upstream(struct sfp_bus *bus)
 430{
 431}
 432#endif
 433
 434#endif
 435