forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/drivers/net/ethernet/mellanox/mlx5/core/main.c
....@@ -43,7 +43,6 @@
4343 #include <linux/mlx5/driver.h>
4444 #include <linux/mlx5/cq.h>
4545 #include <linux/mlx5/qp.h>
46
-#include <linux/mlx5/srq.h>
4746 #include <linux/debugfs.h>
4847 #include <linux/kmod.h>
4948 #include <linux/mlx5/mlx5_ifc.h>
....@@ -54,9 +53,12 @@
5453 #include <linux/version.h>
5554 #include <net/devlink.h>
5655 #include "mlx5_core.h"
56
+#include "lib/eq.h"
5757 #include "fs_core.h"
5858 #include "lib/mpfs.h"
5959 #include "eswitch.h"
60
+#include "devlink.h"
61
+#include "fw_reset.h"
6062 #include "lib/mlx5.h"
6163 #include "fpga/core.h"
6264 #include "fpga/ipsec.h"
....@@ -64,7 +66,13 @@
6466 #include "accel/tls.h"
6567 #include "lib/clock.h"
6668 #include "lib/vxlan.h"
69
+#include "lib/geneve.h"
70
+#include "lib/devcom.h"
71
+#include "lib/pci_vsc.h"
6772 #include "diag/fw_tracer.h"
73
+#include "ecpf.h"
74
+#include "lib/hv_vhca.h"
75
+#include "diag/rsc_dump.h"
6876
6977 MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
7078 MODULE_DESCRIPTION("Mellanox 5th generation network adapters (ConnectX series) core driver");
....@@ -168,17 +176,32 @@
168176
169177 #define FW_INIT_TIMEOUT_MILI 2000
170178 #define FW_INIT_WAIT_MS 2
171
-#define FW_PRE_INIT_TIMEOUT_MILI 10000
179
+#define FW_PRE_INIT_TIMEOUT_MILI 120000
180
+#define FW_INIT_WARN_MESSAGE_INTERVAL 20000
172181
173
-static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili)
182
+static int fw_initializing(struct mlx5_core_dev *dev)
174183 {
184
+ return ioread32be(&dev->iseg->initializing) >> 31;
185
+}
186
+
187
+static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili,
188
+ u32 warn_time_mili)
189
+{
190
+ unsigned long warn = jiffies + msecs_to_jiffies(warn_time_mili);
175191 unsigned long end = jiffies + msecs_to_jiffies(max_wait_mili);
176192 int err = 0;
193
+
194
+ BUILD_BUG_ON(FW_PRE_INIT_TIMEOUT_MILI < FW_INIT_WARN_MESSAGE_INTERVAL);
177195
178196 while (fw_initializing(dev)) {
179197 if (time_after(jiffies, end)) {
180198 err = -EBUSY;
181199 break;
200
+ }
201
+ if (warn_time_mili && time_after(jiffies, warn)) {
202
+ mlx5_core_warn(dev, "Waiting for FW initialization, timeout abort in %ds\n",
203
+ jiffies_to_msecs(end - warn) / 1000);
204
+ warn = jiffies + msecs_to_jiffies(warn_time_mili);
182205 }
183206 msleep(FW_INIT_WAIT_MS);
184207 }
....@@ -190,8 +213,7 @@
190213 {
191214 int driver_ver_sz = MLX5_FLD_SZ_BYTES(set_driver_version_in,
192215 driver_version);
193
- u8 in[MLX5_ST_SZ_BYTES(set_driver_version_in)] = {0};
194
- u8 out[MLX5_ST_SZ_BYTES(set_driver_version_out)] = {0};
216
+ u8 in[MLX5_ST_SZ_BYTES(set_driver_version_in)] = {};
195217 int remaining_size = driver_ver_sz;
196218 char *string;
197219
....@@ -221,7 +243,7 @@
221243 MLX5_SET(set_driver_version_in, in, opcode,
222244 MLX5_CMD_OP_SET_DRIVER_VERSION);
223245
224
- mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
246
+ mlx5_cmd_exec_in(dev, set_driver_version, in);
225247 }
226248
227249 static int set_dma_caps(struct pci_dev *pdev)
....@@ -303,51 +325,6 @@
303325 pci_release_regions(pdev);
304326 }
305327
306
-static int mlx5_alloc_irq_vectors(struct mlx5_core_dev *dev)
307
-{
308
- struct mlx5_priv *priv = &dev->priv;
309
- struct mlx5_eq_table *table = &priv->eq_table;
310
- int num_eqs = MLX5_CAP_GEN(dev, max_num_eqs) ?
311
- MLX5_CAP_GEN(dev, max_num_eqs) :
312
- 1 << MLX5_CAP_GEN(dev, log_max_eq);
313
- int nvec;
314
- int err;
315
-
316
- nvec = MLX5_CAP_GEN(dev, num_ports) * num_online_cpus() +
317
- MLX5_EQ_VEC_COMP_BASE;
318
- nvec = min_t(int, nvec, num_eqs);
319
- if (nvec <= MLX5_EQ_VEC_COMP_BASE)
320
- return -ENOMEM;
321
-
322
- priv->irq_info = kcalloc(nvec, sizeof(*priv->irq_info), GFP_KERNEL);
323
- if (!priv->irq_info)
324
- return -ENOMEM;
325
-
326
- nvec = pci_alloc_irq_vectors(dev->pdev,
327
- MLX5_EQ_VEC_COMP_BASE + 1, nvec,
328
- PCI_IRQ_MSIX);
329
- if (nvec < 0) {
330
- err = nvec;
331
- goto err_free_irq_info;
332
- }
333
-
334
- table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE;
335
-
336
- return 0;
337
-
338
-err_free_irq_info:
339
- kfree(priv->irq_info);
340
- return err;
341
-}
342
-
343
-static void mlx5_free_irq_vectors(struct mlx5_core_dev *dev)
344
-{
345
- struct mlx5_priv *priv = &dev->priv;
346
-
347
- pci_free_irq_vectors(dev->pdev);
348
- kfree(priv->irq_info);
349
-}
350
-
351328 struct mlx5_reg_host_endianness {
352329 u8 he;
353330 u8 rsvd[15];
....@@ -398,7 +375,7 @@
398375
399376 MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
400377 MLX5_SET(query_hca_cap_in, in, op_mod, opmod);
401
- err = mlx5_cmd_exec(dev, in, sizeof(in), out, out_sz);
378
+ err = mlx5_cmd_exec_inout(dev, query_hca_cap, in, out);
402379 if (err) {
403380 mlx5_core_warn(dev,
404381 "QUERY_HCA_CAP : type(%x) opmode(%x) Failed(%d)\n",
....@@ -439,30 +416,25 @@
439416 return mlx5_core_get_caps_mode(dev, cap_type, HCA_CAP_OPMOD_GET_MAX);
440417 }
441418
442
-static int set_caps(struct mlx5_core_dev *dev, void *in, int in_sz, int opmod)
419
+static int set_caps(struct mlx5_core_dev *dev, void *in, int opmod)
443420 {
444
- u32 out[MLX5_ST_SZ_DW(set_hca_cap_out)] = {0};
445
-
446421 MLX5_SET(set_hca_cap_in, in, opcode, MLX5_CMD_OP_SET_HCA_CAP);
447422 MLX5_SET(set_hca_cap_in, in, op_mod, opmod << 1);
448
- return mlx5_cmd_exec(dev, in, in_sz, out, sizeof(out));
423
+ return mlx5_cmd_exec_in(dev, set_hca_cap, in);
449424 }
450425
451
-static int handle_hca_cap_atomic(struct mlx5_core_dev *dev)
426
+static int handle_hca_cap_atomic(struct mlx5_core_dev *dev, void *set_ctx)
452427 {
453
- void *set_ctx;
454428 void *set_hca_cap;
455
- int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
456429 int req_endianness;
457430 int err;
458431
459
- if (MLX5_CAP_GEN(dev, atomic)) {
460
- err = mlx5_core_get_caps(dev, MLX5_CAP_ATOMIC);
461
- if (err)
462
- return err;
463
- } else {
432
+ if (!MLX5_CAP_GEN(dev, atomic))
464433 return 0;
465
- }
434
+
435
+ err = mlx5_core_get_caps(dev, MLX5_CAP_ATOMIC);
436
+ if (err)
437
+ return err;
466438
467439 req_endianness =
468440 MLX5_CAP_ATOMIC(dev,
....@@ -471,37 +443,72 @@
471443 if (req_endianness != MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS)
472444 return 0;
473445
474
- set_ctx = kzalloc(set_sz, GFP_KERNEL);
475
- if (!set_ctx)
476
- return -ENOMEM;
477
-
478446 set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
479447
480448 /* Set requestor to host endianness */
481449 MLX5_SET(atomic_caps, set_hca_cap, atomic_req_8B_endianness_mode,
482450 MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS);
483451
484
- err = set_caps(dev, set_ctx, set_sz, MLX5_SET_HCA_CAP_OP_MOD_ATOMIC);
485
-
486
- kfree(set_ctx);
487
- return err;
452
+ return set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_ATOMIC);
488453 }
489454
490
-static int handle_hca_cap(struct mlx5_core_dev *dev)
455
+static int handle_hca_cap_odp(struct mlx5_core_dev *dev, void *set_ctx)
491456 {
492
- void *set_ctx = NULL;
493
- struct mlx5_profile *prof = dev->profile;
494
- int err = -ENOMEM;
495
- int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
496457 void *set_hca_cap;
458
+ bool do_set = false;
459
+ int err;
497460
498
- set_ctx = kzalloc(set_sz, GFP_KERNEL);
499
- if (!set_ctx)
500
- goto query_ex;
461
+ if (!IS_ENABLED(CONFIG_INFINIBAND_ON_DEMAND_PAGING) ||
462
+ !MLX5_CAP_GEN(dev, pg))
463
+ return 0;
464
+
465
+ err = mlx5_core_get_caps(dev, MLX5_CAP_ODP);
466
+ if (err)
467
+ return err;
468
+
469
+ set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
470
+ memcpy(set_hca_cap, dev->caps.hca_cur[MLX5_CAP_ODP],
471
+ MLX5_ST_SZ_BYTES(odp_cap));
472
+
473
+#define ODP_CAP_SET_MAX(dev, field) \
474
+ do { \
475
+ u32 _res = MLX5_CAP_ODP_MAX(dev, field); \
476
+ if (_res) { \
477
+ do_set = true; \
478
+ MLX5_SET(odp_cap, set_hca_cap, field, _res); \
479
+ } \
480
+ } while (0)
481
+
482
+ ODP_CAP_SET_MAX(dev, ud_odp_caps.srq_receive);
483
+ ODP_CAP_SET_MAX(dev, rc_odp_caps.srq_receive);
484
+ ODP_CAP_SET_MAX(dev, xrc_odp_caps.srq_receive);
485
+ ODP_CAP_SET_MAX(dev, xrc_odp_caps.send);
486
+ ODP_CAP_SET_MAX(dev, xrc_odp_caps.receive);
487
+ ODP_CAP_SET_MAX(dev, xrc_odp_caps.write);
488
+ ODP_CAP_SET_MAX(dev, xrc_odp_caps.read);
489
+ ODP_CAP_SET_MAX(dev, xrc_odp_caps.atomic);
490
+ ODP_CAP_SET_MAX(dev, dc_odp_caps.srq_receive);
491
+ ODP_CAP_SET_MAX(dev, dc_odp_caps.send);
492
+ ODP_CAP_SET_MAX(dev, dc_odp_caps.receive);
493
+ ODP_CAP_SET_MAX(dev, dc_odp_caps.write);
494
+ ODP_CAP_SET_MAX(dev, dc_odp_caps.read);
495
+ ODP_CAP_SET_MAX(dev, dc_odp_caps.atomic);
496
+
497
+ if (!do_set)
498
+ return 0;
499
+
500
+ return set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_ODP);
501
+}
502
+
503
+static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)
504
+{
505
+ struct mlx5_profile *prof = dev->profile;
506
+ void *set_hca_cap;
507
+ int err;
501508
502509 err = mlx5_core_get_caps(dev, MLX5_CAP_GENERAL);
503510 if (err)
504
- goto query_ex;
511
+ return err;
505512
506513 set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx,
507514 capability);
....@@ -546,16 +553,87 @@
546553 if (MLX5_CAP_GEN_MAX(dev, dct))
547554 MLX5_SET(cmd_hca_cap, set_hca_cap, dct, 1);
548555
556
+ if (MLX5_CAP_GEN_MAX(dev, pci_sync_for_fw_update_event))
557
+ MLX5_SET(cmd_hca_cap, set_hca_cap, pci_sync_for_fw_update_event, 1);
558
+
549559 if (MLX5_CAP_GEN_MAX(dev, num_vhca_ports))
550560 MLX5_SET(cmd_hca_cap,
551561 set_hca_cap,
552562 num_vhca_ports,
553563 MLX5_CAP_GEN_MAX(dev, num_vhca_ports));
554564
555
- err = set_caps(dev, set_ctx, set_sz,
556
- MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
565
+ if (MLX5_CAP_GEN_MAX(dev, release_all_pages))
566
+ MLX5_SET(cmd_hca_cap, set_hca_cap, release_all_pages, 1);
557567
558
-query_ex:
568
+ if (MLX5_CAP_GEN_MAX(dev, mkey_by_name))
569
+ MLX5_SET(cmd_hca_cap, set_hca_cap, mkey_by_name, 1);
570
+
571
+ return set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
572
+}
573
+
574
+static int handle_hca_cap_roce(struct mlx5_core_dev *dev, void *set_ctx)
575
+{
576
+ void *set_hca_cap;
577
+ int err;
578
+
579
+ if (!MLX5_CAP_GEN(dev, roce))
580
+ return 0;
581
+
582
+ err = mlx5_core_get_caps(dev, MLX5_CAP_ROCE);
583
+ if (err)
584
+ return err;
585
+
586
+ if (MLX5_CAP_ROCE(dev, sw_r_roce_src_udp_port) ||
587
+ !MLX5_CAP_ROCE_MAX(dev, sw_r_roce_src_udp_port))
588
+ return 0;
589
+
590
+ set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
591
+ memcpy(set_hca_cap, dev->caps.hca_cur[MLX5_CAP_ROCE],
592
+ MLX5_ST_SZ_BYTES(roce_cap));
593
+ MLX5_SET(roce_cap, set_hca_cap, sw_r_roce_src_udp_port, 1);
594
+
595
+ err = set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MOD_ROCE);
596
+ return err;
597
+}
598
+
599
+static int set_hca_cap(struct mlx5_core_dev *dev)
600
+{
601
+ int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
602
+ void *set_ctx;
603
+ int err;
604
+
605
+ set_ctx = kzalloc(set_sz, GFP_KERNEL);
606
+ if (!set_ctx)
607
+ return -ENOMEM;
608
+
609
+ err = handle_hca_cap(dev, set_ctx);
610
+ if (err) {
611
+ mlx5_core_err(dev, "handle_hca_cap failed\n");
612
+ goto out;
613
+ }
614
+
615
+ memset(set_ctx, 0, set_sz);
616
+ err = handle_hca_cap_atomic(dev, set_ctx);
617
+ if (err) {
618
+ mlx5_core_err(dev, "handle_hca_cap_atomic failed\n");
619
+ goto out;
620
+ }
621
+
622
+ memset(set_ctx, 0, set_sz);
623
+ err = handle_hca_cap_odp(dev, set_ctx);
624
+ if (err) {
625
+ mlx5_core_err(dev, "handle_hca_cap_odp failed\n");
626
+ goto out;
627
+ }
628
+
629
+ memset(set_ctx, 0, set_sz);
630
+ err = handle_hca_cap_roce(dev, set_ctx);
631
+ if (err) {
632
+ mlx5_core_err(dev, "handle_hca_cap_roce failed\n");
633
+ goto out;
634
+ }
635
+
636
+out:
559637 kfree(set_ctx);
560638 return err;
561639 }
....@@ -590,220 +668,35 @@
590668
591669 int mlx5_core_enable_hca(struct mlx5_core_dev *dev, u16 func_id)
592670 {
593
- u32 out[MLX5_ST_SZ_DW(enable_hca_out)] = {0};
594
- u32 in[MLX5_ST_SZ_DW(enable_hca_in)] = {0};
671
+ u32 in[MLX5_ST_SZ_DW(enable_hca_in)] = {};
595672
596673 MLX5_SET(enable_hca_in, in, opcode, MLX5_CMD_OP_ENABLE_HCA);
597674 MLX5_SET(enable_hca_in, in, function_id, func_id);
598
- return mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
675
+ MLX5_SET(enable_hca_in, in, embedded_cpu_function,
676
+ dev->caps.embedded_cpu);
677
+ return mlx5_cmd_exec_in(dev, enable_hca, in);
599678 }
600679
601680 int mlx5_core_disable_hca(struct mlx5_core_dev *dev, u16 func_id)
602681 {
603
- u32 out[MLX5_ST_SZ_DW(disable_hca_out)] = {0};
604
- u32 in[MLX5_ST_SZ_DW(disable_hca_in)] = {0};
682
+ u32 in[MLX5_ST_SZ_DW(disable_hca_in)] = {};
605683
606684 MLX5_SET(disable_hca_in, in, opcode, MLX5_CMD_OP_DISABLE_HCA);
607685 MLX5_SET(disable_hca_in, in, function_id, func_id);
608
- return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
609
-}
610
-
611
-u64 mlx5_read_internal_timer(struct mlx5_core_dev *dev)
612
-{
613
- u32 timer_h, timer_h1, timer_l;
614
-
615
- timer_h = ioread32be(&dev->iseg->internal_timer_h);
616
- timer_l = ioread32be(&dev->iseg->internal_timer_l);
617
- timer_h1 = ioread32be(&dev->iseg->internal_timer_h);
618
- if (timer_h != timer_h1) /* wrap around */
619
- timer_l = ioread32be(&dev->iseg->internal_timer_l);
620
-
621
- return (u64)timer_l | (u64)timer_h1 << 32;
622
-}
623
-
624
-static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
625
-{
626
- struct mlx5_priv *priv = &mdev->priv;
627
- int vecidx = MLX5_EQ_VEC_COMP_BASE + i;
628
- int irq = pci_irq_vector(mdev->pdev, vecidx);
629
-
630
- if (!zalloc_cpumask_var(&priv->irq_info[vecidx].mask, GFP_KERNEL)) {
631
- mlx5_core_warn(mdev, "zalloc_cpumask_var failed");
632
- return -ENOMEM;
633
- }
634
-
635
- cpumask_set_cpu(cpumask_local_spread(i, priv->numa_node),
636
- priv->irq_info[vecidx].mask);
637
-
638
- if (IS_ENABLED(CONFIG_SMP) &&
639
- irq_set_affinity_hint(irq, priv->irq_info[vecidx].mask))
640
- mlx5_core_warn(mdev, "irq_set_affinity_hint failed, irq 0x%.4x", irq);
641
-
642
- return 0;
643
-}
644
-
645
-static void mlx5_irq_clear_affinity_hint(struct mlx5_core_dev *mdev, int i)
646
-{
647
- int vecidx = MLX5_EQ_VEC_COMP_BASE + i;
648
- struct mlx5_priv *priv = &mdev->priv;
649
- int irq = pci_irq_vector(mdev->pdev, vecidx);
650
-
651
- irq_set_affinity_hint(irq, NULL);
652
- free_cpumask_var(priv->irq_info[vecidx].mask);
653
-}
654
-
655
-static int mlx5_irq_set_affinity_hints(struct mlx5_core_dev *mdev)
656
-{
657
- int err;
658
- int i;
659
-
660
- for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++) {
661
- err = mlx5_irq_set_affinity_hint(mdev, i);
662
- if (err)
663
- goto err_out;
664
- }
665
-
666
- return 0;
667
-
668
-err_out:
669
- for (i--; i >= 0; i--)
670
- mlx5_irq_clear_affinity_hint(mdev, i);
671
-
672
- return err;
673
-}
674
-
675
-static void mlx5_irq_clear_affinity_hints(struct mlx5_core_dev *mdev)
676
-{
677
- int i;
678
-
679
- for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++)
680
- mlx5_irq_clear_affinity_hint(mdev, i);
681
-}
682
-
683
-int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,
684
- unsigned int *irqn)
685
-{
686
- struct mlx5_eq_table *table = &dev->priv.eq_table;
687
- struct mlx5_eq *eq, *n;
688
- int err = -ENOENT;
689
-
690
- spin_lock(&table->lock);
691
- list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
692
- if (eq->index == vector) {
693
- *eqn = eq->eqn;
694
- *irqn = eq->irqn;
695
- err = 0;
696
- break;
697
- }
698
- }
699
- spin_unlock(&table->lock);
700
-
701
- return err;
702
-}
703
-EXPORT_SYMBOL(mlx5_vector2eqn);
704
-
705
-struct mlx5_eq *mlx5_eqn2eq(struct mlx5_core_dev *dev, int eqn)
706
-{
707
- struct mlx5_eq_table *table = &dev->priv.eq_table;
708
- struct mlx5_eq *eq;
709
-
710
- spin_lock(&table->lock);
711
- list_for_each_entry(eq, &table->comp_eqs_list, list)
712
- if (eq->eqn == eqn) {
713
- spin_unlock(&table->lock);
714
- return eq;
715
- }
716
-
717
- spin_unlock(&table->lock);
718
-
719
- return ERR_PTR(-ENOENT);
720
-}
721
-
722
-static void free_comp_eqs(struct mlx5_core_dev *dev)
723
-{
724
- struct mlx5_eq_table *table = &dev->priv.eq_table;
725
- struct mlx5_eq *eq, *n;
726
-
727
-#ifdef CONFIG_RFS_ACCEL
728
- if (dev->rmap) {
729
- free_irq_cpu_rmap(dev->rmap);
730
- dev->rmap = NULL;
731
- }
732
-#endif
733
- spin_lock(&table->lock);
734
- list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
735
- list_del(&eq->list);
736
- spin_unlock(&table->lock);
737
- if (mlx5_destroy_unmap_eq(dev, eq))
738
- mlx5_core_warn(dev, "failed to destroy EQ 0x%x\n",
739
- eq->eqn);
740
- kfree(eq);
741
- spin_lock(&table->lock);
742
- }
743
- spin_unlock(&table->lock);
744
-}
745
-
746
-static int alloc_comp_eqs(struct mlx5_core_dev *dev)
747
-{
748
- struct mlx5_eq_table *table = &dev->priv.eq_table;
749
- char name[MLX5_MAX_IRQ_NAME];
750
- struct mlx5_eq *eq;
751
- int ncomp_vec;
752
- int nent;
753
- int err;
754
- int i;
755
-
756
- INIT_LIST_HEAD(&table->comp_eqs_list);
757
- ncomp_vec = table->num_comp_vectors;
758
- nent = MLX5_COMP_EQ_SIZE;
759
-#ifdef CONFIG_RFS_ACCEL
760
- dev->rmap = alloc_irq_cpu_rmap(ncomp_vec);
761
- if (!dev->rmap)
762
- return -ENOMEM;
763
-#endif
764
- for (i = 0; i < ncomp_vec; i++) {
765
- eq = kzalloc(sizeof(*eq), GFP_KERNEL);
766
- if (!eq) {
767
- err = -ENOMEM;
768
- goto clean;
769
- }
770
-
771
-#ifdef CONFIG_RFS_ACCEL
772
- irq_cpu_rmap_add(dev->rmap, pci_irq_vector(dev->pdev,
773
- MLX5_EQ_VEC_COMP_BASE + i));
774
-#endif
775
- snprintf(name, MLX5_MAX_IRQ_NAME, "mlx5_comp%d", i);
776
- err = mlx5_create_map_eq(dev, eq,
777
- i + MLX5_EQ_VEC_COMP_BASE, nent, 0,
778
- name, MLX5_EQ_TYPE_COMP);
779
- if (err) {
780
- kfree(eq);
781
- goto clean;
782
- }
783
- mlx5_core_dbg(dev, "allocated completion EQN %d\n", eq->eqn);
784
- eq->index = i;
785
- spin_lock(&table->lock);
786
- list_add_tail(&eq->list, &table->comp_eqs_list);
787
- spin_unlock(&table->lock);
788
- }
789
-
790
- return 0;
791
-
792
-clean:
793
- free_comp_eqs(dev);
794
- return err;
686
+ MLX5_SET(enable_hca_in, in, embedded_cpu_function,
687
+ dev->caps.embedded_cpu);
688
+ return mlx5_cmd_exec_in(dev, disable_hca, in);
795689 }
796690
797691 static int mlx5_core_set_issi(struct mlx5_core_dev *dev)
798692 {
799
- u32 query_in[MLX5_ST_SZ_DW(query_issi_in)] = {0};
800
- u32 query_out[MLX5_ST_SZ_DW(query_issi_out)] = {0};
693
+ u32 query_out[MLX5_ST_SZ_DW(query_issi_out)] = {};
694
+ u32 query_in[MLX5_ST_SZ_DW(query_issi_in)] = {};
801695 u32 sup_issi;
802696 int err;
803697
804698 MLX5_SET(query_issi_in, query_in, opcode, MLX5_CMD_OP_QUERY_ISSI);
805
- err = mlx5_cmd_exec(dev, query_in, sizeof(query_in),
806
- query_out, sizeof(query_out));
699
+ err = mlx5_cmd_exec_inout(dev, query_issi, query_in, query_out);
807700 if (err) {
808701 u32 syndrome;
809702 u8 status;
....@@ -823,13 +716,11 @@
823716 sup_issi = MLX5_GET(query_issi_out, query_out, supported_issi_dw0);
824717
825718 if (sup_issi & (1 << 1)) {
826
- u32 set_in[MLX5_ST_SZ_DW(set_issi_in)] = {0};
827
- u32 set_out[MLX5_ST_SZ_DW(set_issi_out)] = {0};
719
+ u32 set_in[MLX5_ST_SZ_DW(set_issi_in)] = {};
828720
829721 MLX5_SET(set_issi_in, set_in, opcode, MLX5_CMD_OP_SET_ISSI);
830722 MLX5_SET(set_issi_in, set_in, current_issi, 1);
831
- err = mlx5_cmd_exec(dev, set_in, sizeof(set_in),
832
- set_out, sizeof(set_out));
723
+ err = mlx5_cmd_exec_in(dev, set_issi, set_in);
833724 if (err) {
834725 mlx5_core_err(dev, "Failed to set ISSI to 1 err(%d)\n",
835726 err);
....@@ -846,36 +737,27 @@
846737 return -EOPNOTSUPP;
847738 }
848739
849
-static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
740
+static int mlx5_pci_init(struct mlx5_core_dev *dev, struct pci_dev *pdev,
741
+ const struct pci_device_id *id)
850742 {
851
- struct pci_dev *pdev = dev->pdev;
743
+ struct mlx5_priv *priv = &dev->priv;
852744 int err = 0;
853745
746
+ mutex_init(&dev->pci_status_mutex);
854747 pci_set_drvdata(dev->pdev, dev);
855
- strncpy(priv->name, dev_name(&pdev->dev), MLX5_MAX_NAME_LEN);
856
- priv->name[MLX5_MAX_NAME_LEN - 1] = 0;
857748
858
- mutex_init(&priv->pgdir_mutex);
859
- INIT_LIST_HEAD(&priv->pgdir_list);
860
- spin_lock_init(&priv->mkey_lock);
861
-
862
- mutex_init(&priv->alloc_mutex);
863
-
864
- priv->numa_node = dev_to_node(&dev->pdev->dev);
865
-
866
- if (mlx5_debugfs_root)
867
- priv->dbg_root =
868
- debugfs_create_dir(pci_name(pdev), mlx5_debugfs_root);
749
+ dev->bar_addr = pci_resource_start(pdev, 0);
750
+ priv->numa_node = dev_to_node(mlx5_core_dma_dev(dev));
869751
870752 err = mlx5_pci_enable_device(dev);
871753 if (err) {
872
- dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
873
- goto err_dbg;
754
+ mlx5_core_err(dev, "Cannot enable PCI device, aborting\n");
755
+ return err;
874756 }
875757
876758 err = request_bar(pdev);
877759 if (err) {
878
- dev_err(&pdev->dev, "error requesting BARs, aborting\n");
760
+ mlx5_core_err(dev, "error requesting BARs, aborting\n");
879761 goto err_disable;
880762 }
881763
....@@ -883,18 +765,25 @@
883765
884766 err = set_dma_caps(pdev);
885767 if (err) {
886
- dev_err(&pdev->dev, "Failed setting DMA capabilities mask, aborting\n");
768
+ mlx5_core_err(dev, "Failed setting DMA capabilities mask, aborting\n");
887769 goto err_clr_master;
888770 }
889771
890
- dev->iseg_base = pci_resource_start(dev->pdev, 0);
772
+ if (pci_enable_atomic_ops_to_root(pdev, PCI_EXP_DEVCAP2_ATOMIC_COMP32) &&
773
+ pci_enable_atomic_ops_to_root(pdev, PCI_EXP_DEVCAP2_ATOMIC_COMP64) &&
774
+ pci_enable_atomic_ops_to_root(pdev, PCI_EXP_DEVCAP2_ATOMIC_COMP128))
775
+ mlx5_core_dbg(dev, "Enabling pci atomics failed\n");
776
+
777
+ dev->iseg_base = dev->bar_addr;
891778 dev->iseg = ioremap(dev->iseg_base, sizeof(*dev->iseg));
892779 if (!dev->iseg) {
893780 err = -ENOMEM;
894
- dev_err(&pdev->dev, "Failed mapping initialization segment, aborting\n");
781
+ mlx5_core_err(dev, "Failed mapping initialization segment, aborting\n");
895782 goto err_clr_master;
896783 }
897784
785
+ mlx5_pci_vsc_init(dev);
786
+ dev->caps.embedded_cpu = mlx5_read_embedded_cpu(dev);
898787 return 0;
899788
900789 err_clr_master:
....@@ -902,229 +791,233 @@
902791 release_bar(dev->pdev);
903792 err_disable:
904793 mlx5_pci_disable_device(dev);
905
-
906
-err_dbg:
907
- debugfs_remove(priv->dbg_root);
908794 return err;
909795 }
910796
911
-static void mlx5_pci_close(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
797
+static void mlx5_pci_close(struct mlx5_core_dev *dev)
912798 {
799
+ /* health work might still be active, and it needs pci bar in
800
+ * order to know the NIC state. Therefore, drain the health WQ
801
+ * before removing the pci bars
802
+ */
803
+ mlx5_drain_health_wq(dev);
913804 iounmap(dev->iseg);
914805 pci_clear_master(dev->pdev);
915806 release_bar(dev->pdev);
916807 mlx5_pci_disable_device(dev);
917
- debugfs_remove_recursive(priv->dbg_root);
918808 }
919809
920
-static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
810
+static int mlx5_init_once(struct mlx5_core_dev *dev)
921811 {
922
- struct pci_dev *pdev = dev->pdev;
923812 int err;
813
+
814
+ dev->priv.devcom = mlx5_devcom_register_device(dev);
815
+ if (IS_ERR(dev->priv.devcom))
816
+ mlx5_core_err(dev, "failed to register with devcom (0x%p)\n",
817
+ dev->priv.devcom);
924818
925819 err = mlx5_query_board_id(dev);
926820 if (err) {
927
- dev_err(&pdev->dev, "query board id failed\n");
928
- goto out;
821
+ mlx5_core_err(dev, "query board id failed\n");
822
+ goto err_devcom;
929823 }
930824
931
- err = mlx5_eq_init(dev);
825
+ err = mlx5_irq_table_init(dev);
932826 if (err) {
933
- dev_err(&pdev->dev, "failed to initialize eq\n");
934
- goto out;
827
+ mlx5_core_err(dev, "failed to initialize irq table\n");
828
+ goto err_devcom;
935829 }
936830
937
- err = mlx5_cq_debugfs_init(dev);
831
+ err = mlx5_eq_table_init(dev);
938832 if (err) {
939
- dev_err(&pdev->dev, "failed to initialize cq debugfs\n");
833
+ mlx5_core_err(dev, "failed to initialize eq\n");
834
+ goto err_irq_cleanup;
835
+ }
836
+
837
+ err = mlx5_events_init(dev);
838
+ if (err) {
839
+ mlx5_core_err(dev, "failed to initialize events\n");
940840 goto err_eq_cleanup;
941841 }
942842
943
- mlx5_init_qp_table(dev);
843
+ err = mlx5_fw_reset_init(dev);
844
+ if (err) {
845
+ mlx5_core_err(dev, "failed to initialize fw reset events\n");
846
+ goto err_events_cleanup;
847
+ }
944848
945
- mlx5_init_srq_table(dev);
946
-
947
- mlx5_init_mkey_table(dev);
849
+ mlx5_cq_debugfs_init(dev);
948850
949851 mlx5_init_reserved_gids(dev);
950852
951853 mlx5_init_clock(dev);
952854
953855 dev->vxlan = mlx5_vxlan_create(dev);
856
+ dev->geneve = mlx5_geneve_create(dev);
954857
955858 err = mlx5_init_rl_table(dev);
956859 if (err) {
957
- dev_err(&pdev->dev, "Failed to init rate limiting\n");
860
+ mlx5_core_err(dev, "Failed to init rate limiting\n");
958861 goto err_tables_cleanup;
959862 }
960863
961864 err = mlx5_mpfs_init(dev);
962865 if (err) {
963
- dev_err(&pdev->dev, "Failed to init l2 table %d\n", err);
866
+ mlx5_core_err(dev, "Failed to init l2 table %d\n", err);
964867 goto err_rl_cleanup;
965
- }
966
-
967
- err = mlx5_eswitch_init(dev);
968
- if (err) {
969
- dev_err(&pdev->dev, "Failed to init eswitch %d\n", err);
970
- goto err_mpfs_cleanup;
971868 }
972869
973870 err = mlx5_sriov_init(dev);
974871 if (err) {
975
- dev_err(&pdev->dev, "Failed to init sriov %d\n", err);
976
- goto err_eswitch_cleanup;
872
+ mlx5_core_err(dev, "Failed to init sriov %d\n", err);
873
+ goto err_mpfs_cleanup;
874
+ }
875
+
876
+ err = mlx5_eswitch_init(dev);
877
+ if (err) {
878
+ mlx5_core_err(dev, "Failed to init eswitch %d\n", err);
879
+ goto err_sriov_cleanup;
977880 }
978881
979882 err = mlx5_fpga_init(dev);
980883 if (err) {
981
- dev_err(&pdev->dev, "Failed to init fpga device %d\n", err);
982
- goto err_sriov_cleanup;
884
+ mlx5_core_err(dev, "Failed to init fpga device %d\n", err);
885
+ goto err_eswitch_cleanup;
983886 }
984887
888
+ dev->dm = mlx5_dm_create(dev);
889
+ if (IS_ERR(dev->dm))
890
+ mlx5_core_warn(dev, "Failed to init device memory%d\n", err);
891
+
985892 dev->tracer = mlx5_fw_tracer_create(dev);
893
+ dev->hv_vhca = mlx5_hv_vhca_create(dev);
894
+ dev->rsc_dump = mlx5_rsc_dump_create(dev);
986895
987896 return 0;
988897
989
-err_sriov_cleanup:
990
- mlx5_sriov_cleanup(dev);
991898 err_eswitch_cleanup:
992899 mlx5_eswitch_cleanup(dev->priv.eswitch);
900
+err_sriov_cleanup:
901
+ mlx5_sriov_cleanup(dev);
993902 err_mpfs_cleanup:
994903 mlx5_mpfs_cleanup(dev);
995904 err_rl_cleanup:
996905 mlx5_cleanup_rl_table(dev);
997906 err_tables_cleanup:
907
+ mlx5_geneve_destroy(dev->geneve);
998908 mlx5_vxlan_destroy(dev->vxlan);
999
- mlx5_cleanup_mkey_table(dev);
1000
- mlx5_cleanup_srq_table(dev);
1001
- mlx5_cleanup_qp_table(dev);
1002909 mlx5_cq_debugfs_cleanup(dev);
1003
-
910
+ mlx5_fw_reset_cleanup(dev);
911
+err_events_cleanup:
912
+ mlx5_events_cleanup(dev);
1004913 err_eq_cleanup:
1005
- mlx5_eq_cleanup(dev);
914
+ mlx5_eq_table_cleanup(dev);
915
+err_irq_cleanup:
916
+ mlx5_irq_table_cleanup(dev);
917
+err_devcom:
918
+ mlx5_devcom_unregister_device(dev->priv.devcom);
1006919
1007
-out:
1008920 return err;
1009921 }
1010922
1011923 static void mlx5_cleanup_once(struct mlx5_core_dev *dev)
1012924 {
925
+ mlx5_rsc_dump_destroy(dev);
926
+ mlx5_hv_vhca_destroy(dev->hv_vhca);
1013927 mlx5_fw_tracer_destroy(dev->tracer);
928
+ mlx5_dm_cleanup(dev);
1014929 mlx5_fpga_cleanup(dev);
1015
- mlx5_sriov_cleanup(dev);
1016930 mlx5_eswitch_cleanup(dev->priv.eswitch);
931
+ mlx5_sriov_cleanup(dev);
1017932 mlx5_mpfs_cleanup(dev);
1018933 mlx5_cleanup_rl_table(dev);
934
+ mlx5_geneve_destroy(dev->geneve);
1019935 mlx5_vxlan_destroy(dev->vxlan);
1020936 mlx5_cleanup_clock(dev);
1021937 mlx5_cleanup_reserved_gids(dev);
1022
- mlx5_cleanup_mkey_table(dev);
1023
- mlx5_cleanup_srq_table(dev);
1024
- mlx5_cleanup_qp_table(dev);
1025938 mlx5_cq_debugfs_cleanup(dev);
1026
- mlx5_eq_cleanup(dev);
939
+ mlx5_fw_reset_cleanup(dev);
940
+ mlx5_events_cleanup(dev);
941
+ mlx5_eq_table_cleanup(dev);
942
+ mlx5_irq_table_cleanup(dev);
943
+ mlx5_devcom_unregister_device(dev->priv.devcom);
1027944 }
1028945
1029
-static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
1030
- bool boot)
946
+static int mlx5_function_setup(struct mlx5_core_dev *dev, bool boot)
1031947 {
1032
- struct pci_dev *pdev = dev->pdev;
1033948 int err;
1034949
1035
- mutex_lock(&dev->intf_state_mutex);
1036
- if (test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
1037
- dev_warn(&dev->pdev->dev, "%s: interface is up, NOP\n",
1038
- __func__);
1039
- goto out;
1040
- }
1041
-
1042
- dev_info(&pdev->dev, "firmware version: %d.%d.%d\n", fw_rev_maj(dev),
1043
- fw_rev_min(dev), fw_rev_sub(dev));
950
+ mlx5_core_info(dev, "firmware version: %d.%d.%d\n", fw_rev_maj(dev),
951
+ fw_rev_min(dev), fw_rev_sub(dev));
1044952
1045953 /* Only PFs hold the relevant PCIe information for this query */
1046954 if (mlx5_core_is_pf(dev))
1047955 pcie_print_link_status(dev->pdev);
1048956
1049
- /* on load removing any previous indication of internal error, device is
1050
- * up
1051
- */
1052
- dev->state = MLX5_DEVICE_STATE_UP;
1053
-
1054957 /* wait for firmware to accept initialization segments configurations
1055958 */
1056
- err = wait_fw_init(dev, FW_PRE_INIT_TIMEOUT_MILI);
959
+ err = wait_fw_init(dev, FW_PRE_INIT_TIMEOUT_MILI, FW_INIT_WARN_MESSAGE_INTERVAL);
1057960 if (err) {
1058
- dev_err(&dev->pdev->dev, "Firmware over %d MS in pre-initializing state, aborting\n",
1059
- FW_PRE_INIT_TIMEOUT_MILI);
1060
- goto out_err;
961
+ mlx5_core_err(dev, "Firmware over %d MS in pre-initializing state, aborting\n",
962
+ FW_PRE_INIT_TIMEOUT_MILI);
963
+ return err;
1061964 }
1062965
1063966 err = mlx5_cmd_init(dev);
1064967 if (err) {
1065
- dev_err(&pdev->dev, "Failed initializing command interface, aborting\n");
1066
- goto out_err;
968
+ mlx5_core_err(dev, "Failed initializing command interface, aborting\n");
969
+ return err;
1067970 }
1068971
1069
- err = wait_fw_init(dev, FW_INIT_TIMEOUT_MILI);
972
+ err = wait_fw_init(dev, FW_INIT_TIMEOUT_MILI, 0);
1070973 if (err) {
1071
- dev_err(&dev->pdev->dev, "Firmware over %d MS in initializing state, aborting\n",
1072
- FW_INIT_TIMEOUT_MILI);
974
+ mlx5_core_err(dev, "Firmware over %d MS in initializing state, aborting\n",
975
+ FW_INIT_TIMEOUT_MILI);
1073976 goto err_cmd_cleanup;
1074977 }
1075978
979
+ mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_UP);
980
+
1076981 err = mlx5_core_enable_hca(dev, 0);
1077982 if (err) {
1078
- dev_err(&pdev->dev, "enable hca failed\n");
983
+ mlx5_core_err(dev, "enable hca failed\n");
1079984 goto err_cmd_cleanup;
1080985 }
1081986
1082987 err = mlx5_core_set_issi(dev);
1083988 if (err) {
1084
- dev_err(&pdev->dev, "failed to set issi\n");
989
+ mlx5_core_err(dev, "failed to set issi\n");
1085990 goto err_disable_hca;
1086991 }
1087992
1088993 err = mlx5_satisfy_startup_pages(dev, 1);
1089994 if (err) {
1090
- dev_err(&pdev->dev, "failed to allocate boot pages\n");
995
+ mlx5_core_err(dev, "failed to allocate boot pages\n");
1091996 goto err_disable_hca;
1092997 }
1093998
1094999 err = set_hca_ctrl(dev);
10951000 if (err) {
1096
- dev_err(&pdev->dev, "set_hca_ctrl failed\n");
1001
+ mlx5_core_err(dev, "set_hca_ctrl failed\n");
10971002 goto reclaim_boot_pages;
10981003 }
10991004
1100
- err = handle_hca_cap(dev);
1005
+ err = set_hca_cap(dev);
11011006 if (err) {
1102
- dev_err(&pdev->dev, "handle_hca_cap failed\n");
1103
- goto reclaim_boot_pages;
1104
- }
1105
-
1106
- err = handle_hca_cap_atomic(dev);
1107
- if (err) {
1108
- dev_err(&pdev->dev, "handle_hca_cap_atomic failed\n");
1007
+ mlx5_core_err(dev, "set_hca_cap failed\n");
11091008 goto reclaim_boot_pages;
11101009 }
11111010
11121011 err = mlx5_satisfy_startup_pages(dev, 0);
11131012 if (err) {
1114
- dev_err(&pdev->dev, "failed to allocate init pages\n");
1115
- goto reclaim_boot_pages;
1116
- }
1117
-
1118
- err = mlx5_pagealloc_start(dev);
1119
- if (err) {
1120
- dev_err(&pdev->dev, "mlx5_pagealloc_start failed\n");
1013
+ mlx5_core_err(dev, "failed to allocate init pages\n");
11211014 goto reclaim_boot_pages;
11221015 }
11231016
11241017 err = mlx5_cmd_init_hca(dev, sw_owner_id);
11251018 if (err) {
1126
- dev_err(&pdev->dev, "init hca failed\n");
1127
- goto err_pagealloc_stop;
1019
+ mlx5_core_err(dev, "init hca failed\n");
1020
+ goto reclaim_boot_pages;
11281021 }
11291022
11301023 mlx5_set_driver_version(dev);
....@@ -1133,182 +1026,240 @@
11331026
11341027 err = mlx5_query_hca_caps(dev);
11351028 if (err) {
1136
- dev_err(&pdev->dev, "query hca failed\n");
1137
- goto err_stop_poll;
1029
+ mlx5_core_err(dev, "query hca failed\n");
1030
+ goto stop_health;
11381031 }
11391032
1140
- if (boot) {
1141
- err = mlx5_init_once(dev, priv);
1142
- if (err) {
1143
- dev_err(&pdev->dev, "sw objs init failed\n");
1144
- goto err_stop_poll;
1145
- }
1146
- }
1033
+ return 0;
11471034
1148
- err = mlx5_alloc_irq_vectors(dev);
1035
+stop_health:
1036
+ mlx5_stop_health_poll(dev, boot);
1037
+reclaim_boot_pages:
1038
+ mlx5_reclaim_startup_pages(dev);
1039
+err_disable_hca:
1040
+ mlx5_core_disable_hca(dev, 0);
1041
+err_cmd_cleanup:
1042
+ mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_DOWN);
1043
+ mlx5_cmd_cleanup(dev);
1044
+
1045
+ return err;
1046
+}
1047
+
1048
+static int mlx5_function_teardown(struct mlx5_core_dev *dev, bool boot)
1049
+{
1050
+ int err;
1051
+
1052
+ mlx5_stop_health_poll(dev, boot);
1053
+ err = mlx5_cmd_teardown_hca(dev);
11491054 if (err) {
1150
- dev_err(&pdev->dev, "alloc irq vectors failed\n");
1151
- goto err_cleanup_once;
1055
+ mlx5_core_err(dev, "tear_down_hca failed, skip cleanup\n");
1056
+ return err;
11521057 }
1058
+ mlx5_reclaim_startup_pages(dev);
1059
+ mlx5_core_disable_hca(dev, 0);
1060
+ mlx5_cmd_set_state(dev, MLX5_CMDIF_STATE_DOWN);
1061
+ mlx5_cmd_cleanup(dev);
1062
+
1063
+ return 0;
1064
+}
1065
+
1066
+static int mlx5_load(struct mlx5_core_dev *dev)
1067
+{
1068
+ int err;
11531069
11541070 dev->priv.uar = mlx5_get_uars_page(dev);
11551071 if (IS_ERR(dev->priv.uar)) {
1156
- dev_err(&pdev->dev, "Failed allocating uar, aborting\n");
1072
+ mlx5_core_err(dev, "Failed allocating uar, aborting\n");
11571073 err = PTR_ERR(dev->priv.uar);
1158
- goto err_disable_msix;
1074
+ return err;
11591075 }
11601076
1161
- err = mlx5_start_eqs(dev);
1077
+ mlx5_events_start(dev);
1078
+ mlx5_pagealloc_start(dev);
1079
+
1080
+ err = mlx5_irq_table_create(dev);
11621081 if (err) {
1163
- dev_err(&pdev->dev, "Failed to start pages and async EQs\n");
1164
- goto err_put_uars;
1082
+ mlx5_core_err(dev, "Failed to alloc IRQs\n");
1083
+ goto err_irq_table;
1084
+ }
1085
+
1086
+ err = mlx5_eq_table_create(dev);
1087
+ if (err) {
1088
+ mlx5_core_err(dev, "Failed to create EQs\n");
1089
+ goto err_eq_table;
11651090 }
11661091
11671092 err = mlx5_fw_tracer_init(dev->tracer);
11681093 if (err) {
1169
- dev_err(&pdev->dev, "Failed to init FW tracer\n");
1094
+ mlx5_core_err(dev, "Failed to init FW tracer\n");
11701095 goto err_fw_tracer;
11711096 }
11721097
1173
- err = alloc_comp_eqs(dev);
1174
- if (err) {
1175
- dev_err(&pdev->dev, "Failed to alloc completion EQs\n");
1176
- goto err_comp_eqs;
1177
- }
1098
+ mlx5_fw_reset_events_start(dev);
1099
+ mlx5_hv_vhca_init(dev->hv_vhca);
11781100
1179
- err = mlx5_irq_set_affinity_hints(dev);
1101
+ err = mlx5_rsc_dump_init(dev);
11801102 if (err) {
1181
- dev_err(&pdev->dev, "Failed to alloc affinity hint cpumask\n");
1182
- goto err_affinity_hints;
1103
+ mlx5_core_err(dev, "Failed to init Resource dump\n");
1104
+ goto err_rsc_dump;
11831105 }
11841106
11851107 err = mlx5_fpga_device_start(dev);
11861108 if (err) {
1187
- dev_err(&pdev->dev, "fpga device start failed %d\n", err);
1109
+ mlx5_core_err(dev, "fpga device start failed %d\n", err);
11881110 goto err_fpga_start;
11891111 }
11901112
1191
- err = mlx5_accel_ipsec_init(dev);
1192
- if (err) {
1193
- dev_err(&pdev->dev, "IPSec device start failed %d\n", err);
1194
- goto err_ipsec_start;
1195
- }
1113
+ mlx5_accel_ipsec_init(dev);
11961114
11971115 err = mlx5_accel_tls_init(dev);
11981116 if (err) {
1199
- dev_err(&pdev->dev, "TLS device start failed %d\n", err);
1117
+ mlx5_core_err(dev, "TLS device start failed %d\n", err);
12001118 goto err_tls_start;
12011119 }
12021120
12031121 err = mlx5_init_fs(dev);
12041122 if (err) {
1205
- dev_err(&pdev->dev, "Failed to init flow steering\n");
1123
+ mlx5_core_err(dev, "Failed to init flow steering\n");
12061124 goto err_fs;
12071125 }
12081126
12091127 err = mlx5_core_set_hca_defaults(dev);
12101128 if (err) {
1211
- dev_err(&pdev->dev, "Failed to set hca defaults\n");
1212
- goto err_fs;
1129
+ mlx5_core_err(dev, "Failed to set hca defaults\n");
1130
+ goto err_sriov;
12131131 }
12141132
12151133 err = mlx5_sriov_attach(dev);
12161134 if (err) {
1217
- dev_err(&pdev->dev, "sriov init failed %d\n", err);
1135
+ mlx5_core_err(dev, "sriov init failed %d\n", err);
12181136 goto err_sriov;
12191137 }
12201138
1221
- if (mlx5_device_registered(dev)) {
1222
- mlx5_attach_device(dev);
1223
- } else {
1224
- err = mlx5_register_device(dev);
1225
- if (err) {
1226
- dev_err(&pdev->dev, "mlx5_register_device failed %d\n", err);
1227
- goto err_reg_dev;
1228
- }
1139
+ err = mlx5_ec_init(dev);
1140
+ if (err) {
1141
+ mlx5_core_err(dev, "Failed to init embedded CPU\n");
1142
+ goto err_ec;
12291143 }
1230
-
1231
- set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
1232
-out:
1233
- mutex_unlock(&dev->intf_state_mutex);
12341144
12351145 return 0;
12361146
1237
-err_reg_dev:
1147
+err_ec:
12381148 mlx5_sriov_detach(dev);
1239
-
12401149 err_sriov:
12411150 mlx5_cleanup_fs(dev);
1242
-
12431151 err_fs:
12441152 mlx5_accel_tls_cleanup(dev);
1245
-
12461153 err_tls_start:
12471154 mlx5_accel_ipsec_cleanup(dev);
1248
-
1249
-err_ipsec_start:
12501155 mlx5_fpga_device_stop(dev);
1251
-
12521156 err_fpga_start:
1253
- mlx5_irq_clear_affinity_hints(dev);
1254
-
1255
-err_affinity_hints:
1256
- free_comp_eqs(dev);
1257
-
1258
-err_comp_eqs:
1157
+ mlx5_rsc_dump_cleanup(dev);
1158
+err_rsc_dump:
1159
+ mlx5_hv_vhca_cleanup(dev->hv_vhca);
1160
+ mlx5_fw_reset_events_stop(dev);
12591161 mlx5_fw_tracer_cleanup(dev->tracer);
1260
-
12611162 err_fw_tracer:
1262
- mlx5_stop_eqs(dev);
1263
-
1264
-err_put_uars:
1265
- mlx5_put_uars_page(dev, priv->uar);
1266
-
1267
-err_disable_msix:
1268
- mlx5_free_irq_vectors(dev);
1269
-
1270
-err_cleanup_once:
1271
- if (boot)
1272
- mlx5_cleanup_once(dev);
1273
-
1274
-err_stop_poll:
1275
- mlx5_stop_health_poll(dev, boot);
1276
- if (mlx5_cmd_teardown_hca(dev)) {
1277
- dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
1278
- goto out_err;
1279
- }
1280
-
1281
-err_pagealloc_stop:
1163
+ mlx5_eq_table_destroy(dev);
1164
+err_eq_table:
1165
+ mlx5_irq_table_destroy(dev);
1166
+err_irq_table:
12821167 mlx5_pagealloc_stop(dev);
1283
-
1284
-reclaim_boot_pages:
1285
- mlx5_reclaim_startup_pages(dev);
1286
-
1287
-err_disable_hca:
1288
- mlx5_core_disable_hca(dev, 0);
1289
-
1290
-err_cmd_cleanup:
1291
- mlx5_cmd_cleanup(dev);
1292
-
1293
-out_err:
1294
- dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
1295
- mutex_unlock(&dev->intf_state_mutex);
1296
-
1168
+ mlx5_events_stop(dev);
1169
+ mlx5_put_uars_page(dev, dev->priv.uar);
12971170 return err;
12981171 }
12991172
1300
-static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
1301
- bool cleanup)
1173
+static void mlx5_unload(struct mlx5_core_dev *dev)
1174
+{
1175
+ mlx5_ec_cleanup(dev);
1176
+ mlx5_sriov_detach(dev);
1177
+ mlx5_cleanup_fs(dev);
1178
+ mlx5_accel_ipsec_cleanup(dev);
1179
+ mlx5_accel_tls_cleanup(dev);
1180
+ mlx5_fpga_device_stop(dev);
1181
+ mlx5_rsc_dump_cleanup(dev);
1182
+ mlx5_hv_vhca_cleanup(dev->hv_vhca);
1183
+ mlx5_fw_reset_events_stop(dev);
1184
+ mlx5_fw_tracer_cleanup(dev->tracer);
1185
+ mlx5_eq_table_destroy(dev);
1186
+ mlx5_irq_table_destroy(dev);
1187
+ mlx5_pagealloc_stop(dev);
1188
+ mlx5_events_stop(dev);
1189
+ mlx5_put_uars_page(dev, dev->priv.uar);
1190
+}
1191
+
1192
+int mlx5_load_one(struct mlx5_core_dev *dev, bool boot)
13021193 {
13031194 int err = 0;
13041195
1305
- if (cleanup)
1306
- mlx5_drain_health_recovery(dev);
1307
-
13081196 mutex_lock(&dev->intf_state_mutex);
1197
+ if (test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
1198
+ mlx5_core_warn(dev, "interface is up, NOP\n");
1199
+ goto out;
1200
+ }
1201
+ /* remove any previous indication of internal error */
1202
+ dev->state = MLX5_DEVICE_STATE_UP;
1203
+
1204
+ err = mlx5_function_setup(dev, boot);
1205
+ if (err)
1206
+ goto err_function;
1207
+
1208
+ if (boot) {
1209
+ err = mlx5_init_once(dev);
1210
+ if (err) {
1211
+ mlx5_core_err(dev, "sw objs init failed\n");
1212
+ goto function_teardown;
1213
+ }
1214
+ }
1215
+
1216
+ err = mlx5_load(dev);
1217
+ if (err)
1218
+ goto err_load;
1219
+
1220
+ set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
1221
+
1222
+ if (boot) {
1223
+ err = mlx5_devlink_register(priv_to_devlink(dev), dev->device);
1224
+ if (err)
1225
+ goto err_devlink_reg;
1226
+ mlx5_register_device(dev);
1227
+ } else {
1228
+ mlx5_attach_device(dev);
1229
+ }
1230
+
1231
+ mutex_unlock(&dev->intf_state_mutex);
1232
+ return 0;
1233
+
1234
+err_devlink_reg:
1235
+ clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
1236
+ mlx5_unload(dev);
1237
+err_load:
1238
+ if (boot)
1239
+ mlx5_cleanup_once(dev);
1240
+function_teardown:
1241
+ mlx5_function_teardown(dev, boot);
1242
+err_function:
1243
+ dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
1244
+out:
1245
+ mutex_unlock(&dev->intf_state_mutex);
1246
+ return err;
1247
+}
1248
+
1249
+void mlx5_unload_one(struct mlx5_core_dev *dev, bool cleanup)
1250
+{
1251
+ mutex_lock(&dev->intf_state_mutex);
1252
+
1253
+ if (cleanup) {
1254
+ mlx5_unregister_device(dev);
1255
+ mlx5_devlink_unregister(priv_to_devlink(dev));
1256
+ } else {
1257
+ mlx5_detach_device(dev);
1258
+ }
1259
+
13091260 if (!test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
1310
- dev_warn(&dev->pdev->dev, "%s: interface is down, NOP\n",
1311
- __func__);
1261
+ mlx5_core_warn(dev, "%s: interface is down, NOP\n",
1262
+ __func__);
13121263 if (cleanup)
13131264 mlx5_cleanup_once(dev);
13141265 goto out;
....@@ -1316,143 +1267,129 @@
13161267
13171268 clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
13181269
1319
- if (mlx5_device_registered(dev))
1320
- mlx5_detach_device(dev);
1270
+ mlx5_unload(dev);
13211271
1322
- mlx5_sriov_detach(dev);
1323
- mlx5_cleanup_fs(dev);
1324
- mlx5_accel_ipsec_cleanup(dev);
1325
- mlx5_accel_tls_cleanup(dev);
1326
- mlx5_fpga_device_stop(dev);
1327
- mlx5_irq_clear_affinity_hints(dev);
1328
- free_comp_eqs(dev);
1329
- mlx5_fw_tracer_cleanup(dev->tracer);
1330
- mlx5_stop_eqs(dev);
1331
- mlx5_put_uars_page(dev, priv->uar);
1332
- mlx5_free_irq_vectors(dev);
13331272 if (cleanup)
13341273 mlx5_cleanup_once(dev);
1335
- mlx5_stop_health_poll(dev, cleanup);
1336
- err = mlx5_cmd_teardown_hca(dev);
1337
- if (err) {
1338
- dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
1339
- goto out;
1340
- }
1341
- mlx5_pagealloc_stop(dev);
1342
- mlx5_reclaim_startup_pages(dev);
1343
- mlx5_core_disable_hca(dev, 0);
1344
- mlx5_cmd_cleanup(dev);
13451274
1275
+ mlx5_function_teardown(dev, cleanup);
13461276 out:
13471277 mutex_unlock(&dev->intf_state_mutex);
1348
- return err;
13491278 }
13501279
1351
-struct mlx5_core_event_handler {
1352
- void (*event)(struct mlx5_core_dev *dev,
1353
- enum mlx5_dev_event event,
1354
- void *data);
1355
-};
1356
-
1357
-static const struct devlink_ops mlx5_devlink_ops = {
1358
-#ifdef CONFIG_MLX5_ESWITCH
1359
- .eswitch_mode_set = mlx5_devlink_eswitch_mode_set,
1360
- .eswitch_mode_get = mlx5_devlink_eswitch_mode_get,
1361
- .eswitch_inline_mode_set = mlx5_devlink_eswitch_inline_mode_set,
1362
- .eswitch_inline_mode_get = mlx5_devlink_eswitch_inline_mode_get,
1363
- .eswitch_encap_mode_set = mlx5_devlink_eswitch_encap_mode_set,
1364
- .eswitch_encap_mode_get = mlx5_devlink_eswitch_encap_mode_get,
1365
-#endif
1366
-};
1367
-
1368
-#define MLX5_IB_MOD "mlx5_ib"
1369
-static int init_one(struct pci_dev *pdev,
1370
- const struct pci_device_id *id)
1280
+static int mlx5_mdev_init(struct mlx5_core_dev *dev, int profile_idx)
13711281 {
1372
- struct mlx5_core_dev *dev;
1373
- struct devlink *devlink;
1374
- struct mlx5_priv *priv;
1282
+ struct mlx5_priv *priv = &dev->priv;
13751283 int err;
13761284
1377
- devlink = devlink_alloc(&mlx5_devlink_ops, sizeof(*dev));
1378
- if (!devlink) {
1379
- dev_err(&pdev->dev, "kzalloc failed\n");
1380
- return -ENOMEM;
1381
- }
1382
-
1383
- dev = devlink_priv(devlink);
1384
- priv = &dev->priv;
1385
- priv->pci_dev_data = id->driver_data;
1386
-
1387
- pci_set_drvdata(pdev, dev);
1388
-
1389
- dev->pdev = pdev;
1390
- dev->event = mlx5_core_event;
1391
- dev->profile = &profile[prof_sel];
1285
+ dev->profile = &profile[profile_idx];
13921286
13931287 INIT_LIST_HEAD(&priv->ctx_list);
13941288 spin_lock_init(&priv->ctx_lock);
1395
- mutex_init(&dev->pci_status_mutex);
13961289 mutex_init(&dev->intf_state_mutex);
13971290
1398
- INIT_LIST_HEAD(&priv->waiting_events_list);
1399
- priv->is_accum_events = false;
1400
-
1401
-#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
1402
- err = init_srcu_struct(&priv->pfault_srcu);
1403
- if (err) {
1404
- dev_err(&pdev->dev, "init_srcu_struct failed with error code %d\n",
1405
- err);
1406
- goto clean_dev;
1407
- }
1408
-#endif
14091291 mutex_init(&priv->bfregs.reg_head.lock);
14101292 mutex_init(&priv->bfregs.wc_head.lock);
14111293 INIT_LIST_HEAD(&priv->bfregs.reg_head.list);
14121294 INIT_LIST_HEAD(&priv->bfregs.wc_head.list);
14131295
1414
- err = mlx5_pci_init(dev, priv);
1415
- if (err) {
1416
- dev_err(&pdev->dev, "mlx5_pci_init failed with error code %d\n", err);
1417
- goto clean_srcu;
1418
- }
1296
+ mutex_init(&priv->alloc_mutex);
1297
+ mutex_init(&priv->pgdir_mutex);
1298
+ INIT_LIST_HEAD(&priv->pgdir_list);
14191299
1300
+ priv->dbg_root = debugfs_create_dir(dev_name(dev->device),
1301
+ mlx5_debugfs_root);
14201302 err = mlx5_health_init(dev);
1421
- if (err) {
1422
- dev_err(&pdev->dev, "mlx5_health_init failed with error code %d\n", err);
1423
- goto close_pci;
1303
+ if (err)
1304
+ goto err_health_init;
1305
+
1306
+ err = mlx5_pagealloc_init(dev);
1307
+ if (err)
1308
+ goto err_pagealloc_init;
1309
+
1310
+ return 0;
1311
+
1312
+err_pagealloc_init:
1313
+ mlx5_health_cleanup(dev);
1314
+err_health_init:
1315
+ debugfs_remove(dev->priv.dbg_root);
1316
+ mutex_destroy(&priv->pgdir_mutex);
1317
+ mutex_destroy(&priv->alloc_mutex);
1318
+ mutex_destroy(&priv->bfregs.wc_head.lock);
1319
+ mutex_destroy(&priv->bfregs.reg_head.lock);
1320
+ mutex_destroy(&dev->intf_state_mutex);
1321
+ return err;
1322
+}
1323
+
1324
+static void mlx5_mdev_uninit(struct mlx5_core_dev *dev)
1325
+{
1326
+ struct mlx5_priv *priv = &dev->priv;
1327
+
1328
+ mlx5_pagealloc_cleanup(dev);
1329
+ mlx5_health_cleanup(dev);
1330
+ debugfs_remove_recursive(dev->priv.dbg_root);
1331
+ mutex_destroy(&priv->pgdir_mutex);
1332
+ mutex_destroy(&priv->alloc_mutex);
1333
+ mutex_destroy(&priv->bfregs.wc_head.lock);
1334
+ mutex_destroy(&priv->bfregs.reg_head.lock);
1335
+ mutex_destroy(&dev->intf_state_mutex);
1336
+}
1337
+
1338
+#define MLX5_IB_MOD "mlx5_ib"
1339
+static int init_one(struct pci_dev *pdev, const struct pci_device_id *id)
1340
+{
1341
+ struct mlx5_core_dev *dev;
1342
+ struct devlink *devlink;
1343
+ int err;
1344
+
1345
+ devlink = mlx5_devlink_alloc();
1346
+ if (!devlink) {
1347
+ dev_err(&pdev->dev, "devlink alloc failed\n");
1348
+ return -ENOMEM;
14241349 }
14251350
1426
- mlx5_pagealloc_init(dev);
1351
+ dev = devlink_priv(devlink);
1352
+ dev->device = &pdev->dev;
1353
+ dev->pdev = pdev;
14271354
1428
- err = mlx5_load_one(dev, priv, true);
1355
+ dev->coredev_type = id->driver_data & MLX5_PCI_DEV_IS_VF ?
1356
+ MLX5_COREDEV_VF : MLX5_COREDEV_PF;
1357
+
1358
+ err = mlx5_mdev_init(dev, prof_sel);
1359
+ if (err)
1360
+ goto mdev_init_err;
1361
+
1362
+ err = mlx5_pci_init(dev, pdev, id);
14291363 if (err) {
1430
- dev_err(&pdev->dev, "mlx5_load_one failed with error code %d\n", err);
1431
- goto clean_health;
1364
+ mlx5_core_err(dev, "mlx5_pci_init failed with error code %d\n",
1365
+ err);
1366
+ goto pci_init_err;
1367
+ }
1368
+
1369
+ err = mlx5_load_one(dev, true);
1370
+ if (err) {
1371
+ mlx5_core_err(dev, "mlx5_load_one failed with error code %d\n",
1372
+ err);
1373
+ goto err_load_one;
14321374 }
14331375
14341376 request_module_nowait(MLX5_IB_MOD);
14351377
1436
- err = devlink_register(devlink, &pdev->dev);
1378
+ err = mlx5_crdump_enable(dev);
14371379 if (err)
1438
- goto clean_load;
1380
+ dev_err(&pdev->dev, "mlx5_crdump_enable failed with error code %d\n", err);
14391381
14401382 pci_save_state(pdev);
1383
+ if (!mlx5_core_is_mp_slave(dev))
1384
+ devlink_reload_enable(devlink);
14411385 return 0;
14421386
1443
-clean_load:
1444
- mlx5_unload_one(dev, priv, true);
1445
-clean_health:
1446
- mlx5_pagealloc_cleanup(dev);
1447
- mlx5_health_cleanup(dev);
1448
-close_pci:
1449
- mlx5_pci_close(dev, priv);
1450
-clean_srcu:
1451
-#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
1452
- cleanup_srcu_struct(&priv->pfault_srcu);
1453
-clean_dev:
1454
-#endif
1455
- devlink_free(devlink);
1387
+err_load_one:
1388
+ mlx5_pci_close(dev);
1389
+pci_init_err:
1390
+ mlx5_mdev_uninit(dev);
1391
+mdev_init_err:
1392
+ mlx5_devlink_free(devlink);
14561393
14571394 return err;
14581395 }
....@@ -1461,41 +1398,28 @@
14611398 {
14621399 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
14631400 struct devlink *devlink = priv_to_devlink(dev);
1464
- struct mlx5_priv *priv = &dev->priv;
14651401
1466
- devlink_unregister(devlink);
1467
- mlx5_unregister_device(dev);
1468
-
1469
- if (mlx5_unload_one(dev, priv, true)) {
1470
- dev_err(&dev->pdev->dev, "mlx5_unload_one failed\n");
1471
- mlx5_health_cleanup(dev);
1472
- return;
1473
- }
1474
-
1475
- mlx5_pagealloc_cleanup(dev);
1476
- mlx5_health_cleanup(dev);
1477
- mlx5_pci_close(dev, priv);
1478
-#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
1479
- cleanup_srcu_struct(&priv->pfault_srcu);
1480
-#endif
1481
- devlink_free(devlink);
1402
+ devlink_reload_disable(devlink);
1403
+ mlx5_crdump_disable(dev);
1404
+ mlx5_drain_health_wq(dev);
1405
+ mlx5_unload_one(dev, true);
1406
+ mlx5_pci_close(dev);
1407
+ mlx5_mdev_uninit(dev);
1408
+ mlx5_devlink_free(devlink);
14821409 }
14831410
14841411 static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
14851412 pci_channel_state_t state)
14861413 {
14871414 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1488
- struct mlx5_priv *priv = &dev->priv;
14891415
1490
- dev_info(&pdev->dev, "%s was called\n", __func__);
1416
+ mlx5_core_info(dev, "%s was called\n", __func__);
14911417
14921418 mlx5_enter_error_state(dev, false);
1493
- mlx5_unload_one(dev, priv, false);
1494
- /* In case of kernel call drain the health wq */
1495
- if (state) {
1496
- mlx5_drain_health_wq(dev);
1497
- mlx5_pci_disable_device(dev);
1498
- }
1419
+ mlx5_error_sw_reset(dev);
1420
+ mlx5_unload_one(dev, false);
1421
+ mlx5_drain_health_wq(dev);
1422
+ mlx5_pci_disable_device(dev);
14991423
15001424 return state == pci_channel_io_perm_failure ?
15011425 PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET;
....@@ -1517,7 +1441,9 @@
15171441 count = ioread32be(health->health_counter);
15181442 if (count && count != 0xffffffff) {
15191443 if (last_count && last_count != count) {
1520
- dev_info(&pdev->dev, "Counter value 0x%x after %d iterations\n", count, i);
1444
+ mlx5_core_info(dev,
1445
+ "wait vital counter value 0x%x after %d iterations\n",
1446
+ count, i);
15211447 return 0;
15221448 }
15231449 last_count = count;
....@@ -1533,12 +1459,12 @@
15331459 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
15341460 int err;
15351461
1536
- dev_info(&pdev->dev, "%s was called\n", __func__);
1462
+ mlx5_core_info(dev, "%s was called\n", __func__);
15371463
15381464 err = mlx5_pci_enable_device(dev);
15391465 if (err) {
1540
- dev_err(&pdev->dev, "%s: mlx5_pci_enable_device failed with error code: %d\n"
1541
- , __func__, err);
1466
+ mlx5_core_err(dev, "%s: mlx5_pci_enable_device failed with error code: %d\n",
1467
+ __func__, err);
15421468 return PCI_ERS_RESULT_DISCONNECT;
15431469 }
15441470
....@@ -1547,7 +1473,7 @@
15471473 pci_save_state(pdev);
15481474
15491475 if (wait_vital(pdev)) {
1550
- dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__);
1476
+ mlx5_core_err(dev, "%s: wait_vital timed out\n", __func__);
15511477 return PCI_ERS_RESULT_DISCONNECT;
15521478 }
15531479
....@@ -1557,17 +1483,16 @@
15571483 static void mlx5_pci_resume(struct pci_dev *pdev)
15581484 {
15591485 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1560
- struct mlx5_priv *priv = &dev->priv;
15611486 int err;
15621487
1563
- dev_info(&pdev->dev, "%s was called\n", __func__);
1488
+ mlx5_core_info(dev, "%s was called\n", __func__);
15641489
1565
- err = mlx5_load_one(dev, priv, false);
1490
+ err = mlx5_load_one(dev, false);
15661491 if (err)
1567
- dev_err(&pdev->dev, "%s: mlx5_load_one failed with error code: %d\n"
1568
- , __func__, err);
1492
+ mlx5_core_err(dev, "%s: mlx5_load_one failed with error code: %d\n",
1493
+ __func__, err);
15691494 else
1570
- dev_info(&pdev->dev, "%s: device recovered\n", __func__);
1495
+ mlx5_core_info(dev, "%s: device recovered\n", __func__);
15711496 }
15721497
15731498 static const struct pci_error_handlers mlx5_err_handler = {
....@@ -1578,12 +1503,17 @@
15781503
15791504 static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)
15801505 {
1581
- int ret;
1506
+ bool fast_teardown = false, force_teardown = false;
1507
+ int ret = 1;
15821508
1583
- if (!MLX5_CAP_GEN(dev, force_teardown)) {
1584
- mlx5_core_dbg(dev, "force teardown is not supported in the firmware\n");
1509
+ fast_teardown = MLX5_CAP_GEN(dev, fast_teardown);
1510
+ force_teardown = MLX5_CAP_GEN(dev, force_teardown);
1511
+
1512
+ mlx5_core_dbg(dev, "force teardown firmware support=%d\n", force_teardown);
1513
+ mlx5_core_dbg(dev, "fast teardown firmware support=%d\n", fast_teardown);
1514
+
1515
+ if (!fast_teardown && !force_teardown)
15851516 return -EOPNOTSUPP;
1586
- }
15871517
15881518 if (dev->state == MLX5_DEVICE_STATE_INTERNAL_ERROR) {
15891519 mlx5_core_dbg(dev, "Device in internal error state, giving up\n");
....@@ -1596,13 +1526,19 @@
15961526 mlx5_drain_health_wq(dev);
15971527 mlx5_stop_health_poll(dev, false);
15981528
1599
- ret = mlx5_cmd_force_teardown_hca(dev);
1600
- if (ret) {
1601
- mlx5_core_dbg(dev, "Firmware couldn't do fast unload error: %d\n", ret);
1602
- mlx5_start_health_poll(dev);
1603
- return ret;
1604
- }
1529
+ ret = mlx5_cmd_fast_teardown_hca(dev);
1530
+ if (!ret)
1531
+ goto succeed;
16051532
1533
+ ret = mlx5_cmd_force_teardown_hca(dev);
1534
+ if (!ret)
1535
+ goto succeed;
1536
+
1537
+ mlx5_core_dbg(dev, "Firmware couldn't do fast unload error: %d\n", ret);
1538
+ mlx5_start_health_poll(dev);
1539
+ return ret;
1540
+
1541
+succeed:
16061542 mlx5_enter_error_state(dev, true);
16071543
16081544 /* Some platforms requiring freeing the IRQ's in the shutdown
....@@ -1610,7 +1546,6 @@
16101546 * kexec. There is no need to cleanup the mlx5_core software
16111547 * contexts.
16121548 */
1613
- mlx5_irq_clear_affinity_hints(dev);
16141549 mlx5_core_eq_free_irqs(dev);
16151550
16161551 return 0;
....@@ -1619,14 +1554,29 @@
16191554 static void shutdown(struct pci_dev *pdev)
16201555 {
16211556 struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1622
- struct mlx5_priv *priv = &dev->priv;
16231557 int err;
16241558
1625
- dev_info(&pdev->dev, "Shutdown was called\n");
1559
+ mlx5_core_info(dev, "Shutdown was called\n");
16261560 err = mlx5_try_fast_unload(dev);
16271561 if (err)
1628
- mlx5_unload_one(dev, priv, false);
1562
+ mlx5_unload_one(dev, false);
16291563 mlx5_pci_disable_device(dev);
1564
+}
1565
+
1566
+static int mlx5_suspend(struct pci_dev *pdev, pm_message_t state)
1567
+{
1568
+ struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1569
+
1570
+ mlx5_unload_one(dev, false);
1571
+
1572
+ return 0;
1573
+}
1574
+
1575
+static int mlx5_resume(struct pci_dev *pdev)
1576
+{
1577
+ struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1578
+
1579
+ return mlx5_load_one(dev, false);
16301580 }
16311581
16321582 static const struct pci_device_id mlx5_core_pci_table[] = {
....@@ -1642,6 +1592,10 @@
16421592 { PCI_VDEVICE(MELLANOX, 0x101a), MLX5_PCI_DEV_IS_VF}, /* ConnectX-5 Ex VF */
16431593 { PCI_VDEVICE(MELLANOX, 0x101b) }, /* ConnectX-6 */
16441594 { PCI_VDEVICE(MELLANOX, 0x101c), MLX5_PCI_DEV_IS_VF}, /* ConnectX-6 VF */
1595
+ { PCI_VDEVICE(MELLANOX, 0x101d) }, /* ConnectX-6 Dx */
1596
+ { PCI_VDEVICE(MELLANOX, 0x101e), MLX5_PCI_DEV_IS_VF}, /* ConnectX Family mlx5Gen Virtual Function */
1597
+ { PCI_VDEVICE(MELLANOX, 0x101f) }, /* ConnectX-6 LX */
1598
+ { PCI_VDEVICE(MELLANOX, 0x1021) }, /* ConnectX-7 */
16451599 { PCI_VDEVICE(MELLANOX, 0xa2d2) }, /* BlueField integrated ConnectX-5 network controller */
16461600 { PCI_VDEVICE(MELLANOX, 0xa2d3), MLX5_PCI_DEV_IS_VF}, /* BlueField integrated ConnectX-5 network controller VF */
16471601 { PCI_VDEVICE(MELLANOX, 0xa2d6) }, /* BlueField-2 integrated ConnectX-6 Dx network controller */
....@@ -1652,7 +1606,8 @@
16521606
16531607 void mlx5_disable_device(struct mlx5_core_dev *dev)
16541608 {
1655
- mlx5_pci_err_detected(dev->pdev, 0);
1609
+ mlx5_error_sw_reset(dev);
1610
+ mlx5_unload_one(dev, false);
16561611 }
16571612
16581613 void mlx5_recover_device(struct mlx5_core_dev *dev)
....@@ -1667,6 +1622,8 @@
16671622 .id_table = mlx5_core_pci_table,
16681623 .probe = init_one,
16691624 .remove = remove_one,
1625
+ .suspend = mlx5_suspend,
1626
+ .resume = mlx5_resume,
16701627 .shutdown = shutdown,
16711628 .err_handler = &mlx5_err_handler,
16721629 .sriov_configure = mlx5_core_sriov_configure,