These modes are otherwise lost when device is stopped. Signed-off-by: Adrien Mazarguil <adrien.mazarguil at 6wind.com> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com> --- drivers/net/mlx5/mlx5.h | 2 ++ drivers/net/mlx5/mlx5_rxmode.c | 12 ++++-------- drivers/net/mlx5/mlx5_trigger.c | 4 ++-- 3 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 9720e96..9dcfe89 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -99,7 +99,9 @@ struct priv { uint16_t mtu; /* Configured MTU. */ uint8_t port; /* Physical port number. */ unsigned int started:1; /* Device started, flows enabled. */ + unsigned int promisc_req:1; /* Promiscuous mode requested. */ unsigned int promisc:1; /* Device in promiscuous mode. */ + unsigned int allmulti_req:1; /* All multicast mode requested. */ unsigned int allmulti:1; /* Device receives all multicast packets. */ unsigned int hw_csum:1; /* Checksum offload is supported. */ unsigned int hw_csum_l2tun:1; /* Same for L2 tunnels. */ diff --git a/drivers/net/mlx5/mlx5_rxmode.c b/drivers/net/mlx5/mlx5_rxmode.c index 1f5cd40..7fe7f0e 100644 --- a/drivers/net/mlx5/mlx5_rxmode.c +++ b/drivers/net/mlx5/mlx5_rxmode.c @@ -118,9 +118,6 @@ priv_promiscuous_enable(struct priv *priv) if (priv->promisc) return 0; - /* If device isn't started, this is all we need to do. */ - if (!priv->started) - goto end; for (i = 0; (i != priv->hash_rxqs_n); ++i) { struct hash_rxq *hash_rxq = &(*priv->hash_rxqs)[i]; int ret; @@ -135,7 +132,6 @@ priv_promiscuous_enable(struct priv *priv) } return ret; } -end: priv->promisc = 1; return 0; } @@ -153,6 +149,7 @@ mlx5_promiscuous_enable(struct rte_eth_dev *dev) int ret; priv_lock(priv); + priv->promisc_req = 1; ret = priv_promiscuous_enable(priv); if (ret) ERROR("cannot enable promiscuous mode: %s", strerror(ret)); @@ -208,6 +205,7 @@ mlx5_promiscuous_disable(struct rte_eth_dev *dev) struct priv *priv = dev->data->dev_private; priv_lock(priv); + priv->promisc_req = 0; priv_promiscuous_disable(priv); priv_unlock(priv); } @@ -267,9 +265,6 @@ priv_allmulticast_enable(struct priv *priv) if (priv->allmulti) return 0; - /* If device isn't started, this is all we need to do. */ - if (!priv->started) - goto end; for (i = 0; (i != priv->hash_rxqs_n); ++i) { struct hash_rxq *hash_rxq = &(*priv->hash_rxqs)[i]; int ret; @@ -284,7 +279,6 @@ priv_allmulticast_enable(struct priv *priv) } return ret; } -end: priv->allmulti = 1; return 0; } @@ -302,6 +296,7 @@ mlx5_allmulticast_enable(struct rte_eth_dev *dev) int ret; priv_lock(priv); + priv->allmulti_req = 1; ret = priv_allmulticast_enable(priv); if (ret) ERROR("cannot enable allmulticast mode: %s", strerror(ret)); @@ -355,6 +350,7 @@ mlx5_allmulticast_disable(struct rte_eth_dev *dev) struct priv *priv = dev->data->dev_private; priv_lock(priv); + priv->allmulti_req = 0; priv_allmulticast_disable(priv); priv_unlock(priv); } diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c index 2876ea7..233c0d8 100644 --- a/drivers/net/mlx5/mlx5_trigger.c +++ b/drivers/net/mlx5/mlx5_trigger.c @@ -71,9 +71,9 @@ mlx5_dev_start(struct rte_eth_dev *dev) err = priv_create_hash_rxqs(priv); if (!err) err = priv_mac_addrs_enable(priv); - if (!err && priv->promisc) + if (!err && priv->promisc_req) err = priv_promiscuous_enable(priv); - if (!err && priv->allmulti) + if (!err && priv->allmulti_req) err = priv_allmulticast_enable(priv); if (!err) priv->started = 1; -- 2.1.0