1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
/* SPDX-License-Identifier: GPL-2.0 */ /* Copyright (c) 2026 Broadcom */ #ifndef _BNGE_LINK_H_ #define _BNGE_LINK_H_ #include <linux/ethtool.h> #define BNGE_PHY_CFG_ABLE(bd) \ ((bd)->link_info.phy_enabled) #define BNGE_PHY_AUTO_SPEEDS2_MASK \ PORT_PHY_CFG_REQ_ENABLES_AUTO_LINK_SPEEDS2_MASK #define BNGE_PHY_FLAGS_RESTART_AUTO \ PORT_PHY_CFG_REQ_FLAGS_RESTART_AUTONEG #define BNGE_PHY_FLAGS_ENA_FORCE_SPEEDS2 \ PORT_PHY_CFG_REQ_ENABLES_FORCE_LINK_SPEEDS2 #define BNGE_LINK_LINK PORT_PHY_QCFG_RESP_LINK_LINK enum bnge_link_state { BNGE_LINK_STATE_UNKNOWN, BNGE_LINK_STATE_DOWN, BNGE_LINK_STATE_UP, }; #define BNGE_LINK_IS_UP(bd) \ ((bd)->link_info.link_state == BNGE_LINK_STATE_UP) #define BNGE_LINK_DUPLEX_FULL PORT_PHY_QCFG_RESP_DUPLEX_STATE_FULL #define BNGE_LINK_PAUSE_TX PORT_PHY_QCFG_RESP_PAUSE_TX #define BNGE_LINK_PAUSE_RX PORT_PHY_QCFG_RESP_PAUSE_RX #define BNGE_LINK_PAUSE_BOTH (PORT_PHY_QCFG_RESP_PAUSE_RX | \ PORT_PHY_QCFG_RESP_PAUSE_TX) #define BNGE_LINK_AUTO_NONE PORT_PHY_QCFG_RESP_AUTO_MODE_NONE #define BNGE_LINK_AUTO_MSK PORT_PHY_QCFG_RESP_AUTO_MODE_SPEED_MASK #define BNGE_AUTO_MODE(mode) ((mode) > BNGE_LINK_AUTO_NONE && \ (mode) <= BNGE_LINK_AUTO_MSK) #define BNGE_LINK_SPEED_50GB PORT_PHY_QCFG_RESP_LINK_SPEED_50GB #define BNGE_LINK_SPEED_100GB PORT_PHY_QCFG_RESP_LINK_SPEED_100GB #define BNGE_LINK_SPEED_200GB PORT_PHY_QCFG_RESP_LINK_SPEED_200GB #define BNGE_LINK_SPEED_400GB PORT_PHY_QCFG_RESP_LINK_SPEED_400GB #define BNGE_LINK_SPEED_800GB PORT_PHY_QCFG_RESP_LINK_SPEED_800GB #define BNGE_LINK_SPEEDS2_MSK_50GB PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_50GB #define BNGE_LINK_SPEEDS2_MSK_100GB PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_100GB #define BNGE_LINK_SPEEDS2_MSK_50GB_PAM4 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_50GB_PAM4_56 #define BNGE_LINK_SPEEDS2_MSK_100GB_PAM4 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_100GB_PAM4_56 #define BNGE_LINK_SPEEDS2_MSK_200GB_PAM4 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_200GB_PAM4_56 #define BNGE_LINK_SPEEDS2_MSK_400GB_PAM4 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_400GB_PAM4_56 #define BNGE_LINK_SPEEDS2_MSK_100GB_PAM4_112 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_100GB_PAM4_112 #define BNGE_LINK_SPEEDS2_MSK_200GB_PAM4_112 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_200GB_PAM4_112 #define BNGE_LINK_SPEEDS2_MSK_400GB_PAM4_112 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_400GB_PAM4_112 #define BNGE_LINK_SPEEDS2_MSK_800GB_PAM4_112 \ PORT_PHY_QCFG_RESP_SUPPORT_SPEEDS2_800GB_PAM4_112 #define BNGE_LINK_SPEED_50GB_PAM4 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_50GB_PAM4_56 #define BNGE_LINK_SPEED_100GB_PAM4 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_100GB_PAM4_56 #define BNGE_LINK_SPEED_200GB_PAM4 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_200GB_PAM4_56 #define BNGE_LINK_SPEED_400GB_PAM4 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_400GB_PAM4_56 #define BNGE_LINK_SPEED_100GB_PAM4_112 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_100GB_PAM4_112 #define BNGE_LINK_SPEED_200GB_PAM4_112 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_200GB_PAM4_112 #define BNGE_LINK_SPEED_400GB_PAM4_112 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_400GB_PAM4_112 #define BNGE_LINK_SPEED_800GB_PAM4_112 \ PORT_PHY_CFG_REQ_FORCE_LINK_SPEEDS2_800GB_PAM4_112 #define BNGE_FEC_NONE PORT_PHY_QCFG_RESP_FEC_CFG_FEC_NONE_SUPPORTED #define BNGE_FEC_AUTONEG PORT_PHY_QCFG_RESP_FEC_CFG_FEC_AUTONEG_ENABLED #define BNGE_FEC_ENC_BASE_R_CAP \ PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE74_SUPPORTED #define BNGE_FEC_ENC_BASE_R PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE74_ENABLED #define BNGE_FEC_ENC_RS_CAP \ PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE91_SUPPORTED #define BNGE_FEC_ENC_LLRS_CAP \ (PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_1XN_SUPPORTED | \ PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_IEEE_SUPPORTED) #define BNGE_FEC_ENC_RS \ (PORT_PHY_QCFG_RESP_FEC_CFG_FEC_CLAUSE91_ENABLED | \ PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS544_1XN_ENABLED | \ PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS544_IEEE_ENABLED) #define BNGE_FEC_ENC_LLRS \ (PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_1XN_ENABLED | \ PORT_PHY_QCFG_RESP_FEC_CFG_FEC_RS272_IEEE_ENABLED) struct bnge_link_info { u8 phy_type; u8 media_type; u8 phy_addr; u8 phy_link_status; bool phy_enabled; u8 link_state; u8 active_lanes; u8 duplex; u8 pause; u8 lp_pause; u8 auto_pause_setting; u8 force_pause_setting; u8 duplex_setting; u8 auto_mode; u16 link_speed; u16 support_speeds2; u16 auto_link_speeds2; u16 support_auto_speeds2; u16 lp_auto_link_speeds; u16 force_link_speed2; u8 module_status; u8 active_fec_sig_mode; u16 fec_cfg; /* A copy of phy_qcfg output used to report link * info to VF */ struct hwrm_port_phy_qcfg_output phy_qcfg_resp; bool phy_retry; unsigned long phy_retry_expires; }; #define BNGE_AUTONEG_SPEED 1 #define BNGE_AUTONEG_FLOW_CTRL 2 #define BNGE_SIG_MODE_NRZ PORT_PHY_QCFG_RESP_SIGNAL_MODE_NRZ #define BNGE_SIG_MODE_PAM4 PORT_PHY_QCFG_RESP_SIGNAL_MODE_PAM4 #define BNGE_SIG_MODE_PAM4_112 PORT_PHY_QCFG_RESP_SIGNAL_MODE_PAM4_112 #define BNGE_SIG_MODE_MAX (PORT_PHY_QCFG_RESP_SIGNAL_MODE_LAST + 1) struct bnge_ethtool_link_info { /* copy of requested setting from ethtool cmd */ u8 autoneg; u8 req_signal_mode; u8 req_duplex; u8 req_flow_ctrl; u16 req_link_speed; u16 advertising; /* user adv setting */ bool force_link_chng; }; void bnge_hwrm_set_link_common(struct bnge_net *bn, struct hwrm_port_phy_cfg_input *req); void bnge_hwrm_set_pause_common(struct bnge_net *bn, struct hwrm_port_phy_cfg_input *req); int bnge_update_phy_setting(struct bnge_net *bn); void bnge_get_port_module_status(struct bnge_net *bn); void bnge_report_link(struct bnge_dev *bd); bool bnge_support_speed_dropped(struct bnge_net *bn); void bnge_init_ethtool_link_settings(struct bnge_net *bn); int bnge_probe_phy(struct bnge_net *bn, bool fw_dflt); int bnge_set_link_ksettings(struct net_device *dev, const struct ethtool_link_ksettings *lk_ksettings); int bnge_get_link_ksettings(struct net_device *dev, struct ethtool_link_ksettings *lk_ksettings); u32 bnge_get_link(struct net_device *dev); void bnge_link_async_event_process(struct bnge_net *bn, u16 event_id); #endif /* _BNGE_LINK_H_ */