net/txgbe: add queue stats mapping
[dpdk.git] / drivers / net / ark / ark_ethdev.c
index 3e96445..a658993 100644 (file)
@@ -10,6 +10,7 @@
 #include <rte_ethdev_pci.h>
 #include <rte_kvargs.h>
 
+#include "rte_pmd_ark.h"
 #include "ark_global.h"
 #include "ark_logs.h"
 #include "ark_ethdev_tx.h"
@@ -29,7 +30,7 @@ static int ark_config_device(struct rte_eth_dev *dev);
 static int eth_ark_dev_uninit(struct rte_eth_dev *eth_dev);
 static int eth_ark_dev_configure(struct rte_eth_dev *dev);
 static int eth_ark_dev_start(struct rte_eth_dev *dev);
-static void eth_ark_dev_stop(struct rte_eth_dev *dev);
+static int eth_ark_dev_stop(struct rte_eth_dev *dev);
 static int eth_ark_dev_close(struct rte_eth_dev *dev);
 static int eth_ark_dev_info_get(struct rte_eth_dev *dev,
                                struct rte_eth_dev_info *dev_info);
@@ -78,6 +79,12 @@ static int  eth_ark_set_mtu(struct rte_eth_dev *dev, uint16_t size);
 #define ARK_TX_MAX_QUEUE (4096 * 4)
 #define ARK_TX_MIN_QUEUE (256)
 
+uint64_t ark_timestamp_rx_dynflag;
+int ark_timestamp_dynfield_offset = -1;
+
+int rte_pmd_ark_rx_userdata_dynfield_offset = -1;
+int rte_pmd_ark_tx_userdata_dynfield_offset = -1;
+
 static const char * const valid_arguments[] = {
        ARK_PKTGEN_ARG,
        ARK_PKTCHKR_ARG,
@@ -245,6 +252,16 @@ eth_ark_dev_init(struct rte_eth_dev *dev)
        int ret;
        int port_count = 1;
        int p;
+       static const struct rte_mbuf_dynfield ark_tx_userdata_dynfield_desc = {
+               .name = RTE_PMD_ARK_TX_USERDATA_DYNFIELD_NAME,
+               .size = sizeof(rte_pmd_ark_tx_userdata_t),
+               .align = __alignof__(rte_pmd_ark_tx_userdata_t),
+       };
+       static const struct rte_mbuf_dynfield ark_rx_userdata_dynfield_desc = {
+               .name = RTE_PMD_ARK_RX_USERDATA_DYNFIELD_NAME,
+               .size = sizeof(rte_pmd_ark_rx_userdata_t),
+               .align = __alignof__(rte_pmd_ark_rx_userdata_t),
+       };
 
        ark->eth_dev = dev;
 
@@ -254,8 +271,34 @@ eth_ark_dev_init(struct rte_eth_dev *dev)
        ret = check_for_ext(ark);
        if (ret)
                return ret;
+
+       /* Extra mbuf fields for user data */
+       if (RTE_PMD_ARK_TX_USERDATA_ENABLE) {
+               rte_pmd_ark_tx_userdata_dynfield_offset =
+                   rte_mbuf_dynfield_register(&ark_tx_userdata_dynfield_desc);
+               if (rte_pmd_ark_tx_userdata_dynfield_offset < 0) {
+                       ARK_PMD_LOG(ERR,
+                                   "Failed to register mbuf field for tx userdata\n");
+                       return -rte_errno;
+               }
+               ARK_PMD_LOG(INFO, "Registered TX-meta dynamic field at %d\n",
+                           rte_pmd_ark_tx_userdata_dynfield_offset);
+       }
+       if (RTE_PMD_ARK_RX_USERDATA_ENABLE) {
+               rte_pmd_ark_rx_userdata_dynfield_offset =
+                   rte_mbuf_dynfield_register(&ark_rx_userdata_dynfield_desc);
+               if (rte_pmd_ark_rx_userdata_dynfield_offset < 0) {
+                       ARK_PMD_LOG(ERR,
+                                   "Failed to register mbuf field for rx userdata\n");
+                       return -rte_errno;
+               }
+               ARK_PMD_LOG(INFO, "Registered RX-meta dynamic field at %d\n",
+                           rte_pmd_ark_rx_userdata_dynfield_offset);
+       }
+
        pci_dev = RTE_ETH_DEV_TO_PCI(dev);
        rte_eth_copy_pci_info(dev, pci_dev);
+       dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
        /* Use dummy function until setup */
        dev->rx_pkt_burst = &eth_ark_recv_pkts_noop;
@@ -383,6 +426,7 @@ eth_ark_dev_init(struct rte_eth_dev *dev)
                eth_dev->rx_pkt_burst = ark->eth_dev->rx_pkt_burst;
 
                rte_eth_copy_pci_info(eth_dev, pci_dev);
+               eth_dev->data->dev_flags |= RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS;
 
                eth_dev->data->mac_addrs = rte_zmalloc(name,
                                                RTE_ETHER_ADDR_LEN, 0);
@@ -504,9 +548,6 @@ eth_ark_dev_uninit(struct rte_eth_dev *dev)
        ark_pktgen_uninit(ark->pg);
        ark_pktchkr_uninit(ark->pc);
 
-       dev->dev_ops = NULL;
-       dev->rx_pkt_burst = NULL;
-       dev->tx_pkt_burst = NULL;
        return 0;
 }
 
