linux/drivers/infiniband/hw/nes/nes_verbs.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2006 - 2009 Intel-NE, Inc.  All rights reserved.
   3 *
   4 * This software is available to you under a choice of one of two
   5 * licenses.  You may choose to be licensed under the terms of the GNU
   6 * General Public License (GPL) Version 2, available from the file
   7 * COPYING in the main directory of this source tree, or the
   8 * OpenIB.org BSD license below:
   9 *
  10 *     Redistribution and use in source and binary forms, with or
  11 *     without modification, are permitted provided that the following
  12 *     conditions are met:
  13 *
  14 *      - Redistributions of source code must retain the above
  15 *        copyright notice, this list of conditions and the following
  16 *        disclaimer.
  17 *
  18 *      - Redistributions in binary form must reproduce the above
  19 *        copyright notice, this list of conditions and the following
  20 *        disclaimer in the documentation and/or other materials
  21 *        provided with the distribution.
  22 *
  23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  30 * SOFTWARE.
  31 *
  32 */
  33
  34#include <linux/module.h>
  35#include <linux/moduleparam.h>
  36#include <linux/random.h>
  37#include <linux/highmem.h>
  38#include <asm/byteorder.h>
  39
  40#include <rdma/ib_verbs.h>
  41#include <rdma/iw_cm.h>
  42#include <rdma/ib_user_verbs.h>
  43
  44#include "nes.h"
  45
  46#include <rdma/ib_umem.h>
  47
  48atomic_t mod_qp_timouts;
  49atomic_t qps_created;
  50atomic_t sw_qps_destroyed;
  51
  52static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev);
  53
  54/**
  55 * nes_alloc_mw
  56 */
  57static struct ib_mw *nes_alloc_mw(struct ib_pd *ibpd) {
  58        struct nes_pd *nespd = to_nespd(ibpd);
  59        struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
  60        struct nes_device *nesdev = nesvnic->nesdev;
  61        struct nes_adapter *nesadapter = nesdev->nesadapter;
  62        struct nes_cqp_request *cqp_request;
  63        struct nes_mr *nesmr;
  64        struct ib_mw *ibmw;
  65        struct nes_hw_cqp_wqe *cqp_wqe;
  66        int ret;
  67        u32 stag;
  68        u32 stag_index = 0;
  69        u32 next_stag_index = 0;
  70        u32 driver_key = 0;
  71        u8 stag_key = 0;
  72
  73        get_random_bytes(&next_stag_index, sizeof(next_stag_index));
  74        stag_key = (u8)next_stag_index;
  75
  76        driver_key = 0;
  77
  78        next_stag_index >>= 8;
  79        next_stag_index %= nesadapter->max_mr;
  80
  81        ret = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs,
  82                        nesadapter->max_mr, &stag_index, &next_stag_index);
  83        if (ret) {
  84                return ERR_PTR(ret);
  85        }
  86
  87        nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
  88        if (!nesmr) {
  89                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
  90                return ERR_PTR(-ENOMEM);
  91        }
  92
  93        stag = stag_index << 8;
  94        stag |= driver_key;
  95        stag += (u32)stag_key;
  96
  97        nes_debug(NES_DBG_MR, "Registering STag 0x%08X, index = 0x%08X\n",
  98                        stag, stag_index);
  99
 100        /* Register the region with the adapter */
 101        cqp_request = nes_get_cqp_request(nesdev);
 102        if (cqp_request == NULL) {
 103                kfree(nesmr);
 104                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
 105                return ERR_PTR(-ENOMEM);
 106        }
 107
 108        cqp_request->waiting = 1;
 109        cqp_wqe = &cqp_request->cqp_wqe;
 110
 111        cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] =
 112                        cpu_to_le32( NES_CQP_ALLOCATE_STAG | NES_CQP_STAG_RIGHTS_REMOTE_READ |
 113                        NES_CQP_STAG_RIGHTS_REMOTE_WRITE | NES_CQP_STAG_VA_TO |
 114                        NES_CQP_STAG_REM_ACC_EN);
 115
 116        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
 117        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX, (nespd->pd_id & 0x00007fff));
 118        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
 119
 120        atomic_set(&cqp_request->refcount, 2);
 121        nes_post_cqp_request(nesdev, cqp_request);
 122
 123        /* Wait for CQP */
 124        ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
 125                        NES_EVENT_TIMEOUT);
 126        nes_debug(NES_DBG_MR, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
 127                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
 128                        stag, ret, cqp_request->major_code, cqp_request->minor_code);
 129        if ((!ret) || (cqp_request->major_code)) {
 130                nes_put_cqp_request(nesdev, cqp_request);
 131                kfree(nesmr);
 132                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
 133                if (!ret) {
 134                        return ERR_PTR(-ETIME);
 135                } else {
 136                        return ERR_PTR(-ENOMEM);
 137                }
 138        }
 139        nes_put_cqp_request(nesdev, cqp_request);
 140
 141        nesmr->ibmw.rkey = stag;
 142        nesmr->mode = IWNES_MEMREG_TYPE_MW;
 143        ibmw = &nesmr->ibmw;
 144        nesmr->pbl_4k = 0;
 145        nesmr->pbls_used = 0;
 146
 147        return ibmw;
 148}
 149
 150
 151/**
 152 * nes_dealloc_mw
 153 */
 154static int nes_dealloc_mw(struct ib_mw *ibmw)
 155{
 156        struct nes_mr *nesmr = to_nesmw(ibmw);
 157        struct nes_vnic *nesvnic = to_nesvnic(ibmw->device);
 158        struct nes_device *nesdev = nesvnic->nesdev;
 159        struct nes_adapter *nesadapter = nesdev->nesadapter;
 160        struct nes_hw_cqp_wqe *cqp_wqe;
 161        struct nes_cqp_request *cqp_request;
 162        int err = 0;
 163        int ret;
 164
 165        /* Deallocate the window with the adapter */
 166        cqp_request = nes_get_cqp_request(nesdev);
 167        if (cqp_request == NULL) {
 168                nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
 169                return -ENOMEM;
 170        }
 171        cqp_request->waiting = 1;
 172        cqp_wqe = &cqp_request->cqp_wqe;
 173        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
 174        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, NES_CQP_DEALLOCATE_STAG);
 175        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ibmw->rkey);
 176
 177        atomic_set(&cqp_request->refcount, 2);
 178        nes_post_cqp_request(nesdev, cqp_request);
 179
 180        /* Wait for CQP */
 181        nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X to complete.\n",
 182                        ibmw->rkey);
 183        ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
 184                        NES_EVENT_TIMEOUT);
 185        nes_debug(NES_DBG_MR, "Deallocate STag completed, wait_event_timeout ret = %u,"
 186                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
 187                        ret, cqp_request->major_code, cqp_request->minor_code);
 188        if (!ret)
 189                err = -ETIME;
 190        else if (cqp_request->major_code)
 191                err = -EIO;
 192
 193        nes_put_cqp_request(nesdev, cqp_request);
 194
 195        nes_free_resource(nesadapter, nesadapter->allocated_mrs,
 196                        (ibmw->rkey & 0x0fffff00) >> 8);
 197        kfree(nesmr);
 198
 199        return err;
 200}
 201
 202
 203/**
 204 * nes_bind_mw
 205 */
 206static int nes_bind_mw(struct ib_qp *ibqp, struct ib_mw *ibmw,
 207                struct ib_mw_bind *ibmw_bind)
 208{
 209        u64 u64temp;
 210        struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
 211        struct nes_device *nesdev = nesvnic->nesdev;
 212        /* struct nes_mr *nesmr = to_nesmw(ibmw); */
 213        struct nes_qp *nesqp = to_nesqp(ibqp);
 214        struct nes_hw_qp_wqe *wqe;
 215        unsigned long flags = 0;
 216        u32 head;
 217        u32 wqe_misc = 0;
 218        u32 qsize;
 219
 220        if (nesqp->ibqp_state > IB_QPS_RTS)
 221                return -EINVAL;
 222
 223        spin_lock_irqsave(&nesqp->lock, flags);
 224
 225        head = nesqp->hwqp.sq_head;
 226        qsize = nesqp->hwqp.sq_tail;
 227
 228        /* Check for SQ overflow */
 229        if (((head + (2 * qsize) - nesqp->hwqp.sq_tail) % qsize) == (qsize - 1)) {
 230                spin_unlock_irqrestore(&nesqp->lock, flags);
 231                return -EINVAL;
 232        }
 233
 234        wqe = &nesqp->hwqp.sq_vbase[head];
 235        /* nes_debug(NES_DBG_MR, "processing sq wqe at %p, head = %u.\n", wqe, head); */
 236        nes_fill_init_qp_wqe(wqe, nesqp, head);
 237        u64temp = ibmw_bind->wr_id;
 238        set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX, u64temp);
 239        wqe_misc = NES_IWARP_SQ_OP_BIND;
 240
 241        wqe_misc |= NES_IWARP_SQ_WQE_LOCAL_FENCE;
 242
 243        if (ibmw_bind->send_flags & IB_SEND_SIGNALED)
 244                wqe_misc |= NES_IWARP_SQ_WQE_SIGNALED_COMPL;
 245
 246        if (ibmw_bind->mw_access_flags & IB_ACCESS_REMOTE_WRITE) {
 247                wqe_misc |= NES_CQP_STAG_RIGHTS_REMOTE_WRITE;
 248        }
 249        if (ibmw_bind->mw_access_flags & IB_ACCESS_REMOTE_READ) {
 250                wqe_misc |= NES_CQP_STAG_RIGHTS_REMOTE_READ;
 251        }
 252
 253        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_MISC_IDX, wqe_misc);
 254        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_MR_IDX, ibmw_bind->mr->lkey);
 255        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_MW_IDX, ibmw->rkey);
 256        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_LENGTH_LOW_IDX,
 257                        ibmw_bind->length);
 258        wqe->wqe_words[NES_IWARP_SQ_BIND_WQE_LENGTH_HIGH_IDX] = 0;
 259        u64temp = (u64)ibmw_bind->addr;
 260        set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_BIND_WQE_VA_FBO_LOW_IDX, u64temp);
 261
 262        head++;
 263        if (head >= qsize)
 264                head = 0;
 265
 266        nesqp->hwqp.sq_head = head;
 267        barrier();
 268
 269        nes_write32(nesdev->regs+NES_WQE_ALLOC,
 270                        (1 << 24) | 0x00800000 | nesqp->hwqp.qp_id);
 271
 272        spin_unlock_irqrestore(&nesqp->lock, flags);
 273
 274        return 0;
 275}
 276
 277
 278/**
 279 * nes_alloc_fmr
 280 */
 281static struct ib_fmr *nes_alloc_fmr(struct ib_pd *ibpd,
 282                int ibmr_access_flags,
 283                struct ib_fmr_attr *ibfmr_attr)
 284{
 285        unsigned long flags;
 286        struct nes_pd *nespd = to_nespd(ibpd);
 287        struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
 288        struct nes_device *nesdev = nesvnic->nesdev;
 289        struct nes_adapter *nesadapter = nesdev->nesadapter;
 290        struct nes_fmr *nesfmr;
 291        struct nes_cqp_request *cqp_request;
 292        struct nes_hw_cqp_wqe *cqp_wqe;
 293        int ret;
 294        u32 stag;
 295        u32 stag_index = 0;
 296        u32 next_stag_index = 0;
 297        u32 driver_key = 0;
 298        u32 opcode = 0;
 299        u8 stag_key = 0;
 300        int i=0;
 301        struct nes_vpbl vpbl;
 302
 303        get_random_bytes(&next_stag_index, sizeof(next_stag_index));
 304        stag_key = (u8)next_stag_index;
 305
 306        driver_key = 0;
 307
 308        next_stag_index >>= 8;
 309        next_stag_index %= nesadapter->max_mr;
 310
 311        ret = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs,
 312                        nesadapter->max_mr, &stag_index, &next_stag_index);
 313        if (ret) {
 314                goto failed_resource_alloc;
 315        }
 316
 317        nesfmr = kzalloc(sizeof(*nesfmr), GFP_KERNEL);
 318        if (!nesfmr) {
 319                ret = -ENOMEM;
 320                goto failed_fmr_alloc;
 321        }
 322
 323        nesfmr->nesmr.mode = IWNES_MEMREG_TYPE_FMR;
 324        if (ibfmr_attr->max_pages == 1) {
 325                /* use zero length PBL */
 326                nesfmr->nesmr.pbl_4k = 0;
 327                nesfmr->nesmr.pbls_used = 0;
 328        } else if (ibfmr_attr->max_pages <= 32) {
 329                /* use PBL 256 */
 330                nesfmr->nesmr.pbl_4k = 0;
 331                nesfmr->nesmr.pbls_used = 1;
 332        } else if (ibfmr_attr->max_pages <= 512) {
 333                /* use 4K PBLs */
 334                nesfmr->nesmr.pbl_4k = 1;
 335                nesfmr->nesmr.pbls_used = 1;
 336        } else {
 337                /* use two level 4K PBLs */
 338                /* add support for two level 256B PBLs */
 339                nesfmr->nesmr.pbl_4k = 1;
 340                nesfmr->nesmr.pbls_used = 1 + (ibfmr_attr->max_pages >> 9) +
 341                                ((ibfmr_attr->max_pages & 511) ? 1 : 0);
 342        }
 343        /* Register the region with the adapter */
 344        spin_lock_irqsave(&nesadapter->pbl_lock, flags);
 345
 346        /* track PBL resources */
 347        if (nesfmr->nesmr.pbls_used != 0) {
 348                if (nesfmr->nesmr.pbl_4k) {
 349                        if (nesfmr->nesmr.pbls_used > nesadapter->free_4kpbl) {
 350                                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 351                                ret = -ENOMEM;
 352                                goto failed_vpbl_avail;
 353                        } else {
 354                                nesadapter->free_4kpbl -= nesfmr->nesmr.pbls_used;
 355                        }
 356                } else {
 357                        if (nesfmr->nesmr.pbls_used > nesadapter->free_256pbl) {
 358                                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 359                                ret = -ENOMEM;
 360                                goto failed_vpbl_avail;
 361                        } else {
 362                                nesadapter->free_256pbl -= nesfmr->nesmr.pbls_used;
 363                        }
 364                }
 365        }
 366
 367        /* one level pbl */
 368        if (nesfmr->nesmr.pbls_used == 0) {
 369                nesfmr->root_vpbl.pbl_vbase = NULL;
 370                nes_debug(NES_DBG_MR,  "zero level pbl \n");
 371        } else if (nesfmr->nesmr.pbls_used == 1) {
 372                /* can change it to kmalloc & dma_map_single */
 373                nesfmr->root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
 374                                &nesfmr->root_vpbl.pbl_pbase);
 375                if (!nesfmr->root_vpbl.pbl_vbase) {
 376                        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 377                        ret = -ENOMEM;
 378                        goto failed_vpbl_alloc;
 379                }
 380                nesfmr->leaf_pbl_cnt = 0;
 381                nes_debug(NES_DBG_MR, "one level pbl, root_vpbl.pbl_vbase=%p \n",
 382                                nesfmr->root_vpbl.pbl_vbase);
 383        }
 384        /* two level pbl */
 385        else {
 386                nesfmr->root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 8192,
 387                                &nesfmr->root_vpbl.pbl_pbase);
 388                if (!nesfmr->root_vpbl.pbl_vbase) {
 389                        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 390                        ret = -ENOMEM;
 391                        goto failed_vpbl_alloc;
 392                }
 393
 394                nesfmr->leaf_pbl_cnt = nesfmr->nesmr.pbls_used-1;
 395                nesfmr->root_vpbl.leaf_vpbl = kzalloc(sizeof(*nesfmr->root_vpbl.leaf_vpbl)*1024, GFP_ATOMIC);
 396                if (!nesfmr->root_vpbl.leaf_vpbl) {
 397                        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 398                        ret = -ENOMEM;
 399                        goto failed_leaf_vpbl_alloc;
 400                }
 401
 402                nes_debug(NES_DBG_MR, "two level pbl, root_vpbl.pbl_vbase=%p"
 403                                " leaf_pbl_cnt=%d root_vpbl.leaf_vpbl=%p\n",
 404                                nesfmr->root_vpbl.pbl_vbase, nesfmr->leaf_pbl_cnt, nesfmr->root_vpbl.leaf_vpbl);
 405
 406                for (i=0; i<nesfmr->leaf_pbl_cnt; i++)
 407                        nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase = NULL;
 408
 409                for (i=0; i<nesfmr->leaf_pbl_cnt; i++) {
 410                        vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
 411                                        &vpbl.pbl_pbase);
 412
 413                        if (!vpbl.pbl_vbase) {
 414                                ret = -ENOMEM;
 415                                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 416                                goto failed_leaf_vpbl_pages_alloc;
 417                        }
 418
 419                        nesfmr->root_vpbl.pbl_vbase[i].pa_low = cpu_to_le32((u32)vpbl.pbl_pbase);
 420                        nesfmr->root_vpbl.pbl_vbase[i].pa_high = cpu_to_le32((u32)((((u64)vpbl.pbl_pbase)>>32)));
 421                        nesfmr->root_vpbl.leaf_vpbl[i] = vpbl;
 422
 423                        nes_debug(NES_DBG_MR, "pbase_low=0x%x, pbase_high=0x%x, vpbl=%p\n",
 424                                        nesfmr->root_vpbl.pbl_vbase[i].pa_low,
 425                                        nesfmr->root_vpbl.pbl_vbase[i].pa_high,
 426                                        &nesfmr->root_vpbl.leaf_vpbl[i]);
 427                }
 428        }
 429        nesfmr->ib_qp = NULL;
 430        nesfmr->access_rights =0;
 431
 432        stag = stag_index << 8;
 433        stag |= driver_key;
 434        stag += (u32)stag_key;
 435
 436        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 437        cqp_request = nes_get_cqp_request(nesdev);
 438        if (cqp_request == NULL) {
 439                nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
 440                ret = -ENOMEM;
 441                goto failed_leaf_vpbl_pages_alloc;
 442        }
 443        cqp_request->waiting = 1;
 444        cqp_wqe = &cqp_request->cqp_wqe;
 445
 446        nes_debug(NES_DBG_MR, "Registering STag 0x%08X, index = 0x%08X\n",
 447                        stag, stag_index);
 448
 449        opcode = NES_CQP_ALLOCATE_STAG | NES_CQP_STAG_VA_TO | NES_CQP_STAG_MR;
 450
 451        if (nesfmr->nesmr.pbl_4k == 1)
 452                opcode |= NES_CQP_STAG_PBL_BLK_SIZE;
 453
 454        if (ibmr_access_flags & IB_ACCESS_REMOTE_WRITE) {
 455                opcode |= NES_CQP_STAG_RIGHTS_REMOTE_WRITE |
 456                                NES_CQP_STAG_RIGHTS_LOCAL_WRITE | NES_CQP_STAG_REM_ACC_EN;
 457                nesfmr->access_rights |=
 458                                NES_CQP_STAG_RIGHTS_REMOTE_WRITE | NES_CQP_STAG_RIGHTS_LOCAL_WRITE |
 459                                NES_CQP_STAG_REM_ACC_EN;
 460        }
 461
 462        if (ibmr_access_flags & IB_ACCESS_REMOTE_READ) {
 463                opcode |= NES_CQP_STAG_RIGHTS_REMOTE_READ |
 464                                NES_CQP_STAG_RIGHTS_LOCAL_READ | NES_CQP_STAG_REM_ACC_EN;
 465                nesfmr->access_rights |=
 466                                NES_CQP_STAG_RIGHTS_REMOTE_READ | NES_CQP_STAG_RIGHTS_LOCAL_READ |
 467                                NES_CQP_STAG_REM_ACC_EN;
 468        }
 469
 470        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
 471        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
 472        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX, (nespd->pd_id & 0x00007fff));
 473        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
 474
 475        cqp_wqe->wqe_words[NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX] =
 476                        cpu_to_le32((nesfmr->nesmr.pbls_used>1) ?
 477                        (nesfmr->nesmr.pbls_used-1) : nesfmr->nesmr.pbls_used);
 478
 479        atomic_set(&cqp_request->refcount, 2);
 480        nes_post_cqp_request(nesdev, cqp_request);
 481
 482        /* Wait for CQP */
 483        ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
 484                        NES_EVENT_TIMEOUT);
 485        nes_debug(NES_DBG_MR, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
 486                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
 487                        stag, ret, cqp_request->major_code, cqp_request->minor_code);
 488
 489        if ((!ret) || (cqp_request->major_code)) {
 490                nes_put_cqp_request(nesdev, cqp_request);
 491                ret = (!ret) ? -ETIME : -EIO;
 492                goto failed_leaf_vpbl_pages_alloc;
 493        }
 494        nes_put_cqp_request(nesdev, cqp_request);
 495        nesfmr->nesmr.ibfmr.lkey = stag;
 496        nesfmr->nesmr.ibfmr.rkey = stag;
 497        nesfmr->attr = *ibfmr_attr;
 498
 499        return &nesfmr->nesmr.ibfmr;
 500
 501        failed_leaf_vpbl_pages_alloc:
 502        /* unroll all allocated pages */
 503        for (i=0; i<nesfmr->leaf_pbl_cnt; i++) {
 504                if (nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase) {
 505                        pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase,
 506                                        nesfmr->root_vpbl.leaf_vpbl[i].pbl_pbase);
 507                }
 508        }
 509        if (nesfmr->root_vpbl.leaf_vpbl)
 510                kfree(nesfmr->root_vpbl.leaf_vpbl);
 511
 512        failed_leaf_vpbl_alloc:
 513        if (nesfmr->leaf_pbl_cnt == 0) {
 514                if (nesfmr->root_vpbl.pbl_vbase)
 515                        pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.pbl_vbase,
 516                                        nesfmr->root_vpbl.pbl_pbase);
 517        } else
 518                pci_free_consistent(nesdev->pcidev, 8192, nesfmr->root_vpbl.pbl_vbase,
 519                                nesfmr->root_vpbl.pbl_pbase);
 520
 521        failed_vpbl_alloc:
 522        if (nesfmr->nesmr.pbls_used != 0) {
 523                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
 524                if (nesfmr->nesmr.pbl_4k)
 525                        nesadapter->free_4kpbl += nesfmr->nesmr.pbls_used;
 526                else
 527                        nesadapter->free_256pbl += nesfmr->nesmr.pbls_used;
 528                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 529        }
 530
 531failed_vpbl_avail:
 532        kfree(nesfmr);
 533
 534        failed_fmr_alloc:
 535        nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
 536
 537        failed_resource_alloc:
 538        return ERR_PTR(ret);
 539}
 540
 541
 542/**
 543 * nes_dealloc_fmr
 544 */
 545static int nes_dealloc_fmr(struct ib_fmr *ibfmr)
 546{
 547        unsigned long flags;
 548        struct nes_mr *nesmr = to_nesmr_from_ibfmr(ibfmr);
 549        struct nes_fmr *nesfmr = to_nesfmr(nesmr);
 550        struct nes_vnic *nesvnic = to_nesvnic(ibfmr->device);
 551        struct nes_device *nesdev = nesvnic->nesdev;
 552        struct nes_adapter *nesadapter = nesdev->nesadapter;
 553        int i = 0;
 554        int rc;
 555
 556        /* free the resources */
 557        if (nesfmr->leaf_pbl_cnt == 0) {
 558                /* single PBL case */
 559                if (nesfmr->root_vpbl.pbl_vbase)
 560                        pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.pbl_vbase,
 561                                        nesfmr->root_vpbl.pbl_pbase);
 562        } else {
 563                for (i = 0; i < nesfmr->leaf_pbl_cnt; i++) {
 564                        pci_free_consistent(nesdev->pcidev, 4096, nesfmr->root_vpbl.leaf_vpbl[i].pbl_vbase,
 565                                        nesfmr->root_vpbl.leaf_vpbl[i].pbl_pbase);
 566                }
 567                kfree(nesfmr->root_vpbl.leaf_vpbl);
 568                pci_free_consistent(nesdev->pcidev, 8192, nesfmr->root_vpbl.pbl_vbase,
 569                                nesfmr->root_vpbl.pbl_pbase);
 570        }
 571        nesmr->ibmw.device = ibfmr->device;
 572        nesmr->ibmw.pd = ibfmr->pd;
 573        nesmr->ibmw.rkey = ibfmr->rkey;
 574        nesmr->ibmw.uobject = NULL;
 575
 576        rc = nes_dealloc_mw(&nesmr->ibmw);
 577
 578        if ((rc == 0) && (nesfmr->nesmr.pbls_used != 0)) {
 579                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
 580                if (nesfmr->nesmr.pbl_4k) {
 581                        nesadapter->free_4kpbl += nesfmr->nesmr.pbls_used;
 582                        WARN_ON(nesadapter->free_4kpbl > nesadapter->max_4kpbl);
 583                } else {
 584                        nesadapter->free_256pbl += nesfmr->nesmr.pbls_used;
 585                        WARN_ON(nesadapter->free_256pbl > nesadapter->max_256pbl);
 586                }
 587                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
 588        }
 589
 590        return rc;
 591}
 592
 593
 594/**
 595 * nes_map_phys_fmr
 596 */
 597static int nes_map_phys_fmr(struct ib_fmr *ibfmr, u64 *page_list,
 598                int list_len, u64 iova)
 599{
 600        return 0;
 601}
 602
 603
 604/**
 605 * nes_unmap_frm
 606 */
 607static int nes_unmap_fmr(struct list_head *ibfmr_list)
 608{
 609        return 0;
 610}
 611
 612
 613
 614/**
 615 * nes_query_device
 616 */
 617static int nes_query_device(struct ib_device *ibdev, struct ib_device_attr *props)
 618{
 619        struct nes_vnic *nesvnic = to_nesvnic(ibdev);
 620        struct nes_device *nesdev = nesvnic->nesdev;
 621        struct nes_ib_device *nesibdev = nesvnic->nesibdev;
 622
 623        memset(props, 0, sizeof(*props));
 624        memcpy(&props->sys_image_guid, nesvnic->netdev->dev_addr, 6);
 625
 626        props->fw_ver = nesdev->nesadapter->fw_ver;
 627        props->device_cap_flags = nesdev->nesadapter->device_cap_flags;
 628        props->vendor_id = nesdev->nesadapter->vendor_id;
 629        props->vendor_part_id = nesdev->nesadapter->vendor_part_id;
 630        props->hw_ver = nesdev->nesadapter->hw_rev;
 631        props->max_mr_size = 0x80000000;
 632        props->max_qp = nesibdev->max_qp;
 633        props->max_qp_wr = nesdev->nesadapter->max_qp_wr - 2;
 634        props->max_sge = nesdev->nesadapter->max_sge;
 635        props->max_cq = nesibdev->max_cq;
 636        props->max_cqe = nesdev->nesadapter->max_cqe - 1;
 637        props->max_mr = nesibdev->max_mr;
 638        props->max_mw = nesibdev->max_mr;
 639        props->max_pd = nesibdev->max_pd;
 640        props->max_sge_rd = 1;
 641        switch (nesdev->nesadapter->max_irrq_wr) {
 642                case 0:
 643                        props->max_qp_rd_atom = 1;
 644                        break;
 645                case 1:
 646                        props->max_qp_rd_atom = 4;
 647                        break;
 648                case 2:
 649                        props->max_qp_rd_atom = 16;
 650                        break;
 651                case 3:
 652                        props->max_qp_rd_atom = 32;
 653                        break;
 654                default:
 655                        props->max_qp_rd_atom = 0;
 656        }
 657        props->max_qp_init_rd_atom = props->max_qp_rd_atom;
 658        props->atomic_cap = IB_ATOMIC_NONE;
 659        props->max_map_per_fmr = 1;
 660
 661        return 0;
 662}
 663
 664
 665/**
 666 * nes_query_port
 667 */
 668static int nes_query_port(struct ib_device *ibdev, u8 port, struct ib_port_attr *props)
 669{
 670        struct nes_vnic *nesvnic = to_nesvnic(ibdev);
 671        struct net_device *netdev = nesvnic->netdev;
 672
 673        memset(props, 0, sizeof(*props));
 674
 675        props->max_mtu = IB_MTU_4096;
 676
 677        if (netdev->mtu  >= 4096)
 678                props->active_mtu = IB_MTU_4096;
 679        else if (netdev->mtu  >= 2048)
 680                props->active_mtu = IB_MTU_2048;
 681        else if (netdev->mtu  >= 1024)
 682                props->active_mtu = IB_MTU_1024;
 683        else if (netdev->mtu  >= 512)
 684                props->active_mtu = IB_MTU_512;
 685        else
 686                props->active_mtu = IB_MTU_256;
 687
 688        props->lid = 1;
 689        props->lmc = 0;
 690        props->sm_lid = 0;
 691        props->sm_sl = 0;
 692        if (nesvnic->linkup)
 693                props->state = IB_PORT_ACTIVE;
 694        else
 695                props->state = IB_PORT_DOWN;
 696        props->phys_state = 0;
 697        props->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_REINIT_SUP |
 698                        IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP;
 699        props->gid_tbl_len = 1;
 700        props->pkey_tbl_len = 1;
 701        props->qkey_viol_cntr = 0;
 702        props->active_width = IB_WIDTH_4X;
 703        props->active_speed = 1;
 704        props->max_msg_sz = 0x80000000;
 705
 706        return 0;
 707}
 708
 709
 710/**
 711 * nes_modify_port
 712 */
 713static int nes_modify_port(struct ib_device *ibdev, u8 port,
 714                int port_modify_mask, struct ib_port_modify *props)
 715{
 716        return 0;
 717}
 718
 719
 720/**
 721 * nes_query_pkey
 722 */
 723static int nes_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
 724{
 725        *pkey = 0;
 726        return 0;
 727}
 728
 729
 730/**
 731 * nes_query_gid
 732 */
 733static int nes_query_gid(struct ib_device *ibdev, u8 port,
 734                int index, union ib_gid *gid)
 735{
 736        struct nes_vnic *nesvnic = to_nesvnic(ibdev);
 737
 738        memset(&(gid->raw[0]), 0, sizeof(gid->raw));
 739        memcpy(&(gid->raw[0]), nesvnic->netdev->dev_addr, 6);
 740
 741        return 0;
 742}
 743
 744
 745/**
 746 * nes_alloc_ucontext - Allocate the user context data structure. This keeps track
 747 * of all objects associated with a particular user-mode client.
 748 */
 749static struct ib_ucontext *nes_alloc_ucontext(struct ib_device *ibdev,
 750                struct ib_udata *udata)
 751{
 752        struct nes_vnic *nesvnic = to_nesvnic(ibdev);
 753        struct nes_device *nesdev = nesvnic->nesdev;
 754        struct nes_adapter *nesadapter = nesdev->nesadapter;
 755        struct nes_alloc_ucontext_req req;
 756        struct nes_alloc_ucontext_resp uresp;
 757        struct nes_ucontext *nes_ucontext;
 758        struct nes_ib_device *nesibdev = nesvnic->nesibdev;
 759
 760
 761        if (ib_copy_from_udata(&req, udata, sizeof(struct nes_alloc_ucontext_req))) {
 762                printk(KERN_ERR PFX "Invalid structure size on allocate user context.\n");
 763                return ERR_PTR(-EINVAL);
 764        }
 765
 766        if (req.userspace_ver != NES_ABI_USERSPACE_VER) {
 767                printk(KERN_ERR PFX "Invalid userspace driver version detected. Detected version %d, should be %d\n",
 768                        req.userspace_ver, NES_ABI_USERSPACE_VER);
 769                return ERR_PTR(-EINVAL);
 770        }
 771
 772
 773        memset(&uresp, 0, sizeof uresp);
 774
 775        uresp.max_qps = nesibdev->max_qp;
 776        uresp.max_pds = nesibdev->max_pd;
 777        uresp.wq_size = nesdev->nesadapter->max_qp_wr * 2;
 778        uresp.virtwq = nesadapter->virtwq;
 779        uresp.kernel_ver = NES_ABI_KERNEL_VER;
 780
 781        nes_ucontext = kzalloc(sizeof *nes_ucontext, GFP_KERNEL);
 782        if (!nes_ucontext)
 783                return ERR_PTR(-ENOMEM);
 784
 785        nes_ucontext->nesdev = nesdev;
 786        nes_ucontext->mmap_wq_offset = uresp.max_pds;
 787        nes_ucontext->mmap_cq_offset = nes_ucontext->mmap_wq_offset +
 788                        ((sizeof(struct nes_hw_qp_wqe) * uresp.max_qps * 2) + PAGE_SIZE-1) /
 789                        PAGE_SIZE;
 790
 791
 792        if (ib_copy_to_udata(udata, &uresp, sizeof uresp)) {
 793                kfree(nes_ucontext);
 794                return ERR_PTR(-EFAULT);
 795        }
 796
 797        INIT_LIST_HEAD(&nes_ucontext->cq_reg_mem_list);
 798        INIT_LIST_HEAD(&nes_ucontext->qp_reg_mem_list);
 799        atomic_set(&nes_ucontext->usecnt, 1);
 800        return &nes_ucontext->ibucontext;
 801}
 802
 803
 804/**
 805 * nes_dealloc_ucontext
 806 */
 807static int nes_dealloc_ucontext(struct ib_ucontext *context)
 808{
 809        /* struct nes_vnic *nesvnic = to_nesvnic(context->device); */
 810        /* struct nes_device *nesdev = nesvnic->nesdev; */
 811        struct nes_ucontext *nes_ucontext = to_nesucontext(context);
 812
 813        if (!atomic_dec_and_test(&nes_ucontext->usecnt))
 814          return 0;
 815        kfree(nes_ucontext);
 816        return 0;
 817}
 818
 819
 820/**
 821 * nes_mmap
 822 */
 823static int nes_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
 824{
 825        unsigned long index;
 826        struct nes_vnic *nesvnic = to_nesvnic(context->device);
 827        struct nes_device *nesdev = nesvnic->nesdev;
 828        /* struct nes_adapter *nesadapter = nesdev->nesadapter; */
 829        struct nes_ucontext *nes_ucontext;
 830        struct nes_qp *nesqp;
 831
 832        nes_ucontext = to_nesucontext(context);
 833
 834
 835        if (vma->vm_pgoff >= nes_ucontext->mmap_wq_offset) {
 836                index = (vma->vm_pgoff - nes_ucontext->mmap_wq_offset) * PAGE_SIZE;
 837                index /= ((sizeof(struct nes_hw_qp_wqe) * nesdev->nesadapter->max_qp_wr * 2) +
 838                                PAGE_SIZE-1) & (~(PAGE_SIZE-1));
 839                if (!test_bit(index, nes_ucontext->allocated_wqs)) {
 840                        nes_debug(NES_DBG_MMAP, "wq %lu not allocated\n", index);
 841                        return -EFAULT;
 842                }
 843                nesqp = nes_ucontext->mmap_nesqp[index];
 844                if (nesqp == NULL) {
 845                        nes_debug(NES_DBG_MMAP, "wq %lu has a NULL QP base.\n", index);
 846                        return -EFAULT;
 847                }
 848                if (remap_pfn_range(vma, vma->vm_start,
 849                                virt_to_phys(nesqp->hwqp.sq_vbase) >> PAGE_SHIFT,
 850                                vma->vm_end - vma->vm_start,
 851                                vma->vm_page_prot)) {
 852                        nes_debug(NES_DBG_MMAP, "remap_pfn_range failed.\n");
 853                        return -EAGAIN;
 854                }
 855                vma->vm_private_data = nesqp;
 856                return 0;
 857        } else {
 858                index = vma->vm_pgoff;
 859                if (!test_bit(index, nes_ucontext->allocated_doorbells))
 860                        return -EFAULT;
 861
 862                vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
 863                if (io_remap_pfn_range(vma, vma->vm_start,
 864                                (nesdev->doorbell_start +
 865                                ((nes_ucontext->mmap_db_index[index] - nesdev->base_doorbell_index) * 4096))
 866                                >> PAGE_SHIFT, PAGE_SIZE, vma->vm_page_prot))
 867                        return -EAGAIN;
 868                vma->vm_private_data = nes_ucontext;
 869                return 0;
 870        }
 871
 872        return -ENOSYS;
 873}
 874
 875
 876/**
 877 * nes_alloc_pd
 878 */
 879static struct ib_pd *nes_alloc_pd(struct ib_device *ibdev,
 880                struct ib_ucontext *context, struct ib_udata *udata)
 881{
 882        struct nes_pd *nespd;
 883        struct nes_vnic *nesvnic = to_nesvnic(ibdev);
 884        struct nes_device *nesdev = nesvnic->nesdev;
 885        struct nes_adapter *nesadapter = nesdev->nesadapter;
 886        struct nes_ucontext *nesucontext;
 887        struct nes_alloc_pd_resp uresp;
 888        u32 pd_num = 0;
 889        int err;
 890
 891        nes_debug(NES_DBG_PD, "nesvnic=%p, netdev=%p %s, ibdev=%p, context=%p, netdev refcnt=%u\n",
 892                        nesvnic, nesdev->netdev[0], nesdev->netdev[0]->name, ibdev, context,
 893                        atomic_read(&nesvnic->netdev->refcnt));
 894
 895        err = nes_alloc_resource(nesadapter, nesadapter->allocated_pds,
 896                        nesadapter->max_pd, &pd_num, &nesadapter->next_pd);
 897        if (err) {
 898                return ERR_PTR(err);
 899        }
 900
 901        nespd = kzalloc(sizeof (struct nes_pd), GFP_KERNEL);
 902        if (!nespd) {
 903                nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num);
 904                return ERR_PTR(-ENOMEM);
 905        }
 906
 907        nes_debug(NES_DBG_PD, "Allocating PD (%p) for ib device %s\n",
 908                        nespd, nesvnic->nesibdev->ibdev.name);
 909
 910        nespd->pd_id = (pd_num << (PAGE_SHIFT-12)) + nesadapter->base_pd;
 911
 912        if (context) {
 913                nesucontext = to_nesucontext(context);
 914                nespd->mmap_db_index = find_next_zero_bit(nesucontext->allocated_doorbells,
 915                                NES_MAX_USER_DB_REGIONS, nesucontext->first_free_db);
 916                nes_debug(NES_DBG_PD, "find_first_zero_biton doorbells returned %u, mapping pd_id %u.\n",
 917                                nespd->mmap_db_index, nespd->pd_id);
 918                if (nespd->mmap_db_index >= NES_MAX_USER_DB_REGIONS) {
 919                        nes_debug(NES_DBG_PD, "mmap_db_index > MAX\n");
 920                        nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num);
 921                        kfree(nespd);
 922                        return ERR_PTR(-ENOMEM);
 923                }
 924
 925                uresp.pd_id = nespd->pd_id;
 926                uresp.mmap_db_index = nespd->mmap_db_index;
 927                if (ib_copy_to_udata(udata, &uresp, sizeof (struct nes_alloc_pd_resp))) {
 928                        nes_free_resource(nesadapter, nesadapter->allocated_pds, pd_num);
 929                        kfree(nespd);
 930                        return ERR_PTR(-EFAULT);
 931                }
 932
 933                set_bit(nespd->mmap_db_index, nesucontext->allocated_doorbells);
 934                nesucontext->mmap_db_index[nespd->mmap_db_index] = nespd->pd_id;
 935                nesucontext->first_free_db = nespd->mmap_db_index + 1;
 936        }
 937
 938        nes_debug(NES_DBG_PD, "PD%u structure located @%p.\n", nespd->pd_id, nespd);
 939        return &nespd->ibpd;
 940}
 941
 942
 943/**
 944 * nes_dealloc_pd
 945 */
 946static int nes_dealloc_pd(struct ib_pd *ibpd)
 947{
 948        struct nes_ucontext *nesucontext;
 949        struct nes_pd *nespd = to_nespd(ibpd);
 950        struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
 951        struct nes_device *nesdev = nesvnic->nesdev;
 952        struct nes_adapter *nesadapter = nesdev->nesadapter;
 953
 954        if ((ibpd->uobject) && (ibpd->uobject->context)) {
 955                nesucontext = to_nesucontext(ibpd->uobject->context);
 956                nes_debug(NES_DBG_PD, "Clearing bit %u from allocated doorbells\n",
 957                                nespd->mmap_db_index);
 958                clear_bit(nespd->mmap_db_index, nesucontext->allocated_doorbells);
 959                nesucontext->mmap_db_index[nespd->mmap_db_index] = 0;
 960                if (nesucontext->first_free_db > nespd->mmap_db_index) {
 961                        nesucontext->first_free_db = nespd->mmap_db_index;
 962                }
 963        }
 964
 965        nes_debug(NES_DBG_PD, "Deallocating PD%u structure located @%p.\n",
 966                        nespd->pd_id, nespd);
 967        nes_free_resource(nesadapter, nesadapter->allocated_pds,
 968                        (nespd->pd_id-nesadapter->base_pd)>>(PAGE_SHIFT-12));
 969        kfree(nespd);
 970
 971        return 0;
 972}
 973
 974
 975/**
 976 * nes_create_ah
 977 */
 978static struct ib_ah *nes_create_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr)
 979{
 980        return ERR_PTR(-ENOSYS);
 981}
 982
 983
 984/**
 985 * nes_destroy_ah
 986 */
 987static int nes_destroy_ah(struct ib_ah *ah)
 988{
 989        return -ENOSYS;
 990}
 991
 992
 993/**
 994 * nes_get_encoded_size
 995 */
 996static inline u8 nes_get_encoded_size(int *size)
 997{
 998        u8 encoded_size = 0;
 999        if (*size <= 32) {
1000                *size = 32;
1001                encoded_size = 1;
1002        } else if (*size <= 128) {
1003                *size = 128;
1004                encoded_size = 2;
1005        } else if (*size <= 512) {
1006                *size = 512;
1007                encoded_size = 3;
1008        }
1009        return (encoded_size);
1010}
1011
1012
1013
1014/**
1015 * nes_setup_virt_qp
1016 */
1017static int nes_setup_virt_qp(struct nes_qp *nesqp, struct nes_pbl *nespbl,
1018                struct nes_vnic *nesvnic, int sq_size, int rq_size)
1019{
1020        unsigned long flags;
1021        void *mem;
1022        __le64 *pbl = NULL;
1023        __le64 *tpbl;
1024        __le64 *pblbuffer;
1025        struct nes_device *nesdev = nesvnic->nesdev;
1026        struct nes_adapter *nesadapter = nesdev->nesadapter;
1027        u32 pbl_entries;
1028        u8 rq_pbl_entries;
1029        u8 sq_pbl_entries;
1030
1031        pbl_entries = nespbl->pbl_size >> 3;
1032        nes_debug(NES_DBG_QP, "Userspace PBL, pbl_size=%u, pbl_entries = %d pbl_vbase=%p, pbl_pbase=%lx\n",
1033                        nespbl->pbl_size, pbl_entries,
1034                        (void *)nespbl->pbl_vbase,
1035                        (unsigned long) nespbl->pbl_pbase);
1036        pbl = (__le64 *) nespbl->pbl_vbase; /* points to first pbl entry */
1037        /* now lets set the sq_vbase as well as rq_vbase addrs we will assign */
1038        /* the first pbl to be fro the rq_vbase... */
1039        rq_pbl_entries = (rq_size * sizeof(struct nes_hw_qp_wqe)) >> 12;
1040        sq_pbl_entries = (sq_size * sizeof(struct nes_hw_qp_wqe)) >> 12;
1041        nesqp->hwqp.sq_pbase = (le32_to_cpu(((__le32 *)pbl)[0])) | ((u64)((le32_to_cpu(((__le32 *)pbl)[1]))) << 32);
1042        if (!nespbl->page) {
1043                nes_debug(NES_DBG_QP, "QP nespbl->page is NULL \n");
1044                kfree(nespbl);
1045                return -ENOMEM;
1046        }
1047
1048        nesqp->hwqp.sq_vbase = kmap(nespbl->page);
1049        nesqp->page = nespbl->page;
1050        if (!nesqp->hwqp.sq_vbase) {
1051                nes_debug(NES_DBG_QP, "QP sq_vbase kmap failed\n");
1052                kfree(nespbl);
1053                return -ENOMEM;
1054        }
1055
1056        /* Now to get to sq.. we need to calculate how many */
1057        /* PBL entries were used by the rq.. */
1058        pbl += sq_pbl_entries;
1059        nesqp->hwqp.rq_pbase = (le32_to_cpu(((__le32 *)pbl)[0])) | ((u64)((le32_to_cpu(((__le32 *)pbl)[1]))) << 32);
1060        /* nesqp->hwqp.rq_vbase = bus_to_virt(*pbl); */
1061        /*nesqp->hwqp.rq_vbase = phys_to_virt(*pbl); */
1062
1063        nes_debug(NES_DBG_QP, "QP sq_vbase= %p sq_pbase=%lx rq_vbase=%p rq_pbase=%lx\n",
1064                  nesqp->hwqp.sq_vbase, (unsigned long) nesqp->hwqp.sq_pbase,
1065                  nesqp->hwqp.rq_vbase, (unsigned long) nesqp->hwqp.rq_pbase);
1066        spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1067        if (!nesadapter->free_256pbl) {
1068                pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1069                                nespbl->pbl_pbase);
1070                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1071                kunmap(nesqp->page);
1072                kfree(nespbl);
1073                return -ENOMEM;
1074        }
1075        nesadapter->free_256pbl--;
1076        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1077
1078        nesqp->pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 256, &nesqp->pbl_pbase);
1079        pblbuffer = nesqp->pbl_vbase;
1080        if (!nesqp->pbl_vbase) {
1081                /* memory allocated during nes_reg_user_mr() */
1082                pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1083                                    nespbl->pbl_pbase);
1084                kfree(nespbl);
1085                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1086                nesadapter->free_256pbl++;
1087                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1088                kunmap(nesqp->page);
1089                return -ENOMEM;
1090        }
1091        memset(nesqp->pbl_vbase, 0, 256);
1092        /* fill in the page address in the pbl buffer.. */
1093        tpbl = pblbuffer + 16;
1094        pbl = (__le64 *)nespbl->pbl_vbase;
1095        while (sq_pbl_entries--)
1096                *tpbl++ = *pbl++;
1097        tpbl = pblbuffer;
1098        while (rq_pbl_entries--)
1099                *tpbl++ = *pbl++;
1100
1101        /* done with memory allocated during nes_reg_user_mr() */
1102        pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1103                            nespbl->pbl_pbase);
1104        kfree(nespbl);
1105
1106        nesqp->qp_mem_size =
1107                        max((u32)sizeof(struct nes_qp_context), ((u32)256)) + 256;     /* this is Q2 */
1108        /* Round up to a multiple of a page */
1109        nesqp->qp_mem_size += PAGE_SIZE - 1;
1110        nesqp->qp_mem_size &= ~(PAGE_SIZE - 1);
1111
1112        mem = pci_alloc_consistent(nesdev->pcidev, nesqp->qp_mem_size,
1113                        &nesqp->hwqp.q2_pbase);
1114
1115        if (!mem) {
1116                pci_free_consistent(nesdev->pcidev, 256, nesqp->pbl_vbase, nesqp->pbl_pbase);
1117                nesqp->pbl_vbase = NULL;
1118                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1119                nesadapter->free_256pbl++;
1120                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1121                kunmap(nesqp->page);
1122                return -ENOMEM;
1123        }
1124        nesqp->hwqp.q2_vbase = mem;
1125        mem += 256;
1126        memset(nesqp->hwqp.q2_vbase, 0, 256);
1127        nesqp->nesqp_context = mem;
1128        memset(nesqp->nesqp_context, 0, sizeof(*nesqp->nesqp_context));
1129        nesqp->nesqp_context_pbase = nesqp->hwqp.q2_pbase + 256;
1130
1131        return 0;
1132}
1133
1134
1135/**
1136 * nes_setup_mmap_qp
1137 */
1138static int nes_setup_mmap_qp(struct nes_qp *nesqp, struct nes_vnic *nesvnic,
1139                int sq_size, int rq_size)
1140{
1141        void *mem;
1142        struct nes_device *nesdev = nesvnic->nesdev;
1143
1144        nesqp->qp_mem_size = (sizeof(struct nes_hw_qp_wqe) * sq_size) +
1145                        (sizeof(struct nes_hw_qp_wqe) * rq_size) +
1146                        max((u32)sizeof(struct nes_qp_context), ((u32)256)) +
1147                        256; /* this is Q2 */
1148        /* Round up to a multiple of a page */
1149        nesqp->qp_mem_size += PAGE_SIZE - 1;
1150        nesqp->qp_mem_size &= ~(PAGE_SIZE - 1);
1151
1152        mem = pci_alloc_consistent(nesdev->pcidev, nesqp->qp_mem_size,
1153                        &nesqp->hwqp.sq_pbase);
1154        if (!mem)
1155                return -ENOMEM;
1156        nes_debug(NES_DBG_QP, "PCI consistent memory for "
1157                        "host descriptor rings located @ %p (pa = 0x%08lX.) size = %u.\n",
1158                        mem, (unsigned long)nesqp->hwqp.sq_pbase, nesqp->qp_mem_size);
1159
1160        memset(mem, 0, nesqp->qp_mem_size);
1161
1162        nesqp->hwqp.sq_vbase = mem;
1163        mem += sizeof(struct nes_hw_qp_wqe) * sq_size;
1164
1165        nesqp->hwqp.rq_vbase = mem;
1166        nesqp->hwqp.rq_pbase = nesqp->hwqp.sq_pbase +
1167                        sizeof(struct nes_hw_qp_wqe) * sq_size;
1168        mem += sizeof(struct nes_hw_qp_wqe) * rq_size;
1169
1170        nesqp->hwqp.q2_vbase = mem;
1171        nesqp->hwqp.q2_pbase = nesqp->hwqp.rq_pbase +
1172                        sizeof(struct nes_hw_qp_wqe) * rq_size;
1173        mem += 256;
1174        memset(nesqp->hwqp.q2_vbase, 0, 256);
1175
1176        nesqp->nesqp_context = mem;
1177        nesqp->nesqp_context_pbase = nesqp->hwqp.q2_pbase + 256;
1178        memset(nesqp->nesqp_context, 0, sizeof(*nesqp->nesqp_context));
1179        return 0;
1180}
1181
1182
1183/**
1184 * nes_free_qp_mem() is to free up the qp's pci_alloc_consistent() memory.
1185 */
1186static inline void nes_free_qp_mem(struct nes_device *nesdev,
1187                struct nes_qp *nesqp, int virt_wqs)
1188{
1189        unsigned long flags;
1190        struct nes_adapter *nesadapter = nesdev->nesadapter;
1191        if (!virt_wqs) {
1192                pci_free_consistent(nesdev->pcidev, nesqp->qp_mem_size,
1193                                nesqp->hwqp.sq_vbase, nesqp->hwqp.sq_pbase);
1194        }else {
1195                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1196                nesadapter->free_256pbl++;
1197                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1198                pci_free_consistent(nesdev->pcidev, nesqp->qp_mem_size, nesqp->hwqp.q2_vbase, nesqp->hwqp.q2_pbase);
1199                pci_free_consistent(nesdev->pcidev, 256, nesqp->pbl_vbase, nesqp->pbl_pbase );
1200                nesqp->pbl_vbase = NULL;
1201                kunmap(nesqp->page);
1202        }
1203}
1204
1205
1206/**
1207 * nes_create_qp
1208 */
1209static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
1210                struct ib_qp_init_attr *init_attr, struct ib_udata *udata)
1211{
1212        u64 u64temp= 0;
1213        u64 u64nesqp = 0;
1214        struct nes_pd *nespd = to_nespd(ibpd);
1215        struct nes_vnic *nesvnic = to_nesvnic(ibpd->device);
1216        struct nes_device *nesdev = nesvnic->nesdev;
1217        struct nes_adapter *nesadapter = nesdev->nesadapter;
1218        struct nes_qp *nesqp;
1219        struct nes_cq *nescq;
1220        struct nes_ucontext *nes_ucontext;
1221        struct nes_hw_cqp_wqe *cqp_wqe;
1222        struct nes_cqp_request *cqp_request;
1223        struct nes_create_qp_req req;
1224        struct nes_create_qp_resp uresp;
1225        struct nes_pbl  *nespbl = NULL;
1226        u32 qp_num = 0;
1227        u32 opcode = 0;
1228        /* u32 counter = 0; */
1229        void *mem;
1230        unsigned long flags;
1231        int ret;
1232        int err;
1233        int virt_wqs = 0;
1234        int sq_size;
1235        int rq_size;
1236        u8 sq_encoded_size;
1237        u8 rq_encoded_size;
1238        /* int counter; */
1239
1240        if (init_attr->create_flags)
1241                return ERR_PTR(-EINVAL);
1242
1243        atomic_inc(&qps_created);
1244        switch (init_attr->qp_type) {
1245                case IB_QPT_RC:
1246                        if (nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) {
1247                                init_attr->cap.max_inline_data = 0;
1248                        } else {
1249                                init_attr->cap.max_inline_data = 64;
1250                        }
1251                        sq_size = init_attr->cap.max_send_wr;
1252                        rq_size = init_attr->cap.max_recv_wr;
1253
1254                        /* check if the encoded sizes are OK or not... */
1255                        sq_encoded_size = nes_get_encoded_size(&sq_size);
1256                        rq_encoded_size = nes_get_encoded_size(&rq_size);
1257
1258                        if ((!sq_encoded_size) || (!rq_encoded_size)) {
1259                                nes_debug(NES_DBG_QP, "ERROR bad rq (%u) or sq (%u) size\n",
1260                                                rq_size, sq_size);
1261                                return ERR_PTR(-EINVAL);
1262                        }
1263
1264                        init_attr->cap.max_send_wr = sq_size -2;
1265                        init_attr->cap.max_recv_wr = rq_size -1;
1266                        nes_debug(NES_DBG_QP, "RQ size=%u, SQ Size=%u\n", rq_size, sq_size);
1267
1268                        ret = nes_alloc_resource(nesadapter, nesadapter->allocated_qps,
1269                                        nesadapter->max_qp, &qp_num, &nesadapter->next_qp);
1270                        if (ret) {
1271                                return ERR_PTR(ret);
1272                        }
1273
1274                        /* Need 512 (actually now 1024) byte alignment on this structure */
1275                        mem = kzalloc(sizeof(*nesqp)+NES_SW_CONTEXT_ALIGN-1, GFP_KERNEL);
1276                        if (!mem) {
1277                                nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1278                                nes_debug(NES_DBG_QP, "Unable to allocate QP\n");
1279                                return ERR_PTR(-ENOMEM);
1280                        }
1281                        u64nesqp = (unsigned long)mem;
1282                        u64nesqp += ((u64)NES_SW_CONTEXT_ALIGN) - 1;
1283                        u64temp = ((u64)NES_SW_CONTEXT_ALIGN) - 1;
1284                        u64nesqp &= ~u64temp;
1285                        nesqp = (struct nes_qp *)(unsigned long)u64nesqp;
1286                        /* nes_debug(NES_DBG_QP, "nesqp=%p, allocated buffer=%p.  Rounded to closest %u\n",
1287                                        nesqp, mem, NES_SW_CONTEXT_ALIGN); */
1288                        nesqp->allocated_buffer = mem;
1289
1290                        if (udata) {
1291                                if (ib_copy_from_udata(&req, udata, sizeof(struct nes_create_qp_req))) {
1292                                        nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1293                                        kfree(nesqp->allocated_buffer);
1294                                        nes_debug(NES_DBG_QP, "ib_copy_from_udata() Failed \n");
1295                                        return NULL;
1296                                }
1297                                if (req.user_wqe_buffers) {
1298                                        virt_wqs = 1;
1299                                }
1300                                if ((ibpd->uobject) && (ibpd->uobject->context)) {
1301                                        nesqp->user_mode = 1;
1302                                        nes_ucontext = to_nesucontext(ibpd->uobject->context);
1303                                        if (virt_wqs) {
1304                                                err = 1;
1305                                                list_for_each_entry(nespbl, &nes_ucontext->qp_reg_mem_list, list) {
1306                                                        if (nespbl->user_base == (unsigned long )req.user_wqe_buffers) {
1307                                                                list_del(&nespbl->list);
1308                                                                err = 0;
1309                                                                nes_debug(NES_DBG_QP, "Found PBL for virtual QP. nespbl=%p. user_base=0x%lx\n",
1310                                                                          nespbl, nespbl->user_base);
1311                                                                break;
1312                                                        }
1313                                                }
1314                                                if (err) {
1315                                                        nes_debug(NES_DBG_QP, "Didn't Find PBL for virtual QP. address = %llx.\n",
1316                                                                  (long long unsigned int)req.user_wqe_buffers);
1317                                                        nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1318                                                        kfree(nesqp->allocated_buffer);
1319                                                        return ERR_PTR(-EFAULT);
1320                                                }
1321                                        }
1322
1323                                        nes_ucontext = to_nesucontext(ibpd->uobject->context);
1324                                        nesqp->mmap_sq_db_index =
1325                                                find_next_zero_bit(nes_ucontext->allocated_wqs,
1326                                                                   NES_MAX_USER_WQ_REGIONS, nes_ucontext->first_free_wq);
1327                                        /* nes_debug(NES_DBG_QP, "find_first_zero_biton wqs returned %u\n",
1328                                                        nespd->mmap_db_index); */
1329                                        if (nesqp->mmap_sq_db_index >= NES_MAX_USER_WQ_REGIONS) {
1330                                                nes_debug(NES_DBG_QP,
1331                                                          "db index > max user regions, failing create QP\n");
1332                                                nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1333                                                if (virt_wqs) {
1334                                                        pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1335                                                                            nespbl->pbl_pbase);
1336                                                        kfree(nespbl);
1337                                                }
1338                                                kfree(nesqp->allocated_buffer);
1339                                                return ERR_PTR(-ENOMEM);
1340                                        }
1341                                        set_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
1342                                        nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = nesqp;
1343                                        nes_ucontext->first_free_wq = nesqp->mmap_sq_db_index + 1;
1344                                } else {
1345                                        nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1346                                        kfree(nesqp->allocated_buffer);
1347                                        return ERR_PTR(-EFAULT);
1348                                }
1349                        }
1350                        err = (!virt_wqs) ? nes_setup_mmap_qp(nesqp, nesvnic, sq_size, rq_size) :
1351                                        nes_setup_virt_qp(nesqp, nespbl, nesvnic, sq_size, rq_size);
1352                        if (err) {
1353                                nes_debug(NES_DBG_QP,
1354                                          "error geting qp mem code = %d\n", err);
1355                                nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1356                                kfree(nesqp->allocated_buffer);
1357                                return ERR_PTR(-ENOMEM);
1358                        }
1359
1360                        nesqp->hwqp.sq_size = sq_size;
1361                        nesqp->hwqp.sq_encoded_size = sq_encoded_size;
1362                        nesqp->hwqp.sq_head = 1;
1363                        nesqp->hwqp.rq_size = rq_size;
1364                        nesqp->hwqp.rq_encoded_size = rq_encoded_size;
1365                        /* nes_debug(NES_DBG_QP, "nesqp->nesqp_context_pbase = %p\n",
1366                                        (void *)nesqp->nesqp_context_pbase);
1367                        */
1368                        nesqp->hwqp.qp_id = qp_num;
1369                        nesqp->ibqp.qp_num = nesqp->hwqp.qp_id;
1370                        nesqp->nespd = nespd;
1371
1372                        nescq = to_nescq(init_attr->send_cq);
1373                        nesqp->nesscq = nescq;
1374                        nescq = to_nescq(init_attr->recv_cq);
1375                        nesqp->nesrcq = nescq;
1376
1377                        nesqp->nesqp_context->misc |= cpu_to_le32((u32)PCI_FUNC(nesdev->pcidev->devfn) <<
1378                                        NES_QPCONTEXT_MISC_PCI_FCN_SHIFT);
1379                        nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.rq_encoded_size <<
1380                                        NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT);
1381                        nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.sq_encoded_size <<
1382                                        NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT);
1383                        if (!udata) {
1384                                nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN);
1385                                nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN);
1386                        }
1387                        nesqp->nesqp_context->cqs = cpu_to_le32(nesqp->nesscq->hw_cq.cq_number +
1388                                        ((u32)nesqp->nesrcq->hw_cq.cq_number << 16));
1389                        u64temp = (u64)nesqp->hwqp.sq_pbase;
1390                        nesqp->nesqp_context->sq_addr_low = cpu_to_le32((u32)u64temp);
1391                        nesqp->nesqp_context->sq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1392
1393
1394                        if (!virt_wqs) {
1395                                u64temp = (u64)nesqp->hwqp.sq_pbase;
1396                                nesqp->nesqp_context->sq_addr_low = cpu_to_le32((u32)u64temp);
1397                                nesqp->nesqp_context->sq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1398                                u64temp = (u64)nesqp->hwqp.rq_pbase;
1399                                nesqp->nesqp_context->rq_addr_low = cpu_to_le32((u32)u64temp);
1400                                nesqp->nesqp_context->rq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1401                        } else {
1402                                u64temp = (u64)nesqp->pbl_pbase;
1403                                nesqp->nesqp_context->rq_addr_low = cpu_to_le32((u32)u64temp);
1404                                nesqp->nesqp_context->rq_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1405                        }
1406
1407                        /* nes_debug(NES_DBG_QP, "next_qp_nic_index=%u, using nic_index=%d\n",
1408                                        nesvnic->next_qp_nic_index,
1409                                        nesvnic->qp_nic_index[nesvnic->next_qp_nic_index]); */
1410                        spin_lock_irqsave(&nesdev->cqp.lock, flags);
1411                        nesqp->nesqp_context->misc2 |= cpu_to_le32(
1412                                        (u32)nesvnic->qp_nic_index[nesvnic->next_qp_nic_index] <<
1413                                        NES_QPCONTEXT_MISC2_NIC_INDEX_SHIFT);
1414                        nesvnic->next_qp_nic_index++;
1415                        if ((nesvnic->next_qp_nic_index > 3) ||
1416                                        (nesvnic->qp_nic_index[nesvnic->next_qp_nic_index] == 0xf)) {
1417                                nesvnic->next_qp_nic_index = 0;
1418                        }
1419                        spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
1420
1421                        nesqp->nesqp_context->pd_index_wscale |= cpu_to_le32((u32)nesqp->nespd->pd_id << 16);
1422                        u64temp = (u64)nesqp->hwqp.q2_pbase;
1423                        nesqp->nesqp_context->q2_addr_low = cpu_to_le32((u32)u64temp);
1424                        nesqp->nesqp_context->q2_addr_high = cpu_to_le32((u32)(u64temp >> 32));
1425                        nesqp->nesqp_context->aeq_token_low =  cpu_to_le32((u32)((unsigned long)(nesqp)));
1426                        nesqp->nesqp_context->aeq_token_high =  cpu_to_le32((u32)(upper_32_bits((unsigned long)(nesqp))));
1427                        nesqp->nesqp_context->ird_ord_sizes = cpu_to_le32(NES_QPCONTEXT_ORDIRD_ALSMM |
1428                                        ((((u32)nesadapter->max_irrq_wr) <<
1429                                        NES_QPCONTEXT_ORDIRD_IRDSIZE_SHIFT) & NES_QPCONTEXT_ORDIRD_IRDSIZE_MASK));
1430                        if (disable_mpa_crc) {
1431                                nes_debug(NES_DBG_QP, "Disabling MPA crc checking due to module option.\n");
1432                                nesqp->nesqp_context->ird_ord_sizes |= cpu_to_le32(NES_QPCONTEXT_ORDIRD_RNMC);
1433                        }
1434
1435
1436                        /* Create the QP */
1437                        cqp_request = nes_get_cqp_request(nesdev);
1438                        if (cqp_request == NULL) {
1439                                nes_debug(NES_DBG_QP, "Failed to get a cqp_request\n");
1440                                nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1441                                nes_free_qp_mem(nesdev, nesqp,virt_wqs);
1442                                kfree(nesqp->allocated_buffer);
1443                                return ERR_PTR(-ENOMEM);
1444                        }
1445                        cqp_request->waiting = 1;
1446                        cqp_wqe = &cqp_request->cqp_wqe;
1447
1448                        if (!virt_wqs) {
1449                                opcode = NES_CQP_CREATE_QP | NES_CQP_QP_TYPE_IWARP |
1450                                        NES_CQP_QP_IWARP_STATE_IDLE;
1451                        } else {
1452                                opcode = NES_CQP_CREATE_QP | NES_CQP_QP_TYPE_IWARP | NES_CQP_QP_VIRT_WQS |
1453                                        NES_CQP_QP_IWARP_STATE_IDLE;
1454                        }
1455                        opcode |= NES_CQP_QP_CQS_VALID;
1456                        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1457                        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
1458                        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX, nesqp->hwqp.qp_id);
1459
1460                        u64temp = (u64)nesqp->nesqp_context_pbase;
1461                        set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, u64temp);
1462
1463                        atomic_set(&cqp_request->refcount, 2);
1464                        nes_post_cqp_request(nesdev, cqp_request);
1465
1466                        /* Wait for CQP */
1467                        nes_debug(NES_DBG_QP, "Waiting for create iWARP QP%u to complete.\n",
1468                                        nesqp->hwqp.qp_id);
1469                        ret = wait_event_timeout(cqp_request->waitq,
1470                                        (cqp_request->request_done != 0), NES_EVENT_TIMEOUT);
1471                        nes_debug(NES_DBG_QP, "Create iwarp QP%u completed, wait_event_timeout ret=%u,"
1472                                        " nesdev->cqp_head = %u, nesdev->cqp.sq_tail = %u,"
1473                                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
1474                                        nesqp->hwqp.qp_id, ret, nesdev->cqp.sq_head, nesdev->cqp.sq_tail,
1475                                        cqp_request->major_code, cqp_request->minor_code);
1476                        if ((!ret) || (cqp_request->major_code)) {
1477                                nes_put_cqp_request(nesdev, cqp_request);
1478                                nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1479                                nes_free_qp_mem(nesdev, nesqp,virt_wqs);
1480                                kfree(nesqp->allocated_buffer);
1481                                if (!ret) {
1482                                        return ERR_PTR(-ETIME);
1483                                } else {
1484                                        return ERR_PTR(-EIO);
1485                                }
1486                        }
1487
1488                        nes_put_cqp_request(nesdev, cqp_request);
1489
1490                        if (ibpd->uobject) {
1491                                uresp.mmap_sq_db_index = nesqp->mmap_sq_db_index;
1492                                uresp.actual_sq_size = sq_size;
1493                                uresp.actual_rq_size = rq_size;
1494                                uresp.qp_id = nesqp->hwqp.qp_id;
1495                                uresp.nes_drv_opt = nes_drv_opt;
1496                                if (ib_copy_to_udata(udata, &uresp, sizeof uresp)) {
1497                                        nes_free_resource(nesadapter, nesadapter->allocated_qps, qp_num);
1498                                        nes_free_qp_mem(nesdev, nesqp,virt_wqs);
1499                                        kfree(nesqp->allocated_buffer);
1500                                        return ERR_PTR(-EFAULT);
1501                                }
1502                        }
1503
1504                        nes_debug(NES_DBG_QP, "QP%u structure located @%p.Size = %u.\n",
1505                                        nesqp->hwqp.qp_id, nesqp, (u32)sizeof(*nesqp));
1506                        spin_lock_init(&nesqp->lock);
1507                        init_waitqueue_head(&nesqp->state_waitq);
1508                        init_waitqueue_head(&nesqp->kick_waitq);
1509                        nes_add_ref(&nesqp->ibqp);
1510                        break;
1511                default:
1512                        nes_debug(NES_DBG_QP, "Invalid QP type: %d\n", init_attr->qp_type);
1513                        return ERR_PTR(-EINVAL);
1514        }
1515
1516        /* update the QP table */
1517        nesdev->nesadapter->qp_table[nesqp->hwqp.qp_id-NES_FIRST_QPN] = nesqp;
1518        nes_debug(NES_DBG_QP, "netdev refcnt=%u\n",
1519                        atomic_read(&nesvnic->netdev->refcnt));
1520
1521        return &nesqp->ibqp;
1522}
1523
1524
1525/**
1526 * nes_clean_cq
1527 */
1528static void nes_clean_cq(struct nes_qp *nesqp, struct nes_cq *nescq)
1529{
1530        u32 cq_head;
1531        u32 lo;
1532        u32 hi;
1533        u64 u64temp;
1534        unsigned long flags = 0;
1535
1536        spin_lock_irqsave(&nescq->lock, flags);
1537
1538        cq_head = nescq->hw_cq.cq_head;
1539        while (le32_to_cpu(nescq->hw_cq.cq_vbase[cq_head].cqe_words[NES_CQE_OPCODE_IDX]) & NES_CQE_VALID) {
1540                rmb();
1541                lo = le32_to_cpu(nescq->hw_cq.cq_vbase[cq_head].cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX]);
1542                hi = le32_to_cpu(nescq->hw_cq.cq_vbase[cq_head].cqe_words[NES_CQE_COMP_COMP_CTX_HIGH_IDX]);
1543                u64temp = (((u64)hi) << 32) | ((u64)lo);
1544                u64temp &= ~(NES_SW_CONTEXT_ALIGN-1);
1545                if (u64temp == (u64)(unsigned long)nesqp) {
1546                        /* Zero the context value so cqe will be ignored */
1547                        nescq->hw_cq.cq_vbase[cq_head].cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX] = 0;
1548                        nescq->hw_cq.cq_vbase[cq_head].cqe_words[NES_CQE_COMP_COMP_CTX_HIGH_IDX] = 0;
1549                }
1550
1551                if (++cq_head >= nescq->hw_cq.cq_size)
1552                        cq_head = 0;
1553        }
1554
1555        spin_unlock_irqrestore(&nescq->lock, flags);
1556}
1557
1558
1559/**
1560 * nes_destroy_qp
1561 */
1562static int nes_destroy_qp(struct ib_qp *ibqp)
1563{
1564        struct nes_qp *nesqp = to_nesqp(ibqp);
1565        struct nes_ucontext *nes_ucontext;
1566        struct ib_qp_attr attr;
1567        struct iw_cm_id *cm_id;
1568        struct iw_cm_event cm_event;
1569        int ret;
1570
1571        atomic_inc(&sw_qps_destroyed);
1572        nesqp->destroyed = 1;
1573
1574        /* Blow away the connection if it exists. */
1575        if (nesqp->ibqp_state >= IB_QPS_INIT && nesqp->ibqp_state <= IB_QPS_RTS) {
1576                /* if (nesqp->ibqp_state == IB_QPS_RTS) { */
1577                attr.qp_state = IB_QPS_ERR;
1578                nes_modify_qp(&nesqp->ibqp, &attr, IB_QP_STATE, NULL);
1579        }
1580
1581        if (((nesqp->ibqp_state == IB_QPS_INIT) ||
1582                        (nesqp->ibqp_state == IB_QPS_RTR)) && (nesqp->cm_id)) {
1583                cm_id = nesqp->cm_id;
1584                cm_event.event = IW_CM_EVENT_CONNECT_REPLY;
1585                cm_event.status = IW_CM_EVENT_STATUS_TIMEOUT;
1586                cm_event.local_addr = cm_id->local_addr;
1587                cm_event.remote_addr = cm_id->remote_addr;
1588                cm_event.private_data = NULL;
1589                cm_event.private_data_len = 0;
1590
1591                nes_debug(NES_DBG_QP, "Generating a CM Timeout Event for "
1592                                "QP%u. cm_id = %p, refcount = %u. \n",
1593                                nesqp->hwqp.qp_id, cm_id, atomic_read(&nesqp->refcount));
1594
1595                cm_id->rem_ref(cm_id);
1596                ret = cm_id->event_handler(cm_id, &cm_event);
1597                if (ret)
1598                        nes_debug(NES_DBG_QP, "OFA CM event_handler returned, ret=%d\n", ret);
1599        }
1600
1601        if (nesqp->user_mode) {
1602                if ((ibqp->uobject)&&(ibqp->uobject->context)) {
1603                        nes_ucontext = to_nesucontext(ibqp->uobject->context);
1604                        clear_bit(nesqp->mmap_sq_db_index, nes_ucontext->allocated_wqs);
1605                        nes_ucontext->mmap_nesqp[nesqp->mmap_sq_db_index] = NULL;
1606                        if (nes_ucontext->first_free_wq > nesqp->mmap_sq_db_index) {
1607                                nes_ucontext->first_free_wq = nesqp->mmap_sq_db_index;
1608                        }
1609                }
1610                if (nesqp->pbl_pbase)
1611                        kunmap(nesqp->page);
1612        } else {
1613                /* Clean any pending completions from the cq(s) */
1614                if (nesqp->nesscq)
1615                        nes_clean_cq(nesqp, nesqp->nesscq);
1616
1617                if ((nesqp->nesrcq) && (nesqp->nesrcq != nesqp->nesscq))
1618                        nes_clean_cq(nesqp, nesqp->nesrcq);
1619        }
1620
1621        nes_rem_ref(&nesqp->ibqp);
1622        return 0;
1623}
1624
1625
1626/**
1627 * nes_create_cq
1628 */
1629static struct ib_cq *nes_create_cq(struct ib_device *ibdev, int entries,
1630                int comp_vector,
1631                struct ib_ucontext *context, struct ib_udata *udata)
1632{
1633        u64 u64temp;
1634        struct nes_vnic *nesvnic = to_nesvnic(ibdev);
1635        struct nes_device *nesdev = nesvnic->nesdev;
1636        struct nes_adapter *nesadapter = nesdev->nesadapter;
1637        struct nes_cq *nescq;
1638        struct nes_ucontext *nes_ucontext = NULL;
1639        struct nes_cqp_request *cqp_request;
1640        void *mem = NULL;
1641        struct nes_hw_cqp_wqe *cqp_wqe;
1642        struct nes_pbl *nespbl = NULL;
1643        struct nes_create_cq_req req;
1644        struct nes_create_cq_resp resp;
1645        u32 cq_num = 0;
1646        u32 opcode = 0;
1647        u32 pbl_entries = 1;
1648        int err;
1649        unsigned long flags;
1650        int ret;
1651
1652        err = nes_alloc_resource(nesadapter, nesadapter->allocated_cqs,
1653                        nesadapter->max_cq, &cq_num, &nesadapter->next_cq);
1654        if (err) {
1655                return ERR_PTR(err);
1656        }
1657
1658        nescq = kzalloc(sizeof(struct nes_cq), GFP_KERNEL);
1659        if (!nescq) {
1660                nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1661                nes_debug(NES_DBG_CQ, "Unable to allocate nes_cq struct\n");
1662                return ERR_PTR(-ENOMEM);
1663        }
1664
1665        nescq->hw_cq.cq_size = max(entries + 1, 5);
1666        nescq->hw_cq.cq_number = cq_num;
1667        nescq->ibcq.cqe = nescq->hw_cq.cq_size - 1;
1668
1669
1670        if (context) {
1671                nes_ucontext = to_nesucontext(context);
1672                if (ib_copy_from_udata(&req, udata, sizeof (struct nes_create_cq_req))) {
1673                        nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1674                        kfree(nescq);
1675                        return ERR_PTR(-EFAULT);
1676                }
1677                nesvnic->mcrq_ucontext = nes_ucontext;
1678                nes_ucontext->mcrqf = req.mcrqf;
1679                if (nes_ucontext->mcrqf) {
1680                        if (nes_ucontext->mcrqf & 0x80000000)
1681                                nescq->hw_cq.cq_number = nesvnic->nic.qp_id + 28 + 2 * ((nes_ucontext->mcrqf & 0xf) - 1);
1682                        else if (nes_ucontext->mcrqf & 0x40000000)
1683                                nescq->hw_cq.cq_number = nes_ucontext->mcrqf & 0xffff;
1684                        else
1685                                nescq->hw_cq.cq_number = nesvnic->mcrq_qp_id + nes_ucontext->mcrqf-1;
1686                        nescq->mcrqf = nes_ucontext->mcrqf;
1687                        nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1688                }
1689                nes_debug(NES_DBG_CQ, "CQ Virtual Address = %08lX, size = %u.\n",
1690                                (unsigned long)req.user_cq_buffer, entries);
1691                err = 1;
1692                list_for_each_entry(nespbl, &nes_ucontext->cq_reg_mem_list, list) {
1693                        if (nespbl->user_base == (unsigned long )req.user_cq_buffer) {
1694                                list_del(&nespbl->list);
1695                                err = 0;
1696                                nes_debug(NES_DBG_CQ, "Found PBL for virtual CQ. nespbl=%p.\n",
1697                                                nespbl);
1698                                break;
1699                        }
1700                }
1701                if (err) {
1702                        nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1703                        kfree(nescq);
1704                        return ERR_PTR(-EFAULT);
1705                }
1706
1707                pbl_entries = nespbl->pbl_size >> 3;
1708                nescq->cq_mem_size = 0;
1709        } else {
1710                nescq->cq_mem_size = nescq->hw_cq.cq_size * sizeof(struct nes_hw_cqe);
1711                nes_debug(NES_DBG_CQ, "Attempting to allocate pci memory (%u entries, %u bytes) for CQ%u.\n",
1712                                entries, nescq->cq_mem_size, nescq->hw_cq.cq_number);
1713
1714                /* allocate the physical buffer space */
1715                mem = pci_alloc_consistent(nesdev->pcidev, nescq->cq_mem_size,
1716                                &nescq->hw_cq.cq_pbase);
1717                if (!mem) {
1718                        printk(KERN_ERR PFX "Unable to allocate pci memory for cq\n");
1719                        nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1720                        kfree(nescq);
1721                        return ERR_PTR(-ENOMEM);
1722                }
1723
1724                memset(mem, 0, nescq->cq_mem_size);
1725                nescq->hw_cq.cq_vbase = mem;
1726                nescq->hw_cq.cq_head = 0;
1727                nes_debug(NES_DBG_CQ, "CQ%u virtual address @ %p, phys = 0x%08X\n",
1728                                nescq->hw_cq.cq_number, nescq->hw_cq.cq_vbase,
1729                                (u32)nescq->hw_cq.cq_pbase);
1730        }
1731
1732        nescq->hw_cq.ce_handler = nes_iwarp_ce_handler;
1733        spin_lock_init(&nescq->lock);
1734
1735        /* send CreateCQ request to CQP */
1736        cqp_request = nes_get_cqp_request(nesdev);
1737        if (cqp_request == NULL) {
1738                nes_debug(NES_DBG_CQ, "Failed to get a cqp_request.\n");
1739                if (!context)
1740                        pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1741                                        nescq->hw_cq.cq_pbase);
1742                else {
1743                        pci_free_consistent(nesdev->pcidev, nespbl->pbl_size,
1744                                            nespbl->pbl_vbase, nespbl->pbl_pbase);
1745                        kfree(nespbl);
1746                }
1747
1748                nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1749                kfree(nescq);
1750                return ERR_PTR(-ENOMEM);
1751        }
1752        cqp_request->waiting = 1;
1753        cqp_wqe = &cqp_request->cqp_wqe;
1754
1755        opcode = NES_CQP_CREATE_CQ | NES_CQP_CQ_CEQ_VALID |
1756                        NES_CQP_CQ_CHK_OVERFLOW |
1757                        NES_CQP_CQ_CEQE_MASK | ((u32)nescq->hw_cq.cq_size << 16);
1758
1759        spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1760
1761        if (pbl_entries != 1) {
1762                if (pbl_entries > 32) {
1763                        /* use 4k pbl */
1764                        nes_debug(NES_DBG_CQ, "pbl_entries=%u, use a 4k PBL\n", pbl_entries);
1765                        if (nesadapter->free_4kpbl == 0) {
1766                                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1767                                nes_free_cqp_request(nesdev, cqp_request);
1768                                if (!context)
1769                                        pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1770                                                        nescq->hw_cq.cq_pbase);
1771                                else {
1772                                        pci_free_consistent(nesdev->pcidev, nespbl->pbl_size,
1773                                                            nespbl->pbl_vbase, nespbl->pbl_pbase);
1774                                        kfree(nespbl);
1775                                }
1776                                nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1777                                kfree(nescq);
1778                                return ERR_PTR(-ENOMEM);
1779                        } else {
1780                                opcode |= (NES_CQP_CQ_VIRT | NES_CQP_CQ_4KB_CHUNK);
1781                                nescq->virtual_cq = 2;
1782                                nesadapter->free_4kpbl--;
1783                        }
1784                } else {
1785                        /* use 256 byte pbl */
1786                        nes_debug(NES_DBG_CQ, "pbl_entries=%u, use a 256 byte PBL\n", pbl_entries);
1787                        if (nesadapter->free_256pbl == 0) {
1788                                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1789                                nes_free_cqp_request(nesdev, cqp_request);
1790                                if (!context)
1791                                        pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1792                                                        nescq->hw_cq.cq_pbase);
1793                                else {
1794                                        pci_free_consistent(nesdev->pcidev, nespbl->pbl_size,
1795                                                            nespbl->pbl_vbase, nespbl->pbl_pbase);
1796                                        kfree(nespbl);
1797                                }
1798                                nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1799                                kfree(nescq);
1800                                return ERR_PTR(-ENOMEM);
1801                        } else {
1802                                opcode |= NES_CQP_CQ_VIRT;
1803                                nescq->virtual_cq = 1;
1804                                nesadapter->free_256pbl--;
1805                        }
1806                }
1807        }
1808
1809        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1810
1811        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1812        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
1813        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
1814                        (nescq->hw_cq.cq_number | ((u32)nesdev->ceq_index << 16)));
1815
1816        if (context) {
1817                if (pbl_entries != 1)
1818                        u64temp = (u64)nespbl->pbl_pbase;
1819                else
1820                        u64temp = le64_to_cpu(nespbl->pbl_vbase[0]);
1821                set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX,
1822                                nes_ucontext->mmap_db_index[0]);
1823        } else {
1824                u64temp = (u64)nescq->hw_cq.cq_pbase;
1825                cqp_wqe->wqe_words[NES_CQP_CQ_WQE_DOORBELL_INDEX_HIGH_IDX] = 0;
1826        }
1827        set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_CQ_WQE_PBL_LOW_IDX, u64temp);
1828        cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] = 0;
1829        u64temp = (u64)(unsigned long)&nescq->hw_cq;
1830        cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_LOW_IDX] =
1831                        cpu_to_le32((u32)(u64temp >> 1));
1832        cqp_wqe->wqe_words[NES_CQP_CQ_WQE_CQ_CONTEXT_HIGH_IDX] =
1833                        cpu_to_le32(((u32)((u64temp) >> 33)) & 0x7FFFFFFF);
1834
1835        atomic_set(&cqp_request->refcount, 2);
1836        nes_post_cqp_request(nesdev, cqp_request);
1837
1838        /* Wait for CQP */
1839        nes_debug(NES_DBG_CQ, "Waiting for create iWARP CQ%u to complete.\n",
1840                        nescq->hw_cq.cq_number);
1841        ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
1842                        NES_EVENT_TIMEOUT * 2);
1843        nes_debug(NES_DBG_CQ, "Create iWARP CQ%u completed, wait_event_timeout ret = %d.\n",
1844                        nescq->hw_cq.cq_number, ret);
1845        if ((!ret) || (cqp_request->major_code)) {
1846                nes_put_cqp_request(nesdev, cqp_request);
1847                if (!context)
1848                        pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size, mem,
1849                                        nescq->hw_cq.cq_pbase);
1850                else {
1851                        pci_free_consistent(nesdev->pcidev, nespbl->pbl_size,
1852                                            nespbl->pbl_vbase, nespbl->pbl_pbase);
1853                        kfree(nespbl);
1854                }
1855                nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1856                kfree(nescq);
1857                return ERR_PTR(-EIO);
1858        }
1859        nes_put_cqp_request(nesdev, cqp_request);
1860
1861        if (context) {
1862                /* free the nespbl */
1863                pci_free_consistent(nesdev->pcidev, nespbl->pbl_size, nespbl->pbl_vbase,
1864                                nespbl->pbl_pbase);
1865                kfree(nespbl);
1866                resp.cq_id = nescq->hw_cq.cq_number;
1867                resp.cq_size = nescq->hw_cq.cq_size;
1868                resp.mmap_db_index = 0;
1869                if (ib_copy_to_udata(udata, &resp, sizeof resp)) {
1870                        nes_free_resource(nesadapter, nesadapter->allocated_cqs, cq_num);
1871                        kfree(nescq);
1872                        return ERR_PTR(-EFAULT);
1873                }
1874        }
1875
1876        return &nescq->ibcq;
1877}
1878
1879
1880/**
1881 * nes_destroy_cq
1882 */
1883static int nes_destroy_cq(struct ib_cq *ib_cq)
1884{
1885        struct nes_cq *nescq;
1886        struct nes_device *nesdev;
1887        struct nes_vnic *nesvnic;
1888        struct nes_adapter *nesadapter;
1889        struct nes_hw_cqp_wqe *cqp_wqe;
1890        struct nes_cqp_request *cqp_request;
1891        unsigned long flags;
1892        u32 opcode = 0;
1893        int ret;
1894
1895        if (ib_cq == NULL)
1896                return 0;
1897
1898        nescq = to_nescq(ib_cq);
1899        nesvnic = to_nesvnic(ib_cq->device);
1900        nesdev = nesvnic->nesdev;
1901        nesadapter = nesdev->nesadapter;
1902
1903        nes_debug(NES_DBG_CQ, "Destroy CQ%u\n", nescq->hw_cq.cq_number);
1904
1905        /* Send DestroyCQ request to CQP */
1906        cqp_request = nes_get_cqp_request(nesdev);
1907        if (cqp_request == NULL) {
1908                nes_debug(NES_DBG_CQ, "Failed to get a cqp_request.\n");
1909                return -ENOMEM;
1910        }
1911        cqp_request->waiting = 1;
1912        cqp_wqe = &cqp_request->cqp_wqe;
1913        opcode = NES_CQP_DESTROY_CQ | (nescq->hw_cq.cq_size << 16);
1914        spin_lock_irqsave(&nesadapter->pbl_lock, flags);
1915        if (nescq->virtual_cq == 1) {
1916                nesadapter->free_256pbl++;
1917                if (nesadapter->free_256pbl > nesadapter->max_256pbl) {
1918                        printk(KERN_ERR PFX "%s: free 256B PBLs(%u) has exceeded the max(%u)\n",
1919                                        __func__, nesadapter->free_256pbl, nesadapter->max_256pbl);
1920                }
1921        } else if (nescq->virtual_cq == 2) {
1922                nesadapter->free_4kpbl++;
1923                if (nesadapter->free_4kpbl > nesadapter->max_4kpbl) {
1924                        printk(KERN_ERR PFX "%s: free 4K PBLs(%u) has exceeded the max(%u)\n",
1925                                        __func__, nesadapter->free_4kpbl, nesadapter->max_4kpbl);
1926                }
1927                opcode |= NES_CQP_CQ_4KB_CHUNK;
1928        }
1929
1930        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
1931
1932        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
1933        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
1934        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX,
1935                (nescq->hw_cq.cq_number | ((u32)PCI_FUNC(nesdev->pcidev->devfn) << 16)));
1936        if (!nescq->mcrqf)
1937                nes_free_resource(nesadapter, nesadapter->allocated_cqs, nescq->hw_cq.cq_number);
1938
1939        atomic_set(&cqp_request->refcount, 2);
1940        nes_post_cqp_request(nesdev, cqp_request);
1941
1942        /* Wait for CQP */
1943        nes_debug(NES_DBG_CQ, "Waiting for destroy iWARP CQ%u to complete.\n",
1944                        nescq->hw_cq.cq_number);
1945        ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
1946                        NES_EVENT_TIMEOUT);
1947        nes_debug(NES_DBG_CQ, "Destroy iWARP CQ%u completed, wait_event_timeout ret = %u,"
1948                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
1949                        nescq->hw_cq.cq_number, ret, cqp_request->major_code,
1950                        cqp_request->minor_code);
1951        if (!ret) {
1952                nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy timeout expired\n",
1953                                        nescq->hw_cq.cq_number);
1954                ret = -ETIME;
1955        } else if (cqp_request->major_code) {
1956                nes_debug(NES_DBG_CQ, "iWARP CQ%u destroy failed\n",
1957                                        nescq->hw_cq.cq_number);
1958                ret = -EIO;
1959        } else {
1960                ret = 0;
1961        }
1962        nes_put_cqp_request(nesdev, cqp_request);
1963
1964        if (nescq->cq_mem_size)
1965                pci_free_consistent(nesdev->pcidev, nescq->cq_mem_size,
1966                                    nescq->hw_cq.cq_vbase, nescq->hw_cq.cq_pbase);
1967        kfree(nescq);
1968
1969        return ret;
1970}
1971
1972/**
1973 * root_256
1974 */
1975static u32 root_256(struct nes_device *nesdev,
1976                    struct nes_root_vpbl *root_vpbl,
1977                    struct nes_root_vpbl *new_root,
1978                    u16 pbl_count_4k)
1979{
1980        u64 leaf_pbl;
1981        int i, j, k;
1982
1983        if (pbl_count_4k == 1) {
1984                new_root->pbl_vbase = pci_alloc_consistent(nesdev->pcidev,
1985                                                512, &new_root->pbl_pbase);
1986
1987                if (new_root->pbl_vbase == NULL)
1988                        return 0;
1989
1990                leaf_pbl = (u64)root_vpbl->pbl_pbase;
1991                for (i = 0; i < 16; i++) {
1992                        new_root->pbl_vbase[i].pa_low =
1993                                cpu_to_le32((u32)leaf_pbl);
1994                        new_root->pbl_vbase[i].pa_high =
1995                                cpu_to_le32((u32)((((u64)leaf_pbl) >> 32)));
1996                        leaf_pbl += 256;
1997                }
1998        } else {
1999                for (i = 3; i >= 0; i--) {
2000                        j = i * 16;
2001                        root_vpbl->pbl_vbase[j] = root_vpbl->pbl_vbase[i];
2002                        leaf_pbl = le32_to_cpu(root_vpbl->pbl_vbase[j].pa_low) +
2003                            (((u64)le32_to_cpu(root_vpbl->pbl_vbase[j].pa_high))
2004                                << 32);
2005                        for (k = 1; k < 16; k++) {
2006                                leaf_pbl += 256;
2007                                root_vpbl->pbl_vbase[j + k].pa_low =
2008                                                cpu_to_le32((u32)leaf_pbl);
2009                                root_vpbl->pbl_vbase[j + k].pa_high =
2010                                    cpu_to_le32((u32)((((u64)leaf_pbl) >> 32)));
2011                        }
2012                }
2013        }
2014
2015        return 1;
2016}
2017
2018
2019/**
2020 * nes_reg_mr
2021 */
2022static int nes_reg_mr(struct nes_device *nesdev, struct nes_pd *nespd,
2023                u32 stag, u64 region_length, struct nes_root_vpbl *root_vpbl,
2024                dma_addr_t single_buffer, u16 pbl_count_4k,
2025                u16 residual_page_count_4k, int acc, u64 *iova_start,
2026                u16 *actual_pbl_cnt, u8 *used_4k_pbls)
2027{
2028        struct nes_hw_cqp_wqe *cqp_wqe;
2029        struct nes_cqp_request *cqp_request;
2030        unsigned long flags;
2031        int ret;
2032        struct nes_adapter *nesadapter = nesdev->nesadapter;
2033        uint pg_cnt = 0;
2034        u16 pbl_count_256 = 0;
2035        u16 pbl_count = 0;
2036        u8  use_256_pbls = 0;
2037        u8  use_4k_pbls = 0;
2038        u16 use_two_level = (pbl_count_4k > 1) ? 1 : 0;
2039        struct nes_root_vpbl new_root = {0, 0, 0};
2040        u32 opcode = 0;
2041        u16 major_code;
2042
2043        /* Register the region with the adapter */
2044        cqp_request = nes_get_cqp_request(nesdev);
2045        if (cqp_request == NULL) {
2046                nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
2047                return -ENOMEM;
2048        }
2049        cqp_request->waiting = 1;
2050        cqp_wqe = &cqp_request->cqp_wqe;
2051
2052        if (pbl_count_4k) {
2053                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
2054
2055                pg_cnt = ((pbl_count_4k - 1) * 512) + residual_page_count_4k;
2056                pbl_count_256 = (pg_cnt + 31) / 32;
2057                if (pg_cnt <= 32) {
2058                        if (pbl_count_256 <= nesadapter->free_256pbl)
2059                                use_256_pbls = 1;
2060                        else if (pbl_count_4k <= nesadapter->free_4kpbl)
2061                                use_4k_pbls = 1;
2062                } else if (pg_cnt <= 2048) {
2063                        if (((pbl_count_4k + use_two_level) <= nesadapter->free_4kpbl) &&
2064                            (nesadapter->free_4kpbl > (nesadapter->max_4kpbl >> 1))) {
2065                                use_4k_pbls = 1;
2066                        } else if ((pbl_count_256 + 1) <= nesadapter->free_256pbl) {
2067                                use_256_pbls = 1;
2068                                use_two_level = 1;
2069                        } else if ((pbl_count_4k + use_two_level) <= nesadapter->free_4kpbl) {
2070                                use_4k_pbls = 1;
2071                        }
2072                } else {
2073                        if ((pbl_count_4k + 1) <= nesadapter->free_4kpbl)
2074                                use_4k_pbls = 1;
2075                }
2076
2077                if (use_256_pbls) {
2078                        pbl_count = pbl_count_256;
2079                        nesadapter->free_256pbl -= pbl_count + use_two_level;
2080                } else if (use_4k_pbls) {
2081                        pbl_count =  pbl_count_4k;
2082                        nesadapter->free_4kpbl -= pbl_count + use_two_level;
2083                } else {
2084                        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2085                        nes_debug(NES_DBG_MR, "Out of Pbls\n");
2086                        nes_free_cqp_request(nesdev, cqp_request);
2087                        return -ENOMEM;
2088                }
2089
2090                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2091        }
2092
2093        if (use_256_pbls && use_two_level) {
2094                if (root_256(nesdev, root_vpbl, &new_root, pbl_count_4k) == 1) {
2095                        if (new_root.pbl_pbase != 0)
2096                                root_vpbl = &new_root;
2097                } else {
2098                        spin_lock_irqsave(&nesadapter->pbl_lock, flags);
2099                        nesadapter->free_256pbl += pbl_count_256 + use_two_level;
2100                        use_256_pbls = 0;
2101
2102                        if (pbl_count_4k == 1)
2103                                use_two_level = 0;
2104                        pbl_count = pbl_count_4k;
2105
2106                        if ((pbl_count_4k + use_two_level) <= nesadapter->free_4kpbl) {
2107                                nesadapter->free_4kpbl -= pbl_count + use_two_level;
2108                                use_4k_pbls = 1;
2109                        }
2110                        spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2111
2112                        if (use_4k_pbls == 0)
2113                                return -ENOMEM;
2114                }
2115        }
2116
2117        opcode = NES_CQP_REGISTER_STAG | NES_CQP_STAG_RIGHTS_LOCAL_READ |
2118                                        NES_CQP_STAG_VA_TO | NES_CQP_STAG_MR;
2119        if (acc & IB_ACCESS_LOCAL_WRITE)
2120                opcode |= NES_CQP_STAG_RIGHTS_LOCAL_WRITE;
2121        if (acc & IB_ACCESS_REMOTE_WRITE)
2122                opcode |= NES_CQP_STAG_RIGHTS_REMOTE_WRITE | NES_CQP_STAG_REM_ACC_EN;
2123        if (acc & IB_ACCESS_REMOTE_READ)
2124                opcode |= NES_CQP_STAG_RIGHTS_REMOTE_READ | NES_CQP_STAG_REM_ACC_EN;
2125        if (acc & IB_ACCESS_MW_BIND)
2126                opcode |= NES_CQP_STAG_RIGHTS_WINDOW_BIND | NES_CQP_STAG_REM_ACC_EN;
2127
2128        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2129        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX, opcode);
2130        set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_VA_LOW_IDX, *iova_start);
2131        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_LEN_LOW_IDX, region_length);
2132
2133        cqp_wqe->wqe_words[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX] =
2134                        cpu_to_le32((u32)(region_length >> 8) & 0xff000000);
2135        cqp_wqe->wqe_words[NES_CQP_STAG_WQE_LEN_HIGH_PD_IDX] |=
2136                        cpu_to_le32(nespd->pd_id & 0x00007fff);
2137        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, stag);
2138
2139        if (pbl_count == 0) {
2140                set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PA_LOW_IDX, single_buffer);
2141        } else {
2142                set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PA_LOW_IDX, root_vpbl->pbl_pbase);
2143                set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PBL_BLK_COUNT_IDX, pbl_count);
2144                set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_PBL_LEN_IDX, (pg_cnt * 8));
2145
2146                if (use_4k_pbls)
2147                        cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX] |= cpu_to_le32(NES_CQP_STAG_PBL_BLK_SIZE);
2148        }
2149        barrier();
2150
2151        atomic_set(&cqp_request->refcount, 2);
2152        nes_post_cqp_request(nesdev, cqp_request);
2153
2154        /* Wait for CQP */
2155        ret = wait_event_timeout(cqp_request->waitq, (0 != cqp_request->request_done),
2156                        NES_EVENT_TIMEOUT);
2157        nes_debug(NES_DBG_MR, "Register STag 0x%08X completed, wait_event_timeout ret = %u,"
2158                        " CQP Major:Minor codes = 0x%04X:0x%04X.\n",
2159                        stag, ret, cqp_request->major_code, cqp_request->minor_code);
2160        major_code = cqp_request->major_code;
2161        nes_put_cqp_request(nesdev, cqp_request);
2162
2163        if ((!ret || major_code) && pbl_count != 0) {
2164                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
2165                if (use_256_pbls)
2166                        nesadapter->free_256pbl += pbl_count + use_two_level;
2167                else if (use_4k_pbls)
2168                        nesadapter->free_4kpbl += pbl_count + use_two_level;
2169                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2170        }
2171        if (new_root.pbl_pbase)
2172                pci_free_consistent(nesdev->pcidev, 512, new_root.pbl_vbase,
2173                                    new_root.pbl_pbase);
2174
2175        if (!ret)
2176                return -ETIME;
2177        else if (major_code)
2178                return -EIO;
2179
2180        *actual_pbl_cnt = pbl_count + use_two_level;
2181        *used_4k_pbls = use_4k_pbls;
2182        return 0;
2183}
2184
2185
2186/**
2187 * nes_reg_phys_mr
2188 */
2189static struct ib_mr *nes_reg_phys_mr(struct ib_pd *ib_pd,
2190                struct ib_phys_buf *buffer_list, int num_phys_buf, int acc,
2191                u64 * iova_start)
2192{
2193        u64 region_length;
2194        struct nes_pd *nespd = to_nespd(ib_pd);
2195        struct nes_vnic *nesvnic = to_nesvnic(ib_pd->device);
2196        struct nes_device *nesdev = nesvnic->nesdev;
2197        struct nes_adapter *nesadapter = nesdev->nesadapter;
2198        struct nes_mr *nesmr;
2199        struct ib_mr *ibmr;
2200        struct nes_vpbl vpbl;
2201        struct nes_root_vpbl root_vpbl;
2202        u32 stag;
2203        u32 i;
2204        unsigned long mask;
2205        u32 stag_index = 0;
2206        u32 next_stag_index = 0;
2207        u32 driver_key = 0;
2208        u32 root_pbl_index = 0;
2209        u32 cur_pbl_index = 0;
2210        int err = 0, pbl_depth = 0;
2211        int ret = 0;
2212        u16 pbl_count = 0;
2213        u8 single_page = 1;
2214        u8 stag_key = 0;
2215
2216        pbl_depth = 0;
2217        region_length = 0;
2218        vpbl.pbl_vbase = NULL;
2219        root_vpbl.pbl_vbase = NULL;
2220        root_vpbl.pbl_pbase = 0;
2221
2222        get_random_bytes(&next_stag_index, sizeof(next_stag_index));
2223        stag_key = (u8)next_stag_index;
2224
2225        driver_key = 0;
2226
2227        next_stag_index >>= 8;
2228        next_stag_index %= nesadapter->max_mr;
2229        if (num_phys_buf > (1024*512)) {
2230                return ERR_PTR(-E2BIG);
2231        }
2232
2233        if ((buffer_list[0].addr ^ *iova_start) & ~PAGE_MASK)
2234                return ERR_PTR(-EINVAL);
2235
2236        err = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs, nesadapter->max_mr,
2237                        &stag_index, &next_stag_index);
2238        if (err) {
2239                return ERR_PTR(err);
2240        }
2241
2242        nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
2243        if (!nesmr) {
2244                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2245                return ERR_PTR(-ENOMEM);
2246        }
2247
2248        for (i = 0; i < num_phys_buf; i++) {
2249
2250                if ((i & 0x01FF) == 0) {
2251                        if (root_pbl_index == 1) {
2252                                /* Allocate the root PBL */
2253                                root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 8192,
2254                                                &root_vpbl.pbl_pbase);
2255                                nes_debug(NES_DBG_MR, "Allocating root PBL, va = %p, pa = 0x%08X\n",
2256                                                root_vpbl.pbl_vbase, (unsigned int)root_vpbl.pbl_pbase);
2257                                if (!root_vpbl.pbl_vbase) {
2258                                        pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2259                                                        vpbl.pbl_pbase);
2260                                        nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2261                                        kfree(nesmr);
2262                                        return ERR_PTR(-ENOMEM);
2263                                }
2264                                root_vpbl.leaf_vpbl = kzalloc(sizeof(*root_vpbl.leaf_vpbl)*1024, GFP_KERNEL);
2265                                if (!root_vpbl.leaf_vpbl) {
2266                                        pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2267                                                        root_vpbl.pbl_pbase);
2268                                        pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2269                                                        vpbl.pbl_pbase);
2270                                        nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2271                                        kfree(nesmr);
2272                                        return ERR_PTR(-ENOMEM);
2273                                }
2274                                root_vpbl.pbl_vbase[0].pa_low = cpu_to_le32((u32)vpbl.pbl_pbase);
2275                                root_vpbl.pbl_vbase[0].pa_high =
2276                                                cpu_to_le32((u32)((((u64)vpbl.pbl_pbase) >> 32)));
2277                                root_vpbl.leaf_vpbl[0] = vpbl;
2278                        }
2279                        /* Allocate a 4K buffer for the PBL */
2280                        vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
2281                                        &vpbl.pbl_pbase);
2282                        nes_debug(NES_DBG_MR, "Allocating leaf PBL, va = %p, pa = 0x%016lX\n",
2283                                        vpbl.pbl_vbase, (unsigned long)vpbl.pbl_pbase);
2284                        if (!vpbl.pbl_vbase) {
2285                                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2286                                ibmr = ERR_PTR(-ENOMEM);
2287                                kfree(nesmr);
2288                                goto reg_phys_err;
2289                        }
2290                        /* Fill in the root table */
2291                        if (1 <= root_pbl_index) {
2292                                root_vpbl.pbl_vbase[root_pbl_index].pa_low =
2293                                                cpu_to_le32((u32)vpbl.pbl_pbase);
2294                                root_vpbl.pbl_vbase[root_pbl_index].pa_high =
2295                                                cpu_to_le32((u32)((((u64)vpbl.pbl_pbase) >> 32)));
2296                                root_vpbl.leaf_vpbl[root_pbl_index] = vpbl;
2297                        }
2298                        root_pbl_index++;
2299                        cur_pbl_index = 0;
2300                }
2301
2302                mask = !buffer_list[i].size;
2303                if (i != 0)
2304                        mask |= buffer_list[i].addr;
2305                if (i != num_phys_buf - 1)
2306                        mask |= buffer_list[i].addr + buffer_list[i].size;
2307
2308                if (mask & ~PAGE_MASK) {
2309                        nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2310                        nes_debug(NES_DBG_MR, "Invalid buffer addr or size\n");
2311                        ibmr = ERR_PTR(-EINVAL);
2312                        kfree(nesmr);
2313                        goto reg_phys_err;
2314                }
2315
2316                region_length += buffer_list[i].size;
2317                if ((i != 0) && (single_page)) {
2318                        if ((buffer_list[i-1].addr+PAGE_SIZE) != buffer_list[i].addr)
2319                                single_page = 0;
2320                }
2321                vpbl.pbl_vbase[cur_pbl_index].pa_low = cpu_to_le32((u32)buffer_list[i].addr & PAGE_MASK);
2322                vpbl.pbl_vbase[cur_pbl_index++].pa_high =
2323                                cpu_to_le32((u32)((((u64)buffer_list[i].addr) >> 32)));
2324        }
2325
2326        stag = stag_index << 8;
2327        stag |= driver_key;
2328        stag += (u32)stag_key;
2329
2330        nes_debug(NES_DBG_MR, "Registering STag 0x%08X, VA = 0x%016lX,"
2331                        " length = 0x%016lX, index = 0x%08X\n",
2332                        stag, (unsigned long)*iova_start, (unsigned long)region_length, stag_index);
2333
2334        /* Make the leaf PBL the root if only one PBL */
2335        if (root_pbl_index == 1) {
2336                root_vpbl.pbl_pbase = vpbl.pbl_pbase;
2337        }
2338
2339        if (single_page) {
2340                pbl_count = 0;
2341        } else {
2342                pbl_count = root_pbl_index;
2343        }
2344        ret = nes_reg_mr(nesdev, nespd, stag, region_length, &root_vpbl,
2345                        buffer_list[0].addr, pbl_count, (u16)cur_pbl_index, acc, iova_start,
2346                        &nesmr->pbls_used, &nesmr->pbl_4k);
2347
2348        if (ret == 0) {
2349                nesmr->ibmr.rkey = stag;
2350                nesmr->ibmr.lkey = stag;
2351                nesmr->mode = IWNES_MEMREG_TYPE_MEM;
2352                ibmr = &nesmr->ibmr;
2353        } else {
2354                kfree(nesmr);
2355                ibmr = ERR_PTR(-ENOMEM);
2356        }
2357
2358        reg_phys_err:
2359        /* free the resources */
2360        if (root_pbl_index == 1) {
2361                /* single PBL case */
2362                pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase, vpbl.pbl_pbase);
2363        } else {
2364                for (i=0; i<root_pbl_index; i++) {
2365                        pci_free_consistent(nesdev->pcidev, 4096, root_vpbl.leaf_vpbl[i].pbl_vbase,
2366                                        root_vpbl.leaf_vpbl[i].pbl_pbase);
2367                }
2368                kfree(root_vpbl.leaf_vpbl);
2369                pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2370                                root_vpbl.pbl_pbase);
2371        }
2372
2373        return ibmr;
2374}
2375
2376
2377/**
2378 * nes_get_dma_mr
2379 */
2380static struct ib_mr *nes_get_dma_mr(struct ib_pd *pd, int acc)
2381{
2382        struct ib_phys_buf bl;
2383        u64 kva = 0;
2384
2385        nes_debug(NES_DBG_MR, "\n");
2386
2387        bl.size = (u64)0xffffffffffULL;
2388        bl.addr = 0;
2389        return nes_reg_phys_mr(pd, &bl, 1, acc, &kva);
2390}
2391
2392
2393/**
2394 * nes_reg_user_mr
2395 */
2396static struct ib_mr *nes_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
2397                u64 virt, int acc, struct ib_udata *udata)
2398{
2399        u64 iova_start;
2400        __le64 *pbl;
2401        u64 region_length;
2402        dma_addr_t last_dma_addr = 0;
2403        dma_addr_t first_dma_addr = 0;
2404        struct nes_pd *nespd = to_nespd(pd);
2405        struct nes_vnic *nesvnic = to_nesvnic(pd->device);
2406        struct nes_device *nesdev = nesvnic->nesdev;
2407        struct nes_adapter *nesadapter = nesdev->nesadapter;
2408        struct ib_mr *ibmr = ERR_PTR(-EINVAL);
2409        struct ib_umem_chunk *chunk;
2410        struct nes_ucontext *nes_ucontext;
2411        struct nes_pbl *nespbl;
2412        struct nes_mr *nesmr;
2413        struct ib_umem *region;
2414        struct nes_mem_reg_req req;
2415        struct nes_vpbl vpbl;
2416        struct nes_root_vpbl root_vpbl;
2417        int nmap_index, page_index;
2418        int page_count = 0;
2419        int err, pbl_depth = 0;
2420        int chunk_pages;
2421        int ret;
2422        u32 stag;
2423        u32 stag_index = 0;
2424        u32 next_stag_index;
2425        u32 driver_key;
2426        u32 root_pbl_index = 0;
2427        u32 cur_pbl_index = 0;
2428        u32 skip_pages;
2429        u16 pbl_count;
2430        u8 single_page = 1;
2431        u8 stag_key;
2432
2433        region = ib_umem_get(pd->uobject->context, start, length, acc, 0);
2434        if (IS_ERR(region)) {
2435                return (struct ib_mr *)region;
2436        }
2437
2438        nes_debug(NES_DBG_MR, "User base = 0x%lX, Virt base = 0x%lX, length = %u,"
2439                        " offset = %u, page size = %u.\n",
2440                        (unsigned long int)start, (unsigned long int)virt, (u32)length,
2441                        region->offset, region->page_size);
2442
2443        skip_pages = ((u32)region->offset) >> 12;
2444
2445        if (ib_copy_from_udata(&req, udata, sizeof(req)))
2446                return ERR_PTR(-EFAULT);
2447        nes_debug(NES_DBG_MR, "Memory Registration type = %08X.\n", req.reg_type);
2448
2449        switch (req.reg_type) {
2450                case IWNES_MEMREG_TYPE_MEM:
2451                        pbl_depth = 0;
2452                        region_length = 0;
2453                        vpbl.pbl_vbase = NULL;
2454                        root_vpbl.pbl_vbase = NULL;
2455                        root_vpbl.pbl_pbase = 0;
2456
2457                        get_random_bytes(&next_stag_index, sizeof(next_stag_index));
2458                        stag_key = (u8)next_stag_index;
2459
2460                        driver_key = next_stag_index & 0x70000000;
2461
2462                        next_stag_index >>= 8;
2463                        next_stag_index %= nesadapter->max_mr;
2464
2465                        err = nes_alloc_resource(nesadapter, nesadapter->allocated_mrs,
2466                                        nesadapter->max_mr, &stag_index, &next_stag_index);
2467                        if (err) {
2468                                ib_umem_release(region);
2469                                return ERR_PTR(err);
2470                        }
2471
2472                        nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
2473                        if (!nesmr) {
2474                                ib_umem_release(region);
2475                                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2476                                return ERR_PTR(-ENOMEM);
2477                        }
2478                        nesmr->region = region;
2479
2480                        list_for_each_entry(chunk, &region->chunk_list, list) {
2481                                nes_debug(NES_DBG_MR, "Chunk: nents = %u, nmap = %u .\n",
2482                                                chunk->nents, chunk->nmap);
2483                                for (nmap_index = 0; nmap_index < chunk->nmap; ++nmap_index) {
2484                                        if (sg_dma_address(&chunk->page_list[nmap_index]) & ~PAGE_MASK) {
2485                                                ib_umem_release(region);
2486                                                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2487                                                nes_debug(NES_DBG_MR, "Unaligned Memory Buffer: 0x%x\n",
2488                                                                (unsigned int) sg_dma_address(&chunk->page_list[nmap_index]));
2489                                                ibmr = ERR_PTR(-EINVAL);
2490                                                kfree(nesmr);
2491                                                goto reg_user_mr_err;
2492                                        }
2493
2494                                        if (!sg_dma_len(&chunk->page_list[nmap_index])) {
2495                                                ib_umem_release(region);
2496                                                nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2497                                                                stag_index);
2498                                                nes_debug(NES_DBG_MR, "Invalid Buffer Size\n");
2499                                                ibmr = ERR_PTR(-EINVAL);
2500                                                kfree(nesmr);
2501                                                goto reg_user_mr_err;
2502                                        }
2503
2504                                        region_length += sg_dma_len(&chunk->page_list[nmap_index]);
2505                                        chunk_pages = sg_dma_len(&chunk->page_list[nmap_index]) >> 12;
2506                                        region_length -= skip_pages << 12;
2507                                        for (page_index=skip_pages; page_index < chunk_pages; page_index++) {
2508                                                skip_pages = 0;
2509                                                if ((page_count!=0)&&(page_count<<12)-(region->offset&(4096-1))>=region->length)
2510                                                        goto enough_pages;
2511                                                if ((page_count&0x01FF) == 0) {
2512                                                        if (page_count >= 1024 * 512) {
2513                                                                ib_umem_release(region);
2514                                                                nes_free_resource(nesadapter,
2515                                                                                nesadapter->allocated_mrs, stag_index);
2516                                                                kfree(nesmr);
2517                                                                ibmr = ERR_PTR(-E2BIG);
2518                                                                goto reg_user_mr_err;
2519                                                        }
2520                                                        if (root_pbl_index == 1) {
2521                                                                root_vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev,
2522                                                                                8192, &root_vpbl.pbl_pbase);
2523                                                                nes_debug(NES_DBG_MR, "Allocating root PBL, va = %p, pa = 0x%08X\n",
2524                                                                                root_vpbl.pbl_vbase, (unsigned int)root_vpbl.pbl_pbase);
2525                                                                if (!root_vpbl.pbl_vbase) {
2526                                                                        ib_umem_release(region);
2527                                                                        pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2528                                                                                        vpbl.pbl_pbase);
2529                                                                        nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2530                                                                                        stag_index);
2531                                                                        kfree(nesmr);
2532                                                                        ibmr = ERR_PTR(-ENOMEM);
2533                                                                        goto reg_user_mr_err;
2534                                                                }
2535                                                                root_vpbl.leaf_vpbl = kzalloc(sizeof(*root_vpbl.leaf_vpbl)*1024,
2536                                                                                GFP_KERNEL);
2537                                                                if (!root_vpbl.leaf_vpbl) {
2538                                                                        ib_umem_release(region);
2539                                                                        pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2540                                                                                        root_vpbl.pbl_pbase);
2541                                                                        pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2542                                                                                        vpbl.pbl_pbase);
2543                                                                        nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2544                                                                                        stag_index);
2545                                                                        kfree(nesmr);
2546                                                                        ibmr = ERR_PTR(-ENOMEM);
2547                                                                        goto reg_user_mr_err;
2548                                                                }
2549                                                                root_vpbl.pbl_vbase[0].pa_low =
2550                                                                                cpu_to_le32((u32)vpbl.pbl_pbase);
2551                                                                root_vpbl.pbl_vbase[0].pa_high =
2552                                                                                cpu_to_le32((u32)((((u64)vpbl.pbl_pbase) >> 32)));
2553                                                                root_vpbl.leaf_vpbl[0] = vpbl;
2554                                                        }
2555                                                        vpbl.pbl_vbase = pci_alloc_consistent(nesdev->pcidev, 4096,
2556                                                                        &vpbl.pbl_pbase);
2557                                                        nes_debug(NES_DBG_MR, "Allocating leaf PBL, va = %p, pa = 0x%08X\n",
2558                                                                        vpbl.pbl_vbase, (unsigned int)vpbl.pbl_pbase);
2559                                                        if (!vpbl.pbl_vbase) {
2560                                                                ib_umem_release(region);
2561                                                                nes_free_resource(nesadapter, nesadapter->allocated_mrs, stag_index);
2562                                                                ibmr = ERR_PTR(-ENOMEM);
2563                                                                kfree(nesmr);
2564                                                                goto reg_user_mr_err;
2565                                                        }
2566                                                        if (1 <= root_pbl_index) {
2567                                                                root_vpbl.pbl_vbase[root_pbl_index].pa_low =
2568                                                                                cpu_to_le32((u32)vpbl.pbl_pbase);
2569                                                                root_vpbl.pbl_vbase[root_pbl_index].pa_high =
2570                                                                                cpu_to_le32((u32)((((u64)vpbl.pbl_pbase)>>32)));
2571                                                                root_vpbl.leaf_vpbl[root_pbl_index] = vpbl;
2572                                                        }
2573                                                        root_pbl_index++;
2574                                                        cur_pbl_index = 0;
2575                                                }
2576                                                if (single_page) {
2577                                                        if (page_count != 0) {
2578                                                                if ((last_dma_addr+4096) !=
2579                                                                                (sg_dma_address(&chunk->page_list[nmap_index])+
2580                                                                                (page_index*4096)))
2581                                                                        single_page = 0;
2582                                                                last_dma_addr = sg_dma_address(&chunk->page_list[nmap_index])+
2583                                                                                (page_index*4096);
2584                                                        } else {
2585                                                                first_dma_addr = sg_dma_address(&chunk->page_list[nmap_index])+
2586                                                                                (page_index*4096);
2587                                                                last_dma_addr = first_dma_addr;
2588                                                        }
2589                                                }
2590
2591                                                vpbl.pbl_vbase[cur_pbl_index].pa_low =
2592                                                                cpu_to_le32((u32)(sg_dma_address(&chunk->page_list[nmap_index])+
2593                                                                (page_index*4096)));
2594                                                vpbl.pbl_vbase[cur_pbl_index].pa_high =
2595                                                                cpu_to_le32((u32)((((u64)(sg_dma_address(&chunk->page_list[nmap_index])+
2596                                                                (page_index*4096))) >> 32)));
2597                                                cur_pbl_index++;
2598                                                page_count++;
2599                                        }
2600                                }
2601                        }
2602                        enough_pages:
2603                        nes_debug(NES_DBG_MR, "calculating stag, stag_index=0x%08x, driver_key=0x%08x,"
2604                                        " stag_key=0x%08x\n",
2605                                        stag_index, driver_key, stag_key);
2606                        stag = stag_index << 8;
2607                        stag |= driver_key;
2608                        stag += (u32)stag_key;
2609                        if (stag == 0) {
2610                                stag = 1;
2611                        }
2612
2613                        iova_start = virt;
2614                        /* Make the leaf PBL the root if only one PBL */
2615                        if (root_pbl_index == 1) {
2616                                root_vpbl.pbl_pbase = vpbl.pbl_pbase;
2617                        }
2618
2619                        if (single_page) {
2620                                pbl_count = 0;
2621                        } else {
2622                                pbl_count = root_pbl_index;
2623                                first_dma_addr = 0;
2624                        }
2625                        nes_debug(NES_DBG_MR, "Registering STag 0x%08X, VA = 0x%08X, length = 0x%08X,"
2626                                        " index = 0x%08X, region->length=0x%08llx, pbl_count = %u\n",
2627                                        stag, (unsigned int)iova_start,
2628                                        (unsigned int)region_length, stag_index,
2629                                        (unsigned long long)region->length, pbl_count);
2630                        ret = nes_reg_mr(nesdev, nespd, stag, region->length, &root_vpbl,
2631                                         first_dma_addr, pbl_count, (u16)cur_pbl_index, acc,
2632                                         &iova_start, &nesmr->pbls_used, &nesmr->pbl_4k);
2633
2634                        nes_debug(NES_DBG_MR, "ret=%d\n", ret);
2635
2636                        if (ret == 0) {
2637                                nesmr->ibmr.rkey = stag;
2638                                nesmr->ibmr.lkey = stag;
2639                                nesmr->mode = IWNES_MEMREG_TYPE_MEM;
2640                                ibmr = &nesmr->ibmr;
2641                        } else {
2642                                ib_umem_release(region);
2643                                kfree(nesmr);
2644                                ibmr = ERR_PTR(-ENOMEM);
2645                        }
2646
2647                        reg_user_mr_err:
2648                        /* free the resources */
2649                        if (root_pbl_index == 1) {
2650                                pci_free_consistent(nesdev->pcidev, 4096, vpbl.pbl_vbase,
2651                                                vpbl.pbl_pbase);
2652                        } else {
2653                                for (page_index=0; page_index<root_pbl_index; page_index++) {
2654                                        pci_free_consistent(nesdev->pcidev, 4096,
2655                                                        root_vpbl.leaf_vpbl[page_index].pbl_vbase,
2656                                                        root_vpbl.leaf_vpbl[page_index].pbl_pbase);
2657                                }
2658                                kfree(root_vpbl.leaf_vpbl);
2659                                pci_free_consistent(nesdev->pcidev, 8192, root_vpbl.pbl_vbase,
2660                                                root_vpbl.pbl_pbase);
2661                        }
2662
2663                        nes_debug(NES_DBG_MR, "Leaving, ibmr=%p", ibmr);
2664
2665                        return ibmr;
2666                case IWNES_MEMREG_TYPE_QP:
2667                case IWNES_MEMREG_TYPE_CQ:
2668                        nespbl = kzalloc(sizeof(*nespbl), GFP_KERNEL);
2669                        if (!nespbl) {
2670                                nes_debug(NES_DBG_MR, "Unable to allocate PBL\n");
2671                                ib_umem_release(region);
2672                                return ERR_PTR(-ENOMEM);
2673                        }
2674                        nesmr = kzalloc(sizeof(*nesmr), GFP_KERNEL);
2675                        if (!nesmr) {
2676                                ib_umem_release(region);
2677                                kfree(nespbl);
2678                                nes_debug(NES_DBG_MR, "Unable to allocate nesmr\n");
2679                                return ERR_PTR(-ENOMEM);
2680                        }
2681                        nesmr->region = region;
2682                        nes_ucontext = to_nesucontext(pd->uobject->context);
2683                        pbl_depth = region->length >> 12;
2684                        pbl_depth += (region->length & (4096-1)) ? 1 : 0;
2685                        nespbl->pbl_size = pbl_depth*sizeof(u64);
2686                        if (req.reg_type == IWNES_MEMREG_TYPE_QP) {
2687                                nes_debug(NES_DBG_MR, "Attempting to allocate QP PBL memory");
2688                        } else {
2689                                nes_debug(NES_DBG_MR, "Attempting to allocate CP PBL memory");
2690                        }
2691
2692                        nes_debug(NES_DBG_MR, " %u bytes, %u entries.\n",
2693                                        nespbl->pbl_size, pbl_depth);
2694                        pbl = pci_alloc_consistent(nesdev->pcidev, nespbl->pbl_size,
2695                                        &nespbl->pbl_pbase);
2696                        if (!pbl) {
2697                                ib_umem_release(region);
2698                                kfree(nesmr);
2699                                kfree(nespbl);
2700                                nes_debug(NES_DBG_MR, "Unable to allocate PBL memory\n");
2701                                return ERR_PTR(-ENOMEM);
2702                        }
2703
2704                        nespbl->pbl_vbase = (u64 *)pbl;
2705                        nespbl->user_base = start;
2706                        nes_debug(NES_DBG_MR, "Allocated PBL memory, %u bytes, pbl_pbase=%lx,"
2707                                        " pbl_vbase=%p user_base=0x%lx\n",
2708                                  nespbl->pbl_size, (unsigned long) nespbl->pbl_pbase,
2709                                  (void *) nespbl->pbl_vbase, nespbl->user_base);
2710
2711                        list_for_each_entry(chunk, &region->chunk_list, list) {
2712                                for (nmap_index = 0; nmap_index < chunk->nmap; ++nmap_index) {
2713                                        chunk_pages = sg_dma_len(&chunk->page_list[nmap_index]) >> 12;
2714                                        chunk_pages += (sg_dma_len(&chunk->page_list[nmap_index]) & (4096-1)) ? 1 : 0;
2715                                        nespbl->page = sg_page(&chunk->page_list[0]);
2716                                        for (page_index=0; page_index<chunk_pages; page_index++) {
2717                                                ((__le32 *)pbl)[0] = cpu_to_le32((u32)
2718                                                                (sg_dma_address(&chunk->page_list[nmap_index])+
2719                                                                (page_index*4096)));
2720                                                ((__le32 *)pbl)[1] = cpu_to_le32(((u64)
2721                                                                (sg_dma_address(&chunk->page_list[nmap_index])+
2722                                                                (page_index*4096)))>>32);
2723                                                nes_debug(NES_DBG_MR, "pbl=%p, *pbl=0x%016llx, 0x%08x%08x\n", pbl,
2724                                                                (unsigned long long)*pbl,
2725                                                                le32_to_cpu(((__le32 *)pbl)[1]), le32_to_cpu(((__le32 *)pbl)[0]));
2726                                                pbl++;
2727                                        }
2728                                }
2729                        }
2730                        if (req.reg_type == IWNES_MEMREG_TYPE_QP) {
2731                                list_add_tail(&nespbl->list, &nes_ucontext->qp_reg_mem_list);
2732                        } else {
2733                                list_add_tail(&nespbl->list, &nes_ucontext->cq_reg_mem_list);
2734                        }
2735                        nesmr->ibmr.rkey = -1;
2736                        nesmr->ibmr.lkey = -1;
2737                        nesmr->mode = req.reg_type;
2738                        return &nesmr->ibmr;
2739        }
2740
2741        return ERR_PTR(-ENOSYS);
2742}
2743
2744
2745/**
2746 * nes_dereg_mr
2747 */
2748static int nes_dereg_mr(struct ib_mr *ib_mr)
2749{
2750        struct nes_mr *nesmr = to_nesmr(ib_mr);
2751        struct nes_vnic *nesvnic = to_nesvnic(ib_mr->device);
2752        struct nes_device *nesdev = nesvnic->nesdev;
2753        struct nes_adapter *nesadapter = nesdev->nesadapter;
2754        struct nes_hw_cqp_wqe *cqp_wqe;
2755        struct nes_cqp_request *cqp_request;
2756        unsigned long flags;
2757        int ret;
2758        u16 major_code;
2759        u16 minor_code;
2760
2761        if (nesmr->region) {
2762                ib_umem_release(nesmr->region);
2763        }
2764        if (nesmr->mode != IWNES_MEMREG_TYPE_MEM) {
2765                kfree(nesmr);
2766                return 0;
2767        }
2768
2769        /* Deallocate the region with the adapter */
2770
2771        cqp_request = nes_get_cqp_request(nesdev);
2772        if (cqp_request == NULL) {
2773                nes_debug(NES_DBG_MR, "Failed to get a cqp_request.\n");
2774                return -ENOMEM;
2775        }
2776        cqp_request->waiting = 1;
2777        cqp_wqe = &cqp_request->cqp_wqe;
2778
2779        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2780        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
2781                        NES_CQP_DEALLOCATE_STAG | NES_CQP_STAG_VA_TO |
2782                        NES_CQP_STAG_DEALLOC_PBLS | NES_CQP_STAG_MR);
2783        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_STAG_WQE_STAG_IDX, ib_mr->rkey);
2784
2785        atomic_set(&cqp_request->refcount, 2);
2786        nes_post_cqp_request(nesdev, cqp_request);
2787
2788        /* Wait for CQP */
2789        nes_debug(NES_DBG_MR, "Waiting for deallocate STag 0x%08X completed\n", ib_mr->rkey);
2790        ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
2791                        NES_EVENT_TIMEOUT);
2792        nes_debug(NES_DBG_MR, "Deallocate STag 0x%08X completed, wait_event_timeout ret = %u,"
2793                        " CQP Major:Minor codes = 0x%04X:0x%04X\n",
2794                        ib_mr->rkey, ret, cqp_request->major_code, cqp_request->minor_code);
2795
2796        major_code = cqp_request->major_code;
2797        minor_code = cqp_request->minor_code;
2798
2799        nes_put_cqp_request(nesdev, cqp_request);
2800
2801        if (!ret) {
2802                nes_debug(NES_DBG_MR, "Timeout waiting to destroy STag,"
2803                                " ib_mr=%p, rkey = 0x%08X\n",
2804                                ib_mr, ib_mr->rkey);
2805                return -ETIME;
2806        } else if (major_code) {
2807                nes_debug(NES_DBG_MR, "Error (0x%04X:0x%04X) while attempting"
2808                                " to destroy STag, ib_mr=%p, rkey = 0x%08X\n",
2809                                major_code, minor_code, ib_mr, ib_mr->rkey);
2810                return -EIO;
2811        }
2812
2813        if (nesmr->pbls_used != 0) {
2814                spin_lock_irqsave(&nesadapter->pbl_lock, flags);
2815                if (nesmr->pbl_4k) {
2816                        nesadapter->free_4kpbl += nesmr->pbls_used;
2817                        if (nesadapter->free_4kpbl > nesadapter->max_4kpbl)
2818                                printk(KERN_ERR PFX "free 4KB PBLs(%u) has "
2819                                        "exceeded the max(%u)\n",
2820                                        nesadapter->free_4kpbl,
2821                                        nesadapter->max_4kpbl);
2822                } else {
2823                        nesadapter->free_256pbl += nesmr->pbls_used;
2824                        if (nesadapter->free_256pbl > nesadapter->max_256pbl)
2825                                printk(KERN_ERR PFX "free 256B PBLs(%u) has "
2826                                        "exceeded the max(%u)\n",
2827                                        nesadapter->free_256pbl,
2828                                        nesadapter->max_256pbl);
2829                }
2830                spin_unlock_irqrestore(&nesadapter->pbl_lock, flags);
2831        }
2832        nes_free_resource(nesadapter, nesadapter->allocated_mrs,
2833                        (ib_mr->rkey & 0x0fffff00) >> 8);
2834
2835        kfree(nesmr);
2836
2837        return 0;
2838}
2839
2840
2841/**
2842 * show_rev
2843 */
2844static ssize_t show_rev(struct device *dev, struct device_attribute *attr,
2845                        char *buf)
2846{
2847        struct nes_ib_device *nesibdev =
2848                        container_of(dev, struct nes_ib_device, ibdev.dev);
2849        struct nes_vnic *nesvnic = nesibdev->nesvnic;
2850
2851        nes_debug(NES_DBG_INIT, "\n");
2852        return sprintf(buf, "%x\n", nesvnic->nesdev->nesadapter->hw_rev);
2853}
2854
2855
2856/**
2857 * show_fw_ver
2858 */
2859static ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr,
2860                           char *buf)
2861{
2862        struct nes_ib_device *nesibdev =
2863                        container_of(dev, struct nes_ib_device, ibdev.dev);
2864        struct nes_vnic *nesvnic = nesibdev->nesvnic;
2865
2866        nes_debug(NES_DBG_INIT, "\n");
2867        return sprintf(buf, "%u.%u\n",
2868                (nesvnic->nesdev->nesadapter->firmware_version >> 16),
2869                (nesvnic->nesdev->nesadapter->firmware_version & 0x000000ff));
2870}
2871
2872
2873/**
2874 * show_hca
2875 */
2876static ssize_t show_hca(struct device *dev, struct device_attribute *attr,
2877                        char *buf)
2878{
2879        nes_debug(NES_DBG_INIT, "\n");
2880        return sprintf(buf, "NES020\n");
2881}
2882
2883
2884/**
2885 * show_board
2886 */
2887static ssize_t show_board(struct device *dev, struct device_attribute *attr,
2888                          char *buf)
2889{
2890        nes_debug(NES_DBG_INIT, "\n");
2891        return sprintf(buf, "%.*s\n", 32, "NES020 Board ID");
2892}
2893
2894
2895static DEVICE_ATTR(hw_rev, S_IRUGO, show_rev, NULL);
2896static DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL);
2897static DEVICE_ATTR(hca_type, S_IRUGO, show_hca, NULL);
2898static DEVICE_ATTR(board_id, S_IRUGO, show_board, NULL);
2899
2900static struct device_attribute *nes_dev_attributes[] = {
2901        &dev_attr_hw_rev,
2902        &dev_attr_fw_ver,
2903        &dev_attr_hca_type,
2904        &dev_attr_board_id
2905};
2906
2907
2908/**
2909 * nes_query_qp
2910 */
2911static int nes_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
2912                int attr_mask, struct ib_qp_init_attr *init_attr)
2913{
2914        struct nes_qp *nesqp = to_nesqp(ibqp);
2915
2916        nes_debug(NES_DBG_QP, "\n");
2917
2918        attr->qp_access_flags = 0;
2919        attr->cap.max_send_wr = nesqp->hwqp.sq_size;
2920        attr->cap.max_recv_wr = nesqp->hwqp.rq_size;
2921        attr->cap.max_recv_sge = 1;
2922        if (nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) {
2923                init_attr->cap.max_inline_data = 0;
2924        } else {
2925                init_attr->cap.max_inline_data = 64;
2926        }
2927
2928        init_attr->event_handler = nesqp->ibqp.event_handler;
2929        init_attr->qp_context = nesqp->ibqp.qp_context;
2930        init_attr->send_cq = nesqp->ibqp.send_cq;
2931        init_attr->recv_cq = nesqp->ibqp.recv_cq;
2932        init_attr->srq = nesqp->ibqp.srq = nesqp->ibqp.srq;
2933        init_attr->cap = attr->cap;
2934
2935        return 0;
2936}
2937
2938
2939/**
2940 * nes_hw_modify_qp
2941 */
2942int nes_hw_modify_qp(struct nes_device *nesdev, struct nes_qp *nesqp,
2943                u32 next_iwarp_state, u32 termlen, u32 wait_completion)
2944{
2945        struct nes_hw_cqp_wqe *cqp_wqe;
2946        /* struct iw_cm_id *cm_id = nesqp->cm_id; */
2947        /* struct iw_cm_event cm_event; */
2948        struct nes_cqp_request *cqp_request;
2949        int ret;
2950        u16 major_code;
2951
2952        nes_debug(NES_DBG_MOD_QP, "QP%u, refcount=%d\n",
2953                        nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount));
2954
2955        cqp_request = nes_get_cqp_request(nesdev);
2956        if (cqp_request == NULL) {
2957                nes_debug(NES_DBG_MOD_QP, "Failed to get a cqp_request.\n");
2958                return -ENOMEM;
2959        }
2960        if (wait_completion) {
2961                cqp_request->waiting = 1;
2962        } else {
2963                cqp_request->waiting = 0;
2964        }
2965        cqp_wqe = &cqp_request->cqp_wqe;
2966
2967        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_OPCODE_IDX,
2968                        NES_CQP_MODIFY_QP | NES_CQP_QP_TYPE_IWARP | next_iwarp_state);
2969        nes_debug(NES_DBG_MOD_QP, "using next_iwarp_state=%08x, wqe_words=%08x\n",
2970                        next_iwarp_state, le32_to_cpu(cqp_wqe->wqe_words[NES_CQP_WQE_OPCODE_IDX]));
2971        nes_fill_init_cqp_wqe(cqp_wqe, nesdev);
2972        set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_WQE_ID_IDX, nesqp->hwqp.qp_id);
2973        set_wqe_64bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_CONTEXT_LOW_IDX, (u64)nesqp->nesqp_context_pbase);
2974
2975        /* If sending a terminate message, fill in the length (in words) */
2976        if (((next_iwarp_state & NES_CQP_QP_IWARP_STATE_MASK) == NES_CQP_QP_IWARP_STATE_TERMINATE) &&
2977            !(next_iwarp_state & NES_CQP_QP_TERM_DONT_SEND_TERM_MSG)) {
2978                termlen = ((termlen + 3) >> 2) << NES_CQP_OP_TERMLEN_SHIFT;
2979                set_wqe_32bit_value(cqp_wqe->wqe_words, NES_CQP_QP_WQE_NEW_MSS_IDX, termlen);
2980        }
2981
2982        atomic_set(&cqp_request->refcount, 2);
2983        nes_post_cqp_request(nesdev, cqp_request);
2984
2985        /* Wait for CQP */
2986        if (wait_completion) {
2987                /* nes_debug(NES_DBG_MOD_QP, "Waiting for modify iWARP QP%u to complete.\n",
2988                                nesqp->hwqp.qp_id); */
2989                ret = wait_event_timeout(cqp_request->waitq, (cqp_request->request_done != 0),
2990                                NES_EVENT_TIMEOUT);
2991                nes_debug(NES_DBG_MOD_QP, "Modify iwarp QP%u completed, wait_event_timeout ret=%u, "
2992                                "CQP Major:Minor codes = 0x%04X:0x%04X.\n",
2993                                nesqp->hwqp.qp_id, ret, cqp_request->major_code, cqp_request->minor_code);
2994                major_code = cqp_request->major_code;
2995                if (major_code) {
2996                        nes_debug(NES_DBG_MOD_QP, "Modify iwarp QP%u failed"
2997                                        "CQP Major:Minor codes = 0x%04X:0x%04X, intended next state = 0x%08X.\n",
2998                                        nesqp->hwqp.qp_id, cqp_request->major_code,
2999                                        cqp_request->minor_code, next_iwarp_state);
3000                }
3001
3002                nes_put_cqp_request(nesdev, cqp_request);
3003
3004                if (!ret)
3005                        return -ETIME;
3006                else if (major_code)
3007                        return -EIO;
3008                else
3009                        return 0;
3010        } else {
3011                return 0;
3012        }
3013}
3014
3015
3016/**
3017 * nes_modify_qp
3018 */
3019int nes_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,
3020                int attr_mask, struct ib_udata *udata)
3021{
3022        struct nes_qp *nesqp = to_nesqp(ibqp);
3023        struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
3024        struct nes_device *nesdev = nesvnic->nesdev;
3025        /* u32 cqp_head; */
3026        /* u32 counter; */
3027        u32 next_iwarp_state = 0;
3028        int err;
3029        unsigned long qplockflags;
3030        int ret;
3031        u16 original_last_aeq;
3032        u8 issue_modify_qp = 0;
3033        u8 issue_disconnect = 0;
3034        u8 dont_wait = 0;
3035
3036        nes_debug(NES_DBG_MOD_QP, "QP%u: QP State=%u, cur QP State=%u,"
3037                        " iwarp_state=0x%X, refcount=%d\n",
3038                        nesqp->hwqp.qp_id, attr->qp_state, nesqp->ibqp_state,
3039                        nesqp->iwarp_state, atomic_read(&nesqp->refcount));
3040
3041        spin_lock_irqsave(&nesqp->lock, qplockflags);
3042
3043        nes_debug(NES_DBG_MOD_QP, "QP%u: hw_iwarp_state=0x%X, hw_tcp_state=0x%X,"
3044                        " QP Access Flags=0x%X, attr_mask = 0x%0x\n",
3045                        nesqp->hwqp.qp_id, nesqp->hw_iwarp_state,
3046                        nesqp->hw_tcp_state, attr->qp_access_flags, attr_mask);
3047
3048        if (attr_mask & IB_QP_STATE) {
3049                switch (attr->qp_state) {
3050                        case IB_QPS_INIT:
3051                                nes_debug(NES_DBG_MOD_QP, "QP%u: new state = init\n",
3052                                                nesqp->hwqp.qp_id);
3053                                if (nesqp->iwarp_state > (u32)NES_CQP_QP_IWARP_STATE_IDLE) {
3054                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3055                                        return -EINVAL;
3056                                }
3057                                next_iwarp_state = NES_CQP_QP_IWARP_STATE_IDLE;
3058                                issue_modify_qp = 1;
3059                                break;
3060                        case IB_QPS_RTR:
3061                                nes_debug(NES_DBG_MOD_QP, "QP%u: new state = rtr\n",
3062                                                nesqp->hwqp.qp_id);
3063                                if (nesqp->iwarp_state>(u32)NES_CQP_QP_IWARP_STATE_IDLE) {
3064                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3065                                        return -EINVAL;
3066                                }
3067                                next_iwarp_state = NES_CQP_QP_IWARP_STATE_IDLE;
3068                                issue_modify_qp = 1;
3069                                break;
3070                        case IB_QPS_RTS:
3071                                nes_debug(NES_DBG_MOD_QP, "QP%u: new state = rts\n",
3072                                                nesqp->hwqp.qp_id);
3073                                if (nesqp->iwarp_state>(u32)NES_CQP_QP_IWARP_STATE_RTS) {
3074                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3075                                        return -EINVAL;
3076                                }
3077                                if (nesqp->cm_id == NULL) {
3078                                        nes_debug(NES_DBG_MOD_QP, "QP%u: Failing attempt to move QP to RTS without a CM_ID. \n",
3079                                                        nesqp->hwqp.qp_id );
3080                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3081                                        return -EINVAL;
3082                                }
3083                                next_iwarp_state = NES_CQP_QP_IWARP_STATE_RTS;
3084                                if (nesqp->iwarp_state != NES_CQP_QP_IWARP_STATE_RTS)
3085                                        next_iwarp_state |= NES_CQP_QP_CONTEXT_VALID |
3086                                                        NES_CQP_QP_ARP_VALID | NES_CQP_QP_ORD_VALID;
3087                                issue_modify_qp = 1;
3088                                nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_ESTABLISHED;
3089                                nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_RTS;
3090                                nesqp->hte_added = 1;
3091                                break;
3092                        case IB_QPS_SQD:
3093                                issue_modify_qp = 1;
3094                                nes_debug(NES_DBG_MOD_QP, "QP%u: new state=closing. SQ head=%u, SQ tail=%u\n",
3095                                                nesqp->hwqp.qp_id, nesqp->hwqp.sq_head, nesqp->hwqp.sq_tail);
3096                                if (nesqp->iwarp_state == (u32)NES_CQP_QP_IWARP_STATE_CLOSING) {
3097                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3098                                        return 0;
3099                                } else {
3100                                        if (nesqp->iwarp_state > (u32)NES_CQP_QP_IWARP_STATE_CLOSING) {
3101                                                nes_debug(NES_DBG_MOD_QP, "QP%u: State change to closing"
3102                                                                " ignored due to current iWARP state\n",
3103                                                                nesqp->hwqp.qp_id);
3104                                                spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3105                                                return -EINVAL;
3106                                        }
3107                                        if (nesqp->hw_iwarp_state != NES_AEQE_IWARP_STATE_RTS) {
3108                                                nes_debug(NES_DBG_MOD_QP, "QP%u: State change to closing"
3109                                                                " already done based on hw state.\n",
3110                                                                nesqp->hwqp.qp_id);
3111                                                issue_modify_qp = 0;
3112                                                nesqp->in_disconnect = 0;
3113                                        }
3114                                        switch (nesqp->hw_iwarp_state) {
3115                                                case NES_AEQE_IWARP_STATE_CLOSING:
3116                                                        next_iwarp_state = NES_CQP_QP_IWARP_STATE_CLOSING;
3117                                                case NES_AEQE_IWARP_STATE_TERMINATE:
3118                                                        next_iwarp_state = NES_CQP_QP_IWARP_STATE_TERMINATE;
3119                                                        break;
3120                                                case NES_AEQE_IWARP_STATE_ERROR:
3121                                                        next_iwarp_state = NES_CQP_QP_IWARP_STATE_ERROR;
3122                                                        break;
3123                                                default:
3124                                                        next_iwarp_state = NES_CQP_QP_IWARP_STATE_CLOSING;
3125                                                        nesqp->in_disconnect = 1;
3126                                                        nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_CLOSING;
3127                                                        break;
3128                                        }
3129                                }
3130                                break;
3131                        case IB_QPS_SQE:
3132                                nes_debug(NES_DBG_MOD_QP, "QP%u: new state = terminate\n",
3133                                                nesqp->hwqp.qp_id);
3134                                if (nesqp->iwarp_state>=(u32)NES_CQP_QP_IWARP_STATE_TERMINATE) {
3135                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3136                                        return -EINVAL;
3137                                }
3138                                /* next_iwarp_state = (NES_CQP_QP_IWARP_STATE_TERMINATE | 0x02000000); */
3139                                next_iwarp_state = NES_CQP_QP_IWARP_STATE_TERMINATE;
3140                                nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_TERMINATE;
3141                                issue_modify_qp = 1;
3142                                nesqp->in_disconnect = 1;
3143                                break;
3144                        case IB_QPS_ERR:
3145                        case IB_QPS_RESET:
3146                                if (nesqp->iwarp_state == (u32)NES_CQP_QP_IWARP_STATE_ERROR) {
3147                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3148                                        return -EINVAL;
3149                                }
3150                                nes_debug(NES_DBG_MOD_QP, "QP%u: new state = error\n",
3151                                                nesqp->hwqp.qp_id);
3152                                if (nesqp->term_flags)
3153                                        del_timer(&nesqp->terminate_timer);
3154
3155                                next_iwarp_state = NES_CQP_QP_IWARP_STATE_ERROR;
3156                                /* next_iwarp_state = (NES_CQP_QP_IWARP_STATE_TERMINATE | 0x02000000); */
3157                                        if (nesqp->hte_added) {
3158                                                nes_debug(NES_DBG_MOD_QP, "set CQP_QP_DEL_HTE\n");
3159                                                next_iwarp_state |= NES_CQP_QP_DEL_HTE;
3160                                                nesqp->hte_added = 0;
3161                                        }
3162                                if ((nesqp->hw_tcp_state > NES_AEQE_TCP_STATE_CLOSED) &&
3163                                                (nesqp->hw_tcp_state != NES_AEQE_TCP_STATE_TIME_WAIT)) {
3164                                        next_iwarp_state |= NES_CQP_QP_RESET;
3165                                        nesqp->in_disconnect = 1;
3166                                } else {
3167                                        nes_debug(NES_DBG_MOD_QP, "QP%u NOT setting NES_CQP_QP_RESET since TCP state = %u\n",
3168                                                        nesqp->hwqp.qp_id, nesqp->hw_tcp_state);
3169                                        dont_wait = 1;
3170                                }
3171                                issue_modify_qp = 1;
3172                                nesqp->hw_iwarp_state = NES_AEQE_IWARP_STATE_ERROR;
3173                                break;
3174                        default:
3175                                spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3176                                return -EINVAL;
3177                                break;
3178                }
3179
3180                nesqp->ibqp_state = attr->qp_state;
3181                if (((nesqp->iwarp_state & NES_CQP_QP_IWARP_STATE_MASK) ==
3182                                (u32)NES_CQP_QP_IWARP_STATE_RTS) &&
3183                                ((next_iwarp_state & NES_CQP_QP_IWARP_STATE_MASK) >
3184                                (u32)NES_CQP_QP_IWARP_STATE_RTS)) {
3185                        nesqp->iwarp_state = next_iwarp_state & NES_CQP_QP_IWARP_STATE_MASK;
3186                        nes_debug(NES_DBG_MOD_QP, "Change nesqp->iwarp_state=%08x\n",
3187                                        nesqp->iwarp_state);
3188                        issue_disconnect = 1;
3189                } else {
3190                        nesqp->iwarp_state = next_iwarp_state & NES_CQP_QP_IWARP_STATE_MASK;
3191                        nes_debug(NES_DBG_MOD_QP, "Change nesqp->iwarp_state=%08x\n",
3192                                        nesqp->iwarp_state);
3193                }
3194        }
3195
3196        if (attr_mask & IB_QP_ACCESS_FLAGS) {
3197                if (attr->qp_access_flags & IB_ACCESS_LOCAL_WRITE) {
3198                        nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN |
3199                                        NES_QPCONTEXT_MISC_RDMA_READ_EN);
3200                        issue_modify_qp = 1;
3201                }
3202                if (attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE) {
3203                        nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN);
3204                        issue_modify_qp = 1;
3205                }
3206                if (attr->qp_access_flags & IB_ACCESS_REMOTE_READ) {
3207                        nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_READ_EN);
3208                        issue_modify_qp = 1;
3209                }
3210                if (attr->qp_access_flags & IB_ACCESS_MW_BIND) {
3211                        nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_WBIND_EN);
3212                        issue_modify_qp = 1;
3213                }
3214
3215                if (nesqp->user_mode) {
3216                        nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_RDMA_WRITE_EN |
3217                                        NES_QPCONTEXT_MISC_RDMA_READ_EN);
3218                        issue_modify_qp = 1;
3219                }
3220        }
3221
3222        original_last_aeq = nesqp->last_aeq;
3223        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3224
3225        nes_debug(NES_DBG_MOD_QP, "issue_modify_qp=%u\n", issue_modify_qp);
3226
3227        ret = 0;
3228
3229
3230        if (issue_modify_qp) {
3231                nes_debug(NES_DBG_MOD_QP, "call nes_hw_modify_qp\n");
3232                ret = nes_hw_modify_qp(nesdev, nesqp, next_iwarp_state, 0, 1);
3233                if (ret)
3234                        nes_debug(NES_DBG_MOD_QP, "nes_hw_modify_qp (next_iwarp_state = 0x%08X)"
3235                                        " failed for QP%u.\n",
3236                                        next_iwarp_state, nesqp->hwqp.qp_id);
3237
3238        }
3239
3240        if ((issue_modify_qp) && (nesqp->ibqp_state > IB_QPS_RTS)) {
3241                nes_debug(NES_DBG_MOD_QP, "QP%u Issued ModifyQP refcount (%d),"
3242                                " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3243                                nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3244                                original_last_aeq, nesqp->last_aeq);
3245                if ((!ret) ||
3246                                ((original_last_aeq != NES_AEQE_AEID_RDMAP_ROE_BAD_LLP_CLOSE) &&
3247                                (ret))) {
3248                        if (dont_wait) {
3249                                if (nesqp->cm_id && nesqp->hw_tcp_state != 0) {
3250                                        nes_debug(NES_DBG_MOD_QP, "QP%u Queuing fake disconnect for QP refcount (%d),"
3251                                                        " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3252                                                        nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3253                                                        original_last_aeq, nesqp->last_aeq);
3254                                        /* this one is for the cm_disconnect thread */
3255                                        spin_lock_irqsave(&nesqp->lock, qplockflags);
3256                                        nesqp->hw_tcp_state = NES_AEQE_TCP_STATE_CLOSED;
3257                                        nesqp->last_aeq = NES_AEQE_AEID_RESET_SENT;
3258                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3259                                        nes_cm_disconn(nesqp);
3260                                } else {
3261                                        nes_debug(NES_DBG_MOD_QP, "QP%u No fake disconnect, QP refcount=%d\n",
3262                                                        nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount));
3263                                }
3264                        } else {
3265                                spin_lock_irqsave(&nesqp->lock, qplockflags);
3266                                if (nesqp->cm_id) {
3267                                        /* These two are for the timer thread */
3268                                        if (atomic_inc_return(&nesqp->close_timer_started) == 1) {
3269                                                nesqp->cm_id->add_ref(nesqp->cm_id);
3270                                                nes_debug(NES_DBG_MOD_QP, "QP%u Not decrementing QP refcount (%d),"
3271                                                                " need ae to finish up, original_last_aeq = 0x%04X."
3272                                                                " last_aeq = 0x%04X, scheduling timer.\n",
3273                                                                nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3274                                                                original_last_aeq, nesqp->last_aeq);
3275                                                schedule_nes_timer(nesqp->cm_node, (struct sk_buff *) nesqp, NES_TIMER_TYPE_CLOSE, 1, 0);
3276                                        }
3277                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3278                                } else {
3279                                        spin_unlock_irqrestore(&nesqp->lock, qplockflags);
3280                                        nes_debug(NES_DBG_MOD_QP, "QP%u Not decrementing QP refcount (%d),"
3281                                                        " need ae to finish up, original_last_aeq = 0x%04X."
3282                                                        " last_aeq = 0x%04X.\n",
3283                                                        nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3284                                                        original_last_aeq, nesqp->last_aeq);
3285                                }
3286                        }
3287                } else {
3288                        nes_debug(NES_DBG_MOD_QP, "QP%u Decrementing QP refcount (%d), No ae to finish up,"
3289                                        " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3290                                        nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3291                                        original_last_aeq, nesqp->last_aeq);
3292                }
3293        } else {
3294                nes_debug(NES_DBG_MOD_QP, "QP%u Decrementing QP refcount (%d), No ae to finish up,"
3295                                " original_last_aeq = 0x%04X. last_aeq = 0x%04X.\n",
3296                                nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount),
3297                                original_last_aeq, nesqp->last_aeq);
3298        }
3299
3300        err = 0;
3301
3302        nes_debug(NES_DBG_MOD_QP, "QP%u Leaving, refcount=%d\n",
3303                        nesqp->hwqp.qp_id, atomic_read(&nesqp->refcount));
3304
3305        return err;
3306}
3307
3308
3309/**
3310 * nes_muticast_attach
3311 */
3312static int nes_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
3313{
3314        nes_debug(NES_DBG_INIT, "\n");
3315        return -ENOSYS;
3316}
3317
3318
3319/**
3320 * nes_multicast_detach
3321 */
3322static int nes_multicast_detach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid)
3323{
3324        nes_debug(NES_DBG_INIT, "\n");
3325        return -ENOSYS;
3326}
3327
3328
3329/**
3330 * nes_process_mad
3331 */
3332static int nes_process_mad(struct ib_device *ibdev, int mad_flags,
3333                u8 port_num, struct ib_wc *in_wc, struct ib_grh *in_grh,
3334                struct ib_mad *in_mad, struct ib_mad *out_mad)
3335{
3336        nes_debug(NES_DBG_INIT, "\n");
3337        return -ENOSYS;
3338}
3339
3340static inline void
3341fill_wqe_sg_send(struct nes_hw_qp_wqe *wqe, struct ib_send_wr *ib_wr, u32 uselkey)
3342{
3343        int sge_index;
3344        int total_payload_length = 0;
3345        for (sge_index = 0; sge_index < ib_wr->num_sge; sge_index++) {
3346                set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_FRAG0_LOW_IDX+(sge_index*4),
3347                        ib_wr->sg_list[sge_index].addr);
3348                set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_LENGTH0_IDX + (sge_index*4),
3349                        ib_wr->sg_list[sge_index].length);
3350                if (uselkey)
3351                        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_STAG0_IDX + (sge_index*4),
3352                                                (ib_wr->sg_list[sge_index].lkey));
3353                else
3354                        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_STAG0_IDX + (sge_index*4), 0);
3355
3356                total_payload_length += ib_wr->sg_list[sge_index].length;
3357        }
3358        nes_debug(NES_DBG_IW_TX, "UC UC UC, sending total_payload_length=%u \n",
3359                        total_payload_length);
3360        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX,
3361                                total_payload_length);
3362}
3363
3364/**
3365 * nes_post_send
3366 */
3367static int nes_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
3368                struct ib_send_wr **bad_wr)
3369{
3370        u64 u64temp;
3371        unsigned long flags = 0;
3372        struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
3373        struct nes_device *nesdev = nesvnic->nesdev;
3374        struct nes_qp *nesqp = to_nesqp(ibqp);
3375        struct nes_hw_qp_wqe *wqe;
3376        int err;
3377        u32 qsize = nesqp->hwqp.sq_size;
3378        u32 head;
3379        u32 wqe_misc;
3380        u32 wqe_count;
3381        u32 counter;
3382        u32 total_payload_length;
3383
3384        err = 0;
3385        wqe_misc = 0;
3386        wqe_count = 0;
3387        total_payload_length = 0;
3388
3389        if (nesqp->ibqp_state > IB_QPS_RTS)
3390                return -EINVAL;
3391
3392        spin_lock_irqsave(&nesqp->lock, flags);
3393
3394        head = nesqp->hwqp.sq_head;
3395
3396        while (ib_wr) {
3397                /* Check for QP error */
3398                if (nesqp->term_flags) {
3399                        err = -EINVAL;
3400                        break;
3401                }
3402
3403                /* Check for SQ overflow */
3404                if (((head + (2 * qsize) - nesqp->hwqp.sq_tail) % qsize) == (qsize - 1)) {
3405                        err = -EINVAL;
3406                        break;
3407                }
3408
3409                wqe = &nesqp->hwqp.sq_vbase[head];
3410                /* nes_debug(NES_DBG_IW_TX, "processing sq wqe for QP%u at %p, head = %u.\n",
3411                                nesqp->hwqp.qp_id, wqe, head); */
3412                nes_fill_init_qp_wqe(wqe, nesqp, head);
3413                u64temp = (u64)(ib_wr->wr_id);
3414                set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX,
3415                                        u64temp);
3416                        switch (ib_wr->opcode) {
3417                                case IB_WR_SEND:
3418                                        if (ib_wr->send_flags & IB_SEND_SOLICITED) {
3419                                                wqe_misc = NES_IWARP_SQ_OP_SENDSE;
3420                                        } else {
3421                                                wqe_misc = NES_IWARP_SQ_OP_SEND;
3422                                        }
3423                                        if (ib_wr->num_sge > nesdev->nesadapter->max_sge) {
3424                                                err = -EINVAL;
3425                                                break;
3426                                        }
3427                                        if (ib_wr->send_flags & IB_SEND_FENCE) {
3428                                                wqe_misc |= NES_IWARP_SQ_WQE_LOCAL_FENCE;
3429                                        }
3430                                        if ((ib_wr->send_flags & IB_SEND_INLINE) &&
3431                                                        ((nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) == 0) &&
3432                                                        (ib_wr->sg_list[0].length <= 64)) {
3433                                                memcpy(&wqe->wqe_words[NES_IWARP_SQ_WQE_IMM_DATA_START_IDX],
3434                                                               (void *)(unsigned long)ib_wr->sg_list[0].addr, ib_wr->sg_list[0].length);
3435                                                set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX,
3436                                                                ib_wr->sg_list[0].length);
3437                                                wqe_misc |= NES_IWARP_SQ_WQE_IMM_DATA;
3438                                        } else {
3439                                                fill_wqe_sg_send(wqe, ib_wr, 1);
3440                                        }
3441
3442                                        break;
3443                                case IB_WR_RDMA_WRITE:
3444                                        wqe_misc = NES_IWARP_SQ_OP_RDMAW;
3445                                        if (ib_wr->num_sge > nesdev->nesadapter->max_sge) {
3446                                                nes_debug(NES_DBG_IW_TX, "Exceeded max sge, ib_wr=%u, max=%u\n",
3447                                                                ib_wr->num_sge,
3448                                                                nesdev->nesadapter->max_sge);
3449                                                err = -EINVAL;
3450                                                break;
3451                                        }
3452                                        if (ib_wr->send_flags & IB_SEND_FENCE) {
3453                                                wqe_misc |= NES_IWARP_SQ_WQE_LOCAL_FENCE;
3454                                        }
3455
3456                                        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_STAG_IDX,
3457                                                        ib_wr->wr.rdma.rkey);
3458                                        set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_TO_LOW_IDX,
3459                                                        ib_wr->wr.rdma.remote_addr);
3460
3461                                        if ((ib_wr->send_flags & IB_SEND_INLINE) &&
3462                                                        ((nes_drv_opt & NES_DRV_OPT_NO_INLINE_DATA) == 0) &&
3463                                                        (ib_wr->sg_list[0].length <= 64)) {
3464                                                memcpy(&wqe->wqe_words[NES_IWARP_SQ_WQE_IMM_DATA_START_IDX],
3465                                                               (void *)(unsigned long)ib_wr->sg_list[0].addr, ib_wr->sg_list[0].length);
3466                                                set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX,
3467                                                                ib_wr->sg_list[0].length);
3468                                                wqe_misc |= NES_IWARP_SQ_WQE_IMM_DATA;
3469                                        } else {
3470                                                fill_wqe_sg_send(wqe, ib_wr, 1);
3471                                        }
3472                                        wqe->wqe_words[NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX] =
3473                                                        wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX];
3474                                        break;
3475                                case IB_WR_RDMA_READ:
3476                                        /* iWARP only supports 1 sge for RDMA reads */
3477                                        if (ib_wr->num_sge > 1) {
3478                                                nes_debug(NES_DBG_IW_TX, "Exceeded max sge, ib_wr=%u, max=1\n",
3479                                                                ib_wr->num_sge);
3480                                                err = -EINVAL;
3481                                                break;
3482                                        }
3483                                        wqe_misc = NES_IWARP_SQ_OP_RDMAR;
3484                                        set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_TO_LOW_IDX,
3485                                                        ib_wr->wr.rdma.remote_addr);
3486                                        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_STAG_IDX,
3487                                                        ib_wr->wr.rdma.rkey);
3488                                        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX,
3489                                                        ib_wr->sg_list->length);
3490                                        set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
3491                                                        ib_wr->sg_list->addr);
3492                                        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_STAG0_IDX,
3493                                                        ib_wr->sg_list->lkey);
3494                                        break;
3495                                default:
3496                                        /* error */
3497                                        err = -EINVAL;
3498                                        break;
3499                        }
3500
3501                if (ib_wr->send_flags & IB_SEND_SIGNALED) {
3502                        wqe_misc |= NES_IWARP_SQ_WQE_SIGNALED_COMPL;
3503                }
3504                wqe->wqe_words[NES_IWARP_SQ_WQE_MISC_IDX] = cpu_to_le32(wqe_misc);
3505
3506                ib_wr = ib_wr->next;
3507                head++;
3508                wqe_count++;
3509                if (head >= qsize)
3510                        head = 0;
3511
3512        }
3513
3514        nesqp->hwqp.sq_head = head;
3515        barrier();
3516        while (wqe_count) {
3517                counter = min(wqe_count, ((u32)255));
3518                wqe_count -= counter;
3519                nes_write32(nesdev->regs + NES_WQE_ALLOC,
3520                                (counter << 24) | 0x00800000 | nesqp->hwqp.qp_id);
3521        }
3522
3523        spin_unlock_irqrestore(&nesqp->lock, flags);
3524
3525        if (err)
3526                *bad_wr = ib_wr;
3527        return err;
3528}
3529
3530
3531/**
3532 * nes_post_recv
3533 */
3534static int nes_post_recv(struct ib_qp *ibqp, struct ib_recv_wr *ib_wr,
3535                struct ib_recv_wr **bad_wr)
3536{
3537        u64 u64temp;
3538        unsigned long flags = 0;
3539        struct nes_vnic *nesvnic = to_nesvnic(ibqp->device);
3540        struct nes_device *nesdev = nesvnic->nesdev;
3541        struct nes_qp *nesqp = to_nesqp(ibqp);
3542        struct nes_hw_qp_wqe *wqe;
3543        int err = 0;
3544        int sge_index;
3545        u32 qsize = nesqp->hwqp.rq_size;
3546        u32 head;
3547        u32 wqe_count = 0;
3548        u32 counter;
3549        u32 total_payload_length;
3550
3551        if (nesqp->ibqp_state > IB_QPS_RTS)
3552                return -EINVAL;
3553
3554        spin_lock_irqsave(&nesqp->lock, flags);
3555
3556        head = nesqp->hwqp.rq_head;
3557
3558        while (ib_wr) {
3559                /* Check for QP error */
3560                if (nesqp->term_flags) {
3561                        err = -EINVAL;
3562                        break;
3563                }
3564
3565                if (ib_wr->num_sge > nesdev->nesadapter->max_sge) {
3566                        err = -EINVAL;
3567                        break;
3568                }
3569                /* Check for RQ overflow */
3570                if (((head + (2 * qsize) - nesqp->hwqp.rq_tail) % qsize) == (qsize - 1)) {
3571                        err = -EINVAL;
3572                        break;
3573                }
3574
3575                nes_debug(NES_DBG_IW_RX, "ibwr sge count = %u.\n", ib_wr->num_sge);
3576                wqe = &nesqp->hwqp.rq_vbase[head];
3577
3578                /* nes_debug(NES_DBG_IW_RX, "QP%u:processing rq wqe at %p, head = %u.\n",
3579                                nesqp->hwqp.qp_id, wqe, head); */
3580                nes_fill_init_qp_wqe(wqe, nesqp, head);
3581                u64temp = (u64)(ib_wr->wr_id);
3582                set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX,
3583                                        u64temp);
3584                total_payload_length = 0;
3585                for (sge_index=0; sge_index < ib_wr->num_sge; sge_index++) {
3586                        set_wqe_64bit_value(wqe->wqe_words, NES_IWARP_RQ_WQE_FRAG0_LOW_IDX+(sge_index*4),
3587                                        ib_wr->sg_list[sge_index].addr);
3588                        set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_RQ_WQE_LENGTH0_IDX+(sge_index*4),
3589                                        ib_wr->sg_list[sge_index].length);
3590                        set_wqe_32bit_value(wqe->wqe_words,NES_IWARP_RQ_WQE_STAG0_IDX+(sge_index*4),
3591                                        ib_wr->sg_list[sge_index].lkey);
3592
3593                        total_payload_length += ib_wr->sg_list[sge_index].length;
3594                }
3595                set_wqe_32bit_value(wqe->wqe_words, NES_IWARP_RQ_WQE_TOTAL_PAYLOAD_IDX,
3596                                        total_payload_length);
3597
3598                ib_wr = ib_wr->next;
3599                head++;
3600                wqe_count++;
3601                if (head >= qsize)
3602                        head = 0;
3603        }
3604
3605        nesqp->hwqp.rq_head = head;
3606        barrier();
3607        while (wqe_count) {
3608                counter = min(wqe_count, ((u32)255));
3609                wqe_count -= counter;
3610                nes_write32(nesdev->regs+NES_WQE_ALLOC, (counter<<24) | nesqp->hwqp.qp_id);
3611        }
3612
3613        spin_unlock_irqrestore(&nesqp->lock, flags);
3614
3615        if (err)
3616                *bad_wr = ib_wr;
3617        return err;
3618}
3619
3620
3621/**
3622 * nes_poll_cq
3623 */
3624static int nes_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *entry)
3625{
3626        u64 u64temp;
3627        u64 wrid;
3628        unsigned long flags = 0;
3629        struct nes_vnic *nesvnic = to_nesvnic(ibcq->device);
3630        struct nes_device *nesdev = nesvnic->nesdev;
3631        struct nes_cq *nescq = to_nescq(ibcq);
3632        struct nes_qp *nesqp;
3633        struct nes_hw_cqe cqe;
3634        u32 head;
3635        u32 wq_tail = 0;
3636        u32 cq_size;
3637        u32 cqe_count = 0;
3638        u32 wqe_index;
3639        u32 u32temp;
3640        u32 move_cq_head = 1;
3641        u32 err_code;
3642
3643        nes_debug(NES_DBG_CQ, "\n");
3644
3645        spin_lock_irqsave(&nescq->lock, flags);
3646
3647        head = nescq->hw_cq.cq_head;
3648        cq_size = nescq->hw_cq.cq_size;
3649
3650        while (cqe_count < num_entries) {
3651                if ((le32_to_cpu(nescq->hw_cq.cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX]) &
3652                                NES_CQE_VALID) == 0)
3653                        break;
3654
3655                /*
3656                 * Make sure we read CQ entry contents *after*
3657                 * we've checked the valid bit.
3658                 */
3659                rmb();
3660
3661                cqe = nescq->hw_cq.cq_vbase[head];
3662                u32temp = le32_to_cpu(cqe.cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX]);
3663                wqe_index = u32temp & (nesdev->nesadapter->max_qp_wr - 1);
3664                u32temp &= ~(NES_SW_CONTEXT_ALIGN-1);
3665                /* parse CQE, get completion context from WQE (either rq or sq) */
3666                u64temp = (((u64)(le32_to_cpu(cqe.cqe_words[NES_CQE_COMP_COMP_CTX_HIGH_IDX])))<<32) |
3667                                ((u64)u32temp);
3668
3669                if (u64temp) {
3670                        nesqp = (struct nes_qp *)(unsigned long)u64temp;
3671                        memset(entry, 0, sizeof *entry);
3672                        if (cqe.cqe_words[NES_CQE_ERROR_CODE_IDX] == 0) {
3673                                entry->status = IB_WC_SUCCESS;
3674                        } else {
3675                                err_code = le32_to_cpu(cqe.cqe_words[NES_CQE_ERROR_CODE_IDX]);
3676                                if (NES_IWARP_CQE_MAJOR_DRV == (err_code >> 16)) {
3677                                        entry->status = err_code & 0x0000ffff;
3678
3679                                        /* The rest of the cqe's will be marked as flushed */
3680                                        nescq->hw_cq.cq_vbase[head].cqe_words[NES_CQE_ERROR_CODE_IDX] =
3681                                                cpu_to_le32((NES_IWARP_CQE_MAJOR_FLUSH << 16) |
3682                                                            NES_IWARP_CQE_MINOR_FLUSH);
3683                                } else
3684                                        entry->status = IB_WC_WR_FLUSH_ERR;
3685                        }
3686
3687                        entry->qp = &nesqp->ibqp;
3688                        entry->src_qp = nesqp->hwqp.qp_id;
3689
3690                        if (le32_to_cpu(cqe.cqe_words[NES_CQE_OPCODE_IDX]) & NES_CQE_SQ) {
3691                                if (nesqp->skip_lsmm) {
3692                                        nesqp->skip_lsmm = 0;
3693                                        nesqp->hwqp.sq_tail++;
3694                                }
3695
3696                                /* Working on a SQ Completion*/
3697                                wrid = (((u64)(cpu_to_le32((u32)nesqp->hwqp.sq_vbase[wqe_index].
3698                                                wqe_words[NES_IWARP_SQ_WQE_COMP_SCRATCH_HIGH_IDX]))) << 32) |
3699                                                ((u64)(cpu_to_le32((u32)nesqp->hwqp.sq_vbase[wqe_index].
3700                                                wqe_words[NES_IWARP_SQ_WQE_COMP_SCRATCH_LOW_IDX])));
3701                                entry->byte_len = le32_to_cpu(nesqp->hwqp.sq_vbase[wqe_index].
3702                                                wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX]);
3703
3704                                switch (le32_to_cpu(nesqp->hwqp.sq_vbase[wqe_index].
3705                                                wqe_words[NES_IWARP_SQ_WQE_MISC_IDX]) & 0x3f) {
3706                                        case NES_IWARP_SQ_OP_RDMAW:
3707                                                nes_debug(NES_DBG_CQ, "Operation = RDMA WRITE.\n");
3708                                                entry->opcode = IB_WC_RDMA_WRITE;
3709                                                break;
3710                                        case NES_IWARP_SQ_OP_RDMAR:
3711                                                nes_debug(NES_DBG_CQ, "Operation = RDMA READ.\n");
3712                                                entry->opcode = IB_WC_RDMA_READ;
3713                                                entry->byte_len = le32_to_cpu(nesqp->hwqp.sq_vbase[wqe_index].
3714                                                                wqe_words[NES_IWARP_SQ_WQE_RDMA_LENGTH_IDX]);
3715                                                break;
3716                                        case NES_IWARP_SQ_OP_SENDINV:
3717                                        case NES_IWARP_SQ_OP_SENDSEINV:
3718                                        case NES_IWARP_SQ_OP_SEND:
3719                                        case NES_IWARP_SQ_OP_SENDSE:
3720                                                nes_debug(NES_DBG_CQ, "Operation = Send.\n");
3721                                                entry->opcode = IB_WC_SEND;
3722                                                break;
3723                                }
3724
3725                                nesqp->hwqp.sq_tail = (wqe_index+1)&(nesqp->hwqp.sq_size - 1);
3726                                if ((entry->status != IB_WC_SUCCESS) && (nesqp->hwqp.sq_tail != nesqp->hwqp.sq_head)) {
3727                                        move_cq_head = 0;
3728                                        wq_tail = nesqp->hwqp.sq_tail;
3729                                }
3730                        } else {
3731                                /* Working on a RQ Completion*/
3732                                entry->byte_len = le32_to_cpu(cqe.cqe_words[NES_CQE_PAYLOAD_LENGTH_IDX]);
3733                                wrid = ((u64)(le32_to_cpu(nesqp->hwqp.rq_vbase[wqe_index].wqe_words[NES_IWARP_RQ_WQE_COMP_SCRATCH_LOW_IDX]))) |
3734                                        ((u64)(le32_to_cpu(nesqp->hwqp.rq_vbase[wqe_index].wqe_words[NES_IWARP_RQ_WQE_COMP_SCRATCH_HIGH_IDX]))<<32);
3735                                        entry->opcode = IB_WC_RECV;
3736
3737                                nesqp->hwqp.rq_tail = (wqe_index+1)&(nesqp->hwqp.rq_size - 1);
3738                                if ((entry->status != IB_WC_SUCCESS) && (nesqp->hwqp.rq_tail != nesqp->hwqp.rq_head)) {
3739                                        move_cq_head = 0;
3740                                        wq_tail = nesqp->hwqp.rq_tail;
3741                                }
3742                        }
3743
3744                        entry->wr_id = wrid;
3745                        entry++;
3746                        cqe_count++;
3747                }
3748
3749                if (move_cq_head) {
3750                        nescq->hw_cq.cq_vbase[head].cqe_words[NES_CQE_OPCODE_IDX] = 0;
3751                        if (++head >= cq_size)
3752                                head = 0;
3753                        nescq->polled_completions++;
3754
3755                        if ((nescq->polled_completions > (cq_size / 2)) ||
3756                                        (nescq->polled_completions == 255)) {
3757                                nes_debug(NES_DBG_CQ, "CQ%u Issuing CQE Allocate since more than half of cqes"
3758                                        " are pending %u of %u.\n",
3759                                        nescq->hw_cq.cq_number, nescq->polled_completions, cq_size);
3760                                nes_write32(nesdev->regs+NES_CQE_ALLOC,
3761                                        nescq->hw_cq.cq_number | (nescq->polled_completions << 16));
3762                                nescq->polled_completions = 0;
3763                        }
3764                } else {
3765                        /* Update the wqe index and set status to flush */
3766                        wqe_index = le32_to_cpu(cqe.cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX]);
3767                        wqe_index = (wqe_index & (~(nesdev->nesadapter->max_qp_wr - 1))) | wq_tail;
3768                        nescq->hw_cq.cq_vbase[head].cqe_words[NES_CQE_COMP_COMP_CTX_LOW_IDX] =
3769                                cpu_to_le32(wqe_index);
3770                        move_cq_head = 1; /* ready for next pass */
3771                }
3772        }
3773
3774        if (nescq->polled_completions) {
3775                nes_write32(nesdev->regs+NES_CQE_ALLOC,
3776                                nescq->hw_cq.cq_number | (nescq->polled_completions << 16));
3777                nescq->polled_completions = 0;
3778        }
3779
3780        nescq->hw_cq.cq_head = head;
3781        nes_debug(NES_DBG_CQ, "Reporting %u completions for CQ%u.\n",
3782                        cqe_count, nescq->hw_cq.cq_number);
3783
3784        spin_unlock_irqrestore(&nescq->lock, flags);
3785
3786        return cqe_count;
3787}
3788
3789
3790/**
3791 * nes_req_notify_cq
3792 */
3793static int nes_req_notify_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags notify_flags)
3794                {
3795        struct nes_vnic *nesvnic = to_nesvnic(ibcq->device);
3796        struct nes_device *nesdev = nesvnic->nesdev;
3797        struct nes_cq *nescq = to_nescq(ibcq);
3798        u32 cq_arm;
3799
3800        nes_debug(NES_DBG_CQ, "Requesting notification for CQ%u.\n",
3801                        nescq->hw_cq.cq_number);
3802
3803        cq_arm = nescq->hw_cq.cq_number;
3804        if ((notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_NEXT_COMP)
3805                cq_arm |= NES_CQE_ALLOC_NOTIFY_NEXT;
3806        else if ((notify_flags & IB_CQ_SOLICITED_MASK) == IB_CQ_SOLICITED)
3807                cq_arm |= NES_CQE_ALLOC_NOTIFY_SE;
3808        else
3809                return -EINVAL;
3810
3811        nes_write32(nesdev->regs+NES_CQE_ALLOC, cq_arm);
3812        nes_read32(nesdev->regs+NES_CQE_ALLOC);
3813
3814        return 0;
3815}
3816
3817
3818/**
3819 * nes_init_ofa_device
3820 */
3821struct nes_ib_device *nes_init_ofa_device(struct net_device *netdev)
3822{
3823        struct nes_ib_device *nesibdev;
3824        struct nes_vnic *nesvnic = netdev_priv(netdev);
3825        struct nes_device *nesdev = nesvnic->nesdev;
3826
3827        nesibdev = (struct nes_ib_device *)ib_alloc_device(sizeof(struct nes_ib_device));
3828        if (nesibdev == NULL) {
3829                return NULL;
3830        }
3831        strlcpy(nesibdev->ibdev.name, "nes%d", IB_DEVICE_NAME_MAX);
3832        nesibdev->ibdev.owner = THIS_MODULE;
3833
3834        nesibdev->ibdev.node_type = RDMA_NODE_RNIC;
3835        memset(&nesibdev->ibdev.node_guid, 0, sizeof(nesibdev->ibdev.node_guid));
3836        memcpy(&nesibdev->ibdev.node_guid, netdev->dev_addr, 6);
3837
3838        nesibdev->ibdev.uverbs_cmd_mask =
3839                        (1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
3840                        (1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |
3841                        (1ull << IB_USER_VERBS_CMD_QUERY_PORT) |
3842                        (1ull << IB_USER_VERBS_CMD_ALLOC_PD) |
3843                        (1ull << IB_USER_VERBS_CMD_DEALLOC_PD) |
3844                        (1ull << IB_USER_VERBS_CMD_REG_MR) |
3845                        (1ull << IB_USER_VERBS_CMD_DEREG_MR) |
3846                        (1ull << IB_USER_VERBS_CMD_CREATE_COMP_CHANNEL) |
3847                        (1ull << IB_USER_VERBS_CMD_CREATE_CQ) |
3848                        (1ull << IB_USER_VERBS_CMD_DESTROY_CQ) |
3849                        (1ull << IB_USER_VERBS_CMD_CREATE_AH) |
3850                        (1ull << IB_USER_VERBS_CMD_DESTROY_AH) |
3851                        (1ull << IB_USER_VERBS_CMD_REQ_NOTIFY_CQ) |
3852                        (1ull << IB_USER_VERBS_CMD_CREATE_QP) |
3853                        (1ull << IB_USER_VERBS_CMD_MODIFY_QP) |
3854                        (1ull << IB_USER_VERBS_CMD_POLL_CQ) |
3855                        (1ull << IB_USER_VERBS_CMD_DESTROY_QP) |
3856                        (1ull << IB_USER_VERBS_CMD_ALLOC_MW) |
3857                        (1ull << IB_USER_VERBS_CMD_BIND_MW) |
3858                        (1ull << IB_USER_VERBS_CMD_DEALLOC_MW) |
3859                        (1ull << IB_USER_VERBS_CMD_POST_RECV) |
3860                        (1ull << IB_USER_VERBS_CMD_POST_SEND);
3861
3862        nesibdev->ibdev.phys_port_cnt = 1;
3863        nesibdev->ibdev.num_comp_vectors = 1;
3864        nesibdev->ibdev.dma_device = &nesdev->pcidev->dev;
3865        nesibdev->ibdev.dev.parent = &nesdev->pcidev->dev;
3866        nesibdev->ibdev.query_device = nes_query_device;
3867        nesibdev->ibdev.query_port = nes_query_port;
3868        nesibdev->ibdev.modify_port = nes_modify_port;
3869        nesibdev->ibdev.query_pkey = nes_query_pkey;
3870        nesibdev->ibdev.query_gid = nes_query_gid;
3871        nesibdev->ibdev.alloc_ucontext = nes_alloc_ucontext;
3872        nesibdev->ibdev.dealloc_ucontext = nes_dealloc_ucontext;
3873        nesibdev->ibdev.mmap = nes_mmap;
3874        nesibdev->ibdev.alloc_pd = nes_alloc_pd;
3875        nesibdev->ibdev.dealloc_pd = nes_dealloc_pd;
3876        nesibdev->ibdev.create_ah = nes_create_ah;
3877        nesibdev->ibdev.destroy_ah = nes_destroy_ah;
3878        nesibdev->ibdev.create_qp = nes_create_qp;
3879        nesibdev->ibdev.modify_qp = nes_modify_qp;
3880        nesibdev->ibdev.query_qp = nes_query_qp;
3881        nesibdev->ibdev.destroy_qp = nes_destroy_qp;
3882        nesibdev->ibdev.create_cq = nes_create_cq;
3883        nesibdev->ibdev.destroy_cq = nes_destroy_cq;
3884        nesibdev->ibdev.poll_cq = nes_poll_cq;
3885        nesibdev->ibdev.get_dma_mr = nes_get_dma_mr;
3886        nesibdev->ibdev.reg_phys_mr = nes_reg_phys_mr;
3887        nesibdev->ibdev.reg_user_mr = nes_reg_user_mr;
3888        nesibdev->ibdev.dereg_mr = nes_dereg_mr;
3889        nesibdev->ibdev.alloc_mw = nes_alloc_mw;
3890        nesibdev->ibdev.dealloc_mw = nes_dealloc_mw;
3891        nesibdev->ibdev.bind_mw = nes_bind_mw;
3892
3893        nesibdev->ibdev.alloc_fmr = nes_alloc_fmr;
3894        nesibdev->ibdev.unmap_fmr = nes_unmap_fmr;
3895        nesibdev->ibdev.dealloc_fmr = nes_dealloc_fmr;
3896        nesibdev->ibdev.map_phys_fmr = nes_map_phys_fmr;
3897
3898        nesibdev->ibdev.attach_mcast = nes_multicast_attach;
3899        nesibdev->ibdev.detach_mcast = nes_multicast_detach;
3900        nesibdev->ibdev.process_mad = nes_process_mad;
3901
3902        nesibdev->ibdev.req_notify_cq = nes_req_notify_cq;
3903        nesibdev->ibdev.post_send = nes_post_send;
3904        nesibdev->ibdev.post_recv = nes_post_recv;
3905
3906        nesibdev->ibdev.iwcm = kzalloc(sizeof(*nesibdev->ibdev.iwcm), GFP_KERNEL);
3907        if (nesibdev->ibdev.iwcm == NULL) {
3908                ib_dealloc_device(&nesibdev->ibdev);
3909                return NULL;
3910        }
3911        nesibdev->ibdev.iwcm->add_ref = nes_add_ref;
3912        nesibdev->ibdev.iwcm->rem_ref = nes_rem_ref;
3913        nesibdev->ibdev.iwcm->get_qp = nes_get_qp;
3914        nesibdev->ibdev.iwcm->connect = nes_connect;
3915        nesibdev->ibdev.iwcm->accept = nes_accept;
3916        nesibdev->ibdev.iwcm->reject = nes_reject;
3917        nesibdev->ibdev.iwcm->create_listen = nes_create_listen;
3918        nesibdev->ibdev.iwcm->destroy_listen = nes_destroy_listen;
3919
3920        return nesibdev;
3921}
3922
3923
3924/**
3925 * nes_destroy_ofa_device
3926 */
3927void nes_destroy_ofa_device(struct nes_ib_device *nesibdev)
3928{
3929        if (nesibdev == NULL)
3930                return;
3931
3932        nes_unregister_ofa_device(nesibdev);
3933
3934        kfree(nesibdev->ibdev.iwcm);
3935        ib_dealloc_device(&nesibdev->ibdev);
3936}
3937
3938
3939/**
3940 * nes_register_ofa_device
3941 */
3942int nes_register_ofa_device(struct nes_ib_device *nesibdev)
3943{
3944        struct nes_vnic *nesvnic = nesibdev->nesvnic;
3945        struct nes_device *nesdev = nesvnic->nesdev;
3946        struct nes_adapter *nesadapter = nesdev->nesadapter;
3947        int i, ret;
3948
3949        ret = ib_register_device(&nesvnic->nesibdev->ibdev);
3950        if (ret) {
3951                return ret;
3952        }
3953
3954        /* Get the resources allocated to this device */
3955        nesibdev->max_cq = (nesadapter->max_cq-NES_FIRST_QPN) / nesadapter->port_count;
3956        nesibdev->max_mr = nesadapter->max_mr / nesadapter->port_count;
3957        nesibdev->max_qp = (nesadapter->max_qp-NES_FIRST_QPN) / nesadapter->port_count;
3958        nesibdev->max_pd = nesadapter->max_pd / nesadapter->port_count;
3959
3960        for (i = 0; i < ARRAY_SIZE(nes_dev_attributes); ++i) {
3961                ret = device_create_file(&nesibdev->ibdev.dev, nes_dev_attributes[i]);
3962                if (ret) {
3963                        while (i > 0) {
3964                                i--;
3965                                device_remove_file(&nesibdev->ibdev.dev,
3966                                                   nes_dev_attributes[i]);
3967                        }
3968                        ib_unregister_device(&nesibdev->ibdev);
3969                        return ret;
3970                }
3971        }
3972
3973        nesvnic->of_device_registered = 1;
3974
3975        return 0;
3976}
3977
3978
3979/**
3980 * nes_unregister_ofa_device
3981 */
3982static void nes_unregister_ofa_device(struct nes_ib_device *nesibdev)
3983{
3984        struct nes_vnic *nesvnic = nesibdev->nesvnic;
3985        int i;
3986
3987        for (i = 0; i < ARRAY_SIZE(nes_dev_attributes); ++i) {
3988                device_remove_file(&nesibdev->ibdev.dev, nes_dev_attributes[i]);
3989        }
3990
3991        if (nesvnic->of_device_registered) {
3992                ib_unregister_device(&nesibdev->ibdev);
3993        }
3994
3995        nesvnic->of_device_registered = 0;
3996}
3997