linux/drivers/infiniband/hw/ipath/ipath_qp.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2006, 2007, 2008 QLogic Corporation. All rights reserved.
   3 * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved.
   4 *
   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:
  10 *
  11 *     Redistribution and use in source and binary forms, with or
  12 *     without modification, are permitted provided that the following
  13 *     conditions are met:
  14 *
  15 *      - Redistributions of source code must retain the above
  16 *        copyright notice, this list of conditions and the following
  17 *        disclaimer.
  18 *
  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.
  23 *
  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
  31 * SOFTWARE.
  32 */
  33
  34#include <linux/err.h>
  35#include <linux/sched.h>
  36#include <linux/vmalloc.h>
  37
  38#include "ipath_verbs.h"
  39#include "ipath_kernel.h"
  40
  41#define BITS_PER_PAGE           (PAGE_SIZE*BITS_PER_BYTE)
  42#define BITS_PER_PAGE_MASK      (BITS_PER_PAGE-1)
  43#define mk_qpn(qpt, map, off)   (((map) - (qpt)->map) * BITS_PER_PAGE + \
  44                                 (off))
  45#define find_next_offset(map, off) find_next_zero_bit((map)->page, \
  46                                                      BITS_PER_PAGE, off)
  47
  48/*
  49 * Convert the AETH credit code into the number of credits.
  50 */
  51static u32 credit_table[31] = {
  52        0,                      /* 0 */
  53        1,                      /* 1 */
  54        2,                      /* 2 */
  55        3,                      /* 3 */
  56        4,                      /* 4 */
  57        6,                      /* 5 */
  58        8,                      /* 6 */
  59        12,                     /* 7 */
  60        16,                     /* 8 */
  61        24,                     /* 9 */
  62        32,                     /* A */
  63        48,                     /* B */
  64        64,                     /* C */
  65        96,                     /* D */
  66        128,                    /* E */
  67        192,                    /* F */
  68        256,                    /* 10 */
  69        384,                    /* 11 */
  70        512,                    /* 12 */
  71        768,                    /* 13 */
  72        1024,                   /* 14 */
  73        1536,                   /* 15 */
  74        2048,                   /* 16 */
  75        3072,                   /* 17 */
  76        4096,                   /* 18 */
  77        6144,                   /* 19 */
  78        8192,                   /* 1A */
  79        12288,                  /* 1B */
  80        16384,                  /* 1C */
  81        24576,                  /* 1D */
  82        32768                   /* 1E */
  83};
  84
  85
  86static void get_map_page(struct ipath_qp_table *qpt, struct qpn_map *map)
  87{
  88        unsigned long page = get_zeroed_page(GFP_KERNEL);
  89        unsigned long flags;
  90
  91        /*
  92         * Free the page if someone raced with us installing it.
  93         */
  94
  95        spin_lock_irqsave(&qpt->lock, flags);
  96        if (map->page)
  97                free_page(page);
  98        else
  99                map->page = (void *)page;
 100        spin_unlock_irqrestore(&qpt->lock, flags);
 101}
 102
 103
 104static int alloc_qpn(struct ipath_qp_table *qpt, enum ib_qp_type type)
 105{
 106        u32 i, offset, max_scan, qpn;
 107        struct qpn_map *map;
 108        u32 ret = -1;
 109
 110        if (type == IB_QPT_SMI)
 111                ret = 0;
 112        else if (type == IB_QPT_GSI)
 113                ret = 1;
 114
 115        if (ret != -1) {
 116                map = &qpt->map[0];
 117                if (unlikely(!map->page)) {
 118                        get_map_page(qpt, map);
 119                        if (unlikely(!map->page)) {
 120                                ret = -ENOMEM;
 121                                goto bail;
 122                        }
 123                }
 124                if (!test_and_set_bit(ret, map->page))
 125                        atomic_dec(&map->n_free);
 126                else
 127                        ret = -EBUSY;
 128                goto bail;
 129        }
 130
 131        qpn = qpt->last + 1;
 132        if (qpn >= QPN_MAX)
 133                qpn = 2;
 134        offset = qpn & BITS_PER_PAGE_MASK;
 135        map = &qpt->map[qpn / BITS_PER_PAGE];
 136        max_scan = qpt->nmaps - !offset;
 137        for (i = 0;;) {
 138                if (unlikely(!map->page)) {
 139                        get_map_page(qpt, map);
 140                        if (unlikely(!map->page))
 141                                break;
 142                }
 143                if (likely(atomic_read(&map->n_free))) {
 144                        do {
 145                                if (!test_and_set_bit(offset, map->page)) {
 146                                        atomic_dec(&map->n_free);
 147                                        qpt->last = qpn;
 148                                        ret = qpn;
 149                                        goto bail;
 150                                }
 151                                offset = find_next_offset(map, offset);
 152                                qpn = mk_qpn(qpt, map, offset);
 153                                /*
 154                                 * This test differs from alloc_pidmap().
 155                                 * If find_next_offset() does find a zero
 156                                 * bit, we don't need to check for QPN
 157                                 * wrapping around past our starting QPN.
 158                                 * We just need to be sure we don't loop
 159                                 * forever.
 160                                 */
 161                        } while (offset < BITS_PER_PAGE && qpn < QPN_MAX);
 162                }
 163                /*
 164                 * In order to keep the number of pages allocated to a
 165                 * minimum, we scan the all existing pages before increasing
 166                 * the size of the bitmap table.
 167                 */
 168                if (++i > max_scan) {
 169                        if (qpt->nmaps == QPNMAP_ENTRIES)
 170                                break;
 171                        map = &qpt->map[qpt->nmaps++];
 172                        offset = 0;
 173                } else if (map < &qpt->map[qpt->nmaps]) {
 174                        ++map;
 175                        offset = 0;
 176                } else {
 177                        map = &qpt->map[0];
 178                        offset = 2;
 179                }
 180                qpn = mk_qpn(qpt, map, offset);
 181        }
 182
 183        ret = -ENOMEM;
 184
 185bail:
 186        return ret;
 187}
 188
 189static void free_qpn(struct ipath_qp_table *qpt, u32 qpn)
 190{
 191        struct qpn_map *map;
 192
 193        map = qpt->map + qpn / BITS_PER_PAGE;
 194        if (map->page)
 195                clear_bit(qpn & BITS_PER_PAGE_MASK, map->page);
 196        atomic_inc(&map->n_free);
 197}
 198
 199/**
 200 * ipath_alloc_qpn - allocate a QP number
 201 * @qpt: the QP table
 202 * @qp: the QP
 203 * @type: the QP type (IB_QPT_SMI and IB_QPT_GSI are special)
 204 *
 205 * Allocate the next available QPN and put the QP into the hash table.
 206 * The hash table holds a reference to the QP.
 207 */
 208static int ipath_alloc_qpn(struct ipath_qp_table *qpt, struct ipath_qp *qp,
 209                           enum ib_qp_type type)
 210{
 211        unsigned long flags;
 212        int ret;
 213
 214        ret = alloc_qpn(qpt, type);
 215        if (ret < 0)
 216                goto bail;
 217        qp->ibqp.qp_num = ret;
 218
 219        /* Add the QP to the hash table. */
 220        spin_lock_irqsave(&qpt->lock, flags);
 221
 222        ret %= qpt->max;
 223        qp->next = qpt->table[ret];
 224        qpt->table[ret] = qp;
 225        atomic_inc(&qp->refcount);
 226
 227        spin_unlock_irqrestore(&qpt->lock, flags);
 228        ret = 0;
 229
 230bail:
 231        return ret;
 232}
 233
 234/**
 235 * ipath_free_qp - remove a QP from the QP table
 236 * @qpt: the QP table
 237 * @qp: the QP to remove
 238 *
 239 * Remove the QP from the table so it can't be found asynchronously by
 240 * the receive interrupt routine.
 241 */
 242static void ipath_free_qp(struct ipath_qp_table *qpt, struct ipath_qp *qp)
 243{
 244        struct ipath_qp *q, **qpp;
 245        unsigned long flags;
 246
 247        spin_lock_irqsave(&qpt->lock, flags);
 248
 249        /* Remove QP from the hash table. */
 250        qpp = &qpt->table[qp->ibqp.qp_num % qpt->max];
 251        for (; (q = *qpp) != NULL; qpp = &q->next) {
 252                if (q == qp) {
 253                        *qpp = qp->next;
 254                        qp->next = NULL;
 255                        atomic_dec(&qp->refcount);
 256                        break;
 257                }
 258        }
 259
 260        spin_unlock_irqrestore(&qpt->lock, flags);
 261}
 262
 263/**
 264 * ipath_free_all_qps - check for QPs still in use
 265 * @qpt: the QP table to empty
 266 *
 267 * There should not be any QPs still in use.
 268 * Free memory for table.
 269 */
 270unsigned ipath_free_all_qps(struct ipath_qp_table *qpt)
 271{
 272        unsigned long flags;
 273        struct ipath_qp *qp;
 274        u32 n, qp_inuse = 0;
 275
 276        spin_lock_irqsave(&qpt->lock, flags);
 277        for (n = 0; n < qpt->max; n++) {
 278                qp = qpt->table[n];
 279                qpt->table[n] = NULL;
 280
 281                for (; qp; qp = qp->next)
 282                        qp_inuse++;
 283        }
 284        spin_unlock_irqrestore(&qpt->lock, flags);
 285
 286        for (n = 0; n < ARRAY_SIZE(qpt->map); n++)
 287                if (qpt->map[n].page)
 288                        free_page((unsigned long) qpt->map[n].page);
 289        return qp_inuse;
 290}
 291
 292/**
 293 * ipath_lookup_qpn - return the QP with the given QPN
 294 * @qpt: the QP table
 295 * @qpn: the QP number to look up
 296 *
 297 * The caller is responsible for decrementing the QP reference count
 298 * when done.
 299 */
 300struct ipath_qp *ipath_lookup_qpn(struct ipath_qp_table *qpt, u32 qpn)
 301{
 302        unsigned long flags;
 303        struct ipath_qp *qp;
 304
 305        spin_lock_irqsave(&qpt->lock, flags);
 306
 307        for (qp = qpt->table[qpn % qpt->max]; qp; qp = qp->next) {
 308                if (qp->ibqp.qp_num == qpn) {
 309                        atomic_inc(&qp->refcount);
 310                        break;
 311                }
 312        }
 313
 314        spin_unlock_irqrestore(&qpt->lock, flags);
 315        return qp;
 316}
 317
 318/**
 319 * ipath_reset_qp - initialize the QP state to the reset state
 320 * @qp: the QP to reset
 321 * @type: the QP type
 322 */
 323static void ipath_reset_qp(struct ipath_qp *qp, enum ib_qp_type type)
 324{
 325        qp->remote_qpn = 0;
 326        qp->qkey = 0;
 327        qp->qp_access_flags = 0;
 328        atomic_set(&qp->s_dma_busy, 0);
 329        qp->s_flags &= IPATH_S_SIGNAL_REQ_WR;
 330        qp->s_hdrwords = 0;
 331        qp->s_wqe = NULL;
 332        qp->s_pkt_delay = 0;
 333        qp->s_draining = 0;
 334        qp->s_psn = 0;
 335        qp->r_psn = 0;
 336        qp->r_msn = 0;
 337        if (type == IB_QPT_RC) {
 338                qp->s_state = IB_OPCODE_RC_SEND_LAST;
 339                qp->r_state = IB_OPCODE_RC_SEND_LAST;
 340        } else {
 341                qp->s_state = IB_OPCODE_UC_SEND_LAST;
 342                qp->r_state = IB_OPCODE_UC_SEND_LAST;
 343        }
 344        qp->s_ack_state = IB_OPCODE_RC_ACKNOWLEDGE;
 345        qp->r_nak_state = 0;
 346        qp->r_aflags = 0;
 347        qp->r_flags = 0;
 348        qp->s_rnr_timeout = 0;
 349        qp->s_head = 0;
 350        qp->s_tail = 0;
 351        qp->s_cur = 0;
 352        qp->s_last = 0;
 353        qp->s_ssn = 1;
 354        qp->s_lsn = 0;
 355        memset(qp->s_ack_queue, 0, sizeof(qp->s_ack_queue));
 356        qp->r_head_ack_queue = 0;
 357        qp->s_tail_ack_queue = 0;
 358        qp->s_num_rd_atomic = 0;
 359        if (qp->r_rq.wq) {
 360                qp->r_rq.wq->head = 0;
 361                qp->r_rq.wq->tail = 0;
 362        }
 363}
 364
 365/**
 366 * ipath_error_qp - put a QP into the error state
 367 * @qp: the QP to put into the error state
 368 * @err: the receive completion error to signal if a RWQE is active
 369 *
 370 * Flushes both send and receive work queues.
 371 * Returns true if last WQE event should be generated.
 372 * The QP s_lock should be held and interrupts disabled.
 373 * If we are already in error state, just return.
 374 */
 375
 376int ipath_error_qp(struct ipath_qp *qp, enum ib_wc_status err)
 377{
 378        struct ipath_ibdev *dev = to_idev(qp->ibqp.device);
 379        struct ib_wc wc;
 380        int ret = 0;
 381
 382        if (qp->state == IB_QPS_ERR)
 383                goto bail;
 384
 385        qp->state = IB_QPS_ERR;
 386
 387        spin_lock(&dev->pending_lock);
 388        if (!list_empty(&qp->timerwait))
 389                list_del_init(&qp->timerwait);
 390        if (!list_empty(&qp->piowait))
 391                list_del_init(&qp->piowait);
 392        spin_unlock(&dev->pending_lock);
 393
 394        /* Schedule the sending tasklet to drain the send work queue. */
 395        if (qp->s_last != qp->s_head)
 396                ipath_schedule_send(qp);
 397
 398        memset(&wc, 0, sizeof(wc));
 399        wc.qp = &qp->ibqp;
 400        wc.opcode = IB_WC_RECV;
 401
 402        if (test_and_clear_bit(IPATH_R_WRID_VALID, &qp->r_aflags)) {
 403                wc.wr_id = qp->r_wr_id;
 404                wc.status = err;
 405                ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1);
 406        }
 407        wc.status = IB_WC_WR_FLUSH_ERR;
 408
 409        if (qp->r_rq.wq) {
 410                struct ipath_rwq *wq;
 411                u32 head;
 412                u32 tail;
 413
 414                spin_lock(&qp->r_rq.lock);
 415
 416                /* sanity check pointers before trusting them */
 417                wq = qp->r_rq.wq;
 418                head = wq->head;
 419                if (head >= qp->r_rq.size)
 420                        head = 0;
 421                tail = wq->tail;
 422                if (tail >= qp->r_rq.size)
 423                        tail = 0;
 424                while (tail != head) {
 425                        wc.wr_id = get_rwqe_ptr(&qp->r_rq, tail)->wr_id;
 426                        if (++tail >= qp->r_rq.size)
 427                                tail = 0;
 428                        ipath_cq_enter(to_icq(qp->ibqp.recv_cq), &wc, 1);
 429                }
 430                wq->tail = tail;
 431
 432                spin_unlock(&qp->r_rq.lock);
 433        } else if (qp->ibqp.event_handler)
 434                ret = 1;
 435
 436bail:
 437        return ret;
 438}
 439
 440/**
 441 * ipath_modify_qp - modify the attributes of a queue pair
 442 * @ibqp: the queue pair who's attributes we're modifying
 443 * @attr: the new attributes
 444 * @attr_mask: the mask of attributes to modify
 445 * @udata: user data for ipathverbs.so
 446 *
 447 * Returns 0 on success, otherwise returns an errno.
 448 */
 449int ipath_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 450                    int attr_mask, struct ib_udata *udata)
 451{
 452        struct ipath_ibdev *dev = to_idev(ibqp->device);
 453        struct ipath_qp *qp = to_iqp(ibqp);
 454        enum ib_qp_state cur_state, new_state;
 455        int lastwqe = 0;
 456        int ret;
 457
 458        spin_lock_irq(&qp->s_lock);
 459
 460        cur_state = attr_mask & IB_QP_CUR_STATE ?
 461                attr->cur_qp_state : qp->state;
 462        new_state = attr_mask & IB_QP_STATE ? attr->qp_state : cur_state;
 463
 464        if (!ib_modify_qp_is_ok(cur_state, new_state, ibqp->qp_type,
 465                                attr_mask))
 466                goto inval;
 467
 468        if (attr_mask & IB_QP_AV) {
 469                if (attr->ah_attr.dlid == 0 ||
 470                    attr->ah_attr.dlid >= IPATH_MULTICAST_LID_BASE)
 471                        goto inval;
 472
 473                if ((attr->ah_attr.ah_flags & IB_AH_GRH) &&
 474                    (attr->ah_attr.grh.sgid_index > 1))
 475                        goto inval;
 476        }
 477
 478        if (attr_mask & IB_QP_PKEY_INDEX)
 479                if (attr->pkey_index >= ipath_get_npkeys(dev->dd))
 480                        goto inval;
 481
 482        if (attr_mask & IB_QP_MIN_RNR_TIMER)
 483                if (attr->min_rnr_timer > 31)
 484                        goto inval;
 485
 486        if (attr_mask & IB_QP_PORT)
 487                if (attr->port_num == 0 ||
 488                    attr->port_num > ibqp->device->phys_port_cnt)
 489                        goto inval;
 490
 491        /*
 492         * don't allow invalid Path MTU values or greater than 2048
 493         * unless we are configured for a 4KB MTU
 494         */
 495        if ((attr_mask & IB_QP_PATH_MTU) &&
 496                (ib_mtu_enum_to_int(attr->path_mtu) == -1 ||
 497                (attr->path_mtu > IB_MTU_2048 && !ipath_mtu4096)))
 498                goto inval;
 499
 500        if (attr_mask & IB_QP_PATH_MIG_STATE)
 501                if (attr->path_mig_state != IB_MIG_MIGRATED &&
 502                    attr->path_mig_state != IB_MIG_REARM)
 503                        goto inval;
 504
 505        if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC)
 506                if (attr->max_dest_rd_atomic > IPATH_MAX_RDMA_ATOMIC)
 507                        goto inval;
 508
 509        switch (new_state) {
 510        case IB_QPS_RESET:
 511                if (qp->state != IB_QPS_RESET) {
 512                        qp->state = IB_QPS_RESET;
 513                        spin_lock(&dev->pending_lock);
 514                        if (!list_empty(&qp->timerwait))
 515                                list_del_init(&qp->timerwait);
 516                        if (!list_empty(&qp->piowait))
 517                                list_del_init(&qp->piowait);
 518                        spin_unlock(&dev->pending_lock);
 519                        qp->s_flags &= ~IPATH_S_ANY_WAIT;
 520                        spin_unlock_irq(&qp->s_lock);
 521                        /* Stop the sending tasklet */
 522                        tasklet_kill(&qp->s_task);
 523                        wait_event(qp->wait_dma, !atomic_read(&qp->s_dma_busy));
 524                        spin_lock_irq(&qp->s_lock);
 525                }
 526                ipath_reset_qp(qp, ibqp->qp_type);
 527                break;
 528
 529        case IB_QPS_SQD:
 530                qp->s_draining = qp->s_last != qp->s_cur;
 531                qp->state = new_state;
 532                break;
 533
 534        case IB_QPS_SQE:
 535                if (qp->ibqp.qp_type == IB_QPT_RC)
 536                        goto inval;
 537                qp->state = new_state;
 538                break;
 539
 540        case IB_QPS_ERR:
 541                lastwqe = ipath_error_qp(qp, IB_WC_WR_FLUSH_ERR);
 542                break;
 543
 544        default:
 545                qp->state = new_state;
 546                break;
 547        }
 548
 549        if (attr_mask & IB_QP_PKEY_INDEX)
 550                qp->s_pkey_index = attr->pkey_index;
 551
 552        if (attr_mask & IB_QP_DEST_QPN)
 553                qp->remote_qpn = attr->dest_qp_num;
 554
 555        if (attr_mask & IB_QP_SQ_PSN) {
 556                qp->s_psn = qp->s_next_psn = attr->sq_psn;
 557                qp->s_last_psn = qp->s_next_psn - 1;
 558        }
 559
 560        if (attr_mask & IB_QP_RQ_PSN)
 561                qp->r_psn = attr->rq_psn;
 562
 563        if (attr_mask & IB_QP_ACCESS_FLAGS)
 564                qp->qp_access_flags = attr->qp_access_flags;
 565
 566        if (attr_mask & IB_QP_AV) {
 567                qp->remote_ah_attr = attr->ah_attr;
 568                qp->s_dmult = ipath_ib_rate_to_mult(attr->ah_attr.static_rate);
 569        }
 570
 571        if (attr_mask & IB_QP_PATH_MTU)
 572                qp->path_mtu = attr->path_mtu;
 573
 574        if (attr_mask & IB_QP_RETRY_CNT)
 575                qp->s_retry = qp->s_retry_cnt = attr->retry_cnt;
 576
 577        if (attr_mask & IB_QP_RNR_RETRY) {
 578                qp->s_rnr_retry = attr->rnr_retry;
 579                if (qp->s_rnr_retry > 7)
 580                        qp->s_rnr_retry = 7;
 581                qp->s_rnr_retry_cnt = qp->s_rnr_retry;
 582        }
 583
 584        if (attr_mask & IB_QP_MIN_RNR_TIMER)
 585                qp->r_min_rnr_timer = attr->min_rnr_timer;
 586
 587        if (attr_mask & IB_QP_TIMEOUT)
 588                qp->timeout = attr->timeout;
 589
 590        if (attr_mask & IB_QP_QKEY)
 591                qp->qkey = attr->qkey;
 592
 593        if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC)
 594                qp->r_max_rd_atomic = attr->max_dest_rd_atomic;
 595
 596        if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC)
 597                qp->s_max_rd_atomic = attr->max_rd_atomic;
 598
 599        spin_unlock_irq(&qp->s_lock);
 600
 601        if (lastwqe) {
 602                struct ib_event ev;
 603
 604                ev.device = qp->ibqp.device;
 605                ev.element.qp = &qp->ibqp;
 606                ev.event = IB_EVENT_QP_LAST_WQE_REACHED;
 607                qp->ibqp.event_handler(&ev, qp->ibqp.qp_context);
 608        }
 609        ret = 0;
 610        goto bail;
 611
 612inval:
 613        spin_unlock_irq(&qp->s_lock);
 614        ret = -EINVAL;
 615
 616bail:
 617        return ret;
 618}
 619
 620int ipath_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
 621                   int attr_mask, struct ib_qp_init_attr *init_attr)
 622{
 623        struct ipath_qp *qp = to_iqp(ibqp);
 624
 625        attr->qp_state = qp->state;
 626        attr->cur_qp_state = attr->qp_state;
 627        attr->path_mtu = qp->path_mtu;
 628        attr->path_mig_state = 0;
 629        attr->qkey = qp->qkey;
 630        attr->rq_psn = qp->r_psn;
 631        attr->sq_psn = qp->s_next_psn;
 632        attr->dest_qp_num = qp->remote_qpn;
 633        attr->qp_access_flags = qp->qp_access_flags;
 634        attr->cap.max_send_wr = qp->s_size - 1;
 635        attr->cap.max_recv_wr = qp->ibqp.srq ? 0 : qp->r_rq.size - 1;
 636        attr->cap.max_send_sge = qp->s_max_sge;
 637        attr->cap.max_recv_sge = qp->r_rq.max_sge;
 638        attr->cap.max_inline_data = 0;
 639        attr->ah_attr = qp->remote_ah_attr;
 640        memset(&attr->alt_ah_attr, 0, sizeof(attr->alt_ah_attr));
 641        attr->pkey_index = qp->s_pkey_index;
 642        attr->alt_pkey_index = 0;
 643        attr->en_sqd_async_notify = 0;
 644        attr->sq_draining = qp->s_draining;
 645        attr->max_rd_atomic = qp->s_max_rd_atomic;
 646        attr->max_dest_rd_atomic = qp->r_max_rd_atomic;
 647        attr->min_rnr_timer = qp->r_min_rnr_timer;
 648        attr->port_num = 1;
 649        attr->timeout = qp->timeout;
 650        attr->retry_cnt = qp->s_retry_cnt;
 651        attr->rnr_retry = qp->s_rnr_retry_cnt;
 652        attr->alt_port_num = 0;
 653        attr->alt_timeout = 0;
 654
 655        init_attr->event_handler = qp->ibqp.event_handler;
 656        init_attr->qp_context = qp->ibqp.qp_context;
 657        init_attr->send_cq = qp->ibqp.send_cq;
 658        init_attr->recv_cq = qp->ibqp.recv_cq;
 659        init_attr->srq = qp->ibqp.srq;
 660        init_attr->cap = attr->cap;
 661        if (qp->s_flags & IPATH_S_SIGNAL_REQ_WR)
 662                init_attr->sq_sig_type = IB_SIGNAL_REQ_WR;
 663        else
 664                init_attr->sq_sig_type = IB_SIGNAL_ALL_WR;
 665        init_attr->qp_type = qp->ibqp.qp_type;
 666        init_attr->port_num = 1;
 667        return 0;
 668}
 669
 670/**
 671 * ipath_compute_aeth - compute the AETH (syndrome + MSN)
 672 * @qp: the queue pair to compute the AETH for
 673 *
 674 * Returns the AETH.
 675 */
 676__be32 ipath_compute_aeth(struct ipath_qp *qp)
 677{
 678        u32 aeth = qp->r_msn & IPATH_MSN_MASK;
 679
 680        if (qp->ibqp.srq) {
 681                /*
 682                 * Shared receive queues don't generate credits.
 683                 * Set the credit field to the invalid value.
 684                 */
 685                aeth |= IPATH_AETH_CREDIT_INVAL << IPATH_AETH_CREDIT_SHIFT;
 686        } else {
 687                u32 min, max, x;
 688                u32 credits;
 689                struct ipath_rwq *wq = qp->r_rq.wq;
 690                u32 head;
 691                u32 tail;
 692
 693                /* sanity check pointers before trusting them */
 694                head = wq->head;
 695                if (head >= qp->r_rq.size)
 696                        head = 0;
 697                tail = wq->tail;
 698                if (tail >= qp->r_rq.size)
 699                        tail = 0;
 700                /*
 701                 * Compute the number of credits available (RWQEs).
 702                 * XXX Not holding the r_rq.lock here so there is a small
 703                 * chance that the pair of reads are not atomic.
 704                 */
 705                credits = head - tail;
 706                if ((int)credits < 0)
 707                        credits += qp->r_rq.size;
 708                /*
 709                 * Binary search the credit table to find the code to
 710                 * use.
 711                 */
 712                min = 0;
 713                max = 31;
 714                for (;;) {
 715                        x = (min + max) / 2;
 716                        if (credit_table[x] == credits)
 717                                break;
 718                        if (credit_table[x] > credits)
 719                                max = x;
 720                        else if (min == x)
 721                                break;
 722                        else
 723                                min = x;
 724                }
 725                aeth |= x << IPATH_AETH_CREDIT_SHIFT;
 726        }
 727        return cpu_to_be32(aeth);
 728}
 729
 730/**
 731 * ipath_create_qp - create a queue pair for a device
 732 * @ibpd: the protection domain who's device we create the queue pair for
 733 * @init_attr: the attributes of the queue pair
 734 * @udata: unused by InfiniPath
 735 *
 736 * Returns the queue pair on success, otherwise returns an errno.
 737 *
 738 * Called by the ib_create_qp() core verbs function.
 739 */
 740struct ib_qp *ipath_create_qp(struct ib_pd *ibpd,
 741                              struct ib_qp_init_attr *init_attr,
 742                              struct ib_udata *udata)
 743{
 744        struct ipath_qp *qp;
 745        int err;
 746        struct ipath_swqe *swq = NULL;
 747        struct ipath_ibdev *dev;
 748        size_t sz;
 749        size_t sg_list_sz;
 750        struct ib_qp *ret;
 751
 752        if (init_attr->create_flags) {
 753                ret = ERR_PTR(-EINVAL);
 754                goto bail;
 755        }
 756
 757        if (init_attr->cap.max_send_sge > ib_ipath_max_sges ||
 758            init_attr->cap.max_send_wr > ib_ipath_max_qp_wrs) {
 759                ret = ERR_PTR(-EINVAL);
 760                goto bail;
 761        }
 762
 763        /* Check receive queue parameters if no SRQ is specified. */
 764        if (!init_attr->srq) {
 765                if (init_attr->cap.max_recv_sge > ib_ipath_max_sges ||
 766                    init_attr->cap.max_recv_wr > ib_ipath_max_qp_wrs) {
 767                        ret = ERR_PTR(-EINVAL);
 768                        goto bail;
 769                }
 770                if (init_attr->cap.max_send_sge +
 771                    init_attr->cap.max_send_wr +
 772                    init_attr->cap.max_recv_sge +
 773                    init_attr->cap.max_recv_wr == 0) {
 774                        ret = ERR_PTR(-EINVAL);
 775                        goto bail;
 776                }
 777        }
 778
 779        switch (init_attr->qp_type) {
 780        case IB_QPT_UC:
 781        case IB_QPT_RC:
 782        case IB_QPT_UD:
 783        case IB_QPT_SMI:
 784        case IB_QPT_GSI:
 785                sz = sizeof(struct ipath_sge) *
 786                        init_attr->cap.max_send_sge +
 787                        sizeof(struct ipath_swqe);
 788                swq = vmalloc((init_attr->cap.max_send_wr + 1) * sz);
 789                if (swq == NULL) {
 790                        ret = ERR_PTR(-ENOMEM);
 791                        goto bail;
 792                }
 793                sz = sizeof(*qp);
 794                sg_list_sz = 0;
 795                if (init_attr->srq) {
 796                        struct ipath_srq *srq = to_isrq(init_attr->srq);
 797
 798                        if (srq->rq.max_sge > 1)
 799                                sg_list_sz = sizeof(*qp->r_sg_list) *
 800                                        (srq->rq.max_sge - 1);
 801                } else if (init_attr->cap.max_recv_sge > 1)
 802                        sg_list_sz = sizeof(*qp->r_sg_list) *
 803                                (init_attr->cap.max_recv_sge - 1);
 804                qp = kmalloc(sz + sg_list_sz, GFP_KERNEL);
 805                if (!qp) {
 806                        ret = ERR_PTR(-ENOMEM);
 807                        goto bail_swq;
 808                }
 809                if (sg_list_sz && (init_attr->qp_type == IB_QPT_UD ||
 810                    init_attr->qp_type == IB_QPT_SMI ||
 811                    init_attr->qp_type == IB_QPT_GSI)) {
 812                        qp->r_ud_sg_list = kmalloc(sg_list_sz, GFP_KERNEL);
 813                        if (!qp->r_ud_sg_list) {
 814                                ret = ERR_PTR(-ENOMEM);
 815                                goto bail_qp;
 816                        }
 817                } else
 818                        qp->r_ud_sg_list = NULL;
 819                if (init_attr->srq) {
 820                        sz = 0;
 821                        qp->r_rq.size = 0;
 822                        qp->r_rq.max_sge = 0;
 823                        qp->r_rq.wq = NULL;
 824                        init_attr->cap.max_recv_wr = 0;
 825                        init_attr->cap.max_recv_sge = 0;
 826                } else {
 827                        qp->r_rq.size = init_attr->cap.max_recv_wr + 1;
 828                        qp->r_rq.max_sge = init_attr->cap.max_recv_sge;
 829                        sz = (sizeof(struct ib_sge) * qp->r_rq.max_sge) +
 830                                sizeof(struct ipath_rwqe);
 831                        qp->r_rq.wq = vmalloc_user(sizeof(struct ipath_rwq) +
 832                                              qp->r_rq.size * sz);
 833                        if (!qp->r_rq.wq) {
 834                                ret = ERR_PTR(-ENOMEM);
 835                                goto bail_sg_list;
 836                        }
 837                }
 838
 839                /*
 840                 * ib_create_qp() will initialize qp->ibqp
 841                 * except for qp->ibqp.qp_num.
 842                 */
 843                spin_lock_init(&qp->s_lock);
 844                spin_lock_init(&qp->r_rq.lock);
 845                atomic_set(&qp->refcount, 0);
 846                init_waitqueue_head(&qp->wait);
 847                init_waitqueue_head(&qp->wait_dma);
 848                tasklet_init(&qp->s_task, ipath_do_send, (unsigned long)qp);
 849                INIT_LIST_HEAD(&qp->piowait);
 850                INIT_LIST_HEAD(&qp->timerwait);
 851                qp->state = IB_QPS_RESET;
 852                qp->s_wq = swq;
 853                qp->s_size = init_attr->cap.max_send_wr + 1;
 854                qp->s_max_sge = init_attr->cap.max_send_sge;
 855                if (init_attr->sq_sig_type == IB_SIGNAL_REQ_WR)
 856                        qp->s_flags = IPATH_S_SIGNAL_REQ_WR;
 857                else
 858                        qp->s_flags = 0;
 859                dev = to_idev(ibpd->device);
 860                err = ipath_alloc_qpn(&dev->qp_table, qp,
 861                                      init_attr->qp_type);
 862                if (err) {
 863                        ret = ERR_PTR(err);
 864                        vfree(qp->r_rq.wq);
 865                        goto bail_sg_list;
 866                }
 867                qp->ip = NULL;
 868                qp->s_tx = NULL;
 869                ipath_reset_qp(qp, init_attr->qp_type);
 870                break;
 871
 872        default:
 873                /* Don't support raw QPs */
 874                ret = ERR_PTR(-ENOSYS);
 875                goto bail;
 876        }
 877
 878        init_attr->cap.max_inline_data = 0;
 879
 880        /*
 881         * Return the address of the RWQ as the offset to mmap.
 882         * See ipath_mmap() for details.
 883         */
 884        if (udata && udata->outlen >= sizeof(__u64)) {
 885                if (!qp->r_rq.wq) {
 886                        __u64 offset = 0;
 887
 888                        err = ib_copy_to_udata(udata, &offset,
 889                                               sizeof(offset));
 890                        if (err) {
 891                                ret = ERR_PTR(err);
 892                                goto bail_ip;
 893                        }
 894                } else {
 895                        u32 s = sizeof(struct ipath_rwq) +
 896                                qp->r_rq.size * sz;
 897
 898                        qp->ip =
 899                            ipath_create_mmap_info(dev, s,
 900                                                   ibpd->uobject->context,
 901                                                   qp->r_rq.wq);
 902                        if (!qp->ip) {
 903                                ret = ERR_PTR(-ENOMEM);
 904                                goto bail_ip;
 905                        }
 906
 907                        err = ib_copy_to_udata(udata, &(qp->ip->offset),
 908                                               sizeof(qp->ip->offset));
 909                        if (err) {
 910                                ret = ERR_PTR(err);
 911                                goto bail_ip;
 912                        }
 913                }
 914        }
 915
 916        spin_lock(&dev->n_qps_lock);
 917        if (dev->n_qps_allocated == ib_ipath_max_qps) {
 918                spin_unlock(&dev->n_qps_lock);
 919                ret = ERR_PTR(-ENOMEM);
 920                goto bail_ip;
 921        }
 922
 923        dev->n_qps_allocated++;
 924        spin_unlock(&dev->n_qps_lock);
 925
 926        if (qp->ip) {
 927                spin_lock_irq(&dev->pending_lock);
 928                list_add(&qp->ip->pending_mmaps, &dev->pending_mmaps);
 929                spin_unlock_irq(&dev->pending_lock);
 930        }
 931
 932        ret = &qp->ibqp;
 933        goto bail;
 934
 935bail_ip:
 936        if (qp->ip)
 937                kref_put(&qp->ip->ref, ipath_release_mmap_info);
 938        else
 939                vfree(qp->r_rq.wq);
 940        ipath_free_qp(&dev->qp_table, qp);
 941        free_qpn(&dev->qp_table, qp->ibqp.qp_num);
 942bail_sg_list:
 943        kfree(qp->r_ud_sg_list);
 944bail_qp:
 945        kfree(qp);
 946bail_swq:
 947        vfree(swq);
 948bail:
 949        return ret;
 950}
 951
 952/**
 953 * ipath_destroy_qp - destroy a queue pair
 954 * @ibqp: the queue pair to destroy
 955 *
 956 * Returns 0 on success.
 957 *
 958 * Note that this can be called while the QP is actively sending or
 959 * receiving!
 960 */
 961int ipath_destroy_qp(struct ib_qp *ibqp)
 962{
 963        struct ipath_qp *qp = to_iqp(ibqp);
 964        struct ipath_ibdev *dev = to_idev(ibqp->device);
 965
 966        /* Make sure HW and driver activity is stopped. */
 967        spin_lock_irq(&qp->s_lock);
 968        if (qp->state != IB_QPS_RESET) {
 969                qp->state = IB_QPS_RESET;
 970                spin_lock(&dev->pending_lock);
 971                if (!list_empty(&qp->timerwait))
 972                        list_del_init(&qp->timerwait);
 973                if (!list_empty(&qp->piowait))
 974                        list_del_init(&qp->piowait);
 975                spin_unlock(&dev->pending_lock);
 976                qp->s_flags &= ~IPATH_S_ANY_WAIT;
 977                spin_unlock_irq(&qp->s_lock);
 978                /* Stop the sending tasklet */
 979                tasklet_kill(&qp->s_task);
 980                wait_event(qp->wait_dma, !atomic_read(&qp->s_dma_busy));
 981        } else
 982                spin_unlock_irq(&qp->s_lock);
 983
 984        ipath_free_qp(&dev->qp_table, qp);
 985
 986        if (qp->s_tx) {
 987                atomic_dec(&qp->refcount);
 988                if (qp->s_tx->txreq.flags & IPATH_SDMA_TXREQ_F_FREEBUF)
 989                        kfree(qp->s_tx->txreq.map_addr);
 990                spin_lock_irq(&dev->pending_lock);
 991                list_add(&qp->s_tx->txreq.list, &dev->txreq_free);
 992                spin_unlock_irq(&dev->pending_lock);
 993                qp->s_tx = NULL;
 994        }
 995
 996        wait_event(qp->wait, !atomic_read(&qp->refcount));
 997
 998        /* all user's cleaned up, mark it available */
 999        free_qpn(&dev->qp_table, qp->ibqp.qp_num);
1000        spin_lock(&dev->n_qps_lock);
1001        dev->n_qps_allocated--;
1002        spin_unlock(&dev->n_qps_lock);
1003
1004        if (qp->ip)
1005                kref_put(&qp->ip->ref, ipath_release_mmap_info);
1006        else
1007                vfree(qp->r_rq.wq);
1008        kfree(qp->r_ud_sg_list);
1009        vfree(qp->s_wq);
1010        kfree(qp);
1011        return 0;
1012}
1013
1014/**
1015 * ipath_init_qp_table - initialize the QP table for a device
1016 * @idev: the device who's QP table we're initializing
1017 * @size: the size of the QP table
1018 *
1019 * Returns 0 on success, otherwise returns an errno.
1020 */
1021int ipath_init_qp_table(struct ipath_ibdev *idev, int size)
1022{
1023        int i;
1024        int ret;
1025
1026        idev->qp_table.last = 1;        /* QPN 0 and 1 are special. */
1027        idev->qp_table.max = size;
1028        idev->qp_table.nmaps = 1;
1029        idev->qp_table.table = kzalloc(size * sizeof(*idev->qp_table.table),
1030                                       GFP_KERNEL);
1031        if (idev->qp_table.table == NULL) {
1032                ret = -ENOMEM;
1033                goto bail;
1034        }
1035
1036        for (i = 0; i < ARRAY_SIZE(idev->qp_table.map); i++) {
1037                atomic_set(&idev->qp_table.map[i].n_free, BITS_PER_PAGE);
1038                idev->qp_table.map[i].page = NULL;
1039        }
1040
1041        ret = 0;
1042
1043bail:
1044        return ret;
1045}
1046
1047/**
1048 * ipath_get_credit - flush the send work queue of a QP
1049 * @qp: the qp who's send work queue to flush
1050 * @aeth: the Acknowledge Extended Transport Header
1051 *
1052 * The QP s_lock should be held.
1053 */
1054void ipath_get_credit(struct ipath_qp *qp, u32 aeth)
1055{
1056        u32 credit = (aeth >> IPATH_AETH_CREDIT_SHIFT) & IPATH_AETH_CREDIT_MASK;
1057
1058        /*
1059         * If the credit is invalid, we can send
1060         * as many packets as we like.  Otherwise, we have to
1061         * honor the credit field.
1062         */
1063        if (credit == IPATH_AETH_CREDIT_INVAL)
1064                qp->s_lsn = (u32) -1;
1065        else if (qp->s_lsn != (u32) -1) {
1066                /* Compute new LSN (i.e., MSN + credit) */
1067                credit = (aeth + credit_table[credit]) & IPATH_MSN_MASK;
1068                if (ipath_cmp24(credit, qp->s_lsn) > 0)
1069                        qp->s_lsn = credit;
1070        }
1071
1072        /* Restart sending if it was blocked due to lack of credits. */
1073        if ((qp->s_flags & IPATH_S_WAIT_SSN_CREDIT) &&
1074            qp->s_cur != qp->s_head &&
1075            (qp->s_lsn == (u32) -1 ||
1076             ipath_cmp24(get_swqe_ptr(qp, qp->s_cur)->ssn,
1077                         qp->s_lsn + 1) <= 0))
1078                ipath_schedule_send(qp);
1079}
1080