summaryrefslogtreecommitdiff
path: root/include/linux/sfp.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/sfp.h')
-rw-r--r--include/linux/sfp.h112
1 files changed, 111 insertions, 1 deletions
diff --git a/include/linux/sfp.h b/include/linux/sfp.h
index fe9af556899f..ec7c343adbd1 100644
--- a/include/linux/sfp.h
+++ b/include/linux/sfp.h
@@ -275,6 +275,101 @@ struct sfp_diag {
__be16 cal_v_offset;
} __packed;
+struct qsfp_sff8x36_id_stat {
+ u8 identifier;
+ u8 rev_compliance;
+ u8 status;
+} __packed;
+
+struct qsfp_sff8x36_id_base {
+ u8 identifier;
+ u8 ext_identifier;
+ u8 connector;
+ u8 compliance[8];
+ u8 encoding;
+ u8 br_nominal;
+ u8 ext_ratesel_compliance;
+ u8 length[5];
+ u8 device_tech;
+ char vendor_name[16];
+ u8 ext_module;
+ u8 oui[3];
+ char vendor_pn[16];
+ char vendor_rev[2];
+ union {
+ __be16 wavelength;
+ u8 copper_atten[2];
+ } __packed;
+ __be16 wavelength_tolerance;
+ u8 max_case_temp;
+ u8 cc_base;
+} __packed;
+
+struct qsfp_sff8436_id_ext {
+ u8 options[4];
+ char vendor_sn[16];
+ u8 datecode[8];
+ u8 diagmon;
+ u8 enh_options;
+ u8 reserved;
+ u8 cc_ext;
+} __packed;
+
+struct qsfp_sff8636_id_ext {
+ u8 link_codes;
+ u8 options[3];
+ char vendor_sn[16];
+ u8 datecode[8];
+ u8 diagmon;
+ u8 enh_options;
+ u8 baud_rate_nominal;
+ u8 cc_ext;
+} __packed;
+
+struct qsfp_sff8x36_id {
+ struct qsfp_sff8x36_id_base base;
+ union {
+ struct qsfp_sff8436_id_ext sff8436;
+ struct qsfp_sff8636_id_ext sff8636;
+ } __packed ext;
+} __packed;
+
+enum {
+#define SFF8X36_ADDR(page, addr) ((page) << 8 | (addr))
+ SFF8X36_STAT = SFF8X36_ADDR(0, 2),
+ SFF8X36_STAT_FLAT_MEM = BIT(2),
+ SFF8X36_STAT_INTL = BIT(1),
+ SFF8X36_STAT_DATA_NOT_READY = BIT(0),
+ SFF8X36_IRQ_FLAGS = SFF8X36_ADDR(0, 3),
+ SFF8X36_TEMPERATURE = SFF8X36_ADDR(0, 22),
+ SFF8X36_SUPPLY_VOLTAGE = SFF8X36_ADDR(0, 26),
+ SFF8X36_RX_POWER = SFF8X36_ADDR(0, 34),
+ SFF8X36_TX_BIAS = SFF8X36_ADDR(0, 42),
+ SFF8X36_TX_POWER = SFF8X36_ADDR(0, 50),
+ SFF8X36_TX_DISABLE = SFF8X36_ADDR(0, 86),
+ SFF8X36_TX_DISABLE_TX4 = BIT(3),
+ SFF8X36_TX_DISABLE_TX3 = BIT(2),
+ SFF8X36_TX_DISABLE_TX2 = BIT(1),
+ SFF8X36_TX_DISABLE_TX1 = BIT(0),
+ SFF8X36_RX_RATE_SELECT = SFF8X36_ADDR(0, 87),
+ SFF8X36_TX_RATE_SELECT = SFF8X36_ADDR(0, 88),
+ SFF8X36_CTRL_93 = SFF8X36_ADDR(0, 93),
+ SFF8636_CTRL_93_SW_RESET = BIT(7),
+ SFF8636_CTRL_93_POWER_CLS8 = BIT(3),
+ SFF8636_CTRL_93_POWER_CLS5_7 = BIT(2),
+ SFF8X36_CTRL_93_POWER_SET = BIT(1),
+ SFF8X36_CTRL_93_POWER_ORIDE = BIT(0),
+ SFF8X36_CLS8_MAX_POWER = SFF8X36_ADDR(0, 107),
+ SFF8X36_ID = SFF8X36_ADDR(0, 128),
+ SFF8X36_OPTIONS195_TX_DISABLE = BIT(4),
+ SFF8X36_DIAGMON = SFF8X36_ADDR(0, 220),
+ SFF8636_DIAGMON_TEMP = BIT(5),
+ SFF8636_DIAGMON_VCC = BIT(4),
+ SFF8X36_DIAGMON_RXPWR_AVG = BIT(3),
+ SFF8636_DIAGMON_TXPWR = BIT(2),
+ SFF8X36_THRESHOLDS = SFF8X36_ADDR(3, 128),
+};
+
/* SFF8024 defined constants */
enum {
SFF8024_ID_UNK = 0x00,
@@ -299,7 +394,7 @@ enum {
SFF8024_ENCODING_PAM4 = 0x08,
SFF8024_CONNECTOR_UNSPEC = 0x00,
- /* codes 01-05 not supportable on SFP, but some modules have single SC */
+ // codes 01-05 not supportable on SFP, but some modules have single SC
SFF8024_CONNECTOR_SC = 0x01,
SFF8024_CONNECTOR_FIBERJACK = 0x06,
SFF8024_CONNECTOR_LC = 0x07,
@@ -330,6 +425,21 @@ enum {
SFF8024_ECC_2_5GBASE_T = 0x1e,
};
+enum {
+ // rev_compliance
+ // SFF8X36_REV_UNSPEC can be used up to SFF-8636 rev 2.5 exclusive.
+ SFF8X36_REV_UNSPEC = 0,
+ SFF8X36_REV_8436_4_8 = 1,
+ SFF8X36_REV_8436_4_8P = 2,
+ SFF8X36_REV_8636_1_3 = 3,
+ SFF8X36_REV_8636_1_4 = 4,
+ SFF8X36_REV_8636_1_5 = 5,
+ SFF8X36_REV_8636_2_0 = 6,
+ SFF8X36_REV_8636_2_5 = 7,
+ SFF8X36_REV_8636_2_8 = 8,
+
+};
+
/* SFP EEPROM registers */
enum {
SFP_PHYS_ID = 0x00,