aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEmil Tantilov <emil.s.tantilov@intel.com>2012-12-19 02:14:17 -0500
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2013-02-05 03:47:13 -0500
commit07ce870bed2f631ad53a2c1a90db20b5f8126ab9 (patch)
tree768a2c0590a6e2a722543826cdeacf1f1115f439
parenta7a1d9da2980c2e86eba78d89a156f0b9d04ed4a (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.c45
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c1
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c16
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h9
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_type.h1
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c1
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 **/
1013static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, 1014static 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
1063out: 1063out:
@@ -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 **/
1075static 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 **/
1090static 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 **/
1214s32 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
91s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw); 98s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw);
92s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw); 99s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw);
93s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw); 100s32 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);
126s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 133s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset,
127 u8 *eeprom_data); 134 u8 *eeprom_data);
135s32 ixgbe_read_i2c_sff8472_generic(struct ixgbe_hw *hw, u8 byte_offset,
136 u8 *sff8472_data);
128s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 137s32 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,