ethdev: add return value to stats get dev op
[dpdk.git] / lib / librte_ether / rte_ethdev.c
index a1b7447..9b228ce 100644 (file)
 
 #include "rte_ether.h"
 #include "rte_ethdev.h"
+#include "ethdev_profile.h"
 
 static const char *MZ_RTE_ETH_DEV_DATA = "rte_eth_dev_data";
 struct rte_eth_dev rte_eth_devices[RTE_MAX_ETHPORTS];
 static struct rte_eth_dev_data *rte_eth_dev_data;
 static uint8_t eth_dev_last_created_port;
-static uint8_t nb_ports;
 
 /* spinlock for eth device callbacks */
 static rte_spinlock_t rte_eth_dev_cb_lock = RTE_SPINLOCK_INITIALIZER;
@@ -139,8 +139,8 @@ enum {
        STAT_QMAP_RX
 };
 
-uint8_t
-rte_eth_find_next(uint8_t port_id)
+uint16_t
+rte_eth_find_next(uint16_t port_id)
 {
        while (port_id < RTE_MAX_ETHPORTS &&
               rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED)
@@ -188,7 +188,7 @@ rte_eth_dev_allocated(const char *name)
        return NULL;
 }
 
-static uint8_t
+static uint16_t
 rte_eth_dev_find_free_port(void)
 {
        unsigned i;
@@ -201,7 +201,7 @@ rte_eth_dev_find_free_port(void)
 }
 
 static struct rte_eth_dev *
-eth_dev_get(uint8_t port_id)
+eth_dev_get(uint16_t port_id)
 {
        struct rte_eth_dev *eth_dev = &rte_eth_devices[port_id];
 
@@ -210,7 +210,6 @@ eth_dev_get(uint8_t port_id)
        TAILQ_INIT(&(eth_dev->link_intr_cbs));
 
        eth_dev_last_created_port = port_id;
-       nb_ports++;
 
        return eth_dev;
 }
@@ -218,7 +217,7 @@ eth_dev_get(uint8_t port_id)
 struct rte_eth_dev *
 rte_eth_dev_allocate(const char *name)
 {
-       uint8_t port_id;
+       uint16_t port_id;
        struct rte_eth_dev *eth_dev;
 
        port_id = rte_eth_dev_find_free_port();
@@ -253,7 +252,7 @@ rte_eth_dev_allocate(const char *name)
 struct rte_eth_dev *
 rte_eth_dev_attach_secondary(const char *name)
 {
-       uint8_t i;
+       uint16_t i;
        struct rte_eth_dev *eth_dev;
 
        if (rte_eth_dev_data == NULL)
@@ -283,35 +282,43 @@ rte_eth_dev_release_port(struct rte_eth_dev *eth_dev)
                return -EINVAL;
 
        eth_dev->state = RTE_ETH_DEV_UNUSED;
-       nb_ports--;
        return 0;
 }
 
 int
-rte_eth_dev_is_valid_port(uint8_t port_id)
+rte_eth_dev_is_valid_port(uint16_t port_id)
 {
        if (port_id >= RTE_MAX_ETHPORTS ||
-           rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED)
+           (rte_eth_devices[port_id].state != RTE_ETH_DEV_ATTACHED &&
+            rte_eth_devices[port_id].state != RTE_ETH_DEV_DEFERRED))
                return 0;
        else
                return 1;
 }
 
 int
-rte_eth_dev_socket_id(uint8_t port_id)
+rte_eth_dev_socket_id(uint16_t port_id)
 {
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -1);
        return rte_eth_devices[port_id].data->numa_node;
 }
 
-uint8_t
+uint16_t
 rte_eth_dev_count(void)
 {
-       return nb_ports;
+       uint16_t p;
+       uint16_t count;
+
+       count = 0;
+
+       RTE_ETH_FOREACH_DEV(p)
+               count++;
+
+       return count;
 }
 
 int
-rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
+rte_eth_dev_get_name_by_port(uint16_t port_id, char *name)
 {
        const char *tmp;
 
@@ -330,7 +337,7 @@ rte_eth_dev_get_name_by_port(uint8_t port_id, char *name)
 }
 
 int
-rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
+rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id)
 {
        int ret;
        int i;
@@ -340,9 +347,6 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
                return -EINVAL;
        }
 
-       if (!nb_ports)
-               return -ENODEV;
-
        RTE_ETH_FOREACH_DEV(i) {
                if (!rte_eth_devices[i].device)
                        continue;
@@ -358,22 +362,12 @@ rte_eth_dev_get_port_by_name(const char *name, uint8_t *port_id)
 }
 
 static int
