net/mlx5: Add support for fw live patch event
[sfrench/cifs-2.6.git] / drivers / net / ethernet / mellanox / mlx5 / core / diag / fw_tracer.c
index ede4640b842816719b63064caff0df418600caec..2eb022ad7fd095bccb058f6007b582ee630fde72 100644 (file)
@@ -1066,6 +1066,58 @@ void mlx5_fw_tracer_destroy(struct mlx5_fw_tracer *tracer)
        kvfree(tracer);
 }
 
+static int mlx5_fw_tracer_recreate_strings_db(struct mlx5_fw_tracer *tracer)
+{
+       struct mlx5_core_dev *dev;
+       int err;
+
+       cancel_work_sync(&tracer->read_fw_strings_work);
+       mlx5_fw_tracer_clean_ready_list(tracer);
+       mlx5_fw_tracer_clean_print_hash(tracer);
+       mlx5_fw_tracer_clean_saved_traces_array(tracer);
+       mlx5_fw_tracer_free_strings_db(tracer);
+
+       dev = tracer->dev;
+       err = mlx5_query_mtrc_caps(tracer);
+       if (err) {
+               mlx5_core_dbg(dev, "FWTracer: Failed to query capabilities %d\n", err);
+               return err;
+       }
+
+       err = mlx5_fw_tracer_allocate_strings_db(tracer);
+       if (err) {
+               mlx5_core_warn(dev, "FWTracer: Allocate strings DB failed %d\n", err);
+               return err;
+       }
+       mlx5_fw_tracer_init_saved_traces_array(tracer);
+
+       return 0;
+}
+
+int mlx5_fw_tracer_reload(struct mlx5_fw_tracer *tracer)
+{
+       struct mlx5_core_dev *dev;
+       int err;
+
+       if (IS_ERR_OR_NULL(tracer))
+               return -EINVAL;
+
+       dev = tracer->dev;
+       mlx5_fw_tracer_cleanup(tracer);
+       err = mlx5_fw_tracer_recreate_strings_db(tracer);
+       if (err) {
+               mlx5_core_warn(dev, "Failed to recreate FW tracer strings DB\n");
+               return err;
+       }
+       err = mlx5_fw_tracer_init(tracer);
+       if (err) {
+               mlx5_core_warn(dev, "Failed to re-initialize FW tracer\n");
+               return err;
+       }
+
+       return 0;
+}
+
 static int fw_tracer_event(struct notifier_block *nb, unsigned long action, void *data)
 {
        struct mlx5_fw_tracer *tracer = mlx5_nb_cof(nb, struct mlx5_fw_tracer, nb);