]> git.droids-corp.org - dpdk.git/commitdiff
ethdev: add speed capabilities
authorMarc Sune <marcdevel@gmail.com>
Thu, 31 Mar 2016 22:12:28 +0000 (00:12 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Fri, 1 Apr 2016 19:38:34 +0000 (21:38 +0200)
The speed capabilities of a device can be retrieved with
rte_eth_dev_info_get().

The new field speed_capa is initialized in the drivers without
taking care of device characteristics in this patch.
When the capabilities of a driver are accurate, the table in
overview.rst must be filled.

Signed-off-by: Marc Sune <marcdevel@gmail.com>
14 files changed:
doc/guides/nics/overview.rst
doc/guides/rel_notes/release_16_04.rst
drivers/net/bnx2x/bnx2x_ethdev.c
drivers/net/cxgbe/cxgbe_ethdev.c
drivers/net/e1000/em_ethdev.c
drivers/net/e1000/igb_ethdev.c
drivers/net/ena/ena_ethdev.c
drivers/net/fm10k/fm10k_ethdev.c
drivers/net/i40e/i40e_ethdev.c
drivers/net/ixgbe/ixgbe_ethdev.c
drivers/net/mlx4/mlx4.c
drivers/net/mlx5/mlx5_ethdev.c
drivers/net/nfp/nfp_net.c
lib/librte_ether/rte_ethdev.h

index 542479a6747ba92fcae068b154f8e35219c0503e..62f1868e83594a8bb0bcd5bb5d00befbe9a77767 100644 (file)
@@ -86,6 +86,7 @@ Most of these differences are summarized below.
                                           e   e       e   e   e                     e
                                           c   c       c   c   c                     c
    ==================== = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
                                           e   e       e   e   e                     e
                                           c   c       c   c   c                     c
    ==================== = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
+   speed capabilities
    link status                  X       X X                                   X X
    link status event                    X X                                     X
    queue status event                                                           X
    link status                  X       X X                                   X X
    link status event                    X X                                     X
    queue status event                                                           X
index e6cc34d3214ce685430e23f5d87ccd0d641d0a18..8e565ab49cdb1aa26d6398df4e51e72ea2514a21 100644 (file)
@@ -47,6 +47,11 @@ This section should contain new features added in this release. Sample format:
   A new function ``rte_pktmbuf_alloc_bulk()`` has been added to allow the user
   to allocate a bulk of mbufs.
 
   A new function ``rte_pktmbuf_alloc_bulk()`` has been added to allow the user
   to allocate a bulk of mbufs.
 
+* **Added device link speed capabilities.**
+
+  The structure ``rte_eth_dev_info`` has now a ``speed_capa`` bitmap, which
+  allows the application to know the supported speeds of each device.
+
 * **Added new poll-mode driver for Amazon Elastic Network Adapters (ENA).**
 
   The driver operates variety of ENA adapters through feature negotiation
 * **Added new poll-mode driver for Amazon Elastic Network Adapters (ENA).**
 
   The driver operates variety of ENA adapters through feature negotiation
@@ -464,6 +469,9 @@ This section should contain API changes. Sample format:
   All drivers are now counting the missed packets only once, i.e. drivers will
   not increment ierrors anymore for missed packets.
 
   All drivers are now counting the missed packets only once, i.e. drivers will
   not increment ierrors anymore for missed packets.
 
+* The ethdev structure ``rte_eth_dev_info`` was changed to support device
+  speed capabilities.
+
 * The functions ``rte_eth_dev_udp_tunnel_add`` and ``rte_eth_dev_udp_tunnel_delete``
   have been renamed into ``rte_eth_dev_udp_tunnel_port_add`` and
   ``rte_eth_dev_udp_tunnel_port_delete``.
 * The functions ``rte_eth_dev_udp_tunnel_add`` and ``rte_eth_dev_udp_tunnel_delete``
   have been renamed into ``rte_eth_dev_udp_tunnel_port_add`` and
   ``rte_eth_dev_udp_tunnel_port_delete``.
index a3c6c01b404fe851179dfb0eeedda9e98ec2bb16..897081f169e4655a988ae2c736ec1cda2f8a8a8f 100644 (file)
@@ -327,6 +327,7 @@ bnx2x_dev_infos_get(struct rte_eth_dev *dev, __rte_unused struct rte_eth_dev_inf
        dev_info->min_rx_bufsize = BNX2X_MIN_RX_BUF_SIZE;
        dev_info->max_rx_pktlen  = BNX2X_MAX_RX_PKT_LEN;
        dev_info->max_mac_addrs  = BNX2X_MAX_MAC_ADDRS;
        dev_info->min_rx_bufsize = BNX2X_MIN_RX_BUF_SIZE;
        dev_info->max_rx_pktlen  = BNX2X_MAX_RX_PKT_LEN;
        dev_info->max_mac_addrs  = BNX2X_MAX_MAC_ADDRS;
+       dev_info->speed_capa = ETH_LINK_SPEED_10G | ETH_LINK_SPEED_20G;
 }
 
 static void
 }
 
 static void
