X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fnfb%2Fnfb_rx.c;h=3ebb332ae46ceff71f19889d7b02954dff7dc9d8;hb=39e4a2577fd05199f53182b7c8509aeed40dc07f;hp=9147b00b0aef27d0534ed7b00c8abed8ce84a222;hpb=6435f9a0ac222ad8a1c53a2a039891c6f46cadb3;p=dpdk.git diff --git a/drivers/net/nfb/nfb_rx.c b/drivers/net/nfb/nfb_rx.c index 9147b00b0a..3ebb332ae4 100644 --- a/drivers/net/nfb/nfb_rx.c +++ b/drivers/net/nfb/nfb_rx.c @@ -4,9 +4,64 @@ * All rights reserved. */ +#include + #include "nfb_rx.h" #include "nfb.h" +uint64_t nfb_timestamp_rx_dynflag; +int nfb_timestamp_dynfield_offset = -1; + +static int +timestamp_check_handler(__rte_unused const char *key, + const char *value, __rte_unused void *opaque) +{ + if (strcmp(value, "1")) + return -1; + + return 0; +} + + +static int +nfb_check_timestamp(struct rte_devargs *devargs) +{ + struct rte_kvargs *kvlist; + int ret; + + if (devargs == NULL) + return 0; + + kvlist = rte_kvargs_parse(devargs->args, NULL); + if (kvlist == NULL) + return 0; + + if (!rte_kvargs_count(kvlist, TIMESTAMP_ARG)) { + rte_kvargs_free(kvlist); + return 0; + } + /* Timestamps are enabled when there is + * key-value pair: enable_timestamp=1 + * TODO: timestamp should be enabled with DEV_RX_OFFLOAD_TIMESTAMP + */ + if (rte_kvargs_process(kvlist, TIMESTAMP_ARG, + timestamp_check_handler, NULL) < 0) { + rte_kvargs_free(kvlist); + return 0; + } + rte_kvargs_free(kvlist); + + ret = rte_mbuf_dyn_rx_timestamp_register( + &nfb_timestamp_dynfield_offset, + &nfb_timestamp_rx_dynflag); + if (ret != 0) { + RTE_LOG(ERR, PMD, "Cannot register Rx timestamp field/flag\n"); + return -rte_errno; + } + + return 1; +} + int nfb_eth_rx_queue_start(struct rte_eth_dev *dev, uint16_t rxq_id) { @@ -70,6 +125,8 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev, return -ENOMEM; } + rxq->flags = 0; + ret = nfb_eth_rx_queue_init(internals->nfb, rx_queue_id, dev->data->port_id, @@ -81,6 +138,9 @@ nfb_eth_rx_queue_setup(struct rte_eth_dev *dev, else rte_free(rxq); + if (nfb_check_timestamp(dev->device->devargs) > 0) + rxq->flags |= NFB_TIMESTAMP_FLAG; + return ret; } @@ -116,9 +176,10 @@ nfb_eth_rx_queue_init(struct nfb_device *nfb, } void -nfb_eth_rx_queue_release(void *q) +nfb_eth_rx_queue_release(struct rte_eth_dev *dev, uint16_t qid) { - struct ndp_rx_queue *rxq = (struct ndp_rx_queue *)q; + struct ndp_rx_queue *rxq = dev->data->rx_queues[qid]; + if (rxq->queue != NULL) { ndp_close_rx_queue(rxq->queue); rte_free(rxq);