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 52c0014855SJack F Vogel #define IXGBE_SFF_CABLE_SPEC_COMP 0x3C 530ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_SWAP 0x5C 540ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_COMP 0x5E 550ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_OSCB 0x6E 560ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_ESCB 0x76 57758cc3dcSJack F Vogel #define IXGBE_SFF_IDENTIFIER_QSFP_PLUS 0xD 58758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_VENDOR_OUI_BYTE0 0xA5 59758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_VENDOR_OUI_BYTE1 0xA6 60758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_VENDOR_OUI_BYTE2 0xA7 61758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_CONNECTOR 0x82 62758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_10GBE_COMP 0x83 63758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_1GBE_COMP 0x86 64758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_CABLE_LENGTH 0x92 65758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_DEVICE_TECH 0x93 661b6e0dbaSJack F Vogel 671b6e0dbaSJack F Vogel /* Bitmasks */ 68d8602bb9SJack F Vogel #define IXGBE_SFF_DA_PASSIVE_CABLE 0x4 69c0014855SJack F Vogel #define IXGBE_SFF_DA_ACTIVE_CABLE 0x8 70c0014855SJack F Vogel #define IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING 0x4 711b6e0dbaSJack F Vogel #define IXGBE_SFF_1GBASESX_CAPABLE 0x1 720ac6dfecSJack F Vogel #define IXGBE_SFF_1GBASELX_CAPABLE 0x2 731a4e3449SJack F Vogel #define IXGBE_SFF_1GBASET_CAPABLE 0x8 741b6e0dbaSJack F Vogel #define IXGBE_SFF_10GBASESR_CAPABLE 0x10 751b6e0dbaSJack F Vogel #define IXGBE_SFF_10GBASELR_CAPABLE 0x20 760ecc2ff0SJack F Vogel #define IXGBE_SFF_SOFT_RS_SELECT_MASK 0x8 770ecc2ff0SJack F Vogel #define IXGBE_SFF_SOFT_RS_SELECT_10G 0x8 780ecc2ff0SJack F Vogel #define IXGBE_SFF_SOFT_RS_SELECT_1G 0x0 79758cc3dcSJack F Vogel #define IXGBE_SFF_ADDRESSING_MODE 0x4 80758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_DA_ACTIVE_CABLE 0x1 81758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_DA_PASSIVE_CABLE 0x8 82758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE 0x23 83758cc3dcSJack F Vogel #define IXGBE_SFF_QSFP_TRANSMITER_850NM_VCSEL 0x0 841b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_READ_MASK 0x100 851b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_MASK 0x3 861b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_NO_OPERATION 0x0 871b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_PASS 0x1 881b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_FAIL 0x2 891b6e0dbaSJack F Vogel #define IXGBE_I2C_EEPROM_STATUS_IN_PROGRESS 0x3 901b6e0dbaSJack F Vogel 91758cc3dcSJack F Vogel #define IXGBE_CS4227 0xBE /* CS4227 address */ 926f37f232SEric Joyner #define IXGBE_CS4227_GLOBAL_ID_LSB 0 938eb6488eSEric Joyner #define IXGBE_CS4227_GLOBAL_ID_MSB 1 946f37f232SEric Joyner #define IXGBE_CS4227_SCRATCH 2 956f37f232SEric Joyner #define IXGBE_CS4227_GLOBAL_ID_VALUE 0x03E5 968eb6488eSEric Joyner #define IXGBE_CS4227_EFUSE_PDF_SKU 0x19F 978eb6488eSEric Joyner #define IXGBE_CS4223_SKU_ID 0x0010 /* Quad port */ 988eb6488eSEric Joyner #define IXGBE_CS4227_SKU_ID 0x0014 /* Dual port */ 99a9ca1c79SSean Bruno #define IXGBE_CS4227_RESET_PENDING 0x1357 100a9ca1c79SSean Bruno #define IXGBE_CS4227_RESET_COMPLETE 0x5AA5 101a9ca1c79SSean Bruno #define IXGBE_CS4227_RETRIES 15 102a9ca1c79SSean Bruno #define IXGBE_CS4227_EFUSE_STATUS 0x0181 1036f37f232SEric Joyner #define IXGBE_CS4227_LINE_SPARE22_MSB 0x12AD /* Reg to program speed */ 1046f37f232SEric Joyner #define IXGBE_CS4227_LINE_SPARE24_LSB 0x12B0 /* Reg to program EDC */ 1056f37f232SEric Joyner #define IXGBE_CS4227_HOST_SPARE22_MSB 0x1AAD /* Reg to program speed */ 1066f37f232SEric Joyner #define IXGBE_CS4227_HOST_SPARE24_LSB 0x1AB0 /* Reg to program EDC */ 107a9ca1c79SSean Bruno #define IXGBE_CS4227_EEPROM_STATUS 0x5001 108a9ca1c79SSean Bruno #define IXGBE_CS4227_EEPROM_LOAD_OK 0x0001 109a9ca1c79SSean Bruno #define IXGBE_CS4227_SPEED_1G 0x8000 110a9ca1c79SSean Bruno #define IXGBE_CS4227_SPEED_10G 0 111758cc3dcSJack F Vogel #define IXGBE_CS4227_EDC_MODE_CX1 0x0002 112758cc3dcSJack F Vogel #define IXGBE_CS4227_EDC_MODE_SR 0x0004 113a9ca1c79SSean Bruno #define IXGBE_CS4227_EDC_MODE_DIAG 0x0008 1146f37f232SEric Joyner #define IXGBE_CS4227_RESET_HOLD 500 /* microseconds */ 115a9ca1c79SSean Bruno #define IXGBE_CS4227_RESET_DELAY 450 /* milliseconds */ 1166f37f232SEric Joyner #define IXGBE_CS4227_CHECK_DELAY 30 /* milliseconds */ 1176f37f232SEric Joyner #define IXGBE_PE 0xE0 /* Port expander address */ 1186f37f232SEric Joyner #define IXGBE_PE_OUTPUT 1 /* Output register offset */ 1196f37f232SEric Joyner #define IXGBE_PE_CONFIG 3 /* Config register offset */ 1206f37f232SEric Joyner #define IXGBE_PE_BIT1 (1 << 1) 121758cc3dcSJack F Vogel 1221a4e3449SJack F Vogel /* Flow control defines */ 1231a4e3449SJack F Vogel #define IXGBE_TAF_SYM_PAUSE 0x400 1241a4e3449SJack F Vogel #define IXGBE_TAF_ASM_PAUSE 0x800 1251a4e3449SJack F Vogel 1261b6e0dbaSJack F Vogel /* Bit-shift macros */ 1270ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE0_SHIFT 24 1280ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE1_SHIFT 16 1290ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_BYTE2_SHIFT 8 1301b6e0dbaSJack F Vogel 1311b6e0dbaSJack F Vogel /* Vendor OUIs: format of OUI is 0x[byte0][byte1][byte2][00] */ 1321b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_TYCO 0x00407600 1331b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_FTL 0x00906500 1341b6e0dbaSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_AVAGO 0x00176A00 1350ac6dfecSJack F Vogel #define IXGBE_SFF_VENDOR_OUI_INTEL 0x001B2100 1361b6e0dbaSJack F Vogel 1371b6e0dbaSJack F Vogel /* I2C SDA and SCL timing parameters for standard mode */ 1381b6e0dbaSJack F Vogel #define IXGBE_I2C_T_HD_STA 4 1391b6e0dbaSJack F Vogel #define IXGBE_I2C_T_LOW 5 1401b6e0dbaSJack F Vogel #define IXGBE_I2C_T_HIGH 4 1411b6e0dbaSJack F Vogel #define IXGBE_I2C_T_SU_STA 5 1421b6e0dbaSJack F Vogel #define IXGBE_I2C_T_HD_DATA 5 1431b6e0dbaSJack F Vogel #define IXGBE_I2C_T_SU_DATA 1 1441b6e0dbaSJack F Vogel #define IXGBE_I2C_T_RISE 1 1451b6e0dbaSJack F Vogel #define IXGBE_I2C_T_FALL 1 1461b6e0dbaSJack F Vogel #define IXGBE_I2C_T_SU_STO 4 1471b6e0dbaSJack F Vogel #define IXGBE_I2C_T_BUF 5 1481b6e0dbaSJack F Vogel 149758cc3dcSJack F Vogel #define IXGBE_SFP_DETECT_RETRIES 10 150758cc3dcSJack F Vogel 151c0014855SJack F Vogel #define IXGBE_TN_LASI_STATUS_REG 0x9005 152c0014855SJack F Vogel #define IXGBE_TN_LASI_STATUS_TEMP_ALARM 0x0008 153c0014855SJack F Vogel 1540ecc2ff0SJack F Vogel /* SFP+ SFF-8472 Compliance */ 1550ecc2ff0SJack F Vogel #define IXGBE_SFF_SFF_8472_UNSUP 0x00 1560ecc2ff0SJack F Vogel 1579ca4041bSJack F Vogel s32 ixgbe_init_phy_ops_generic(struct ixgbe_hw *hw); 15813705f88SJack F Vogel bool ixgbe_validate_phy_addr(struct ixgbe_hw *hw, u32 phy_addr); 15913705f88SJack F Vogel enum ixgbe_phy_type ixgbe_get_phy_type_from_id(u32 phy_id); 16013705f88SJack F Vogel s32 ixgbe_get_phy_id(struct ixgbe_hw *hw); 16113705f88SJack F Vogel s32 ixgbe_identify_phy_generic(struct ixgbe_hw *hw); 16213705f88SJack F Vogel s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw); 163*80a39a2bSGuinan Sun void ixgbe_restart_auto_neg(struct ixgbe_hw *hw); 164fd75b91dSJack F Vogel s32 ixgbe_read_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, 165fd75b91dSJack F Vogel u16 *phy_data); 166fd75b91dSJack F Vogel s32 ixgbe_write_phy_reg_mdi(struct ixgbe_hw *hw, u32 reg_addr, u32 device_type, 167fd75b91dSJack F Vogel u16 phy_data); 16813705f88SJack F Vogel s32 ixgbe_read_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, 16913705f88SJack F Vogel u32 device_type, u16 *phy_data); 17013705f88SJack F Vogel s32 ixgbe_write_phy_reg_generic(struct ixgbe_hw *hw, u32 reg_addr, 17113705f88SJack F Vogel u32 device_type, u16 phy_data); 1729ca4041bSJack F Vogel s32 ixgbe_setup_phy_link_generic(struct ixgbe_hw *hw); 1739ca4041bSJack F Vogel s32 ixgbe_setup_phy_link_speed_generic(struct ixgbe_hw *hw, 1749ca4041bSJack F Vogel ixgbe_link_speed speed, 1759ca4041bSJack F Vogel bool autoneg_wait_to_complete); 1760ac6dfecSJack F Vogel s32 ixgbe_get_copper_link_capabilities_generic(struct ixgbe_hw *hw, 1770ac6dfecSJack F Vogel ixgbe_link_speed *speed, 1780ac6dfecSJack F Vogel bool *autoneg); 179758cc3dcSJack F Vogel s32 ixgbe_check_reset_blocked(struct ixgbe_hw *hw); 18013705f88SJack F Vogel 1819ca4041bSJack F Vogel /* PHY specific */ 1829ca4041bSJack F Vogel s32 ixgbe_check_phy_link_tnx(struct ixgbe_hw *hw, 1839ca4041bSJack F Vogel ixgbe_link_speed *speed, 1849ca4041bSJack F Vogel bool *link_up); 1852969bf0eSJack F Vogel s32 ixgbe_setup_phy_link_tnx(struct ixgbe_hw *hw); 1869ca4041bSJack F Vogel s32 ixgbe_get_phy_firmware_version_tnx(struct ixgbe_hw *hw, 1879ca4041bSJack F Vogel u16 *firmware_version); 1882969bf0eSJack F Vogel s32 ixgbe_get_phy_firmware_version_generic(struct ixgbe_hw *hw, 1890ac6dfecSJack F Vogel u16 *firmware_version); 1909ca4041bSJack F Vogel 1911b6e0dbaSJack F Vogel s32 ixgbe_reset_phy_nl(struct ixgbe_hw *hw); 192758cc3dcSJack F Vogel s32 ixgbe_set_copper_phy_power(struct ixgbe_hw *hw, bool on); 19385d0a26eSJack F Vogel s32 ixgbe_identify_module_generic(struct ixgbe_hw *hw); 1941b6e0dbaSJack F Vogel s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw); 1958eb6488eSEric Joyner u64 ixgbe_get_supported_phy_sfp_layer_generic(struct ixgbe_hw *hw); 196758cc3dcSJack F Vogel s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw); 1971b6e0dbaSJack F Vogel s32 ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw, 1981b6e0dbaSJack F Vogel u16 *list_offset, 1991b6e0dbaSJack F Vogel u16 *data_offset); 200c0014855SJack F Vogel s32 ixgbe_tn_check_overtemp(struct ixgbe_hw *hw); 2010ac6dfecSJack F Vogel s32 ixgbe_read_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, 2020ac6dfecSJack F Vogel u8 dev_addr, u8 *data); 2036f37f232SEric Joyner s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset, 2046f37f232SEric Joyner u8 dev_addr, u8 *data); 2050ac6dfecSJack F Vogel s32 ixgbe_write_i2c_byte_generic(struct ixgbe_hw *hw, u8 byte_offset, 2060ac6dfecSJack F Vogel u8 dev_addr, u8 data); 2076f37f232SEric Joyner s32 ixgbe_write_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset, 2086f37f232SEric Joyner u8 dev_addr, u8 data); 2090ac6dfecSJack F Vogel s32 ixgbe_read_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 2100ac6dfecSJack F Vogel u8 *eeprom_data); 2110ac6dfecSJack F Vogel s32 ixgbe_write_i2c_eeprom_generic(struct ixgbe_hw *hw, u8 byte_offset, 2120ac6dfecSJack F Vogel u8 eeprom_data); 21385d0a26eSJack F Vogel void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw); 2148eb6488eSEric Joyner s32 ixgbe_read_i2c_combined_generic_int(struct ixgbe_hw *, u8 addr, u16 reg, 2158eb6488eSEric Joyner u16 *val, bool lock); 2168eb6488eSEric Joyner s32 ixgbe_write_i2c_combined_generic_int(struct ixgbe_hw *, u8 addr, u16 reg, 2178eb6488eSEric Joyner u16 val, bool lock); 21813705f88SJack F Vogel #endif /* _IXGBE_PHY_H_ */ 219