diff options
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_82598.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_82598.c | 160 |
1 files changed, 158 insertions, 2 deletions
diff --git a/drivers/net/ixgbe/ixgbe_82598.c b/drivers/net/ixgbe/ixgbe_82598.c index c2cdb042c481..7e09dab0c29f 100644 --- a/drivers/net/ixgbe/ixgbe_82598.c +++ b/drivers/net/ixgbe/ixgbe_82598.c | |||
@@ -46,6 +46,8 @@ static s32 ixgbe_setup_copper_link_speed_82598(struct ixgbe_hw *hw, | |||
46 | ixgbe_link_speed speed, | 46 | ixgbe_link_speed speed, |
47 | bool autoneg, | 47 | bool autoneg, |
48 | bool autoneg_wait_to_complete); | 48 | bool autoneg_wait_to_complete); |
49 | static s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | ||
50 | u8 *eeprom_data); | ||
49 | 51 | ||
50 | /** | 52 | /** |
51 | */ | 53 | */ |
@@ -53,6 +55,8 @@ static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) | |||
53 | { | 55 | { |
54 | struct ixgbe_mac_info *mac = &hw->mac; | 56 | struct ixgbe_mac_info *mac = &hw->mac; |
55 | struct ixgbe_phy_info *phy = &hw->phy; | 57 | struct ixgbe_phy_info *phy = &hw->phy; |
58 | s32 ret_val = 0; | ||
59 | u16 list_offset, data_offset; | ||
56 | 60 | ||
57 | /* Call PHY identify routine to get the phy type */ | 61 | /* Call PHY identify routine to get the phy type */ |
58 | ixgbe_identify_phy_generic(hw); | 62 | ixgbe_identify_phy_generic(hw); |
@@ -64,6 +68,27 @@ static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) | |||
64 | phy->ops.get_firmware_version = | 68 | phy->ops.get_firmware_version = |
65 | &ixgbe_get_phy_firmware_version_tnx; | 69 | &ixgbe_get_phy_firmware_version_tnx; |
66 | break; | 70 | break; |
71 | case ixgbe_phy_nl: | ||
72 | phy->ops.reset = &ixgbe_reset_phy_nl; | ||
73 | |||
74 | /* Call SFP+ identify routine to get the SFP+ module type */ | ||
75 | ret_val = phy->ops.identify_sfp(hw); | ||
76 | if (ret_val != 0) | ||
77 | goto out; | ||
78 | else if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) { | ||
79 | ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED; | ||
80 | goto out; | ||
81 | } | ||
82 | |||
83 | /* Check to see if SFP+ module is supported */ | ||
84 | ret_val = ixgbe_get_sfp_init_sequence_offsets(hw, | ||
85 | &list_offset, | ||
86 | &data_offset); | ||
87 | if (ret_val != 0) { | ||
88 | ret_val = IXGBE_ERR_SFP_NOT_SUPPORTED; | ||
89 | goto out; | ||
90 | } | ||
91 | break; | ||
67 | default: | 92 | default: |
68 | break; | 93 | break; |
69 | } | 94 | } |
@@ -82,7 +107,8 @@ static s32 ixgbe_get_invariants_82598(struct ixgbe_hw *hw) | |||
82 | mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES; | 107 | mac->max_rx_queues = IXGBE_82598_MAX_RX_QUEUES; |
83 | mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES; | 108 | mac->max_tx_queues = IXGBE_82598_MAX_TX_QUEUES; |
84 | 109 | ||
85 | return 0; | 110 | out: |
111 | return ret_val; | ||
86 | } | 112 | } |
87 | 113 | ||
88 | /** | 114 | /** |
@@ -191,7 +217,10 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw) | |||
191 | case IXGBE_DEV_ID_82598AF_SINGLE_PORT: | 217 | case IXGBE_DEV_ID_82598AF_SINGLE_PORT: |
192 | case IXGBE_DEV_ID_82598EB_CX4: | 218 | case IXGBE_DEV_ID_82598EB_CX4: |
193 | case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: | 219 | case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: |
220 | case IXGBE_DEV_ID_82598_DA_DUAL_PORT: | ||
221 | case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: | ||
194 | case IXGBE_DEV_ID_82598EB_XF_LR: | 222 | case IXGBE_DEV_ID_82598EB_XF_LR: |
223 | case IXGBE_DEV_ID_82598EB_SFP_LOM: | ||
195 | media_type = ixgbe_media_type_fiber; | 224 | media_type = ixgbe_media_type_fiber; |
196 | break; | 225 | break; |
197 | case IXGBE_DEV_ID_82598AT: | 226 | case IXGBE_DEV_ID_82598AT: |
@@ -399,6 +428,46 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, | |||
399 | { | 428 | { |
400 | u32 links_reg; | 429 | u32 links_reg; |
401 | u32 i; | 430 | u32 i; |
431 | u16 link_reg, adapt_comp_reg; | ||
432 | |||
433 | /* | ||
434 | * SERDES PHY requires us to read link status from register 0xC79F. | ||
435 | * Bit 0 set indicates link is up/ready; clear indicates link down. | ||
436 | * 0xC00C is read to check that the XAUI lanes are active. Bit 0 | ||
437 | * clear indicates active; set indicates inactive. | ||
438 | */ | ||
439 | if (hw->phy.type == ixgbe_phy_nl) { | ||
440 | hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg); | ||
441 | hw->phy.ops.read_reg(hw, 0xC79F, IXGBE_TWINAX_DEV, &link_reg); | ||
442 | hw->phy.ops.read_reg(hw, 0xC00C, IXGBE_TWINAX_DEV, | ||
443 | &adapt_comp_reg); | ||
444 | if (link_up_wait_to_complete) { | ||
445 | for (i = 0; i < IXGBE_LINK_UP_TIME; i++) { | ||
446 | if ((link_reg & 1) && | ||
447 | ((adapt_comp_reg & 1) == 0)) { | ||
448 | *link_up = true; | ||
449 | break; | ||
450 | } else { | ||
451 | *link_up = false; | ||
452 | } | ||
453 | msleep(100); | ||
454 | hw->phy.ops.read_reg(hw, 0xC79F, | ||
455 | IXGBE_TWINAX_DEV, | ||
456 | &link_reg); | ||
457 | hw->phy.ops.read_reg(hw, 0xC00C, | ||
458 | IXGBE_TWINAX_DEV, | ||
459 | &adapt_comp_reg); | ||
460 | } | ||
461 | } else { | ||
462 | if ((link_reg & 1) && ((adapt_comp_reg & 1) == 0)) | ||
463 | *link_up = true; | ||
464 | else | ||
465 | *link_up = false; | ||
466 | } | ||
467 | |||
468 | if (*link_up == false) | ||
469 | goto out; | ||
470 | } | ||
402 | 471 | ||
403 | links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); | 472 | links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); |
404 | if (link_up_wait_to_complete) { | 473 | if (link_up_wait_to_complete) { |
@@ -424,6 +493,7 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw, | |||
424 | else | 493 | else |
425 | *speed = IXGBE_LINK_SPEED_1GB_FULL; | 494 | *speed = IXGBE_LINK_SPEED_1GB_FULL; |
426 | 495 | ||
496 | out: | ||
427 | return 0; | 497 | return 0; |
428 | } | 498 | } |
429 | 499 | ||
@@ -859,6 +929,69 @@ s32 ixgbe_write_analog_reg8_82598(struct ixgbe_hw *hw, u32 reg, u8 val) | |||
859 | } | 929 | } |
860 | 930 | ||
861 | /** | 931 | /** |
932 | * ixgbe_read_i2c_eeprom_82598 - Read 8 bit EEPROM word of an SFP+ module | ||
933 | * over I2C interface through an intermediate phy. | ||
934 | * @hw: pointer to hardware structure | ||
935 | * @byte_offset: EEPROM byte offset to read | ||
936 | * @eeprom_data: value read | ||
937 | * | ||
938 | * Performs byte read operation to SFP module's EEPROM over I2C interface. | ||
939 | **/ | ||
940 | s32 ixgbe_read_i2c_eeprom_82598(struct ixgbe_hw *hw, u8 byte_offset, | ||
941 | u8 *eeprom_data) | ||
942 | { | ||
943 | s32 status = 0; | ||
944 | u16 sfp_addr = 0; | ||
945 | u16 sfp_data = 0; | ||
946 | u16 sfp_stat = 0; | ||
947 | u32 i; | ||
948 | |||
949 | if (hw->phy.type == ixgbe_phy_nl) { | ||
950 | /* | ||
951 | * phy SDA/SCL registers are at addresses 0xC30A to | ||
952 | * 0xC30D. These registers are used to talk to the SFP+ | ||
953 | * module's EEPROM through the SDA/SCL (I2C) interface. | ||
954 | */ | ||
955 | sfp_addr = (IXGBE_I2C_EEPROM_DEV_ADDR << 8) + byte_offset; | ||
956 | sfp_addr = (sfp_addr | IXGBE_I2C_EEPROM_READ_MASK); | ||
957 | hw->phy.ops.write_reg(hw, | ||
958 | IXGBE_MDIO_PMA_PMD_SDA_SCL_ADDR, | ||
959 | IXGBE_MDIO_PMA_PMD_DEV_TYPE, | ||
960 | sfp_addr); | ||
961 | |||
962 | /* Poll status */ | ||
963 | for (i = 0; i < 100; i++) { | ||
964 | hw->phy.ops.read_reg(hw, | ||
965 | IXGBE_MDIO_PMA_PMD_SDA_SCL_STAT, | ||
966 | IXGBE_MDIO_PMA_PMD_DEV_TYPE, | ||
967 | &sfp_stat); | ||
968 | sfp_stat = sfp_stat & IXGBE_I2C_EEPROM_STATUS_MASK; | ||
969 | if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS) | ||
970 | break; | ||
971 | msleep(10); | ||
972 | } | ||
973 | |||
974 | if (sfp_stat != IXGBE_I2C_EEPROM_STATUS_PASS) { | ||
975 | hw_dbg(hw, "EEPROM read did not pass.\n"); | ||
976 | status = IXGBE_ERR_SFP_NOT_PRESENT; | ||
977 | goto out; | ||
978 | } | ||
979 | |||
980 | /* Read data */ | ||
981 | hw->phy.ops.read_reg(hw, IXGBE_MDIO_PMA_PMD_SDA_SCL_DATA, | ||
982 | IXGBE_MDIO_PMA_PMD_DEV_TYPE, &sfp_data); | ||
983 | |||
984 | *eeprom_data = (u8)(sfp_data >> 8); | ||
985 | } else { | ||
986 | status = IXGBE_ERR_PHY; | ||
987 | goto out; | ||
988 | } | ||
989 | |||
990 | out: | ||
991 | return status; | ||
992 | } | ||
993 | |||
994 | /** | ||
862 | * ixgbe_get_supported_physical_layer_82598 - Returns physical layer type | 995 | * ixgbe_get_supported_physical_layer_82598 - Returns physical layer type |
863 | * @hw: pointer to hardware structure | 996 | * @hw: pointer to hardware structure |
864 | * | 997 | * |
@@ -873,8 +1006,12 @@ s32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw) | |||
873 | case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: | 1006 | case IXGBE_DEV_ID_82598_CX4_DUAL_PORT: |
874 | physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4; | 1007 | physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_CX4; |
875 | break; | 1008 | break; |
1009 | case IXGBE_DEV_ID_82598_DA_DUAL_PORT: | ||
1010 | physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; | ||
1011 | break; | ||
876 | case IXGBE_DEV_ID_82598AF_DUAL_PORT: | 1012 | case IXGBE_DEV_ID_82598AF_DUAL_PORT: |
877 | case IXGBE_DEV_ID_82598AF_SINGLE_PORT: | 1013 | case IXGBE_DEV_ID_82598AF_SINGLE_PORT: |
1014 | case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM: | ||
878 | physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; | 1015 | physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; |
879 | break; | 1016 | break; |
880 | case IXGBE_DEV_ID_82598EB_XF_LR: | 1017 | case IXGBE_DEV_ID_82598EB_XF_LR: |
@@ -884,6 +1021,24 @@ s32 ixgbe_get_supported_physical_layer_82598(struct ixgbe_hw *hw) | |||
884 | physical_layer = (IXGBE_PHYSICAL_LAYER_10GBASE_T | | 1021 | physical_layer = (IXGBE_PHYSICAL_LAYER_10GBASE_T | |
885 | IXGBE_PHYSICAL_LAYER_1000BASE_T); | 1022 | IXGBE_PHYSICAL_LAYER_1000BASE_T); |
886 | break; | 1023 | break; |
1024 | case IXGBE_DEV_ID_82598EB_SFP_LOM: | ||
1025 | hw->phy.ops.identify_sfp(hw); | ||
1026 | |||
1027 | switch (hw->phy.sfp_type) { | ||
1028 | case ixgbe_sfp_type_da_cu: | ||
1029 | physical_layer = IXGBE_PHYSICAL_LAYER_SFP_PLUS_CU; | ||
1030 | break; | ||
1031 | case ixgbe_sfp_type_sr: | ||
1032 | physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_SR; | ||
1033 | break; | ||
1034 | case ixgbe_sfp_type_lr: | ||
1035 | physical_layer = IXGBE_PHYSICAL_LAYER_10GBASE_LR; | ||
1036 | break; | ||
1037 | default: | ||
1038 | physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; | ||
1039 | break; | ||
1040 | } | ||
1041 | break; | ||
887 | 1042 | ||
888 | default: | 1043 | default: |
889 | physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; | 1044 | physical_layer = IXGBE_PHYSICAL_LAYER_UNKNOWN; |
@@ -935,12 +1090,13 @@ static struct ixgbe_eeprom_operations eeprom_ops_82598 = { | |||
935 | 1090 | ||
936 | static struct ixgbe_phy_operations phy_ops_82598 = { | 1091 | static struct ixgbe_phy_operations phy_ops_82598 = { |
937 | .identify = &ixgbe_identify_phy_generic, | 1092 | .identify = &ixgbe_identify_phy_generic, |
938 | /* .identify_sfp = &ixgbe_identify_sfp_module_generic, */ | 1093 | .identify_sfp = &ixgbe_identify_sfp_module_generic, |
939 | .reset = &ixgbe_reset_phy_generic, | 1094 | .reset = &ixgbe_reset_phy_generic, |
940 | .read_reg = &ixgbe_read_phy_reg_generic, | 1095 | .read_reg = &ixgbe_read_phy_reg_generic, |
941 | .write_reg = &ixgbe_write_phy_reg_generic, | 1096 | .write_reg = &ixgbe_write_phy_reg_generic, |
942 | .setup_link = &ixgbe_setup_phy_link_generic, | 1097 | .setup_link = &ixgbe_setup_phy_link_generic, |
943 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, | 1098 | .setup_link_speed = &ixgbe_setup_phy_link_speed_generic, |
1099 | .read_i2c_eeprom = &ixgbe_read_i2c_eeprom_82598, | ||
944 | }; | 1100 | }; |
945 | 1101 | ||
946 | struct ixgbe_info ixgbe_82598_info = { | 1102 | struct ixgbe_info ixgbe_82598_info = { |