RSS hash configuration is currently ignored by the PMD, this commits
removes the RSS feature on promiscuous mode.

This functionality will be added in a later commit.

Signed-off-by: Nelio Laranjeiro <nelio.laranje...@6wind.com>
---
 drivers/net/mlx5/mlx5.h         |  1 -
 drivers/net/mlx5/mlx5_rxmode.c  | 52 ++++++++++++++---------------------------
 drivers/net/mlx5/mlx5_rxq.c     |  9 +++----
 drivers/net/mlx5/mlx5_rxtx.h    |  3 ---
 drivers/net/mlx5/mlx5_trigger.c |  2 ++
 5 files changed, 23 insertions(+), 44 deletions(-)

diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index cbf8849..ba461a3 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -107,7 +107,6 @@ struct priv {
        /* Device properties. */
        uint16_t mtu; /* Configured MTU. */
        uint8_t port; /* Physical port number. */
-       unsigned int allmulti_req:1; /* All multicast mode requested. */
        unsigned int hw_csum:1; /* Checksum offload is supported. */
        unsigned int hw_csum_l2tun:1; /* Same for L2 tunnels. */
        unsigned int hw_vlan_strip:1; /* VLAN stripping is supported. */
diff --git a/drivers/net/mlx5/mlx5_rxmode.c b/drivers/net/mlx5/mlx5_rxmode.c
index d6ca907..3fcfec7 100644
--- a/drivers/net/mlx5/mlx5_rxmode.c
+++ b/drivers/net/mlx5/mlx5_rxmode.c
@@ -53,18 +53,6 @@
 
 /* Initialization data for special flows. */
 static const struct special_flow_init special_flow_init[] = {
-       [HASH_RXQ_FLOW_TYPE_ALLMULTI] = {
-               .dst_mac_val = "\x01\x00\x00\x00\x00\x00",
-               .dst_mac_mask = "\x01\x00\x00\x00\x00\x00",
-               .hash_types =
-                       1 << HASH_RXQ_UDPV4 |
-                       1 << HASH_RXQ_IPV4 |
-                       1 << HASH_RXQ_UDPV6 |
-                       1 << HASH_RXQ_IPV6 |
-                       1 << HASH_RXQ_ETH |
-                       0,
-               .per_vlan = 0,
-       },
        [HASH_RXQ_FLOW_TYPE_BROADCAST] = {
                .dst_mac_val = "\xff\xff\xff\xff\xff\xff",
                .dst_mac_mask = "\xff\xff\xff\xff\xff\xff",
@@ -328,7 +316,7 @@ priv_special_flow_enable_all(struct priv *priv)
 
        if (priv->isolated)
                return 0;
-       for (flow_type = HASH_RXQ_FLOW_TYPE_ALLMULTI;
+       for (flow_type = HASH_RXQ_FLOW_TYPE_BROADCAST;
                        flow_type != HASH_RXQ_FLOW_TYPE_MAC;
                        ++flow_type) {
                int ret;
@@ -355,7 +343,7 @@ priv_special_flow_disable_all(struct priv *priv)
 {
        enum hash_rxq_flow_type flow_type;
 
-       for (flow_type = HASH_RXQ_FLOW_TYPE_ALLMULTI;
+       for (flow_type = HASH_RXQ_FLOW_TYPE_BROADCAST;
                        flow_type != HASH_RXQ_FLOW_TYPE_MAC;
                        ++flow_type)
                priv_special_flow_disable(priv, flow_type);
@@ -412,19 +400,17 @@ mlx5_promiscuous_disable(struct rte_eth_dev *dev)
 void
 mlx5_allmulticast_enable(struct rte_eth_dev *dev)
 {
-       struct priv *priv = dev->data->dev_private;
-       int ret;
+       struct rte_flow_item_eth eth = {
+               .dst.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+               .src.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+               .type = 0,
+       };
 
        if (mlx5_is_secondary())
                return;
-
-       priv_lock(priv);
-       priv->allmulti_req = 1;
-       ret = priv_rehash_flows(priv);
-       if (ret)
-               ERROR("error while enabling allmulticast mode: %s",
-                     strerror(ret));
-       priv_unlock(priv);
+       dev->data->all_multicast = 1;
+       if (dev->data->dev_started)
+               claim_zero(mlx5_flow_ctrl(dev, &eth, &eth, 3, 1));
 }
 
 /**
@@ -436,17 +422,15 @@ mlx5_allmulticast_enable(struct rte_eth_dev *dev)
 void
 mlx5_allmulticast_disable(struct rte_eth_dev *dev)
 {
-       struct priv *priv = dev->data->dev_private;
-       int ret;
+       struct rte_flow_item_eth eth = {
+               .dst.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+               .src.addr_bytes = "\x01\x00\x00\x00\x00\x00",
+               .type = 0,
+       };
 
        if (mlx5_is_secondary())
                return;
-
-       priv_lock(priv);
-       priv->allmulti_req = 0;
-       ret = priv_rehash_flows(priv);
-       if (ret)
-               ERROR("error while disabling allmulticast mode: %s",
-                     strerror(ret));
-       priv_unlock(priv);
+       dev->data->all_multicast = 0;
+       if (dev->data->dev_started)
+               claim_zero(mlx5_flow_ctrl(dev, &eth, &eth, 3, 0));
 }
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index 5f9e84a..e5ec57f 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -573,16 +573,13 @@ priv_destroy_hash_rxqs(struct priv *priv)
 int
 priv_allow_flow_type(struct priv *priv, enum hash_rxq_flow_type type)
 {
+       (void)priv;
        switch (type) {
-       case HASH_RXQ_FLOW_TYPE_ALLMULTI:
-               return !!priv->allmulti_req;
        case HASH_RXQ_FLOW_TYPE_BROADCAST:
        case HASH_RXQ_FLOW_TYPE_IPV6MULTI:
-               /* If allmulti is enabled, broadcast and ipv6multi
-                * are unnecessary. */
-               return !priv->allmulti_req;
        case HASH_RXQ_FLOW_TYPE_MAC:
                return 1;
+               return 1;
        default:
                /* Unsupported flow type is not allowed. */
                return 0;
@@ -604,7 +601,7 @@ priv_rehash_flows(struct priv *priv)
 {
        enum hash_rxq_flow_type i;
 
-       for (i = HASH_RXQ_FLOW_TYPE_ALLMULTI;
+       for (i = HASH_RXQ_FLOW_TYPE_BROADCAST;
                        i != RTE_DIM((*priv->hash_rxqs)[0].special_flow);
                        ++i)
                if (!priv_allow_flow_type(priv, i)) {
diff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h
index 166cd5d..4d26726 100644
--- a/drivers/net/mlx5/mlx5_rxtx.h
+++ b/drivers/net/mlx5/mlx5_rxtx.h
@@ -233,7 +233,6 @@ struct special_flow_init {
 };
 
 enum hash_rxq_flow_type {
-       HASH_RXQ_FLOW_TYPE_ALLMULTI,
        HASH_RXQ_FLOW_TYPE_BROADCAST,
        HASH_RXQ_FLOW_TYPE_IPV6MULTI,
        HASH_RXQ_FLOW_TYPE_MAC,
@@ -244,8 +243,6 @@ static inline const char *
 hash_rxq_flow_type_str(enum hash_rxq_flow_type flow_type)
 {
        switch (flow_type) {
-       case HASH_RXQ_FLOW_TYPE_ALLMULTI:
-               return "allmulticast";
        case HASH_RXQ_FLOW_TYPE_BROADCAST:
                return "broadcast";
        case HASH_RXQ_FLOW_TYPE_IPV6MULTI:
diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
index ead8238..6370d6f 100644
--- a/drivers/net/mlx5/mlx5_trigger.c
+++ b/drivers/net/mlx5/mlx5_trigger.c
@@ -167,6 +167,8 @@ mlx5_dev_start(struct rte_eth_dev *dev)
        }
        if (dev->data->promiscuous)
               mlx5_promiscuous_enable(dev);
+       else if (dev->data->all_multicast)
+               mlx5_allmulticast_enable(dev);
        err = priv_flow_start(priv, &priv->ctrl_flows);
        if (err) {
                ERROR("%p: an error occurred while configuring control flows:"
-- 
2.1.4

Reply via email to