19ca4041bSJack F Vogel /****************************************************************************** 27282444bSPedro F. Giffuni SPDX-License-Identifier: BSD-3-Clause 313705f88SJack F Vogel 48455e365SKevin Bowling Copyright (c) 2001-2020, Intel Corporation 513705f88SJack F Vogel All rights reserved. 613705f88SJack F Vogel 713705f88SJack F Vogel Redistribution and use in source and binary forms, with or without 813705f88SJack F Vogel modification, are permitted provided that the following conditions are met: 913705f88SJack F Vogel 1013705f88SJack F Vogel 1. Redistributions of source code must retain the above copyright notice, 1113705f88SJack F Vogel this list of conditions and the following disclaimer. 1213705f88SJack F Vogel 1313705f88SJack F Vogel 2. Redistributions in binary form must reproduce the above copyright 1413705f88SJack F Vogel notice, this list of conditions and the following disclaimer in the 1513705f88SJack F Vogel documentation and/or other materials provided with the distribution. 1613705f88SJack F Vogel 1713705f88SJack F Vogel 3. Neither the name of the Intel Corporation nor the names of its 1813705f88SJack F Vogel contributors may be used to endorse or promote products derived from 1913705f88SJack F Vogel this software without specific prior written permission. 2013705f88SJack F Vogel 2113705f88SJack F Vogel THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 2213705f88SJack F Vogel AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2313705f88SJack F Vogel IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2413705f88SJack F Vogel ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 2513705f88SJack F Vogel LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2613705f88SJack F Vogel CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2713705f88SJack F Vogel SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2813705f88SJack F Vogel INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2913705f88SJack F Vogel CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3013705f88SJack F Vogel ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 3113705f88SJack F Vogel POSSIBILITY OF SUCH DAMAGE. 3213705f88SJack F Vogel 339ca4041bSJack F Vogel ******************************************************************************/ 3413705f88SJack F Vogel 3513705f88SJack F Vogel #ifndef _IXGBE_PHY_H_ 3613705f88SJack F Vogel #define _IXGBE_PHY_H_ 3713705f88SJack F Vogel 3813705f88SJack F Vogel #include "ixgbe_type.h" 391b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_DEV_ADDR 0xA0 400ecc2ff0SJack F Vogel #define IXGBE_I2C_EEPROM_DEV_ADDR2 0xA2 410ecc2ff0SJack F Vogel #define IXGBE_I2C_EEPROM_BANK_LEN 0xFF 421b6e0dbaSJack F Vogel 431b6e0dbaSJack F Vogel /* EEPROM byte offsets */ 441b6e0dbaSJack F Vogel #define IXGBE_SFF_IDENTIFIER 0x0 451b6e0dbaSJack F Vogel #define IXGBE_SFF_IDENTIFIER_SFP 0x3 461b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE0 0x25 471b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE1 0x26 481b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE2 0x27 491b6e0dbaSJack F Vogel #define IXGBE_SFF_1GBE_COMP_CODES 0x6 501b6e0dbaSJack F Vogel #define IXGBE_SFF_10GBE_COMP_CODES 0x3 51d8602bb9SJack F Vogel #define IXGBE_SFF_CABLE_TECHNOLOGY 0x8 52*89d40969STore Amundsen #define IXGBE_SFF_BITRATE_NOMINAL 0xC 53c0014855SJack F Vogel #define IXGBE_SFF_CABLE_SPEC_COMP 0x3C 540ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_SWAP 0x5C 550ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_COMP 0x5E 560ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_OSCB 0x6E 570ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_ESCB 0x76 58758cc3dcSJack F Vogel #define IXGBE_SFF_IDENTIFIER_QSFP_PLUS 0xD 59758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_VENDOR_OUI_BYTE0 0xA5 60758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_VENDOR_OUI_BYTE1 0xA6 61758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_VENDOR_OUI_BYTE2 0xA7 62758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_CONNECTOR 0x82 63758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_10GBE_COMP 0x83 64758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_1GBE_COMP 0x86 65758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_CABLE_LENGTH 0x92 66758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_DEVICE_TECH 0x93 671b6e0dbaSJack F Vogel 681b6e0dbaSJack F Vogel /* Bitmasks */ 69d8602bb9SJack F Vogel #define IXGBE_SFF_DA_PASSIVE_CABLE 0x4 70c0014855SJack F Vogel #define IXGBE_SFF_DA_ACTIVE_CABLE 0x8 71c0014855SJack F Vogel #define IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING 0x4 721b6e0dbaSJack F Vogel #define IXGBE_SFF_1GBASESX_CAPABLE 0x1 730ac6dfecSJack F Vogel #define IXGBE_SFF_1GBASELX_CAPABLE 0x2 741a4e3449SJack F Vogel #define IXGBE_SFF_1GBASET_CAPABLE 0x8 751b6e0dbaSJack F Vogel #define IXGBE_SFF_10GBASESR_CAPABLE 0x10 761b6e0dbaSJack F Vogel #define IXGBE_SFF_10GBASELR_CAPABLE 0x20 77*89d40969STore Amundsen #define IXGBE_SFF_BASEBX10_CAPABLE 0x40 780ecc2ff0SJack F Vogel #define IXGBE_SFF_SOFT_RS_SELECT_MASK 0x8 790ecc2ff0SJack F Vogel #define IXGBE_SFF_SOFT_RS_SELECT_10G 0x8 800ecc2ff0SJack F Vogel #define IXGBE_SFF_SOFT_RS_SELECT_1G 0x0 81758cc3dcSJack F Vogel #define IXGBE_SFF_ADDRESSING_MODE 0x4 82758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_DA_ACTIVE_CABLE 0x1 83758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_DA_PASSIVE_CABLE 0x8 84758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE 0x23 85758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_TRANSMITER_850NM_VCSEL 0x0 861b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_READ_MASK 0x100 871b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_MASK 0x3 881b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_NO_OPERATION 0x0 891b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_PASS 0x1 901b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_FAIL 0x2 911b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS 0x3 921b6e0dbaSJack F Vogel 93758cc3dcSJack F Vogel #define IXGBE_CS4227 0xBE /* CS4227 address */ 946f37f232SEric Joyner #define IXGBE_CS4227_GLOBAL_ID_LSB 0 958eb6488eSEric Joyner #define IXGBE_CS4227_GLOBAL_ID_MSB 1 966f37f232SEric Joyner #define IXGBE_CS4227_SCRATCH 2 976f37f232SEric Joyner #define IXGBE_CS4227_GLOBAL_ID_VALUE 0x03E5 988eb6488eSEric Joyner #define IXGBE_CS4227_EFUSE_PDF_SKU 0x19F 998eb6488eSEric Joyner #define IXGBE_CS4223_SKU_ID 0x0010 /* Quad port */ 1008eb6488eSEric Joyner #define IXGBE_CS4227_SKU_ID 0x0014 /* Dual port */ 101a9ca1c79SSean Bruno #define IXGBE_CS4227_RESET_PENDING 0x1357 102a9ca1c79SSean Bruno #define IXGBE_CS4227_RESET_COMPLETE 0x5AA5 103a9ca1c79SSean Bruno #define IXGBE_CS4227_RETRIES 15 104a9ca1c79SSean Bruno #define IXGBE_CS4227_EFUSE_STATUS 0x0181 1056f37f232SEric Joyner #define IXGBE_CS4227_LINE_SPARE22_MSB 0x12AD /* Reg to program speed */ 1066f37f232SEric Joyner #define IXGBE_CS4227_LINE_SPARE24_LSB 0x12B0 /* Reg to program EDC */ 1076f37f232SEric Joyner #define IXGBE_CS4227_HOST_SPARE22_MSB 0x1AAD /* Reg to program speed */ 1086f37f232SEric Joyner #define IXGBE_CS4227_HOST_SPARE24_LSB 0x1AB0 /* Reg to program EDC */ 109a9ca1c79SSean Bruno #define IXGBE_CS4227_EEPROM_STATUS 0x5001 110a9ca1c79SSean Bruno #define IXGBE_CS4227_EEPROM_LOAD_OK 0x0001 111a9ca1c79SSean Bruno #define IXGBE_CS4227_SPEED_1G 0x8000 112a9ca1c79SSean Bruno #define IXGBE_CS4227_SPEED_10G 0 113758cc3dcSJack F Vogel #define IXGBE_CS4227_EDC_MODE_CX1 0x0002 114758cc3dcSJack F Vogel #define IXGBE_CS4227_EDC_MODE_SR 0x0004 115a9ca1c79SSean Bruno #define IXGBE_CS4227_EDC_MODE_DIAG 0x0008 1166f37f232SEric Joyner #define IXGBE_CS4227_RESET_HOLD 500 /* microseconds */ 117a9ca1c79SSean Bruno #define IXGBE_CS4227_RESET_DELAY 450 /* milliseconds */ 1186f37f232SEric Joyner #define IXGBE_CS4227_CHECK_DELAY 30 /* milliseconds */ 1196f37f232SEric Joyner #define IXGBE_PE 0xE0 /* Port expander address */ 1206f37f232SEric Joyner #define IXGBE_PE_OUTPUT 1 /* Output register offset */ 1216f37f232SEric Joyner #define IXGBE_PE_CONFIG 3 /* Config register offset */ 1226f37f232SEric Joyner #define IXGBE_PE_BIT1 (1 << 1) 123758cc3dcSJack F Vogel 1241a4e3449SJack F Vogel /* Flow control defines */ 1251a4e3449SJack F Vogel #define IXGBE_TAF_SYM_PAUSE 0x400 1261a4e3449SJack F Vogel #define IXGBE_TAF_ASM_PAUSE 0x800 1271a4e3449SJack F Vogel 1281b6e0dbaSJack F Vogel /* Bit-shift macros */ 1290ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT 24 1300ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT 16 1310ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT 8 1321b6e0dbaSJack F Vogel 1331b6e0dbaSJack F Vogel /* Vendor OUIs: format of OUI is 0x[byte0][byte1][byte2][00] */ 1341b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_TYCO 0x00407600 1351b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_FTL 0x00906500 1361b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_AVAGO 0x00176A00 1370ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_INTEL 0x001B2100 1381b6e0dbaSJack F Vogel 1391b6e0dbaSJack F Vogel /* I2C SDA and SCL timing parameters for standard mode */ 1401b6e0dbaSJack F Vogel #define IXGBE_I2C_T_HD_STA 4 1411b6e0dbaSJack F Vogel #define IXGBE_I2C_T_LOW 5 1421b6e0dbaSJack F Vogel #define IXGBE_I2C_T_HIGH 4 1431b6e0dbaSJack F Vogel #define IXGBE_I2C_T_SU_STA 5 1441b6e0dbaSJack F Vogel #define IXGBE_I2C_T_HD_DATA 5 1451b6e0dbaSJack F Vogel #define IXGBE_I2C_T_SU_DATA 1 1461b6e0dbaSJack F Vogel #define IXGBE_I2C_T_RISE 1 1471b6e0dbaSJack F Vogel #define IXGBE_I2C_T_FALL 1 1481b6e0dbaSJack F Vogel #define IXGBE_I2C_T_SU_STO 4 1491b6e0dbaSJack F Vogel #define IXGBE_I2C_T_BUF 5 1501b6e0dbaSJack F Vogel 151758cc3dcSJack F Vogel #define IXGBE_SFP_DETECT_RETRIES 10 152758cc3dcSJack F Vogel 153c0014855SJack F Vogel #define IXGBE_TN_LASI_STATUS_REG 0x9005 154c0014855SJack F Vogel #define IXGBE_TN_LASI_STATUS_TEMP_ALARM 0x0008 155c0014855SJack F Vogel 1560ecc2ff0SJack F Vogel /* SFP+ SFF-8472 Compliance */ 1570ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_UNSUP 0x00 1580ecc2ff0SJack F Vogel 1599ca4041bSJack F Vogel s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw); 16013705f88SJack F Vogel bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr); 16113705f88SJack F Vogel enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id); 16213705f88SJack F Vogel s32 ixgbe_get_phy_id(struct ixgbe_hw *hw); 16313705f88SJack F Vogel s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw); 16413705f88SJack F Vogel s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw); 16580a39a2bSGuinan Sun void ixgbe_restart_auto_neg(struct ixgbe_hw *hw); 166fd75b91dSJack F Vogel s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, 167fd75b91dSJack F Vogel u16 *phy_data); 168fd75b91dSJack F Vogel s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, 169fd75b91dSJack F Vogel u16 phy_data); 17013705f88SJack F Vogel s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, 17113705f88SJack F Vogel u32 device_type, u16 *phy_data); 17213705f88SJack F Vogel s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, 17313705f88SJack F Vogel u32 device_type, u16 phy_data); 1749ca4041bSJack F Vogel s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw); 1759ca4041bSJack F Vogel s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw, 1769ca4041bSJack F Vogel ixgbe_link_speed speed, 1779ca4041bSJack F Vogel bool autoneg_wait_to_complete); 1780ac6dfecSJack F Vogel s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, 1790ac6dfecSJack F Vogel ixgbe_link_speed *speed, 1800ac6dfecSJack F Vogel bool *autoneg); 181758cc3dcSJack F Vogel s32 ixgbe_check_reset_blocked(struct ixgbe_hw *hw); 18213705f88SJack F Vogel 1839ca4041bSJack F Vogel /* PHY specific */ 1849ca4041bSJack F Vogel s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, 1859ca4041bSJack F Vogel ixgbe_link_speed *speed, 1869ca4041bSJack F Vogel bool *link_up); 1872969bf0eSJack F Vogel s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw); 1889ca4041bSJack F Vogel s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw, 1899ca4041bSJack F Vogel u16 *firmware_version); 1902969bf0eSJack F Vogel s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw, 1910ac6dfecSJack F Vogel u16 *firmware_version); 1929ca4041bSJack F Vogel 1931b6e0dbaSJack F Vogel s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw); 194758cc3dcSJack F Vogel s32 ixgbe_set_copper_phy_power(struct ixgbe_hw *hw, bool on); 19585d0a26eSJack F Vogel s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw); 1961b6e0dbaSJack F Vogel s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw); 1978eb6488eSEric Joyner u64 ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw); 198758cc3dcSJack F Vogel s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw); 1991b6e0dbaSJack F Vogel s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, 2001b6e0dbaSJack F Vogel u16 *list_offset, 2011b6e0dbaSJack F Vogel u16 *data_offset); 202c0014855SJack F Vogel s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw); 2030ac6dfecSJack F Vogel s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, 2040ac6dfecSJack F Vogel u8 dev_addr, u8 *data); 2056f37f232SEric Joyner s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset, 2066f37f232SEric Joyner u8 dev_addr, u8 *data); 2070ac6dfecSJack F Vogel s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, 2080ac6dfecSJack F Vogel u8 dev_addr, u8 data); 2096f37f232SEric Joyner s32 ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset, 2106f37f232SEric Joyner u8 dev_addr, u8 data); 2110ac6dfecSJack F Vogel s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 2120ac6dfecSJack F Vogel u8 *eeprom_data); 2130ac6dfecSJack F Vogel s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 2140ac6dfecSJack F Vogel u8 eeprom_data); 21585d0a26eSJack F Vogel void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw); 2168eb6488eSEric Joyner s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *, u8 addr, u16 reg, 2178eb6488eSEric Joyner u16 *val, bool lock); 2188eb6488eSEric Joyner s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *, u8 addr, u16 reg, 2198eb6488eSEric Joyner u16 val, bool lock); 22013705f88SJack F Vogel #endif /* _IXGBE_PHY_H_ */ 221