-rte_eth_dev_is_detachable(uint8_t port_id)
+rte_eth_dev_is_detachable(uint16_t port_id)
 {
        uint32_t dev_flags;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
 
-       switch (rte_eth_devices[port_id].data->kdrv) {
-       case RTE_KDRV_IGB_UIO:
-       case RTE_KDRV_UIO_GENERIC:
-       case RTE_KDRV_NIC_UIO:
-       case RTE_KDRV_NONE:
-       case RTE_KDRV_VFIO:
-               break;
-       default:
-               return -ENOTSUP;
-       }
        dev_flags = rte_eth_devices[port_id].data->dev_flags;
        if ((dev_flags & RTE_ETH_DEV_DETACHABLE) &&
                (!(dev_flags & RTE_ETH_DEV_BONDED_SLAVE)))
@@ -384,7 +378,7 @@ rte_eth_dev_is_detachable(uint8_t port_id)
 
 /* attach the new device, then store port_id of the device */
 int
-rte_eth_dev_attach(const char *devargs, uint8_t *port_id)
+rte_eth_dev_attach(const char *devargs, uint16_t *port_id)
 {
        int ret = -1;
        int current = rte_eth_dev_count();
@@ -430,7 +424,7 @@ err:
 
 /* detach the device, then store the name of the device */
 int
-rte_eth_dev_detach(uint8_t port_id, char *name)
+rte_eth_dev_detach(uint16_t port_id, char *name)
 {
        int ret = -1;
 
@@ -443,13 +437,14 @@ rte_eth_dev_detach(uint8_t port_id, char *name)
        if (rte_eth_dev_is_detachable(port_id))
                goto err;
 
-       snprintf(name, sizeof(rte_eth_devices[port_id].device->name),
-                "%s", rte_eth_devices[port_id].device->name);
+       snprintf(name, RTE_DEV_NAME_MAX_LEN, "%s",
+                rte_eth_devices[port_id].device->name);
 
        ret = rte_eal_dev_detach(rte_eth_devices[port_id].device);
        if (ret < 0)
                goto err;
 
+       rte_eth_devices[port_id].state = RTE_ETH_DEV_UNUSED;
        return 0;
 
 err:
@@ -507,7 +502,7 @@ rte_eth_dev_rx_queue_config(struct rte_eth_dev *dev, uint16_t nb_queues)
 }
 
 int
-rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_start(uint16_t port_id, uint16_t rx_queue_id)
 {
        struct rte_eth_dev *dev;
 
@@ -533,7 +528,7 @@ rte_eth_dev_rx_queue_start(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
+rte_eth_dev_rx_queue_stop(uint16_t port_id, uint16_t rx_queue_id)
 {
        struct rte_eth_dev *dev;
 
@@ -559,7 +554,7 @@ rte_eth_dev_rx_queue_stop(uint8_t port_id, uint16_t rx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_start(uint16_t port_id, uint16_t tx_queue_id)
 {
        struct rte_eth_dev *dev;
 
@@ -585,7 +580,7 @@ rte_eth_dev_tx_queue_start(uint8_t port_id, uint16_t tx_queue_id)
 }
 
 int
-rte_eth_dev_tx_queue_stop(uint8_t port_id, uint16_t tx_queue_id)
+rte_eth_dev_tx_queue_stop(uint16_t port_id, uint16_t tx_queue_id)
 {
        struct rte_eth_dev *dev;
 
@@ -693,12 +688,96 @@ rte_eth_speed_bitflag(uint32_t speed, int duplex)
        }
 }
 
+/**
+ * A conversion function from rxmode bitfield API.
+ */
+static void
+rte_eth_convert_rx_offload_bitfield(const struct rte_eth_rxmode *rxmode,
+                                   uint64_t *rx_offloads)
+{
+       uint64_t offloads = 0;
+
+       if (rxmode->header_split == 1)
+               offloads |= DEV_RX_OFFLOAD_HEADER_SPLIT;
+       if (rxmode->hw_ip_checksum == 1)
+               offloads |= DEV_RX_OFFLOAD_CHECKSUM;
+       if (rxmode->hw_vlan_filter == 1)
+               offloads |= DEV_RX_OFFLOAD_VLAN_FILTER;
+       if (rxmode->hw_vlan_strip == 1)
+               offloads |= DEV_RX_OFFLOAD_VLAN_STRIP;
+       if (rxmode->hw_vlan_extend == 1)
+               offloads |= DEV_RX_OFFLOAD_VLAN_EXTEND;
+       if (rxmode->jumbo_frame == 1)
+               offloads |= DEV_RX_OFFLOAD_JUMBO_FRAME;
+       if (rxmode->hw_strip_crc == 1)
+               offloads |= DEV_RX_OFFLOAD_CRC_STRIP;
+       if (rxmode->enable_scatter == 1)
+               offloads |= DEV_RX_OFFLOAD_SCATTER;
+       if (rxmode->enable_lro == 1)
+               offloads |= DEV_RX_OFFLOAD_TCP_LRO;
+       if (rxmode->hw_timestamp == 1)
+               offloads |= DEV_RX_OFFLOAD_TIMESTAMP;
+
+       *rx_offloads = offloads;
+}
+
+/**
+ * A conversion function from rxmode offloads API.
+ */
+static void
+rte_eth_convert_rx_offloads(const uint64_t rx_offloads,
+                           struct rte_eth_rxmode *rxmode)
+{
+
+       if (rx_offloads & DEV_RX_OFFLOAD_HEADER_SPLIT)
+               rxmode->header_split = 1;
+       else
+               rxmode->header_split = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_CHECKSUM)
+               rxmode->hw_ip_checksum = 1;
+       else
+               rxmode->hw_ip_checksum = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_VLAN_FILTER)
+               rxmode->hw_vlan_filter = 1;
+       else
+               rxmode->hw_vlan_filter = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_VLAN_STRIP)
+               rxmode->hw_vlan_strip = 1;
+       else
+               rxmode->hw_vlan_strip = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_VLAN_EXTEND)
+               rxmode->hw_vlan_extend = 1;
+       else
+               rxmode->hw_vlan_extend = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
+               rxmode->jumbo_frame = 1;
+       else
+               rxmode->jumbo_frame = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_CRC_STRIP)
+               rxmode->hw_strip_crc = 1;
+       else
+               rxmode->hw_strip_crc = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_SCATTER)
+               rxmode->enable_scatter = 1;
+       else
+               rxmode->enable_scatter = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_TCP_LRO)
+               rxmode->enable_lro = 1;
+       else
+               rxmode->enable_lro = 0;
+       if (rx_offloads & DEV_RX_OFFLOAD_TIMESTAMP)
+               rxmode->hw_timestamp = 1;
+       else
+               rxmode->hw_timestamp = 0;
+}
+
 int
-rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
+rte_eth_dev_configure(uint16_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
                      const struct rte_eth_conf *dev_conf)
 {
        struct rte_eth_dev *dev;
        struct rte_eth_dev_info dev_info;
+       struct rte_eth_conf local_conf = *dev_conf;
        int diag;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
@@ -728,8 +807,20 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
                return -EBUSY;
        }
 
+       /*
+        * Convert between the offloads API to enable PMDs to support
+        * only one of them.
+        */
+       if ((dev_conf->rxmode.ignore_offload_bitfield == 0)) {
+               rte_eth_convert_rx_offload_bitfield(
+                               &dev_conf->rxmode, &local_conf.rxmode.offloads);
+       } else {
+               rte_eth_convert_rx_offloads(dev_conf->rxmode.offloads,
+                                           &local_conf.rxmode);
+       }
+
        /* Copy the dev_conf parameter into the dev structure */
-       memcpy(&dev->data->dev_conf, dev_conf, sizeof(dev->data->dev_conf));
+       memcpy(&dev->data->dev_conf, &local_conf, sizeof(dev->data->dev_conf));
 
        /*
         * Check that the numbers of RX and TX queues are not greater
@@ -773,7 +864,7 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
         * If jumbo frames are enabled, check that the maximum RX packet
         * length is supported by the configured device.
         */
