Index: /branches/rel_apv_10_7_3/usr/click/lib/libintel_dpdk/drivers/net/i40e/i40e_ethdev_vf.c
===================================================================
--- /branches/rel_apv_10_7_3/usr/click/lib/libintel_dpdk/drivers/net/i40e/i40e_ethdev_vf.c	(revision 39758)
+++ /branches/rel_apv_10_7_3/usr/click/lib/libintel_dpdk/drivers/net/i40e/i40e_ethdev_vf.c	(working copy)
@@ -339,7 +339,7 @@
 	return !ret;
 }
 
-#define MAX_TRY_TIMES 400
+#define MAX_TRY_TIMES 500
 #define ASQ_DELAY_MS  10
 
 static int
@@ -1517,8 +1517,9 @@
 		PMD_INIT_LOG(ERR, "i40e_shutdown_adminq failed");
 		return -1;
 	}
+
 	// TWSD-1220, Set delay time, retry loop to wait admin queue is available
-	sleep(1);
+	rte_delay_ms(CHECK_DELAY_MS * 2);
 	i40e_init_adminq_parameter(hw);
 	if (i40e_init_adminq(hw) != I40E_SUCCESS) {
 		PMD_INIT_LOG(ERR, "init_adminq failed");
@@ -1530,38 +1531,22 @@
 			goto err_aq;
 	}
 
