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