-       if (dev_conf->rxmode.jumbo_frame == 1) {
+       if (local_conf.rxmode.offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
                if (dev_conf->rxmode.max_rx_pkt_len >
                    dev_info.max_rx_pktlen) {
                        RTE_PMD_DEBUG_TRACE("ethdev port_id=%d max_rx_pkt_len %u"
@@ -825,6 +916,16 @@ rte_eth_dev_configure(uint8_t port_id, uint16_t nb_rx_q, uint16_t nb_tx_q,
                return diag;
        }
 
+       /* Initialize Rx profiling if enabled at compilation time. */
+       diag = __rte_eth_profile_rx_init(port_id, dev);
+       if (diag != 0) {
+               RTE_PMD_DEBUG_TRACE("port%d __rte_eth_profile_rx_init = %d\n",
+                               port_id, diag);
+               rte_eth_dev_rx_queue_config(dev, 0);
+               rte_eth_dev_tx_queue_config(dev, 0);
+               return diag;
+       }
+
        return 0;
 }
 
@@ -845,7 +946,7 @@ _rte_eth_dev_reset(struct rte_eth_dev *dev)
 }
 
 static void
-rte_eth_dev_config_restore(uint8_t port_id)
+rte_eth_dev_config_restore(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
        struct rte_eth_dev_info dev_info;
@@ -900,7 +1001,7 @@ rte_eth_dev_config_restore(uint8_t port_id)
 }
 
 int
-rte_eth_dev_start(uint8_t port_id)
+rte_eth_dev_start(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
        int diag;
@@ -912,7 +1013,7 @@ rte_eth_dev_start(uint8_t port_id)
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_start, -ENOTSUP);
 
        if (dev->data->dev_started != 0) {
-               RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+               RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
                        " already started\n",
                        port_id);
                return 0;
@@ -934,7 +1035,7 @@ rte_eth_dev_start(uint8_t port_id)
 }
 
 void
-rte_eth_dev_stop(uint8_t port_id)
+rte_eth_dev_stop(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -944,7 +1045,7 @@ rte_eth_dev_stop(uint8_t port_id)
        RTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_stop);
 
        if (dev->data->dev_started == 0) {
-               RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu8
+               RTE_PMD_DEBUG_TRACE("Device with port_id=%" PRIu16
                        " already stopped\n",
                        port_id);
                return;
@@ -955,7 +1056,7 @@ rte_eth_dev_stop(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_up(uint8_t port_id)
+rte_eth_dev_set_link_up(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -968,7 +1069,7 @@ rte_eth_dev_set_link_up(uint8_t port_id)
 }
 
 int
-rte_eth_dev_set_link_down(uint8_t port_id)
+rte_eth_dev_set_link_down(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -981,7 +1082,7 @@ rte_eth_dev_set_link_down(uint8_t port_id)
 }
 
 void
-rte_eth_dev_close(uint8_t port_id)
+rte_eth_dev_close(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1001,7 +1102,24 @@ rte_eth_dev_close(uint8_t port_id)
 }
 
 int
-rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_dev_reset(uint16_t port_id)
+{
+       struct rte_eth_dev *dev;
+       int ret;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
+       dev = &rte_eth_devices[port_id];
+
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->dev_reset, -ENOTSUP);
+
+       rte_eth_dev_stop(port_id);
+       ret = dev->dev_ops->dev_reset(dev);
+
+       return ret;
+}
+
+int
+rte_eth_rx_queue_setup(uint16_t port_id, uint16_t rx_queue_id,
                       uint16_t nb_rx_desc, unsigned int socket_id,
                       const struct rte_eth_rxconf *rx_conf,
                       struct rte_mempool *mp)
@@ -1010,6 +1128,7 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
        uint32_t mbp_buf_size;
        struct rte_eth_dev *dev;
        struct rte_eth_dev_info dev_info;
+       struct rte_eth_rxconf local_conf;
        void **rxq;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
@@ -1080,8 +1199,18 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
        if (rx_conf == NULL)
                rx_conf = &dev_info.default_rxconf;
 
+       local_conf = *rx_conf;
+       if (dev->data->dev_conf.rxmode.ignore_offload_bitfield == 0) {
+               /**
+                * Reflect port offloads to queue offloads in order for
+                * offloads to not be discarded.
+                */
+               rte_eth_convert_rx_offload_bitfield(&dev->data->dev_conf.rxmode,
+                                                   &local_conf.offloads);
+       }
+
        ret = (*dev->dev_ops->rx_queue_setup)(dev, rx_queue_id, nb_rx_desc,
-                                             socket_id, rx_conf, mp);
+                                             socket_id, &local_conf, mp);
        if (!ret) {
                if (!dev->data->min_rx_buf_size ||
                    dev->data->min_rx_buf_size > mbp_buf_size)
@@ -1091,13 +1220,63 @@ rte_eth_rx_queue_setup(uint8_t port_id, uint16_t rx_queue_id,
        return ret;
 }
 
+/**
+ * A conversion function from txq_flags API.
+ */
+static void
+rte_eth_convert_txq_flags(const uint32_t txq_flags, uint64_t *tx_offloads)
+{
+       uint64_t offloads = 0;
+
+       if (!(txq_flags & ETH_TXQ_FLAGS_NOMULTSEGS))
+               offloads |= DEV_TX_OFFLOAD_MULTI_SEGS;
+       if (!(txq_flags & ETH_TXQ_FLAGS_NOVLANOFFL))
+               offloads |= DEV_TX_OFFLOAD_VLAN_INSERT;
+       if (!(txq_flags & ETH_TXQ_FLAGS_NOXSUMSCTP))
+               offloads |= DEV_TX_OFFLOAD_SCTP_CKSUM;
+       if (!(txq_flags & ETH_TXQ_FLAGS_NOXSUMUDP))
+               offloads |= DEV_TX_OFFLOAD_UDP_CKSUM;
+       if (!(txq_flags & ETH_TXQ_FLAGS_NOXSUMTCP))
+               offloads |= DEV_TX_OFFLOAD_TCP_CKSUM;
+       if ((txq_flags & ETH_TXQ_FLAGS_NOREFCOUNT) &&
+           (txq_flags & ETH_TXQ_FLAGS_NOMULTMEMP))
+               offloads |= DEV_TX_OFFLOAD_MBUF_FAST_FREE;
+
+       *tx_offloads = offloads;
+}
+
+/**
+ * A conversion function from offloads API.
+ */
+static void
+rte_eth_convert_txq_offloads(const uint64_t tx_offloads, uint32_t *txq_flags)
+{
+       uint32_t flags = 0;
+
+       if (!(tx_offloads & DEV_TX_OFFLOAD_MULTI_SEGS))
+               flags |= ETH_TXQ_FLAGS_NOMULTSEGS;
+       if (!(tx_offloads & DEV_TX_OFFLOAD_VLAN_INSERT))
+               flags |= ETH_TXQ_FLAGS_NOVLANOFFL;
+       if (!(tx_offloads & DEV_TX_OFFLOAD_SCTP_CKSUM))
+               flags |= ETH_TXQ_FLAGS_NOXSUMSCTP;
+       if (!(tx_offloads & DEV_TX_OFFLOAD_UDP_CKSUM))
+               flags |= ETH_TXQ_FLAGS_NOXSUMUDP;
+       if (!(tx_offloads & DEV_TX_OFFLOAD_TCP_CKSUM))
+               flags |= ETH_TXQ_FLAGS_NOXSUMTCP;
+       if (tx_offloads & DEV_TX_OFFLOAD_MBUF_FAST_FREE)
+               flags |= (ETH_TXQ_FLAGS_NOREFCOUNT | ETH_TXQ_FLAGS_NOMULTMEMP);
+
+       *txq_flags = flags;
+}
+
 int
-rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_tx_queue_setup(uint16_t port_id, uint16_t tx_queue_id,
                       uint16_t nb_tx_desc, unsigned int socket_id,
                       const struct rte_eth_txconf *tx_conf)
 {
        struct rte_eth_dev *dev;
        struct rte_eth_dev_info dev_info;
+       struct rte_eth_txconf local_conf;
        void **txq;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -EINVAL);
@@ -1142,8 +1321,23 @@ rte_eth_tx_queue_setup(uint8_t port_id, uint16_t tx_queue_id,
        if (tx_conf == NULL)
                tx_conf = &dev_info.default_txconf;
 
+       /*
+        * Convert between the offloads API to enable PMDs to support
+        * only one of them.
+        */
+       local_conf = *tx_conf;
+       if (tx_conf->txq_flags & ETH_TXQ_FLAGS_IGNORE) {
+               rte_eth_convert_txq_offloads(tx_conf->offloads,
+                                            &local_conf.txq_flags);
+               /* Keep the ignore flag. */
+               local_conf.txq_flags |= ETH_TXQ_FLAGS_IGNORE;
+       } else {
+               rte_eth_convert_txq_flags(tx_conf->txq_flags,
+                                         &local_conf.offloads);
+       }
+
        return (*dev->dev_ops->tx_queue_setup)(dev, tx_queue_id, nb_tx_desc,
-                                              socket_id, tx_conf);
+                                              socket_id, &local_conf);
 }
 
 void
@@ -1196,7 +1390,7 @@ rte_eth_tx_buffer_init(struct rte_eth_dev_tx_buffer *buffer, uint16_t size)
 }
 
 int
-rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
+rte_eth_tx_done_cleanup(uint16_t port_id, uint16_t queue_id, uint32_t free_cnt)
 {
        struct rte_eth_dev *dev = &rte_eth_devices[port_id];
 
@@ -1210,7 +1404,7 @@ rte_eth_tx_done_cleanup(uint8_t port_id, uint16_t queue_id, uint32_t free_cnt)
 }
 
 void
-rte_eth_promiscuous_enable(uint8_t port_id)
+rte_eth_promiscuous_enable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1223,7 +1417,7 @@ rte_eth_promiscuous_enable(uint8_t port_id)
 }
 
 void
-rte_eth_promiscuous_disable(uint8_t port_id)
+rte_eth_promiscuous_disable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1236,7 +1430,7 @@ rte_eth_promiscuous_disable(uint8_t port_id)
 }
 
 int
-rte_eth_promiscuous_get(uint8_t port_id)
+rte_eth_promiscuous_get(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1247,7 +1441,7 @@ rte_eth_promiscuous_get(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_enable(uint8_t port_id)
+rte_eth_allmulticast_enable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1260,7 +1454,7 @@ rte_eth_allmulticast_enable(uint8_t port_id)
 }
 
 void
-rte_eth_allmulticast_disable(uint8_t port_id)
+rte_eth_allmulticast_disable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1273,7 +1467,7 @@ rte_eth_allmulticast_disable(uint8_t port_id)
 }
 
 int
-rte_eth_allmulticast_get(uint8_t port_id)
+rte_eth_allmulticast_get(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1298,7 +1492,7 @@ rte_eth_dev_atomic_read_link_status(struct rte_eth_dev *dev,
 }
 
 void
-rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get(uint16_t port_id, struct rte_eth_link *eth_link)
 {
        struct rte_eth_dev *dev;
 
@@ -1315,7 +1509,7 @@ rte_eth_link_get(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 void
-rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
+rte_eth_link_get_nowait(uint16_t port_id, struct rte_eth_link *eth_link)
 {
        struct rte_eth_dev *dev;
 
@@ -1332,7 +1526,7 @@ rte_eth_link_get_nowait(uint8_t port_id, struct rte_eth_link *eth_link)
 }
 
 int
-rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
+rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats)
 {
        struct rte_eth_dev *dev;
 
@@ -1343,25 +1537,26 @@ rte_eth_stats_get(uint8_t port_id, struct rte_eth_stats *stats)
 
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_get, -ENOTSUP);
        stats->rx_nombuf = dev->data->rx_mbuf_alloc_failed;
-       (*dev->dev_ops->stats_get)(dev, stats);
-       return 0;
+       return (*dev->dev_ops->stats_get)(dev, stats);
 }
 
-void
-rte_eth_stats_reset(uint8_t port_id)
+int
+rte_eth_stats_reset(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
-       RTE_ETH_VALID_PORTID_OR_RET(port_id);
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
 
-       RTE_FUNC_PTR_OR_RET(*dev->dev_ops->stats_reset);
+       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->stats_reset, -ENOTSUP);
        (*dev->dev_ops->stats_reset)(dev);
        dev->data->rx_mbuf_alloc_failed = 0;
+
+       return 0;
 }
 
 static int
-get_xstats_count(uint8_t port_id)
+get_xstats_count(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
        int count;
@@ -1390,7 +1585,7 @@ get_xstats_count(uint8_t port_id)
 }
 
 int
-rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
+rte_eth_xstats_get_id_by_name(uint16_t port_id, const char *xstat_name,
                uint64_t *id)
 {
        int cnt_xstats, idx_xstat;
@@ -1434,7 +1629,7 @@ rte_eth_xstats_get_id_by_name(uint8_t port_id, const char *xstat_name,
 }
 
 int
-rte_eth_xstats_get_names_by_id(uint8_t port_id,
+rte_eth_xstats_get_names_by_id(uint16_t port_id,
        struct rte_eth_xstat_name *xstats_names, unsigned int size,
        uint64_t *ids)
 {
@@ -1551,7 +1746,7 @@ rte_eth_xstats_get_names_by_id(uint8_t port_id,
 }
 
 int
-rte_eth_xstats_get_names(uint8_t port_id,
+rte_eth_xstats_get_names(uint16_t port_id,
        struct rte_eth_xstat_name *xstats_names,
        unsigned int size)
 {
@@ -1617,8 +1812,8 @@ rte_eth_xstats_get_names(uint8_t port_id,
 
 /* retrieve ethdev extended statistics */
 int
-rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
-       unsigned int n)
+rte_eth_xstats_get_by_id(uint16_t port_id, const uint64_t *ids,
+                        uint64_t *values, unsigned int n)
 {
        /* If need all xstats */
        if (!ids) {
@@ -1743,7 +1938,7 @@ rte_eth_xstats_get_by_id(uint8_t port_id, const uint64_t *ids, uint64_t *values,
 }
 
 int
-rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
+rte_eth_xstats_get(uint16_t port_id, struct rte_eth_xstat *xstats,
        unsigned int n)
 {
        struct rte_eth_stats eth_stats;
@@ -1825,7 +2020,7 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
 
 /* reset ethdev extended statistics */
 void
-rte_eth_xstats_reset(uint8_t port_id)
+rte_eth_xstats_reset(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -1843,7 +2038,7 @@ rte_eth_xstats_reset(uint8_t port_id)
 }
 
 static int
-set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
+set_queue_stats_mapping(uint16_t port_id, uint16_t queue_id, uint8_t stat_idx,
                uint8_t is_rx)
 {
        struct rte_eth_dev *dev;
@@ -1859,7 +2054,7 @@ set_queue_stats_mapping(uint8_t port_id, uint16_t queue_id, uint8_t stat_idx,
 
 
 int
-rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
+rte_eth_dev_set_tx_queue_stats_mapping(uint16_t port_id, uint16_t tx_queue_id,
                uint8_t stat_idx)
 {
        return set_queue_stats_mapping(port_id, tx_queue_id, stat_idx,
@@ -1868,7 +2063,7 @@ rte_eth_dev_set_tx_queue_stats_mapping(uint8_t port_id, uint16_t tx_queue_id,
 
 
 int
-rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
+rte_eth_dev_set_rx_queue_stats_mapping(uint16_t port_id, uint16_t rx_queue_id,
                uint8_t stat_idx)
 {
        return set_queue_stats_mapping(port_id, rx_queue_id, stat_idx,
@@ -1876,7 +2071,7 @@ rte_eth_dev_set_rx_queue_stats_mapping(uint8_t port_id, uint16_t rx_queue_id,
 }
 
 int
-rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
+rte_eth_dev_fw_version_get(uint16_t port_id, char *fw_version, size_t fw_size)
 {
        struct rte_eth_dev *dev;
 
@@ -1888,7 +2083,7 @@ rte_eth_dev_fw_version_get(uint8_t port_id, char *fw_version, size_t fw_size)
 }
 
 void
-rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
+rte_eth_dev_info_get(uint16_t port_id, struct rte_eth_dev_info *dev_info)
 {
        struct rte_eth_dev *dev;
        const struct rte_eth_desc_lim lim = {
@@ -1912,7 +2107,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)
 }
 
 int
-rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
+rte_eth_dev_get_supported_ptypes(uint16_t port_id, uint32_t ptype_mask,
                                 uint32_t *ptypes, int num)
 {
        int i, j;
@@ -1938,7 +2133,7 @@ rte_eth_dev_get_supported_ptypes(uint8_t port_id, uint32_t ptype_mask,
 }
 
 void
-rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
+rte_eth_macaddr_get(uint16_t port_id, struct ether_addr *mac_addr)
 {
        struct rte_eth_dev *dev;
 
@@ -1949,7 +2144,7 @@ rte_eth_macaddr_get(uint8_t port_id, struct ether_addr *mac_addr)
 
 
 int
-rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
+rte_eth_dev_get_mtu(uint16_t port_id, uint16_t *mtu)
 {
        struct rte_eth_dev *dev;
 
@@ -1961,7 +2156,7 @@ rte_eth_dev_get_mtu(uint8_t port_id, uint16_t *mtu)
 }
 
 int
-rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
+rte_eth_dev_set_mtu(uint16_t port_id, uint16_t mtu)
 {
        int ret;
        struct rte_eth_dev *dev;
@@ -1978,14 +2173,15 @@ rte_eth_dev_set_mtu(uint8_t port_id, uint16_t mtu)
 }
 
 int
-rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
+rte_eth_dev_vlan_filter(uint16_t port_id, uint16_t vlan_id, int on)
 {
        struct rte_eth_dev *dev;
        int ret;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
-       if (!(dev->data->dev_conf.rxmode.hw_vlan_filter)) {
+       if (!(dev->data->dev_conf.rxmode.offloads &
+             DEV_RX_OFFLOAD_VLAN_FILTER)) {
                RTE_PMD_DEBUG_TRACE("port %d: vlan-filtering disabled\n", port_id);
                return -ENOSYS;
        }
@@ -2017,7 +2213,8 @@ rte_eth_dev_vlan_filter(uint8_t port_id, uint16_t vlan_id, int on)
 }
 
 int
-rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int on)
+rte_eth_dev_set_vlan_strip_on_queue(uint16_t port_id, uint16_t rx_queue_id,
+                                   int on)
 {
        struct rte_eth_dev *dev;
 
@@ -2035,7 +2232,7 @@ rte_eth_dev_set_vlan_strip_on_queue(uint8_t port_id, uint16_t rx_queue_id, int o
 }
 
 int
-rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
+rte_eth_dev_set_vlan_ether_type(uint16_t port_id,
                                enum rte_vlan_type vlan_type,
                                uint16_t tpid)
 {
@@ -2049,7 +2246,7 @@ rte_eth_dev_set_vlan_ether_type(uint8_t port_id,
 }
 
 int
-rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
+rte_eth_dev_set_vlan_offload(uint16_t port_id, int offload_mask)
 {
        struct rte_eth_dev *dev;
        int ret = 0;
@@ -2061,23 +2258,41 @@ rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
 
        /*check which option changed by application*/
        cur = !!(offload_mask & ETH_VLAN_STRIP_OFFLOAD);
-       org = !!(dev->data->dev_conf.rxmode.hw_vlan_strip);
+       org = !!(dev->data->dev_conf.rxmode.offloads &
+                DEV_RX_OFFLOAD_VLAN_STRIP);
        if (cur != org) {
-               dev->data->dev_conf.rxmode.hw_vlan_strip = (uint8_t)cur;
+               if (cur)
+                       dev->data->dev_conf.rxmode.offloads |=
+                               DEV_RX_OFFLOAD_VLAN_STRIP;
+               else
+                       dev->data->dev_conf.rxmode.offloads &=
+                               ~DEV_RX_OFFLOAD_VLAN_STRIP;
                mask |= ETH_VLAN_STRIP_MASK;
        }
 
        cur = !!(offload_mask & ETH_VLAN_FILTER_OFFLOAD);
-       org = !!(dev->data->dev_conf.rxmode.hw_vlan_filter);
+       org = !!(dev->data->dev_conf.rxmode.offloads &
+                DEV_RX_OFFLOAD_VLAN_FILTER);
        if (cur != org) {
-               dev->data->dev_conf.rxmode.hw_vlan_filter = (uint8_t)cur;
+               if (cur)
+                       dev->data->dev_conf.rxmode.offloads |=
+                               DEV_RX_OFFLOAD_VLAN_FILTER;
+               else
+                       dev->data->dev_conf.rxmode.offloads &=
+                               ~DEV_RX_OFFLOAD_VLAN_FILTER;
                mask |= ETH_VLAN_FILTER_MASK;
        }
 
        cur = !!(offload_mask & ETH_VLAN_EXTEND_OFFLOAD);
-       org = !!(dev->data->dev_conf.rxmode.hw_vlan_extend);
+       org = !!(dev->data->dev_conf.rxmode.offloads &
+                DEV_RX_OFFLOAD_VLAN_EXTEND);
        if (cur != org) {
-               dev->data->dev_conf.rxmode.hw_vlan_extend = (uint8_t)cur;
+               if (cur)
+                       dev->data->dev_conf.rxmode.offloads |=
+                               DEV_RX_OFFLOAD_VLAN_EXTEND;
+               else
+                       dev->data->dev_conf.rxmode.offloads &=
+                               ~DEV_RX_OFFLOAD_VLAN_EXTEND;
                mask |= ETH_VLAN_EXTEND_MASK;
        }
 
@@ -2086,13 +2301,20 @@ rte_eth_dev_set_vlan_offload(uint8_t port_id, int offload_mask)
                return ret;
 
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->vlan_offload_set, -ENOTSUP);
+
+       /*
+        * Convert to the offload bitfield API just in case the underlying PMD
+        * still supporting it.
+        */
+       rte_eth_convert_rx_offloads(dev->data->dev_conf.rxmode.offloads,
+                                   &dev->data->dev_conf.rxmode);
        (*dev->dev_ops->vlan_offload_set)(dev, mask);
 
        return ret;
 }
 
 int
-rte_eth_dev_get_vlan_offload(uint8_t port_id)
+rte_eth_dev_get_vlan_offload(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
        int ret = 0;
@@ -2100,20 +2322,23 @@ rte_eth_dev_get_vlan_offload(uint8_t port_id)
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
        dev = &rte_eth_devices[port_id];
 
-       if (dev->data->dev_conf.rxmode.hw_vlan_strip)
+       if (dev->data->dev_conf.rxmode.offloads &
+           DEV_RX_OFFLOAD_VLAN_STRIP)
                ret |= ETH_VLAN_STRIP_OFFLOAD;
 
-       if (dev->data->dev_conf.rxmode.hw_vlan_filter)
+       if (dev->data->dev_conf.rxmode.offloads &
+           DEV_RX_OFFLOAD_VLAN_FILTER)
                ret |= ETH_VLAN_FILTER_OFFLOAD;
 
-       if (dev->data->dev_conf.rxmode.hw_vlan_extend)
+       if (dev->data->dev_conf.rxmode.offloads &
+           DEV_RX_OFFLOAD_VLAN_EXTEND)
                ret |= ETH_VLAN_EXTEND_OFFLOAD;
 
        return ret;
 }
 
 int
-rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
+rte_eth_dev_set_vlan_pvid(uint16_t port_id, uint16_t pvid, int on)
 {
        struct rte_eth_dev *dev;
 
@@ -2126,7 +2351,7 @@ rte_eth_dev_set_vlan_pvid(uint8_t port_id, uint16_t pvid, int on)
 }
 
 int
-rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_get(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
        struct rte_eth_dev *dev;
 
@@ -2138,7 +2363,7 @@ rte_eth_dev_flow_ctrl_get(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
+rte_eth_dev_flow_ctrl_set(uint16_t port_id, struct rte_eth_fc_conf *fc_conf)
 {
        struct rte_eth_dev *dev;
 
@@ -2154,7 +2379,8 @@ rte_eth_dev_flow_ctrl_set(uint8_t port_id, struct rte_eth_fc_conf *fc_conf)
 }
 
 int
-rte_eth_dev_priority_flow_ctrl_set(uint8_t port_id, struct rte_eth_pfc_conf *pfc_conf)
+rte_eth_dev_priority_flow_ctrl_set(uint16_t port_id,
+                                  struct rte_eth_pfc_conf *pfc_conf)
 {
        struct rte_eth_dev *dev;
 
@@ -2220,7 +2446,7 @@ rte_eth_check_reta_entry(struct rte_eth_rss_reta_entry64 *reta_conf,
 }
 
 int
-rte_eth_dev_rss_reta_update(uint8_t port_id,
+rte_eth_dev_rss_reta_update(uint16_t port_id,
                            struct rte_eth_rss_reta_entry64 *reta_conf,
                            uint16_t reta_size)
 {
@@ -2246,7 +2472,7 @@ rte_eth_dev_rss_reta_update(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_reta_query(uint8_t port_id,
+rte_eth_dev_rss_reta_query(uint16_t port_id,
                           struct rte_eth_rss_reta_entry64 *reta_conf,
                           uint16_t reta_size)
 {
@@ -2266,26 +2492,19 @@ rte_eth_dev_rss_reta_query(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rss_hash_update(uint8_t port_id, struct rte_eth_rss_conf *rss_conf)
+rte_eth_dev_rss_hash_update(uint16_t port_id,
+                           struct rte_eth_rss_conf *rss_conf)
 {
        struct rte_eth_dev *dev;
-       uint16_t rss_hash_protos;
 
        RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-       rss_hash_protos = rss_conf->rss_hf;
-       if ((rss_hash_protos != 0) &&
-           ((rss_hash_protos & ETH_RSS_PROTO_MASK) == 0)) {
-               RTE_PMD_DEBUG_TRACE("Invalid rss_hash_protos=0x%x\n",
-                               rss_hash_protos);
-               return -EINVAL;
-       }
        dev = &rte_eth_devices[port_id];
        RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->rss_hash_update, -ENOTSUP);
        return (*dev->dev_ops->rss_hash_update)(dev, rss_conf);
 }
 
 int
-rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
+rte_eth_dev_rss_hash_conf_get(uint16_t port_id,
                              struct rte_eth_rss_conf *rss_conf)
 {
        struct rte_eth_dev *dev;
@@ -2297,7 +2516,7 @@ rte_eth_dev_rss_hash_conf_get(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_add(uint16_t port_id,
                                struct rte_eth_udp_tunnel *udp_tunnel)
 {
        struct rte_eth_dev *dev;
@@ -2319,7 +2538,7 @@ rte_eth_dev_udp_tunnel_port_add(uint8_t port_id,
 }
 
 int
-rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
+rte_eth_dev_udp_tunnel_port_delete(uint16_t port_id,
                                   struct rte_eth_udp_tunnel *udp_tunnel)
 {
        struct rte_eth_dev *dev;
@@ -2342,7 +2561,7 @@ rte_eth_dev_udp_tunnel_port_delete(uint8_t port_id,
 }
 
 int
-rte_eth_led_on(uint8_t port_id)
+rte_eth_led_on(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -2353,7 +2572,7 @@ rte_eth_led_on(uint8_t port_id)
 }
 
 int
-rte_eth_led_off(uint8_t port_id)
+rte_eth_led_off(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -2368,7 +2587,7 @@ rte_eth_led_off(uint8_t port_id)
  * an empty spot.
  */
 static int
-get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
        struct rte_eth_dev_info dev_info;
        struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2387,7 +2606,7 @@ get_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 static const struct ether_addr null_mac_addr;
 
 int
-rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_mac_addr_add(uint16_t port_id, struct ether_addr *addr,
                        uint32_t pool)
 {
        struct rte_eth_dev *dev;
@@ -2440,7 +2659,7 @@ rte_eth_dev_mac_addr_add(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_mac_addr_remove(uint16_t port_id, struct ether_addr *addr)
 {
        struct rte_eth_dev *dev;
        int index;
@@ -2469,7 +2688,7 @@ rte_eth_dev_mac_addr_remove(uint8_t port_id, struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
+rte_eth_dev_default_mac_addr_set(uint16_t port_id, struct ether_addr *addr)
 {
        struct rte_eth_dev *dev;
 
@@ -2495,7 +2714,7 @@ rte_eth_dev_default_mac_addr_set(uint8_t port_id, struct ether_addr *addr)
  * an empty spot.
  */
 static int
-get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
+get_hash_mac_addr_index(uint16_t port_id, const struct ether_addr *addr)
 {
        struct rte_eth_dev_info dev_info;
        struct rte_eth_dev *dev = &rte_eth_devices[port_id];
@@ -2514,7 +2733,7 @@ get_hash_mac_addr_index(uint8_t port_id, const struct ether_addr *addr)
 }
 
 int
-rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
+rte_eth_dev_uc_hash_table_set(uint16_t port_id, struct ether_addr *addr,
                                uint8_t on)
 {
        int index;
@@ -2566,7 +2785,7 @@ rte_eth_dev_uc_hash_table_set(uint8_t port_id, struct ether_addr *addr,
 }
 
 int
-rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
+rte_eth_dev_uc_all_hash_table_set(uint16_t port_id, uint8_t on)
 {
        struct rte_eth_dev *dev;
 
@@ -2578,7 +2797,7 @@ rte_eth_dev_uc_all_hash_table_set(uint8_t port_id, uint8_t on)
        return (*dev->dev_ops->uc_all_hash_table_set)(dev, on);
 }
 
-int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
+int rte_eth_set_queue_rate_limit(uint16_t port_id, uint16_t queue_idx,
                                        uint16_t tx_rate)
 {
        struct rte_eth_dev *dev;
@@ -2609,7 +2828,7 @@ int rte_eth_set_queue_rate_limit(uint8_t port_id, uint16_t queue_idx,
 }
 
 int
-rte_eth_mirror_rule_set(uint8_t port_id,
+rte_eth_mirror_rule_set(uint16_t port_id,
                        struct rte_eth_mirror_conf *mirror_conf,
                        uint8_t rule_id, uint8_t on)
 {
@@ -2647,7 +2866,7 @@ rte_eth_mirror_rule_set(uint8_t port_id,
 }
 
 int
-rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
+rte_eth_mirror_rule_reset(uint16_t port_id, uint8_t rule_id)
 {
        struct rte_eth_dev *dev;
 
@@ -2660,7 +2879,7 @@ rte_eth_mirror_rule_reset(uint8_t port_id, uint8_t rule_id)
 }
 
 int
-rte_eth_dev_callback_register(uint8_t port_id,
+rte_eth_dev_callback_register(uint16_t port_id,
                        enum rte_eth_event_type event,
                        rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2700,7 +2919,7 @@ rte_eth_dev_callback_register(uint8_t port_id,
 }
 
 int
-rte_eth_dev_callback_unregister(uint8_t port_id,
+rte_eth_dev_callback_unregister(uint16_t port_id,
                        enum rte_eth_event_type event,
                        rte_eth_dev_cb_fn cb_fn, void *cb_arg)
 {
@@ -2772,7 +2991,7 @@ _rte_eth_dev_callback_process(struct rte_eth_dev *dev,
 }
 
 int
-rte_eth_dev_rx_intr_ctl(uint8_t port_id, int epfd, int op, void *data)
+rte_eth_dev_rx_intr_ctl(uint16_t port_id, int epfd, int op, void *data)
 {
        uint32_t vec;
        struct rte_eth_dev *dev;
@@ -2824,16 +3043,11 @@ rte_eth_dma_zone_reserve(const struct rte_eth_dev *dev, const char *ring_name,
        if (mz)
                return mz;
 
-       if (rte_xen_dom0_supported())
-               return rte_memzone_reserve_bounded(z_name, size, socket_id,
-                                                  0, align, RTE_PGSIZE_2M);
-       else
-               return rte_memzone_reserve_aligned(z_name, size, socket_id,
-                                                  0, align);
+       return rte_memzone_reserve_aligned(z_name, size, socket_id, 0, align);
 }
 
 int
-rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
+rte_eth_dev_rx_intr_ctl_q(uint16_t port_id, uint16_t queue_id,
                          int epfd, int op, void *data)
 {
        uint32_t vec;
@@ -2873,7 +3087,7 @@ rte_eth_dev_rx_intr_ctl_q(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_rx_intr_enable(uint8_t port_id,
+rte_eth_dev_rx_intr_enable(uint16_t port_id,
                           uint16_t queue_id)
 {
        struct rte_eth_dev *dev;
@@ -2887,7 +3101,7 @@ rte_eth_dev_rx_intr_enable(uint8_t port_id,
 }
 
 int
-rte_eth_dev_rx_intr_disable(uint8_t port_id,
+rte_eth_dev_rx_intr_disable(uint16_t port_id,
                            uint16_t queue_id)
 {
        struct rte_eth_dev *dev;
@@ -2902,7 +3116,8 @@ rte_eth_dev_rx_intr_disable(uint8_t port_id,
 
 
 int
-rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
+rte_eth_dev_filter_supported(uint16_t port_id,
+                            enum rte_filter_type filter_type)
 {
        struct rte_eth_dev *dev;
 
@@ -2915,7 +3130,7 @@ rte_eth_dev_filter_supported(uint8_t port_id, enum rte_filter_type filter_type)
 }
 
 int
-rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
+rte_eth_dev_filter_ctrl(uint16_t port_id, enum rte_filter_type filter_type,
                       enum rte_filter_op filter_op, void *arg)
 {
        struct rte_eth_dev *dev;
@@ -2928,7 +3143,7 @@ rte_eth_dev_filter_ctrl(uint8_t port_id, enum rte_filter_type filter_type,
 }
 
 void *
-rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_rx_callback(uint16_t port_id, uint16_t queue_id,
                rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -2970,7 +3185,7 @@ rte_eth_add_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_first_rx_callback(uint16_t port_id, uint16_t queue_id,
                rte_rx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3005,7 +3220,7 @@ rte_eth_add_first_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 void *
-rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_add_tx_callback(uint16_t port_id, uint16_t queue_id,
                rte_tx_callback_fn fn, void *user_param)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3048,7 +3263,7 @@ rte_eth_add_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_rx_callback(uint16_t port_id, uint16_t queue_id,
                struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3082,7 +3297,7 @@ rte_eth_remove_rx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
+rte_eth_remove_tx_callback(uint16_t port_id, uint16_t queue_id,
                struct rte_eth_rxtx_callback *user_cb)
 {
 #ifndef RTE_ETHDEV_RXTX_CALLBACKS
@@ -3116,7 +3331,7 @@ rte_eth_remove_tx_callback(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_rx_queue_info_get(uint16_t port_id, uint16_t queue_id,
        struct rte_eth_rxq_info *qinfo)
 {
        struct rte_eth_dev *dev;
@@ -3140,7 +3355,7 @@ rte_eth_rx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
+rte_eth_tx_queue_info_get(uint16_t port_id, uint16_t queue_id,
        struct rte_eth_txq_info *qinfo)
 {
        struct rte_eth_dev *dev;
@@ -3164,7 +3379,7 @@ rte_eth_tx_queue_info_get(uint8_t port_id, uint16_t queue_id,
 }
 
 int
-rte_eth_dev_set_mc_addr_list(uint8_t port_id,
+rte_eth_dev_set_mc_addr_list(uint16_t port_id,
                             struct ether_addr *mc_addr_set,
                             uint32_t nb_mc_addr)
 {
@@ -3178,7 +3393,7 @@ rte_eth_dev_set_mc_addr_list(uint8_t port_id,
 }
 
 int
-rte_eth_timesync_enable(uint8_t port_id)
+rte_eth_timesync_enable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -3190,7 +3405,7 @@ rte_eth_timesync_enable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_disable(uint8_t port_id)
+rte_eth_timesync_disable(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -3202,7 +3417,7 @@ rte_eth_timesync_disable(uint8_t port_id)
 }
 
 int
-rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
+rte_eth_timesync_read_rx_timestamp(uint16_t port_id, struct timespec *timestamp,
                                   uint32_t flags)
 {
        struct rte_eth_dev *dev;
@@ -3215,7 +3430,8 @@ rte_eth_timesync_read_rx_timestamp(uint8_t port_id, struct timespec *timestamp,
 }
 
 int
-rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_tx_timestamp(uint16_t port_id,
+                                  struct timespec *timestamp)
 {
        struct rte_eth_dev *dev;
 
@@ -3227,7 +3443,7 @@ rte_eth_timesync_read_tx_timestamp(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
+rte_eth_timesync_adjust_time(uint16_t port_id, int64_t delta)
 {
        struct rte_eth_dev *dev;
 
@@ -3239,7 +3455,7 @@ rte_eth_timesync_adjust_time(uint8_t port_id, int64_t delta)
 }
 
 int
-rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
+rte_eth_timesync_read_time(uint16_t port_id, struct timespec *timestamp)
 {
        struct rte_eth_dev *dev;
 
@@ -3251,7 +3467,7 @@ rte_eth_timesync_read_time(uint8_t port_id, struct timespec *timestamp)
 }
 
 int
-rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
+rte_eth_timesync_write_time(uint16_t port_id, const struct timespec *timestamp)
 {
        struct rte_eth_dev *dev;
 
@@ -3263,7 +3479,7 @@ rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
 }
 
 int
-rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
+rte_eth_dev_get_reg_info(uint16_t port_id, struct rte_dev_reg_info *info)
 {
        struct rte_eth_dev *dev;
 
@@ -3275,7 +3491,7 @@ rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
 }
 
 int
-rte_eth_dev_get_eeprom_length(uint8_t port_id)
+rte_eth_dev_get_eeprom_length(uint16_t port_id)
 {
        struct rte_eth_dev *dev;
 
@@ -3287,7 +3503,7 @@ rte_eth_dev_get_eeprom_length(uint8_t port_id)
 }
 
 int
-rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_get_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
        struct rte_eth_dev *dev;
 
@@ -3299,7 +3515,7 @@ rte_eth_dev_get_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
+rte_eth_dev_set_eeprom(uint16_t port_id, struct rte_dev_eeprom_info *info)
 {
        struct rte_eth_dev *dev;
 
@@ -3311,7 +3527,7 @@ rte_eth_dev_set_eeprom(uint8_t port_id, struct rte_dev_eeprom_info *info)
 }
 
 int
-rte_eth_dev_get_dcb_info(uint8_t port_id,
+rte_eth_dev_get_dcb_info(uint16_t port_id,
                             struct rte_eth_dcb_info *dcb_info)
 {
        struct rte_eth_dev *dev;
@@ -3326,7 +3542,7 @@ rte_eth_dev_get_dcb_info(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
+rte_eth_dev_l2_tunnel_eth_type_conf(uint16_t port_id,
                                    struct rte_eth_l2_tunnel_conf *l2_tunnel)
 {
        struct rte_eth_dev *dev;
@@ -3349,7 +3565,7 @@ rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,
 }
 
 int
-rte_eth_dev_l2_tunnel_offload_set(uint8_t port_id,
+rte_eth_dev_l2_tunnel_offload_set(uint16_t port_id,
                                  struct rte_eth_l2_tunnel_conf *l2_tunnel,
                                  uint32_t mask,
                                  uint8_t en)
@@ -3393,7 +3609,7 @@ rte_eth_dev_adjust_nb_desc(uint16_t *nb_desc,
 }
 
 int
-rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
+rte_eth_dev_adjust_nb_rx_tx_desc(uint16_t port_id,
                                 uint16_t *nb_rx_desc,
                                 uint16_t *nb_tx_desc)
 {
@@ -3415,3 +3631,21 @@ rte_eth_dev_adjust_nb_rx_tx_desc(uint8_t port_id,
 
        return 0;
 }
+
+int
+rte_eth_dev_pool_ops_supported(uint8_t port_id, const char *pool)
+{
+       struct rte_eth_dev *dev;
+
+       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
+
+       if (pool == NULL)
+               return -EINVAL;
+
+       dev = &rte_eth_devices[port_id];
+
+       if (*dev->dev_ops->pool_ops_supported == NULL)
+               return 1; /* all pools are supported */
+
+       return (*dev->dev_ops->pool_ops_supported)(dev, pool);
+}