index 8845c76a0f6747a6e75b05c30564f36e37633c6e..bb134e504f71d3c22da2a71c1772bf08972d868c 100644 (file)
@@ -171,6 +171,7 @@ static void cxgbe_dev_info_get(struct rte_eth_dev *eth_dev,
 
        device_info->rx_desc_lim = cxgbe_desc_lim;
        device_info->tx_desc_lim = cxgbe_desc_lim;
 
        device_info->rx_desc_lim = cxgbe_desc_lim;
        device_info->tx_desc_lim = cxgbe_desc_lim;
+       device_info->speed_capa = ETH_LINK_SPEED_10G | ETH_LINK_SPEED_40G;
 }
 
 static void cxgbe_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
 }
 
 static void cxgbe_dev_promiscuous_enable(struct rte_eth_dev *eth_dev)
index 8e4bd08ee7425da8fc25f648e07280fccdb83161..890c5c3695871451b096804b6c27acbb0d8b8bc1 100644 (file)
@@ -1055,6 +1055,10 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                .nb_min = E1000_MIN_RING_DESC,
                .nb_align = EM_TXD_ALIGN,
        };
                .nb_min = E1000_MIN_RING_DESC,
                .nb_align = EM_TXD_ALIGN,
        };
+
+       dev_info->speed_capa = ETH_LINK_SPEED_10M_HD | ETH_LINK_SPEED_10M |
+                       ETH_LINK_SPEED_100M_HD | ETH_LINK_SPEED_100M |
+                       ETH_LINK_SPEED_1G;
 }
 
 /* return 0 means link status changed, -1 means not changed */
 }
 
 /* return 0 means link status changed, -1 means not changed */
index 86f25f6b3642963a9cec14e02919c1e231d5d495..95d1711765f387fbe41c70832abac4f7140fa45d 100644 (file)
@@ -1921,6 +1921,10 @@ eth_igb_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
        dev_info->rx_desc_lim = rx_desc_lim;
        dev_info->tx_desc_lim = tx_desc_lim;
 
        dev_info->rx_desc_lim = rx_desc_lim;
        dev_info->tx_desc_lim = tx_desc_lim;
+
+       dev_info->speed_capa = ETH_LINK_SPEED_10M_HD | ETH_LINK_SPEED_10M |
+                       ETH_LINK_SPEED_100M_HD | ETH_LINK_SPEED_100M |
+                       ETH_LINK_SPEED_1G;
 }
 
 static const uint32_t *
 }
 
 static const uint32_t *
index 10462865e1facf73e0d9969e0287ed19573fcb28..4e403af0134e7c24539ca8bd8baa687e7ee5f9a3 100644 (file)
@@ -1170,6 +1170,15 @@ static void ena_infos_get(struct rte_eth_dev *dev,
        ena_dev = &adapter->ena_dev;
        ena_assert_msg(ena_dev != NULL, "Uninitialized device");
 
        ena_dev = &adapter->ena_dev;
        ena_assert_msg(ena_dev != NULL, "Uninitialized device");
 
+       dev_info->speed_capa =
+                       ETH_LINK_SPEED_1G   |
+                       ETH_LINK_SPEED_2_5G |
+                       ETH_LINK_SPEED_5G   |
+                       ETH_LINK_SPEED_10G  |
+                       ETH_LINK_SPEED_25G  |
+                       ETH_LINK_SPEED_40G  |
+                       ETH_LINK_SPEED_50G;
+
        /* Get supported features from HW */
        rc = ena_com_get_dev_attr_feat(ena_dev, &feat);
        if (unlikely(rc)) {
        /* Get supported features from HW */
        rc = ena_com_get_dev_attr_feat(ena_dev, &feat);
        if (unlikely(rc)) {
index b76e9e50ea515bb622c757e43f0eb17512c34f2f..2be297a31181b1228d6c74f7fd94541ea2ab8e49 100644 (file)
@@ -1412,6 +1412,10 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
                .nb_min = FM10K_MIN_TX_DESC,
                .nb_align = FM10K_MULT_TX_DESC,
        };
                .nb_min = FM10K_MIN_TX_DESC,
                .nb_align = FM10K_MULT_TX_DESC,
        };
+
+       dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_2_5G |
+                       ETH_LINK_SPEED_10G | ETH_LINK_SPEED_25G |
+                       ETH_LINK_SPEED_40G;
 }
 
 #ifdef RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE
 }
 
 #ifdef RTE_LIBRTE_FM10K_RX_OLFLAGS_ENABLE