@@ -514,6 +555,18 @@ static int
 eth_ark_dev_configure(struct rte_eth_dev *dev)
 {
        struct ark_adapter *ark = dev->data->dev_private;
+       int ret;
+
+       if (dev->data->dev_conf.rxmode.offloads & DEV_RX_OFFLOAD_TIMESTAMP) {
+               ret = rte_mbuf_dyn_rx_timestamp_register(
+                               &ark_timestamp_dynfield_offset,
+                               &ark_timestamp_rx_dynflag);
+               if (ret != 0) {
+                       ARK_PMD_LOG(ERR,
+                               "Failed to register Rx timestamp field/flag\n");
+                       return -rte_errno;
+               }
+       }
 
        eth_ark_dev_set_link_up(dev);
        if (ark->user_ext.dev_configure)
@@ -584,7 +637,7 @@ eth_ark_dev_start(struct rte_eth_dev *dev)
        return 0;
 }
 
-static void
+static int
 eth_ark_dev_stop(struct rte_eth_dev *dev)
 {
        uint16_t i;
@@ -593,8 +646,9 @@ eth_ark_dev_stop(struct rte_eth_dev *dev)
        struct ark_mpu_t *mpu;
 
        if (ark->started == 0)
-               return;
+               return 0;
        ark->started = 0;
+       dev->data->dev_started = 0;
 
        /* Stop the extension first */
        if (ark->user_ext.dev_stop)
@@ -672,6 +726,8 @@ eth_ark_dev_stop(struct rte_eth_dev *dev)
                ark_pktchkr_dump_stats(ark->pc);
                ark_pktchkr_stop(ark->pc);
        }
+
+       return 0;
 }
 
 static int
@@ -705,9 +761,6 @@ eth_ark_dev_close(struct rte_eth_dev *dev)
                dev->data->rx_queues[i] = 0;
        }
 
-       rte_free(dev->data->mac_addrs);
-       dev->data->mac_addrs = 0;
-
        return 0;
 }
 
@@ -744,6 +797,8 @@ eth_ark_dev_info_get(struct rte_eth_dev *dev,
                                ETH_LINK_SPEED_50G |
                                ETH_LINK_SPEED_100G);
 
+       dev_info->rx_offload_capa = DEV_RX_OFFLOAD_TIMESTAMP;
+
        return 0;
 }