#include <dlfcn.h>
#include <rte_bus_pci.h>
-#include <rte_ethdev_pci.h>
+#include <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"
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 void eth_ark_dev_close(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);
static int eth_ark_dev_link_update(struct rte_eth_dev *dev,
#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,
ret = eth_ark_dev_init(eth_dev);
if (ret)
- rte_eth_dev_pci_release(eth_dev);
+ rte_eth_dev_release_port(eth_dev);
return ret;
}
.dev_infos_get = eth_ark_dev_info_get,
.rx_queue_setup = eth_ark_dev_rx_queue_setup,
- .rx_queue_count = eth_ark_dev_rx_queue_count,
.tx_queue_setup = eth_ark_tx_queue_setup,
.link_update = eth_ark_dev_link_update,
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;
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 = ð_ark_recv_pkts_noop;
dev->tx_pkt_burst = ð_ark_xmit_pkts_noop;
- /* Let rte_eth_dev_close() release the port resources */
- dev->data->dev_flags |= RTE_ETH_DEV_CLOSE_REMOVE;
ark->bar0 = (uint8_t *)pci_dev->mem_resource[0].addr;
ark->a_bar = (uint8_t *)pci_dev->mem_resource[2].addr;
return -1;
dev->dev_ops = &ark_eth_dev_ops;
+ dev->rx_queue_count = eth_ark_dev_rx_queue_count;
dev->data->mac_addrs = rte_zmalloc("ark", RTE_ETHER_ADDR_LEN, 0);
if (!dev->data->mac_addrs) {
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);
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;
}
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)
return 0;
}
-static void
+static int
eth_ark_dev_stop(struct rte_eth_dev *dev)
{
uint16_t i;
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)
ark_pktchkr_dump_stats(ark->pc);
ark_pktchkr_stop(ark->pc);
}
+
+ return 0;
}
-static void
+static int
eth_ark_dev_close(struct rte_eth_dev *dev)
{
struct ark_adapter *ark = dev->data->dev_private;
uint16_t i;
+ if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+ return 0;
+
if (ark->user_ext.dev_close)
ark->user_ext.dev_close(dev,
ark->user_data[dev->data->port_id]);
dev->data->rx_queues[i] = 0;
}
- rte_free(dev->data->mac_addrs);
- dev->data->mac_addrs = 0;
+ return 0;
}
static int
ETH_LINK_SPEED_50G |
ETH_LINK_SPEED_100G);
+ dev_info->rx_offload_capa = DEV_RX_OFFLOAD_TIMESTAMP;
+
return 0;
}