GNU Linux-libre 4.9.337-gnu1
[releases.git] / drivers / net / ethernet / mellanox / mlx5 / core / main.c
1 /*
2  * Copyright (c) 2013-2015, Mellanox Technologies. All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the
8  * OpenIB.org BSD license below:
9  *
10  *     Redistribution and use in source and binary forms, with or
11  *     without modification, are permitted provided that the following
12  *     conditions are met:
13  *
14  *      - Redistributions of source code must retain the above
15  *        copyright notice, this list of conditions and the following
16  *        disclaimer.
17  *
18  *      - Redistributions in binary form must reproduce the above
19  *        copyright notice, this list of conditions and the following
20  *        disclaimer in the documentation and/or other materials
21  *        provided with the distribution.
22  *
23  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30  * SOFTWARE.
31  */
32
33 #include <linux/highmem.h>
34 #include <linux/module.h>
35 #include <linux/init.h>
36 #include <linux/errno.h>
37 #include <linux/pci.h>
38 #include <linux/dma-mapping.h>
39 #include <linux/slab.h>
40 #include <linux/io-mapping.h>
41 #include <linux/interrupt.h>
42 #include <linux/delay.h>
43 #include <linux/mlx5/driver.h>
44 #include <linux/mlx5/cq.h>
45 #include <linux/mlx5/qp.h>
46 #include <linux/mlx5/srq.h>
47 #include <linux/debugfs.h>
48 #include <linux/kmod.h>
49 #include <linux/mlx5/mlx5_ifc.h>
50 #ifdef CONFIG_RFS_ACCEL
51 #include <linux/cpu_rmap.h>
52 #endif
53 #include <net/devlink.h>
54 #include "mlx5_core.h"
55 #include "fs_core.h"
56 #ifdef CONFIG_MLX5_CORE_EN
57 #include "eswitch.h"
58 #endif
59
60 MODULE_AUTHOR("Eli Cohen <eli@mellanox.com>");
61 MODULE_DESCRIPTION("Mellanox Connect-IB, ConnectX-4 core driver");
62 MODULE_LICENSE("Dual BSD/GPL");
63 MODULE_VERSION(DRIVER_VERSION);
64
65 unsigned int mlx5_core_debug_mask;
66 module_param_named(debug_mask, mlx5_core_debug_mask, uint, 0644);
67 MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0");
68
69 #define MLX5_DEFAULT_PROF       2
70 static unsigned int prof_sel = MLX5_DEFAULT_PROF;
71 module_param_named(prof_sel, prof_sel, uint, 0444);
72 MODULE_PARM_DESC(prof_sel, "profile selector. Valid range 0 - 2");
73
74 enum {
75         MLX5_ATOMIC_REQ_MODE_BE = 0x0,
76         MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS = 0x1,
77 };
78
79 static struct mlx5_profile profile[] = {
80         [0] = {
81                 .mask           = 0,
82         },
83         [1] = {
84                 .mask           = MLX5_PROF_MASK_QP_SIZE,
85                 .log_max_qp     = 12,
86         },
87         [2] = {
88                 .mask           = MLX5_PROF_MASK_QP_SIZE |
89                                   MLX5_PROF_MASK_MR_CACHE,
90                 .log_max_qp     = 18,
91                 .mr_cache[0]    = {
92                         .size   = 500,
93                         .limit  = 250
94                 },
95                 .mr_cache[1]    = {
96                         .size   = 500,
97                         .limit  = 250
98                 },
99                 .mr_cache[2]    = {
100                         .size   = 500,
101                         .limit  = 250
102                 },
103                 .mr_cache[3]    = {
104                         .size   = 500,
105                         .limit  = 250
106                 },
107                 .mr_cache[4]    = {
108                         .size   = 500,
109                         .limit  = 250
110                 },
111                 .mr_cache[5]    = {
112                         .size   = 500,
113                         .limit  = 250
114                 },
115                 .mr_cache[6]    = {
116                         .size   = 500,
117                         .limit  = 250
118                 },
119                 .mr_cache[7]    = {
120                         .size   = 500,
121                         .limit  = 250
122                 },
123                 .mr_cache[8]    = {
124                         .size   = 500,
125                         .limit  = 250
126                 },
127                 .mr_cache[9]    = {
128                         .size   = 500,
129                         .limit  = 250
130                 },
131                 .mr_cache[10]   = {
132                         .size   = 500,
133                         .limit  = 250
134                 },
135                 .mr_cache[11]   = {
136                         .size   = 500,
137                         .limit  = 250
138                 },
139                 .mr_cache[12]   = {
140                         .size   = 64,
141                         .limit  = 32
142                 },
143                 .mr_cache[13]   = {
144                         .size   = 32,
145                         .limit  = 16
146                 },
147                 .mr_cache[14]   = {
148                         .size   = 16,
149                         .limit  = 8
150                 },
151                 .mr_cache[15]   = {
152                         .size   = 8,
153                         .limit  = 4
154                 },
155         },
156 };
157
158 #define FW_INIT_TIMEOUT_MILI            2000
159 #define FW_INIT_WAIT_MS                 2
160 #define FW_PRE_INIT_TIMEOUT_MILI        10000
161
162 static int wait_fw_init(struct mlx5_core_dev *dev, u32 max_wait_mili)
163 {
164         unsigned long end = jiffies + msecs_to_jiffies(max_wait_mili);
165         int err = 0;
166
167         while (fw_initializing(dev)) {
168                 if (time_after(jiffies, end)) {
169                         err = -EBUSY;
170                         break;
171                 }
172                 msleep(FW_INIT_WAIT_MS);
173         }
174
175         return err;
176 }
177
178 static int set_dma_caps(struct pci_dev *pdev)
179 {
180         int err;
181
182         err = pci_set_dma_mask(pdev, DMA_BIT_MASK(64));
183         if (err) {
184                 dev_warn(&pdev->dev, "Warning: couldn't set 64-bit PCI DMA mask\n");
185                 err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
186                 if (err) {
187                         dev_err(&pdev->dev, "Can't set PCI DMA mask, aborting\n");
188                         return err;
189                 }
190         }
191
192         err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
193         if (err) {
194                 dev_warn(&pdev->dev,
195                          "Warning: couldn't set 64-bit consistent PCI DMA mask\n");
196                 err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
197                 if (err) {
198                         dev_err(&pdev->dev,
199                                 "Can't set consistent PCI DMA mask, aborting\n");
200                         return err;
201                 }
202         }
203
204         dma_set_max_seg_size(&pdev->dev, 2u * 1024 * 1024 * 1024);
205         return err;
206 }
207
208 static int mlx5_pci_enable_device(struct mlx5_core_dev *dev)
209 {
210         struct pci_dev *pdev = dev->pdev;
211         int err = 0;
212
213         mutex_lock(&dev->pci_status_mutex);
214         if (dev->pci_status == MLX5_PCI_STATUS_DISABLED) {
215                 err = pci_enable_device(pdev);
216                 if (!err)
217                         dev->pci_status = MLX5_PCI_STATUS_ENABLED;
218         }
219         mutex_unlock(&dev->pci_status_mutex);
220
221         return err;
222 }
223
224 static void mlx5_pci_disable_device(struct mlx5_core_dev *dev)
225 {
226         struct pci_dev *pdev = dev->pdev;
227
228         mutex_lock(&dev->pci_status_mutex);
229         if (dev->pci_status == MLX5_PCI_STATUS_ENABLED) {
230                 pci_disable_device(pdev);
231                 dev->pci_status = MLX5_PCI_STATUS_DISABLED;
232         }
233         mutex_unlock(&dev->pci_status_mutex);
234 }
235
236 static int request_bar(struct pci_dev *pdev)
237 {
238         int err = 0;
239
240         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM)) {
241                 dev_err(&pdev->dev, "Missing registers BAR, aborting\n");
242                 return -ENODEV;
243         }
244
245         err = pci_request_regions(pdev, DRIVER_NAME);
246         if (err)
247                 dev_err(&pdev->dev, "Couldn't get PCI resources, aborting\n");
248
249         return err;
250 }
251
252 static void release_bar(struct pci_dev *pdev)
253 {
254         pci_release_regions(pdev);
255 }
256
257 static int mlx5_enable_msix(struct mlx5_core_dev *dev)
258 {
259         struct mlx5_priv *priv = &dev->priv;
260         struct mlx5_eq_table *table = &priv->eq_table;
261         int num_eqs = 1 << MLX5_CAP_GEN(dev, log_max_eq);
262         int nvec;
263         int i;
264
265         nvec = MLX5_CAP_GEN(dev, num_ports) * num_online_cpus() +
266                MLX5_EQ_VEC_COMP_BASE;
267         nvec = min_t(int, nvec, num_eqs);
268         if (nvec <= MLX5_EQ_VEC_COMP_BASE)
269                 return -ENOMEM;
270
271         priv->msix_arr = kcalloc(nvec, sizeof(*priv->msix_arr), GFP_KERNEL);
272
273         priv->irq_info = kcalloc(nvec, sizeof(*priv->irq_info), GFP_KERNEL);
274         if (!priv->msix_arr || !priv->irq_info)
275                 goto err_free_msix;
276
277         for (i = 0; i < nvec; i++)
278                 priv->msix_arr[i].entry = i;
279
280         nvec = pci_enable_msix_range(dev->pdev, priv->msix_arr,
281                                      MLX5_EQ_VEC_COMP_BASE + 1, nvec);
282         if (nvec < 0)
283                 return nvec;
284
285         table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE;
286
287         return 0;
288
289 err_free_msix:
290         kfree(priv->irq_info);
291         kfree(priv->msix_arr);
292         return -ENOMEM;
293 }
294
295 static void mlx5_disable_msix(struct mlx5_core_dev *dev)
296 {
297         struct mlx5_priv *priv = &dev->priv;
298
299         pci_disable_msix(dev->pdev);
300         kfree(priv->irq_info);
301         kfree(priv->msix_arr);
302 }
303
304 struct mlx5_reg_host_endianess {
305         u8      he;
306         u8      rsvd[15];
307 };
308
309
310 #define CAP_MASK(pos, size) ((u64)((1 << (size)) - 1) << (pos))
311
312 enum {
313         MLX5_CAP_BITS_RW_MASK = CAP_MASK(MLX5_CAP_OFF_CMDIF_CSUM, 2) |
314                                 MLX5_DEV_CAP_FLAG_DCT,
315 };
316
317 static u16 to_fw_pkey_sz(struct mlx5_core_dev *dev, u32 size)
318 {
319         switch (size) {
320         case 128:
321                 return 0;
322         case 256:
323                 return 1;
324         case 512:
325                 return 2;
326         case 1024:
327                 return 3;
328         case 2048:
329                 return 4;
330         case 4096:
331                 return 5;
332         default:
333                 mlx5_core_warn(dev, "invalid pkey table size %d\n", size);
334                 return 0;
335         }
336 }
337
338 static int mlx5_core_get_caps_mode(struct mlx5_core_dev *dev,
339                                    enum mlx5_cap_type cap_type,
340                                    enum mlx5_cap_mode cap_mode)
341 {
342         u8 in[MLX5_ST_SZ_BYTES(query_hca_cap_in)];
343         int out_sz = MLX5_ST_SZ_BYTES(query_hca_cap_out);
344         void *out, *hca_caps;
345         u16 opmod = (cap_type << 1) | (cap_mode & 0x01);
346         int err;
347
348         memset(in, 0, sizeof(in));
349         out = kzalloc(out_sz, GFP_KERNEL);
350         if (!out)
351                 return -ENOMEM;
352
353         MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
354         MLX5_SET(query_hca_cap_in, in, op_mod, opmod);
355         err = mlx5_cmd_exec(dev, in, sizeof(in), out, out_sz);
356         if (err) {
357                 mlx5_core_warn(dev,
358                                "QUERY_HCA_CAP : type(%x) opmode(%x) Failed(%d)\n",
359                                cap_type, cap_mode, err);
360                 goto query_ex;
361         }
362
363         hca_caps =  MLX5_ADDR_OF(query_hca_cap_out, out, capability);
364
365         switch (cap_mode) {
366         case HCA_CAP_OPMOD_GET_MAX:
367                 memcpy(dev->hca_caps_max[cap_type], hca_caps,
368                        MLX5_UN_SZ_BYTES(hca_cap_union));
369                 break;
370         case HCA_CAP_OPMOD_GET_CUR:
371                 memcpy(dev->hca_caps_cur[cap_type], hca_caps,
372                        MLX5_UN_SZ_BYTES(hca_cap_union));
373                 break;
374         default:
375                 mlx5_core_warn(dev,
376                                "Tried to query dev cap type(%x) with wrong opmode(%x)\n",
377                                cap_type, cap_mode);
378                 err = -EINVAL;
379                 break;
380         }
381 query_ex:
382         kfree(out);
383         return err;
384 }
385
386 int mlx5_core_get_caps(struct mlx5_core_dev *dev, enum mlx5_cap_type cap_type)
387 {
388         int ret;
389
390         ret = mlx5_core_get_caps_mode(dev, cap_type, HCA_CAP_OPMOD_GET_CUR);
391         if (ret)
392                 return ret;
393         return mlx5_core_get_caps_mode(dev, cap_type, HCA_CAP_OPMOD_GET_MAX);
394 }
395
396 static int set_caps(struct mlx5_core_dev *dev, void *in, int in_sz, int opmod)
397 {
398         u32 out[MLX5_ST_SZ_DW(set_hca_cap_out)] = {0};
399
400         MLX5_SET(set_hca_cap_in, in, opcode, MLX5_CMD_OP_SET_HCA_CAP);
401         MLX5_SET(set_hca_cap_in, in, op_mod, opmod << 1);
402         return mlx5_cmd_exec(dev, in, in_sz, out, sizeof(out));
403 }
404
405 static int handle_hca_cap_atomic(struct mlx5_core_dev *dev)
406 {
407         void *set_ctx;
408         void *set_hca_cap;
409         int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
410         int req_endianness;
411         int err;
412
413         if (MLX5_CAP_GEN(dev, atomic)) {
414                 err = mlx5_core_get_caps(dev, MLX5_CAP_ATOMIC);
415                 if (err)
416                         return err;
417         } else {
418                 return 0;
419         }
420
421         req_endianness =
422                 MLX5_CAP_ATOMIC(dev,
423                                 supported_atomic_req_8B_endianess_mode_1);
424
425         if (req_endianness != MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS)
426                 return 0;
427
428         set_ctx = kzalloc(set_sz, GFP_KERNEL);
429         if (!set_ctx)
430                 return -ENOMEM;
431
432         set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
433
434         /* Set requestor to host endianness */
435         MLX5_SET(atomic_caps, set_hca_cap, atomic_req_8B_endianess_mode,
436                  MLX5_ATOMIC_REQ_MODE_HOST_ENDIANNESS);
437
438         err = set_caps(dev, set_ctx, set_sz, MLX5_SET_HCA_CAP_OP_MOD_ATOMIC);
439
440         kfree(set_ctx);
441         return err;
442 }
443
444 static int handle_hca_cap(struct mlx5_core_dev *dev)
445 {
446         void *set_ctx = NULL;
447         struct mlx5_profile *prof = dev->profile;
448         int err = -ENOMEM;
449         int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
450         void *set_hca_cap;
451
452         set_ctx = kzalloc(set_sz, GFP_KERNEL);
453         if (!set_ctx)
454                 goto query_ex;
455
456         err = mlx5_core_get_caps(dev, MLX5_CAP_GENERAL);
457         if (err)
458                 goto query_ex;
459
460         set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx,
461                                    capability);
462         memcpy(set_hca_cap, dev->hca_caps_cur[MLX5_CAP_GENERAL],
463                MLX5_ST_SZ_BYTES(cmd_hca_cap));
464
465         mlx5_core_dbg(dev, "Current Pkey table size %d Setting new size %d\n",
466                       mlx5_to_sw_pkey_sz(MLX5_CAP_GEN(dev, pkey_table_size)),
467                       128);
468         /* we limit the size of the pkey table to 128 entries for now */
469         MLX5_SET(cmd_hca_cap, set_hca_cap, pkey_table_size,
470                  to_fw_pkey_sz(dev, 128));
471
472         /* Check log_max_qp from HCA caps to set in current profile */
473         if (MLX5_CAP_GEN_MAX(dev, log_max_qp) < profile[prof_sel].log_max_qp) {
474                 mlx5_core_warn(dev, "log_max_qp value in current profile is %d, changing it to HCA capability limit (%d)\n",
475                                profile[prof_sel].log_max_qp,
476                                MLX5_CAP_GEN_MAX(dev, log_max_qp));
477                 profile[prof_sel].log_max_qp = MLX5_CAP_GEN_MAX(dev, log_max_qp);
478         }
479         if (prof->mask & MLX5_PROF_MASK_QP_SIZE)
480                 MLX5_SET(cmd_hca_cap, set_hca_cap, log_max_qp,
481                          prof->log_max_qp);
482
483         /* disable cmdif checksum */
484         MLX5_SET(cmd_hca_cap, set_hca_cap, cmdif_checksum, 0);
485
486         MLX5_SET(cmd_hca_cap, set_hca_cap, log_uar_page_sz, PAGE_SHIFT - 12);
487
488         err = set_caps(dev, set_ctx, set_sz,
489                        MLX5_SET_HCA_CAP_OP_MOD_GENERAL_DEVICE);
490
491 query_ex:
492         kfree(set_ctx);
493         return err;
494 }
495
496 static int set_hca_ctrl(struct mlx5_core_dev *dev)
497 {
498         struct mlx5_reg_host_endianess he_in;
499         struct mlx5_reg_host_endianess he_out;
500         int err;
501
502         if (!mlx5_core_is_pf(dev))
503                 return 0;
504
505         memset(&he_in, 0, sizeof(he_in));
506         he_in.he = MLX5_SET_HOST_ENDIANNESS;
507         err = mlx5_core_access_reg(dev, &he_in,  sizeof(he_in),
508                                         &he_out, sizeof(he_out),
509                                         MLX5_REG_HOST_ENDIANNESS, 0, 1);
510         return err;
511 }
512
513 int mlx5_core_enable_hca(struct mlx5_core_dev *dev, u16 func_id)
514 {
515         u32 out[MLX5_ST_SZ_DW(enable_hca_out)] = {0};
516         u32 in[MLX5_ST_SZ_DW(enable_hca_in)]   = {0};
517
518         MLX5_SET(enable_hca_in, in, opcode, MLX5_CMD_OP_ENABLE_HCA);
519         MLX5_SET(enable_hca_in, in, function_id, func_id);
520         return mlx5_cmd_exec(dev, &in, sizeof(in), &out, sizeof(out));
521 }
522
523 int mlx5_core_disable_hca(struct mlx5_core_dev *dev, u16 func_id)
524 {
525         u32 out[MLX5_ST_SZ_DW(disable_hca_out)] = {0};
526         u32 in[MLX5_ST_SZ_DW(disable_hca_in)]   = {0};
527
528         MLX5_SET(disable_hca_in, in, opcode, MLX5_CMD_OP_DISABLE_HCA);
529         MLX5_SET(disable_hca_in, in, function_id, func_id);
530         return mlx5_cmd_exec(dev, in, sizeof(in), out, sizeof(out));
531 }
532
533 cycle_t mlx5_read_internal_timer(struct mlx5_core_dev *dev)
534 {
535         u32 timer_h, timer_h1, timer_l;
536
537         timer_h = ioread32be(&dev->iseg->internal_timer_h);
538         timer_l = ioread32be(&dev->iseg->internal_timer_l);
539         timer_h1 = ioread32be(&dev->iseg->internal_timer_h);
540         if (timer_h != timer_h1) /* wrap around */
541                 timer_l = ioread32be(&dev->iseg->internal_timer_l);
542
543         return (cycle_t)timer_l | (cycle_t)timer_h1 << 32;
544 }
545
546 static int mlx5_irq_set_affinity_hint(struct mlx5_core_dev *mdev, int i)
547 {
548         struct mlx5_priv *priv  = &mdev->priv;
549         struct msix_entry *msix = priv->msix_arr;
550         int irq                 = msix[i + MLX5_EQ_VEC_COMP_BASE].vector;
551
552         if (!zalloc_cpumask_var(&priv->irq_info[i].mask, GFP_KERNEL)) {
553                 mlx5_core_warn(mdev, "zalloc_cpumask_var failed");
554                 return -ENOMEM;
555         }
556
557         cpumask_set_cpu(cpumask_local_spread(i, priv->numa_node),
558                         priv->irq_info[i].mask);
559
560         if (IS_ENABLED(CONFIG_SMP) &&
561             irq_set_affinity_hint(irq, priv->irq_info[i].mask))
562                 mlx5_core_warn(mdev, "irq_set_affinity_hint failed, irq 0x%.4x", irq);
563
564         return 0;
565 }
566
567 static void mlx5_irq_clear_affinity_hint(struct mlx5_core_dev *mdev, int i)
568 {
569         struct mlx5_priv *priv  = &mdev->priv;
570         struct msix_entry *msix = priv->msix_arr;
571         int irq                 = msix[i + MLX5_EQ_VEC_COMP_BASE].vector;
572
573         irq_set_affinity_hint(irq, NULL);
574         free_cpumask_var(priv->irq_info[i].mask);
575 }
576
577 static int mlx5_irq_set_affinity_hints(struct mlx5_core_dev *mdev)
578 {
579         int err;
580         int i;
581
582         for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++) {
583                 err = mlx5_irq_set_affinity_hint(mdev, i);
584                 if (err)
585                         goto err_out;
586         }
587
588         return 0;
589
590 err_out:
591         for (i--; i >= 0; i--)
592                 mlx5_irq_clear_affinity_hint(mdev, i);
593
594         return err;
595 }
596
597 static void mlx5_irq_clear_affinity_hints(struct mlx5_core_dev *mdev)
598 {
599         int i;
600
601         for (i = 0; i < mdev->priv.eq_table.num_comp_vectors; i++)
602                 mlx5_irq_clear_affinity_hint(mdev, i);
603 }
604
605 int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,
606                     unsigned int *irqn)
607 {
608         struct mlx5_eq_table *table = &dev->priv.eq_table;
609         struct mlx5_eq *eq, *n;
610         int err = -ENOENT;
611
612         spin_lock(&table->lock);
613         list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
614                 if (eq->index == vector) {
615                         *eqn = eq->eqn;
616                         *irqn = eq->irqn;
617                         err = 0;
618                         break;
619                 }
620         }
621         spin_unlock(&table->lock);
622
623         return err;
624 }
625 EXPORT_SYMBOL(mlx5_vector2eqn);
626
627 struct mlx5_eq *mlx5_eqn2eq(struct mlx5_core_dev *dev, int eqn)
628 {
629         struct mlx5_eq_table *table = &dev->priv.eq_table;
630         struct mlx5_eq *eq;
631
632         spin_lock(&table->lock);
633         list_for_each_entry(eq, &table->comp_eqs_list, list)
634                 if (eq->eqn == eqn) {
635                         spin_unlock(&table->lock);
636                         return eq;
637                 }
638
639         spin_unlock(&table->lock);
640
641         return ERR_PTR(-ENOENT);
642 }
643
644 static void free_comp_eqs(struct mlx5_core_dev *dev)
645 {
646         struct mlx5_eq_table *table = &dev->priv.eq_table;
647         struct mlx5_eq *eq, *n;
648
649 #ifdef CONFIG_RFS_ACCEL
650         if (dev->rmap) {
651                 free_irq_cpu_rmap(dev->rmap);
652                 dev->rmap = NULL;
653         }
654 #endif
655         spin_lock(&table->lock);
656         list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
657                 list_del(&eq->list);
658                 spin_unlock(&table->lock);
659                 if (mlx5_destroy_unmap_eq(dev, eq))
660                         mlx5_core_warn(dev, "failed to destroy EQ 0x%x\n",
661                                        eq->eqn);
662                 kfree(eq);
663                 spin_lock(&table->lock);
664         }
665         spin_unlock(&table->lock);
666 }
667
668 static int alloc_comp_eqs(struct mlx5_core_dev *dev)
669 {
670         struct mlx5_eq_table *table = &dev->priv.eq_table;
671         char name[MLX5_MAX_IRQ_NAME];
672         struct mlx5_eq *eq;
673         int ncomp_vec;
674         int nent;
675         int err;
676         int i;
677
678         INIT_LIST_HEAD(&table->comp_eqs_list);
679         ncomp_vec = table->num_comp_vectors;
680         nent = MLX5_COMP_EQ_SIZE;
681 #ifdef CONFIG_RFS_ACCEL
682         dev->rmap = alloc_irq_cpu_rmap(ncomp_vec);
683         if (!dev->rmap)
684                 return -ENOMEM;
685 #endif
686         for (i = 0; i < ncomp_vec; i++) {
687                 eq = kzalloc(sizeof(*eq), GFP_KERNEL);
688                 if (!eq) {
689                         err = -ENOMEM;
690                         goto clean;
691                 }
692
693 #ifdef CONFIG_RFS_ACCEL
694                 irq_cpu_rmap_add(dev->rmap,
695                                  dev->priv.msix_arr[i + MLX5_EQ_VEC_COMP_BASE].vector);
696 #endif
697                 snprintf(name, MLX5_MAX_IRQ_NAME, "mlx5_comp%d", i);
698                 err = mlx5_create_map_eq(dev, eq,
699                                          i + MLX5_EQ_VEC_COMP_BASE, nent, 0,
700                                          name, &dev->priv.uuari.uars[0]);
701                 if (err) {
702                         kfree(eq);
703                         goto clean;
704                 }
705                 mlx5_core_dbg(dev, "allocated completion EQN %d\n", eq->eqn);
706                 eq->index = i;
707                 spin_lock(&table->lock);
708                 list_add_tail(&eq->list, &table->comp_eqs_list);
709                 spin_unlock(&table->lock);
710         }
711
712         return 0;
713
714 clean:
715         free_comp_eqs(dev);
716         return err;
717 }
718
719 static int mlx5_core_set_issi(struct mlx5_core_dev *dev)
720 {
721         u32 query_in[MLX5_ST_SZ_DW(query_issi_in)]   = {0};
722         u32 query_out[MLX5_ST_SZ_DW(query_issi_out)] = {0};
723         u32 sup_issi;
724         int err;
725
726         MLX5_SET(query_issi_in, query_in, opcode, MLX5_CMD_OP_QUERY_ISSI);
727         err = mlx5_cmd_exec(dev, query_in, sizeof(query_in),
728                             query_out, sizeof(query_out));
729         if (err) {
730                 u32 syndrome;
731                 u8 status;
732
733                 mlx5_cmd_mbox_status(query_out, &status, &syndrome);
734                 if (!status || syndrome == MLX5_DRIVER_SYND) {
735                         mlx5_core_err(dev, "Failed to query ISSI err(%d) status(%d) synd(%d)\n",
736                                       err, status, syndrome);
737                         return err;
738                 }
739
740                 mlx5_core_warn(dev, "Query ISSI is not supported by FW, ISSI is 0\n");
741                 dev->issi = 0;
742                 return 0;
743         }
744
745         sup_issi = MLX5_GET(query_issi_out, query_out, supported_issi_dw0);
746
747         if (sup_issi & (1 << 1)) {
748                 u32 set_in[MLX5_ST_SZ_DW(set_issi_in)]   = {0};
749                 u32 set_out[MLX5_ST_SZ_DW(set_issi_out)] = {0};
750
751                 MLX5_SET(set_issi_in, set_in, opcode, MLX5_CMD_OP_SET_ISSI);
752                 MLX5_SET(set_issi_in, set_in, current_issi, 1);
753                 err = mlx5_cmd_exec(dev, set_in, sizeof(set_in),
754                                     set_out, sizeof(set_out));
755                 if (err) {
756                         mlx5_core_err(dev, "Failed to set ISSI to 1 err(%d)\n",
757                                       err);
758                         return err;
759                 }
760
761                 dev->issi = 1;
762
763                 return 0;
764         } else if (sup_issi & (1 << 0) || !sup_issi) {
765                 return 0;
766         }
767
768         return -ENOTSUPP;
769 }
770
771
772 static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
773 {
774         struct pci_dev *pdev = dev->pdev;
775         int err = 0;
776
777         pci_set_drvdata(dev->pdev, dev);
778         strncpy(priv->name, dev_name(&pdev->dev), MLX5_MAX_NAME_LEN);
779         priv->name[MLX5_MAX_NAME_LEN - 1] = 0;
780
781         mutex_init(&priv->pgdir_mutex);
782         INIT_LIST_HEAD(&priv->pgdir_list);
783         spin_lock_init(&priv->mkey_lock);
784
785         mutex_init(&priv->alloc_mutex);
786
787         priv->numa_node = dev_to_node(&dev->pdev->dev);
788
789         if (mlx5_debugfs_root)
790                 priv->dbg_root =
791                         debugfs_create_dir(pci_name(pdev), mlx5_debugfs_root);
792
793         err = mlx5_pci_enable_device(dev);
794         if (err) {
795                 dev_err(&pdev->dev, "Cannot enable PCI device, aborting\n");
796                 goto err_dbg;
797         }
798
799         err = request_bar(pdev);
800         if (err) {
801                 dev_err(&pdev->dev, "error requesting BARs, aborting\n");
802                 goto err_disable;
803         }
804
805         pci_set_master(pdev);
806
807         err = set_dma_caps(pdev);
808         if (err) {
809                 dev_err(&pdev->dev, "Failed setting DMA capabilities mask, aborting\n");
810                 goto err_clr_master;
811         }
812
813         dev->iseg_base = pci_resource_start(dev->pdev, 0);
814         dev->iseg = ioremap(dev->iseg_base, sizeof(*dev->iseg));
815         if (!dev->iseg) {
816                 err = -ENOMEM;
817                 dev_err(&pdev->dev, "Failed mapping initialization segment, aborting\n");
818                 goto err_clr_master;
819         }
820
821         return 0;
822
823 err_clr_master:
824         pci_clear_master(dev->pdev);
825         release_bar(dev->pdev);
826 err_disable:
827         mlx5_pci_disable_device(dev);
828
829 err_dbg:
830         debugfs_remove(priv->dbg_root);
831         return err;
832 }
833
834 static void mlx5_pci_close(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
835 {
836         iounmap(dev->iseg);
837         pci_clear_master(dev->pdev);
838         release_bar(dev->pdev);
839         mlx5_pci_disable_device(dev);
840         debugfs_remove_recursive(priv->dbg_root);
841 }
842
843 static int mlx5_init_once(struct mlx5_core_dev *dev, struct mlx5_priv *priv)
844 {
845         struct pci_dev *pdev = dev->pdev;
846         int err;
847
848         err = mlx5_query_board_id(dev);
849         if (err) {
850                 dev_err(&pdev->dev, "query board id failed\n");
851                 goto out;
852         }
853
854         err = mlx5_eq_init(dev);
855         if (err) {
856                 dev_err(&pdev->dev, "failed to initialize eq\n");
857                 goto out;
858         }
859
860         MLX5_INIT_DOORBELL_LOCK(&priv->cq_uar_lock);
861
862         err = mlx5_init_cq_table(dev);
863         if (err) {
864                 dev_err(&pdev->dev, "failed to initialize cq table\n");
865                 goto err_eq_cleanup;
866         }
867
868         mlx5_init_qp_table(dev);
869
870         mlx5_init_srq_table(dev);
871
872         mlx5_init_mkey_table(dev);
873
874         err = mlx5_init_rl_table(dev);
875         if (err) {
876                 dev_err(&pdev->dev, "Failed to init rate limiting\n");
877                 goto err_tables_cleanup;
878         }
879
880 #ifdef CONFIG_MLX5_CORE_EN
881         err = mlx5_eswitch_init(dev);
882         if (err) {
883                 dev_err(&pdev->dev, "Failed to init eswitch %d\n", err);
884                 goto err_rl_cleanup;
885         }
886 #endif
887
888         err = mlx5_sriov_init(dev);
889         if (err) {
890                 dev_err(&pdev->dev, "Failed to init sriov %d\n", err);
891                 goto err_eswitch_cleanup;
892         }
893
894         return 0;
895
896 err_eswitch_cleanup:
897 #ifdef CONFIG_MLX5_CORE_EN
898         mlx5_eswitch_cleanup(dev->priv.eswitch);
899
900 err_rl_cleanup:
901 #endif
902         mlx5_cleanup_rl_table(dev);
903
904 err_tables_cleanup:
905         mlx5_cleanup_mkey_table(dev);
906         mlx5_cleanup_srq_table(dev);
907         mlx5_cleanup_qp_table(dev);
908         mlx5_cleanup_cq_table(dev);
909
910 err_eq_cleanup:
911         mlx5_eq_cleanup(dev);
912
913 out:
914         return err;
915 }
916
917 static void mlx5_cleanup_once(struct mlx5_core_dev *dev)
918 {
919         mlx5_sriov_cleanup(dev);
920 #ifdef CONFIG_MLX5_CORE_EN
921         mlx5_eswitch_cleanup(dev->priv.eswitch);
922 #endif
923         mlx5_cleanup_rl_table(dev);
924         mlx5_cleanup_mkey_table(dev);
925         mlx5_cleanup_srq_table(dev);
926         mlx5_cleanup_qp_table(dev);
927         mlx5_cleanup_cq_table(dev);
928         mlx5_eq_cleanup(dev);
929 }
930
931 static int mlx5_load_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
932                          bool boot)
933 {
934         struct pci_dev *pdev = dev->pdev;
935         int err;
936
937         mutex_lock(&dev->intf_state_mutex);
938         if (test_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state)) {
939                 dev_warn(&dev->pdev->dev, "%s: interface is up, NOP\n",
940                          __func__);
941                 goto out;
942         }
943
944         dev_info(&pdev->dev, "firmware version: %d.%d.%d\n", fw_rev_maj(dev),
945                  fw_rev_min(dev), fw_rev_sub(dev));
946
947         /* on load removing any previous indication of internal error, device is
948          * up
949          */
950         dev->state = MLX5_DEVICE_STATE_UP;
951
952         /* wait for firmware to accept initialization segments configurations
953          */
954         err = wait_fw_init(dev, FW_PRE_INIT_TIMEOUT_MILI);
955         if (err) {
956                 dev_err(&dev->pdev->dev, "Firmware over %d MS in pre-initializing state, aborting\n",
957                         FW_PRE_INIT_TIMEOUT_MILI);
958                 goto out_err;
959         }
960
961         err = mlx5_cmd_init(dev);
962         if (err) {
963                 dev_err(&pdev->dev, "Failed initializing command interface, aborting\n");
964                 goto out_err;
965         }
966
967         err = wait_fw_init(dev, FW_INIT_TIMEOUT_MILI);
968         if (err) {
969                 dev_err(&dev->pdev->dev, "Firmware over %d MS in initializing state, aborting\n",
970                         FW_INIT_TIMEOUT_MILI);
971                 goto err_cmd_cleanup;
972         }
973
974         err = mlx5_core_enable_hca(dev, 0);
975         if (err) {
976                 dev_err(&pdev->dev, "enable hca failed\n");
977                 goto err_cmd_cleanup;
978         }
979
980         err = mlx5_core_set_issi(dev);
981         if (err) {
982                 dev_err(&pdev->dev, "failed to set issi\n");
983                 goto err_disable_hca;
984         }
985
986         err = mlx5_satisfy_startup_pages(dev, 1);
987         if (err) {
988                 dev_err(&pdev->dev, "failed to allocate boot pages\n");
989                 goto err_disable_hca;
990         }
991
992         err = set_hca_ctrl(dev);
993         if (err) {
994                 dev_err(&pdev->dev, "set_hca_ctrl failed\n");
995                 goto reclaim_boot_pages;
996         }
997
998         err = handle_hca_cap(dev);
999         if (err) {
1000                 dev_err(&pdev->dev, "handle_hca_cap failed\n");
1001                 goto reclaim_boot_pages;
1002         }
1003
1004         err = handle_hca_cap_atomic(dev);
1005         if (err) {
1006                 dev_err(&pdev->dev, "handle_hca_cap_atomic failed\n");
1007                 goto reclaim_boot_pages;
1008         }
1009
1010         err = mlx5_satisfy_startup_pages(dev, 0);
1011         if (err) {
1012                 dev_err(&pdev->dev, "failed to allocate init pages\n");
1013                 goto reclaim_boot_pages;
1014         }
1015
1016         err = mlx5_pagealloc_start(dev);
1017         if (err) {
1018                 dev_err(&pdev->dev, "mlx5_pagealloc_start failed\n");
1019                 goto reclaim_boot_pages;
1020         }
1021
1022         err = mlx5_cmd_init_hca(dev);
1023         if (err) {
1024                 dev_err(&pdev->dev, "init hca failed\n");
1025                 goto err_pagealloc_stop;
1026         }
1027
1028         mlx5_start_health_poll(dev);
1029
1030         err = mlx5_query_hca_caps(dev);
1031         if (err) {
1032                 dev_err(&pdev->dev, "query hca failed\n");
1033                 goto err_stop_poll;
1034         }
1035
1036         if (boot && mlx5_init_once(dev, priv)) {
1037                 dev_err(&pdev->dev, "sw objs init failed\n");
1038                 goto err_stop_poll;
1039         }
1040
1041         err = mlx5_enable_msix(dev);
1042         if (err) {
1043                 dev_err(&pdev->dev, "enable msix failed\n");
1044                 goto err_cleanup_once;
1045         }
1046
1047         err = mlx5_alloc_uuars(dev, &priv->uuari);
1048         if (err) {
1049                 dev_err(&pdev->dev, "Failed allocating uar, aborting\n");
1050                 goto err_disable_msix;
1051         }
1052
1053         err = mlx5_start_eqs(dev);
1054         if (err) {
1055                 dev_err(&pdev->dev, "Failed to start pages and async EQs\n");
1056                 goto err_free_uar;
1057         }
1058
1059         err = alloc_comp_eqs(dev);
1060         if (err) {
1061                 dev_err(&pdev->dev, "Failed to alloc completion EQs\n");
1062                 goto err_stop_eqs;
1063         }
1064
1065         err = mlx5_irq_set_affinity_hints(dev);
1066         if (err) {
1067                 dev_err(&pdev->dev, "Failed to alloc affinity hint cpumask\n");
1068                 goto err_affinity_hints;
1069         }
1070
1071         err = mlx5_init_fs(dev);
1072         if (err) {
1073                 dev_err(&pdev->dev, "Failed to init flow steering\n");
1074                 goto err_fs;
1075         }
1076
1077 #ifdef CONFIG_MLX5_CORE_EN
1078         mlx5_eswitch_attach(dev->priv.eswitch);
1079 #endif
1080
1081         err = mlx5_sriov_attach(dev);
1082         if (err) {
1083                 dev_err(&pdev->dev, "sriov init failed %d\n", err);
1084                 goto err_sriov;
1085         }
1086
1087         if (mlx5_device_registered(dev)) {
1088                 mlx5_attach_device(dev);
1089         } else {
1090                 err = mlx5_register_device(dev);
1091                 if (err) {
1092                         dev_err(&pdev->dev, "mlx5_register_device failed %d\n", err);
1093                         goto err_reg_dev;
1094                 }
1095         }
1096
1097         clear_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state);
1098         set_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
1099 out:
1100         mutex_unlock(&dev->intf_state_mutex);
1101
1102         return 0;
1103
1104 err_reg_dev:
1105         mlx5_sriov_detach(dev);
1106
1107 err_sriov:
1108 #ifdef CONFIG_MLX5_CORE_EN
1109         mlx5_eswitch_detach(dev->priv.eswitch);
1110 #endif
1111         mlx5_cleanup_fs(dev);
1112
1113 err_fs:
1114         mlx5_irq_clear_affinity_hints(dev);
1115
1116 err_affinity_hints:
1117         free_comp_eqs(dev);
1118
1119 err_stop_eqs:
1120         mlx5_stop_eqs(dev);
1121
1122 err_free_uar:
1123         mlx5_free_uuars(dev, &priv->uuari);
1124
1125 err_disable_msix:
1126         mlx5_disable_msix(dev);
1127
1128 err_cleanup_once:
1129         if (boot)
1130                 mlx5_cleanup_once(dev);
1131
1132 err_stop_poll:
1133         mlx5_stop_health_poll(dev, boot);
1134         if (mlx5_cmd_teardown_hca(dev)) {
1135                 dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
1136                 goto out_err;
1137         }
1138
1139 err_pagealloc_stop:
1140         mlx5_pagealloc_stop(dev);
1141
1142 reclaim_boot_pages:
1143         mlx5_reclaim_startup_pages(dev);
1144
1145 err_disable_hca:
1146         mlx5_core_disable_hca(dev, 0);
1147
1148 err_cmd_cleanup:
1149         mlx5_cmd_cleanup(dev);
1150
1151 out_err:
1152         dev->state = MLX5_DEVICE_STATE_INTERNAL_ERROR;
1153         mutex_unlock(&dev->intf_state_mutex);
1154
1155         return err;
1156 }
1157
1158 static int mlx5_unload_one(struct mlx5_core_dev *dev, struct mlx5_priv *priv,
1159                            bool cleanup)
1160 {
1161         int err = 0;
1162
1163         if (cleanup)
1164                 mlx5_drain_health_recovery(dev);
1165
1166         mutex_lock(&dev->intf_state_mutex);
1167         if (test_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state)) {
1168                 dev_warn(&dev->pdev->dev, "%s: interface is down, NOP\n",
1169                          __func__);
1170                 if (cleanup)
1171                         mlx5_cleanup_once(dev);
1172                 goto out;
1173         }
1174
1175         if (mlx5_device_registered(dev))
1176                 mlx5_detach_device(dev);
1177
1178         mlx5_sriov_detach(dev);
1179 #ifdef CONFIG_MLX5_CORE_EN
1180         mlx5_eswitch_detach(dev->priv.eswitch);
1181 #endif
1182         mlx5_cleanup_fs(dev);
1183         mlx5_irq_clear_affinity_hints(dev);
1184         free_comp_eqs(dev);
1185         mlx5_stop_eqs(dev);
1186         mlx5_free_uuars(dev, &priv->uuari);
1187         mlx5_disable_msix(dev);
1188         if (cleanup)
1189                 mlx5_cleanup_once(dev);
1190         mlx5_stop_health_poll(dev, cleanup);
1191         err = mlx5_cmd_teardown_hca(dev);
1192         if (err) {
1193                 dev_err(&dev->pdev->dev, "tear_down_hca failed, skip cleanup\n");
1194                 goto out;
1195         }
1196         mlx5_pagealloc_stop(dev);
1197         mlx5_reclaim_startup_pages(dev);
1198         mlx5_core_disable_hca(dev, 0);
1199         mlx5_cmd_cleanup(dev);
1200
1201 out:
1202         clear_bit(MLX5_INTERFACE_STATE_UP, &dev->intf_state);
1203         set_bit(MLX5_INTERFACE_STATE_DOWN, &dev->intf_state);
1204         mutex_unlock(&dev->intf_state_mutex);
1205         return err;
1206 }
1207
1208 struct mlx5_core_event_handler {
1209         void (*event)(struct mlx5_core_dev *dev,
1210                       enum mlx5_dev_event event,
1211                       void *data);
1212 };
1213
1214 static const struct devlink_ops mlx5_devlink_ops = {
1215 #ifdef CONFIG_MLX5_CORE_EN
1216         .eswitch_mode_set = mlx5_devlink_eswitch_mode_set,
1217         .eswitch_mode_get = mlx5_devlink_eswitch_mode_get,
1218 #endif
1219 };
1220
1221 #define MLX5_IB_MOD "mlx5_ib"
1222 static int init_one(struct pci_dev *pdev,
1223                     const struct pci_device_id *id)
1224 {
1225         struct mlx5_core_dev *dev;
1226         struct devlink *devlink;
1227         struct mlx5_priv *priv;
1228         int err;
1229
1230         devlink = devlink_alloc(&mlx5_devlink_ops, sizeof(*dev));
1231         if (!devlink) {
1232                 dev_err(&pdev->dev, "kzalloc failed\n");
1233                 return -ENOMEM;
1234         }
1235
1236         dev = devlink_priv(devlink);
1237         priv = &dev->priv;
1238         priv->pci_dev_data = id->driver_data;
1239
1240         pci_set_drvdata(pdev, dev);
1241
1242         dev->pdev = pdev;
1243         dev->event = mlx5_core_event;
1244         dev->profile = &profile[prof_sel];
1245
1246         INIT_LIST_HEAD(&priv->ctx_list);
1247         spin_lock_init(&priv->ctx_lock);
1248         mutex_init(&dev->pci_status_mutex);
1249         mutex_init(&dev->intf_state_mutex);
1250         err = mlx5_pci_init(dev, priv);
1251         if (err) {
1252                 dev_err(&pdev->dev, "mlx5_pci_init failed with error code %d\n", err);
1253                 goto clean_dev;
1254         }
1255
1256         err = mlx5_health_init(dev);
1257         if (err) {
1258                 dev_err(&pdev->dev, "mlx5_health_init failed with error code %d\n", err);
1259                 goto close_pci;
1260         }
1261
1262         mlx5_pagealloc_init(dev);
1263
1264         err = mlx5_load_one(dev, priv, true);
1265         if (err) {
1266                 dev_err(&pdev->dev, "mlx5_load_one failed with error code %d\n", err);
1267                 goto clean_health;
1268         }
1269
1270         err = request_module_nowait(MLX5_IB_MOD);
1271         if (err)
1272                 pr_info("failed request module on %s\n", MLX5_IB_MOD);
1273
1274         err = devlink_register(devlink, &pdev->dev);
1275         if (err)
1276                 goto clean_load;
1277
1278         pci_save_state(pdev);
1279         return 0;
1280
1281 clean_load:
1282         mlx5_unload_one(dev, priv, true);
1283 clean_health:
1284         mlx5_pagealloc_cleanup(dev);
1285         mlx5_health_cleanup(dev);
1286 close_pci:
1287         mlx5_pci_close(dev, priv);
1288 clean_dev:
1289         pci_set_drvdata(pdev, NULL);
1290         devlink_free(devlink);
1291
1292         return err;
1293 }
1294
1295 static void remove_one(struct pci_dev *pdev)
1296 {
1297         struct mlx5_core_dev *dev  = pci_get_drvdata(pdev);
1298         struct devlink *devlink = priv_to_devlink(dev);
1299         struct mlx5_priv *priv = &dev->priv;
1300
1301         devlink_unregister(devlink);
1302         mlx5_unregister_device(dev);
1303
1304         if (mlx5_unload_one(dev, priv, true)) {
1305                 dev_err(&dev->pdev->dev, "mlx5_unload_one failed\n");
1306                 mlx5_health_cleanup(dev);
1307                 return;
1308         }
1309
1310         mlx5_pagealloc_cleanup(dev);
1311         mlx5_health_cleanup(dev);
1312         mlx5_pci_close(dev, priv);
1313         pci_set_drvdata(pdev, NULL);
1314         devlink_free(devlink);
1315 }
1316
1317 static pci_ers_result_t mlx5_pci_err_detected(struct pci_dev *pdev,
1318                                               pci_channel_state_t state)
1319 {
1320         struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1321         struct mlx5_priv *priv = &dev->priv;
1322
1323         dev_info(&pdev->dev, "%s was called\n", __func__);
1324
1325         mlx5_enter_error_state(dev);
1326         mlx5_unload_one(dev, priv, false);
1327         /* In case of kernel call drain the health wq */
1328         if (state) {
1329                 mlx5_drain_health_wq(dev);
1330                 mlx5_pci_disable_device(dev);
1331         }
1332
1333         return state == pci_channel_io_perm_failure ?
1334                 PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET;
1335 }
1336
1337 /* wait for the device to show vital signs by waiting
1338  * for the health counter to start counting.
1339  */
1340 static int wait_vital(struct pci_dev *pdev)
1341 {
1342         struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1343         struct mlx5_core_health *health = &dev->priv.health;
1344         const int niter = 100;
1345         u32 last_count = 0;
1346         u32 count;
1347         int i;
1348
1349         for (i = 0; i < niter; i++) {
1350                 count = ioread32be(health->health_counter);
1351                 if (count && count != 0xffffffff) {
1352                         if (last_count && last_count != count) {
1353                                 dev_info(&pdev->dev, "Counter value 0x%x after %d iterations\n", count, i);
1354                                 return 0;
1355                         }
1356                         last_count = count;
1357                 }
1358                 msleep(50);
1359         }
1360
1361         return -ETIMEDOUT;
1362 }
1363
1364 static pci_ers_result_t mlx5_pci_slot_reset(struct pci_dev *pdev)
1365 {
1366         struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1367         int err;
1368
1369         dev_info(&pdev->dev, "%s was called\n", __func__);
1370
1371         err = mlx5_pci_enable_device(dev);
1372         if (err) {
1373                 dev_err(&pdev->dev, "%s: mlx5_pci_enable_device failed with error code: %d\n"
1374                         , __func__, err);
1375                 return PCI_ERS_RESULT_DISCONNECT;
1376         }
1377
1378         pci_set_master(pdev);
1379         pci_restore_state(pdev);
1380         pci_save_state(pdev);
1381
1382         if (wait_vital(pdev)) {
1383                 dev_err(&pdev->dev, "%s: wait_vital timed out\n", __func__);
1384                 return PCI_ERS_RESULT_DISCONNECT;
1385         }
1386
1387         return PCI_ERS_RESULT_RECOVERED;
1388 }
1389
1390 static void mlx5_pci_resume(struct pci_dev *pdev)
1391 {
1392         struct mlx5_core_dev *dev = pci_get_drvdata(pdev);
1393         struct mlx5_priv *priv = &dev->priv;
1394         int err;
1395
1396         dev_info(&pdev->dev, "%s was called\n", __func__);
1397
1398         err = mlx5_load_one(dev, priv, false);
1399         if (err)
1400                 dev_err(&pdev->dev, "%s: mlx5_load_one failed with error code: %d\n"
1401                         , __func__, err);
1402         else
1403                 dev_info(&pdev->dev, "%s: device recovered\n", __func__);
1404 }
1405
1406 static const struct pci_error_handlers mlx5_err_handler = {
1407         .error_detected = mlx5_pci_err_detected,
1408         .slot_reset     = mlx5_pci_slot_reset,
1409         .resume         = mlx5_pci_resume
1410 };
1411
1412 static void shutdown(struct pci_dev *pdev)
1413 {
1414         struct mlx5_core_dev *dev  = pci_get_drvdata(pdev);
1415         struct mlx5_priv *priv = &dev->priv;
1416
1417         dev_info(&pdev->dev, "Shutdown was called\n");
1418         /* Notify mlx5 clients that the kernel is being shut down */
1419         set_bit(MLX5_INTERFACE_STATE_SHUTDOWN, &dev->intf_state);
1420         mlx5_unload_one(dev, priv, false);
1421         mlx5_pci_disable_device(dev);
1422 }
1423
1424 static const struct pci_device_id mlx5_core_pci_table[] = {
1425         { PCI_VDEVICE(MELLANOX, 0x1011) },                      /* Connect-IB */
1426         { PCI_VDEVICE(MELLANOX, 0x1012), MLX5_PCI_DEV_IS_VF},   /* Connect-IB VF */
1427         { PCI_VDEVICE(MELLANOX, 0x1013) },                      /* ConnectX-4 */
1428         { PCI_VDEVICE(MELLANOX, 0x1014), MLX5_PCI_DEV_IS_VF},   /* ConnectX-4 VF */
1429         { PCI_VDEVICE(MELLANOX, 0x1015) },                      /* ConnectX-4LX */
1430         { PCI_VDEVICE(MELLANOX, 0x1016), MLX5_PCI_DEV_IS_VF},   /* ConnectX-4LX VF */
1431         { PCI_VDEVICE(MELLANOX, 0x1017) },                      /* ConnectX-5, PCIe 3.0 */
1432         { PCI_VDEVICE(MELLANOX, 0x1018), MLX5_PCI_DEV_IS_VF},   /* ConnectX-5 VF */
1433         { PCI_VDEVICE(MELLANOX, 0x1019) },                      /* ConnectX-5, PCIe 4.0 */
1434         { 0, }
1435 };
1436
1437 MODULE_DEVICE_TABLE(pci, mlx5_core_pci_table);
1438
1439 void mlx5_disable_device(struct mlx5_core_dev *dev)
1440 {
1441         mlx5_pci_err_detected(dev->pdev, 0);
1442 }
1443
1444 void mlx5_recover_device(struct mlx5_core_dev *dev)
1445 {
1446         mlx5_pci_disable_device(dev);
1447         if (mlx5_pci_slot_reset(dev->pdev) == PCI_ERS_RESULT_RECOVERED)
1448                 mlx5_pci_resume(dev->pdev);
1449 }
1450
1451 static struct pci_driver mlx5_core_driver = {
1452         .name           = DRIVER_NAME,
1453         .id_table       = mlx5_core_pci_table,
1454         .probe          = init_one,
1455         .remove         = remove_one,
1456         .shutdown       = shutdown,
1457         .err_handler    = &mlx5_err_handler,
1458         .sriov_configure   = mlx5_core_sriov_configure,
1459 };
1460
1461 static void mlx5_core_verify_params(void)
1462 {
1463         if (prof_sel >= ARRAY_SIZE(profile)) {
1464                 pr_warn("mlx5_core: WARNING: Invalid module parameter prof_sel %d, valid range 0-%zu, changing back to default(%d)\n",
1465                         prof_sel,
1466                         ARRAY_SIZE(profile) - 1,
1467                         MLX5_DEFAULT_PROF);
1468                 prof_sel = MLX5_DEFAULT_PROF;
1469         }
1470 }
1471
1472 static int __init init(void)
1473 {
1474         int err;
1475
1476         mlx5_core_verify_params();
1477         mlx5_register_debugfs();
1478
1479         err = pci_register_driver(&mlx5_core_driver);
1480         if (err)
1481                 goto err_debug;
1482
1483 #ifdef CONFIG_MLX5_CORE_EN
1484         mlx5e_init();
1485 #endif
1486
1487         return 0;
1488
1489 err_debug:
1490         mlx5_unregister_debugfs();
1491         return err;
1492 }
1493
1494 static void __exit cleanup(void)
1495 {
1496 #ifdef CONFIG_MLX5_CORE_EN
1497         mlx5e_cleanup();
1498 #endif
1499         pci_unregister_driver(&mlx5_core_driver);
1500         mlx5_unregister_debugfs();
1501 }
1502
1503 module_init(init);
1504 module_exit(cleanup);