diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 498f80c89..716c9d9a5 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -304,6 +304,9 @@ mlx5_dev_close(struct rte_eth_dev *dev)
 	if (ret)
 		DRV_LOG(WARNING, "port %u some flows still remain",
 			dev->data->port_id);
+	if (!priv->representor &&
+	    priv->domain_id != RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID)
+		claim_zero(rte_eth_switch_domain_free(priv->domain_id));
 	memset(priv, 0, sizeof(*priv));
 }
 
@@ -648,6 +651,10 @@ mlx5_uar_init_secondary(struct rte_eth_dev *dev)
  *   Verbs device attributes.
  * @param port
  *   Verbs port to use (indexed from 1).
+ * @param master
+ *   Master device in case @p ibv_dev is a port representor.
+ * @param rep_id
+ *   Representor identifier when @p master is non-NULL.
  *
  * @return
  *   A valid Ethernet device object on success, NULL otherwise and rte_errno
@@ -658,7 +665,9 @@ mlx5_dev_spawn_one(struct rte_device *dpdk_dev,
 		   struct ibv_device *ibv_dev,
 		   int vf,
 		   const struct ibv_device_attr_ex *attr,
-		   unsigned int port)
+		   unsigned int port,
+		   struct rte_eth_dev *master,
+		   unsigned int rep_id)
 {
 	struct ibv_context *ctx;
 	struct ibv_port_attr port_attr;
@@ -802,11 +811,14 @@ mlx5_dev_spawn_one(struct rte_device *dpdk_dev,
 		" old OFED/rdma-core version or firmware configuration");
 #endif
 	config.mpls_en = mpls_en;
-	if (attr->orig_attr.phys_port_cnt > 1)
-		snprintf(name, sizeof(name), "%s port %u",
-			 dpdk_dev->name, port);
+	if (!master)
+		snprintf(name, sizeof(name), "net_%s_0", dpdk_dev->name);
 	else
-		snprintf(name, sizeof(name), "%s", dpdk_dev->name);
+		snprintf(name, sizeof(name), "net_%s_representor_%u",
+			 dpdk_dev->name, rep_id);
+	if (attr->orig_attr.phys_port_cnt > 1)
+		snprintf(name, sizeof(name), "%s_port_%u", name, port);
+	DRV_LOG(DEBUG, "naming Ethernet device \"%s\"", name);
 	if (rte_eal_process_type() == RTE_PROC_SECONDARY) {
 		eth_dev = rte_eth_dev_attach_secondary(name);
 		if (eth_dev == NULL) {
@@ -883,6 +895,30 @@ mlx5_dev_spawn_one(struct rte_device *dpdk_dev,
 	priv->port = port;
 	priv->pd = pd;
 	priv->mtu = ETHER_MTU;
+	/*
+	 * Allocate a switch domain for master devices and share it with
+	 * port representors.
+	 */
+	if (!master) {
+		priv->representor = 0;
+		priv->master_id = -1; /* Updated once known. */
+		priv->domain_id = RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID;
+		priv->rep_id = -1; /* Dummy unique value. */
+		err = rte_eth_switch_domain_alloc(&priv->domain_id);
+		if (err) {
+			err = rte_errno;
+			DRV_LOG(ERR, "unable to allocate switch domain: %s",
+				strerror(rte_errno));
+			goto error;
+		}
+	} else {
+		priv->representor = 1;
+		priv->master_id =
+			((struct priv *)master->data->dev_private)->master_id;
+		priv->domain_id =
+			((struct priv *)master->data->dev_private)->domain_id;
+		priv->rep_id = rep_id;
+	}
 	err = mlx5_args(&config, dpdk_dev->devargs);
 	if (err) {
 		err = rte_errno;
@@ -964,6 +1000,18 @@ mlx5_dev_spawn_one(struct rte_device *dpdk_dev,
 		err = ENOMEM;
 		goto error;
 	}
+	/*
+	 * Now that eth_dev is allocated and its port ID is known, make
+	 * non-representor ports target their own port ID as master for
+	 * convenience.
+	 *
+	 * Master port ID is already set for actual representors. Those only
+	 * need the right device flag.
+	 */
+	if (!master)
+		priv->master_id = eth_dev->data->port_id;
+	else
+		eth_dev->data->dev_flags |= RTE_ETH_DEV_REPRESENTOR;
 	eth_dev->data->dev_private = priv;
 	priv->dev_data = eth_dev->data;
 	eth_dev->data->mac_addrs = priv->mac;
@@ -1083,8 +1131,12 @@ mlx5_dev_spawn_one(struct rte_device *dpdk_dev,
 	rte_rwlock_write_unlock(&mlx5_shared_data->mem_event_rwlock);
 	return eth_dev;
 error:
-	if (priv)
+	if (priv) {
+		if (!priv->representor &&
+		    priv->domain_id != RTE_ETH_DEV_SWITCH_DOMAIN_ID_INVALID)
+			claim_zero(rte_eth_switch_domain_free(priv->domain_id));
 		rte_free(priv);
+	}
 	if (pd)
 		claim_zero(mlx5_glue->dealloc_pd(pd));
 	if (eth_dev)
@@ -1097,12 +1149,14 @@ mlx5_dev_spawn_one(struct rte_device *dpdk_dev,
 }
 
 /**
- * Spawn Ethernet devices from Verbs information, one per detected port.
+ * Spawn Ethernet devices from Verbs information, one per detected port and
+ * port representor.
  *
  * @param dpdk_dev
  *   Backing DPDK device.
  * @param ibv_dev
- *   Verbs device.
+ *   NULL-terminated list of Verbs devices. First entry is the master device
+ *   (mandatory), followed by optional representors.
  * @param vf
  *   If nonzero, enable VF-specific features.
  *
@@ -1113,17 +1167,21 @@ mlx5_dev_spawn_one(struct rte_device *dpdk_dev,
  */
 static struct rte_eth_dev **
 mlx5_dev_spawn(struct rte_device *dpdk_dev,
-	       struct ibv_device *ibv_dev,
+	       struct ibv_device **ibv_dev,
 	       int vf)
 {
 	struct rte_eth_dev **eth_list = NULL;
 	struct ibv_context *ctx;
 	struct ibv_device_attr_ex attr;
+	void *tmp;
 	unsigned int i;
+	unsigned int j = 0;
+	unsigned int n = 0;
 	int ret;
 
+next:
 	errno = 0;
-	ctx = mlx5_glue->open_device(ibv_dev);
+	ctx = mlx5_glue->open_device(ibv_dev[j]);
 	if (!ctx) {
 		rte_errno = errno ? errno : ENODEV;
 		if (rte_errno == ENODEV)
@@ -1132,7 +1190,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
 		else
 			DRV_LOG(ERR,
 				"cannot use device, are drivers up to date?");
-		return NULL;
+		goto error;
 	}
 	ret = mlx5_glue->query_device_ex(ctx, NULL, &attr);
 	mlx5_glue->close_device(ctx);
@@ -1140,34 +1198,42 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev,
 		rte_errno = ret;
 		DRV_LOG(ERR, "unable to query device information: %s",
 			strerror(rte_errno));
-		return NULL;
+		goto error;
 	}
-	DRV_LOG(INFO, "%u port(s) detected", attr.orig_attr.phys_port_cnt);
-	eth_list = malloc(sizeof(*eth_list) *
-			  (attr.orig_attr.phys_port_cnt + 1));
-	if (!eth_list) {
+	DRV_LOG(INFO, "%u port(s) detected on \"%s\"",
+		attr.orig_attr.phys_port_cnt, ibv_dev[j]->name);
+	tmp = realloc(eth_list, sizeof(*eth_list) *
+		      (n + attr.orig_attr.phys_port_cnt + 1));
+	if (!tmp) {
 		rte_errno = errno;
-		return NULL;
+		goto error;
 	}
+	eth_list = tmp;
 	for (i = 0; i < attr.orig_attr.phys_port_cnt; ++i) {
-		eth_list[i] = mlx5_dev_spawn_one(dpdk_dev, ibv_dev, vf,
-						 &attr, i + 1);
-		if (eth_list[i])
-			continue;
-		/* Save rte_errno and roll back in case of failure. */
-		ret = rte_errno;
-		while (i--) {
-			mlx5_dev_close(eth_list[i]);
-			if (rte_eal_process_type() == RTE_PROC_PRIMARY)
-				rte_free(eth_list[i]->data->dev_private);
-			claim_zero(rte_eth_dev_release_port(eth_list[i]));
-		}
-		free(eth_list);
-		rte_errno = ret;
-		return NULL;
+		eth_list[n] = mlx5_dev_spawn_one(dpdk_dev, ibv_dev[j], vf,
+						 &attr, i + 1,
+						 j ? eth_list[0] : NULL,
+						 j - 1);
+		if (!eth_list[n])
+			goto error;
+		++n;
 	}
-	eth_list[i] = NULL;
+	if (ibv_dev[++j])
+		goto next;
+	eth_list[n] = NULL;
 	return eth_list;
+error:
+	/* Save rte_errno and roll back in case of failure. */
+	ret = rte_errno;
+	while (n--) {
+		mlx5_dev_close(eth_list[n]);
+		if (rte_eal_process_type() == RTE_PROC_PRIMARY)
+			rte_free(eth_list[n]->data->dev_private);
+		claim_zero(rte_eth_dev_release_port(eth_list[n]));
+	}
+	free(eth_list);
+	rte_errno = ret;
+	return NULL;
 }
 
 /**
@@ -1282,7 +1348,7 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 				ibv_match[ret]->name, ret - 1);
 	}
 	if (n)
-		eth_list = mlx5_dev_spawn(&pci_dev->device, ibv_match[0], vf);
+		eth_list = mlx5_dev_spawn(&pci_dev->device, ibv_match, vf);
 	mlx5_glue->free_device_list(ibv_list);
 	if (!n) {
 		DRV_LOG(WARNING,
@@ -1302,7 +1368,11 @@ mlx5_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
 		ret = -rte_errno;
 	} else {
 		for (ret = 0; eth_list[ret]; ++ret) {
+			uint32_t restore = eth_list[ret]->data->dev_flags;
+
 			rte_eth_copy_pci_info(eth_list[ret], pci_dev);
+			/* Restore non-PCI flags cleared by the above call. */
+			eth_list[ret]->data->dev_flags |= restore;
 			rte_eth_dev_probing_finish(eth_list[ret]);
 		}
 		ret = 0;
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 997b04a33..0fe467140 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -161,6 +161,10 @@ struct priv {
 	uint16_t mtu; /* Configured MTU. */
 	uint8_t port; /* Physical port number. */
 	unsigned int isolated:1; /* Whether isolated mode is enabled. */
+	unsigned int representor:1; /* Device is a port representor. */
+	uint16_t master_id; /* DPDK port ID of switch domain master. */
+	uint16_t domain_id; /* Switch domain identifier. */
+	unsigned int rep_id; /* Port representor identifier. */
 	/* RX/TX queues. */
 	unsigned int rxqs_n; /* RX queues array size. */
 	unsigned int txqs_n; /* TX queues array size. */
@@ -209,9 +213,12 @@ int mlx5_getenv_int(const char *);
 
 /* mlx5_ethdev.c */
 
+int mlx5_get_master_ifname(const struct rte_eth_dev *dev,
+			   char (*ifname)[IF_NAMESIZE]);
 int mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE]);
 int mlx5_ifindex(const struct rte_eth_dev *dev);
-int mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr);
+int mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr,
+	       int master);
 int mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu);
 int mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep,
 		   unsigned int flags);
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 90488af33..9d579659e 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -93,7 +93,7 @@ struct ethtool_link_settings {
 #endif
 
 /**
- * Get interface name from private structure.
+ * Get master interface name from private structure.
  *
  * @param[in] dev
  *   Pointer to Ethernet device.
@@ -104,7 +104,8 @@ struct ethtool_link_settings {
  *   0 on success, a negative errno value otherwise and rte_errno is set.
  */
 int
-mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE])
+mlx5_get_master_ifname(const struct rte_eth_dev *dev,
+		       char (*ifname)[IF_NAMESIZE])
 {
 	struct priv *priv = dev->data->dev_private;
 	DIR *dir;
@@ -179,6 +180,113 @@ mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE])
 }
 
 /**
+ * Get interface name from private structure.
+ *
+ * This is a port representor-aware version of mlx5_get_master_ifname().
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet device.
+ * @param[out] ifname
+ *   Interface name output buffer.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int
+mlx5_get_ifname(const struct rte_eth_dev *dev, char (*ifname)[IF_NAMESIZE])
+{
+	struct priv *priv = dev->data->dev_private;
+	int ret;
+	char master[IF_NAMESIZE];
+	FILE *file;
+	DIR *dir;
+	uint64_t phys_switch_id;
+
+	if (!priv->representor)
+		return mlx5_get_master_ifname(dev, ifname);
+	ret = mlx5_get_master_ifname(dev, &master);
+	if (ret)
+		return ret;
+	{
+		MKSTR(path, "%s/device/net/%s/phys_switch_id",
+		      priv->ibdev_path, master);
+
+		file = fopen(path, "rb");
+	}
+	if (!file) {
+		rte_errno = errno;
+		return -rte_errno;
+	}
+	ret = fscanf(file, "%" SCNx64, &phys_switch_id);
+	fclose(file);
+	if (ret != 1) {
+		rte_errno = EINVAL;
+		return -rte_errno;
+	}
+	{
+		MKSTR(path, "%s/device/net/%s/subsystem",
+		      priv->ibdev_path, master);
+
+		dir = opendir(path);
+	}
+	if (!dir) {
+		rte_errno = errno;
+		return -rte_errno;
+	}
+	/*
+	 * Scan network interfaces to find one with matching phys_switch_id
+	 * and phys_switch_name.
+	 */
+	do {
+		struct dirent *dent;
+		uint64_t phys_switch_id_rep;
+		int rep_id;
+
+		ret = -ENOENT;
+		dent = readdir(dir);
+		if (!dent)
+			break;
+		{
+			MKSTR(path,
+			      "%s/device/net/%s/subsystem/%s/phys_switch_id",
+			      priv->ibdev_path, master, dent->d_name);
+
+			file = fopen(path, "rb");
+		}
+		if (!file)
+			continue;
+		ret = fscanf(file, "%" SCNx64, &phys_switch_id_rep);
+		fclose(file);
+		if (ret != 1)
+			continue;
+		if (phys_switch_id_rep != phys_switch_id)
+			continue;
+		{
+			MKSTR(path,
+			      "%s/device/net/%s/subsystem/%s/phys_port_name",
+			      priv->ibdev_path, master, dent->d_name);
+
+			file = fopen(path, "rb");
+		}
+		if (!file)
+			continue;
+		ret = fscanf(file, "%d", &rep_id);
+		fclose(file);
+		if (ret != 1)
+			continue;
+		if (rep_id < 0 || (unsigned int)rep_id != priv->rep_id)
+			continue;
+		strlcpy(*ifname, dent->d_name, sizeof(*ifname));
+		ret = 0;
+		break;
+	} while (1);
+	closedir(dir);
+	if (ret)
+		rte_errno = -ret;
+	return ret;
+}
+
+/**
  * Get the interface index from device name.
  *
  * @param[in] dev
@@ -214,12 +322,16 @@ mlx5_ifindex(const struct rte_eth_dev *dev)
  *   Request number to pass to ioctl().
  * @param[out] ifr
  *   Interface request structure output buffer.
+ * @param master
+ *   When device is a port representor, perform request on master device
+ *   instead.
  *
  * @return
  *   0 on success, a negative errno value otherwise and rte_errno is set.
  */
 int
-mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr)
+mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr,
+	   int master)
 {
 	int sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
 	int ret = 0;
@@ -228,7 +340,10 @@ mlx5_ifreq(const struct rte_eth_dev *dev, int req, struct ifreq *ifr)
 		rte_errno = errno;
 		return -rte_errno;
 	}
-	ret = mlx5_get_ifname(dev, &ifr->ifr_name);
+	if (master)
+		ret = mlx5_get_master_ifname(dev, &ifr->ifr_name);
+	else
+		ret = mlx5_get_ifname(dev, &ifr->ifr_name);
 	if (ret)
 		goto error;
 	ret = ioctl(sock, req, ifr);
@@ -258,7 +373,7 @@ int
 mlx5_get_mtu(struct rte_eth_dev *dev, uint16_t *mtu)
 {
 	struct ifreq request;
-	int ret = mlx5_ifreq(dev, SIOCGIFMTU, &request);
+	int ret = mlx5_ifreq(dev, SIOCGIFMTU, &request, 0);
 
 	if (ret)
 		return ret;
@@ -282,7 +397,7 @@ mlx5_set_mtu(struct rte_eth_dev *dev, uint16_t mtu)
 {
 	struct ifreq request = { .ifr_mtu = mtu, };
 
-	return mlx5_ifreq(dev, SIOCSIFMTU, &request);
+	return mlx5_ifreq(dev, SIOCSIFMTU, &request, 0);
 }
 
 /**
@@ -302,13 +417,13 @@ int
 mlx5_set_flags(struct rte_eth_dev *dev, unsigned int keep, unsigned int flags)
 {
 	struct ifreq request;
-	int ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &request);
+	int ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &request, 0);
 
 	if (ret)
 		return ret;
 	request.ifr_flags &= keep;
 	request.ifr_flags |= flags & ~keep;
-	return mlx5_ifreq(dev, SIOCSIFFLAGS, &request);
+	return mlx5_ifreq(dev, SIOCSIFFLAGS, &request, 0);
 }
 
 /**
@@ -477,6 +592,12 @@ mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info)
 	info->speed_capa = priv->link_speed_capa;
 	info->flow_type_rss_offloads = ~MLX5_RSS_HF_MASK;
 	mlx5_set_default_params(dev, info);
+	if (rte_eth_dev_is_valid_port(priv->master_id)) {
+		info->switch_info.name =
+			rte_eth_devices[priv->master_id].data->name;
+		info->switch_info.domain_id = priv->domain_id;
+		info->switch_info.port_id = priv->rep_id;
+	}
 }
 
 /**
@@ -540,7 +661,7 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev,
 	int link_speed = 0;
 	int ret;
 
-	ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr);
+	ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 1);
 	if (ret) {
 		DRV_LOG(WARNING, "port %u ioctl(SIOCGIFFLAGS) failed: %s",
 			dev->data->port_id, strerror(rte_errno));
@@ -550,7 +671,7 @@ mlx5_link_update_unlocked_gset(struct rte_eth_dev *dev,
 	dev_link.link_status = ((ifr.ifr_flags & IFF_UP) &&
 				(ifr.ifr_flags & IFF_RUNNING));
 	ifr.ifr_data = (void *)&edata;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
 	if (ret) {
 		DRV_LOG(WARNING,
 			"port %u ioctl(SIOCETHTOOL, ETHTOOL_GSET) failed: %s",
@@ -611,7 +732,7 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev,
 	uint64_t sc;
 	int ret;
 
-	ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr);
+	ret = mlx5_ifreq(dev, SIOCGIFFLAGS, &ifr, 1);
 	if (ret) {
 		DRV_LOG(WARNING, "port %u ioctl(SIOCGIFFLAGS) failed: %s",
 			dev->data->port_id, strerror(rte_errno));
@@ -621,7 +742,7 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev,
 	dev_link.link_status = ((ifr.ifr_flags & IFF_UP) &&
 				(ifr.ifr_flags & IFF_RUNNING));
 	ifr.ifr_data = (void *)&gcmd;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
 	if (ret) {
 		DRV_LOG(DEBUG,
 			"port %u ioctl(SIOCETHTOOL, ETHTOOL_GLINKSETTINGS)"
@@ -638,7 +759,7 @@ mlx5_link_update_unlocked_gs(struct rte_eth_dev *dev,
 
 	*ecmd = gcmd;
 	ifr.ifr_data = (void *)ecmd;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
 	if (ret) {
 		DRV_LOG(DEBUG,
 			"port %u ioctl(SIOCETHTOOL, ETHTOOL_GLINKSETTINGS)"
@@ -801,7 +922,7 @@ mlx5_dev_get_flow_ctrl(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 	int ret;
 
 	ifr.ifr_data = (void *)&ethpause;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
 	if (ret) {
 		DRV_LOG(WARNING,
 			"port %u ioctl(SIOCETHTOOL, ETHTOOL_GPAUSEPARAM) failed:"
@@ -854,7 +975,7 @@ mlx5_dev_set_flow_ctrl(struct rte_eth_dev *dev, struct rte_eth_fc_conf *fc_conf)
 		ethpause.tx_pause = 1;
 	else
 		ethpause.tx_pause = 0;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 0);
 	if (ret) {
 		DRV_LOG(WARNING,
 			"port %u ioctl(SIOCETHTOOL, ETHTOOL_SPAUSEPARAM)"
diff --git a/drivers/net/mlx5/mlx5_mac.c b/drivers/net/mlx5/mlx5_mac.c
index 672a47619..12ee37f55 100644
--- a/drivers/net/mlx5/mlx5_mac.c
+++ b/drivers/net/mlx5/mlx5_mac.c
@@ -49,7 +49,7 @@ mlx5_get_mac(struct rte_eth_dev *dev, uint8_t (*mac)[ETHER_ADDR_LEN])
 	struct ifreq request;
 	int ret;
 
-	ret = mlx5_ifreq(dev, SIOCGIFHWADDR, &request);
+	ret = mlx5_ifreq(dev, SIOCGIFHWADDR, &request, 0);
 	if (ret)
 		return ret;
 	memcpy(mac, request.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
diff --git a/drivers/net/mlx5/mlx5_stats.c b/drivers/net/mlx5/mlx5_stats.c
index 875dd1027..91f3d474a 100644
--- a/drivers/net/mlx5/mlx5_stats.c
+++ b/drivers/net/mlx5/mlx5_stats.c
@@ -146,7 +146,7 @@ mlx5_read_dev_counters(struct rte_eth_dev *dev, uint64_t *stats)
 	et_stats->cmd = ETHTOOL_GSTATS;
 	et_stats->n_stats = xstats_ctrl->stats_n;
 	ifr.ifr_data = (caddr_t)et_stats;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
 	if (ret) {
 		DRV_LOG(WARNING,
 			"port %u unable to read statistic values from device",
@@ -194,7 +194,7 @@ mlx5_ethtool_get_stats_n(struct rte_eth_dev *dev) {
 
 	drvinfo.cmd = ETHTOOL_GDRVINFO;
 	ifr.ifr_data = (caddr_t)&drvinfo;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
 	if (ret) {
 		DRV_LOG(WARNING, "port %u unable to query number of statistics",
 			dev->data->port_id);
@@ -244,7 +244,7 @@ mlx5_xstats_init(struct rte_eth_dev *dev)
 	strings->string_set = ETH_SS_STATS;
 	strings->len = dev_stats_n;
 	ifr.ifr_data = (caddr_t)strings;
-	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr);
+	ret = mlx5_ifreq(dev, SIOCETHTOOL, &ifr, 1);
 	if (ret) {
 		DRV_LOG(WARNING, "port %u unable to get statistic names",
 			dev->data->port_id);
