Merge tag 'linux-can-next-for-6.3-20230208' of git://git.kernel.org/pub/scm/linux...
authorJakub Kicinski <kuba@kernel.org>
Thu, 9 Feb 2023 05:32:19 +0000 (21:32 -0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 9 Feb 2023 05:32:20 +0000 (21:32 -0800)
Marc Kleine-Budde says:

====================
can-next 2023-02-08

The 1st patch is by Oliver Hartkopp and cleans up the CAN_RAW's
raw_setsockopt() for CAN_RAW_FD_FRAMES.

The 2nd patch is by me and fixes the compilation if
CONFIG_CAN_CALC_BITTIMING is disabled. (Problem introduced in last
pull request to next-next.)

* tag 'linux-can-next-for-6.3-20230208' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next:
  can: bittiming: can_calc_bittiming(): add missing parameter to no-op function
  can: raw: use temp variable instead of rolling back config
====================

Link: https://lore.kernel.org/r/20230208210014.3169347-1-mkl@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
25 files changed:
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
drivers/net/ethernet/mellanox/mlx5/core/devlink.c
drivers/net/ethernet/mellanox/mlx5/core/devlink.h
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.c
drivers/net/ethernet/mellanox/mlx5/core/diag/fw_tracer.h
drivers/net/ethernet/mellanox/mlx5/core/en/port_buffer.c
drivers/net/ethernet/mellanox/mlx5/core/en/tc/act/vlan.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ktls_tx.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
drivers/net/ethernet/mellanox/mlx5/core/events.c
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
drivers/net/ethernet/mellanox/mlx5/core/health.c
drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/wangxun/libwx/wx_lib.c
include/linux/mlx5/device.h
include/linux/mlx5/driver.h
include/linux/mlx5/mlx5_ifc.h

index c669ef6e47e730dffa584e162c6fbf18ce6204d2..dc32e4518a28053b6e4e11370a03a86089f1ca14 100644 (file)
@@ -3012,26 +3012,63 @@ static void mlx5_eth_lag_cleanup(struct mlx5_ib_dev *dev)
        }
 }
 
-static int mlx5_add_netdev_notifier(struct mlx5_ib_dev *dev, u32 port_num)
+static void mlx5_netdev_notifier_register(struct mlx5_roce *roce,
+                                         struct net_device *netdev)
 {
        int err;
 
-       dev->port[port_num].roce.nb.notifier_call = mlx5_netdev_event;
-       err = register_netdevice_notifier(&dev->port[port_num].roce.nb);
-       if (err) {
-               dev->port[port_num].roce.nb.notifier_call = NULL;
-               return err;
-       }
+       if (roce->tracking_netdev)
+               return;
+       roce->tracking_netdev = netdev;
+       roce->nb.notifier_call = mlx5_netdev_event;
+       err = register_netdevice_notifier_dev_net(netdev, &roce->nb, &roce->nn);
+       WARN_ON(err);
+}
 
-       return 0;
+static void mlx5_netdev_notifier_unregister(struct mlx5_roce *roce)
+{
+       if (!roce->tracking_netdev)
+               return;
+       unregister_netdevice_notifier_dev_net(roce->tracking_netdev, &roce->nb,
+                                             &roce->nn);
+       roce->tracking_netdev = NULL;
 }
 
-static void mlx5_remove_netdev_notifier(struct mlx5_ib_dev *dev, u32 port_num)
+static int mlx5e_mdev_notifier_event(struct notifier_block *nb,
+                                    unsigned long event, void *data)
 {
-       if (dev->port[port_num].roce.nb.notifier_call) {
-               unregister_netdevice_notifier(&dev->port[port_num].roce.nb);
-               dev->port[port_num].roce.nb.notifier_call = NULL;
+       struct mlx5_roce *roce = container_of(nb, struct mlx5_roce, mdev_nb);
+       struct net_device *netdev = data;
+
+       switch (event) {
+       case MLX5_DRIVER_EVENT_UPLINK_NETDEV:
+               if (netdev)
+                       mlx5_netdev_notifier_register(roce, netdev);
+               else
+                       mlx5_netdev_notifier_unregister(roce);
+               break;
+       default:
+               return NOTIFY_DONE;
        }
+
+       return NOTIFY_OK;
+}
+
+static void mlx5_mdev_netdev_track(struct mlx5_ib_dev *dev, u32 port_num)
+{
+       struct mlx5_roce *roce = &dev->port[port_num].roce;
+
+       roce->mdev_nb.notifier_call = mlx5e_mdev_notifier_event;
+       mlx5_blocking_notifier_register(dev->mdev, &roce->mdev_nb);
+       mlx5_core_uplink_netdev_event_replay(dev->mdev);
+}
+
+static void mlx5_mdev_netdev_untrack(struct mlx5_ib_dev *dev, u32 port_num)
+{
+       struct mlx5_roce *roce = &dev->port[port_num].roce;
+
+       mlx5_blocking_notifier_unregister(dev->mdev, &roce->mdev_nb);
+       mlx5_netdev_notifier_unregister(roce);
 }
 
 static int mlx5_enable_eth(struct mlx5_ib_dev *dev)
@@ -3138,7 +3175,7 @@ static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev,
        if (mpi->mdev_events.notifier_call)
                mlx5_notifier_unregister(mpi->mdev, &mpi->mdev_events);
        mpi->mdev_events.notifier_call = NULL;
-       mlx5_remove_netdev_notifier(ibdev, port_num);
+       mlx5_mdev_netdev_untrack(ibdev, port_num);
        spin_lock(&port->mp.mpi_lock);
 
        comps = mpi->mdev_refcnt;
@@ -3196,12 +3233,7 @@ static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev,
        if (err)
                goto unbind;
 
-       err = mlx5_add_netdev_notifier(ibdev, port_num);
-       if (err) {
-               mlx5_ib_err(ibdev, "failed adding netdev notifier for port %u\n",
-                           port_num + 1);
-               goto unbind;
-       }
+       mlx5_mdev_netdev_track(ibdev, port_num);
 
        mpi->mdev_events.notifier_call = mlx5_ib_event_slave_port;
        mlx5_notifier_register(mpi->mdev, &mpi->mdev_events);
@@ -3909,9 +3941,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
                port_num = mlx5_core_native_port_num(dev->mdev) - 1;
 
                /* Register only for native ports */
-               err = mlx5_add_netdev_notifier(dev, port_num);
-               if (err)
-                       return err;
+               mlx5_mdev_netdev_track(dev, port_num);
 
                err = mlx5_enable_eth(dev);
                if (err)
@@ -3920,7 +3950,7 @@ static int mlx5_ib_roce_init(struct mlx5_ib_dev *dev)
 
        return 0;
 cleanup:
-       mlx5_remove_netdev_notifier(dev, port_num);
+       mlx5_mdev_netdev_untrack(dev, port_num);
        return err;
 }
 
@@ -3938,7 +3968,7 @@ static void mlx5_ib_roce_cleanup(struct mlx5_ib_dev *dev)
                mlx5_disable_eth(dev);
 
                port_num = mlx5_core_native_port_num(dev->mdev) - 1;
-               mlx5_remove_netdev_notifier(dev, port_num);
+               mlx5_mdev_netdev_untrack(dev, port_num);
        }
 }
 
