xref: /linux/drivers/net/ethernet/broadcom/bnge/bnge_link.h (revision 4a75900989c964fc839a615542f96353b1c7bc80)
17626cd3dSBhargava Marreddy /* SPDX-License-Identifier: GPL-2.0 */
27626cd3dSBhargava Marreddy /* Copyright (c) 2026 Broadcom */
37626cd3dSBhargava Marreddy 
47626cd3dSBhargava Marreddy #ifndef _BNGE_LINK_H_
57626cd3dSBhargava Marreddy #define _BNGE_LINK_H_
67626cd3dSBhargava Marreddy 
7169f6e8dSBhargava Marreddy #include <linux/ethtool.h>
8169f6e8dSBhargava Marreddy 
97626cd3dSBhargava Marreddy #define BNGE_PHY_CFG_ABLE(bd)		\
107626cd3dSBhargava Marreddy 	((bd)->link_info.phy_enabled)
117626cd3dSBhargava Marreddy 
127626cd3dSBhargava Marreddy #define BNGE_PHY_AUTO_SPEEDS2_MASK	\
137626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_ENABLES_AUTO_LINK_SPEEDS2_MASK
147626cd3dSBhargava Marreddy #define BNGE_PHY_FLAGS_RESTART_AUTO	\
157626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FLAGS_RESTART_AUTONEG
167626cd3dSBhargava Marreddy #define BNGE_PHY_FLAGS_ENA_FORCE_SPEEDS2	\
177626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_ENABLES_FORCE_LINK_SPEEDS2
187626cd3dSBhargava Marreddy 
197626cd3dSBhargava Marreddy #define BNGE_LINK_LINK		PORT_PHY_QCFG_RESP_LINK_LINK
207626cd3dSBhargava Marreddy 
217626cd3dSBhargava Marreddy enum bnge_link_state {
227626cd3dSBhargava Marreddy 	BNGE_LINK_STATE_UNKNOWN,
237626cd3dSBhargava Marreddy 	BNGE_LINK_STATE_DOWN,
247626cd3dSBhargava Marreddy 	BNGE_LINK_STATE_UP,
257626cd3dSBhargava Marreddy };
267626cd3dSBhargava Marreddy 
277626cd3dSBhargava Marreddy #define BNGE_LINK_IS_UP(bd)		\
287626cd3dSBhargava Marreddy 	((bd)->link_info.link_state == BNGE_LINK_STATE_UP)
297626cd3dSBhargava Marreddy 
307626cd3dSBhargava Marreddy #define BNGE_LINK_DUPLEX_FULL	PORT_PHY_QCFG_RESP_DUPLEX_STATE_FULL
317626cd3dSBhargava Marreddy 
327626cd3dSBhargava Marreddy #define BNGE_LINK_PAUSE_TX	PORT_PHY_QCFG_RESP_PAUSE_TX
337626cd3dSBhargava Marreddy #define BNGE_LINK_PAUSE_RX	PORT_PHY_QCFG_RESP_PAUSE_RX
347626cd3dSBhargava Marreddy #define BNGE_LINK_PAUSE_BOTH	(PORT_PHY_QCFG_RESP_PAUSE_RX | \
357626cd3dSBhargava Marreddy 				 PORT_PHY_QCFG_RESP_PAUSE_TX)
367626cd3dSBhargava Marreddy 
377626cd3dSBhargava Marreddy #define BNGE_LINK_AUTO_NONE     PORT_PHY_QCFG_RESP_AUTO_MODE_NONE
387626cd3dSBhargava Marreddy #define BNGE_LINK_AUTO_MSK	PORT_PHY_QCFG_RESP_AUTO_MODE_SPEED_MASK
397626cd3dSBhargava Marreddy #define BNGE_AUTO_MODE(mode)	((mode) > BNGE_LINK_AUTO_NONE && \
407626cd3dSBhargava Marreddy 				 (mode) <= BNGE_LINK_AUTO_MSK)
417626cd3dSBhargava Marreddy 
427626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_50GB	PORT_PHY_QCFG_RESP_LINK_SPEED_50GB
437626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_100GB	PORT_PHY_QCFG_RESP_LINK_SPEED_100GB
447626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_200GB	PORT_PHY_QCFG_RESP_LINK_SPEED_200GB
457626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_400GB	PORT_PHY_QCFG_RESP_LINK_SPEED_400GB
467626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_800GB	PORT_PHY_QCFG_RESP_LINK_SPEED_800GB
477626cd3dSBhargava Marreddy 
487626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_50GB PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_50GB
497626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_100GB PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_100GB
507626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_50GB_PAM4	\
517626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_50GB_PAM4_56
527626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_100GB_PAM4	\
537626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_100GB_PAM4_56
547626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_200GB_PAM4	\
557626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_200GB_PAM4_56
567626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_400GB_PAM4	\
577626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_400GB_PAM4_56
587626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_100GB_PAM4_112	\
597626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_100GB_PAM4_112
607626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_200GB_PAM4_112	\
617626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_200GB_PAM4_112
627626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_400GB_PAM4_112	\
637626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_400GB_PAM4_112
647626cd3dSBhargava Marreddy #define BNGE_LINK_SPEEDS2_MSK_800GB_PAM4_112	\
657626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_800GB_PAM4_112
667626cd3dSBhargava Marreddy 
677626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_50GB_PAM4	\
687626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_50GB_PAM4_56
697626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_100GB_PAM4	\
707626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_100GB_PAM4_56
717626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_200GB_PAM4	\
727626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_200GB_PAM4_56
737626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_400GB_PAM4	\
747626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_400GB_PAM4_56
757626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_100GB_PAM4_112	\
767626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_100GB_PAM4_112
777626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_200GB_PAM4_112	\
787626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_200GB_PAM4_112
797626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_400GB_PAM4_112	\
807626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_400GB_PAM4_112
817626cd3dSBhargava Marreddy #define BNGE_LINK_SPEED_800GB_PAM4_112	\
827626cd3dSBhargava Marreddy 	PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_800GB_PAM4_112
837626cd3dSBhargava Marreddy 
847626cd3dSBhargava Marreddy #define BNGE_FEC_NONE		PORT_PHY_QCFG_RESP_FEC_CFG_FEC_NONE_SUPPORTED
857626cd3dSBhargava Marreddy #define BNGE_FEC_AUTONEG	PORT_PHY_QCFG_RESP_FEC_CFG_FEC_AUTONEG_ENABLED
867626cd3dSBhargava Marreddy #define BNGE_FEC_ENC_BASE_R_CAP	\
877626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE74_SUPPORTED
887626cd3dSBhargava Marreddy #define BNGE_FEC_ENC_BASE_R	PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE74_ENABLED
897626cd3dSBhargava Marreddy #define BNGE_FEC_ENC_RS_CAP	\
907626cd3dSBhargava Marreddy 	PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE91_SUPPORTED
917626cd3dSBhargava Marreddy #define BNGE_FEC_ENC_LLRS_CAP	\
927626cd3dSBhargava Marreddy 	(PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_1XN_SUPPORTED |	\
937626cd3dSBhargava Marreddy 	 PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_IEEE_SUPPORTED)
947626cd3dSBhargava Marreddy #define BNGE_FEC_ENC_RS		\
957626cd3dSBhargava Marreddy 	(PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE91_ENABLED |	\
967626cd3dSBhargava Marreddy 	 PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS544_1XN_ENABLED |	\
977626cd3dSBhargava Marreddy 	 PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS544_IEEE_ENABLED)
987626cd3dSBhargava Marreddy #define BNGE_FEC_ENC_LLRS	\
997626cd3dSBhargava Marreddy 	(PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_1XN_ENABLED |	\
1007626cd3dSBhargava Marreddy 	 PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_IEEE_ENABLED)
1017626cd3dSBhargava Marreddy 
1027626cd3dSBhargava Marreddy struct bnge_link_info {
1037626cd3dSBhargava Marreddy 	u8			phy_type;
1047626cd3dSBhargava Marreddy 	u8			media_type;
1057626cd3dSBhargava Marreddy 	u8			phy_addr;
1067626cd3dSBhargava Marreddy 	u8			phy_link_status;
1077626cd3dSBhargava Marreddy 	bool			phy_enabled;
1087626cd3dSBhargava Marreddy 
1097626cd3dSBhargava Marreddy 	u8			link_state;
1107626cd3dSBhargava Marreddy 	u8			active_lanes;
1117626cd3dSBhargava Marreddy 	u8			duplex;
1127626cd3dSBhargava Marreddy 	u8			pause;
1137626cd3dSBhargava Marreddy 	u8			lp_pause;
1147626cd3dSBhargava Marreddy 	u8			auto_pause_setting;
1157626cd3dSBhargava Marreddy 	u8			force_pause_setting;
1167626cd3dSBhargava Marreddy 	u8			duplex_setting;
1177626cd3dSBhargava Marreddy 	u8			auto_mode;
1187626cd3dSBhargava Marreddy 	u16			link_speed;
1197626cd3dSBhargava Marreddy 	u16			support_speeds2;
1207626cd3dSBhargava Marreddy 	u16			auto_link_speeds2;
1217626cd3dSBhargava Marreddy 	u16			support_auto_speeds2;
1227626cd3dSBhargava Marreddy 	u16			lp_auto_link_speeds;
1237626cd3dSBhargava Marreddy 	u16			force_link_speed2;
1247626cd3dSBhargava Marreddy 
1257626cd3dSBhargava Marreddy 	u8			module_status;
1267626cd3dSBhargava Marreddy 	u8			active_fec_sig_mode;
1277626cd3dSBhargava Marreddy 	u16			fec_cfg;
1287626cd3dSBhargava Marreddy 
1297626cd3dSBhargava Marreddy 	/* A copy of phy_qcfg output used to report link
1307626cd3dSBhargava Marreddy 	 * info to VF
1317626cd3dSBhargava Marreddy 	 */
1327626cd3dSBhargava Marreddy 	struct hwrm_port_phy_qcfg_output phy_qcfg_resp;
1337626cd3dSBhargava Marreddy 
1347626cd3dSBhargava Marreddy 	bool			phy_retry;
1357626cd3dSBhargava Marreddy 	unsigned long		phy_retry_expires;
1367626cd3dSBhargava Marreddy };
1377626cd3dSBhargava Marreddy 
1387626cd3dSBhargava Marreddy #define BNGE_AUTONEG_SPEED		1
1397626cd3dSBhargava Marreddy #define BNGE_AUTONEG_FLOW_CTRL		2
1407626cd3dSBhargava Marreddy 
1417626cd3dSBhargava Marreddy #define BNGE_SIG_MODE_NRZ	PORT_PHY_QCFG_RESP_SIGNAL_MODE_NRZ
1427626cd3dSBhargava Marreddy #define BNGE_SIG_MODE_PAM4	PORT_PHY_QCFG_RESP_SIGNAL_MODE_PAM4
1437626cd3dSBhargava Marreddy #define BNGE_SIG_MODE_PAM4_112	PORT_PHY_QCFG_RESP_SIGNAL_MODE_PAM4_112
1447626cd3dSBhargava Marreddy #define BNGE_SIG_MODE_MAX	(PORT_PHY_QCFG_RESP_SIGNAL_MODE_LAST + 1)
1457626cd3dSBhargava Marreddy 
1467626cd3dSBhargava Marreddy struct bnge_ethtool_link_info {
1477626cd3dSBhargava Marreddy 	/* copy of requested setting from ethtool cmd */
1487626cd3dSBhargava Marreddy 	u8			autoneg;
1497626cd3dSBhargava Marreddy 	u8			req_signal_mode;
1507626cd3dSBhargava Marreddy 	u8			req_duplex;
1517626cd3dSBhargava Marreddy 	u8			req_flow_ctrl;
1527626cd3dSBhargava Marreddy 	u16			req_link_speed;
1537626cd3dSBhargava Marreddy 	u16			advertising;	/* user adv setting */
1547626cd3dSBhargava Marreddy 	bool			force_link_chng;
1557626cd3dSBhargava Marreddy };
1567626cd3dSBhargava Marreddy 
1577626cd3dSBhargava Marreddy void bnge_hwrm_set_link_common(struct bnge_net *bn,
1587626cd3dSBhargava Marreddy 			       struct hwrm_port_phy_cfg_input *req);
1597626cd3dSBhargava Marreddy void bnge_hwrm_set_pause_common(struct bnge_net *bn,
1607626cd3dSBhargava Marreddy 				struct hwrm_port_phy_cfg_input *req);
1617626cd3dSBhargava Marreddy int bnge_update_phy_setting(struct bnge_net *bn);
1627626cd3dSBhargava Marreddy void bnge_get_port_module_status(struct bnge_net *bn);
1637626cd3dSBhargava Marreddy void bnge_report_link(struct bnge_dev *bd);
1647626cd3dSBhargava Marreddy bool bnge_support_speed_dropped(struct bnge_net *bn);
1657626cd3dSBhargava Marreddy void bnge_init_ethtool_link_settings(struct bnge_net *bn);
1667626cd3dSBhargava Marreddy int bnge_probe_phy(struct bnge_net *bn, bool fw_dflt);
167169f6e8dSBhargava Marreddy int bnge_set_link_ksettings(struct net_device *dev,
168169f6e8dSBhargava Marreddy 			    const struct ethtool_link_ksettings *lk_ksettings);
169169f6e8dSBhargava Marreddy int bnge_get_link_ksettings(struct net_device *dev,
170169f6e8dSBhargava Marreddy 			    struct ethtool_link_ksettings *lk_ksettings);
171169f6e8dSBhargava Marreddy u32 bnge_get_link(struct net_device *dev);
172*4a759009SBhargava Marreddy void bnge_link_async_event_process(struct bnge_net *bn, u16 event_id);
1737626cd3dSBhargava Marreddy #endif /* _BNGE_LINK_H_ */
174