diff options
author | Emil Tantilov <emil.s.tantilov@intel.com> | 2012-12-19 02:14:17 -0500 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2013-02-05 03:47:13 -0500 |
commit | 07ce870bed2f631ad53a2c1a90db20b5f8126ab9 (patch) | |
tree | 768a2c0590a6e2a722543826cdeacf1f1115f439 | |
parent | a7a1d9da2980c2e86eba78d89a156f0b9d04ed4a (diff) |
ixgbe: allow reading of SFF-8472 data over i2c
This patch adds functions needed for reading SFF-8472 diagnostic data
from SFP modules.
Based on original patch from Aurélien Guillaume <footplus@gmail.com>
CC: Aurélien Guillaume <footplus@gmail.com>
Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c | 45 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 16 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 1 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c | 1 |
6 files changed, 66 insertions, 7 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c index 7fd3833c7ecf..6030de50c4cd 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c | |||
@@ -1003,15 +1003,16 @@ static s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val) | |||
1003 | } | 1003 | } |
1004 | 1004 | ||
1005 | /** | 1005 | /** |
1006 | * ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface. | 1006 | * ixgbe_read_i2c_phy_82598 - Reads 8 bit word over I2C interface. |
1007 | * @hw: pointer to hardware structure | 1007 | * @hw: pointer to hardware structure |
1008 | * @byte_offset: EEPROM byte offset to read | 1008 | * @dev_addr: address to read from |
1009 | * @byte_offset: byte offset to read from dev_addr | ||
1009 | * @eeprom_data: value read | 1010 | * @eeprom_data: value read |
1010 | * | 1011 | * |
1011 | * Performs 8 byte read operation to SFP module's EEPROM over I2C interface. | 1012 | * Performs 8 byte read operation to SFP module's data over I2C interface. |
1012 | **/ | 1013 | **/ |
1013 | static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | 1014 | static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr, |
1014 | u8 *eeprom_data) | 1015 | u8 byte_offset, u8 *eeprom_data) |
1015 | { | 1016 | { |
1016 | s32 status = 0; | 1017 | s32 status = 0; |
1017 | u16 sfp_addr = 0; | 1018 | u16 sfp_addr = 0; |
@@ -1025,7 +1026,7 @@ static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | |||
1025 | * 0xC30D. These registers are used to talk to the SFP+ | 1026 | * 0xC30D. These registers are used to talk to the SFP+ |
1026 | * module's EEPROM through the SDA/SCL (I2C) interface. | 1027 | * module's EEPROM through the SDA/SCL (I2C) interface. |
1027 | */ | 1028 | */ |
1028 | sfp_addr = (IXGBE_I2C_EEPROM_DEV_ADDR << 8) + byte_offset; | 1029 | sfp_addr = (dev_addr << 8) + byte_offset; |
1029 | sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK); | 1030 | sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK); |
1030 | hw->phy.ops.write_reg(hw, | 1031 | hw->phy.ops.write_reg(hw, |
1031 | IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR, | 1032 | IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR, |
@@ -1057,7 +1058,6 @@ static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | |||
1057 | *eeprom_data = (u8)(sfp_data >> 8); | 1058 | *eeprom_data = (u8)(sfp_data >> 8); |
1058 | } else { | 1059 | } else { |
1059 | status = IXGBE_ERR_PHY; | 1060 | status = IXGBE_ERR_PHY; |
1060 | goto out; | ||
1061 | } | 1061 | } |
1062 | 1062 | ||
1063 | out: | 1063 | out: |
@@ -1065,6 +1065,36 @@ out: | |||
1065 | } | 1065 | } |
1066 | 1066 | ||
1067 | /** | 1067 | /** |
1068 | * ixgbe_read_i2c_eeprom_82598 - Reads 8 bit word over I2C interface. | ||
1069 | * @hw: pointer to hardware structure | ||
1070 | * @byte_offset: EEPROM byte offset to read | ||
1071 | * @eeprom_data: value read | ||
1072 | * | ||
1073 | * Performs 8 byte read operation to SFP module's EEPROM over I2C interface. | ||
1074 | **/ | ||
1075 | static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | ||
1076 | u8 *eeprom_data) | ||
1077 | { | ||
1078 | return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR, | ||
1079 | byte_offset, eeprom_data); | ||
1080 | } | ||
1081 | |||
1082 | /** | ||
1083 | * ixgbe_read_i2c_sff8472_82598 - Reads 8 bit word over I2C interface. | ||
1084 | * @hw: pointer to hardware structure | ||
1085 | * @byte_offset: byte offset at address 0xA2 | ||
1086 | * @eeprom_data: value read | ||
1087 | * | ||
1088 | * Performs 8 byte read operation to SFP module's SFF-8472 data over I2C | ||
1089 | **/ | ||
1090 | static s32 ixgbe_read_i2c_sff8472_82598(struct ixgbe_hw *hw, u8 byte_offset, | ||
1091 | u8 *sff8472_data) | ||
1092 | { | ||
1093 | return ixgbe_read_i2c_phy_82598(hw, IXGBE_I2C_EEPROM_DEV_ADDR2, | ||
1094 | byte_offset, sff8472_data); | ||
1095 | } | ||
1096 | |||
1097 | /** | ||
1068 | * ixgbe_get_supported_physical_layer_82598 - Returns physical layer type | 1098 | * ixgbe_get_supported_physical_layer_82598 - Returns physical layer type |
1069 | * @hw: pointer to hardware structure | 1099 | * @hw: pointer to hardware structure |
1070 | * | 1100 | * |
@@ -1297,6 +1327,7 @@ static struct ixgbe_phy_operations phy_ops_82598 = { | |||
1297 | .write_reg = &ixgbe_write_phy_reg_generic, | 1327 | .write_reg = &ixgbe_write_phy_reg_generic, |
1298 | .setup_link = &ixgbe_setup_phy_link_generic, | 1328 | .setup_link = &ixgbe_setup_phy_link_generic, |
1299 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, | 1329 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, |
1330 | .read_i2c_sff8472 = &ixgbe_read_i2c_sff8472_82598, | ||
1300 | .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598, | 1331 | .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598, |
1301 | .check_overtemp = &ixgbe_tn_check_overtemp, | 1332 | .check_overtemp = &ixgbe_tn_check_overtemp, |
1302 | }; | 1333 | }; |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c index 335046175950..d1f4d4523ecd 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c | |||
@@ -2241,6 +2241,7 @@ static struct ixgbe_phy_operations phy_ops_82599 = { | |||
2241 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, | 2241 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, |
2242 | .read_i2c_byte = &ixgbe_read_i2c_byte_generic, | 2242 | .read_i2c_byte = &ixgbe_read_i2c_byte_generic, |
2243 | .write_i2c_byte = &ixgbe_write_i2c_byte_generic, | 2243 | .write_i2c_byte = &ixgbe_write_i2c_byte_generic, |
2244 | .read_i2c_sff8472 = &ixgbe_read_i2c_sff8472_generic, | ||
2244 | .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic, | 2245 | .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic, |
2245 | .write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic, | 2246 | .write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic, |
2246 | .check_overtemp = &ixgbe_tn_check_overtemp, | 2247 | .check_overtemp = &ixgbe_tn_check_overtemp, |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c index f4b2c0d662dd..d034cc55da30 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | |||
@@ -1204,6 +1204,22 @@ s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, | |||
1204 | } | 1204 | } |
1205 | 1205 | ||
1206 | /** | 1206 | /** |
1207 | * ixgbe_read_i2c_sff8472_generic - Reads 8 bit word over I2C interface | ||
1208 | * @hw: pointer to hardware structure | ||
1209 | * @byte_offset: byte offset at address 0xA2 | ||
1210 | * @eeprom_data: value read | ||
1211 | * | ||
1212 | * Performs byte read operation to SFP module's SFF-8472 data over I2C | ||
1213 | **/ | ||
1214 | s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset, | ||
1215 | u8 *sff8472_data) | ||
1216 | { | ||
1217 | return hw->phy.ops.read_i2c_byte(hw, byte_offset, | ||
1218 | IXGBE_I2C_EEPROM_DEV_ADDR2, | ||
1219 | sff8472_data); | ||
1220 | } | ||
1221 | |||
1222 | /** | ||
1207 | * ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface | 1223 | * ixgbe_write_i2c_eeprom_generic - Writes 8 bit EEPROM word over I2C interface |
1208 | * @hw: pointer to hardware structure | 1224 | * @hw: pointer to hardware structure |
1209 | * @byte_offset: EEPROM byte offset to write | 1225 | * @byte_offset: EEPROM byte offset to write |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h index 51b0a91f62bc..bbfe55c1054a 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | #include "ixgbe_type.h" | 31 | #include "ixgbe_type.h" |
32 | #define IXGBE_I2C_EEPROM_DEV_ADDR 0xA0 | 32 | #define IXGBE_I2C_EEPROM_DEV_ADDR 0xA0 |
33 | #define IXGBE_I2C_EEPROM_DEV_ADDR2 0xA2 | ||
33 | 34 | ||
34 | /* EEPROM byte offsets */ | 35 | /* EEPROM byte offsets */ |
35 | #define IXGBE_SFF_IDENTIFIER 0x0 | 36 | #define IXGBE_SFF_IDENTIFIER 0x0 |
@@ -41,6 +42,8 @@ | |||
41 | #define IXGBE_SFF_10GBE_COMP_CODES 0x3 | 42 | #define IXGBE_SFF_10GBE_COMP_CODES 0x3 |
42 | #define IXGBE_SFF_CABLE_TECHNOLOGY 0x8 | 43 | #define IXGBE_SFF_CABLE_TECHNOLOGY 0x8 |
43 | #define IXGBE_SFF_CABLE_SPEC_COMP 0x3C | 44 | #define IXGBE_SFF_CABLE_SPEC_COMP 0x3C |
45 | #define IXGBE_SFF_SFF_8472_SWAP 0x5C | ||
46 | #define IXGBE_SFF_SFF_8472_COMP 0x5E | ||
44 | 47 | ||
45 | /* Bitmasks */ | 48 | /* Bitmasks */ |
46 | #define IXGBE_SFF_DA_PASSIVE_CABLE 0x4 | 49 | #define IXGBE_SFF_DA_PASSIVE_CABLE 0x4 |
@@ -51,6 +54,7 @@ | |||
51 | #define IXGBE_SFF_1GBASET_CAPABLE 0x8 | 54 | #define IXGBE_SFF_1GBASET_CAPABLE 0x8 |
52 | #define IXGBE_SFF_10GBASESR_CAPABLE 0x10 | 55 | #define IXGBE_SFF_10GBASESR_CAPABLE 0x10 |
53 | #define IXGBE_SFF_10GBASELR_CAPABLE 0x20 | 56 | #define IXGBE_SFF_10GBASELR_CAPABLE 0x20 |
57 | #define IXGBE_SFF_ADDRESSING_MODE 0x4 | ||
54 | #define IXGBE_I2C_EEPROM_READ_MASK 0x100 | 58 | #define IXGBE_I2C_EEPROM_READ_MASK 0x100 |
55 | #define IXGBE_I2C_EEPROM_STATUS_MASK 0x3 | 59 | #define IXGBE_I2C_EEPROM_STATUS_MASK 0x3 |
56 | #define IXGBE_I2C_EEPROM_STATUS_NO_OPERATION 0x0 | 60 | #define IXGBE_I2C_EEPROM_STATUS_NO_OPERATION 0x0 |
@@ -88,6 +92,9 @@ | |||
88 | #define IXGBE_TN_LASI_STATUS_REG 0x9005 | 92 | #define IXGBE_TN_LASI_STATUS_REG 0x9005 |
89 | #define IXGBE_TN_LASI_STATUS_TEMP_ALARM 0x0008 | 93 | #define IXGBE_TN_LASI_STATUS_TEMP_ALARM 0x0008 |
90 | 94 | ||
95 | /* SFP+ SFF-8472 Compliance code */ | ||
96 | #define IXGBE_SFF_SFF_8472_UNSUP 0x00 | ||
97 | |||
91 | s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw); | 98 | s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw); |
92 | s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw); | 99 | s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw); |
93 | s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw); | 100 | s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw); |
@@ -125,6 +132,8 @@ s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, | |||
125 | u8 dev_addr, u8 data); | 132 | u8 dev_addr, u8 data); |
126 | s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, | 133 | s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, |
127 | u8 *eeprom_data); | 134 | u8 *eeprom_data); |
135 | s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset, | ||
136 | u8 *sff8472_data); | ||
128 | s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, | 137 | s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, |
129 | u8 eeprom_data); | 138 | u8 eeprom_data); |
130 | #endif /* _IXGBE_PHY_H_ */ | 139 | #endif /* _IXGBE_PHY_H_ */ |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h index 0bdcc88cbf50..1af6289c1bb1 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | |||
@@ -2874,6 +2874,7 @@ struct ixgbe_phy_operations { | |||
2874 | s32 (*get_firmware_version)(struct ixgbe_hw *, u16 *); | 2874 | s32 (*get_firmware_version)(struct ixgbe_hw *, u16 *); |
2875 | s32 (*read_i2c_byte)(struct ixgbe_hw *, u8, u8, u8 *); | 2875 | s32 (*read_i2c_byte)(struct ixgbe_hw *, u8, u8, u8 *); |
2876 | s32 (*write_i2c_byte)(struct ixgbe_hw *, u8, u8, u8); | 2876 | s32 (*write_i2c_byte)(struct ixgbe_hw *, u8, u8, u8); |
2877 | s32 (*read_i2c_sff8472)(struct ixgbe_hw *, u8 , u8 *); | ||
2877 | s32 (*read_i2c_eeprom)(struct ixgbe_hw *, u8 , u8 *); | 2878 | s32 (*read_i2c_eeprom)(struct ixgbe_hw *, u8 , u8 *); |
2878 | s32 (*write_i2c_eeprom)(struct ixgbe_hw *, u8, u8); | 2879 | s32 (*write_i2c_eeprom)(struct ixgbe_hw *, u8, u8); |
2879 | s32 (*check_overtemp)(struct ixgbe_hw *); | 2880 | s32 (*check_overtemp)(struct ixgbe_hw *); |
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c index 2fa58437a42f..4dc3725480fe 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c | |||
@@ -878,6 +878,7 @@ static struct ixgbe_phy_operations phy_ops_X540 = { | |||
878 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, | 878 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, |
879 | .read_i2c_byte = &ixgbe_read_i2c_byte_generic, | 879 | .read_i2c_byte = &ixgbe_read_i2c_byte_generic, |
880 | .write_i2c_byte = &ixgbe_write_i2c_byte_generic, | 880 | .write_i2c_byte = &ixgbe_write_i2c_byte_generic, |
881 | .read_i2c_sff8472 = &ixgbe_read_i2c_sff8472_generic, | ||
881 | .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic, | 882 | .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_generic, |
882 | .write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic, | 883 | .write_i2c_eeprom = &ixgbe_write_i2c_eeprom_generic, |
883 | .check_overtemp = &ixgbe_tn_check_overtemp, | 884 | .check_overtemp = &ixgbe_tn_check_overtemp, |