-	for (i = 0; i < CHECK_TRY_TIMES; i++) {
-		rte_delay_ms(CHECK_DELAY_MS << (i > 2 ? 2: i));
-		err = i40evf_check_api_version(dev);
-		if (err == 0) break;
-		PMD_INIT_LOG(ERR, "check_api version failed %d times", i + 1);
-	}
-	if (i >= CHECK_TRY_TIMES) {
-		i40e_init_adminq_parameter(hw);
-		if (i40e_init_adminq(hw) != I40E_SUCCESS) {
-			PMD_INIT_LOG(ERR, "Last try: init_adminq failed");
-			return -1;
-		}
-		if (i40evf_check_api_version(dev) != 0) {
-			PMD_INIT_LOG(ERR, "Last try:check_api version failed");
-			goto err_aq;
-		}
+	if (i40evf_check_api_version(dev) != 0) {
+		PMD_INIT_LOG(ERR, "check_api version failed");
+		goto err_api;
 	}
 	bufsz = sizeof(struct i40e_virtchnl_vf_resource) +
 		(I40E_MAX_VF_VSI * sizeof(struct i40e_virtchnl_vsi_resource));
 	vf->vf_res = rte_zmalloc("vf_res", bufsz, 0);
 	if (!vf->vf_res) {
 		PMD_INIT_LOG(ERR, "unable to allocate vf_res memory");
-			goto err_aq;
+			goto err_api;
 	}
 
-	for (i = 0; i < CHECK_TRY_TIMES; i++) {
-		rte_delay_ms(CHECK_DELAY_MS << (i > 2 ? 2: i));
-		err = i40evf_get_vf_resource(dev);
-		if (err == 0) break;
-		PMD_INIT_LOG(ERR, "i40evf_get_vf_config failed %d times", i + 1);
+	if (i40evf_get_vf_resource(dev) != 0) {
+		PMD_INIT_LOG(ERR, "i40evf_get_vf_config failed");
+		goto err_alloc;
 	}
-	if (i >= CHECK_TRY_TIMES) goto err_alloc;
 
 	/* got VF config message back from PF, now we can parse it */
 	for (i = 0; i < vf->vf_res->num_vsis; i++) {
@@ -1601,6 +1586,9 @@
 
 err_alloc:
 	rte_free(vf->vf_res);
+	vf->vsi_res = NULL;
+err_api: // TWSD-1220, proper memory free before retry
+	rte_free(vf->aq_resp);
 err_aq:
 	i40e_shutdown_adminq(hw); /* ignore error */
 err:
@@ -1801,9 +1789,17 @@
 	hw->hw_addr = (void *)pci_dev->mem_resource[0].addr;
 	hw->adapter_stopped = 0;
 
-	if(i40evf_init_vf(eth_dev) != 0) {
-		PMD_INIT_LOG(ERR, "Init vf failed");
-		return -1;
+	/* TWSD-1220, Set delay time, retry loop to wait admin queue is available */
+	int i;
+	for (i = 1; i <= CHECK_TRY_TIMES; i++) {
+		if(i40evf_init_vf(eth_dev) != 0) {
+			PMD_INIT_LOG(ERR, "Init vf failed %d times", i);
+			if (i == CHECK_TRY_TIMES) return -1;
+			// delay 2s, 3s, 5s, 5s
+			rte_delay_ms((CHECK_DELAY_MS << (i > 3 ? 3: i)) + 1000);
+		} else {
+			break;
+		}
 	}
 
 	/* register callback func to eal lib */
Index: /branches/rel_apv_10_7_3/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk.c
===================================================================
--- /branches/rel_apv_10_7_3/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk.c	(revision 39756)
+++ /branches/rel_apv_10_7_3/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk.c	(working copy)
@@ -1893,6 +1893,29 @@
 	}
 }
 
+#define VLAN_FILTER_MAX_RETRY 5
+static int set_vlan_filter_with_retry(uint8_t port_id, uint16_t vlan_id, int on)
+{
+    int ret = 0, i;
+	for (i = 0; i < VLAN_FILTER_MAX_RETRY; i++) {
+        ret = rte_eth_dev_vlan_filter(port_id, vlan_id, on);
+        if (ret == 0) {
+            printf("VLAN %d filter %s success on port %d after %d times.\n", 
+					vlan_id, on? "add" : "del", port_id, i + 1);
+            return 0;
+        }
+        if (ret == -ENOTSUP) {
+            return ret;
+        }
+        usleep(50000); // sleep 50 ms
+    }
+
+    printf("Failed to %s VLAN %d filter on port %d after %d times (Error: %d)\n", 
+           on? "add" : "del", vlan_id, port_id, VLAN_FILTER_MAX_RETRY, ret);
+
+    return ret;
+}
+
 extern struct ifnet *get_vlan_parent(struct ifnet *ifp);
 extern uint16_t get_vlan_id(struct ifnet *ifp);
 void if_dpdk_refresh_vlan_filter(int port_id, int set)
@@ -1918,24 +1941,20 @@
 				ifp_p = pBond->ifSlave[i].pSlave;
 				if (ifp_p->if_dunit == port_id) {
 					if (set) {
-						/* repeat for unknown error */
-						rte_eth_dev_vlan_filter(port_id, vlan_id, 1);
-						rte_eth_dev_vlan_filter(port_id, vlan_id, 0);
-						rte_eth_dev_vlan_filter(port_id, vlan_id, 1);
+						/* TWSD-1220, set retry loop with delay to prevent too many request */
+						set_vlan_filter_with_retry(port_id, vlan_id, 1);
 					} else {
-						rte_eth_dev_vlan_filter(port_id, vlan_id, 0);
+						set_vlan_filter_with_retry(port_id, vlan_id, 0);
 					}
 				}
 			}
 		} else {
 			if (ifp_p->if_dunit == port_id) {
 				if (set) {
-					/* repeat for unknown error */
-					rte_eth_dev_vlan_filter(port_id, vlan_id, 1);
-					rte_eth_dev_vlan_filter(port_id, vlan_id, 0);
-					rte_eth_dev_vlan_filter(port_id, vlan_id, 1);
+					/* TWSD-1220, set retry loop with delay to prevent too many request */
+					set_vlan_filter_with_retry(port_id, vlan_id, 1);
 				} else {
-					rte_eth_dev_vlan_filter(port_id, vlan_id, 0);
+					set_vlan_filter_with_retry(port_id, vlan_id, 0);
 				}
 			}
 		}
Index: /branches/rel_apv_10_7_3/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk_host.c
===================================================================
--- /branches/rel_apv_10_7_3/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk_host.c	(revision 39756)
+++ /branches/rel_apv_10_7_3/usr/click/lib/libuinet-atcp/lib/libuinet/uinet_if_dpdk_host.c	(working copy)
@@ -1642,12 +1642,12 @@
 		}
 	}
 
-	if_dpdk_refresh_vlan_filter(port_id, 1);
-
 	if ((error = rte_eth_dev_start(port_id)) < 0) {
 		printf("device %u start failed, error %d\n", port_id, error);
 		goto RETRY;
 	}
+	usleep(200 * 1000); // sleep 200 ms
+	if_dpdk_refresh_vlan_filter(port_id, 1);
 	TQ_enter_enable(port_id);
 
 	printf("--------------------port %d finish reset------------------\n", port_id);
