New adaptors (for instance, Medford4) can support 200G speed.

Signed-off-by: Ivan Malov <ivan.ma...@arknetworks.am>
Reviewed-by: Andy Moreton <andy.more...@amd.com>
Reviewed-by: Pieter Jansen Van Vuuren <pieter.jansen-van-vuu...@amd.com>
---
 drivers/net/sfc/sfc.c        |  5 ++++-
 drivers/net/sfc/sfc_ethdev.c | 15 +++++++++++++++
 drivers/net/sfc/sfc_port.c   |  6 ++++++
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/drivers/net/sfc/sfc.c b/drivers/net/sfc/sfc.c
index 938c967430..69747e49ae 100644
--- a/drivers/net/sfc/sfc.c
+++ b/drivers/net/sfc/sfc.c
@@ -126,7 +126,8 @@ sfc_phy_cap_from_link_speeds(uint32_t speeds)
                                (1 << EFX_PHY_CAP_25000FDX) |
                                (1 << EFX_PHY_CAP_40000FDX) |
                                (1 << EFX_PHY_CAP_50000FDX) |
-                               (1 << EFX_PHY_CAP_100000FDX);
+                               (1 << EFX_PHY_CAP_100000FDX) |
+                               (1 << EFX_PHY_CAP_200000FDX);
        }
        if (speeds & RTE_ETH_LINK_SPEED_1G)
                phy_caps |= (1 << EFX_PHY_CAP_1000FDX);
@@ -140,6 +141,8 @@ sfc_phy_cap_from_link_speeds(uint32_t speeds)
                phy_caps |= (1 << EFX_PHY_CAP_50000FDX);
        if (speeds & RTE_ETH_LINK_SPEED_100G)
                phy_caps |= (1 << EFX_PHY_CAP_100000FDX);
+       if (speeds & RTE_ETH_LINK_SPEED_200G)
+               phy_caps |= (1 << EFX_PHY_CAP_200000FDX);
 
        return phy_caps;
 }
diff --git a/drivers/net/sfc/sfc_ethdev.c b/drivers/net/sfc/sfc_ethdev.c
index 05933b1d39..80eb39e58d 100644
--- a/drivers/net/sfc/sfc_ethdev.c
+++ b/drivers/net/sfc/sfc_ethdev.c
@@ -117,6 +117,8 @@ sfc_dev_infos_get(struct rte_eth_dev *dev, struct 
rte_eth_dev_info *dev_info)
                dev_info->speed_capa |= RTE_ETH_LINK_SPEED_50G;
        if (sa->port.phy_adv_cap_mask & (1u << EFX_PHY_CAP_100000FDX))
                dev_info->speed_capa |= RTE_ETH_LINK_SPEED_100G;
+       if (sa->port.phy_adv_cap_mask & (1u << EFX_PHY_CAP_200000FDX))
+               dev_info->speed_capa |= RTE_ETH_LINK_SPEED_200G;
 
        dev_info->max_rx_queues = sa->rxq_max;
        dev_info->max_tx_queues = sa->txq_max;
@@ -2442,6 +2444,19 @@ sfc_fec_get_capa_speed_to_fec(uint32_t supported_caps,
                }
                num++;
        }
+       if (supported_caps & (1u << EFX_PHY_CAP_200000FDX)) {
+               if (speed_fec_capa != NULL) {
+                       speed_fec_capa[num].speed = RTE_ETH_SPEED_NUM_200G;
+                       speed_fec_capa[num].capa =
+                               RTE_ETH_FEC_MODE_CAPA_MASK(NOFEC) |
+                               RTE_ETH_FEC_MODE_CAPA_MASK(AUTO);
+                       if (rs) {
+                               speed_fec_capa[num].capa |=
+                                       RTE_ETH_FEC_MODE_CAPA_MASK(RS);
+                       }
+               }
+               num++;
+       }
 
        return num;
 }
diff --git a/drivers/net/sfc/sfc_port.c b/drivers/net/sfc/sfc_port.c
index 5e80003ca1..0a31a394d5 100644
--- a/drivers/net/sfc/sfc_port.c
+++ b/drivers/net/sfc/sfc_port.c
@@ -144,6 +144,8 @@ sfc_port_init_dev_link(struct sfc_adapter *sa)
 static efx_link_mode_t
 sfc_port_phy_caps_to_max_link_speed(uint32_t phy_caps)
 {
+       if (phy_caps & (1u << EFX_PHY_CAP_200000FDX))
+               return EFX_LINK_200000FDX;
        if (phy_caps & (1u << EFX_PHY_CAP_100000FDX))
                return EFX_LINK_100000FDX;
        if (phy_caps & (1u << EFX_PHY_CAP_50000FDX))
@@ -649,6 +651,10 @@ sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
                link_info->link_speed  = RTE_ETH_SPEED_NUM_100G;
                link_info->link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
                break;
+       case EFX_LINK_200000FDX:
+               link_info->link_speed  = RTE_ETH_SPEED_NUM_200G;
+               link_info->link_duplex = RTE_ETH_LINK_FULL_DUPLEX;
+               break;
        default:
                SFC_ASSERT(B_FALSE);
                /* FALLTHROUGH */
-- 
2.39.5

Reply via email to