index 988c2deebd851fc364aaa605c8103dfe7b420e97..cde314d5e3875a8f77774299d30e4b47f6fc03b9 100644 (file)
@@ -2287,6 +2287,7 @@ static void
 i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
 i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 {
        struct i40e_pf *pf = I40E_DEV_PRIVATE_TO_PF(dev->data->dev_private);
+       struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
        struct i40e_vsi *vsi = pf->main_vsi;
 
        dev_info->max_rx_queues = vsi->nb_qps;
        struct i40e_vsi *vsi = pf->main_vsi;
 
        dev_info->max_rx_queues = vsi->nb_qps;
@@ -2358,6 +2359,13 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
                dev_info->max_rx_queues += dev_info->vmdq_queue_num;
                dev_info->max_tx_queues += dev_info->vmdq_queue_num;
        }
                dev_info->max_rx_queues += dev_info->vmdq_queue_num;
                dev_info->max_tx_queues += dev_info->vmdq_queue_num;
        }
+
+       if (i40e_is_40G_device(hw->device_id))
+               /* For XL710 */
+               dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;
+       else
+               /* For X710 */
+               dev_info->speed_capa = ETH_LINK_SPEED_10G | ETH_LINK_SPEED_40G;
 }
 
 static int
 }
 
 static int
index 60a9cf45c8f1009ec32efe2c30fc979f8fc16058..894278f5ef6b3410c6421ec8e3ffde59ae20bc56 100644 (file)
@@ -2965,6 +2965,14 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        dev_info->hash_key_size = IXGBE_HKEY_MAX_INDEX * sizeof(uint32_t);
        dev_info->reta_size = ixgbe_reta_size_get(hw->mac.type);
        dev_info->flow_type_rss_offloads = IXGBE_RSS_OFFLOAD_ALL;
        dev_info->hash_key_size = IXGBE_HKEY_MAX_INDEX * sizeof(uint32_t);
        dev_info->reta_size = ixgbe_reta_size_get(hw->mac.type);
        dev_info->flow_type_rss_offloads = IXGBE_RSS_OFFLOAD_ALL;
+
+       dev_info->speed_capa = ETH_LINK_SPEED_1G | ETH_LINK_SPEED_10G;
+       if (hw->mac.type == ixgbe_mac_X540 ||
+           hw->mac.type == ixgbe_mac_X540_vf ||
+           hw->mac.type == ixgbe_mac_X550 ||
+           hw->mac.type == ixgbe_mac_X550_vf) {
+               dev_info->speed_capa |= ETH_LINK_SPEED_100M;
+       }
 }
 
 static const uint32_t *
 }
 
 static const uint32_t *
index 5cc995f00c279e278e9098550c3582ca689781a0..ed2f488758140be62c6019f365eae54bceeb813d 100644 (file)
@@ -4328,6 +4328,12 @@ mlx4_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
                 0);
        if (priv_get_ifname(priv, &ifname) == 0)
                info->if_index = if_nametoindex(ifname);
                 0);
        if (priv_get_ifname(priv, &ifname) == 0)
                info->if_index = if_nametoindex(ifname);
+       info->speed_capa =
+                       ETH_LINK_SPEED_1G |
+                       ETH_LINK_SPEED_10G |
+                       ETH_LINK_SPEED_20G |
+                       ETH_LINK_SPEED_40G |
+                       ETH_LINK_SPEED_56G;
        priv_unlock(priv);
 }
 
        priv_unlock(priv);
 }
 
index 58bfa16c32fd3176fd615ab4b9d8e1f855621a1e..d7a0eeae79afca8b154a026fba455cdf67c37cb6 100644 (file)
@@ -559,6 +559,14 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
         * size if it is not fixed.
         * The API should be updated to solve this problem. */
        info->reta_size = priv->ind_table_max_size;
         * size if it is not fixed.
         * The API should be updated to solve this problem. */
        info->reta_size = priv->ind_table_max_size;
