diff --git a/platform/linux-dpdk/include/odp_packet_io_internal.h b/platform/linux-dpdk/include/odp_packet_io_internal.h
index 07db8cab0..3e4d64f3a 100644
--- a/platform/linux-dpdk/include/odp_packet_io_internal.h
+++ b/platform/linux-dpdk/include/odp_packet_io_internal.h
@@ -29,7 +29,6 @@ extern "C" {
 
 #define PKTIO_MAX_QUEUES 64
 #include <linux/if_ether.h>
-#include <pktio/dpdk.h>
 
 /* Forward declaration */
 typedef union pktio_entry_u pktio_entry_t;
@@ -42,10 +41,8 @@ typedef union pktio_entry_u pktio_entry_t;
 
 struct pktio_entry {
 	const pktio_ops_module_t *ops;	/**< Implementation specific methods */
-	union {
-		pktio_ops_data_t ops_data;
-		uint8_t _ops_data[ODP_PKTIO_ODPS_DATA_MAX_SIZE];
-	};
+	uint8_t ops_data[ODP_PKTIO_ODPS_DATA_MAX_SIZE]; /**< IO operation
+							specific data */
 	/* These two locks together lock the whole pktio device */
 	odp_ticketlock_t rxl;		/**< RX ticketlock */
 	odp_ticketlock_t txl;		/**< TX ticketlock */
diff --git a/platform/linux-dpdk/pktio/dpdk.c b/platform/linux-dpdk/pktio/dpdk.c
index d7a90197a..30ccc456e 100644
--- a/platform/linux-dpdk/pktio/dpdk.c
+++ b/platform/linux-dpdk/pktio/dpdk.c
@@ -39,18 +39,6 @@ static pktio_ops_module_t dpdk_pktio_ops;
 
 static uint32_t mtu_get_pkt_dpdk(pktio_entry_t *pktio_entry);
 
-static inline pktio_ops_dpdk_data_t *
-	__retrieve_op_data(pktio_entry_t *pktio)
-{
-	return (pktio_ops_dpdk_data_t *)(pktio->ops_data(dpdk));
-}
-
-static inline void __release_op_data(pktio_entry_t *pktio)
-{
-	free(pktio->ops_data(dpdk));
-	pktio->ops_data(dpdk) = NULL;
-}
-
 /* Test if s has only digits or not. Dpdk pktio uses only digits.*/
 static int _dpdk_netdev_is_valid(const char *s)
 {
@@ -108,7 +96,7 @@ static int input_queues_config_pkt_dpdk(pktio_entry_t *pktio_entry,
 					const odp_pktin_queue_param_t *p)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	odp_pktin_mode_t mode = pktio_entry->s.param.in_mode;
 
 	/**
@@ -138,7 +126,7 @@ static int output_queues_config_pkt_dpdk(pktio_entry_t *pktio_entry,
 					 const odp_pktout_queue_param_t *p)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 
 	if (p->op_mode == ODP_PKTIO_OP_MT_UNSAFE)
 		pkt_dpdk->lockless_tx = 1;
@@ -155,7 +143,8 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED,
 {
 	uint8_t portid = 0;
 	struct rte_eth_dev_info dev_info;
-	pktio_ops_dpdk_data_t *pkt_dpdk = NULL;
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
 	int i;
 
 	if (!_dpdk_netdev_is_valid(netdev)) {
@@ -164,9 +153,6 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED,
 		return -1;
 	}
 
-	pktio_entry->ops_data(dpdk) = malloc(sizeof(pktio_ops_dpdk_data_t));
-	pkt_dpdk = __retrieve_op_data(pktio_entry);
-
 	if (odp_unlikely(pkt_dpdk == NULL)) {
 		ODP_ERR("Failed to allocate pktio_ops_dpdk_data_t struct");
 		return -1;
@@ -202,12 +188,11 @@ static int setup_pkt_dpdk(odp_pktio_t pktio ODP_UNUSED,
 static int close_pkt_dpdk(pktio_entry_t *pktio_entry)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 
 	if (pktio_entry->s.state == PKTIO_STATE_STOPPED)
 		rte_eth_dev_close(pkt_dpdk->portid);
 
-	__release_op_data(pktio_entry);
 	return 0;
 }
 
@@ -215,7 +200,7 @@ static int start_pkt_dpdk(pktio_entry_t *pktio_entry)
 {
 	int ret, i;
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	uint8_t portid = pkt_dpdk->portid;
 	int sid = rte_eth_dev_socket_id(pkt_dpdk->portid);
 	int socket_id =  sid < 0 ? 0 : sid;
@@ -324,7 +309,8 @@ static int start_pkt_dpdk(pktio_entry_t *pktio_entry)
 static int stop_pkt_dpdk(pktio_entry_t *pktio_entry)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
+
 	rte_eth_dev_stop(pkt_dpdk->portid);
 	return 0;
 }
@@ -373,7 +359,7 @@ static int recv_pkt_dpdk(pktio_entry_t *pktio_entry, int index,
 {
 	uint16_t nb_rx, i;
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	odp_packet_t *saved_pkt_table;
 	uint8_t min = pkt_dpdk->min_rx_burst;
 	odp_time_t ts_val;
@@ -490,7 +476,7 @@ static int send_pkt_dpdk(pktio_entry_t *pktio_entry, int index,
 {
 	int pkts;
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 
 	if (!pkt_dpdk->lockless_tx)
 		odp_ticketlock_lock(&pkt_dpdk->tx_lock[index]);
@@ -543,7 +529,7 @@ static uint32_t _dpdk_vdev_mtu(uint8_t port_id)
 static uint32_t mtu_get_pkt_dpdk(pktio_entry_t *pktio_entry)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	uint16_t mtu = 0;
 	int ret;
 
@@ -604,7 +590,7 @@ static int _dpdk_vdev_promisc_mode_set(uint8_t port_id, int enable)
 static int promisc_mode_set_pkt_dpdk(pktio_entry_t *pktio_entry,  int enable)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	uint8_t portid = pkt_dpdk->portid;
 
 	if (enable)
@@ -648,7 +634,7 @@ static int _dpdk_vdev_promisc_mode(uint8_t port_id)
 static int promisc_mode_get_pkt_dpdk(pktio_entry_t *pktio_entry)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	uint8_t portid = pkt_dpdk->portid;
 
 	if (pkt_dpdk->vdev_sysc_promisc)
@@ -660,25 +646,27 @@ static int promisc_mode_get_pkt_dpdk(pktio_entry_t *pktio_entry)
 static int mac_get_pkt_dpdk(pktio_entry_t *pktio_entry, void *mac_addr)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
+
 	rte_eth_macaddr_get(pkt_dpdk->portid,
 			    (struct ether_addr *)mac_addr);
 	return ETH_ALEN;
 }
 
-
 static int capability_pkt_dpdk(pktio_entry_t *pktio_entry,
 			       odp_pktio_capability_t *capa)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
+
 	*capa = pkt_dpdk->capa;
 	return 0;
 }
+
 static int link_status_pkt_dpdk(pktio_entry_t *pktio_entry)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	struct rte_eth_link link;
 
 	rte_eth_link_get(pkt_dpdk->portid, &link);
@@ -702,7 +690,7 @@ static void stats_convert(struct rte_eth_stats *rte_stats,
 static int stats_pkt_dpdk(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	int ret;
 	struct rte_eth_stats rte_stats;
 
@@ -721,7 +709,8 @@ static int stats_pkt_dpdk(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats)
 static int stats_reset_pkt_dpdk(pktio_entry_t *pktio_entry)
 {
 	const pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
+
 	rte_eth_stats_reset(pkt_dpdk->portid);
 	return 0;
 }
diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h
index 0201a47fa..665589ce3 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -48,10 +48,8 @@ typedef union pktio_entry_u pktio_entry_t;
 
 struct pktio_entry {
 	const pktio_ops_module_t *ops;	/**< Implementation specific methods */
-	union {
-		pktio_ops_data_t ops_data;  /**< IO operation specific data */
-		uint8_t _ops_data[ODP_PKTIO_ODPS_DATA_MAX_SIZE];
-	};
+	uint8_t ops_data[ODP_PKTIO_ODPS_DATA_MAX_SIZE]; /**< IO operation
+							specific data */
 	/* These two locks together lock the whole pktio device */
 	odp_ticketlock_t rxl;		/**< RX ticketlock */
 	odp_ticketlock_t txl;		/**< TX ticketlock */
diff --git a/platform/linux-generic/include/odp_pktio_ops_subsystem.h b/platform/linux-generic/include/odp_pktio_ops_subsystem.h
index 5449eccbd..f1ff48832 100644
--- a/platform/linux-generic/include/odp_pktio_ops_subsystem.h
+++ b/platform/linux-generic/include/odp_pktio_ops_subsystem.h
@@ -78,21 +78,11 @@ typedef ODP_MODULE_CLASS(pktio_ops) {
 	odp_api_proto(pktio_ops, print) print;
 } pktio_ops_module_t;
 
-/* Per implementation private data
- * TODO: refactory each implementation to hide it internally
- */
-typedef union {
-	void *dpdk;
-} pktio_ops_data_t;
-
-/* Extract pktio ops data from pktio entry structure */
-#define ops_data(mod) s.ops_data.mod
-
 /* Maximum size of pktio specific ops data.*/
 #define ODP_PKTIO_ODPS_DATA_MAX_SIZE 80000
 
 /* Extract pktio ops data from pktio entry structure */
 #define odp_ops_data(_p, _mod) \
-	((pktio_ops_ ## _mod ## _data_t *)(uintptr_t)_p->s._ops_data)
+	((pktio_ops_ ## _mod ## _data_t *)(uintptr_t)_p->s.ops_data)
 
 #endif
diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c
index 21c9fb0f7..be2bbbfcb 100644
--- a/platform/linux-generic/pktio/dpdk.c
+++ b/platform/linux-generic/pktio/dpdk.c
@@ -12,6 +12,7 @@
 #include <ctype.h>
 #include <unistd.h>
 #include <math.h>
+#include <linux/if_ether.h>
 
 #include <odp/api/cpumask.h>
 
@@ -33,18 +34,6 @@
 #include <rte_ethdev.h>
 #include <rte_string_fns.h>
 
-static inline pktio_ops_dpdk_data_t *
-	__retrieve_op_data(pktio_entry_t *pktio)
-{
-	return (pktio_ops_dpdk_data_t *)(pktio->ops_data(dpdk));
-}
-
-static inline void __release_op_data(pktio_entry_t *pktio)
-{
-	free(pktio->ops_data(dpdk));
-	pktio->ops_data(dpdk) = NULL;
-}
-
 #if ODP_DPDK_ZERO_COPY
 ODP_STATIC_ASSERT(CONFIG_PACKET_HEADROOM == RTE_PKTMBUF_HEADROOM,
 		  "ODP and DPDK headroom sizes not matching!");
@@ -315,6 +304,7 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
 			      struct rte_mbuf *mbuf_table[],
 			      uint16_t mbuf_num, odp_time_t *ts)
 {
+	pktio_ops_dpdk_data_t *pkt_dpdk = odp_ops_data(pktio_entry, dpdk);
 	odp_packet_t pkt;
 	odp_packet_hdr_t *pkt_hdr;
 	uint16_t pkt_len;
@@ -323,10 +313,10 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry,
 	int i, j;
 	int nb_pkts = 0;
 	int alloc_len, num;
-	odp_pool_t pool = __retrieve_op_data(pktio_entry)->pool;
+	odp_pool_t pool = pkt_dpdk->pool;
 
 	/* Allocate maximum sized packets */
-	alloc_len = __retrieve_op_data(pktio_entry)->data_room;
+	alloc_len = pkt_dpdk->data_room;
 
 	num = packet_alloc_multi(pool, alloc_len, pkt_table, mbuf_num);
 	if (num != mbuf_num) {
@@ -399,7 +389,7 @@ static inline int pkt_to_mbuf(pktio_entry_t *pktio_entry,
 			      const odp_packet_t pkt_table[], uint16_t num)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	int i, j;
 	char *data;
 	uint16_t pkt_len;
@@ -437,6 +427,8 @@ static inline int mbuf_to_pkt_zero(pktio_entry_t *pktio_entry,
 				   struct rte_mbuf *mbuf_table[],
 				   uint16_t mbuf_num, odp_time_t *ts)
 {
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
 	odp_packet_t pkt;
 	odp_packet_hdr_t *pkt_hdr;
 	uint16_t pkt_len;
@@ -444,7 +436,7 @@ static inline int mbuf_to_pkt_zero(pktio_entry_t *pktio_entry,
 	void *data;
 	int i;
 	int nb_pkts = 0;
-	odp_pool_t pool = __retrieve_op_data(pktio_entry)->pool;
+	odp_pool_t pool = pkt_dpdk->pool;
 
 	for (i = 0; i < mbuf_num; i++) {
 		odp_packet_hdr_t parsed_hdr;
@@ -502,7 +494,7 @@ static inline int pkt_to_mbuf_zero(pktio_entry_t *pktio_entry,
 				   uint16_t *seg_count)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	int i;
 
 	*seg_count = 0;
@@ -578,7 +570,7 @@ static uint32_t dpdk_vdev_mtu_get(uint8_t port_id)
 static uint32_t dpdk_mtu_get(pktio_entry_t *pktio_entry)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	uint32_t mtu = 0;
 
 	if (rte_eth_dev_get_mtu(pkt_dpdk->port_id, (uint16_t *)&mtu))
@@ -672,7 +664,7 @@ static int dpdk_setup_port(pktio_entry_t *pktio_entry)
 {
 	int ret;
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	struct rte_eth_rss_conf rss_conf;
 
 	/* Always set some hash functions to enable DPDK RSS hash calculation */
@@ -715,7 +707,7 @@ static int dpdk_setup_port(pktio_entry_t *pktio_entry)
 static int dpdk_close(pktio_entry_t *pktio_entry)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	unsigned idx;
 	unsigned i, j;
 
@@ -733,7 +725,6 @@ static int dpdk_close(pktio_entry_t *pktio_entry)
 	if (!ODP_DPDK_ZERO_COPY)
 		rte_mempool_free(pkt_dpdk->pkt_pool);
 
-	__release_op_data(pktio_entry);
 	return 0;
 }
 
@@ -866,6 +857,8 @@ static int dpdk_pktio_init_local(void)
 static int dpdk_input_queues_config(pktio_entry_t *pktio_entry,
 				    const odp_pktin_queue_param_t *p)
 {
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
 	odp_pktin_mode_t mode = pktio_entry->s.param.in_mode;
 	odp_bool_t lockless;
 
@@ -879,9 +872,9 @@ static int dpdk_input_queues_config(pktio_entry_t *pktio_entry,
 		lockless = 0;
 
 	if (p->hash_enable && p->num_queues > 1)
-		__retrieve_op_data(pktio_entry)->hash = p->hash_proto;
+		pkt_dpdk->hash = p->hash_proto;
 
-	__retrieve_op_data(pktio_entry)->lockless_rx = lockless;
+	pkt_dpdk->lockless_rx = lockless;
 
 	return 0;
 }
@@ -890,7 +883,7 @@ static int dpdk_output_queues_config(pktio_entry_t *pktio_entry,
 				     const odp_pktout_queue_param_t *p)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	odp_bool_t lockless;
 
 	if (p->op_mode == ODP_PKTIO_OP_MT_UNSAFE)
@@ -907,7 +900,7 @@ static void dpdk_init_capability(pktio_entry_t *pktio_entry,
 				 struct rte_eth_dev_info *dev_info)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	odp_pktio_capability_t *capa = &pkt_dpdk->capa;
 
 	memset(dev_info, 0, sizeof(struct rte_eth_dev_info));
@@ -930,7 +923,8 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
 		     const char *netdev,
 		     odp_pool_t pool)
 {
-	pktio_ops_dpdk_data_t *pkt_dpdk = NULL;
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
 	struct rte_eth_dev_info dev_info;
 	struct rte_mempool *pkt_pool;
 	char pool_name[RTE_MEMPOOL_NAMESIZE];
@@ -958,9 +952,6 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
 		dpdk_initialized = 1;
 	}
 
-	pktio_entry->ops_data(dpdk) = malloc(sizeof(pktio_ops_dpdk_data_t));
-	pkt_dpdk = __retrieve_op_data(pktio_entry);
-
 	if (odp_unlikely(pkt_dpdk == NULL)) {
 		ODP_ERR("Failed to allocate pktio_ops_dpdk_data_t struct");
 		return -1;
@@ -974,7 +965,6 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
 
 	if (rte_eth_dev_count() == 0) {
 		ODP_ERR("No DPDK ports found\n");
-		__release_op_data(pktio_entry);
 		return -1;
 	}
 
@@ -983,7 +973,6 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
 	mtu = dpdk_mtu_get(pktio_entry);
 	if (mtu == 0) {
 		ODP_ERR("Failed to read interface MTU\n");
-		__release_op_data(pktio_entry);
 		return -1;
 	}
 	pkt_dpdk->mtu = mtu + _ODP_ETHHDR_LEN;
@@ -1020,7 +1009,6 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
 	}
 	if (pkt_pool == NULL) {
 		ODP_ERR("Cannot init mbuf packet pool\n");
-		__release_op_data(pktio_entry);
 		return -1;
 	}
 
@@ -1046,7 +1034,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED,
 static int dpdk_start(pktio_entry_t *pktio_entry)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	uint8_t port_id = pkt_dpdk->port_id;
 	int ret;
 	unsigned i;
@@ -1097,7 +1085,10 @@ static int dpdk_start(pktio_entry_t *pktio_entry)
 
 static int dpdk_stop(pktio_entry_t *pktio_entry)
 {
-	rte_eth_dev_stop(__retrieve_op_data(pktio_entry)->port_id);
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
+
+	rte_eth_dev_stop(pkt_dpdk->port_id);
 
 	return 0;
 }
@@ -1106,7 +1097,7 @@ static int dpdk_recv(pktio_entry_t *pktio_entry, int index,
 		     odp_packet_t pkt_table[], int num)
 {
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	pkt_cache_t *rx_cache = &pkt_dpdk->rx_cache[index];
 	odp_time_t ts_val;
 	odp_time_t *ts = NULL;
@@ -1182,7 +1173,7 @@ static int dpdk_send(pktio_entry_t *pktio_entry, int index,
 {
 	struct rte_mbuf *tx_mbufs[num];
 	pktio_ops_dpdk_data_t *pkt_dpdk =
-		__retrieve_op_data(pktio_entry);
+		odp_ops_data(pktio_entry, dpdk);
 	uint16_t seg_count = 0;
 	int tx_pkts;
 	int i;
@@ -1245,16 +1236,21 @@ static int dpdk_send(pktio_entry_t *pktio_entry, int index,
 
 static int dpdk_mac_addr_get(pktio_entry_t *pktio_entry, void *mac_addr)
 {
-	rte_eth_macaddr_get(__retrieve_op_data(pktio_entry)->port_id,
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
+
+	rte_eth_macaddr_get(pkt_dpdk->port_id,
 			    (struct ether_addr *)mac_addr);
 	return ETH_ALEN;
 }
 
 static int dpdk_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable)
 {
-	uint8_t port_id = __retrieve_op_data(pktio_entry)->port_id;
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
+	uint8_t port_id = pkt_dpdk->port_id;
 
-	if (__retrieve_op_data(pktio_entry)->vdev_sysc_promisc)
+	if (pkt_dpdk->vdev_sysc_promisc)
 		return dpdk_vdev_promisc_mode_set(port_id, enable);
 
 	if (enable)
@@ -1267,9 +1263,11 @@ static int dpdk_promisc_mode_set(pktio_entry_t *pktio_entry, odp_bool_t enable)
 
 static int dpdk_promisc_mode_get(pktio_entry_t *pktio_entry)
 {
-	uint8_t port_id = __retrieve_op_data(pktio_entry)->port_id;
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
+	uint8_t port_id = pkt_dpdk->port_id;
 
-	if (__retrieve_op_data(pktio_entry)->vdev_sysc_promisc)
+	if (pkt_dpdk->vdev_sysc_promisc)
 		return dpdk_vdev_promisc_mode_get(port_id);
 	else
 		return rte_eth_promiscuous_get(port_id);
@@ -1278,18 +1276,22 @@ static int dpdk_promisc_mode_get(pktio_entry_t *pktio_entry)
 static int dpdk_capability(pktio_entry_t *pktio_entry,
 			   odp_pktio_capability_t *capa)
 {
-	*capa = __retrieve_op_data(pktio_entry)->capa;
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
+
+	*capa = pkt_dpdk->capa;
 	return 0;
 }
 
 static int dpdk_link_status(pktio_entry_t *pktio_entry)
 {
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
 	struct rte_eth_link link;
 
 	memset(&link, 0, sizeof(struct rte_eth_link));
 
-	rte_eth_link_get_nowait(
-		__retrieve_op_data(pktio_entry)->port_id, &link);
+	rte_eth_link_get_nowait(pkt_dpdk->port_id, &link);
 
 	return link.link_status;
 }
@@ -1308,11 +1310,12 @@ static void stats_convert(const struct rte_eth_stats *rte_stats,
 
 static int dpdk_stats(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats)
 {
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
 	int ret;
 	struct rte_eth_stats rte_stats;
 
-	ret = rte_eth_stats_get(
-		__retrieve_op_data(pktio_entry)->port_id, &rte_stats);
+	ret = rte_eth_stats_get(pkt_dpdk->port_id, &rte_stats);
 
 	if (ret == 0) {
 		stats_convert(&rte_stats, stats);
@@ -1323,7 +1326,10 @@ static int dpdk_stats(pktio_entry_t *pktio_entry, odp_pktio_stats_t *stats)
 
 static int dpdk_stats_reset(pktio_entry_t *pktio_entry)
 {
-	rte_eth_stats_reset(__retrieve_op_data(pktio_entry)->port_id);
+	pktio_ops_dpdk_data_t *pkt_dpdk =
+		odp_ops_data(pktio_entry, dpdk);
+
+	rte_eth_stats_reset(pkt_dpdk->port_id);
 	return 0;
 }
 