index 8b91babdd4c084f5328cddd6c2d26ff081c0b9a5..7394e7f36ba73720c91be81c996f0d3d0d587e18 100644 (file)
@@ -832,6 +832,9 @@ struct mlx5_roce {
        rwlock_t                netdev_lock;
        struct net_device       *netdev;
        struct notifier_block   nb;
+       struct netdev_net_notifier nn;
+       struct notifier_block   mdev_nb;
+       struct net_device       *tracking_netdev;
        atomic_t                tx_port_affinity;
        enum ib_port_state last_port_state;
        struct mlx5_ib_dev      *dev;
index 63fb7912b0325a7bf90d7472e00fcd1837030d2e..b742e04deec136ce48ffe3e4a6c957cf617f5bdc 100644 (file)
@@ -268,9 +268,10 @@ static int mlx5_devlink_trap_action_set(struct devlink *devlink,
                                        struct netlink_ext_ack *extack)
 {
        struct mlx5_core_dev *dev = devlink_priv(devlink);
+       struct mlx5_devlink_trap_event_ctx trap_event_ctx;
        enum devlink_trap_action action_orig;
        struct mlx5_devlink_trap *dl_trap;
-       int err = 0;
+       int err;
 
        if (is_mdev_switchdev_mode(dev)) {
                NL_SET_ERR_MSG_MOD(extack, "Devlink traps can't be set in switchdev mode");
@@ -280,26 +281,25 @@ static int mlx5_devlink_trap_action_set(struct devlink *devlink,
        dl_trap = mlx5_find_trap_by_id(dev, trap->id);
        if (!dl_trap) {
                mlx5_core_err(dev, "Devlink trap: Set action on invalid trap id 0x%x", trap->id);
-               err = -EINVAL;
-               goto out;
+               return -EINVAL;
        }
 
-       if (action != DEVLINK_TRAP_ACTION_DROP && action != DEVLINK_TRAP_ACTION_TRAP) {
-               err = -EOPNOTSUPP;
-               goto out;
-       }
+       if (action != DEVLINK_TRAP_ACTION_DROP && action != DEVLINK_TRAP_ACTION_TRAP)
+               return -EOPNOTSUPP;
 
        if (action == dl_trap->trap.action)
-               goto out;
+               return 0;
 
        action_orig = dl_trap->trap.action;
        dl_trap->trap.action = action;
+       trap_event_ctx.trap = &dl_trap->trap;
+       trap_event_ctx.err = 0;
        err = mlx5_blocking_notifier_call_chain(dev, MLX5_DRIVER_EVENT_TYPE_TRAP,
-                                               &dl_trap->trap);
-       if (err)
+                                               &trap_event_ctx);
+       if (err == NOTIFY_BAD)
                dl_trap->trap.action = action_orig;
-out:
-       return err;
+
+       return trap_event_ctx.err;
 }
 
 static const struct devlink_ops mlx5_devlink_ops = {
index 1c1b62ee84bba793acecec47321b3731e902e562..b561107e0df1da8323fbb3fbbb81acf34f6c6ed8 100644 (file)
@@ -24,6 +24,11 @@ struct mlx5_devlink_trap {
        struct list_head list;
 };
 
+struct mlx5_devlink_trap_event_ctx {
+       struct mlx5_trap_ctx *trap;
+       int err;
+};
+
 struct mlx5_core_dev;
 void mlx5_devlink_trap_report(struct mlx5_core_dev *dev, int trap_id, struct sk_buff *skb,
                              struct devlink_port *dl_port);
index 21831386b26e848449cd3040e8b0662f84231cd8..f7864d51d4c450d7b42181b52dd17b247e81b81a 100644 (file)
@@ -233,6 +233,8 @@ static int mlx5_fw_tracer_allocate_strings_db(struct mlx5_fw_tracer *tracer)
        int i;
 
        for (i = 0; i < num_string_db; i++) {
+               if (!string_db_size_out[i])
+                       continue;
                tracer->str_db.buffer[i] = kzalloc(string_db_size_out[i], GFP_KERNEL);
                if (!tracer->str_db.buffer[i])
                        goto free_strings_db;
@@ -278,6 +280,8 @@ static void mlx5_tracer_read_strings_db(struct work_struct *work)
        }
 
        for (i = 0; i < num_string_db; i++) {
+               if (!tracer->str_db.size_out[i])
+                       continue;
                offset = 0;
                MLX5_SET(mtrc_stdb, in, string_db_index, i);
                num_of_reads = tracer->str_db.size_out[i] /
@@ -384,6 +388,8 @@ static struct tracer_string_format *mlx5_tracer_get_string(struct mlx5_fw_tracer
        str_ptr = tracer_event->string_event.string_param;
 
        for (i = 0; i < tracer->str_db.num_string_db; i++) {
+               if (!tracer->str_db.size_out[i])
+                       continue;
                if (str_ptr > tracer->str_db.base_address_out[i] &&
                    str_ptr < tracer->str_db.base_address_out[i] +
                    tracer->str_db.size_out[i]) {
@@ -459,6 +465,7 @@ static void poll_trace(struct mlx5_fw_tracer *tracer,
 
        tracer_event->event_id = MLX5_GET(tracer_event, trace, event_id);
        tracer_event->lost_event = MLX5_GET(tracer_event, trace, lost);
+       tracer_event->out = trace;
 
        switch (tracer_event->event_id) {
        case TRACER_EVENT_TYPE_TIMESTAMP:
@@ -581,6 +588,26 @@ void mlx5_tracer_print_trace(struct tracer_string_format *str_frmt,
        mlx5_tracer_clean_message(str_frmt);
 }
 
+static int mlx5_tracer_handle_raw_string(struct mlx5_fw_tracer *tracer,
+                                        struct tracer_event *tracer_event)
+{
+       struct tracer_string_format *cur_string;
+
+       cur_string = mlx5_tracer_message_insert(tracer, tracer_event);
+       if (!cur_string)
+               return -1;
+
+       cur_string->event_id = tracer_event->event_id;
+       cur_string->timestamp = tracer_event->string_event.timestamp;
+       cur_string->lost = tracer_event->lost_event;
+       cur_string->string = "0x%08x%08x";
+       cur_string->num_of_params = 2;
+       cur_string->params[0] = upper_32_bits(*tracer_event->out);
+       cur_string->params[1] = lower_32_bits(*tracer_event->out);
+       list_add_tail(&cur_string->list, &tracer->ready_strings_list);
+       return 0;
+}
+
 static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
                                           struct tracer_event *tracer_event)
 {
@@ -589,7 +616,7 @@ static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
        if (tracer_event->string_event.tdsn == 0) {
                cur_string = mlx5_tracer_get_string(tracer, tracer_event);
                if (!cur_string)
-                       return -1;
+                       return mlx5_tracer_handle_raw_string(tracer, tracer_event);
 
                cur_string->num_of_params = mlx5_tracer_get_num_of_params(cur_string->string);
                cur_string->last_param_num = 0;
@@ -602,9 +629,9 @@ static int mlx5_tracer_handle_string_trace(struct mlx5_fw_tracer *tracer,
        } else {
                cur_string = mlx5_tracer_message_get(tracer, tracer_event);
                if (!cur_string) {
-                       pr_debug("%s Got string event for unknown string tdsm: %d\n",
+                       pr_debug("%s Got string event for unknown string tmsn: %d\n",
                                 __func__, tracer_event->string_event.tmsn);
-                       return -1;
+                       return mlx5_tracer_handle_raw_string(tracer, tracer_event);
                }
                cur_string->last_param_num += 1;
                if (cur_string->last_param_num > TRACER_MAX_PARAMS) {
@@ -930,6 +957,14 @@ unlock:
        return err;
 }
 
+static void mlx5_fw_tracer_update_db(struct work_struct *work)
+{
+       struct mlx5_fw_tracer *tracer =
+                       container_of(work, struct mlx5_fw_tracer, update_db_work);
+
+       mlx5_fw_tracer_reload(tracer);
+}
+
 /* Create software resources (Buffers, etc ..) */
 struct mlx5_fw_tracer *mlx5_fw_tracer_create(struct mlx5_core_dev *dev)
 {
@@ -957,6 +992,8 @@ struct mlx5_fw_tracer *mlx5_fw_tracer_create(struct mlx5_core_dev *dev)
        INIT_WORK(&tracer->ownership_change_work, mlx5_fw_tracer_ownership_change);
        INIT_WORK(&tracer->read_fw_strings_work, mlx5_tracer_read_strings_db);
        INIT_WORK(&tracer->handle_traces_work, mlx5_fw_tracer_handle_traces);
+       INIT_WORK(&tracer->update_db_work, mlx5_fw_tracer_update_db);
+       mutex_init(&tracer->state_lock);
 
 
        err = mlx5_query_mtrc_caps(tracer);
@@ -1003,11 +1040,15 @@ int mlx5_fw_tracer_init(struct mlx5_fw_tracer *tracer)
        if (IS_ERR_OR_NULL(tracer))
                return 0;
 
-       dev = tracer->dev;
-
        if (!tracer->str_db.loaded)
                queue_work(tracer->work_queue, &tracer->read_fw_strings_work);
 
+       mutex_lock(&tracer->state_lock);
+       if (test_and_set_bit(MLX5_TRACER_STATE_UP, &tracer->state))
+               goto unlock;
+
+       dev = tracer->dev;
+
        err = mlx5_core_alloc_pd(dev, &tracer->buff.pdn);
        if (err) {
                mlx5_core_warn(dev, "FWTracer: Failed to allocate PD %d\n", err);
@@ -1028,6 +1069,8 @@ int mlx5_fw_tracer_init(struct mlx5_fw_tracer *tracer)
                mlx5_core_warn(dev, "FWTracer: Failed to start tracer %d\n", err);
                goto err_notifier_unregister;
        }
+unlock:
+       mutex_unlock(&tracer->state_lock);
        return 0;
 
 err_notifier_unregister:
@@ -1037,6 +1080,7 @@ err_dealloc_pd:
        mlx5_core_dealloc_pd(dev, tracer->buff.pdn);
 err_cancel_work:
        cancel_work_sync(&tracer->read_fw_strings_work);
+       mutex_unlock(&tracer->state_lock);
        return err;
 }
 
@@ -1046,17 +1090,27 @@ void mlx5_fw_tracer_cleanup(struct mlx5_fw_tracer *tracer)
        if (IS_ERR_OR_NULL(tracer))
                return;
 
+       mutex_lock(&tracer->state_lock);
+       if (!test_and_clear_bit(MLX5_TRACER_STATE_UP, &tracer->state))
+               goto unlock;
+
        mlx5_core_dbg(tracer->dev, "FWTracer: Cleanup, is owner ? (%d)\n",
                      tracer->owner);
        mlx5_eq_notifier_unregister(tracer->dev, &tracer->nb);
        cancel_work_sync(&tracer->ownership_change_work);
        cancel_work_sync(&tracer->handle_traces_work);
+       /* It is valid to get here from update_db_work. Hence, don't wait for
+        * update_db_work to finished.
+        */
+       cancel_work(&tracer->update_db_work);
 
        if (tracer->owner)
                mlx5_fw_tracer_ownership_release(tracer);
 
        mlx5_core_destroy_mkey(tracer->dev, tracer->buff.mkey);
        mlx5_core_dealloc_pd(tracer->dev, tracer->buff.pdn);
+unlock:
+       mutex_unlock(&tracer->state_lock);
 }
 
 /* Free software resources (Buffers, etc ..) */
@@ -1073,6 +1127,7 @@ void mlx5_fw_tracer_destroy(struct mlx5_fw_tracer *tracer)
        mlx5_fw_tracer_clean_saved_traces_array(tracer);
        mlx5_fw_tracer_free_strings_db(tracer);
        mlx5_fw_tracer_destroy_log_buf(tracer);
+       mutex_destroy(&tracer->state_lock);
        destroy_workqueue(tracer->work_queue);
        kvfree(tracer);
 }
@@ -1082,6 +1137,8 @@ static int mlx5_fw_tracer_recreate_strings_db(struct mlx5_fw_tracer *tracer)
        struct mlx5_core_dev *dev;
        int err;
 
+       if (test_and_set_bit(MLX5_TRACER_RECREATE_DB, &tracer->state))
+               return 0;
        cancel_work_sync(&tracer->read_fw_strings_work);
        mlx5_fw_tracer_clean_ready_list(tracer);
        mlx5_fw_tracer_clean_print_hash(tracer);
@@ -1092,17 +1149,18 @@ static int mlx5_fw_tracer_recreate_strings_db(struct mlx5_fw_tracer *tracer)
        err = mlx5_query_mtrc_caps(tracer);
        if (err) {
                mlx5_core_dbg(dev, "FWTracer: Failed to query capabilities %d\n", err);
-               return err;
+               goto out;
        }
 
        err = mlx5_fw_tracer_allocate_strings_db(tracer);
        if (err) {
                mlx5_core_warn(dev, "FWTracer: Allocate strings DB failed %d\n", err);
-               return err;
+               goto out;
        }
        mlx5_fw_tracer_init_saved_traces_array(tracer);
-
-       return 0;
+out:
+       clear_bit(MLX5_TRACER_RECREATE_DB, &tracer->state);
+       return err;
 }
 
 int mlx5_fw_tracer_reload(struct mlx5_fw_tracer *tracer)
@@ -1142,6 +1200,9 @@ static int fw_tracer_event(struct notifier_block *nb, unsigned long action, void
        case MLX5_TRACER_SUBTYPE_TRACES_AVAILABLE:
                queue_work(tracer->work_queue, &tracer->handle_traces_work);
                break;
+       case MLX5_TRACER_SUBTYPE_STRINGS_DB_UPDATE:
+               queue_work(tracer->work_queue, &tracer->update_db_work);
+               break;
        default:
                mlx5_core_dbg(dev, "FWTracer: Event with unrecognized subtype: sub_type %d\n",
                              eqe->sub_type);
index 4762b55b0b0eee908997a104e27a30c3f2b8ac0d..5c548bb74f07b60b0fc2b42ffd1dc6420a023e66 100644 (file)
@@ -63,6 +63,11 @@ struct mlx5_fw_trace_data {
        char msg[TRACE_STR_MSG];
 };
 
+enum mlx5_fw_tracer_state {
+       MLX5_TRACER_STATE_UP = BIT(0),
+       MLX5_TRACER_RECREATE_DB = BIT(1),
+};
+
 struct mlx5_fw_tracer {
        struct mlx5_core_dev *dev;
        struct mlx5_nb        nb;
@@ -104,6 +109,9 @@ struct mlx5_fw_tracer {
        struct work_struct handle_traces_work;
        struct hlist_head hash[MESSAGE_HASH_SIZE];
        struct list_head ready_strings_list;
+       struct work_struct update_db_work;
+       struct mutex state_lock; /* Synchronize update work with reload flows */
+       unsigned long state;
 };
 
 struct tracer_string_format {
@@ -158,6 +166,7 @@ struct tracer_event {
                struct tracer_string_event string_event;
                struct tracer_timestamp_event timestamp_event;
        };
+       u64 *out;
 };
 
 struct mlx5_ifc_tracer_event_bits {
index 57f4b1b50421b15efce67a79cc6a24a3ba5aed49..7ac1ad9c46de0352a0a323f815f8a0b28f2281d2 100644 (file)
@@ -314,11 +314,11 @@ static int port_set_buffer(struct mlx5e_priv *priv,
        err = port_update_shared_buffer(priv->mdev, current_headroom_size,
                                        new_headroom_size);
        if (err)
-               return err;
+               goto out;
 
        err = port_update_pool_cfg(priv->mdev, port_buffer);
        if (err)
-               return err;
+               goto out;
 
        err = mlx5e_port_set_pbmc(mdev, in);
 out:
index b86ac604d0c25fd1f16f78eb4e66e80c6f964152..2e0d88b513aa35ceb13cd79e525cb183ae1e4c5d 100644 (file)
@@ -44,19 +44,17 @@ parse_tc_vlan_action(struct mlx5e_priv *priv,
                return -EOPNOTSUPP;
        }
 
+       if (!mlx5_eswitch_vlan_actions_supported(priv->mdev, vlan_idx)) {
+               NL_SET_ERR_MSG_MOD(extack, "firmware vlan actions is not supported");
+               return -EOPNOTSUPP;
+       }
+
        switch (act->id) {
        case FLOW_ACTION_VLAN_POP:
-               if (vlan_idx) {
-                       if (!mlx5_eswitch_vlan_actions_supported(priv->mdev,
-                                                                MLX5_FS_VLAN_DEPTH)) {
-                               NL_SET_ERR_MSG_MOD(extack, "vlan pop action is not supported");
-                               return -EOPNOTSUPP;
-                       }
-
+               if (vlan_idx)
                        *action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP_2;
-               } else {
+               else
                        *action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_POP;
-               }
                break;
        case FLOW_ACTION_VLAN_PUSH:
                attr->vlan_vid[vlan_idx] = act->vlan.vid;
@@ -65,25 +63,10 @@ parse_tc_vlan_action(struct mlx5e_priv *priv,
                if (!attr->vlan_proto[vlan_idx])
                        attr->vlan_proto[vlan_idx] = htons(ETH_P_8021Q);
 
-               if (vlan_idx) {
-                       if (!mlx5_eswitch_vlan_actions_supported(priv->mdev,
-                                                                MLX5_FS_VLAN_DEPTH)) {
-                               NL_SET_ERR_MSG_MOD(extack,
-                                                  "vlan push action is not supported for vlan depth > 1");
-                               return -EOPNOTSUPP;
-                       }
-
+               if (vlan_idx)
                        *action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH_2;
-               } else {
-                       if (!mlx5_eswitch_vlan_actions_supported(priv->mdev, 1) &&
-                           (act->vlan.proto != htons(ETH_P_8021Q) ||
-                            act->vlan.prio)) {
-                               NL_SET_ERR_MSG_MOD(extack, "vlan push action is not supported");
-                               return -EOPNOTSUPP;
-                       }
-
+               else
                        *action |= MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH;
-               }
                break;
        case FLOW_ACTION_VLAN_POP_ETH:
                parse_state->eth_pop = true;
index 57ac0f663fcdb03d878c5bc6c9e143a2b44e039c..7fb3835befbdacf864f3548f2328bb4ffd3f25ed 100644 (file)
@@ -92,7 +92,6 @@ static void mlx5e_ipsec_packet_setup(void *obj, u32 pdn,
                MLX5_SET(ipsec_aso, aso_ctx, remove_flow_pkt_cnt,
                         lower_32_bits(attrs->hard_packet_limit));
                MLX5_SET(ipsec_aso, aso_ctx, hard_lft_arm, 1);
-               MLX5_SET(ipsec_aso, aso_ctx, remove_flow_enable, 1);
        }
 
        if (attrs->soft_packet_limit != XFRM_INF) {
@@ -329,8 +328,7 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work)
 
        if (attrs->soft_packet_limit != XFRM_INF)
                if (!MLX5_GET(ipsec_aso, aso->ctx, soft_lft_arm) ||
-                   !MLX5_GET(ipsec_aso, aso->ctx, hard_lft_arm) ||
-                   !MLX5_GET(ipsec_aso, aso->ctx, remove_flow_enable))
+                   !MLX5_GET(ipsec_aso, aso->ctx, hard_lft_arm))
                        xfrm_state_check_expire(sa_entry->x);
 
 unlock:
index e80b43b7aac942bea1287c35de33c9bd09f336a5..60b3e08a10286e2285262a6435dacb0ea5265d07 100644 (file)
@@ -899,8 +899,6 @@ static void mlx5e_tls_tx_debugfs_init(struct mlx5e_tls *tls,
                return;
 
        tls->debugfs.dfs_tx = debugfs_create_dir("tx", dfs_root);
-       if (!tls->debugfs.dfs_tx)
-               return;
 
        debugfs_create_size_t("pool_size", 0400, tls->debugfs.dfs_tx,
                              &tls->tx_pool->size);
index 3973d86905e843702f4e54347b8a319521be2a7f..6ac4c092a5919744137ff2f9285d0cd66564ee89 100644 (file)
@@ -181,17 +181,21 @@ static void mlx5e_disable_async_events(struct mlx5e_priv *priv)
 static int blocking_event(struct notifier_block *nb, unsigned long event, void *data)
 {
        struct mlx5e_priv *priv = container_of(nb, struct mlx5e_priv, blocking_events_nb);
+       struct mlx5_devlink_trap_event_ctx *trap_event_ctx = data;
        int err;
 
        switch (event) {
        case MLX5_DRIVER_EVENT_TYPE_TRAP:
-               err = mlx5e_handle_trap_event(priv, data);
+               err = mlx5e_handle_trap_event(priv, trap_event_ctx->trap);
+               if (err) {
+                       trap_event_ctx->err = err;
+                       return NOTIFY_BAD;
+               }
                break;
        default:
-               netdev_warn(priv->netdev, "Sync event: Unknown event %ld\n", event);
-               err = -EINVAL;
+               return NOTIFY_DONE;
        }
-       return err;
+       return NOTIFY_OK;
 }
 
 static void mlx5e_enable_blocking_events(struct mlx5e_priv *priv)
@@ -3002,32 +3006,37 @@ int mlx5e_safe_switch_params(struct mlx5e_priv *priv,
                             mlx5e_fp_preactivate preactivate,
                             void *context, bool reset)
 {
-       struct mlx5e_channels new_chs = {};
+       struct mlx5e_channels *new_chs;
        int err;
 
        reset &= test_bit(MLX5E_STATE_OPENED, &priv->state);
        if (!reset)
                return mlx5e_switch_priv_params(priv, params, preactivate, context);
 
-       new_chs.params = *params;
+       new_chs = kzalloc(sizeof(*new_chs), GFP_KERNEL);
+       if (!new_chs)
+               return -ENOMEM;
+       new_chs->params = *params;
 
-       mlx5e_selq_prepare_params(&priv->selq, &new_chs.params);
+       mlx5e_selq_prepare_params(&priv->selq, &new_chs->params);
 
-       err = mlx5e_open_channels(priv, &new_chs);
+       err = mlx5e_open_channels(priv, new_chs);
        if (err)
                goto err_cancel_selq;
 
-       err = mlx5e_switch_priv_channels(priv, &new_chs, preactivate, context);
+       err = mlx5e_switch_priv_channels(priv, new_chs, preactivate, context);
        if (err)
                goto err_close;
 
+       kfree(new_chs);
        return 0;
 
 err_close:
-       mlx5e_close_channels(&new_chs);
+       mlx5e_close_channels(new_chs);
 
 err_cancel_selq:
        mlx5e_selq_cancel(&priv->selq);
+       kfree(new_chs);
        return err;
 }
 
@@ -5979,7 +5988,7 @@ static int mlx5e_probe(struct auxiliary_device *adev,
        }
 
        mlx5e_dcbnl_init_app(priv);
-       mlx5_uplink_netdev_set(mdev, netdev);
+       mlx5_core_uplink_netdev_set(mdev, netdev);
        mlx5e_params_print_info(mdev, &priv->channels.params);
        return 0;
 
@@ -6003,6 +6012,7 @@ static void mlx5e_remove(struct auxiliary_device *adev)
        struct mlx5e_priv *priv = mlx5e_dev->priv;
        pm_message_t state = {};
 
+       mlx5_core_uplink_netdev_set(priv->mdev, NULL);
        mlx5e_dcbnl_delete_app(priv);
        unregister_netdev(priv->netdev);
        mlx5e_suspend(adev, state);
index 4e6f5caf8ab66456bdd7f8cf8070e7861e431cca..e2ec80ebde5830ef0f790de47fda3e6a3e512c28 100644 (file)
@@ -1124,8 +1124,6 @@ static void mlx5e_tc_debugfs_init(struct mlx5e_tc_table *tc,
                return;
 
        tc->dfs_root = debugfs_create_dir("tc", dfs_root);
-       if (!tc->dfs_root)
-               return;
 
        debugfs_create_file("hairpin_num_queues", 0644, tc->dfs_root,
                            &tc->hairpin_params, &fops_hairpin_queues);
@@ -1884,7 +1882,6 @@ post_process_attr(struct mlx5e_tc_flow *flow,
                  struct mlx5_flow_attr *attr,
                  struct netlink_ext_ack *extack)
 {
-       struct mlx5_eswitch *esw = flow->priv->mdev->priv.eswitch;
        bool vf_tun;
        int err = 0;
 
@@ -1896,12 +1893,6 @@ post_process_attr(struct mlx5e_tc_flow *flow,
        if (err)
                goto err_out;
 
-       if (mlx5e_is_eswitch_flow(flow)) {
-               err = mlx5_eswitch_add_vlan_action(esw, attr);
-               if (err)
-                       goto err_out;
-       }
-
        if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
                err = mlx5e_tc_attach_mod_hdr(flow->priv, flow, attr);
                if (err)
@@ -2105,8 +2096,6 @@ static void mlx5e_tc_del_fdb_flow(struct mlx5e_priv *priv,
        if (mlx5_flow_has_geneve_opt(flow))
                mlx5_geneve_tlv_option_del(priv->mdev->geneve);
 
-       mlx5_eswitch_del_vlan_action(esw, attr);
-
        if (flow->decap_route)
                mlx5e_detach_decap_route(priv, flow);
 
index 5b5a215a7dc5eb8836b133f33c3ac88def3cdb36..fd03f076551ba888b498267261662b21f86a7011 100644 (file)
@@ -222,7 +222,6 @@ struct mlx5_eswitch_fdb {
                        struct mlx5_flow_handle **send_to_vport_meta_rules;
                        struct mlx5_flow_handle *miss_rule_uni;
                        struct mlx5_flow_handle *miss_rule_multi;
-                       int vlan_push_pop_refcount;
 
                        struct mlx5_fs_chains *esw_chains_priv;
                        struct {
@@ -520,10 +519,6 @@ int mlx5_devlink_port_fn_migratable_set(struct devlink_port *port, bool enable,
                                        struct netlink_ext_ack *extack);
 void *mlx5_eswitch_get_uplink_priv(struct mlx5_eswitch *esw, u8 rep_type);
 
-int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
-                                struct mlx5_flow_attr *attr);
-int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
-                                struct mlx5_flow_attr *attr);
 int __mlx5_eswitch_set_vport_vlan(struct mlx5_eswitch *esw,
                                  u16 vport, u16 vlan, u8 qos, u8 set_flags);
 
index 3a82e385544db813b7097981a93c5403f20b1a5a..8fb09143e9e8412ca2434f25b61c02dbba028989 100644 (file)
@@ -579,16 +579,16 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
        if (esw->mode != MLX5_ESWITCH_OFFLOADS)
                return ERR_PTR(-EOPNOTSUPP);
 
+       if (!mlx5_eswitch_vlan_actions_supported(esw->dev, 1))
+               return ERR_PTR(-EOPNOTSUPP);
+
        dest = kcalloc(MLX5_MAX_FLOW_FWD_VPORTS + 1, sizeof(*dest), GFP_KERNEL);
        if (!dest)
                return ERR_PTR(-ENOMEM);
 
        flow_act.action = attr->action;
-       /* if per flow vlan pop/push is emulated, don't set that into the firmware */
-       if (!mlx5_eswitch_vlan_actions_supported(esw->dev, 1))
-               flow_act.action &= ~(MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH |
-                                    MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
-       else if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH) {
+
+       if (flow_act.action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH) {
                flow_act.vlan[0].ethtype = ntohs(esw_attr->vlan_proto[0]);
                flow_act.vlan[0].vid = esw_attr->vlan_vid[0];
                flow_act.vlan[0].prio = esw_attr->vlan_prio[0];
@@ -829,204 +829,6 @@ mlx5_eswitch_del_fwd_rule(struct mlx5_eswitch *esw,
        __mlx5_eswitch_del_rule(esw, rule, attr, true);
 }
 
-static int esw_set_global_vlan_pop(struct mlx5_eswitch *esw, u8 val)
-{
-       struct mlx5_eswitch_rep *rep;
-       unsigned long i;
-       int err = 0;
-
-       esw_debug(esw->dev, "%s applying global %s policy\n", __func__, val ? "pop" : "none");
-       mlx5_esw_for_each_host_func_vport(esw, i, rep, esw->esw_funcs.num_vfs) {
-               if (atomic_read(&rep->rep_data[REP_ETH].state) != REP_LOADED)
-                       continue;
-
-               err = __mlx5_eswitch_set_vport_vlan(esw, rep->vport, 0, 0, val);
-               if (err)
-                       goto out;
-       }
-
-out:
-       return err;
-}
-
-static struct mlx5_eswitch_rep *
-esw_vlan_action_get_vport(struct mlx5_esw_flow_attr *attr, bool push, bool pop)
-{
-       struct mlx5_eswitch_rep *in_rep, *out_rep, *vport = NULL;
-
-       in_rep  = attr->in_rep;
-       out_rep = attr->dests[0].rep;
-
-       if (push)
-               vport = in_rep;
-       else if (pop)
-               vport = out_rep;
-       else
-               vport = in_rep;
-
-       return vport;
-}
-
-static int esw_add_vlan_action_check(struct mlx5_esw_flow_attr *attr,
-                                    bool push, bool pop, bool fwd)
-{
-       struct mlx5_eswitch_rep *in_rep, *out_rep;
-
-       if ((push || pop) && !fwd)
-               goto out_notsupp;
-
-       in_rep  = attr->in_rep;
-       out_rep = attr->dests[0].rep;
-
-       if (push && in_rep->vport == MLX5_VPORT_UPLINK)
-               goto out_notsupp;
-
-       if (pop && out_rep->vport == MLX5_VPORT_UPLINK)
-               goto out_notsupp;
-
-       /* vport has vlan push configured, can't offload VF --> wire rules w.o it */
-       if (!push && !pop && fwd)
-               if (in_rep->vlan && out_rep->vport == MLX5_VPORT_UPLINK)
-                       goto out_notsupp;
-
-       /* protects against (1) setting rules with different vlans to push and
-        * (2) setting rules w.o vlans (attr->vlan = 0) && w. vlans to push (!= 0)
-        */
-       if (push && in_rep->vlan_refcount && (in_rep->vlan != attr->vlan_vid[0]))
-               goto out_notsupp;
-
-       return 0;
-
-out_notsupp:
-       return -EOPNOTSUPP;
-}
-
-int mlx5_eswitch_add_vlan_action(struct mlx5_eswitch *esw,
-                                struct mlx5_flow_attr *attr)
-{
-       struct offloads_fdb *offloads = &esw->fdb_table.offloads;
-       struct mlx5_esw_flow_attr *esw_attr = attr->esw_attr;
-       struct mlx5_eswitch_rep *vport = NULL;
-       bool push, pop, fwd;
-       int err = 0;
-
-       /* nop if we're on the vlan push/pop non emulation mode */
-       if (mlx5_eswitch_vlan_actions_supported(esw->dev, 1))
-               return 0;
-
-       push = !!(attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH);
-       pop  = !!(attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
-       fwd  = !!((attr->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) &&
-                  !attr->dest_chain);
-
-       mutex_lock(&esw->state_lock);
-
-       err = esw_add_vlan_action_check(esw_attr, push, pop, fwd);
-       if (err)
-               goto unlock;
-
-       attr->flags &= ~MLX5_ATTR_FLAG_VLAN_HANDLED;
-
-       vport = esw_vlan_action_get_vport(esw_attr, push, pop);
-
-       if (!push && !pop && fwd) {
-               /* tracks VF --> wire rules without vlan push action */
-               if (esw_attr->dests[0].rep->vport == MLX5_VPORT_UPLINK) {
-                       vport->vlan_refcount++;
-                       attr->flags |= MLX5_ATTR_FLAG_VLAN_HANDLED;
-               }
-
-               goto unlock;
-       }
-
-       if (!push && !pop)
-               goto unlock;
-
-       if (!(offloads->vlan_push_pop_refcount)) {
-               /* it's the 1st vlan rule, apply global vlan pop policy */
-               err = esw_set_global_vlan_pop(esw, SET_VLAN_STRIP);
-               if (err)
-                       goto out;
-       }
-       offloads->vlan_push_pop_refcount++;
-
-       if (push) {
-               if (vport->vlan_refcount)
-                       goto skip_set_push;
-
-               err = __mlx5_eswitch_set_vport_vlan(esw, vport->vport, esw_attr->vlan_vid[0],
-                                                   0, SET_VLAN_INSERT | SET_VLAN_STRIP);
-               if (err)
-                       goto out;
-               vport->vlan = esw_attr->vlan_vid[0];
-skip_set_push:
-               vport->vlan_refcount++;
-       }
-out:
-       if (!err)
-               attr->flags |= MLX5_ATTR_FLAG_VLAN_HANDLED;
-unlock:
-       mutex_unlock(&esw->state_lock);
-       return err;
-}
-
-int mlx5_eswitch_del_vlan_action(struct mlx5_eswitch *esw,
-                                struct mlx5_flow_attr *attr)
-{
-       struct offloads_fdb *offloads = &esw->fdb_table.offloads;
-       struct mlx5_esw_flow_attr *esw_attr = attr->esw_attr;
-       struct mlx5_eswitch_rep *vport = NULL;
-       bool push, pop, fwd;
-       int err = 0;
-
-       /* nop if we're on the vlan push/pop non emulation mode */
-       if (mlx5_eswitch_vlan_actions_supported(esw->dev, 1))
-               return 0;
-
-       if (!(attr->flags & MLX5_ATTR_FLAG_VLAN_HANDLED))
-               return 0;
-
-       push = !!(attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH);
-       pop  = !!(attr->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
-       fwd  = !!(attr->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST);
-
-       mutex_lock(&esw->state_lock);
-
-       vport = esw_vlan_action_get_vport(esw_attr, push, pop);
-
-       if (!push && !pop && fwd) {
-               /* tracks VF --> wire rules without vlan push action */
-               if (esw_attr->dests[0].rep->vport == MLX5_VPORT_UPLINK)
-                       vport->vlan_refcount--;
-
-               goto out;
-       }
-
-       if (push) {
-               vport->vlan_refcount--;
-               if (vport->vlan_refcount)
-                       goto skip_unset_push;
-
-               vport->vlan = 0;
-               err = __mlx5_eswitch_set_vport_vlan(esw, vport->vport,
-                                                   0, 0, SET_VLAN_STRIP);
-               if (err)
-                       goto out;
-       }
-
-skip_unset_push:
-       offloads->vlan_push_pop_refcount--;
-       if (offloads->vlan_push_pop_refcount)
-               goto out;
-
-       /* no more vlan rules, stop global vlan pop policy */
-       err = esw_set_global_vlan_pop(esw, 0);
-
-out:
-       mutex_unlock(&esw->state_lock);
-       return err;
-}
-
 struct mlx5_flow_handle *
 mlx5_eswitch_add_send_to_vport_rule(struct mlx5_eswitch *on_esw,
                                    struct mlx5_eswitch *from_esw,
index 9459e56ee90a64dfee01cc019a7a415fa7fa72ed..718cf09c28ce4baffb464cc3db5eaf08d3a9b1ac 100644 (file)
@@ -424,6 +424,7 @@ int mlx5_blocking_notifier_register(struct mlx5_core_dev *dev, struct notifier_b
 
        return blocking_notifier_chain_register(&events->sw_nh, nb);
 }
+EXPORT_SYMBOL(mlx5_blocking_notifier_register);
 
 int mlx5_blocking_notifier_unregister(struct mlx5_core_dev *dev, struct notifier_block *nb)
 {
@@ -431,6 +432,7 @@ int mlx5_blocking_notifier_unregister(struct mlx5_core_dev *dev, struct notifier
 
        return blocking_notifier_chain_unregister(&events->sw_nh, nb);
 }
+EXPORT_SYMBOL(mlx5_blocking_notifier_unregister);
 
 int mlx5_blocking_notifier_call_chain(struct mlx5_core_dev *dev, unsigned int event,
                                      void *data)
index 32d4c967469ccc75eceb28d2d6e7701aecacce3a..374c17445e542280a3b4b775feafff59e0d8149d 100644 (file)
@@ -272,8 +272,6 @@ static int mlx5_cmd_create_flow_table(struct mlx5_flow_root_namespace *ns,
        unsigned int size;
        int err;
 
-       if (ft_attr->max_fte != POOL_NEXT_SIZE)
-               size = roundup_pow_of_two(ft_attr->max_fte);
        size = mlx5_ft_pool_get_avail_sz(dev, ft->type, ft_attr->max_fte);
        if (!size)
                return -ENOSPC;
@@ -412,11 +410,6 @@ static int mlx5_cmd_create_flow_group(struct mlx5_flow_root_namespace *ns,
                 MLX5_CMD_OP_CREATE_FLOW_GROUP);
        MLX5_SET(create_flow_group_in, in, table_type, ft->type);
        MLX5_SET(create_flow_group_in, in, table_id, ft->id);
-       if (ft->vport) {
-               MLX5_SET(create_flow_group_in, in, vport_number, ft->vport);
-               MLX5_SET(create_flow_group_in, in, other_vport, 1);
-       }
-
        MLX5_SET(create_flow_group_in, in, vport_number, ft->vport);
        MLX5_SET(create_flow_group_in, in, other_vport,
                 !!(ft->flags & MLX5_FLOW_TABLE_OTHER_VPORT));
index dd43a940499b2db08b32fa3d36d8cb005319f826..fad479df12e4f6d2823bc07b7c9a597389e81940 100644 (file)
@@ -1776,7 +1776,6 @@ static int build_match_list(struct match_list *match_head,
 {
        struct rhlist_head *tmp, *list;
        struct mlx5_flow_group *g;
-       int err = 0;
 
        rcu_read_lock();
        INIT_LIST_HEAD(&match_head->list);
@@ -1802,7 +1801,7 @@ static int build_match_list(struct match_list *match_head,
                list_add_tail(&curr_match->list, &match_head->list);
        }
        rcu_read_unlock();
-       return err;
+       return 0;
 }
 
 static u64 matched_fgs_get_version(struct list_head *match_head)
index 1da4da564e6d8fb2ed904606a17ae1027f05d19f..63290da8401014c1a1b923e43a2149e7ca4dfce1 100644 (file)
@@ -371,6 +371,7 @@ static int mlx5_pci_link_toggle(struct mlx5_core_dev *dev)
                mlx5_core_err(dev, "PCI link not ready (0x%04x) after %llu ms\n",
                              reg16, mlx5_tout_ms(dev, PCI_TOGGLE));
                err = -ETIMEDOUT;
+               goto restore;
        }
 
        do {
index 879555ba847ddcd6174a2e3036d38eb7a5639c88..1e8bee906c31ce788f86469d7dd08dcf80335ace 100644 (file)
@@ -62,7 +62,7 @@ enum {
 };
 
 enum {
-       MLX5_DROP_NEW_HEALTH_WORK,
+       MLX5_DROP_HEALTH_WORK,
 };
 
 enum  {
@@ -675,7 +675,7 @@ static void mlx5_fw_fatal_reporter_err_work(struct work_struct *work)
        devlink = priv_to_devlink(dev);
 
        mutex_lock(&dev->intf_state_mutex);
-       if (test_bit(MLX5_DROP_NEW_HEALTH_WORK, &health->flags)) {
+       if (test_bit(MLX5_DROP_HEALTH_WORK, &health->flags)) {
                mlx5_core_err(dev, "health works are not permitted at this stage\n");
                mutex_unlock(&dev->intf_state_mutex);
                return;
@@ -771,14 +771,8 @@ static unsigned long get_next_poll_jiffies(struct mlx5_core_dev *dev)
 void mlx5_trigger_health_work(struct mlx5_core_dev *dev)
 {
        struct mlx5_core_health *health = &dev->priv.health;
-       unsigned long flags;
 
-       spin_lock_irqsave(&health->wq_lock, flags);
-       if (!test_bit(MLX5_DROP_NEW_HEALTH_WORK, &health->flags))
-               queue_work(health->wq, &health->fatal_report_work);
-       else
-               mlx5_core_err(dev, "new health works are not permitted at this stage\n");
-       spin_unlock_irqrestore(&health->wq_lock, flags);
+       queue_work(health->wq, &health->fatal_report_work);
 }
 
 #define MLX5_MSEC_PER_HOUR (MSEC_PER_SEC * 60 * 60)
@@ -858,7 +852,7 @@ void mlx5_start_health_poll(struct mlx5_core_dev *dev)
 
        timer_setup(&health->timer, poll_health, 0);
        health->fatal_error = MLX5_SENSOR_NO_ERR;
-       clear_bit(MLX5_DROP_NEW_HEALTH_WORK, &health->flags);
+       clear_bit(MLX5_DROP_HEALTH_WORK, &health->flags);
        health->health = &dev->iseg->health;
        health->health_counter = &dev->iseg->health_counter;
 
@@ -869,13 +863,9 @@ void mlx5_start_health_poll(struct mlx5_core_dev *dev)
 void mlx5_stop_health_poll(struct mlx5_core_dev *dev, bool disable_health)
 {
        struct mlx5_core_health *health = &dev->priv.health;
-       unsigned long flags;
 
-       if (disable_health) {
-               spin_lock_irqsave(&health->wq_lock, flags);
-               set_bit(MLX5_DROP_NEW_HEALTH_WORK, &health->flags);
-               spin_unlock_irqrestore(&health->wq_lock, flags);
-       }
+       if (disable_health)
+               set_bit(MLX5_DROP_HEALTH_WORK, &health->flags);
 
        del_timer_sync(&health->timer);
 }
@@ -891,11 +881,8 @@ void mlx5_start_health_fw_log_up(struct mlx5_core_dev *dev)
 void mlx5_drain_health_wq(struct mlx5_core_dev *dev)
 {
        struct mlx5_core_health *health = &dev->priv.health;
-       unsigned long flags;
 
-       spin_lock_irqsave(&health->wq_lock, flags);
-       set_bit(MLX5_DROP_NEW_HEALTH_WORK, &health->flags);
-       spin_unlock_irqrestore(&health->wq_lock, flags);
+       set_bit(MLX5_DROP_HEALTH_WORK, &health->flags);
        cancel_delayed_work_sync(&health->update_fw_log_ts_work);
        cancel_work_sync(&health->report_work);
        cancel_work_sync(&health->fatal_report_work);
@@ -928,7 +915,6 @@ int mlx5_health_init(struct mlx5_core_dev *dev)
        kfree(name);
        if (!health->wq)
                goto out_err;
-       spin_lock_init(&health->wq_lock);
        INIT_WORK(&health->fatal_report_work, mlx5_fw_fatal_reporter_err_work);
        INIT_WORK(&health->report_work, mlx5_fw_reporter_err_work);
        INIT_DELAYED_WORK(&health->update_fw_log_ts_work, mlx5_health_log_ts_update);
index 55bd7c4c021e74bb7ec95fbba0eeb67b14868894..ccf12f7db6f064e098fd6b9cbe7b075731b88e54 100644 (file)
@@ -84,11 +84,6 @@ static inline struct net *mlx5_core_net(struct mlx5_core_dev *dev)
        return devlink_net(priv_to_devlink(dev));
 }
 
-static inline void mlx5_uplink_netdev_set(struct mlx5_core_dev *mdev, struct net_device *netdev)
-{
-       mdev->mlx5e_res.uplink_netdev = netdev;
-}
-
 static inline struct net_device *mlx5_uplink_netdev_get(struct mlx5_core_dev *mdev)
 {
        return mdev->mlx5e_res.uplink_netdev;
index 9441588ac524a5651101f0a45a0d6fdadc6b8a8e..0de9180e4f6b619619d208f2f5ad67b9d61bae08 100644 (file)
@@ -336,6 +336,24 @@ static u16 to_fw_pkey_sz(struct mlx5_core_dev *dev, u32 size)
        }
 }
 
+void mlx5_core_uplink_netdev_set(struct mlx5_core_dev *dev, struct net_device *netdev)
+{
+       mutex_lock(&dev->mlx5e_res.uplink_netdev_lock);
+       dev->mlx5e_res.uplink_netdev = netdev;
+       mlx5_blocking_notifier_call_chain(dev, MLX5_DRIVER_EVENT_UPLINK_NETDEV,
+                                         netdev);
+       mutex_unlock(&dev->mlx5e_res.uplink_netdev_lock);
+}
+
+void mlx5_core_uplink_netdev_event_replay(struct mlx5_core_dev *dev)
+{
+       mutex_lock(&dev->mlx5e_res.uplink_netdev_lock);
+       mlx5_blocking_notifier_call_chain(dev, MLX5_DRIVER_EVENT_UPLINK_NETDEV,
+                                         dev->mlx5e_res.uplink_netdev);
+       mutex_unlock(&dev->mlx5e_res.uplink_netdev_lock);
+}
+EXPORT_SYMBOL(mlx5_core_uplink_netdev_event_replay);
+
 static int mlx5_core_get_caps_mode(struct mlx5_core_dev *dev,
                                   enum mlx5_cap_type cap_type,
                                   enum mlx5_cap_mode cap_mode)
@@ -1609,6 +1627,7 @@ int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx)
        lockdep_register_key(&dev->lock_key);
        mutex_init(&dev->intf_state_mutex);
        lockdep_set_class(&dev->intf_state_mutex, &dev->lock_key);
+       mutex_init(&dev->mlx5e_res.uplink_netdev_lock);
 
        mutex_init(&priv->bfregs.reg_head.lock);
        mutex_init(&priv->bfregs.wc_head.lock);
@@ -1697,6 +1716,7 @@ void mlx5_mdev_uninit(struct mlx5_core_dev *dev)
        mutex_destroy(&priv->alloc_mutex);
        mutex_destroy(&priv->bfregs.wc_head.lock);
        mutex_destroy(&priv->bfregs.reg_head.lock);
+       mutex_destroy(&dev->mlx5e_res.uplink_netdev_lock);
        mutex_destroy(&dev->intf_state_mutex);
        lockdep_unregister_key(&dev->lock_key);
 }
index 57e1871ea0c602c17fee96ee9ef0c40953ee0117..2ee286b2b17788b341a4b31bfb5f6751700f7216 100644 (file)
@@ -680,7 +680,7 @@ static int wx_poll(struct napi_struct *napi, int budget)
        if (likely(napi_complete_done(napi, work_done))) {
                if (netif_running(wx->netdev))
                        wx_intr_enable(wx, WX_INTR_Q(q_vector->v_idx));
-       };
+       }
 
        return min(work_done, budget - 1);
 }
@@ -1832,7 +1832,7 @@ static int wx_setup_all_rx_resources(struct wx *wx)
                goto err_setup_rx;
        }
 
-               return 0;
+       return 0;
 err_setup_rx:
        /* rewind the index freeing the rings as we go */
        while (i--)
index bc531bd9804ffb13acb86923f3614a760f6625a9..71b06ebad4024c429bf6b33cf3637e9e0c7fc61e 100644 (file)
@@ -362,11 +362,13 @@ enum mlx5_event {
 
 enum mlx5_driver_event {
        MLX5_DRIVER_EVENT_TYPE_TRAP = 0,
+       MLX5_DRIVER_EVENT_UPLINK_NETDEV,
 };
 
 enum {
        MLX5_TRACER_SUBTYPE_OWNERSHIP_CHANGE = 0x0,
        MLX5_TRACER_SUBTYPE_TRACES_AVAILABLE = 0x1,
+       MLX5_TRACER_SUBTYPE_STRINGS_DB_UPDATE = 0x2,
 };
 
 enum {
index cd529e051b4dd4c47f2f45411ee3e044fe84da2e..e0b104ea49b105549256bdbec586b2b690c303b2 100644 (file)
@@ -49,6 +49,7 @@
 #include <linux/notifier.h>
 #include <linux/refcount.h>
 #include <linux/auxiliary_bus.h>
+#include <linux/mutex.h>
 
 #include <linux/mlx5/device.h>
 #include <linux/mlx5/doorbell.h>
@@ -430,8 +431,6 @@ struct mlx5_core_health {
        u8                              synd;
        u32                             fatal_error;
        u32                             crdump_size;
-       /* wq spinlock to synchronize draining */
-       spinlock_t                      wq_lock;
        struct workqueue_struct        *wq;
        unsigned long                   flags;
        struct work_struct              fatal_report_work;
@@ -674,6 +673,7 @@ struct mlx5e_resources {
        } hw_objs;
        struct devlink_port dl_port;
        struct net_device *uplink_netdev;
+       struct mutex uplink_netdev_lock;
        struct mlx5_crypto_dek_priv *dek_priv;
 };
 
@@ -1012,6 +1012,9 @@ int mlx5_cmd_exec_polling(struct mlx5_core_dev *dev, void *in, int in_size,
                          void *out, int out_size);
 bool mlx5_cmd_is_down(struct mlx5_core_dev *dev);
 
+void mlx5_core_uplink_netdev_set(struct mlx5_core_dev *mdev, struct net_device *netdev);
+void mlx5_core_uplink_netdev_event_replay(struct mlx5_core_dev *mdev);
+
 int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type);
 void mlx5_health_cleanup(struct mlx5_core_dev *dev);
 int mlx5_health_init(struct mlx5_core_dev *dev);
index 7cf6a78fea07f542baf65abd98f11e42009cd765..1e530a8a2cf5017cc19cef6314152b69e1c7d019 100644 (file)
@@ -1521,7 +1521,9 @@ struct mlx5_ifc_cmd_hca_cap_bits {
        u8         null_mkey[0x1];
        u8         log_max_klm_list_size[0x6];
 
-       u8         reserved_at_120[0xa];
+       u8         reserved_at_120[0x2];
+       u8         qpc_extension[0x1];
+       u8         reserved_at_123[0x7];
        u8         log_max_ra_req_dc[0x6];
        u8         reserved_at_130[0x2];
        u8         eth_wqe_too_small[0x1];
@@ -1687,7 +1689,9 @@ struct mlx5_ifc_cmd_hca_cap_bits {
 
        u8         log_bf_reg_size[0x5];
 
-       u8         reserved_at_270[0x6];
+       u8         reserved_at_270[0x3];
+       u8         qp_error_syndrome[0x1];
+       u8         reserved_at_274[0x2];
        u8         lag_dct[0x2];
        u8         lag_tx_port_affinity[0x1];
        u8         lag_native_fdb_selection[0x1];
@@ -5393,6 +5397,37 @@ struct mlx5_ifc_query_rmp_in_bits {
        u8         reserved_at_60[0x20];
 };
 
+struct mlx5_ifc_cqe_error_syndrome_bits {
+       u8         hw_error_syndrome[0x8];
+       u8         hw_syndrome_type[0x4];
+       u8         reserved_at_c[0x4];
+       u8         vendor_error_syndrome[0x8];
+       u8         syndrome[0x8];
+};
+
+struct mlx5_ifc_qp_context_extension_bits {
+       u8         reserved_at_0[0x60];
+
+       struct mlx5_ifc_cqe_error_syndrome_bits error_syndrome;
+
+       u8         reserved_at_80[0x580];
+};
+
+struct mlx5_ifc_qpc_extension_and_pas_list_in_bits {
+       struct mlx5_ifc_qp_context_extension_bits qpc_data_extension;
+
+       u8         pas[0][0x40];
+};
+
+struct mlx5_ifc_qp_pas_list_in_bits {
+       struct mlx5_ifc_cmd_pas_bits pas[0];
+};
+
+union mlx5_ifc_qp_pas_or_qpc_ext_and_pas_bits {
+       struct mlx5_ifc_qp_pas_list_in_bits qp_pas_list;
+       struct mlx5_ifc_qpc_extension_and_pas_list_in_bits qpc_ext_and_pas_list;
+};
+
 struct mlx5_ifc_query_qp_out_bits {
        u8         status[0x8];
        u8         reserved_at_8[0x18];
@@ -5409,7 +5444,7 @@ struct mlx5_ifc_query_qp_out_bits {
 
        u8         reserved_at_800[0x80];
 
-       u8         pas[][0x40];
+       union mlx5_ifc_qp_pas_or_qpc_ext_and_pas_bits qp_pas_or_qpc_ext_and_pas;
 };
 
 struct mlx5_ifc_query_qp_in_bits {
@@ -5419,7 +5454,8 @@ struct mlx5_ifc_query_qp_in_bits {
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
 
-       u8         reserved_at_40[0x8];
+       u8         qpc_ext[0x1];
+       u8         reserved_at_41[0x7];
        u8         qpn[0x18];
 
        u8         reserved_at_60[0x20];
@@ -8635,7 +8671,8 @@ struct mlx5_ifc_create_qp_in_bits {
        u8         reserved_at_20[0x10];
        u8         op_mod[0x10];
 
-       u8         reserved_at_40[0x8];
+       u8         qpc_ext[0x1];
+       u8         reserved_at_41[0x7];
        u8         input_qpn[0x18];
 
        u8         reserved_at_60[0x20];