Linux 6.9-rc1
[linux-2.6-microblaze.git] / drivers / net / ethernet / mellanox / mlx5 / core / fs_core.c
index 6b069fa..e6bfa7e 100644 (file)
                           LEFTOVERS_NUM_PRIOS)
 
 #define KERNEL_RX_MACSEC_NUM_PRIOS  1
-#define KERNEL_RX_MACSEC_NUM_LEVELS 2
+#define KERNEL_RX_MACSEC_NUM_LEVELS 3
 #define KERNEL_RX_MACSEC_MIN_LEVEL (BY_PASS_MIN_LEVEL + KERNEL_RX_MACSEC_NUM_PRIOS)
 
 #define ETHTOOL_PRIO_NUM_LEVELS 1
 #define ETHTOOL_NUM_PRIOS 11
 #define ETHTOOL_MIN_LEVEL (KERNEL_MIN_LEVEL + ETHTOOL_NUM_PRIOS)
 /* Promiscuous, Vlan, mac, ttc, inner ttc, {UDP/ANY/aRFS/accel/{esp, esp_err}}, IPsec policy,
- * IPsec RoCE policy
+ * {IPsec RoCE MPV,Alias table},IPsec RoCE policy
  */
-#define KERNEL_NIC_PRIO_NUM_LEVELS 9
+#define KERNEL_NIC_PRIO_NUM_LEVELS 11
 #define KERNEL_NIC_NUM_PRIOS 1
 /* One more level for tc */
 #define KERNEL_MIN_LEVEL (KERNEL_NIC_PRIO_NUM_LEVELS + 1)
 #define LAG_MIN_LEVEL (OFFLOADS_MIN_LEVEL + KERNEL_RX_MACSEC_MIN_LEVEL + 1)
 
 #define KERNEL_TX_IPSEC_NUM_PRIOS  1
-#define KERNEL_TX_IPSEC_NUM_LEVELS 3
+#define KERNEL_TX_IPSEC_NUM_LEVELS 4
 #define KERNEL_TX_IPSEC_MIN_LEVEL        (KERNEL_TX_IPSEC_NUM_LEVELS)
 
 #define KERNEL_TX_MACSEC_NUM_PRIOS  1
