net/mlx5: use flow to enable all multi mode
[dpdk.git] / drivers / net / mlx5 / mlx5_rxmode.c
index f469f41..0c75889 100644 (file)
 
 /* 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",
@@ -332,7 +320,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;
@@ -359,7 +347,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);
@@ -416,19 +404,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_ctrl_flow(dev, &eth, &eth, 1));
 }
 
 /**
@@ -440,17 +426,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_ctrl_flow(dev, &eth, &eth, 0));
 }