2  * Copyright (c) 2004, 2005 Topspin Communications.  All rights reserved.
 
   3  * Copyright (c) 2005 Mellanox Technologies. All rights reserved.
 
   5  * This software is available to you under a choice of one of two
 
   6  * licenses.  You may choose to be licensed under the terms of the GNU
 
   7  * General Public License (GPL) Version 2, available from the file
 
   8  * COPYING in the main directory of this source tree, or the
 
   9  * OpenIB.org BSD license below:
 
  11  *     Redistribution and use in source and binary forms, with or
 
  12  *     without modification, are permitted provided that the following
 
  15  *      - Redistributions of source code must retain the above
 
  16  *        copyright notice, this list of conditions and the following
 
  19  *      - Redistributions in binary form must reproduce the above
 
  20  *        copyright notice, this list of conditions and the following
 
  21  *        disclaimer in the documentation and/or other materials
 
  22  *        provided with the distribution.
 
  24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 
  25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 
  26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 
  27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
 
  28  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 
  29  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 
  30  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 
  34 #include <linux/errno.h>
 
  35 #include <linux/interrupt.h>
 
  36 #include <linux/pci.h>
 
  38 #include "mthca_dev.h"
 
  39 #include "mthca_cmd.h"
 
  40 #include "mthca_config_reg.h"
 
  43         MTHCA_NUM_ASYNC_EQE = 0x80,
 
  44         MTHCA_NUM_CMD_EQE   = 0x80,
 
  45         MTHCA_NUM_SPARE_EQE = 0x80,
 
  46         MTHCA_EQ_ENTRY_SIZE = 0x20
 
  50  * Must be packed because start is 64 bits but only aligned to 32 bits.
 
  52 struct mthca_eq_context {
 
  55         __be32 logsize_usrpage;
 
  56         __be32 tavor_pd;        /* reserved for Arbel */
 
  59         __be32 arbel_pd;        /* lost_count for Tavor */
 
  62         __be32 consumer_index;
 
  63         __be32 producer_index;
 
  65 } __attribute__((packed));
 
  67 #define MTHCA_EQ_STATUS_OK          ( 0 << 28)
 
  68 #define MTHCA_EQ_STATUS_OVERFLOW    ( 9 << 28)
 
  69 #define MTHCA_EQ_STATUS_WRITE_FAIL  (10 << 28)
 
  70 #define MTHCA_EQ_OWNER_SW           ( 0 << 24)
 
  71 #define MTHCA_EQ_OWNER_HW           ( 1 << 24)
 
  72 #define MTHCA_EQ_FLAG_TR            ( 1 << 18)
 
  73 #define MTHCA_EQ_FLAG_OI            ( 1 << 17)
 
  74 #define MTHCA_EQ_STATE_ARMED        ( 1 <<  8)
 
  75 #define MTHCA_EQ_STATE_FIRED        ( 2 <<  8)
 
  76 #define MTHCA_EQ_STATE_ALWAYS_ARMED ( 3 <<  8)
 
  77 #define MTHCA_EQ_STATE_ARBEL        ( 8 <<  8)
 
  80         MTHCA_EVENT_TYPE_COMP               = 0x00,
 
  81         MTHCA_EVENT_TYPE_PATH_MIG           = 0x01,
 
  82         MTHCA_EVENT_TYPE_COMM_EST           = 0x02,
 
  83         MTHCA_EVENT_TYPE_SQ_DRAINED         = 0x03,
 
  84         MTHCA_EVENT_TYPE_SRQ_QP_LAST_WQE    = 0x13,
 
  85         MTHCA_EVENT_TYPE_SRQ_LIMIT          = 0x14,
 
  86         MTHCA_EVENT_TYPE_CQ_ERROR           = 0x04,
 
  87         MTHCA_EVENT_TYPE_WQ_CATAS_ERROR     = 0x05,
 
  88         MTHCA_EVENT_TYPE_EEC_CATAS_ERROR    = 0x06,
 
  89         MTHCA_EVENT_TYPE_PATH_MIG_FAILED    = 0x07,
 
  90         MTHCA_EVENT_TYPE_WQ_INVAL_REQ_ERROR = 0x10,
 
  91         MTHCA_EVENT_TYPE_WQ_ACCESS_ERROR    = 0x11,
 
  92         MTHCA_EVENT_TYPE_SRQ_CATAS_ERROR    = 0x12,
 
  93         MTHCA_EVENT_TYPE_LOCAL_CATAS_ERROR  = 0x08,
 
  94         MTHCA_EVENT_TYPE_PORT_CHANGE        = 0x09,
 
  95         MTHCA_EVENT_TYPE_EQ_OVERFLOW        = 0x0f,
 
  96         MTHCA_EVENT_TYPE_ECC_DETECT         = 0x0e,
 
  97         MTHCA_EVENT_TYPE_CMD                = 0x0a
 
 100 #define MTHCA_ASYNC_EVENT_MASK ((1ULL << MTHCA_EVENT_TYPE_PATH_MIG)           | \
 
 101                                 (1ULL << MTHCA_EVENT_TYPE_COMM_EST)           | \
 
 102                                 (1ULL << MTHCA_EVENT_TYPE_SQ_DRAINED)         | \
 
 103                                 (1ULL << MTHCA_EVENT_TYPE_CQ_ERROR)           | \
 
 104                                 (1ULL << MTHCA_EVENT_TYPE_WQ_CATAS_ERROR)     | \
 
 105                                 (1ULL << MTHCA_EVENT_TYPE_EEC_CATAS_ERROR)    | \
 
 106                                 (1ULL << MTHCA_EVENT_TYPE_PATH_MIG_FAILED)    | \
 
 107                                 (1ULL << MTHCA_EVENT_TYPE_WQ_INVAL_REQ_ERROR) | \
 
 108                                 (1ULL << MTHCA_EVENT_TYPE_WQ_ACCESS_ERROR)    | \
 
 109                                 (1ULL << MTHCA_EVENT_TYPE_LOCAL_CATAS_ERROR)  | \
 
 110                                 (1ULL << MTHCA_EVENT_TYPE_PORT_CHANGE)        | \
 
 111                                 (1ULL << MTHCA_EVENT_TYPE_ECC_DETECT))
 
 112 #define MTHCA_SRQ_EVENT_MASK   ((1ULL << MTHCA_EVENT_TYPE_SRQ_CATAS_ERROR)    | \
 
 113                                 (1ULL << MTHCA_EVENT_TYPE_SRQ_QP_LAST_WQE)    | \
 
 114                                 (1ULL << MTHCA_EVENT_TYPE_SRQ_LIMIT))
 
 115 #define MTHCA_CMD_EVENT_MASK    (1ULL << MTHCA_EVENT_TYPE_CMD)
 
 117 #define MTHCA_EQ_DB_INC_CI     (1 << 24)
 
 118 #define MTHCA_EQ_DB_REQ_NOT    (2 << 24)
 
 119 #define MTHCA_EQ_DB_DISARM_CQ  (3 << 24)
 
 120 #define MTHCA_EQ_DB_SET_CI     (4 << 24)
 
 121 #define MTHCA_EQ_DB_ALWAYS_ARM (5 << 24)
 
 132                 } __attribute__((packed)) comp;
 
 140                 } __attribute__((packed)) cmd;
 
 143                 } __attribute__((packed)) qp;
 
 146                 } __attribute__((packed)) srq;
 
 152                 } __attribute__((packed)) cq_err;
 
 156                 } __attribute__((packed)) port_change;
 
 160 } __attribute__((packed));
 
 162 #define  MTHCA_EQ_ENTRY_OWNER_SW      (0 << 7)
 
 163 #define  MTHCA_EQ_ENTRY_OWNER_HW      (1 << 7)
 
 165 static inline u64 async_mask(struct mthca_dev *dev)
 
 167         return dev->mthca_flags & MTHCA_FLAG_SRQ ?
 
 168                 MTHCA_ASYNC_EVENT_MASK | MTHCA_SRQ_EVENT_MASK :
 
 169                 MTHCA_ASYNC_EVENT_MASK;
 
 172 static inline void tavor_set_eq_ci(struct mthca_dev *dev, struct mthca_eq *eq, u32 ci)
 
 175          * This barrier makes sure that all updates to ownership bits
 
 176          * done by set_eqe_hw() hit memory before the consumer index
 
 177          * is updated.  set_eq_ci() allows the HCA to possibly write
 
 178          * more EQ entries, and we want to avoid the exceedingly
 
 179          * unlikely possibility of the HCA writing an entry and then
 
 180          * having set_eqe_hw() overwrite the owner field.
 
 183         mthca_write64(MTHCA_EQ_DB_SET_CI | eq->eqn, ci & (eq->nent - 1),
 
 184                       dev->kar + MTHCA_EQ_DOORBELL,
 
 185                       MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 
 188 static inline void arbel_set_eq_ci(struct mthca_dev *dev, struct mthca_eq *eq, u32 ci)
 
 190         /* See comment in tavor_set_eq_ci() above. */
 
 192         __raw_writel((__force u32) cpu_to_be32(ci),
 
 193                      dev->eq_regs.arbel.eq_set_ci_base + eq->eqn * 8);
 
 194         /* We still want ordering, just not swabbing, so add a barrier */
 
 198 static inline void set_eq_ci(struct mthca_dev *dev, struct mthca_eq *eq, u32 ci)
 
 200         if (mthca_is_memfree(dev))
 
 201                 arbel_set_eq_ci(dev, eq, ci);
 
 203                 tavor_set_eq_ci(dev, eq, ci);
 
 206 static inline void tavor_eq_req_not(struct mthca_dev *dev, int eqn)
 
 208         mthca_write64(MTHCA_EQ_DB_REQ_NOT | eqn, 0,
 
 209                       dev->kar + MTHCA_EQ_DOORBELL,
 
 210                       MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 
 213 static inline void arbel_eq_req_not(struct mthca_dev *dev, u32 eqn_mask)
 
 215         writel(eqn_mask, dev->eq_regs.arbel.eq_arm);
 
 218 static inline void disarm_cq(struct mthca_dev *dev, int eqn, int cqn)
 
 220         if (!mthca_is_memfree(dev)) {
 
 221                 mthca_write64(MTHCA_EQ_DB_DISARM_CQ | eqn, cqn,
 
 222                               dev->kar + MTHCA_EQ_DOORBELL,
 
 223                               MTHCA_GET_DOORBELL_LOCK(&dev->doorbell_lock));
 
 227 static inline struct mthca_eqe *get_eqe(struct mthca_eq *eq, u32 entry)
 
 229         unsigned long off = (entry & (eq->nent - 1)) * MTHCA_EQ_ENTRY_SIZE;
 
 230         return eq->page_list[off / PAGE_SIZE].buf + off % PAGE_SIZE;
 
 233 static inline struct mthca_eqe *next_eqe_sw(struct mthca_eq *eq)
 
 235         struct mthca_eqe *eqe;
 
 236         eqe = get_eqe(eq, eq->cons_index);
 
 237         return (MTHCA_EQ_ENTRY_OWNER_HW & eqe->owner) ? NULL : eqe;
 
 240 static inline void set_eqe_hw(struct mthca_eqe *eqe)
 
 242         eqe->owner =  MTHCA_EQ_ENTRY_OWNER_HW;
 
 245 static void port_change(struct mthca_dev *dev, int port, int active)
 
 247         struct ib_event record;
 
 249         mthca_dbg(dev, "Port change to %s for port %d\n",
 
 250                   active ? "active" : "down", port);
 
 252         record.device = &dev->ib_dev;
 
 253         record.event  = active ? IB_EVENT_PORT_ACTIVE : IB_EVENT_PORT_ERR;
 
 254         record.element.port_num = port;
 
 256         ib_dispatch_event(&record);
 
 259 static int mthca_eq_int(struct mthca_dev *dev, struct mthca_eq *eq)
 
 261         struct mthca_eqe *eqe;
 
 266         while ((eqe = next_eqe_sw(eq))) {
 
 268                  * Make sure we read EQ entry contents after we've
 
 269                  * checked the ownership bit.
 
 274                 case MTHCA_EVENT_TYPE_COMP:
 
 275                         disarm_cqn = be32_to_cpu(eqe->event.comp.cqn) & 0xffffff;
 
 276                         disarm_cq(dev, eq->eqn, disarm_cqn);
 
 277                         mthca_cq_completion(dev, disarm_cqn);
 
 280                 case MTHCA_EVENT_TYPE_PATH_MIG:
 
 281                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 285                 case MTHCA_EVENT_TYPE_COMM_EST:
 
 286                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 290                 case MTHCA_EVENT_TYPE_SQ_DRAINED:
 
 291                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 292                                        IB_EVENT_SQ_DRAINED);
 
 295                 case MTHCA_EVENT_TYPE_SRQ_QP_LAST_WQE:
 
 296                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 297                                        IB_EVENT_QP_LAST_WQE_REACHED);
 
 300                 case MTHCA_EVENT_TYPE_SRQ_LIMIT:
 
 301                         mthca_srq_event(dev, be32_to_cpu(eqe->event.srq.srqn) & 0xffffff,
 
 302                                         IB_EVENT_SRQ_LIMIT_REACHED);
 
 305                 case MTHCA_EVENT_TYPE_WQ_CATAS_ERROR:
 
 306                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 310                 case MTHCA_EVENT_TYPE_PATH_MIG_FAILED:
 
 311                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 312                                        IB_EVENT_PATH_MIG_ERR);
 
 315                 case MTHCA_EVENT_TYPE_WQ_INVAL_REQ_ERROR:
 
 316                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 317                                        IB_EVENT_QP_REQ_ERR);
 
 320                 case MTHCA_EVENT_TYPE_WQ_ACCESS_ERROR:
 
 321                         mthca_qp_event(dev, be32_to_cpu(eqe->event.qp.qpn) & 0xffffff,
 
 322                                        IB_EVENT_QP_ACCESS_ERR);
 
 325                 case MTHCA_EVENT_TYPE_CMD:
 
 327                                         be16_to_cpu(eqe->event.cmd.token),
 
 328                                         eqe->event.cmd.status,
 
 329                                         be64_to_cpu(eqe->event.cmd.out_param));
 
 332                 case MTHCA_EVENT_TYPE_PORT_CHANGE:
 
 334                                     (be32_to_cpu(eqe->event.port_change.port) >> 28) & 3,
 
 335                                     eqe->subtype == 0x4);
 
 338                 case MTHCA_EVENT_TYPE_CQ_ERROR:
 
 339                         mthca_warn(dev, "CQ %s on CQN %06x\n",
 
 340                                    eqe->event.cq_err.syndrome == 1 ?
 
 341                                    "overrun" : "access violation",
 
 342                                    be32_to_cpu(eqe->event.cq_err.cqn) & 0xffffff);
 
 343                         mthca_cq_event(dev, be32_to_cpu(eqe->event.cq_err.cqn),
 
 347                 case MTHCA_EVENT_TYPE_EQ_OVERFLOW:
 
 348                         mthca_warn(dev, "EQ overrun on EQN %d\n", eq->eqn);
 
 351                 case MTHCA_EVENT_TYPE_EEC_CATAS_ERROR:
 
 352                 case MTHCA_EVENT_TYPE_SRQ_CATAS_ERROR:
 
 353                 case MTHCA_EVENT_TYPE_LOCAL_CATAS_ERROR:
 
 354                 case MTHCA_EVENT_TYPE_ECC_DETECT:
 
 356                         mthca_warn(dev, "Unhandled event %02x(%02x) on EQ %d\n",
 
 357                                    eqe->type, eqe->subtype, eq->eqn);
 
 367                  * The HCA will think the queue has overflowed if we
 
 368                  * don't tell it we've been processing events.  We
 
 369                  * create our EQs with MTHCA_NUM_SPARE_EQE extra
 
 370                  * entries, so we must update our consumer index at
 
 373                 if (unlikely(set_ci >= MTHCA_NUM_SPARE_EQE)) {
 
 375                          * Conditional on hca_type is OK here because
 
 376                          * this is a rare case, not the fast path.
 
 378                         set_eq_ci(dev, eq, eq->cons_index);
 
 384          * Rely on caller to set consumer index so that we don't have
 
 385          * to test hca_type in our interrupt handling fast path.
 
 390 static irqreturn_t mthca_tavor_interrupt(int irq, void *dev_ptr)
 
 392         struct mthca_dev *dev = dev_ptr;
 
 396         if (dev->eq_table.clr_mask)
 
 397                 writel(dev->eq_table.clr_mask, dev->eq_table.clr_int);
 
 399         ecr = readl(dev->eq_regs.tavor.ecr_base + 4);
 
 403         writel(ecr, dev->eq_regs.tavor.ecr_base +
 
 404                MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
 
 406         for (i = 0; i < MTHCA_NUM_EQ; ++i)
 
 407                 if (ecr & dev->eq_table.eq[i].eqn_mask) {
 
 408                         if (mthca_eq_int(dev, &dev->eq_table.eq[i]))
 
 409                                 tavor_set_eq_ci(dev, &dev->eq_table.eq[i],
 
 410                                                 dev->eq_table.eq[i].cons_index);
 
 411                         tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn);
 
 417 static irqreturn_t mthca_tavor_msi_x_interrupt(int irq, void *eq_ptr)
 
 419         struct mthca_eq  *eq  = eq_ptr;
 
 420         struct mthca_dev *dev = eq->dev;
 
 422         mthca_eq_int(dev, eq);
 
 423         tavor_set_eq_ci(dev, eq, eq->cons_index);
 
 424         tavor_eq_req_not(dev, eq->eqn);
 
 426         /* MSI-X vectors always belong to us */
 
 430 static irqreturn_t mthca_arbel_interrupt(int irq, void *dev_ptr)
 
 432         struct mthca_dev *dev = dev_ptr;
 
 436         if (dev->eq_table.clr_mask)
 
 437                 writel(dev->eq_table.clr_mask, dev->eq_table.clr_int);
 
 439         for (i = 0; i < MTHCA_NUM_EQ; ++i)
 
 440                 if (mthca_eq_int(dev, &dev->eq_table.eq[i])) {
 
 442                         arbel_set_eq_ci(dev, &dev->eq_table.eq[i],
 
 443                                         dev->eq_table.eq[i].cons_index);
 
 446         arbel_eq_req_not(dev, dev->eq_table.arm_mask);
 
 448         return IRQ_RETVAL(work);
 
 451 static irqreturn_t mthca_arbel_msi_x_interrupt(int irq, void *eq_ptr)
 
 453         struct mthca_eq  *eq  = eq_ptr;
 
 454         struct mthca_dev *dev = eq->dev;
 
 456         mthca_eq_int(dev, eq);
 
 457         arbel_set_eq_ci(dev, eq, eq->cons_index);
 
 458         arbel_eq_req_not(dev, eq->eqn_mask);
 
 460         /* MSI-X vectors always belong to us */
 
 464 static int mthca_create_eq(struct mthca_dev *dev,
 
 470         u64 *dma_list = NULL;
 
 472         struct mthca_mailbox *mailbox;
 
 473         struct mthca_eq_context *eq_context;
 
 479         eq->nent = roundup_pow_of_two(max(nent, 2));
 
 480         npages = ALIGN(eq->nent * MTHCA_EQ_ENTRY_SIZE, PAGE_SIZE) / PAGE_SIZE;
 
 482         eq->page_list = kmalloc(npages * sizeof *eq->page_list,
 
 487         for (i = 0; i < npages; ++i)
 
 488                 eq->page_list[i].buf = NULL;
 
 490         dma_list = kmalloc(npages * sizeof *dma_list, GFP_KERNEL);
 
 494         mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
 
 497         eq_context = mailbox->buf;
 
 499         for (i = 0; i < npages; ++i) {
 
 500                 eq->page_list[i].buf = dma_alloc_coherent(&dev->pdev->dev,
 
 501                                                           PAGE_SIZE, &t, GFP_KERNEL);
 
 502                 if (!eq->page_list[i].buf)
 
 503                         goto err_out_free_pages;
 
 506                 pci_unmap_addr_set(&eq->page_list[i], mapping, t);
 
 508                 clear_page(eq->page_list[i].buf);
 
 511         for (i = 0; i < eq->nent; ++i)
 
 512                 set_eqe_hw(get_eqe(eq, i));
 
 514         eq->eqn = mthca_alloc(&dev->eq_table.alloc);
 
 516                 goto err_out_free_pages;
 
 518         err = mthca_mr_alloc_phys(dev, dev->driver_pd.pd_num,
 
 519                                   dma_list, PAGE_SHIFT, npages,
 
 520                                   0, npages * PAGE_SIZE,
 
 521                                   MTHCA_MPT_FLAG_LOCAL_WRITE |
 
 522                                   MTHCA_MPT_FLAG_LOCAL_READ,
 
 525                 goto err_out_free_eq;
 
 527         memset(eq_context, 0, sizeof *eq_context);
 
 528         eq_context->flags           = cpu_to_be32(MTHCA_EQ_STATUS_OK   |
 
 530                                                   MTHCA_EQ_STATE_ARMED |
 
 532         if (mthca_is_memfree(dev))
 
 533                 eq_context->flags  |= cpu_to_be32(MTHCA_EQ_STATE_ARBEL);
 
 535         eq_context->logsize_usrpage = cpu_to_be32((ffs(eq->nent) - 1) << 24);
 
 536         if (mthca_is_memfree(dev)) {
 
 537                 eq_context->arbel_pd = cpu_to_be32(dev->driver_pd.pd_num);
 
 539                 eq_context->logsize_usrpage |= cpu_to_be32(dev->driver_uar.index);
 
 540                 eq_context->tavor_pd         = cpu_to_be32(dev->driver_pd.pd_num);
 
 542         eq_context->intr            = intr;
 
 543         eq_context->lkey            = cpu_to_be32(eq->mr.ibmr.lkey);
 
 545         err = mthca_SW2HW_EQ(dev, mailbox, eq->eqn, &status);
 
 547                 mthca_warn(dev, "SW2HW_EQ failed (%d)\n", err);
 
 548                 goto err_out_free_mr;
 
 551                 mthca_warn(dev, "SW2HW_EQ returned status 0x%02x\n",
 
 554                 goto err_out_free_mr;
 
 558         mthca_free_mailbox(dev, mailbox);
 
 560         eq->eqn_mask   = swab32(1 << eq->eqn);
 
 563         dev->eq_table.arm_mask |= eq->eqn_mask;
 
 565         mthca_dbg(dev, "Allocated EQ %d with %d entries\n",
 
 571         mthca_free_mr(dev, &eq->mr);
 
 574         mthca_free(&dev->eq_table.alloc, eq->eqn);
 
 577         for (i = 0; i < npages; ++i)
 
 578                 if (eq->page_list[i].buf)
 
 579                         dma_free_coherent(&dev->pdev->dev, PAGE_SIZE,
 
 580                                           eq->page_list[i].buf,
 
 581                                           pci_unmap_addr(&eq->page_list[i],
 
 584         mthca_free_mailbox(dev, mailbox);
 
 587         kfree(eq->page_list);
 
 594 static void mthca_free_eq(struct mthca_dev *dev,
 
 597         struct mthca_mailbox *mailbox;
 
 600         int npages = (eq->nent * MTHCA_EQ_ENTRY_SIZE + PAGE_SIZE - 1) /
 
 604         mailbox = mthca_alloc_mailbox(dev, GFP_KERNEL);
 
 608         err = mthca_HW2SW_EQ(dev, mailbox, eq->eqn, &status);
 
 610                 mthca_warn(dev, "HW2SW_EQ failed (%d)\n", err);
 
 612                 mthca_warn(dev, "HW2SW_EQ returned status 0x%02x\n", status);
 
 614         dev->eq_table.arm_mask &= ~eq->eqn_mask;
 
 617                 mthca_dbg(dev, "Dumping EQ context %02x:\n", eq->eqn);
 
 618                 for (i = 0; i < sizeof (struct mthca_eq_context) / 4; ++i) {
 
 620                                 printk("[%02x] ", i * 4);
 
 621                         printk(" %08x", be32_to_cpup(mailbox->buf + i * 4));
 
 622                         if ((i + 1) % 4 == 0)
 
 627         mthca_free_mr(dev, &eq->mr);
 
 628         for (i = 0; i < npages; ++i)
 
 629                 pci_free_consistent(dev->pdev, PAGE_SIZE,
 
 630                                     eq->page_list[i].buf,
 
 631                                     pci_unmap_addr(&eq->page_list[i], mapping));
 
 633         kfree(eq->page_list);
 
 634         mthca_free_mailbox(dev, mailbox);
 
 637 static void mthca_free_irqs(struct mthca_dev *dev)
 
 641         if (dev->eq_table.have_irq)
 
 642                 free_irq(dev->pdev->irq, dev);
 
 643         for (i = 0; i < MTHCA_NUM_EQ; ++i)
 
 644                 if (dev->eq_table.eq[i].have_irq)
 
 645                         free_irq(dev->eq_table.eq[i].msi_x_vector,
 
 646                                  dev->eq_table.eq + i);
 
 649 static int mthca_map_reg(struct mthca_dev *dev,
 
 650                          unsigned long offset, unsigned long size,
 
 653         unsigned long base = pci_resource_start(dev->pdev, 0);
 
 655         *map = ioremap(base + offset, size);
 
 662 static int mthca_map_eq_regs(struct mthca_dev *dev)
 
 664         if (mthca_is_memfree(dev)) {
 
 666                  * We assume that the EQ arm and EQ set CI registers
 
 667                  * fall within the first BAR.  We can't trust the
 
 668                  * values firmware gives us, since those addresses are
 
 669                  * valid on the HCA's side of the PCI bus but not
 
 670                  * necessarily the host side.
 
 672                 if (mthca_map_reg(dev, (pci_resource_len(dev->pdev, 0) - 1) &
 
 673                                   dev->fw.arbel.clr_int_base, MTHCA_CLR_INT_SIZE,
 
 675                         mthca_err(dev, "Couldn't map interrupt clear register, "
 
 681                  * Add 4 because we limit ourselves to EQs 0 ... 31,
 
 682                  * so we only need the low word of the register.
 
 684                 if (mthca_map_reg(dev, ((pci_resource_len(dev->pdev, 0) - 1) &
 
 685                                         dev->fw.arbel.eq_arm_base) + 4, 4,
 
 686                                   &dev->eq_regs.arbel.eq_arm)) {
 
 687                         mthca_err(dev, "Couldn't map EQ arm register, aborting.\n");
 
 688                         iounmap(dev->clr_base);
 
 692                 if (mthca_map_reg(dev, (pci_resource_len(dev->pdev, 0) - 1) &
 
 693                                   dev->fw.arbel.eq_set_ci_base,
 
 694                                   MTHCA_EQ_SET_CI_SIZE,
 
 695                                   &dev->eq_regs.arbel.eq_set_ci_base)) {
 
 696                         mthca_err(dev, "Couldn't map EQ CI register, aborting.\n");
 
 697                         iounmap(dev->eq_regs.arbel.eq_arm);
 
 698                         iounmap(dev->clr_base);
 
 702                 if (mthca_map_reg(dev, MTHCA_CLR_INT_BASE, MTHCA_CLR_INT_SIZE,
 
 704                         mthca_err(dev, "Couldn't map interrupt clear register, "
 
 709                 if (mthca_map_reg(dev, MTHCA_ECR_BASE,
 
 710                                   MTHCA_ECR_SIZE + MTHCA_ECR_CLR_SIZE,
 
 711                                   &dev->eq_regs.tavor.ecr_base)) {
 
 712                         mthca_err(dev, "Couldn't map ecr register, "
 
 714                         iounmap(dev->clr_base);
 
 723 static void mthca_unmap_eq_regs(struct mthca_dev *dev)
 
 725         if (mthca_is_memfree(dev)) {
 
 726                 iounmap(dev->eq_regs.arbel.eq_set_ci_base);
 
 727                 iounmap(dev->eq_regs.arbel.eq_arm);
 
 728                 iounmap(dev->clr_base);
 
 730                 iounmap(dev->eq_regs.tavor.ecr_base);
 
 731                 iounmap(dev->clr_base);
 
 735 int mthca_map_eq_icm(struct mthca_dev *dev, u64 icm_virt)
 
 741          * We assume that mapping one page is enough for the whole EQ
 
 742          * context table.  This is fine with all current HCAs, because
 
 743          * we only use 32 EQs and each EQ uses 32 bytes of context
 
 744          * memory, or 1 KB total.
 
 746         dev->eq_table.icm_virt = icm_virt;
 
 747         dev->eq_table.icm_page = alloc_page(GFP_HIGHUSER);
 
 748         if (!dev->eq_table.icm_page)
 
 750         dev->eq_table.icm_dma  = pci_map_page(dev->pdev, dev->eq_table.icm_page, 0,
 
 751                                               PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
 
 752         if (pci_dma_mapping_error(dev->pdev, dev->eq_table.icm_dma)) {
 
 753                 __free_page(dev->eq_table.icm_page);
 
 757         ret = mthca_MAP_ICM_page(dev, dev->eq_table.icm_dma, icm_virt, &status);
 
 761                 pci_unmap_page(dev->pdev, dev->eq_table.icm_dma, PAGE_SIZE,
 
 762                                PCI_DMA_BIDIRECTIONAL);
 
 763                 __free_page(dev->eq_table.icm_page);
 
 769 void mthca_unmap_eq_icm(struct mthca_dev *dev)
 
 773         mthca_UNMAP_ICM(dev, dev->eq_table.icm_virt, 1, &status);
 
 774         pci_unmap_page(dev->pdev, dev->eq_table.icm_dma, PAGE_SIZE,
 
 775                        PCI_DMA_BIDIRECTIONAL);
 
 776         __free_page(dev->eq_table.icm_page);
 
 779 int mthca_init_eq_table(struct mthca_dev *dev)
 
 786         err = mthca_alloc_init(&dev->eq_table.alloc,
 
 788                                dev->limits.num_eqs - 1,
 
 789                                dev->limits.reserved_eqs);
 
 793         err = mthca_map_eq_regs(dev);
 
 797         if (dev->mthca_flags & MTHCA_FLAG_MSI_X) {
 
 798                 dev->eq_table.clr_mask = 0;
 
 800                 dev->eq_table.clr_mask =
 
 801                         swab32(1 << (dev->eq_table.inta_pin & 31));
 
 802                 dev->eq_table.clr_int  = dev->clr_base +
 
 803                         (dev->eq_table.inta_pin < 32 ? 4 : 0);
 
 806         dev->eq_table.arm_mask = 0;
 
 808         intr = dev->eq_table.inta_pin;
 
 810         err = mthca_create_eq(dev, dev->limits.num_cqs + MTHCA_NUM_SPARE_EQE,
 
 811                               (dev->mthca_flags & MTHCA_FLAG_MSI_X) ? 128 : intr,
 
 812                               &dev->eq_table.eq[MTHCA_EQ_COMP]);
 
 816         err = mthca_create_eq(dev, MTHCA_NUM_ASYNC_EQE + MTHCA_NUM_SPARE_EQE,
 
 817                               (dev->mthca_flags & MTHCA_FLAG_MSI_X) ? 129 : intr,
 
 818                               &dev->eq_table.eq[MTHCA_EQ_ASYNC]);
 
 822         err = mthca_create_eq(dev, MTHCA_NUM_CMD_EQE + MTHCA_NUM_SPARE_EQE,
 
 823                               (dev->mthca_flags & MTHCA_FLAG_MSI_X) ? 130 : intr,
 
 824                               &dev->eq_table.eq[MTHCA_EQ_CMD]);
 
 828         if (dev->mthca_flags & MTHCA_FLAG_MSI_X) {
 
 829                 static const char *eq_name[] = {
 
 830                         [MTHCA_EQ_COMP]  = DRV_NAME " (comp)",
 
 831                         [MTHCA_EQ_ASYNC] = DRV_NAME " (async)",
 
 832                         [MTHCA_EQ_CMD]   = DRV_NAME " (cmd)"
 
 835                 for (i = 0; i < MTHCA_NUM_EQ; ++i) {
 
 836                         err = request_irq(dev->eq_table.eq[i].msi_x_vector,
 
 837                                           mthca_is_memfree(dev) ?
 
 838                                           mthca_arbel_msi_x_interrupt :
 
 839                                           mthca_tavor_msi_x_interrupt,
 
 840                                           0, eq_name[i], dev->eq_table.eq + i);
 
 843                         dev->eq_table.eq[i].have_irq = 1;
 
 846                 err = request_irq(dev->pdev->irq,
 
 847                                   mthca_is_memfree(dev) ?
 
 848                                   mthca_arbel_interrupt :
 
 849                                   mthca_tavor_interrupt,
 
 850                                   IRQF_SHARED, DRV_NAME, dev);
 
 853                 dev->eq_table.have_irq = 1;
 
 856         err = mthca_MAP_EQ(dev, async_mask(dev),
 
 857                            0, dev->eq_table.eq[MTHCA_EQ_ASYNC].eqn, &status);
 
 859                 mthca_warn(dev, "MAP_EQ for async EQ %d failed (%d)\n",
 
 860                            dev->eq_table.eq[MTHCA_EQ_ASYNC].eqn, err);
 
 862                 mthca_warn(dev, "MAP_EQ for async EQ %d returned status 0x%02x\n",
 
 863                            dev->eq_table.eq[MTHCA_EQ_ASYNC].eqn, status);
 
 865         err = mthca_MAP_EQ(dev, MTHCA_CMD_EVENT_MASK,
 
 866                            0, dev->eq_table.eq[MTHCA_EQ_CMD].eqn, &status);
 
 868                 mthca_warn(dev, "MAP_EQ for cmd EQ %d failed (%d)\n",
 
 869                            dev->eq_table.eq[MTHCA_EQ_CMD].eqn, err);
 
 871                 mthca_warn(dev, "MAP_EQ for cmd EQ %d returned status 0x%02x\n",
 
 872                            dev->eq_table.eq[MTHCA_EQ_CMD].eqn, status);
 
 874         for (i = 0; i < MTHCA_NUM_EQ; ++i)
 
 875                 if (mthca_is_memfree(dev))
 
 876                         arbel_eq_req_not(dev, dev->eq_table.eq[i].eqn_mask);
 
 878                         tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn);
 
 883         mthca_free_irqs(dev);
 
 884         mthca_free_eq(dev, &dev->eq_table.eq[MTHCA_EQ_CMD]);
 
 887         mthca_free_eq(dev, &dev->eq_table.eq[MTHCA_EQ_ASYNC]);
 
 890         mthca_free_eq(dev, &dev->eq_table.eq[MTHCA_EQ_COMP]);
 
 893         mthca_unmap_eq_regs(dev);
 
 896         mthca_alloc_cleanup(&dev->eq_table.alloc);
 
 900 void mthca_cleanup_eq_table(struct mthca_dev *dev)
 
 905         mthca_free_irqs(dev);
 
 907         mthca_MAP_EQ(dev, async_mask(dev),
 
 908                      1, dev->eq_table.eq[MTHCA_EQ_ASYNC].eqn, &status);
 
 909         mthca_MAP_EQ(dev, MTHCA_CMD_EVENT_MASK,
 
 910                      1, dev->eq_table.eq[MTHCA_EQ_CMD].eqn, &status);
 
 912         for (i = 0; i < MTHCA_NUM_EQ; ++i)
 
 913                 mthca_free_eq(dev, &dev->eq_table.eq[i]);
 
 915         mthca_unmap_eq_regs(dev);
 
 917         mthca_alloc_cleanup(&dev->eq_table.alloc);