X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fark%2Fark_ethdev.c;h=a658993512638fd675793c13277dd5707bbb4d5d;hb=c1d4e9d37abdc6c07a05f7d96928e624fea9ebb5;hp=f1355581f124433ce52e0a61e02a964b42b72618;hpb=b8f5d2ae75c97698190d46f4810d01f407016aad;p=dpdk.git diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c index f1355581f1..a658993512 100644 --- a/drivers/net/ark/ark_ethdev.c +++ b/drivers/net/ark/ark_ethdev.c @@ -10,6 +10,7 @@ #include #include +#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 = ð_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,7 +646,7 @@ 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; @@ -673,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 @@ -742,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; }