xref: /freebsd-src/sys/dev/ixgbe/ixgbe_phy.h (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
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