IB: simplify static rate encoding
[safe/jmp/linux-2.6] / drivers / infiniband / hw / mthca / mthca_main.c
1 /*
2  * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
3  * Copyright (c) 2005 Sun Microsystems, Inc. All rights reserved.
4  * Copyright (c) 2005 Mellanox Technologies. All rights reserved.
5  *
6  * This software is available to you under a choice of one of two
7  * licenses.  You may choose to be licensed under the terms of the GNU
8  * General Public License (GPL) Version 2, available from the file
9  * COPYING in the main directory of this source tree, or the
10  * OpenIB.org BSD license below:
11  *
12  *     Redistribution and use in source and binary forms, with or
13  *     without modification, are permitted provided that the following
14  *     conditions are met:
15  *
16  *      - Redistributions of source code must retain the above
17  *        copyright notice, this list of conditions and the following
18  *        disclaimer.
19  *
20  *      - Redistributions in binary form must reproduce the above
21  *        copyright notice, this list of conditions and the following
22  *        disclaimer in the documentation and/or other materials
23  *        provided with the distribution.
24  *
25  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32  * SOFTWARE.
33  *
34  * $Id: mthca_main.c 1396 2004-12-28 04:10:27Z roland $
35  */
36
37 #include <linux/config.h>
38 #include <linux/module.h>
39 #include <linux/init.h>
40 #include <linux/errno.h>
41 #include <linux/pci.h>
42 #include <linux/interrupt.h>
43
44 #include "mthca_dev.h"
45 #include "mthca_config_reg.h"
46 #include "mthca_cmd.h"
47 #include "mthca_profile.h"
48 #include "mthca_memfree.h"
49
50 MODULE_AUTHOR("Roland Dreier");
51 MODULE_DESCRIPTION("Mellanox InfiniBand HCA low-level driver");
52 MODULE_LICENSE("Dual BSD/GPL");
53 MODULE_VERSION(DRV_VERSION);
54
55 #ifdef CONFIG_INFINIBAND_MTHCA_DEBUG
56
57 int mthca_debug_level = 0;
58 module_param_named(debug_level, mthca_debug_level, int, 0644);
59 MODULE_PARM_DESC(debug_level, "Enable debug tracing if > 0");
60
61 #endif /* CONFIG_INFINIBAND_MTHCA_DEBUG */
62
63 #ifdef CONFIG_PCI_MSI
64
65 static int msi_x = 0;
66 module_param(msi_x, int, 0444);
67 MODULE_PARM_DESC(msi_x, "attempt to use MSI-X if nonzero");
68
69 static int msi = 0;
70 module_param(msi, int, 0444);
71 MODULE_PARM_DESC(msi, "attempt to use MSI if nonzero");
72
73 #else /* CONFIG_PCI_MSI */
74
75 #define msi_x (0)
76 #define msi   (0)
77
78 #endif /* CONFIG_PCI_MSI */
79
80 static const char mthca_version[] __devinitdata =
81         DRV_NAME ": Mellanox InfiniBand HCA driver v"
82         DRV_VERSION " (" DRV_RELDATE ")\n";
83
84 static struct mthca_profile default_profile = {
85         .num_qp            = 1 << 16,
86         .rdb_per_qp        = 4,
87         .num_cq            = 1 << 16,
88         .num_mcg           = 1 << 13,
89         .num_mpt           = 1 << 17,
90         .num_mtt           = 1 << 20,
91         .num_udav          = 1 << 15,   /* Tavor only */
92         .fmr_reserved_mtts = 1 << 18,   /* Tavor only */
93         .uarc_size         = 1 << 18,   /* Arbel only */
94 };
95
96 static int __devinit mthca_tune_pci(struct mthca_dev *mdev)
97 {
98         int cap;
99         u16 val;
100
101         /* First try to max out Read Byte Count */
102         cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_PCIX);
103         if (cap) {
104                 if (pci_read_config_word(mdev->pdev, cap + PCI_X_CMD, &val)) {
105                         mthca_err(mdev, "Couldn't read PCI-X command register, "
106                                   "aborting.\n");
107                         return -ENODEV;
108                 }
109                 val = (val & ~PCI_X_CMD_MAX_READ) | (3 << 2);
110                 if (pci_write_config_word(mdev->pdev, cap + PCI_X_CMD, val)) {
111                         mthca_err(mdev, "Couldn't write PCI-X command register, "
112                                   "aborting.\n");
113                         return -ENODEV;
114                 }
115         } else if (!(mdev->mthca_flags & MTHCA_FLAG_PCIE))
116                 mthca_info(mdev, "No PCI-X capability, not setting RBC.\n");
117
118         cap = pci_find_capability(mdev->pdev, PCI_CAP_ID_EXP);
119         if (cap) {
120                 if (pci_read_config_word(mdev->pdev, cap + PCI_EXP_DEVCTL, &val)) {
121                         mthca_err(mdev, "Couldn't read PCI Express device control "
122                                   "register, aborting.\n");
123                         return -ENODEV;
124                 }
125                 val = (val & ~PCI_EXP_DEVCTL_READRQ) | (5 << 12);
126                 if (pci_write_config_word(mdev->pdev, cap + PCI_EXP_DEVCTL, val)) {
127                         mthca_err(mdev, "Couldn't write PCI Express device control "
128                                   "register, aborting.\n");
129                         return -ENODEV;
130                 }
131         } else if (mdev->mthca_flags & MTHCA_FLAG_PCIE)
132                 mthca_info(mdev, "No PCI Express capability, "
133                            "not setting Max Read Request Size.\n");
134
135         return 0;
136 }
137
138 static int __devinit mthca_dev_lim(struct mthca_dev *mdev, struct mthca_dev_lim *dev_lim)
139 {
140         int err;
141         u8 status;
142
143         err = mthca_QUERY_DEV_LIM(mdev, dev_lim, &status);
144         if (err) {
145                 mthca_err(mdev, "QUERY_DEV_LIM command failed, aborting.\n");
146                 return err;
147         }
148         if (status) {
149                 mthca_err(mdev, "QUERY_DEV_LIM returned status 0x%02x, "
150                           "aborting.\n", status);
151                 return -EINVAL;
152         }
153         if (dev_lim->min_page_sz > PAGE_SIZE) {
154                 mthca_err(mdev, "HCA minimum page size of %d bigger than "
155                           "kernel PAGE_SIZE of %ld, aborting.\n",
156                           dev_lim->min_page_sz, PAGE_SIZE);
157                 return -ENODEV;
158         }
159         if (dev_lim->num_ports > MTHCA_MAX_PORTS) {
160                 mthca_err(mdev, "HCA has %d ports, but we only support %d, "
161                           "aborting.\n",
162                           dev_lim->num_ports, MTHCA_MAX_PORTS);
163                 return -ENODEV;
164         }
165
166         if (dev_lim->uar_size > pci_resource_len(mdev->pdev, 2)) {
167                 mthca_err(mdev, "HCA reported UAR size of 0x%x bigger than "
168                           "PCI resource 2 size of 0x%lx, aborting.\n",
169                           dev_lim->uar_size, pci_resource_len(mdev->pdev, 2));
170                 return -ENODEV;
171         }
172
173         mdev->limits.num_ports          = dev_lim->num_ports;
174         mdev->limits.vl_cap             = dev_lim->max_vl;
175         mdev->limits.mtu_cap            = dev_lim->max_mtu;
176         mdev->limits.gid_table_len      = dev_lim->max_gids;
177         mdev->limits.pkey_table_len     = dev_lim->max_pkeys;
178         mdev->limits.local_ca_ack_delay = dev_lim->local_ca_ack_delay;
179         mdev->limits.max_sg             = dev_lim->max_sg;
180         mdev->limits.max_wqes           = dev_lim->max_qp_sz;
181         mdev->limits.max_qp_init_rdma   = dev_lim->max_requester_per_qp;
182         mdev->limits.reserved_qps       = dev_lim->reserved_qps;
183         mdev->limits.max_srq_wqes       = dev_lim->max_srq_sz;
184         mdev->limits.reserved_srqs      = dev_lim->reserved_srqs;
185         mdev->limits.reserved_eecs      = dev_lim->reserved_eecs;
186         mdev->limits.max_desc_sz        = dev_lim->max_desc_sz;
187         /*
188          * Subtract 1 from the limit because we need to allocate a
189          * spare CQE so the HCA HW can tell the difference between an
190          * empty CQ and a full CQ.
191          */
192         mdev->limits.max_cqes           = dev_lim->max_cq_sz - 1;
193         mdev->limits.reserved_cqs       = dev_lim->reserved_cqs;
194         mdev->limits.reserved_eqs       = dev_lim->reserved_eqs;
195         mdev->limits.reserved_mtts      = dev_lim->reserved_mtts;
196         mdev->limits.reserved_mrws      = dev_lim->reserved_mrws;
197         mdev->limits.reserved_uars      = dev_lim->reserved_uars;
198         mdev->limits.reserved_pds       = dev_lim->reserved_pds;
199         mdev->limits.port_width_cap     = dev_lim->max_port_width;
200         mdev->limits.page_size_cap      = ~(u32) (dev_lim->min_page_sz - 1);
201         mdev->limits.flags              = dev_lim->flags;
202         /*
203          * For old FW that doesn't return static rate support, use a
204          * value of 0x3 (only static rate values of 0 or 1 are handled),
205          * except on Sinai, where even old FW can handle static rate
206          * values of 2 and 3.
207          */
208         if (dev_lim->stat_rate_support)
209                 mdev->limits.stat_rate_support = dev_lim->stat_rate_support;
210         else if (mdev->mthca_flags & MTHCA_FLAG_SINAI_OPT)
211                 mdev->limits.stat_rate_support = 0xf;
212         else
213                 mdev->limits.stat_rate_support = 0x3;
214
215         /* IB_DEVICE_RESIZE_MAX_WR not supported by driver.
216            May be doable since hardware supports it for SRQ.
217
218            IB_DEVICE_N_NOTIFY_CQ is supported by hardware but not by driver.
219
220            IB_DEVICE_SRQ_RESIZE is supported by hardware but SRQ is not
221            supported by driver. */
222         mdev->device_cap_flags = IB_DEVICE_CHANGE_PHY_PORT |
223                 IB_DEVICE_PORT_ACTIVE_EVENT |
224                 IB_DEVICE_SYS_IMAGE_GUID |
225                 IB_DEVICE_RC_RNR_NAK_GEN;
226
227         if (dev_lim->flags & DEV_LIM_FLAG_BAD_PKEY_CNTR)
228                 mdev->device_cap_flags |= IB_DEVICE_BAD_PKEY_CNTR;
229
230         if (dev_lim->flags & DEV_LIM_FLAG_BAD_QKEY_CNTR)
231                 mdev->device_cap_flags |= IB_DEVICE_BAD_QKEY_CNTR;
232
233         if (dev_lim->flags & DEV_LIM_FLAG_RAW_MULTI)
234                 mdev->device_cap_flags |= IB_DEVICE_RAW_MULTI;
235
236         if (dev_lim->flags & DEV_LIM_FLAG_AUTO_PATH_MIG)
237                 mdev->device_cap_flags |= IB_DEVICE_AUTO_PATH_MIG;
238
239         if (dev_lim->flags & DEV_LIM_FLAG_UD_AV_PORT_ENFORCE)
240                 mdev->device_cap_flags |= IB_DEVICE_UD_AV_PORT_ENFORCE;
241
242         if (dev_lim->flags & DEV_LIM_FLAG_SRQ)
243                 mdev->mthca_flags |= MTHCA_FLAG_SRQ;
244
245         return 0;
246 }
247
248 static int __devinit mthca_init_tavor(struct mthca_dev *mdev)
249 {
250         u8 status;
251         int err;
252         struct mthca_dev_lim        dev_lim;
253         struct mthca_profile        profile;
254         struct mthca_init_hca_param init_hca;
255
256         err = mthca_SYS_EN(mdev, &status);
257         if (err) {
258                 mthca_err(mdev, "SYS_EN command failed, aborting.\n");
259                 return err;
260         }
261         if (status) {
262                 mthca_err(mdev, "SYS_EN returned status 0x%02x, "
263                           "aborting.\n", status);
264                 return -EINVAL;
265         }
266
267         err = mthca_QUERY_FW(mdev, &status);
268         if (err) {
269                 mthca_err(mdev, "QUERY_FW command failed, aborting.\n");
270                 goto err_disable;
271         }
272         if (status) {
273                 mthca_err(mdev, "QUERY_FW returned status 0x%02x, "
274                           "aborting.\n", status);
275                 err = -EINVAL;
276                 goto err_disable;
277         }
278         err = mthca_QUERY_DDR(mdev, &status);
279         if (err) {
280                 mthca_err(mdev, "QUERY_DDR command failed, aborting.\n");
281                 goto err_disable;
282         }
283         if (status) {
284                 mthca_err(mdev, "QUERY_DDR returned status 0x%02x, "
285                           "aborting.\n", status);
286                 err = -EINVAL;
287                 goto err_disable;
288         }
289
290         err = mthca_dev_lim(mdev, &dev_lim);
291         if (err) {
292                 mthca_err(mdev, "QUERY_DEV_LIM command failed, aborting.\n");
293                 goto err_disable;
294         }
295
296         profile = default_profile;
297         profile.num_uar   = dev_lim.uar_size / PAGE_SIZE;
298         profile.uarc_size = 0;
299         if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
300                 profile.num_srq = dev_lim.max_srqs;
301
302         err = mthca_make_profile(mdev, &profile, &dev_lim, &init_hca);
303         if (err < 0)
304                 goto err_disable;
305
306         err = mthca_INIT_HCA(mdev, &init_hca, &status);
307         if (err) {
308                 mthca_err(mdev, "INIT_HCA command failed, aborting.\n");
309                 goto err_disable;
310         }
311         if (status) {
312                 mthca_err(mdev, "INIT_HCA returned status 0x%02x, "
313                           "aborting.\n", status);
314                 err = -EINVAL;
315                 goto err_disable;
316         }
317
318         return 0;
319
320 err_disable:
321         mthca_SYS_DIS(mdev, &status);
322
323         return err;
324 }
325
326 static int __devinit mthca_load_fw(struct mthca_dev *mdev)
327 {
328         u8 status;
329         int err;
330
331         /* FIXME: use HCA-attached memory for FW if present */
332
333         mdev->fw.arbel.fw_icm =
334                 mthca_alloc_icm(mdev, mdev->fw.arbel.fw_pages,
335                                 GFP_HIGHUSER | __GFP_NOWARN);
336         if (!mdev->fw.arbel.fw_icm) {
337                 mthca_err(mdev, "Couldn't allocate FW area, aborting.\n");
338                 return -ENOMEM;
339         }
340
341         err = mthca_MAP_FA(mdev, mdev->fw.arbel.fw_icm, &status);
342         if (err) {
343                 mthca_err(mdev, "MAP_FA command failed, aborting.\n");
344                 goto err_free;
345         }
346         if (status) {
347                 mthca_err(mdev, "MAP_FA returned status 0x%02x, aborting.\n", status);
348                 err = -EINVAL;
349                 goto err_free;
350         }
351         err = mthca_RUN_FW(mdev, &status);
352         if (err) {
353                 mthca_err(mdev, "RUN_FW command failed, aborting.\n");
354                 goto err_unmap_fa;
355         }
356         if (status) {
357                 mthca_err(mdev, "RUN_FW returned status 0x%02x, aborting.\n", status);
358                 err = -EINVAL;
359                 goto err_unmap_fa;
360         }
361
362         return 0;
363
364 err_unmap_fa:
365         mthca_UNMAP_FA(mdev, &status);
366
367 err_free:
368         mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);
369         return err;
370 }
371
372 static int __devinit mthca_init_icm(struct mthca_dev *mdev,
373                                     struct mthca_dev_lim *dev_lim,
374                                     struct mthca_init_hca_param *init_hca,
375                                     u64 icm_size)
376 {
377         u64 aux_pages;
378         u8 status;
379         int err;
380
381         err = mthca_SET_ICM_SIZE(mdev, icm_size, &aux_pages, &status);
382         if (err) {
383                 mthca_err(mdev, "SET_ICM_SIZE command failed, aborting.\n");
384                 return err;
385         }
386         if (status) {
387                 mthca_err(mdev, "SET_ICM_SIZE returned status 0x%02x, "
388                           "aborting.\n", status);
389                 return -EINVAL;
390         }
391
392         mthca_dbg(mdev, "%lld KB of HCA context requires %lld KB aux memory.\n",
393                   (unsigned long long) icm_size >> 10,
394                   (unsigned long long) aux_pages << 2);
395
396         mdev->fw.arbel.aux_icm = mthca_alloc_icm(mdev, aux_pages,
397                                                  GFP_HIGHUSER | __GFP_NOWARN);
398         if (!mdev->fw.arbel.aux_icm) {
399                 mthca_err(mdev, "Couldn't allocate aux memory, aborting.\n");
400                 return -ENOMEM;
401         }
402
403         err = mthca_MAP_ICM_AUX(mdev, mdev->fw.arbel.aux_icm, &status);
404         if (err) {
405                 mthca_err(mdev, "MAP_ICM_AUX command failed, aborting.\n");
406                 goto err_free_aux;
407         }
408         if (status) {
409                 mthca_err(mdev, "MAP_ICM_AUX returned status 0x%02x, aborting.\n", status);
410                 err = -EINVAL;
411                 goto err_free_aux;
412         }
413
414         err = mthca_map_eq_icm(mdev, init_hca->eqc_base);
415         if (err) {
416                 mthca_err(mdev, "Failed to map EQ context memory, aborting.\n");
417                 goto err_unmap_aux;
418         }
419
420         mdev->mr_table.mtt_table = mthca_alloc_icm_table(mdev, init_hca->mtt_base,
421                                                          MTHCA_MTT_SEG_SIZE,
422                                                          mdev->limits.num_mtt_segs,
423                                                          mdev->limits.reserved_mtts, 1);
424         if (!mdev->mr_table.mtt_table) {
425                 mthca_err(mdev, "Failed to map MTT context memory, aborting.\n");
426                 err = -ENOMEM;
427                 goto err_unmap_eq;
428         }
429
430         mdev->mr_table.mpt_table = mthca_alloc_icm_table(mdev, init_hca->mpt_base,
431                                                          dev_lim->mpt_entry_sz,
432                                                          mdev->limits.num_mpts,
433                                                          mdev->limits.reserved_mrws, 1);
434         if (!mdev->mr_table.mpt_table) {
435                 mthca_err(mdev, "Failed to map MPT context memory, aborting.\n");
436                 err = -ENOMEM;
437                 goto err_unmap_mtt;
438         }
439
440         mdev->qp_table.qp_table = mthca_alloc_icm_table(mdev, init_hca->qpc_base,
441                                                         dev_lim->qpc_entry_sz,
442                                                         mdev->limits.num_qps,
443                                                         mdev->limits.reserved_qps, 0);
444         if (!mdev->qp_table.qp_table) {
445                 mthca_err(mdev, "Failed to map QP context memory, aborting.\n");
446                 err = -ENOMEM;
447                 goto err_unmap_mpt;
448         }
449
450         mdev->qp_table.eqp_table = mthca_alloc_icm_table(mdev, init_hca->eqpc_base,
451                                                          dev_lim->eqpc_entry_sz,
452                                                          mdev->limits.num_qps,
453                                                          mdev->limits.reserved_qps, 0);
454         if (!mdev->qp_table.eqp_table) {
455                 mthca_err(mdev, "Failed to map EQP context memory, aborting.\n");
456                 err = -ENOMEM;
457                 goto err_unmap_qp;
458         }
459
460         mdev->qp_table.rdb_table = mthca_alloc_icm_table(mdev, init_hca->rdb_base,
461                                                          MTHCA_RDB_ENTRY_SIZE,
462                                                          mdev->limits.num_qps <<
463                                                          mdev->qp_table.rdb_shift,
464                                                          0, 0);
465         if (!mdev->qp_table.rdb_table) {
466                 mthca_err(mdev, "Failed to map RDB context memory, aborting\n");
467                 err = -ENOMEM;
468                 goto err_unmap_eqp;
469         }
470
471        mdev->cq_table.table = mthca_alloc_icm_table(mdev, init_hca->cqc_base,
472                                                     dev_lim->cqc_entry_sz,
473                                                     mdev->limits.num_cqs,
474                                                     mdev->limits.reserved_cqs, 0);
475         if (!mdev->cq_table.table) {
476                 mthca_err(mdev, "Failed to map CQ context memory, aborting.\n");
477                 err = -ENOMEM;
478                 goto err_unmap_rdb;
479         }
480
481         if (mdev->mthca_flags & MTHCA_FLAG_SRQ) {
482                 mdev->srq_table.table =
483                         mthca_alloc_icm_table(mdev, init_hca->srqc_base,
484                                               dev_lim->srq_entry_sz,
485                                               mdev->limits.num_srqs,
486                                               mdev->limits.reserved_srqs, 0);
487                 if (!mdev->srq_table.table) {
488                         mthca_err(mdev, "Failed to map SRQ context memory, "
489                                   "aborting.\n");
490                         err = -ENOMEM;
491                         goto err_unmap_cq;
492                 }
493         }
494
495         /*
496          * It's not strictly required, but for simplicity just map the
497          * whole multicast group table now.  The table isn't very big
498          * and it's a lot easier than trying to track ref counts.
499          */
500         mdev->mcg_table.table = mthca_alloc_icm_table(mdev, init_hca->mc_base,
501                                                       MTHCA_MGM_ENTRY_SIZE,
502                                                       mdev->limits.num_mgms +
503                                                       mdev->limits.num_amgms,
504                                                       mdev->limits.num_mgms +
505                                                       mdev->limits.num_amgms,
506                                                       0);
507         if (!mdev->mcg_table.table) {
508                 mthca_err(mdev, "Failed to map MCG context memory, aborting.\n");
509                 err = -ENOMEM;
510                 goto err_unmap_srq;
511         }
512
513         return 0;
514
515 err_unmap_srq:
516         if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
517                 mthca_free_icm_table(mdev, mdev->srq_table.table);
518
519 err_unmap_cq:
520         mthca_free_icm_table(mdev, mdev->cq_table.table);
521
522 err_unmap_rdb:
523         mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);
524
525 err_unmap_eqp:
526         mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);
527
528 err_unmap_qp:
529         mthca_free_icm_table(mdev, mdev->qp_table.qp_table);
530
531 err_unmap_mpt:
532         mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);
533
534 err_unmap_mtt:
535         mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);
536
537 err_unmap_eq:
538         mthca_unmap_eq_icm(mdev);
539
540 err_unmap_aux:
541         mthca_UNMAP_ICM_AUX(mdev, &status);
542
543 err_free_aux:
544         mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
545
546         return err;
547 }
548
549 static void mthca_free_icms(struct mthca_dev *mdev)
550 {
551         u8 status;
552
553         mthca_free_icm_table(mdev, mdev->mcg_table.table);
554         if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
555                 mthca_free_icm_table(mdev, mdev->srq_table.table);
556         mthca_free_icm_table(mdev, mdev->cq_table.table);
557         mthca_free_icm_table(mdev, mdev->qp_table.rdb_table);
558         mthca_free_icm_table(mdev, mdev->qp_table.eqp_table);
559         mthca_free_icm_table(mdev, mdev->qp_table.qp_table);
560         mthca_free_icm_table(mdev, mdev->mr_table.mpt_table);
561         mthca_free_icm_table(mdev, mdev->mr_table.mtt_table);
562         mthca_unmap_eq_icm(mdev);
563
564         mthca_UNMAP_ICM_AUX(mdev, &status);
565         mthca_free_icm(mdev, mdev->fw.arbel.aux_icm);
566 }
567
568 static int __devinit mthca_init_arbel(struct mthca_dev *mdev)
569 {
570         struct mthca_dev_lim        dev_lim;
571         struct mthca_profile        profile;
572         struct mthca_init_hca_param init_hca;
573         u64 icm_size;
574         u8 status;
575         int err;
576
577         err = mthca_QUERY_FW(mdev, &status);
578         if (err) {
579                 mthca_err(mdev, "QUERY_FW command failed, aborting.\n");
580                 return err;
581         }
582         if (status) {
583                 mthca_err(mdev, "QUERY_FW returned status 0x%02x, "
584                           "aborting.\n", status);
585                 return -EINVAL;
586         }
587
588         err = mthca_ENABLE_LAM(mdev, &status);
589         if (err) {
590                 mthca_err(mdev, "ENABLE_LAM command failed, aborting.\n");
591                 return err;
592         }
593         if (status == MTHCA_CMD_STAT_LAM_NOT_PRE) {
594                 mthca_dbg(mdev, "No HCA-attached memory (running in MemFree mode)\n");
595                 mdev->mthca_flags |= MTHCA_FLAG_NO_LAM;
596         } else if (status) {
597                 mthca_err(mdev, "ENABLE_LAM returned status 0x%02x, "
598                           "aborting.\n", status);
599                 return -EINVAL;
600         }
601
602         err = mthca_load_fw(mdev);
603         if (err) {
604                 mthca_err(mdev, "Failed to start FW, aborting.\n");
605                 goto err_disable;
606         }
607
608         err = mthca_dev_lim(mdev, &dev_lim);
609         if (err) {
610                 mthca_err(mdev, "QUERY_DEV_LIM command failed, aborting.\n");
611                 goto err_stop_fw;
612         }
613
614         profile = default_profile;
615         profile.num_uar  = dev_lim.uar_size / PAGE_SIZE;
616         profile.num_udav = 0;
617         if (mdev->mthca_flags & MTHCA_FLAG_SRQ)
618                 profile.num_srq = dev_lim.max_srqs;
619
620         icm_size = mthca_make_profile(mdev, &profile, &dev_lim, &init_hca);
621         if ((int) icm_size < 0) {
622                 err = icm_size;
623                 goto err_stop_fw;
624         }
625
626         err = mthca_init_icm(mdev, &dev_lim, &init_hca, icm_size);
627         if (err)
628                 goto err_stop_fw;
629
630         err = mthca_INIT_HCA(mdev, &init_hca, &status);
631         if (err) {
632                 mthca_err(mdev, "INIT_HCA command failed, aborting.\n");
633                 goto err_free_icm;
634         }
635         if (status) {
636                 mthca_err(mdev, "INIT_HCA returned status 0x%02x, "
637                           "aborting.\n", status);
638                 err = -EINVAL;
639                 goto err_free_icm;
640         }
641
642         return 0;
643
644 err_free_icm:
645         mthca_free_icms(mdev);
646
647 err_stop_fw:
648         mthca_UNMAP_FA(mdev, &status);
649         mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);
650
651 err_disable:
652         if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))
653                 mthca_DISABLE_LAM(mdev, &status);
654
655         return err;
656 }
657
658 static void mthca_close_hca(struct mthca_dev *mdev)
659 {
660         u8 status;
661
662         mthca_CLOSE_HCA(mdev, 0, &status);
663
664         if (mthca_is_memfree(mdev)) {
665                 mthca_free_icms(mdev);
666
667                 mthca_UNMAP_FA(mdev, &status);
668                 mthca_free_icm(mdev, mdev->fw.arbel.fw_icm);
669
670                 if (!(mdev->mthca_flags & MTHCA_FLAG_NO_LAM))
671                         mthca_DISABLE_LAM(mdev, &status);
672         } else
673                 mthca_SYS_DIS(mdev, &status);
674 }
675
676 static int __devinit mthca_init_hca(struct mthca_dev *mdev)
677 {
678         u8 status;
679         int err;
680         struct mthca_adapter adapter;
681
682         if (mthca_is_memfree(mdev))
683                 err = mthca_init_arbel(mdev);
684         else
685                 err = mthca_init_tavor(mdev);
686
687         if (err)
688                 return err;
689
690         err = mthca_QUERY_ADAPTER(mdev, &adapter, &status);
691         if (err) {
692                 mthca_err(mdev, "QUERY_ADAPTER command failed, aborting.\n");
693                 goto err_close;
694         }
695         if (status) {
696                 mthca_err(mdev, "QUERY_ADAPTER returned status 0x%02x, "
697                           "aborting.\n", status);
698                 err = -EINVAL;
699                 goto err_close;
700         }
701
702         mdev->eq_table.inta_pin = adapter.inta_pin;
703         mdev->rev_id            = adapter.revision_id;
704         memcpy(mdev->board_id, adapter.board_id, sizeof mdev->board_id);
705
706         return 0;
707
708 err_close:
709         mthca_close_hca(mdev);
710         return err;
711 }
712
713 static int __devinit mthca_setup_hca(struct mthca_dev *dev)
714 {
715         int err;
716         u8 status;
717
718         MTHCA_INIT_DOORBELL_LOCK(&dev->doorbell_lock);
719
720         err = mthca_init_uar_table(dev);
721         if (err) {
722                 mthca_err(dev, "Failed to initialize "
723                           "user access region table, aborting.\n");
724                 return err;
725         }
726
727         err = mthca_uar_alloc(dev, &dev->driver_uar);
728         if (err) {
729                 mthca_err(dev, "Failed to allocate driver access region, "
730                           "aborting.\n");
731                 goto err_uar_table_free;
732         }
733
734         dev->kar = ioremap(dev->driver_uar.pfn << PAGE_SHIFT, PAGE_SIZE);
735         if (!dev->kar) {
736                 mthca_err(dev, "Couldn't map kernel access region, "
737                           "aborting.\n");
738                 err = -ENOMEM;
739                 goto err_uar_free;
740         }
741
742         err = mthca_init_pd_table(dev);
743         if (err) {
744                 mthca_err(dev, "Failed to initialize "
745                           "protection domain table, aborting.\n");
746                 goto err_kar_unmap;
747         }
748
749         err = mthca_init_mr_table(dev);
750         if (err) {
751                 mthca_err(dev, "Failed to initialize "
752                           "memory region table, aborting.\n");
753                 goto err_pd_table_free;
754         }
755
756         err = mthca_pd_alloc(dev, 1, &dev->driver_pd);
757         if (err) {
758                 mthca_err(dev, "Failed to create driver PD, "
759                           "aborting.\n");
760                 goto err_mr_table_free;
761         }
762
763         err = mthca_init_eq_table(dev);
764         if (err) {
765                 mthca_err(dev, "Failed to initialize "
766                           "event queue table, aborting.\n");
767                 goto err_pd_free;
768         }
769
770         err = mthca_cmd_use_events(dev);
771         if (err) {
772                 mthca_err(dev, "Failed to switch to event-driven "
773                           "firmware commands, aborting.\n");
774                 goto err_eq_table_free;
775         }
776
777         err = mthca_NOP(dev, &status);
778         if (err || status) {
779                 mthca_err(dev, "NOP command failed to generate interrupt (IRQ %d), aborting.\n",
780                           dev->mthca_flags & MTHCA_FLAG_MSI_X ?
781                           dev->eq_table.eq[MTHCA_EQ_CMD].msi_x_vector :
782                           dev->pdev->irq);
783                 if (dev->mthca_flags & (MTHCA_FLAG_MSI | MTHCA_FLAG_MSI_X))
784                         mthca_err(dev, "Try again with MSI/MSI-X disabled.\n");
785                 else
786                         mthca_err(dev, "BIOS or ACPI interrupt routing problem?\n");
787
788                 goto err_cmd_poll;
789         }
790
791         mthca_dbg(dev, "NOP command IRQ test passed\n");
792
793         err = mthca_init_cq_table(dev);
794         if (err) {
795                 mthca_err(dev, "Failed to initialize "
796                           "completion queue table, aborting.\n");
797                 goto err_cmd_poll;
798         }
799
800         err = mthca_init_srq_table(dev);
801         if (err) {
802                 mthca_err(dev, "Failed to initialize "
803                           "shared receive queue table, aborting.\n");
804                 goto err_cq_table_free;
805         }
806
807         err = mthca_init_qp_table(dev);
808         if (err) {
809                 mthca_err(dev, "Failed to initialize "
810                           "queue pair table, aborting.\n");
811                 goto err_srq_table_free;
812         }
813
814         err = mthca_init_av_table(dev);
815         if (err) {
816                 mthca_err(dev, "Failed to initialize "
817                           "address vector table, aborting.\n");
818                 goto err_qp_table_free;
819         }
820
821         err = mthca_init_mcg_table(dev);
822         if (err) {
823                 mthca_err(dev, "Failed to initialize "
824                           "multicast group table, aborting.\n");
825                 goto err_av_table_free;
826         }
827
828         return 0;
829
830 err_av_table_free:
831         mthca_cleanup_av_table(dev);
832
833 err_qp_table_free:
834         mthca_cleanup_qp_table(dev);
835
836 err_srq_table_free:
837         mthca_cleanup_srq_table(dev);
838
839 err_cq_table_free:
840         mthca_cleanup_cq_table(dev);
841
842 err_cmd_poll:
843         mthca_cmd_use_polling(dev);
844
845 err_eq_table_free:
846         mthca_cleanup_eq_table(dev);
847
848 err_pd_free:
849         mthca_pd_free(dev, &dev->driver_pd);
850
851 err_mr_table_free:
852         mthca_cleanup_mr_table(dev);
853
854 err_pd_table_free:
855         mthca_cleanup_pd_table(dev);
856
857 err_kar_unmap:
858         iounmap(dev->kar);
859
860 err_uar_free:
861         mthca_uar_free(dev, &dev->driver_uar);
862
863 err_uar_table_free:
864         mthca_cleanup_uar_table(dev);
865         return err;
866 }
867
868 static int __devinit mthca_request_regions(struct pci_dev *pdev,
869                                            int ddr_hidden)
870 {
871         int err;
872
873         /*
874          * We can't just use pci_request_regions() because the MSI-X
875          * table is right in the middle of the first BAR.  If we did
876          * pci_request_region and grab all of the first BAR, then
877          * setting up MSI-X would fail, since the PCI core wants to do
878          * request_mem_region on the MSI-X vector table.
879          *
880          * So just request what we need right now, and request any
881          * other regions we need when setting up EQs.
882          */
883         if (!request_mem_region(pci_resource_start(pdev, 0) + MTHCA_HCR_BASE,
884                                 MTHCA_HCR_SIZE, DRV_NAME))
885                 return -EBUSY;
886
887         err = pci_request_region(pdev, 2, DRV_NAME);
888         if (err)
889                 goto err_bar2_failed;
890
891         if (!ddr_hidden) {
892                 err = pci_request_region(pdev, 4, DRV_NAME);
893                 if (err)
894                         goto err_bar4_failed;
895         }
896
897         return 0;
898
899 err_bar4_failed:
900         pci_release_region(pdev, 2);
901
902 err_bar2_failed:
903         release_mem_region(pci_resource_start(pdev, 0) + MTHCA_HCR_BASE,
904                            MTHCA_HCR_SIZE);
905
906         return err;
907 }
908
909 static void mthca_release_regions(struct pci_dev *pdev,
910                                   int ddr_hidden)
911 {
912         if (!ddr_hidden)
913                 pci_release_region(pdev, 4);
914
915         pci_release_region(pdev, 2);
916
917         release_mem_region(pci_resource_start(pdev, 0) + MTHCA_HCR_BASE,
918                            MTHCA_HCR_SIZE);
919 }
920
921 static int __devinit mthca_enable_msi_x(struct mthca_dev *mdev)
922 {
923         struct msix_entry entries[3];
924         int err;
925
926         entries[0].entry = 0;
927         entries[1].entry = 1;
928         entries[2].entry = 2;
929
930         err = pci_enable_msix(mdev->pdev, entries, ARRAY_SIZE(entries));
931         if (err) {
932                 if (err > 0)
933                         mthca_info(mdev, "Only %d MSI-X vectors available, "
934                                    "not using MSI-X\n", err);
935                 return err;
936         }
937
938         mdev->eq_table.eq[MTHCA_EQ_COMP ].msi_x_vector = entries[0].vector;
939         mdev->eq_table.eq[MTHCA_EQ_ASYNC].msi_x_vector = entries[1].vector;
940         mdev->eq_table.eq[MTHCA_EQ_CMD  ].msi_x_vector = entries[2].vector;
941
942         return 0;
943 }
944
945 /* Types of supported HCA */
946 enum {
947         TAVOR,                  /* MT23108                        */
948         ARBEL_COMPAT,           /* MT25208 in Tavor compat mode   */
949         ARBEL_NATIVE,           /* MT25208 with extended features */
950         SINAI                   /* MT25204 */
951 };
952
953 #define MTHCA_FW_VER(major, minor, subminor) \
954         (((u64) (major) << 32) | ((u64) (minor) << 16) | (u64) (subminor))
955
956 static struct {
957         u64 latest_fw;
958         u32 flags;
959 } mthca_hca_table[] = {
960         [TAVOR]        = { .latest_fw = MTHCA_FW_VER(3, 4, 0),
961                            .flags     = 0 },
962         [ARBEL_COMPAT] = { .latest_fw = MTHCA_FW_VER(4, 7, 400),
963                            .flags     = MTHCA_FLAG_PCIE },
964         [ARBEL_NATIVE] = { .latest_fw = MTHCA_FW_VER(5, 1, 0),
965                            .flags     = MTHCA_FLAG_MEMFREE |
966                                         MTHCA_FLAG_PCIE },
967         [SINAI]        = { .latest_fw = MTHCA_FW_VER(1, 0, 800),
968                            .flags     = MTHCA_FLAG_MEMFREE |
969                                         MTHCA_FLAG_PCIE    |
970                                         MTHCA_FLAG_SINAI_OPT }
971 };
972
973 static int __devinit mthca_init_one(struct pci_dev *pdev,
974                                     const struct pci_device_id *id)
975 {
976         static int mthca_version_printed = 0;
977         int ddr_hidden = 0;
978         int err;
979         struct mthca_dev *mdev;
980
981         if (!mthca_version_printed) {
982                 printk(KERN_INFO "%s", mthca_version);
983                 ++mthca_version_printed;
984         }
985
986         printk(KERN_INFO PFX "Initializing %s\n",
987                pci_name(pdev));
988
989         if (id->driver_data >= ARRAY_SIZE(mthca_hca_table)) {
990                 printk(KERN_ERR PFX "%s has invalid driver data %lx\n",
991                        pci_name(pdev), id->driver_data);
992                 return -ENODEV;
993         }
994
995         err = pci_enable_device(pdev);
996         if (err) {
997                 dev_err(&pdev->dev, "Cannot enable PCI device, "
998                         "aborting.\n");
999                 return err;
1000         }
1001
1002         /*
1003          * Check for BARs.  We expect 0: 1MB, 2: 8MB, 4: DDR (may not
1004          * be present)
1005          */
1006         if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) ||
1007             pci_resource_len(pdev, 0) != 1 << 20) {
1008                 dev_err(&pdev->dev, "Missing DCS, aborting.\n");
1009                 err = -ENODEV;
1010                 goto err_disable_pdev;
1011         }
1012         if (!(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) {
1013                 dev_err(&pdev->dev, "Missing UAR, aborting.\n");
1014                 err = -ENODEV;
1015                 goto err_disable_pdev;
1016         }
1017         if (!(pci_resource_flags(pdev, 4) & IORESOURCE_MEM))
1018                 ddr_hidden = 1;
1019
1020         err = mthca_request_regions(pdev, ddr_hidden);
1021         if (err) {
1022                 dev_err(&pdev->dev, "Cannot obtain PCI resources, "
1023                         "aborting.\n");
1024                 goto err_disable_pdev;
1025         }
1026
1027         pci_set_master(pdev);
1028
1029         err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
1030         if (err) {
1031                 dev_warn(&pdev->dev, "Warning: couldn't set 64-bit PCI DMA mask.\n");
1032                 err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
1033                 if (err) {
1034                         dev_err(&pdev->dev, "Can't set PCI DMA mask, aborting.\n");
1035                         goto err_free_res;
1036                 }
1037         }
1038         err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
1039         if (err) {
1040                 dev_warn(&pdev->dev, "Warning: couldn't set 64-bit "
1041                          "consistent PCI DMA mask.\n");
1042                 err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
1043                 if (err) {
1044                         dev_err(&pdev->dev, "Can't set consistent PCI DMA mask, "
1045                                 "aborting.\n");
1046                         goto err_free_res;
1047                 }
1048         }
1049
1050         mdev = (struct mthca_dev *) ib_alloc_device(sizeof *mdev);
1051         if (!mdev) {
1052                 dev_err(&pdev->dev, "Device struct alloc failed, "
1053                         "aborting.\n");
1054                 err = -ENOMEM;
1055                 goto err_free_res;
1056         }
1057
1058         mdev->pdev = pdev;
1059
1060         mdev->mthca_flags = mthca_hca_table[id->driver_data].flags;
1061         if (ddr_hidden)
1062                 mdev->mthca_flags |= MTHCA_FLAG_DDR_HIDDEN;
1063
1064         /*
1065          * Now reset the HCA before we touch the PCI capabilities or
1066          * attempt a firmware command, since a boot ROM may have left
1067          * the HCA in an undefined state.
1068          */
1069         err = mthca_reset(mdev);
1070         if (err) {
1071                 mthca_err(mdev, "Failed to reset HCA, aborting.\n");
1072                 goto err_free_dev;
1073         }
1074
1075         if (msi_x && !mthca_enable_msi_x(mdev))
1076                 mdev->mthca_flags |= MTHCA_FLAG_MSI_X;
1077         if (msi && !(mdev->mthca_flags & MTHCA_FLAG_MSI_X) &&
1078             !pci_enable_msi(pdev))
1079                 mdev->mthca_flags |= MTHCA_FLAG_MSI;
1080
1081         if (mthca_cmd_init(mdev)) {
1082                 mthca_err(mdev, "Failed to init command interface, aborting.\n");
1083                 goto err_free_dev;
1084         }
1085
1086         err = mthca_tune_pci(mdev);
1087         if (err)
1088                 goto err_cmd;
1089
1090         err = mthca_init_hca(mdev);
1091         if (err)
1092                 goto err_cmd;
1093
1094         if (mdev->fw_ver < mthca_hca_table[id->driver_data].latest_fw) {
1095                 mthca_warn(mdev, "HCA FW version %d.%d.%d is old (%d.%d.%d is current).\n",
1096                            (int) (mdev->fw_ver >> 32), (int) (mdev->fw_ver >> 16) & 0xffff,
1097                            (int) (mdev->fw_ver & 0xffff),
1098                            (int) (mthca_hca_table[id->driver_data].latest_fw >> 32),
1099                            (int) (mthca_hca_table[id->driver_data].latest_fw >> 16) & 0xffff,
1100                            (int) (mthca_hca_table[id->driver_data].latest_fw & 0xffff));
1101                 mthca_warn(mdev, "If you have problems, try updating your HCA FW.\n");
1102         }
1103
1104         err = mthca_setup_hca(mdev);
1105         if (err)
1106                 goto err_close;
1107
1108         err = mthca_register_device(mdev);
1109         if (err)
1110                 goto err_cleanup;
1111
1112         err = mthca_create_agents(mdev);
1113         if (err)
1114                 goto err_unregister;
1115
1116         pci_set_drvdata(pdev, mdev);
1117
1118         return 0;
1119
1120 err_unregister:
1121         mthca_unregister_device(mdev);
1122
1123 err_cleanup:
1124         mthca_cleanup_mcg_table(mdev);
1125         mthca_cleanup_av_table(mdev);
1126         mthca_cleanup_qp_table(mdev);
1127         mthca_cleanup_srq_table(mdev);
1128         mthca_cleanup_cq_table(mdev);
1129         mthca_cmd_use_polling(mdev);
1130         mthca_cleanup_eq_table(mdev);
1131
1132         mthca_pd_free(mdev, &mdev->driver_pd);
1133
1134         mthca_cleanup_mr_table(mdev);
1135         mthca_cleanup_pd_table(mdev);
1136         mthca_cleanup_uar_table(mdev);
1137
1138 err_close:
1139         mthca_close_hca(mdev);
1140
1141 err_cmd:
1142         mthca_cmd_cleanup(mdev);
1143
1144 err_free_dev:
1145         if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
1146                 pci_disable_msix(pdev);
1147         if (mdev->mthca_flags & MTHCA_FLAG_MSI)
1148                 pci_disable_msi(pdev);
1149
1150         ib_dealloc_device(&mdev->ib_dev);
1151
1152 err_free_res:
1153         mthca_release_regions(pdev, ddr_hidden);
1154
1155 err_disable_pdev:
1156         pci_disable_device(pdev);
1157         pci_set_drvdata(pdev, NULL);
1158         return err;
1159 }
1160
1161 static void __devexit mthca_remove_one(struct pci_dev *pdev)
1162 {
1163         struct mthca_dev *mdev = pci_get_drvdata(pdev);
1164         u8 status;
1165         int p;
1166
1167         if (mdev) {
1168                 mthca_free_agents(mdev);
1169                 mthca_unregister_device(mdev);
1170
1171                 for (p = 1; p <= mdev->limits.num_ports; ++p)
1172                         mthca_CLOSE_IB(mdev, p, &status);
1173
1174                 mthca_cleanup_mcg_table(mdev);
1175                 mthca_cleanup_av_table(mdev);
1176                 mthca_cleanup_qp_table(mdev);
1177                 mthca_cleanup_srq_table(mdev);
1178                 mthca_cleanup_cq_table(mdev);
1179                 mthca_cmd_use_polling(mdev);
1180                 mthca_cleanup_eq_table(mdev);
1181
1182                 mthca_pd_free(mdev, &mdev->driver_pd);
1183
1184                 mthca_cleanup_mr_table(mdev);
1185                 mthca_cleanup_pd_table(mdev);
1186
1187                 iounmap(mdev->kar);
1188                 mthca_uar_free(mdev, &mdev->driver_uar);
1189                 mthca_cleanup_uar_table(mdev);
1190                 mthca_close_hca(mdev);
1191                 mthca_cmd_cleanup(mdev);
1192
1193                 if (mdev->mthca_flags & MTHCA_FLAG_MSI_X)
1194                         pci_disable_msix(pdev);
1195                 if (mdev->mthca_flags & MTHCA_FLAG_MSI)
1196                         pci_disable_msi(pdev);
1197
1198                 ib_dealloc_device(&mdev->ib_dev);
1199                 mthca_release_regions(pdev, mdev->mthca_flags &
1200                                       MTHCA_FLAG_DDR_HIDDEN);
1201                 pci_disable_device(pdev);
1202                 pci_set_drvdata(pdev, NULL);
1203         }
1204 }
1205
1206 static struct pci_device_id mthca_pci_table[] = {
1207         { PCI_DEVICE(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_TAVOR),
1208           .driver_data = TAVOR },
1209         { PCI_DEVICE(PCI_VENDOR_ID_TOPSPIN, PCI_DEVICE_ID_MELLANOX_TAVOR),
1210           .driver_data = TAVOR },
1211         { PCI_DEVICE(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT),
1212           .driver_data = ARBEL_COMPAT },
1213         { PCI_DEVICE(PCI_VENDOR_ID_TOPSPIN, PCI_DEVICE_ID_MELLANOX_ARBEL_COMPAT),
1214           .driver_data = ARBEL_COMPAT },
1215         { PCI_DEVICE(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_ARBEL),
1216           .driver_data = ARBEL_NATIVE },
1217         { PCI_DEVICE(PCI_VENDOR_ID_TOPSPIN, PCI_DEVICE_ID_MELLANOX_ARBEL),
1218           .driver_data = ARBEL_NATIVE },
1219         { PCI_DEVICE(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_SINAI),
1220           .driver_data = SINAI },
1221         { PCI_DEVICE(PCI_VENDOR_ID_TOPSPIN, PCI_DEVICE_ID_MELLANOX_SINAI),
1222           .driver_data = SINAI },
1223         { PCI_DEVICE(PCI_VENDOR_ID_MELLANOX, PCI_DEVICE_ID_MELLANOX_SINAI_OLD),
1224           .driver_data = SINAI },
1225         { PCI_DEVICE(PCI_VENDOR_ID_TOPSPIN, PCI_DEVICE_ID_MELLANOX_SINAI_OLD),
1226           .driver_data = SINAI },
1227         { 0, }
1228 };
1229
1230 MODULE_DEVICE_TABLE(pci, mthca_pci_table);
1231
1232 static struct pci_driver mthca_driver = {
1233         .name           = DRV_NAME,
1234         .id_table       = mthca_pci_table,
1235         .probe          = mthca_init_one,
1236         .remove         = __devexit_p(mthca_remove_one)
1237 };
1238
1239 static int __init mthca_init(void)
1240 {
1241         int ret;
1242
1243         ret = pci_register_driver(&mthca_driver);
1244         return ret < 0 ? ret : 0;
1245 }
1246
1247 static void __exit mthca_cleanup(void)
1248 {
1249         pci_unregister_driver(&mthca_driver);
1250 }
1251
1252 module_init(mthca_init);
1253 module_exit(mthca_cleanup);