net/ixgbe/base: add EEE support for some PHYs
[dpdk.git] / drivers / net / nfp / nfp_net.c
index 88169a7..869c55c 100644 (file)
@@ -818,6 +818,17 @@ nfp_net_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete)
        struct rte_eth_link link, old;
        uint32_t nn_link_status;
 
+       static const uint32_t ls_to_ethtool[] = {
+               [NFP_NET_CFG_STS_LINK_RATE_UNSUPPORTED] = ETH_SPEED_NUM_NONE,
+               [NFP_NET_CFG_STS_LINK_RATE_UNKNOWN]     = ETH_SPEED_NUM_NONE,
+               [NFP_NET_CFG_STS_LINK_RATE_1G]          = ETH_SPEED_NUM_1G,
+               [NFP_NET_CFG_STS_LINK_RATE_10G]         = ETH_SPEED_NUM_10G,
+               [NFP_NET_CFG_STS_LINK_RATE_25G]         = ETH_SPEED_NUM_25G,
+               [NFP_NET_CFG_STS_LINK_RATE_40G]         = ETH_SPEED_NUM_40G,
+               [NFP_NET_CFG_STS_LINK_RATE_50G]         = ETH_SPEED_NUM_50G,
+               [NFP_NET_CFG_STS_LINK_RATE_100G]        = ETH_SPEED_NUM_100G,
+       };
+
        PMD_DRV_LOG(DEBUG, "Link update\n");
 
        hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
@@ -833,8 +844,21 @@ nfp_net_link_update(struct rte_eth_dev *dev, __rte_unused int wait_to_complete)
                link.link_status = ETH_LINK_UP;
 
        link.link_duplex = ETH_LINK_FULL_DUPLEX;
-       /* Other cards can limit the tx and rx rate per VF */
-       link.link_speed = ETH_SPEED_NUM_40G;
+
+       nn_link_status = (nn_link_status >> NFP_NET_CFG_STS_LINK_RATE_SHIFT) &
+                        NFP_NET_CFG_STS_LINK_RATE_MASK;
+
+       if ((NFD_CFG_MAJOR_VERSION_of(hw->ver) < 4) ||
+           ((NFD_CFG_MINOR_VERSION_of(hw->ver) == 4) &&
+           (NFD_CFG_MINOR_VERSION_of(hw->ver) == 0)))
+               /* We really do not know the speed wil old firmware */
+               link.link_speed = ETH_SPEED_NUM_NONE;
+       else {
+               if (nn_link_status >= RTE_DIM(ls_to_ethtool))
+                       link.link_speed = ETH_SPEED_NUM_NONE;
+               else
+                       link.link_speed = ls_to_ethtool[nn_link_status];
+       }
 
        if (old.link_status != link.link_status) {
                nfp_net_dev_atomic_write_link_status(dev, &link);
@@ -1009,7 +1033,6 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
        hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
 
        dev_info->pci_dev = RTE_DEV_TO_PCI(dev->device);
-       dev_info->driver_name = dev->driver->pci_drv.driver.name;
        dev_info->max_rx_queues = (uint16_t)hw->max_rx_queues;
        dev_info->max_tx_queues = (uint16_t)hw->max_tx_queues;
        dev_info->min_rx_bufsize = ETHER_MIN_MTU;
@@ -1030,8 +1053,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)
 
        if (hw->cap & NFP_NET_CFG_CTRL_TXCSUM)
                dev_info->tx_offload_capa |= DEV_TX_OFFLOAD_IPV4_CKSUM |
-                                            DEV_RX_OFFLOAD_UDP_CKSUM |
-                                            DEV_RX_OFFLOAD_TCP_CKSUM;
+                                            DEV_TX_OFFLOAD_UDP_CKSUM |
+                                            DEV_TX_OFFLOAD_TCP_CKSUM;
 
        dev_info->default_rxconf = (struct rte_eth_rxconf) {
                .rx_thresh = {
@@ -1058,7 +1081,9 @@ 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->speed_capa = ETH_LINK_SPEED_40G | ETH_LINK_SPEED_100G;
+       dev_info->speed_capa = ETH_SPEED_NUM_1G | ETH_LINK_SPEED_10G |
+                              ETH_SPEED_NUM_25G | ETH_SPEED_NUM_40G |
+                              ETH_SPEED_NUM_50G | ETH_LINK_SPEED_100G;
 }
 
 static const uint32_t *
@@ -1610,12 +1635,6 @@ nfp_net_set_hash(struct nfp_net_rxq *rxq, struct nfp_net_rx_desc *rxd,
        hash = rte_be_to_cpu_32(*(uint32_t *)NFP_HASH_OFFSET);
        hash_type = rte_be_to_cpu_32(*(uint32_t *)NFP_HASH_TYPE_OFFSET);
 
-       /*
-        * hash type is sharing the same word with input port info
-        * 31-8: input port
-        * 7:0: hash type
-        */
-       hash_type &= 0xff;
        mbuf->hash.rss = hash;
        mbuf->ol_flags |= PKT_RX_RSS_HASH;
 
@@ -1634,29 +1653,6 @@ nfp_net_set_hash(struct nfp_net_rxq *rxq, struct nfp_net_rx_desc *rxd,
        }
 }
 
-/* nfp_net_check_port - Set mbuf in_port field */
-static void
-nfp_net_check_port(struct nfp_net_rx_desc *rxd, struct rte_mbuf *mbuf)
-{
-       uint32_t port;
-
-       if (!(rxd->rxd.flags & PCIE_DESC_RX_INGRESS_PORT)) {
-               mbuf->port = 0;
-               return;
-       }
-
-       port = rte_be_to_cpu_32(*(uint32_t *)((uint8_t *)mbuf->buf_addr +
-                                             mbuf->data_off - 8));
-
-       /*
-        * hash type is sharing the same word with input port info
-        * 31-8: input port
-        * 7:0: hash type
-        */
-       port = (uint8_t)(port >> 8);
-       mbuf->port = port;
-}
-
 static inline void
 nfp_net_mbuf_alloc_failed(struct nfp_net_rxq *rxq)
 {
@@ -1806,9 +1802,6 @@ nfp_net_recv_pkts(void *rx_queue, struct rte_mbuf **rx_pkts, uint16_t nb_pkts)
                /* Checking the checksum flag */
                nfp_net_rx_cksum(rxq, rxds, mb);
 
-               /* Checking the port flag */
-               nfp_net_check_port(rxds, mb);
-
                if ((rxds->rxd.flags & PCIE_DESC_RX_VLAN) &&
                    (hw->ctrl & NFP_NET_CFG_CTRL_RXVLAN)) {
                        mb->vlan_tci = rte_cpu_to_le_32(rxds->rxd.vlan);