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