The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/mthca/mthca_main.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 9db89bec306cb3193269f3450e49f8da


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.