@@ -224,22 +224,27 @@ static struct init_tree_node egress_root_fs = {
 
 enum {
        RDMA_RX_IPSEC_PRIO,
+       RDMA_RX_MACSEC_PRIO,
        RDMA_RX_COUNTERS_PRIO,
        RDMA_RX_BYPASS_PRIO,
        RDMA_RX_KERNEL_PRIO,
 };
 
 #define RDMA_RX_IPSEC_NUM_PRIOS 1
-#define RDMA_RX_IPSEC_NUM_LEVELS 2
+#define RDMA_RX_IPSEC_NUM_LEVELS 4
 #define RDMA_RX_IPSEC_MIN_LEVEL  (RDMA_RX_IPSEC_NUM_LEVELS)
 
 #define RDMA_RX_BYPASS_MIN_LEVEL MLX5_BY_PASS_NUM_REGULAR_PRIOS
 #define RDMA_RX_KERNEL_MIN_LEVEL (RDMA_RX_BYPASS_MIN_LEVEL + 1)
 #define RDMA_RX_COUNTERS_MIN_LEVEL (RDMA_RX_KERNEL_MIN_LEVEL + 2)
 
+#define RDMA_RX_MACSEC_NUM_PRIOS 1
+#define RDMA_RX_MACSEC_PRIO_NUM_LEVELS 2
+#define RDMA_RX_MACSEC_MIN_LEVEL  (RDMA_RX_COUNTERS_MIN_LEVEL + RDMA_RX_MACSEC_NUM_PRIOS)
+
 static struct init_tree_node rdma_rx_root_fs = {
        .type = FS_TYPE_NAMESPACE,
-       .ar_size = 4,
+       .ar_size = 5,
        .children = (struct init_tree_node[]) {
                [RDMA_RX_IPSEC_PRIO] =
                ADD_PRIO(0, RDMA_RX_IPSEC_MIN_LEVEL, 0,
@@ -247,6 +252,12 @@ static struct init_tree_node rdma_rx_root_fs = {
                         ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
                                ADD_MULTIPLE_PRIO(RDMA_RX_IPSEC_NUM_PRIOS,
                                                  RDMA_RX_IPSEC_NUM_LEVELS))),
+               [RDMA_RX_MACSEC_PRIO] =
+               ADD_PRIO(0, RDMA_RX_MACSEC_MIN_LEVEL, 0,
+                        FS_CHAINING_CAPS,
+                        ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                               ADD_MULTIPLE_PRIO(RDMA_RX_MACSEC_NUM_PRIOS,
+                                                 RDMA_RX_MACSEC_PRIO_NUM_LEVELS))),
                [RDMA_RX_COUNTERS_PRIO] =
                ADD_PRIO(0, RDMA_RX_COUNTERS_MIN_LEVEL, 0,
                         FS_CHAINING_CAPS,
@@ -270,19 +281,24 @@ static struct init_tree_node rdma_rx_root_fs = {
 enum {
        RDMA_TX_COUNTERS_PRIO,
        RDMA_TX_IPSEC_PRIO,
+       RDMA_TX_MACSEC_PRIO,
        RDMA_TX_BYPASS_PRIO,
 };
 
 #define RDMA_TX_BYPASS_MIN_LEVEL MLX5_BY_PASS_NUM_PRIOS
 #define RDMA_TX_COUNTERS_MIN_LEVEL (RDMA_TX_BYPASS_MIN_LEVEL + 1)
 
-#define RDMA_TX_IPSEC_NUM_PRIOS 1
+#define RDMA_TX_IPSEC_NUM_PRIOS 2
 #define RDMA_TX_IPSEC_PRIO_NUM_LEVELS 1
 #define RDMA_TX_IPSEC_MIN_LEVEL  (RDMA_TX_COUNTERS_MIN_LEVEL + RDMA_TX_IPSEC_NUM_PRIOS)
 
+#define RDMA_TX_MACSEC_NUM_PRIOS 1
+#define RDMA_TX_MACESC_PRIO_NUM_LEVELS 1
+#define RDMA_TX_MACSEC_MIN_LEVEL  (RDMA_TX_COUNTERS_MIN_LEVEL + RDMA_TX_MACSEC_NUM_PRIOS)
+
 static struct init_tree_node rdma_tx_root_fs = {
        .type = FS_TYPE_NAMESPACE,
-       .ar_size = 3,
+       .ar_size = 4,
        .children = (struct init_tree_node[]) {
                [RDMA_TX_COUNTERS_PRIO] =
                ADD_PRIO(0, RDMA_TX_COUNTERS_MIN_LEVEL, 0,
@@ -296,7 +312,12 @@ static struct init_tree_node rdma_tx_root_fs = {
                         ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
                                ADD_MULTIPLE_PRIO(RDMA_TX_IPSEC_NUM_PRIOS,
                                                  RDMA_TX_IPSEC_PRIO_NUM_LEVELS))),
-
+               [RDMA_TX_MACSEC_PRIO] =
+               ADD_PRIO(0, RDMA_TX_MACSEC_MIN_LEVEL, 0,
+                        FS_CHAINING_CAPS,
+                        ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                               ADD_MULTIPLE_PRIO(RDMA_TX_MACSEC_NUM_PRIOS,
+                                                 RDMA_TX_MACESC_PRIO_NUM_LEVELS))),
                [RDMA_TX_BYPASS_PRIO] =
                ADD_PRIO(0, RDMA_TX_BYPASS_MIN_LEVEL, 0,
                         FS_CHAINING_CAPS_RDMA_TX,
@@ -1122,7 +1143,7 @@ int mlx5_modify_rule_destination(struct mlx5_flow_handle *handle,
        }
 
        for (i = 0; i < handle->num_rules; i++) {
-               if (mlx5_flow_dests_cmp(new_dest, &handle->rule[i]->dest_attr))
+               if (mlx5_flow_dests_cmp(old_dest, &handle->rule[i]->dest_attr))
                        return _mlx5_modify_rule_destination(handle->rule[i],
                                                             new_dest);
        }
@@ -2466,6 +2487,14 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
                root_ns = steering->rdma_tx_root_ns;
                prio = RDMA_TX_IPSEC_PRIO;
                break;
+       case MLX5_FLOW_NAMESPACE_RDMA_RX_MACSEC:
+               root_ns = steering->rdma_rx_root_ns;
+               prio = RDMA_RX_MACSEC_PRIO;
+               break;
+       case MLX5_FLOW_NAMESPACE_RDMA_TX_MACSEC:
+               root_ns = steering->rdma_tx_root_ns;
+               prio = RDMA_TX_MACSEC_PRIO;
+               break;
        default: /* Must be NIC RX */
                WARN_ON(!is_nic_rx_ns(type));
                root_ns = steering->root_ns;
@@ -3050,6 +3079,12 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
        if (err)
                goto out_err;
 
+       maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_CRYPTO_INGRESS, 3);
+       if (IS_ERR(maj_prio)) {
+               err = PTR_ERR(maj_prio);
+               goto out_err;
+       }
+
        err = create_fdb_fast_path(steering);
        if (err)
                goto out_err;
@@ -3072,6 +3107,12 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
                goto out_err;
        }
 
+       maj_prio = fs_create_prio(&steering->fdb_root_ns->ns, FDB_CRYPTO_EGRESS, 3);
+       if (IS_ERR(maj_prio)) {
+               err = PTR_ERR(maj_prio);
+               goto out_err;
+       }
+
        /* We put this priority last, knowing that nothing will get here
         * unless explicitly forwarded to. This is possible because the
         * slow path tables have catch all rules and nothing gets passed