Index: /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libintel_dpdk/config/common_base
===================================================================
--- /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libintel_dpdk/config/common_base	(revision 37918)
+++ /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libintel_dpdk/config/common_base	(working copy)
@@ -140,7 +140,7 @@
 #
 # Compile burst-oriented Amazon ENA PMD driver
 #
-CONFIG_RTE_LIBRTE_ENA_PMD=n
+CONFIG_RTE_LIBRTE_ENA_PMD=y
 CONFIG_RTE_LIBRTE_ENA_DEBUG_RX=n
 CONFIG_RTE_LIBRTE_ENA_DEBUG_TX=n
 CONFIG_RTE_LIBRTE_ENA_DEBUG_TX_FREE=n
Index: /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libintel_dpdk/drivers/net/ena/ena_ethdev.c
===================================================================
--- /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libintel_dpdk/drivers/net/ena/ena_ethdev.c	(revision 37918)
+++ /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libintel_dpdk/drivers/net/ena/ena_ethdev.c	(working copy)
@@ -919,7 +919,7 @@
 
 static int ena_queue_restart(struct ena_ring *ring)
 {
-	int rc;
+	int rc, bufs_num;
 
 	ena_assert_msg(ring->configured == 1,
 		       "Trying to restart unconfigured queue\n");
@@ -930,8 +930,9 @@
 	if (ring->type == ENA_RING_TYPE_TX)
 		return 0;
 
-	rc = ena_populate_rx_queue(ring, ring->ring_size);
-	if ((unsigned int)rc != ring->ring_size) {
+	bufs_num = ring->ring_size - 1;
+	rc = ena_populate_rx_queue(ring, bufs_num);
+	if (rc != bufs_num) {
 		PMD_INIT_LOG(ERR, "Failed to populate rx ring !");
 		return (-1);
 	}
@@ -1372,6 +1373,8 @@
 		return -ENOMEM;
 	}
 
+	rte_eth_copy_pci_info(eth_dev, pci_dev);
+
 	adapters_found++;
 	adapter->state = ENA_ADAPTER_STATE_INIT;
 
Index: /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libip/ip_media.c
===================================================================
--- /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libip/ip_media.c	(revision 37918)
+++ /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libip/ip_media.c	(working copy)
@@ -512,6 +512,9 @@
 			}
 		} else if (!strncmp(pinfo->dev_name, "net_mlx5", 8)) {
 			if_info_p->hg_nics++;
+		} else if (!strncmp(pinfo->dev_name, "net_ena", 7)) {
+			if_info_p->tg_nics++;
+			if_info_p->fb_tg_nics++;
 		}
 	}
 
Index: /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_host_pci.c
===================================================================
--- /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_host_pci.c	(revision 37918)
+++ /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_host_pci.c	(working copy)
@@ -519,6 +519,7 @@
 	    !strcmp("net_i40e", dev_pci->driver->driver.name) ||
 	    !strcmp("net_i40e_vf", dev_pci->driver->driver.name) ||
 	    !strcmp("net_ice_pmd", dev_pci->driver->driver.name) ||
+	    !strcmp("net_ena", dev_pci->driver->driver.name) ||
 	    !strcmp("net_mlx5", dev_pci->driver->driver.name)) {
 		return 1;
 	} else {
Index: /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk_host.c
===================================================================
--- /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk_host.c	(revision 37918)
+++ /branches/rel_apv_10_4_2_107_cloud/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk_host.c	(working copy)
@@ -355,6 +355,23 @@
 	return nbr_tx_desc;
 }
 
+/*
+** The number of rx descriptors for ENA NIC is 1024;
+** The other NIC is 4096;
+*/
+static int get_rx_desc_nbr(const char *driver_name)
+{	
+	int nbr_rx_desc = NMBUF_RX/2;
+	
+	if (driver_name != NULL) {
+		if (strcmp(driver_name, "net_ena") == 0) {
+			nbr_rx_desc = NMBUF_TX/8;
+		}
+	}
+
+	return nbr_rx_desc;
+}
+
 static int if_dpdk_filter_vlan_start(struct rte_mbuf *m, u_char *ether_vlan_hdr)
 {
 	uint16_t len = ETHER_ADDR_LEN * 2 + ETHER_VLAN_ENCAP_LEN;
@@ -1466,7 +1483,7 @@
 {
 	struct rte_eth_dev *dev = (struct rte_eth_dev *)args;
 	uint8_t port_id = dev->data->port_id;
-	int nbr_tx_desc;
+	int nbr_tx_desc, nbr_rx_desc;
 
 	if (pthread_mutex_trylock(&reset_mutex[port_id])) {
 		printf("Port %d already resetting\n", port_id);
@@ -1560,8 +1577,9 @@
 		goto RETRY;
 	}
 
+	nbr_rx_desc = get_rx_desc_nbr(dev->data->drv_name);
 	for (i = 0; i < nb_rx_queues; ++i) {
-		if (rte_eth_rx_queue_setup(port_id, i, NMBUF_RX/2, domain, eth_rxconf, ctx->mbpool_rx[i]) < 0) {
+		if (rte_eth_rx_queue_setup(port_id, i, nbr_rx_desc, domain, eth_rxconf, ctx->mbpool_rx[i]) < 0) {
 			printf("rx queue setup failed for port %u\n", port_id);
 			goto RETRY;
 		}
@@ -1640,7 +1658,7 @@
 	struct if_dpdk_host_context *ctx;
 	char poolname[256];
 	struct rte_eth_link link;
-	int i, error, nbr_tx_desc;
+	int i, error, nbr_tx_desc, nbr_rx_desc;
 	struct rte_eth_dev_info dev_info;
 	struct rte_eth_rxconf rxconf_temp;
 	struct rte_eth_txconf txconf_temp;
@@ -1779,8 +1797,9 @@
 		goto fail;
 	}
 
+	nbr_rx_desc = get_rx_desc_nbr(dev_info.driver_name);
 	for (i = 0; i < rx_queue_num; ++i) {
-		if (rte_eth_rx_queue_setup(port_id, i, NMBUF_RX/2, domain, eth_rxconf, ctx->mbpool_rx[i]) < 0) {
+		if (rte_eth_rx_queue_setup(port_id, i, nbr_rx_desc, domain, eth_rxconf, ctx->mbpool_rx[i]) < 0) {
 			printf("rx queue setup failed for port %u\n", port_id);
 			goto fail;
 		}
