xref: /dpdk/drivers/net/mlx5/mlx5_rxmode.c (revision 87af0d1e1bcc15ca414060263091a0f880ad3a86)
18fd92a66SOlivier Matz /* SPDX-License-Identifier: BSD-3-Clause
21bdbe1afSAdrien Mazarguil  * Copyright 2015 6WIND S.A.
35feecc57SShahaf Shuler  * Copyright 2015 Mellanox Technologies, Ltd
41bdbe1afSAdrien Mazarguil  */
51bdbe1afSAdrien Mazarguil 
61bdbe1afSAdrien Mazarguil #include <stddef.h>
71bdbe1afSAdrien Mazarguil #include <errno.h>
81bdbe1afSAdrien Mazarguil #include <string.h>
91bdbe1afSAdrien Mazarguil 
10df96fd0dSBruce Richardson #include <ethdev_driver.h>
111bdbe1afSAdrien Mazarguil 
129d60f545SOphir Munk #include <mlx5_glue.h>
131bdbe1afSAdrien Mazarguil #include "mlx5.h"
141bdbe1afSAdrien Mazarguil #include "mlx5_utils.h"
151bdbe1afSAdrien Mazarguil 
160d218674SAdrien Mazarguil /**
171bdbe1afSAdrien Mazarguil  * DPDK callback to enable promiscuous mode.
181bdbe1afSAdrien Mazarguil  *
191bdbe1afSAdrien Mazarguil  * @param dev
201bdbe1afSAdrien Mazarguil  *   Pointer to Ethernet device structure.
219039c812SAndrew Rybchenko  *
229039c812SAndrew Rybchenko  * @return
239039c812SAndrew Rybchenko  *   0 on success, a negative errno value otherwise and rte_errno is set.
241bdbe1afSAdrien Mazarguil  */
259039c812SAndrew Rybchenko int
mlx5_promiscuous_enable(struct rte_eth_dev * dev)261bdbe1afSAdrien Mazarguil mlx5_promiscuous_enable(struct rte_eth_dev *dev)
271bdbe1afSAdrien Mazarguil {
28dbeba4cfSThomas Monjalon 	struct mlx5_priv *priv = dev->data->dev_private;
29a6d83b6aSNélio Laranjeiro 	int ret;
30a6d83b6aSNélio Laranjeiro 
311b37f5d8SNélio Laranjeiro 	dev->data->promiscuous = 1;
3224b068adSYongseok Koh 	if (priv->isolated) {
3324b068adSYongseok Koh 		DRV_LOG(WARNING,
3424b068adSYongseok Koh 			"port %u cannot enable promiscuous mode"
3524b068adSYongseok Koh 			" in flow isolation mode",
3624b068adSYongseok Koh 			dev->data->port_id);
379039c812SAndrew Rybchenko 		return 0;
3824b068adSYongseok Koh 	}
39*87af0d1eSMichael Baum 	if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
404d18abd1SOphir Munk 		ret = mlx5_os_set_promisc(dev, 1);
419039c812SAndrew Rybchenko 		if (ret)
429039c812SAndrew Rybchenko 			return ret;
439039c812SAndrew Rybchenko 	}
44a6d83b6aSNélio Laranjeiro 	ret = mlx5_traffic_restart(dev);
45a6d83b6aSNélio Laranjeiro 	if (ret)
46a170a30dSNélio Laranjeiro 		DRV_LOG(ERR, "port %u cannot enable promiscuous mode: %s",
470f99970bSNélio Laranjeiro 			dev->data->port_id, strerror(rte_errno));
489039c812SAndrew Rybchenko 
499039c812SAndrew Rybchenko 	/*
509039c812SAndrew Rybchenko 	 * rte_eth_dev_promiscuous_enable() rollback
519039c812SAndrew Rybchenko 	 * dev->data->promiscuous in the case of failure.
529039c812SAndrew Rybchenko 	 */
539039c812SAndrew Rybchenko 	return ret;
541bdbe1afSAdrien Mazarguil }
551bdbe1afSAdrien Mazarguil 
561bdbe1afSAdrien Mazarguil /**
571bdbe1afSAdrien Mazarguil  * DPDK callback to disable promiscuous mode.
581bdbe1afSAdrien Mazarguil  *
591bdbe1afSAdrien Mazarguil  * @param dev
601bdbe1afSAdrien Mazarguil  *   Pointer to Ethernet device structure.
619039c812SAndrew Rybchenko  *
629039c812SAndrew Rybchenko  * @return
639039c812SAndrew Rybchenko  *   0 on success, a negative errno value otherwise and rte_errno is set.
641bdbe1afSAdrien Mazarguil  */
659039c812SAndrew Rybchenko int
mlx5_promiscuous_disable(struct rte_eth_dev * dev)661bdbe1afSAdrien Mazarguil mlx5_promiscuous_disable(struct rte_eth_dev *dev)
671bdbe1afSAdrien Mazarguil {
68dbeba4cfSThomas Monjalon 	struct mlx5_priv *priv = dev->data->dev_private;
69a6d83b6aSNélio Laranjeiro 	int ret;
70a6d83b6aSNélio Laranjeiro 
711b37f5d8SNélio Laranjeiro 	dev->data->promiscuous = 0;
72*87af0d1eSMichael Baum 	if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
734d18abd1SOphir Munk 		ret = mlx5_os_set_promisc(dev, 0);
749039c812SAndrew Rybchenko 		if (ret)
759039c812SAndrew Rybchenko 			return ret;
769039c812SAndrew Rybchenko 	}
77a6d83b6aSNélio Laranjeiro 	ret = mlx5_traffic_restart(dev);
78a6d83b6aSNélio Laranjeiro 	if (ret)
79a170a30dSNélio Laranjeiro 		DRV_LOG(ERR, "port %u cannot disable promiscuous mode: %s",
800f99970bSNélio Laranjeiro 			dev->data->port_id, strerror(rte_errno));
819039c812SAndrew Rybchenko 
829039c812SAndrew Rybchenko 	/*
839039c812SAndrew Rybchenko 	 * rte_eth_dev_promiscuous_disable() rollback
849039c812SAndrew Rybchenko 	 * dev->data->promiscuous in the case of failure.
859039c812SAndrew Rybchenko 	 */
869039c812SAndrew Rybchenko 	return ret;
871bdbe1afSAdrien Mazarguil }
881bdbe1afSAdrien Mazarguil 
891bdbe1afSAdrien Mazarguil /**
901bdbe1afSAdrien Mazarguil  * DPDK callback to enable allmulti mode.
911bdbe1afSAdrien Mazarguil  *
921bdbe1afSAdrien Mazarguil  * @param dev
931bdbe1afSAdrien Mazarguil  *   Pointer to Ethernet device structure.
94ca041cd4SIvan Ilchenko  *
95ca041cd4SIvan Ilchenko  * @return
96ca041cd4SIvan Ilchenko  *   0 on success, a negative errno value otherwise and rte_errno is set.
971bdbe1afSAdrien Mazarguil  */
98ca041cd4SIvan Ilchenko int
mlx5_allmulticast_enable(struct rte_eth_dev * dev)991bdbe1afSAdrien Mazarguil mlx5_allmulticast_enable(struct rte_eth_dev *dev)
1001bdbe1afSAdrien Mazarguil {
101dbeba4cfSThomas Monjalon 	struct mlx5_priv *priv = dev->data->dev_private;
102a6d83b6aSNélio Laranjeiro 	int ret;
103a6d83b6aSNélio Laranjeiro 
1046a6b6828SNélio Laranjeiro 	dev->data->all_multicast = 1;
1052547ee74SYongseok Koh 	if (priv->isolated) {
1062547ee74SYongseok Koh 		DRV_LOG(WARNING,
1072547ee74SYongseok Koh 			"port %u cannot enable allmulticast mode"
1082547ee74SYongseok Koh 			" in flow isolation mode",
1092547ee74SYongseok Koh 			dev->data->port_id);
110ca041cd4SIvan Ilchenko 		return 0;
1112547ee74SYongseok Koh 	}
112*87af0d1eSMichael Baum 	if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
1134d18abd1SOphir Munk 		ret = mlx5_os_set_allmulti(dev, 1);
114ca041cd4SIvan Ilchenko 		if (ret)
115ca041cd4SIvan Ilchenko 			goto error;
116ca041cd4SIvan Ilchenko 	}
117a6d83b6aSNélio Laranjeiro 	ret = mlx5_traffic_restart(dev);
118a6d83b6aSNélio Laranjeiro 	if (ret)
119a170a30dSNélio Laranjeiro 		DRV_LOG(ERR, "port %u cannot enable allmulicast mode: %s",
1200f99970bSNélio Laranjeiro 			dev->data->port_id, strerror(rte_errno));
121ca041cd4SIvan Ilchenko error:
122ca041cd4SIvan Ilchenko 	/*
123ca041cd4SIvan Ilchenko 	 * rte_eth_allmulticast_enable() rollback
124ca041cd4SIvan Ilchenko 	 * dev->data->all_multicast in the case of failure.
125ca041cd4SIvan Ilchenko 	 */
126ca041cd4SIvan Ilchenko 	return ret;
1271bdbe1afSAdrien Mazarguil }
1281bdbe1afSAdrien Mazarguil 
1291bdbe1afSAdrien Mazarguil /**
1301bdbe1afSAdrien Mazarguil  * DPDK callback to disable allmulti mode.
1311bdbe1afSAdrien Mazarguil  *
1321bdbe1afSAdrien Mazarguil  * @param dev
1331bdbe1afSAdrien Mazarguil  *   Pointer to Ethernet device structure.
134ca041cd4SIvan Ilchenko  *
135ca041cd4SIvan Ilchenko  * @return
136ca041cd4SIvan Ilchenko  *   0 on success, a negative errno value otherwise and rte_errno is set.
1371bdbe1afSAdrien Mazarguil  */
138ca041cd4SIvan Ilchenko int
mlx5_allmulticast_disable(struct rte_eth_dev * dev)1391bdbe1afSAdrien Mazarguil mlx5_allmulticast_disable(struct rte_eth_dev *dev)
1401bdbe1afSAdrien Mazarguil {
141dbeba4cfSThomas Monjalon 	struct mlx5_priv *priv = dev->data->dev_private;
142a6d83b6aSNélio Laranjeiro 	int ret;
143a6d83b6aSNélio Laranjeiro 
1446a6b6828SNélio Laranjeiro 	dev->data->all_multicast = 0;
145*87af0d1eSMichael Baum 	if (priv->sh->dev_cap.vf || priv->sh->dev_cap.sf) {
1464d18abd1SOphir Munk 		ret = mlx5_os_set_allmulti(dev, 0);
147ca041cd4SIvan Ilchenko 		if (ret)
148ca041cd4SIvan Ilchenko 			goto error;
149ca041cd4SIvan Ilchenko 	}
150a6d83b6aSNélio Laranjeiro 	ret = mlx5_traffic_restart(dev);
151a6d83b6aSNélio Laranjeiro 	if (ret)
152a170a30dSNélio Laranjeiro 		DRV_LOG(ERR, "port %u cannot disable allmulicast mode: %s",
1530f99970bSNélio Laranjeiro 			dev->data->port_id, strerror(rte_errno));
154ca041cd4SIvan Ilchenko error:
155ca041cd4SIvan Ilchenko 	/*
156ca041cd4SIvan Ilchenko 	 * rte_eth_allmulticast_disable() rollback
157ca041cd4SIvan Ilchenko 	 * dev->data->all_multicast in the case of failure.
158ca041cd4SIvan Ilchenko 	 */
159ca041cd4SIvan Ilchenko 	return ret;
1601bdbe1afSAdrien Mazarguil }
161