@@ -7,6 +7,60 @@
#include <rte_eventdev.h>
#include <rte_pmd_cnxk.h>
+static const uint32_t cnxk_mac_modes[CGX_MODE_MAX + 1] = {
+ [CGX_MODE_SGMII] = RTE_ETH_LINK_SPEED_1G,
+ [CGX_MODE_1000_BASEX] = RTE_ETH_LINK_SPEED_1G,
+ [CGX_MODE_QSGMII] = RTE_ETH_LINK_SPEED_1G,
+ [CGX_MODE_10G_C2C] = RTE_ETH_LINK_SPEED_10G,
+ [CGX_MODE_10G_C2M] = RTE_ETH_LINK_SPEED_10G,
+ [CGX_MODE_10G_KR] = RTE_ETH_LINK_SPEED_10G,
+ [CGX_MODE_20G_C2C] = RTE_ETH_LINK_SPEED_20G,
+ [CGX_MODE_25G_C2C] = RTE_ETH_LINK_SPEED_25G,
+ [CGX_MODE_25G_C2M] = RTE_ETH_LINK_SPEED_25G,
+ [CGX_MODE_25G_2_C2C] = RTE_ETH_LINK_SPEED_25G,
+ [CGX_MODE_25G_CR] = RTE_ETH_LINK_SPEED_25G,
+ [CGX_MODE_25G_KR] = RTE_ETH_LINK_SPEED_25G,
+ [CGX_MODE_40G_C2C] = RTE_ETH_LINK_SPEED_40G,
+ [CGX_MODE_40G_C2M] = RTE_ETH_LINK_SPEED_40G,
+ [CGX_MODE_40G_CR4] = RTE_ETH_LINK_SPEED_40G,
+ [CGX_MODE_40G_KR4] = RTE_ETH_LINK_SPEED_40G,
+ [CGX_MODE_40GAUI_C2C] = RTE_ETH_LINK_SPEED_40G,
+ [CGX_MODE_50G_C2C] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_50G_C2M] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_50G_4_C2C] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_50G_CR] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_50G_KR] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_80GAUI_C2C] = 0, /* No define for 80G */
+ [CGX_MODE_100G_C2C] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_100G_C2M] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_100G_CR4] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_100G_KR4] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_LAUI_2_C2C_BIT] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_LAUI_2_C2M_BIT] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_50GBASE_CR2_C_BIT] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_50GBASE_KR2_C_BIT] = RTE_ETH_LINK_SPEED_50G,
+ [CGX_MODE_100GAUI_2_C2C_BIT] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_100GAUI_2_C2M_BIT] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_100GBASE_CR2_BIT] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_100GBASE_KR2_BIT] = RTE_ETH_LINK_SPEED_100G,
+ [CGX_MODE_SFI_1G_BIT] = RTE_ETH_LINK_SPEED_1G,
+ [CGX_MODE_25GBASE_CR_C_BIT] = RTE_ETH_LINK_SPEED_25G,
+ [CGX_MODE_25GBASE_KR_C_BIT] = RTE_ETH_LINK_SPEED_25G,
+ [ETH_MODE_SGMII_10M_BIT] = RTE_ETH_LINK_SPEED_10M | RTE_ETH_LINK_SPEED_10M_HD,
+ [ETH_MODE_SGMII_100M_BIT] = RTE_ETH_LINK_SPEED_100M | RTE_ETH_LINK_SPEED_100M_HD,
+ [40] = 0,
+ [41] = 0,
+ [ETH_MODE_2500_BASEX_BIT] = RTE_ETH_LINK_SPEED_2_5G,
+ [ETH_MODE_5000_BASEX_BIT] = RTE_ETH_LINK_SPEED_5G,
+ [ETH_MODE_O_USGMII_BIT] = RTE_ETH_LINK_SPEED_100M,
+ [ETH_MODE_Q_USGMII_BIT] = RTE_ETH_LINK_SPEED_1G,
+ [ETH_MODE_2_5G_USXGMII_BIT] = RTE_ETH_LINK_SPEED_2_5G,
+ [ETH_MODE_5G_USXGMII_BIT] = RTE_ETH_LINK_SPEED_5G,
+ [ETH_MODE_10G_SXGMII_BIT] = RTE_ETH_LINK_SPEED_10G,
+ [ETH_MODE_10G_DXGMII_BIT] = RTE_ETH_LINK_SPEED_10G,
+ [ETH_MODE_10G_QXGMII_BIT] = RTE_ETH_LINK_SPEED_10G,
+};
+
cnxk_ethdev_rx_offload_cb_t cnxk_ethdev_rx_offload_cb;
#define CNXK_NIX_CQ_INL_CLAMP_MAX (64UL * 1024UL)
@@ -42,14 +96,29 @@ nix_get_tx_offload_capa(struct cnxk_eth_dev *dev)
static inline uint32_t
nix_get_speed_capa(struct cnxk_eth_dev *dev)
{
+ struct roc_nix_mac_fwdata fwdata;
uint32_t speed_capa;
+ uint8_t mode;
+ int rc;
/* Auto negotiation disabled */
speed_capa = RTE_ETH_LINK_SPEED_FIXED;
if (!roc_nix_is_vf_or_sdp(&dev->nix) && !roc_nix_is_lbk(&dev->nix)) {
- speed_capa |= RTE_ETH_LINK_SPEED_1G | RTE_ETH_LINK_SPEED_10G |
- RTE_ETH_LINK_SPEED_25G | RTE_ETH_LINK_SPEED_40G |
- RTE_ETH_LINK_SPEED_50G | RTE_ETH_LINK_SPEED_100G;
+ memset(&fwdata, 0, sizeof(fwdata));
+ rc = roc_nix_mac_fwdata_get(&dev->nix, &fwdata);
+ if (rc) {
+ plt_err("Failed to get MAC firmware data");
+ return 0;
+ }
+
+ if (fwdata.supported_an)
+ speed_capa = 0;
+
+ /* Translate advertised modes to speed_capa */
+ for (mode = 0; mode < CGX_MODE_MAX; mode++) {
+ if (fwdata.supported_link_modes & BIT_ULL(mode))
+ speed_capa |= cnxk_mac_modes[mode];
+ }
}
return speed_capa;