+       info->speed_capa =
+                       ETH_LINK_SPEED_1G |
+                       ETH_LINK_SPEED_10G |
+                       ETH_LINK_SPEED_20G |
+                       ETH_LINK_SPEED_25G |
+                       ETH_LINK_SPEED_40G |
+                       ETH_LINK_SPEED_50G |
+                       ETH_LINK_SPEED_56G;
        priv_unlock(priv);
 }
 
        priv_unlock(priv);
 }
 
index 201c38e1e116d7447e6eb7d00ddbdfbc58f8819f..dd033f4def08c2e6b2b6578cf44ba87d97142176 100644 (file)
@@ -1061,6 +1061,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
        dev_info->reta_size = NFP_NET_CFG_RSS_ITBL_SZ;
        dev_info->hash_key_size = NFP_NET_CFG_RSS_KEY_SZ;
 
        dev_info->reta_size = NFP_NET_CFG_RSS_ITBL_SZ;
        dev_info->hash_key_size = NFP_NET_CFG_RSS_KEY_SZ;
+
+       dev_info->speed_capa = ETH_LINK_SPEED_40G;
 }
 
 static const uint32_t *
 }
 
 static const uint32_t *
index bc7d607a26c77cd13cc74469386aaa5f86a288d4..49fdcb7b9712440daa78c170e9387f77823f1e12 100644 (file)
@@ -241,6 +241,23 @@ struct rte_eth_stats {
        /**< Total number of good bytes transmitted to loopback,VF Only */
 };
 
        /**< Total number of good bytes transmitted to loopback,VF Only */
 };
 
+/**
+ * Device supported speeds bitmap flags
+ */
+#define ETH_LINK_SPEED_10M_HD   (1 <<  1)  /**<  10 Mbps half-duplex */
+#define ETH_LINK_SPEED_10M      (1 <<  2)  /**<  10 Mbps full-duplex */
+#define ETH_LINK_SPEED_100M_HD  (1 <<  3)  /**< 100 Mbps half-duplex */
+#define ETH_LINK_SPEED_100M     (1 <<  4)  /**< 100 Mbps full-duplex */
+#define ETH_LINK_SPEED_1G       (1 <<  5)  /**<   1 Gbps */
+#define ETH_LINK_SPEED_2_5G     (1 <<  6)  /**< 2.5 Gbps */
+#define ETH_LINK_SPEED_5G       (1 <<  7)  /**<   5 Gbps */
+#define ETH_LINK_SPEED_10G      (1 <<  8)  /**<  10 Gbps */
+#define ETH_LINK_SPEED_20G      (1 <<  9)  /**<  20 Gbps */
+#define ETH_LINK_SPEED_25G      (1 << 10)  /**<  25 Gbps */
+#define ETH_LINK_SPEED_40G      (1 << 11)  /**<  40 Gbps */
+#define ETH_LINK_SPEED_50G      (1 << 12)  /**<  50 Gbps */
+#define ETH_LINK_SPEED_56G      (1 << 13)  /**<  56 Gbps */
+
 /**
  * Ethernet numeric link speeds in Mbps
  */
 /**
  * Ethernet numeric link speeds in Mbps
  */
@@ -850,6 +867,9 @@ struct rte_eth_conf {
 #define DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM 0x00000080 /**< Used for tunneling packet. */
 #define DEV_TX_OFFLOAD_QINQ_INSERT 0x00000100
 
 #define DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM 0x00000080 /**< Used for tunneling packet. */
 #define DEV_TX_OFFLOAD_QINQ_INSERT 0x00000100
 
+/**
+ * Ethernet device information
+ */
 struct rte_eth_dev_info {
        struct rte_pci_device *pci_dev; /**< Device PCI information. */
        const char *driver_name; /**< Device Driver name. */
 struct rte_eth_dev_info {
        struct rte_pci_device *pci_dev; /**< Device PCI information. */
        const char *driver_name; /**< Device Driver name. */
@@ -878,6 +898,7 @@ struct rte_eth_dev_info {
        uint16_t vmdq_pool_base;  /**< First ID of VMDQ pools. */
        struct rte_eth_desc_lim rx_desc_lim;  /**< RX descriptors limits */
        struct rte_eth_desc_lim tx_desc_lim;  /**< TX descriptors limits */
        uint16_t vmdq_pool_base;  /**< First ID of VMDQ pools. */
        struct rte_eth_desc_lim rx_desc_lim;  /**< RX descriptors limits */
        struct rte_eth_desc_lim tx_desc_lim;  /**< TX descriptors limits */
+       uint32_t speed_capa;  /**< Supported speeds bitmap (ETH_LINK_SPEED_). */
 };
 
 /**
 };
 
 /**