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