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


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

FreeBSD/Linux Kernel Cross Reference
sys/dev/qlnx/qlnxr/qlnxr_verbs.c

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

    1 /*
    2  * Copyright (c) 2018-2019 Cavium, Inc.
    3  * All rights reserved.
    4  *
    5  *  Redistribution and use in source and binary forms, with or without
    6  *  modification, are permitted provided that the following conditions
    7  *  are met:
    8  *
    9  *  1. Redistributions of source code must retain the above copyright
   10  *     notice, this list of conditions and the following disclaimer.
   11  *  2. Redistributions in binary form must reproduce the above copyright
   12  *     notice, this list of conditions and the following disclaimer in the
   13  *     documentation and/or other materials provided with the distribution.
   14  *
   15  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   16  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   17  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   18  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   19  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   20  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   21  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   22  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   23  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   24  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   25  *  POSSIBILITY OF SUCH DAMAGE.
   26  */
   27 
   28 /*
   29  * File: qlnxr_verbs.c
   30  */
   31 #include <sys/cdefs.h>
   32 __FBSDID("$FreeBSD$");
   33 
   34 #include "qlnxr_def.h"
   35 #include "rdma_common.h"
   36 #include "qlnxr_roce.h"
   37 #include "qlnxr_cm.h"
   38 
   39 #define HILO_U64(hi, lo)                ((((u64)(hi)) << 32) + (lo))
   40 
   41 #define TYPEPTR_ADDR_SET(type_ptr, field, vaddr)                        \
   42         do {                                                            \
   43                 (type_ptr)->field.hi = cpu_to_le32(upper_32_bits(vaddr));\
   44                 (type_ptr)->field.lo = cpu_to_le32(lower_32_bits(vaddr));\
   45         } while (0)
   46 
   47 #define RQ_SGE_SET(sge, vaddr, vlength, vflags)                 \
   48         do {                                                    \
   49                 TYPEPTR_ADDR_SET(sge, addr, vaddr);             \
   50                 (sge)->length = cpu_to_le32(vlength);           \
   51                 (sge)->flags = cpu_to_le32(vflags);             \
   52         } while (0)
   53 
   54 #define SRQ_HDR_SET(hdr, vwr_id, num_sge)                       \
   55         do {                                                    \
   56                 TYPEPTR_ADDR_SET(hdr, wr_id, vwr_id);           \
   57                 (hdr)->num_sges = num_sge;                      \
   58         } while (0)
   59 
   60 #define SRQ_SGE_SET(sge, vaddr, vlength, vlkey)                 \
   61         do {                                                    \
   62                 TYPEPTR_ADDR_SET(sge, addr, vaddr);             \
   63                 (sge)->length = cpu_to_le32(vlength);           \
   64                 (sge)->l_key = cpu_to_le32(vlkey);              \
   65         } while (0)
   66 
   67 #define NIPQUAD(addr) \
   68         ((unsigned char *)&addr)[0], \
   69         ((unsigned char *)&addr)[1], \
   70         ((unsigned char *)&addr)[2], \
   71         ((unsigned char *)&addr)[3]
   72 
   73 static int
   74 qlnxr_check_srq_params(struct qlnxr_dev *dev,
   75         struct ib_srq_init_attr *attrs);
   76 
   77 static int
   78 qlnxr_init_srq_user_params(struct ib_ucontext *ib_ctx,
   79         struct qlnxr_srq *srq,
   80         struct qlnxr_create_srq_ureq *ureq,
   81         int access, int dmasync);
   82 
   83 static int
   84 qlnxr_alloc_srq_kernel_params(struct qlnxr_srq *srq,
   85         struct qlnxr_dev *dev,
   86         struct ib_srq_init_attr *init_attr);
   87 
   88 static int
   89 qlnxr_copy_srq_uresp(struct qlnxr_dev *dev,
   90         struct qlnxr_srq *srq,
   91         struct ib_udata *udata);
   92 
   93 static void
   94 qlnxr_free_srq_user_params(struct qlnxr_srq *srq);
   95 
   96 static void
   97 qlnxr_free_srq_kernel_params(struct qlnxr_srq *srq);
   98 
   99 static u32
  100 qlnxr_srq_elem_left(struct qlnxr_srq_hwq_info *hw_srq);
  101 
  102 int
  103 qlnxr_iw_query_gid(struct ib_device *ibdev, u8 port, int index,
  104         union ib_gid *sgid)
  105 {
  106         struct qlnxr_dev        *dev;
  107         qlnx_host_t             *ha;
  108 
  109         dev = get_qlnxr_dev(ibdev);
  110         ha = dev->ha;
  111 
  112         QL_DPRINT12(ha, "enter\n");
  113 
  114         memset(sgid->raw, 0, sizeof(sgid->raw));
  115 
  116         memcpy(sgid->raw, dev->ha->primary_mac, sizeof (dev->ha->primary_mac));
  117 
  118         QL_DPRINT12(ha, "exit\n");
  119 
  120         return 0;
  121 }
  122 
  123 int
  124 qlnxr_query_gid(struct ib_device *ibdev, u8 port, int index,
  125         union ib_gid *sgid)
  126 {
  127         struct qlnxr_dev        *dev;
  128         qlnx_host_t             *ha;
  129 
  130         dev = get_qlnxr_dev(ibdev);
  131         ha = dev->ha;
  132         QL_DPRINT12(ha, "enter index: %d\n", index);
  133 #if 0
  134         int ret = 0;
  135         /* @@@: if DEFINE_ROCE_GID_TABLE to be used here */
  136         //if (!rdma_cap_roce_gid_table(ibdev, port)) {
  137         if (!(rdma_protocol_roce(ibdev, port) &&
  138                 ibdev->add_gid && ibdev->del_gid)) {
  139                 QL_DPRINT11(ha, "acquire gid failed\n");
  140                 return -ENODEV;
  141         }
  142 
  143         ret = ib_get_cached_gid(ibdev, port, index, sgid, NULL);
  144         if (ret == -EAGAIN) {
  145                 memcpy(sgid, &zgid, sizeof(*sgid));
  146                 return 0;
  147         }
  148 #endif
  149         if ((index >= QLNXR_MAX_SGID) || (index < 0)) {
  150                 QL_DPRINT12(ha, "invalid gid index %d\n", index);
  151                 memset(sgid, 0, sizeof(*sgid));
  152                 return -EINVAL;
  153         }
  154         memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid));
  155 
  156         QL_DPRINT12(ha, "exit : %p\n", sgid);
  157 
  158         return 0;
  159 }
  160 
  161 int
  162 qlnxr_create_srq(struct ib_srq *ibsrq,
  163                  struct ib_srq_init_attr *init_attr,
  164                  struct ib_udata *udata)
  165 {
  166         struct qlnxr_dev        *dev;
  167         qlnx_host_t             *ha;
  168         struct ecore_rdma_destroy_srq_in_params destroy_in_params;
  169         struct ecore_rdma_create_srq_out_params out_params;
  170         struct ecore_rdma_create_srq_in_params in_params;
  171         u64 pbl_base_addr, phy_prod_pair_addr;
  172         struct qlnxr_srq_hwq_info *hw_srq;
  173         struct qlnxr_ucontext *ctx;
  174         struct qlnxr_create_srq_ureq ureq;
  175         u32 page_cnt, page_size;
  176         struct qlnxr_srq *srq = get_qlnxr_srq(ibsrq);
  177         int ret = 0;
  178 
  179         dev = get_qlnxr_dev(ibsrq->device);
  180         ha = dev->ha;
  181 
  182         QL_DPRINT12(ha, "enter\n");
  183 
  184         ret = qlnxr_check_srq_params(dev, init_attr);
  185 
  186         srq->dev = dev;
  187         hw_srq = &srq->hw_srq;
  188         spin_lock_init(&srq->lock);
  189         memset(&in_params, 0, sizeof(in_params));
  190 
  191         if (udata) {
  192                 ctx = rdma_udata_to_drv_context(
  193                     udata, struct qlnxr_ucontext, ibucontext);
  194 
  195                 memset(&ureq, 0, sizeof(ureq));
  196                 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
  197                         udata->inlen))) {
  198                         QL_DPRINT11(ha, "problem"
  199                                 " copying data from user space\n");
  200                         goto err0;
  201                 }
  202 
  203                 ret = qlnxr_init_srq_user_params(&ctx->ibucontext, srq, &ureq, 0, 0);
  204                 if (ret)
  205                         goto err0;
  206 
  207                 page_cnt = srq->usrq.pbl_info.num_pbes;
  208                 pbl_base_addr = srq->usrq.pbl_tbl->pa;
  209                 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
  210                 // @@@ : if DEFINE_IB_UMEM_PAGE_SHIFT
  211                 // page_size = BIT(srq->usrq.umem->page_shift);
  212                 // else
  213                 page_size = srq->usrq.umem->page_size;
  214         } else {
  215                 struct ecore_chain *pbl;
  216                 ret = qlnxr_alloc_srq_kernel_params(srq, dev, init_attr);
  217                 if (ret)
  218                         goto err0;
  219                 pbl = &hw_srq->pbl;
  220 
  221                 page_cnt = ecore_chain_get_page_cnt(pbl);
  222                 pbl_base_addr = ecore_chain_get_pbl_phys(pbl);
  223                 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
  224                 page_size = pbl->elem_per_page << 4;
  225         }
  226 
  227         in_params.pd_id = get_qlnxr_pd(ibsrq->pd)->pd_id;
  228         in_params.pbl_base_addr = pbl_base_addr;
  229         in_params.prod_pair_addr = phy_prod_pair_addr;
  230         in_params.num_pages = page_cnt;
  231         in_params.page_size = page_size;
  232 
  233         ret = ecore_rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
  234         if (ret)
  235                 goto err1;
  236 
  237         srq->srq_id = out_params.srq_id;
  238 
  239         if (udata) {
  240                 ret = qlnxr_copy_srq_uresp(dev, srq, udata);
  241                 if (ret)
  242                         goto err2;
  243         }
  244 
  245         QL_DPRINT12(ha, "created srq with srq_id = 0x%0x\n", srq->srq_id);
  246         return (0);
  247 err2:
  248         memset(&in_params, 0, sizeof(in_params));
  249         destroy_in_params.srq_id = srq->srq_id;
  250         ecore_rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
  251 
  252 err1:
  253         if (udata)
  254                 qlnxr_free_srq_user_params(srq);
  255         else
  256                 qlnxr_free_srq_kernel_params(srq);
  257 
  258 err0:
  259         return (-EFAULT);
  260 }
  261 
  262 void
  263 qlnxr_destroy_srq(struct ib_srq *ibsrq, struct ib_udata *udata)
  264 {
  265         struct qlnxr_dev        *dev;
  266         struct qlnxr_srq        *srq;
  267         qlnx_host_t             *ha;
  268         struct ecore_rdma_destroy_srq_in_params in_params;
  269 
  270         srq = get_qlnxr_srq(ibsrq);
  271         dev = srq->dev;
  272         ha = dev->ha;
  273 
  274         memset(&in_params, 0, sizeof(in_params));
  275         in_params.srq_id = srq->srq_id;
  276 
  277         ecore_rdma_destroy_srq(dev->rdma_ctx, &in_params);
  278 
  279         if (ibsrq->pd->uobject && ibsrq->pd->uobject->context)
  280                 qlnxr_free_srq_user_params(srq);
  281         else
  282                 qlnxr_free_srq_kernel_params(srq);
  283 
  284         QL_DPRINT12(ha, "destroyed srq_id=0x%0x\n", srq->srq_id);
  285 }
  286 
  287 int
  288 qlnxr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
  289         enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
  290 {
  291         struct qlnxr_dev        *dev;
  292         struct qlnxr_srq        *srq;
  293         qlnx_host_t             *ha;
  294         struct ecore_rdma_modify_srq_in_params in_params;
  295         int ret = 0;
  296 
  297         srq = get_qlnxr_srq(ibsrq);
  298         dev = srq->dev;
  299         ha = dev->ha;
  300 
  301         QL_DPRINT12(ha, "enter\n");
  302         if (attr_mask & IB_SRQ_MAX_WR) {
  303                 QL_DPRINT12(ha, "invalid attribute mask=0x%x"
  304                         " specified for %p\n", attr_mask, srq);
  305                 return -EINVAL;
  306         }
  307 
  308         if (attr_mask & IB_SRQ_LIMIT) {
  309                 if (attr->srq_limit >= srq->hw_srq.max_wr) {
  310                         QL_DPRINT12(ha, "invalid srq_limit=0x%x"
  311                                 " (max_srq_limit = 0x%x)\n",
  312                                attr->srq_limit, srq->hw_srq.max_wr);
  313                         return -EINVAL; 
  314                 }
  315                 memset(&in_params, 0, sizeof(in_params));
  316                 in_params.srq_id = srq->srq_id;
  317                 in_params.wqe_limit = attr->srq_limit;
  318                 ret = ecore_rdma_modify_srq(dev->rdma_ctx, &in_params);
  319                 if (ret)
  320                         return ret;
  321         }
  322 
  323         QL_DPRINT12(ha, "modified srq with srq_id = 0x%0x\n", srq->srq_id);
  324         return 0;
  325 }
  326 
  327 int
  328 qlnxr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
  329 {
  330         struct qlnxr_dev        *dev;
  331         struct qlnxr_srq        *srq;
  332         qlnx_host_t             *ha;
  333         struct ecore_rdma_device *qattr;
  334         srq = get_qlnxr_srq(ibsrq);
  335         dev = srq->dev;
  336         ha = dev->ha;
  337         //qattr = &dev->attr;
  338         qattr = ecore_rdma_query_device(dev->rdma_ctx);
  339         QL_DPRINT12(ha, "enter\n");
  340 
  341         if (!dev->rdma_ctx) {
  342                 QL_DPRINT12(ha, "called with invalid params"
  343                         " rdma_ctx is NULL\n");
  344                 return -EINVAL;
  345         }
  346 
  347         srq_attr->srq_limit = qattr->max_srq;
  348         srq_attr->max_wr = qattr->max_srq_wr;
  349         srq_attr->max_sge = qattr->max_sge;
  350 
  351         QL_DPRINT12(ha, "exit\n");
  352         return 0;
  353 }
  354 
  355 /* Increment srq wr producer by one */
  356 static
  357 void qlnxr_inc_srq_wr_prod (struct qlnxr_srq_hwq_info *info)
  358 {
  359         info->wr_prod_cnt++;
  360 }
  361 
  362 /* Increment srq wr consumer by one */
  363 static 
  364 void qlnxr_inc_srq_wr_cons(struct qlnxr_srq_hwq_info *info)
  365 {
  366         info->wr_cons_cnt++;
  367 }
  368 
  369 /* get_port_immutable verb is not available in FreeBSD */
  370 #if 0
  371 int
  372 qlnxr_roce_port_immutable(struct ib_device *ibdev, u8 port_num,
  373         struct ib_port_immutable *immutable)
  374 {
  375         struct qlnxr_dev                *dev;
  376         qlnx_host_t                     *ha;
  377         dev = get_qlnxr_dev(ibdev);
  378         ha = dev->ha;
  379 
  380         QL_DPRINT12(ha, "entered but not implemented!!!\n");
  381 }
  382 #endif
  383 
  384 int
  385 qlnxr_post_srq_recv(struct ib_srq *ibsrq, const struct ib_recv_wr *wr,
  386         const struct ib_recv_wr **bad_wr)
  387 {
  388         struct qlnxr_dev        *dev;
  389         struct qlnxr_srq        *srq;
  390         qlnx_host_t             *ha;
  391         struct qlnxr_srq_hwq_info *hw_srq;
  392         struct ecore_chain *pbl;
  393         unsigned long flags;
  394         int status = 0;
  395         u32 num_sge, offset;
  396 
  397         srq = get_qlnxr_srq(ibsrq);
  398         dev = srq->dev;
  399         ha = dev->ha;
  400         hw_srq = &srq->hw_srq;
  401 
  402         QL_DPRINT12(ha, "enter\n");
  403         spin_lock_irqsave(&srq->lock, flags);
  404 
  405         pbl = &srq->hw_srq.pbl;
  406         while (wr) {
  407                 struct rdma_srq_wqe_header *hdr;
  408                 int i;
  409 
  410                 if (!qlnxr_srq_elem_left(hw_srq) ||
  411                     wr->num_sge > srq->hw_srq.max_sges) {
  412                         QL_DPRINT11(ha, "WR cannot be posted"
  413                             " (%d, %d) || (%d > %d)\n",
  414                             hw_srq->wr_prod_cnt, hw_srq->wr_cons_cnt,
  415                             wr->num_sge, srq->hw_srq.max_sges);
  416                         status = -ENOMEM;
  417                         *bad_wr = wr;
  418                         break;
  419                 }
  420 
  421                 hdr = ecore_chain_produce(pbl);
  422                 num_sge = wr->num_sge;
  423                 /* Set number of sge and WR id in header */
  424                 SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
  425 
  426                 /* PBL is maintained in case of WR granularity.
  427                  * So increment WR producer in case we post a WR.
  428                  */
  429                 qlnxr_inc_srq_wr_prod(hw_srq);
  430                 hw_srq->wqe_prod++;
  431                 hw_srq->sge_prod++;
  432 
  433                 QL_DPRINT12(ha, "SRQ WR : SGEs: %d with wr_id[%d] = %llx\n",
  434                         wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
  435 
  436                 for (i = 0; i < wr->num_sge; i++) {
  437                         struct rdma_srq_sge *srq_sge = 
  438                             ecore_chain_produce(pbl);
  439                         /* Set SGE length, lkey and address */
  440                         SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
  441                                 wr->sg_list[i].length, wr->sg_list[i].lkey);
  442 
  443                         QL_DPRINT12(ha, "[%d]: len %d, key %x, addr %x:%x\n",
  444                                 i, srq_sge->length, srq_sge->l_key,
  445                                 srq_sge->addr.hi, srq_sge->addr.lo);
  446                         hw_srq->sge_prod++;
  447                 }
  448                 wmb();
  449                 /*
  450                  * SRQ prod is 8 bytes. Need to update SGE prod in index
  451                  * in first 4 bytes and need to update WQE prod in next
  452                  * 4 bytes.
  453                  */
  454                 *(srq->hw_srq.virt_prod_pair_addr) = hw_srq->sge_prod;
  455                 offset = offsetof(struct rdma_srq_producers, wqe_prod);
  456                 *((u8 *)srq->hw_srq.virt_prod_pair_addr + offset) =
  457                         hw_srq->wqe_prod;
  458                 /* Flush prod after updating it */
  459                 wmb();
  460                 wr = wr->next;
  461         }       
  462 
  463         QL_DPRINT12(ha, "Elements in SRQ: %d\n",
  464                 ecore_chain_get_elem_left(pbl));
  465 
  466         spin_unlock_irqrestore(&srq->lock, flags);      
  467         QL_DPRINT12(ha, "exit\n");
  468         return status;
  469 }
  470 
  471 int
  472 #if __FreeBSD_version < 1102000
  473 qlnxr_query_device(struct ib_device *ibdev, struct ib_device_attr *attr)
  474 #else
  475 qlnxr_query_device(struct ib_device *ibdev, struct ib_device_attr *attr,
  476         struct ib_udata *udata)
  477 #endif /* #if __FreeBSD_version < 1102000 */
  478 
  479 {
  480         struct qlnxr_dev                *dev;
  481         struct ecore_rdma_device        *qattr;
  482         qlnx_host_t                     *ha;
  483 
  484         dev = get_qlnxr_dev(ibdev);
  485         ha = dev->ha;
  486 
  487         QL_DPRINT12(ha, "enter\n");
  488 
  489 #if __FreeBSD_version > 1102000
  490         if (udata->inlen || udata->outlen)
  491                 return -EINVAL;
  492 #endif /* #if __FreeBSD_version > 1102000 */
  493 
  494         if (dev->rdma_ctx == NULL) {
  495                 return -EINVAL;
  496         }
  497 
  498         qattr = ecore_rdma_query_device(dev->rdma_ctx);
  499 
  500         memset(attr, 0, sizeof *attr);
  501 
  502         attr->fw_ver = qattr->fw_ver;
  503         attr->sys_image_guid = qattr->sys_image_guid;
  504         attr->max_mr_size = qattr->max_mr_size;
  505         attr->page_size_cap = qattr->page_size_caps;
  506         attr->vendor_id = qattr->vendor_id;
  507         attr->vendor_part_id = qattr->vendor_part_id;
  508         attr->hw_ver = qattr->hw_ver;
  509         attr->max_qp = qattr->max_qp;
  510         attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
  511                                         IB_DEVICE_RC_RNR_NAK_GEN |
  512                                         IB_DEVICE_LOCAL_DMA_LKEY |
  513                                         IB_DEVICE_MEM_MGT_EXTENSIONS;
  514 
  515         attr->max_sge = qattr->max_sge;
  516         attr->max_sge_rd = qattr->max_sge;
  517         attr->max_cq = qattr->max_cq;
  518         attr->max_cqe = qattr->max_cqe;
  519         attr->max_mr = qattr->max_mr;
  520         attr->max_mw = qattr->max_mw;
  521         attr->max_pd = qattr->max_pd;
  522         attr->atomic_cap = dev->atomic_cap;
  523         attr->max_fmr = qattr->max_fmr;
  524         attr->max_map_per_fmr = 16; /* TBD: FMR */
  525 
  526         /* There is an implicit assumption in some of the ib_xxx apps that the
  527          * qp_rd_atom is smaller than the qp_init_rd_atom. Specifically, in
  528          * communication the qp_rd_atom is passed to the other side and used as
  529          * init_rd_atom without check device capabilities for init_rd_atom.
  530          * for this reason, we set the qp_rd_atom to be the minimum between the
  531          * two...There is an additional assumption in mlx4 driver that the
  532          * values are power of two, fls is performed on the value - 1, which
  533          * in fact gives a larger power of two for values which are not a power
  534          * of two. This should be fixed in mlx4 driver, but until then ->
  535          * we provide a value that is a power of two in our code.
  536          */
  537         attr->max_qp_init_rd_atom =
  538                 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
  539         attr->max_qp_rd_atom =
  540                 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
  541                     attr->max_qp_init_rd_atom);
  542 
  543         attr->max_srq = qattr->max_srq;
  544         attr->max_srq_sge = qattr->max_srq_sge;
  545         attr->max_srq_wr = qattr->max_srq_wr;
  546 
  547         /* TODO: R&D to more properly configure the following */
  548         attr->local_ca_ack_delay = qattr->dev_ack_delay;
  549         attr->max_fast_reg_page_list_len = qattr->max_mr/8;
  550         attr->max_pkeys = QLNXR_ROCE_PKEY_MAX;
  551         attr->max_ah = qattr->max_ah;
  552 
  553         QL_DPRINT12(ha, "exit\n");
  554         return 0;
  555 }
  556 
  557 static inline void
  558 get_link_speed_and_width(int speed, uint8_t *ib_speed, uint8_t *ib_width)
  559 {
  560         switch (speed) {
  561         case 1000:
  562                 *ib_speed = IB_SPEED_SDR;
  563                 *ib_width = IB_WIDTH_1X;
  564                 break;
  565         case 10000:
  566                 *ib_speed = IB_SPEED_QDR;
  567                 *ib_width = IB_WIDTH_1X;
  568                 break;
  569 
  570         case 20000:
  571                 *ib_speed = IB_SPEED_DDR;
  572                 *ib_width = IB_WIDTH_4X;
  573                 break;
  574 
  575         case 25000:
  576                 *ib_speed = IB_SPEED_EDR;
  577                 *ib_width = IB_WIDTH_1X;
  578                 break;
  579 
  580         case 40000:
  581                 *ib_speed = IB_SPEED_QDR;
  582                 *ib_width = IB_WIDTH_4X;
  583                 break;
  584 
  585         case 50000:
  586                 *ib_speed = IB_SPEED_QDR;
  587                 *ib_width = IB_WIDTH_4X; // TODO doesn't add up to 50...
  588                 break;
  589 
  590         case 100000:
  591                 *ib_speed = IB_SPEED_EDR;
  592                 *ib_width = IB_WIDTH_4X;
  593                 break;
  594 
  595         default:
  596                 /* Unsupported */
  597                 *ib_speed = IB_SPEED_SDR;
  598                 *ib_width = IB_WIDTH_1X;
  599         }
  600         return;
  601 }
  602 
  603 int
  604 qlnxr_query_port(struct ib_device *ibdev, uint8_t port,
  605         struct ib_port_attr *attr)
  606 {
  607         struct qlnxr_dev        *dev;
  608         struct ecore_rdma_port  *rdma_port;
  609         qlnx_host_t             *ha;
  610 
  611         dev = get_qlnxr_dev(ibdev);
  612         ha = dev->ha;
  613 
  614         QL_DPRINT12(ha, "enter\n");
  615 
  616         if (port > 1) {
  617                 QL_DPRINT12(ha, "port [%d] > 1 \n", port);
  618                 return -EINVAL;
  619         }
  620 
  621         if (dev->rdma_ctx == NULL) {
  622                 QL_DPRINT12(ha, "rdma_ctx == NULL\n");
  623                 return -EINVAL;
  624         }
  625 
  626         rdma_port = ecore_rdma_query_port(dev->rdma_ctx);
  627         memset(attr, 0, sizeof *attr);
  628 
  629         if (rdma_port->port_state == ECORE_RDMA_PORT_UP) {
  630                 attr->state = IB_PORT_ACTIVE;
  631                 attr->phys_state = 5;
  632         } else {
  633                 attr->state = IB_PORT_DOWN;
  634                 attr->phys_state = 3;
  635         }
  636 
  637         attr->max_mtu = IB_MTU_4096;
  638         attr->active_mtu = iboe_get_mtu(dev->ha->ifp->if_mtu);
  639         attr->lid = 0;
  640         attr->lmc = 0;
  641         attr->sm_lid = 0;
  642         attr->sm_sl = 0;
  643         attr->port_cap_flags = 0;
  644 
  645         if (QLNX_IS_IWARP(dev)) {
  646                 attr->gid_tbl_len = 1;
  647                 attr->pkey_tbl_len = 1;
  648         } else {
  649                 attr->gid_tbl_len = QLNXR_MAX_SGID;
  650                 attr->pkey_tbl_len = QLNXR_ROCE_PKEY_TABLE_LEN;
  651         }
  652 
  653         attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
  654         attr->qkey_viol_cntr = 0;
  655 
  656         get_link_speed_and_width(rdma_port->link_speed,
  657                                  &attr->active_speed, &attr->active_width);
  658 
  659         attr->max_msg_sz = rdma_port->max_msg_size;
  660         attr->max_vl_num = 4; /* TODO -> figure this one out... */
  661 
  662         QL_DPRINT12(ha, "state = %d phys_state = %d "
  663                 " link_speed = %d active_speed = %d active_width = %d"
  664                 " attr->gid_tbl_len = %d attr->pkey_tbl_len = %d"
  665                 " max_msg_sz = 0x%x max_vl_num = 0x%x \n",
  666                 attr->state, attr->phys_state,
  667                 rdma_port->link_speed, attr->active_speed,
  668                 attr->active_width, attr->gid_tbl_len, attr->pkey_tbl_len,
  669                 attr->max_msg_sz, attr->max_vl_num);
  670 
  671         QL_DPRINT12(ha, "exit\n");
  672         return 0;
  673 }
  674 
  675 int
  676 qlnxr_modify_port(struct ib_device *ibdev, uint8_t port, int mask,
  677         struct ib_port_modify *props)
  678 {
  679         struct qlnxr_dev        *dev;
  680         qlnx_host_t             *ha;
  681 
  682         dev = get_qlnxr_dev(ibdev);
  683         ha = dev->ha;
  684 
  685         QL_DPRINT12(ha, "enter\n");
  686 
  687         if (port > 1) {
  688                 QL_DPRINT12(ha, "port (%d) > 1\n", port);
  689                 return -EINVAL;
  690         }
  691 
  692         QL_DPRINT12(ha, "exit\n");
  693         return 0;
  694 }
  695 
  696 enum rdma_link_layer
  697 qlnxr_link_layer(struct ib_device *ibdev, uint8_t port_num)
  698 {
  699         struct qlnxr_dev        *dev;
  700         qlnx_host_t             *ha;
  701 
  702         dev = get_qlnxr_dev(ibdev);
  703         ha = dev->ha;
  704 
  705         QL_DPRINT12(ha, "ibdev = %p port_num = 0x%x\n", ibdev, port_num);
  706 
  707         return IB_LINK_LAYER_ETHERNET;
  708 }
  709 
  710 int
  711 qlnxr_alloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
  712 {
  713         struct ib_device *ibdev = ibpd->device;
  714         struct qlnxr_pd         *pd = get_qlnxr_pd(ibpd);
  715         u16                     pd_id;
  716         int                     rc;
  717         struct qlnxr_dev        *dev;
  718         qlnx_host_t             *ha;
  719 
  720         dev = get_qlnxr_dev(ibdev);
  721         ha = dev->ha;
  722 
  723         QL_DPRINT12(ha, "ibdev = %p udata = %p enter\n", ibdev, udata);
  724 
  725         if (dev->rdma_ctx == NULL) {
  726                 QL_DPRINT11(ha, "dev->rdma_ctx = NULL\n");
  727                 rc = -1;
  728                 goto err;
  729         }
  730 
  731         rc = ecore_rdma_alloc_pd(dev->rdma_ctx, &pd_id);
  732         if (rc) {
  733                 QL_DPRINT11(ha, "ecore_rdma_alloc_pd failed\n");
  734                 goto err;
  735         }
  736 
  737         pd->pd_id = pd_id;
  738 
  739         if (udata) {
  740                 rc = ib_copy_to_udata(udata, &pd->pd_id, sizeof(pd->pd_id));
  741                 if (rc) {
  742                         QL_DPRINT11(ha, "ib_copy_to_udata failed\n");
  743                         ecore_rdma_free_pd(dev->rdma_ctx, pd_id);
  744                         goto err;
  745                 }
  746 
  747                 pd->uctx = rdma_udata_to_drv_context(
  748                     udata, struct qlnxr_ucontext, ibucontext);
  749                 pd->uctx->pd = pd;
  750         }
  751 
  752         atomic_add_rel_32(&dev->pd_count, 1);
  753         QL_DPRINT12(ha, "exit [pd, pd_id, pd_count] = [%p, 0x%x, %d]\n",
  754                 pd, pd_id, dev->pd_count);
  755 
  756         return (0);
  757 
  758 err:
  759         QL_DPRINT12(ha, "exit -1\n");
  760         return (rc);
  761 }
  762 
  763 void
  764 qlnxr_dealloc_pd(struct ib_pd *ibpd, struct ib_udata *udata)
  765 {
  766         struct qlnxr_pd         *pd;
  767         struct qlnxr_dev        *dev;
  768         qlnx_host_t             *ha;
  769 
  770         pd = get_qlnxr_pd(ibpd);
  771         dev = get_qlnxr_dev((ibpd->device));
  772         ha = dev->ha;
  773 
  774         QL_DPRINT12(ha, "enter\n");
  775 
  776         if (pd == NULL) {
  777                 QL_DPRINT11(ha, "pd = NULL\n");
  778         } else {
  779                 ecore_rdma_free_pd(dev->rdma_ctx, pd->pd_id);
  780                 atomic_subtract_rel_32(&dev->pd_count, 1);
  781                 QL_DPRINT12(ha, "exit [pd, pd_id, pd_count] = [%p, 0x%x, %d]\n",
  782                         pd, pd->pd_id, dev->pd_count);
  783         }
  784 
  785         QL_DPRINT12(ha, "exit\n");
  786 }
  787 
  788 #define ROCE_WQE_ELEM_SIZE      sizeof(struct rdma_sq_sge)
  789 #define RDMA_MAX_SGE_PER_SRQ    (4) /* Should be part of HSI */
  790 /* Should be part of HSI */
  791 #define RDMA_MAX_SRQ_WQE_SIZE   (RDMA_MAX_SGE_PER_SRQ + 1) /* +1 for header */
  792 #define DB_ADDR_SHIFT(addr)             ((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
  793 
  794 static void qlnxr_cleanup_user(struct qlnxr_dev *, struct qlnxr_qp *);
  795 static void qlnxr_cleanup_kernel(struct qlnxr_dev *, struct qlnxr_qp *);
  796 
  797 int
  798 qlnxr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
  799 {
  800         struct qlnxr_dev        *dev;
  801         qlnx_host_t             *ha;
  802 
  803         dev = get_qlnxr_dev(ibdev);
  804         ha = dev->ha;
  805 
  806         QL_DPRINT12(ha, "enter index = 0x%x\n", index);
  807 
  808         if (index > QLNXR_ROCE_PKEY_TABLE_LEN) 
  809                 return -EINVAL;
  810 
  811         *pkey = QLNXR_ROCE_PKEY_DEFAULT;
  812 
  813         QL_DPRINT12(ha, "exit\n");
  814         return 0;
  815 }
  816 
  817 static inline bool
  818 qlnxr_get_vlan_id_qp(qlnx_host_t *ha, struct ib_qp_attr *attr, int attr_mask,
  819        u16 *vlan_id)
  820 {
  821         bool ret = false;
  822 
  823         QL_DPRINT12(ha, "enter \n");
  824 
  825         *vlan_id = 0;
  826 
  827 #if __FreeBSD_version >= 1100000
  828         u16 tmp_vlan_id;
  829 
  830 #if __FreeBSD_version >= 1102000
  831         union ib_gid *dgid;
  832 
  833         dgid = &attr->ah_attr.grh.dgid;
  834         tmp_vlan_id = (dgid->raw[11] << 8) | dgid->raw[12];
  835 
  836         if (!(tmp_vlan_id & ~EVL_VLID_MASK)) {
  837                 *vlan_id = tmp_vlan_id;
  838                 ret = true;
  839         }
  840 #else
  841         tmp_vlan_id = attr->vlan_id;
  842 
  843         if ((attr_mask & IB_QP_VID) && (!(tmp_vlan_id & ~EVL_VLID_MASK))) {
  844                 *vlan_id = tmp_vlan_id;
  845                 ret = true;
  846         }
  847 
  848 #endif /* #if __FreeBSD_version > 1102000 */
  849 
  850 #else
  851         ret = true;
  852 
  853 #endif /* #if __FreeBSD_version >= 1100000 */
  854 
  855         QL_DPRINT12(ha, "exit vlan_id = 0x%x ret = %d \n", *vlan_id, ret);
  856 
  857         return (ret);
  858 }
  859 
  860 static inline void
  861 get_gid_info(struct ib_qp *ibqp, struct ib_qp_attr *attr,
  862         int attr_mask,
  863         struct qlnxr_dev *dev,
  864         struct qlnxr_qp *qp,
  865         struct ecore_rdma_modify_qp_in_params *qp_params)
  866 {
  867         int             i;
  868         qlnx_host_t     *ha;
  869 
  870         ha = dev->ha;
  871 
  872         QL_DPRINT12(ha, "enter\n");
  873 
  874         memcpy(&qp_params->sgid.bytes[0],
  875                &dev->sgid_tbl[qp->sgid_idx].raw[0],
  876                sizeof(qp_params->sgid.bytes));
  877         memcpy(&qp_params->dgid.bytes[0],
  878                &attr->ah_attr.grh.dgid.raw[0],
  879                sizeof(qp_params->dgid));
  880 
  881         qlnxr_get_vlan_id_qp(ha, attr, attr_mask, &qp_params->vlan_id);
  882 
  883         for (i = 0; i < (sizeof(qp_params->sgid.dwords)/sizeof(uint32_t)); i++) {
  884                 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
  885                 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
  886         }
  887 
  888         QL_DPRINT12(ha, "exit\n");
  889         return;
  890 }
  891 
  892 static int
  893 qlnxr_add_mmap(struct qlnxr_ucontext *uctx, u64 phy_addr, unsigned long len)
  894 {
  895         struct qlnxr_mm *mm;
  896         qlnx_host_t     *ha;
  897 
  898         ha = uctx->dev->ha;
  899 
  900         QL_DPRINT12(ha, "enter\n");
  901 
  902         mm = kzalloc(sizeof(*mm), GFP_KERNEL);
  903         if (mm == NULL) {
  904                 QL_DPRINT11(ha, "mm = NULL\n");
  905                 return -ENOMEM;
  906         }
  907 
  908         mm->key.phy_addr = phy_addr;
  909 
  910         /* This function might be called with a length which is not a multiple
  911          * of PAGE_SIZE, while the mapping is PAGE_SIZE grained and the kernel
  912          * forces this granularity by increasing the requested size if needed.
  913          * When qedr_mmap is called, it will search the list with the updated
  914          * length as a key. To prevent search failures, the length is rounded up
  915          * in advance to PAGE_SIZE.
  916          */
  917         mm->key.len = roundup(len, PAGE_SIZE);
  918         INIT_LIST_HEAD(&mm->entry);
  919 
  920         mutex_lock(&uctx->mm_list_lock);
  921         list_add(&mm->entry, &uctx->mm_head);
  922         mutex_unlock(&uctx->mm_list_lock);
  923 
  924         QL_DPRINT12(ha, "added (addr=0x%llx,len=0x%lx) for ctx=%p\n",
  925                 (unsigned long long)mm->key.phy_addr,
  926                 (unsigned long)mm->key.len, uctx);
  927 
  928         return 0;
  929 }
  930 
  931 static bool
  932 qlnxr_search_mmap(struct qlnxr_ucontext *uctx, u64 phy_addr, unsigned long len)
  933 {
  934         bool            found = false;
  935         struct qlnxr_mm *mm;
  936         qlnx_host_t     *ha;
  937 
  938         ha = uctx->dev->ha;
  939 
  940         QL_DPRINT12(ha, "enter\n");
  941 
  942         mutex_lock(&uctx->mm_list_lock);
  943         list_for_each_entry(mm, &uctx->mm_head, entry) {
  944                 if (len != mm->key.len || phy_addr != mm->key.phy_addr)
  945                         continue;
  946 
  947                 found = true;
  948                 break;
  949         }
  950         mutex_unlock(&uctx->mm_list_lock);
  951 
  952         QL_DPRINT12(ha,
  953                 "searched for (addr=0x%llx,len=0x%lx) for ctx=%p, found=%d\n",
  954                 mm->key.phy_addr, mm->key.len, uctx, found);
  955 
  956         return found;
  957 }
  958 
  959 int
  960 qlnxr_alloc_ucontext(struct ib_ucontext *uctx, struct ib_udata *udata)
  961 {
  962         int rc;
  963         struct qlnxr_ucontext *ctx = get_qlnxr_ucontext(uctx);
  964         struct qlnxr_alloc_ucontext_resp uresp;
  965         struct qlnxr_dev *dev = get_qlnxr_dev(uctx->device);
  966         qlnx_host_t *ha = dev->ha;
  967         struct ecore_rdma_add_user_out_params oparams;
  968 
  969         if (!udata)
  970                 return -EFAULT;
  971 
  972         rc = ecore_rdma_add_user(dev->rdma_ctx, &oparams);
  973         if (rc) {
  974                 QL_DPRINT12(ha,
  975                         "Failed to allocate a DPI for a new RoCE application "
  976                         ",rc = %d. To overcome this, consider to increase "
  977                         "the number of DPIs, increase the doorbell BAR size "
  978                         "or just close unnecessary RoCE applications. In "
  979                         "order to increase the number of DPIs consult the "
  980                         "README\n", rc);
  981                 goto err;
  982         }
  983 
  984         ctx->dpi = oparams.dpi;
  985         ctx->dpi_addr = oparams.dpi_addr;
  986         ctx->dpi_phys_addr = oparams.dpi_phys_addr;
  987         ctx->dpi_size = oparams.dpi_size;
  988         INIT_LIST_HEAD(&ctx->mm_head);
  989         mutex_init(&ctx->mm_list_lock);
  990 
  991         memset(&uresp, 0, sizeof(uresp));
  992         uresp.dpm_enabled = offsetof(struct qlnxr_alloc_ucontext_resp, dpm_enabled)
  993                                 < udata->outlen ? dev->user_dpm_enabled : 0; //TODO: figure this out
  994         uresp.wids_enabled = offsetof(struct qlnxr_alloc_ucontext_resp, wids_enabled)
  995                                 < udata->outlen ? 1 : 0; //TODO: figure this out
  996         uresp.wid_count = offsetof(struct qlnxr_alloc_ucontext_resp, wid_count)
  997                                 < udata->outlen ? oparams.wid_count : 0; //TODO: figure this out 
  998         uresp.db_pa = ctx->dpi_phys_addr;
  999         uresp.db_size = ctx->dpi_size;
 1000         uresp.max_send_wr = dev->attr.max_sqe;
 1001         uresp.max_recv_wr = dev->attr.max_rqe;
 1002         uresp.max_srq_wr = dev->attr.max_srq_wr;
 1003         uresp.sges_per_send_wr = QLNXR_MAX_SQE_ELEMENTS_PER_SQE;
 1004         uresp.sges_per_recv_wr = QLNXR_MAX_RQE_ELEMENTS_PER_RQE;
 1005         uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
 1006         uresp.max_cqes = QLNXR_MAX_CQES;
 1007 
 1008         rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
 1009         if (rc)
 1010                 goto err;
 1011 
 1012         ctx->dev = dev;
 1013 
 1014         rc = qlnxr_add_mmap(ctx, ctx->dpi_phys_addr, ctx->dpi_size);
 1015         if (rc)
 1016                 goto err;
 1017         QL_DPRINT12(ha, "Allocated user context %p\n",
 1018                 &ctx->ibucontext);
 1019 
 1020         return (0);
 1021 err:
 1022         return (rc);
 1023 }
 1024 
 1025 void
 1026 qlnxr_dealloc_ucontext(struct ib_ucontext *ibctx)
 1027 {
 1028         struct qlnxr_ucontext *uctx = get_qlnxr_ucontext(ibctx);
 1029         struct qlnxr_dev *dev = uctx->dev;
 1030         qlnx_host_t *ha = dev->ha;
 1031         struct qlnxr_mm *mm, *tmp;
 1032 
 1033         QL_DPRINT12(ha, "Deallocating user context %p\n",
 1034                         uctx);
 1035 
 1036         if (dev) {
 1037                 ecore_rdma_remove_user(uctx->dev->rdma_ctx, uctx->dpi);
 1038         }
 1039 
 1040         list_for_each_entry_safe(mm, tmp, &uctx->mm_head, entry) {
 1041                 QL_DPRINT12(ha, "deleted addr= 0x%llx, len = 0x%lx for"
 1042                                 " ctx=%p\n",
 1043                                 mm->key.phy_addr, mm->key.len, uctx);
 1044                 list_del(&mm->entry);
 1045                 kfree(mm);
 1046         }
 1047 }
 1048 
 1049 int
 1050 qlnxr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
 1051 {
 1052         struct qlnxr_ucontext   *ucontext = get_qlnxr_ucontext(context);
 1053         struct qlnxr_dev        *dev = get_qlnxr_dev((context->device));
 1054         unsigned long           vm_page = vma->vm_pgoff << PAGE_SHIFT;
 1055         u64                     unmapped_db;
 1056         unsigned long           len = (vma->vm_end - vma->vm_start);
 1057         int                     rc = 0;
 1058         bool                    found;
 1059         qlnx_host_t             *ha;
 1060 
 1061         ha = dev->ha;
 1062 
 1063 #if __FreeBSD_version > 1102000
 1064         unmapped_db = dev->db_phys_addr + (ucontext->dpi * ucontext->dpi_size);
 1065 #else
 1066         unmapped_db = dev->db_phys_addr;
 1067 #endif /* #if __FreeBSD_version > 1102000 */
 1068 
 1069         QL_DPRINT12(ha, "qedr_mmap enter vm_page=0x%lx"
 1070                 " vm_pgoff=0x%lx unmapped_db=0x%llx db_size=%x, len=%lx\n",
 1071                 vm_page, vma->vm_pgoff, unmapped_db,
 1072                 dev->db_size, len);
 1073 
 1074         if ((vma->vm_start & (PAGE_SIZE - 1)) || (len & (PAGE_SIZE - 1))) {
 1075                 QL_DPRINT11(ha, "Vma_start not page aligned "
 1076                         "vm_start = %ld vma_end = %ld\n", vma->vm_start,
 1077                         vma->vm_end);
 1078                 return -EINVAL;
 1079         }
 1080 
 1081         found = qlnxr_search_mmap(ucontext, vm_page, len);
 1082         if (!found) {
 1083                 QL_DPRINT11(ha, "Vma_pgoff not found in mapped array = %ld\n",
 1084                         vma->vm_pgoff);
 1085                 return -EINVAL;
 1086         }
 1087 
 1088         QL_DPRINT12(ha, "Mapping doorbell bar\n");
 1089 
 1090 #if __FreeBSD_version > 1102000
 1091 
 1092         if ((vm_page < unmapped_db) ||
 1093                 ((vm_page + len) > (unmapped_db + ucontext->dpi_size))) {
 1094                 QL_DPRINT11(ha, "failed pages are outside of dpi;"
 1095                         "page address=0x%lx, unmapped_db=0x%lx, dpi_size=0x%x\n",
 1096                         vm_page, unmapped_db, ucontext->dpi_size);
 1097                 return -EINVAL;
 1098         }
 1099 
 1100         if (vma->vm_flags & VM_READ) {
 1101                 QL_DPRINT11(ha, "failed mmap, cannot map doorbell bar for read\n");
 1102                 return -EINVAL;
 1103         }
 1104 
 1105         vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
 1106         rc = io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, len,
 1107                         vma->vm_page_prot);
 1108 
 1109 #else
 1110 
 1111         if ((vm_page >= unmapped_db) && (vm_page <= (unmapped_db +
 1112                 dev->db_size))) {
 1113                 QL_DPRINT12(ha, "Mapping doorbell bar\n");
 1114 
 1115                 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
 1116 
 1117                 rc = io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
 1118                                             PAGE_SIZE, vma->vm_page_prot);
 1119         } else {
 1120                 QL_DPRINT12(ha, "Mapping chains\n");
 1121                 rc = io_remap_pfn_range(vma, vma->vm_start,
 1122                                          vma->vm_pgoff, len, vma->vm_page_prot);
 1123         }
 1124 
 1125 #endif /* #if __FreeBSD_version > 1102000 */
 1126 
 1127         QL_DPRINT12(ha, "exit [%d]\n", rc);
 1128         return rc;
 1129 }
 1130 
 1131 struct ib_mr *
 1132 qlnxr_get_dma_mr(struct ib_pd *ibpd, int acc)
 1133 {
 1134         struct qlnxr_mr         *mr;
 1135         struct qlnxr_dev        *dev = get_qlnxr_dev((ibpd->device));
 1136         struct qlnxr_pd         *pd = get_qlnxr_pd(ibpd);
 1137         int                     rc;
 1138         qlnx_host_t             *ha;
 1139 
 1140         ha = dev->ha;
 1141 
 1142         QL_DPRINT12(ha, "enter\n");
 1143 
 1144         if (acc & IB_ACCESS_MW_BIND) {
 1145                 QL_DPRINT12(ha, "Unsupported access flags received for dma mr\n");
 1146         }
 1147 
 1148         mr = kzalloc(sizeof(*mr), GFP_KERNEL);
 1149         if (!mr) {
 1150                 rc = -ENOMEM;
 1151                 QL_DPRINT12(ha, "kzalloc(mr) failed %d\n", rc);
 1152                 goto err0;
 1153         }
 1154 
 1155         mr->type = QLNXR_MR_DMA;
 1156 
 1157         rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
 1158         if (rc) {
 1159                 QL_DPRINT12(ha, "ecore_rdma_alloc_tid failed %d\n", rc);
 1160                 goto err1;
 1161         }
 1162 
 1163         /* index only, 18 bit long, lkey = itid << 8 | key */
 1164         mr->hw_mr.tid_type = ECORE_RDMA_TID_REGISTERED_MR;
 1165         mr->hw_mr.pd = pd->pd_id;
 1166         mr->hw_mr.local_read = 1;
 1167         mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
 1168         mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
 1169         mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
 1170         mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
 1171         mr->hw_mr.dma_mr = true;
 1172 
 1173         rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
 1174         if (rc) {
 1175                 QL_DPRINT12(ha, "ecore_rdma_register_tid failed %d\n", rc);
 1176                 goto err2;
 1177         }
 1178 
 1179         mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
 1180 
 1181         if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
 1182                 mr->hw_mr.remote_atomic) {
 1183                 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
 1184         }
 1185 
 1186         QL_DPRINT12(ha, "lkey = %x\n", mr->ibmr.lkey);
 1187 
 1188         return &mr->ibmr;
 1189 
 1190 err2:
 1191         ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
 1192 err1:
 1193         kfree(mr);
 1194 err0:
 1195         QL_DPRINT12(ha, "exit [%d]\n", rc);
 1196 
 1197         return ERR_PTR(rc);
 1198 }
 1199 
 1200 static void
 1201 qlnxr_free_pbl(struct qlnxr_dev *dev, struct qlnxr_pbl_info *pbl_info,
 1202         struct qlnxr_pbl *pbl)
 1203 {
 1204         int             i;
 1205         qlnx_host_t     *ha;
 1206 
 1207         ha = dev->ha;
 1208 
 1209         QL_DPRINT12(ha, "enter\n");
 1210 
 1211         for (i = 0; i < pbl_info->num_pbls; i++) {
 1212                 if (!pbl[i].va)
 1213                         continue;
 1214                 qlnx_dma_free_coherent(&dev->ha->cdev, pbl[i].va, pbl[i].pa,
 1215                         pbl_info->pbl_size);
 1216         }
 1217         kfree(pbl);
 1218 
 1219         QL_DPRINT12(ha, "exit\n");
 1220         return;
 1221 }
 1222 
 1223 #define MIN_FW_PBL_PAGE_SIZE (4*1024)
 1224 #define MAX_FW_PBL_PAGE_SIZE (64*1024)
 1225 
 1226 #define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
 1227 #define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
 1228 #define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE*MAX_PBES_ON_PAGE)
 1229 
 1230 static struct qlnxr_pbl *
 1231 qlnxr_alloc_pbl_tbl(struct qlnxr_dev *dev,
 1232         struct qlnxr_pbl_info *pbl_info, gfp_t flags)
 1233 {
 1234         void                    *va;
 1235         dma_addr_t              pa;
 1236         dma_addr_t              *pbl_main_tbl;
 1237         struct qlnxr_pbl        *pbl_table;
 1238         int                     i;
 1239         qlnx_host_t             *ha;
 1240 
 1241         ha = dev->ha;
 1242 
 1243         QL_DPRINT12(ha, "enter\n");
 1244 
 1245         pbl_table = kzalloc(sizeof(*pbl_table) * pbl_info->num_pbls, flags);
 1246 
 1247         if (!pbl_table) {
 1248                 QL_DPRINT12(ha, "pbl_table = NULL\n");
 1249                 return NULL;
 1250         }
 1251 
 1252         for (i = 0; i < pbl_info->num_pbls; i++) {
 1253                 va = qlnx_dma_alloc_coherent(&dev->ha->cdev, &pa, pbl_info->pbl_size);
 1254                 if (!va) {
 1255                         QL_DPRINT11(ha, "Failed to allocate pbl#%d\n", i);
 1256                         goto err;
 1257                 }
 1258                 memset(va, 0, pbl_info->pbl_size);
 1259                 pbl_table[i].va = va;
 1260                 pbl_table[i].pa = pa;
 1261         }
 1262 
 1263         /* Two-Layer PBLs, if we have more than one pbl we need to initialize
 1264          * the first one with physical pointers to all of the rest
 1265          */
 1266         pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
 1267         for (i = 0; i < pbl_info->num_pbls - 1; i++)
 1268                 pbl_main_tbl[i] = pbl_table[i + 1].pa;
 1269 
 1270         QL_DPRINT12(ha, "exit\n");
 1271         return pbl_table;
 1272 
 1273 err:
 1274         qlnxr_free_pbl(dev, pbl_info, pbl_table);
 1275 
 1276         QL_DPRINT12(ha, "exit with error\n");
 1277         return NULL;
 1278 }
 1279 
 1280 static int
 1281 qlnxr_prepare_pbl_tbl(struct qlnxr_dev *dev,
 1282         struct qlnxr_pbl_info *pbl_info,
 1283         u32 num_pbes,
 1284         int two_layer_capable)
 1285 {
 1286         u32             pbl_capacity;
 1287         u32             pbl_size;
 1288         u32             num_pbls;
 1289         qlnx_host_t     *ha;
 1290 
 1291         ha = dev->ha;
 1292 
 1293         QL_DPRINT12(ha, "enter\n");
 1294 
 1295         if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
 1296                 if (num_pbes > MAX_PBES_TWO_LAYER) {
 1297                         QL_DPRINT11(ha, "prepare pbl table: too many pages %d\n",
 1298                                 num_pbes);
 1299                         return -EINVAL;
 1300                 }
 1301 
 1302                 /* calculate required pbl page size */
 1303                 pbl_size = MIN_FW_PBL_PAGE_SIZE;
 1304                 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
 1305                         NUM_PBES_ON_PAGE(pbl_size);
 1306 
 1307                 while (pbl_capacity < num_pbes) {
 1308                         pbl_size *= 2;
 1309                         pbl_capacity = pbl_size / sizeof(u64);
 1310                         pbl_capacity = pbl_capacity * pbl_capacity;
 1311                 }
 1312 
 1313                 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
 1314                 num_pbls++; /* One for the layer0 ( points to the pbls) */
 1315                 pbl_info->two_layered = true;
 1316         } else {
 1317                 /* One layered PBL */
 1318                 num_pbls = 1;
 1319                 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE, \
 1320                                 roundup_pow_of_two((num_pbes * sizeof(u64))));
 1321                 pbl_info->two_layered = false;
 1322         }
 1323 
 1324         pbl_info->num_pbls = num_pbls;
 1325         pbl_info->pbl_size = pbl_size;
 1326         pbl_info->num_pbes = num_pbes;
 1327 
 1328         QL_DPRINT12(ha, "prepare pbl table: num_pbes=%d, num_pbls=%d pbl_size=%d\n",
 1329                 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
 1330 
 1331         return 0;
 1332 }
 1333 
 1334 static void
 1335 qlnxr_populate_pbls(struct qlnxr_dev *dev, struct ib_umem *umem,
 1336         struct qlnxr_pbl *pbl, struct qlnxr_pbl_info *pbl_info)
 1337 {
 1338         struct regpair          *pbe;
 1339         struct qlnxr_pbl        *pbl_tbl;
 1340         struct scatterlist      *sg;
 1341         int                     shift, pg_cnt, pages, pbe_cnt, total_num_pbes = 0;
 1342         qlnx_host_t             *ha;
 1343 
 1344 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
 1345         int                     i;
 1346         struct                  ib_umem_chunk *chunk = NULL;
 1347 #else
 1348         int                     entry;
 1349 #endif
 1350 
 1351         ha = dev->ha;
 1352 
 1353         QL_DPRINT12(ha, "enter\n");
 1354 
 1355         if (!pbl_info) {
 1356                 QL_DPRINT11(ha, "PBL_INFO not initialized\n");
 1357                 return;
 1358         }
 1359 
 1360         if (!pbl_info->num_pbes) {
 1361                 QL_DPRINT11(ha, "pbl_info->num_pbes == 0\n");
 1362                 return;
 1363         }
 1364 
 1365         /* If we have a two layered pbl, the first pbl points to the rest
 1366          * of the pbls and the first entry lays on the second pbl in the table
 1367          */
 1368         if (pbl_info->two_layered)
 1369                 pbl_tbl = &pbl[1];
 1370         else
 1371                 pbl_tbl = pbl;
 1372 
 1373         pbe = (struct regpair *)pbl_tbl->va;
 1374         if (!pbe) {
 1375                 QL_DPRINT12(ha, "pbe is NULL\n");
 1376                 return;
 1377         }
 1378 
 1379         pbe_cnt = 0;
 1380 
 1381         shift = ilog2(umem->page_size);
 1382 
 1383 #ifndef DEFINE_IB_UMEM_WITH_CHUNK
 1384 
 1385         for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
 1386 #else
 1387         list_for_each_entry(chunk, &umem->chunk_list, list) {
 1388                 /* get all the dma regions from the chunk. */
 1389                 for (i = 0; i < chunk->nmap; i++) {
 1390                         sg = &chunk->page_list[i];
 1391 #endif
 1392                         pages = sg_dma_len(sg) >> shift;
 1393                         for (pg_cnt = 0; pg_cnt < pages; pg_cnt++) {
 1394                                 /* store the page address in pbe */
 1395                                 pbe->lo =
 1396                                     cpu_to_le32(sg_dma_address(sg) +
 1397                                                 (umem->page_size * pg_cnt));
 1398                                 pbe->hi =
 1399                                     cpu_to_le32(upper_32_bits
 1400                                                 ((sg_dma_address(sg) +
 1401                                                   umem->page_size * pg_cnt)));
 1402 
 1403                                 QL_DPRINT12(ha,
 1404                                         "Populate pbl table:"
 1405                                         " pbe->addr=0x%x:0x%x "
 1406                                         " pbe_cnt = %d total_num_pbes=%d"
 1407                                         " pbe=%p\n", pbe->lo, pbe->hi, pbe_cnt,
 1408                                         total_num_pbes, pbe);
 1409 
 1410                                 pbe_cnt ++;
 1411                                 total_num_pbes ++;
 1412                                 pbe++;
 1413 
 1414                                 if (total_num_pbes == pbl_info->num_pbes)
 1415                                         return;
 1416 
 1417                                 /* if the given pbl is full storing the pbes,
 1418                                  * move to next pbl.
 1419                                  */
 1420                                 if (pbe_cnt ==
 1421                                         (pbl_info->pbl_size / sizeof(u64))) {
 1422                                         pbl_tbl++;
 1423                                         pbe = (struct regpair *)pbl_tbl->va;
 1424                                         pbe_cnt = 0;
 1425                                 }
 1426                         }
 1427 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
 1428                 }
 1429 #endif
 1430         }
 1431         QL_DPRINT12(ha, "exit\n");
 1432         return;
 1433 }
 1434 
 1435 static void
 1436 free_mr_info(struct qlnxr_dev *dev, struct mr_info *info)
 1437 {
 1438         struct qlnxr_pbl *pbl, *tmp;
 1439         qlnx_host_t             *ha;
 1440 
 1441         ha = dev->ha;
 1442 
 1443         QL_DPRINT12(ha, "enter\n");
 1444 
 1445         if (info->pbl_table)
 1446                 list_add_tail(&info->pbl_table->list_entry,
 1447                               &info->free_pbl_list);
 1448 
 1449         if (!list_empty(&info->inuse_pbl_list))
 1450                 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
 1451 
 1452         list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
 1453                 list_del(&pbl->list_entry);
 1454                 qlnxr_free_pbl(dev, &info->pbl_info, pbl);
 1455         }
 1456         QL_DPRINT12(ha, "exit\n");
 1457 
 1458         return;
 1459 }
 1460 
 1461 static int
 1462 qlnxr_init_mr_info(struct qlnxr_dev *dev, struct mr_info *info,
 1463         size_t page_list_len, bool two_layered)
 1464 {
 1465         int                     rc;
 1466         struct qlnxr_pbl        *tmp;
 1467         qlnx_host_t             *ha;
 1468 
 1469         ha = dev->ha;
 1470 
 1471         QL_DPRINT12(ha, "enter\n");
 1472 
 1473         INIT_LIST_HEAD(&info->free_pbl_list);
 1474         INIT_LIST_HEAD(&info->inuse_pbl_list);
 1475 
 1476         rc = qlnxr_prepare_pbl_tbl(dev, &info->pbl_info,
 1477                                   page_list_len, two_layered);
 1478         if (rc) {
 1479                 QL_DPRINT11(ha, "qlnxr_prepare_pbl_tbl [%d]\n", rc);
 1480                 goto done;
 1481         }
 1482 
 1483         info->pbl_table = qlnxr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
 1484 
 1485         if (!info->pbl_table) {
 1486                 rc = -ENOMEM;
 1487                 QL_DPRINT11(ha, "qlnxr_alloc_pbl_tbl returned NULL\n");
 1488                 goto done;
 1489         }
 1490 
 1491         QL_DPRINT12(ha, "pbl_table_pa = %pa\n", &info->pbl_table->pa);
 1492 
 1493         /* in usual case we use 2 PBLs, so we add one to free
 1494          * list and allocating another one
 1495          */
 1496         tmp = qlnxr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
 1497 
 1498         if (!tmp) {
 1499                 QL_DPRINT11(ha, "Extra PBL is not allocated\n");
 1500                 goto done; /* it's OK if second allocation fails, so rc = 0*/
 1501         }
 1502 
 1503         list_add_tail(&tmp->list_entry, &info->free_pbl_list);
 1504 
 1505         QL_DPRINT12(ha, "extra pbl_table_pa = %pa\n", &tmp->pa);
 1506 
 1507 done:
 1508         if (rc)
 1509                 free_mr_info(dev, info);
 1510 
 1511         QL_DPRINT12(ha, "exit [%d]\n", rc);
 1512 
 1513         return rc;
 1514 }
 1515 
 1516 struct ib_mr *
 1517 #if __FreeBSD_version >= 1102000
 1518 qlnxr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
 1519         u64 usr_addr, int acc, struct ib_udata *udata)
 1520 #else
 1521 qlnxr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
 1522         u64 usr_addr, int acc, struct ib_udata *udata, int mr_id)
 1523 #endif /* #if __FreeBSD_version >= 1102000 */
 1524 {
 1525         int             rc = -ENOMEM;
 1526         struct qlnxr_dev *dev = get_qlnxr_dev((ibpd->device));
 1527         struct qlnxr_mr *mr;
 1528         struct qlnxr_pd *pd;
 1529         qlnx_host_t     *ha;
 1530 
 1531         ha = dev->ha;
 1532 
 1533         QL_DPRINT12(ha, "enter\n");
 1534 
 1535         pd = get_qlnxr_pd(ibpd);
 1536 
 1537         QL_DPRINT12(ha, "qedr_register user mr pd = %d"
 1538                 " start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
 1539                 pd->pd_id, start, len, usr_addr, acc);
 1540 
 1541         if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE)) {
 1542                 QL_DPRINT11(ha,
 1543                         "(acc & IB_ACCESS_REMOTE_WRITE &&"
 1544                         " !(acc & IB_ACCESS_LOCAL_WRITE))\n");
 1545                 return ERR_PTR(-EINVAL);
 1546         }
 1547 
 1548         mr = kzalloc(sizeof(*mr), GFP_KERNEL);
 1549         if (!mr) {
 1550                 QL_DPRINT11(ha, "kzalloc(mr) failed\n");
 1551                 return ERR_PTR(rc);
 1552         }
 1553 
 1554         mr->type = QLNXR_MR_USER;
 1555 
 1556         mr->umem = ib_umem_get(ibpd->uobject->context, start, len, acc, 0);
 1557         if (IS_ERR(mr->umem)) {
 1558                 rc = -EFAULT;
 1559                 QL_DPRINT11(ha, "ib_umem_get failed [%p]\n", mr->umem);
 1560                 goto err0;
 1561         }
 1562 
 1563         rc = qlnxr_init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
 1564         if (rc) {
 1565                 QL_DPRINT11(ha,
 1566                         "qlnxr_init_mr_info failed [%d]\n", rc);
 1567                 goto err1;
 1568         }
 1569 
 1570         qlnxr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
 1571                            &mr->info.pbl_info);
 1572 
 1573         rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
 1574 
 1575         if (rc) {
 1576                 QL_DPRINT11(ha, "roce alloc tid returned an error %d\n", rc);
 1577                 goto err1;
 1578         }
 1579 
 1580         /* index only, 18 bit long, lkey = itid << 8 | key */
 1581         mr->hw_mr.tid_type = ECORE_RDMA_TID_REGISTERED_MR;
 1582         mr->hw_mr.key = 0;
 1583         mr->hw_mr.pd = pd->pd_id;
 1584         mr->hw_mr.local_read = 1;
 1585         mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
 1586         mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
 1587         mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
 1588         mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
 1589         mr->hw_mr.mw_bind = false; /* TBD MW BIND */
 1590         mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
 1591         mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
 1592         mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
 1593         mr->hw_mr.page_size_log = ilog2(mr->umem->page_size); /* for the MR pages */
 1594 
 1595 #if __FreeBSD_version >= 1102000
 1596         mr->hw_mr.fbo = ib_umem_offset(mr->umem);
 1597 #else
 1598         mr->hw_mr.fbo = mr->umem->offset;
 1599 #endif
 1600         mr->hw_mr.length = len;
 1601         mr->hw_mr.vaddr = usr_addr;
 1602         mr->hw_mr.zbva = false; /* TBD figure when this should be true */
 1603         mr->hw_mr.phy_mr = false; /* Fast MR - True, Regular Register False */
 1604         mr->hw_mr.dma_mr = false;
 1605 
 1606         rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
 1607         if (rc) {
 1608                 QL_DPRINT11(ha, "roce register tid returned an error %d\n", rc);
 1609                 goto err2;
 1610         }
 1611 
 1612         mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
 1613         if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
 1614                 mr->hw_mr.remote_atomic)
 1615                 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
 1616 
 1617         QL_DPRINT12(ha, "register user mr lkey: %x\n", mr->ibmr.lkey);
 1618 
 1619         return (&mr->ibmr);
 1620 
 1621 err2:
 1622         ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
 1623 err1:
 1624         qlnxr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
 1625 err0:
 1626         kfree(mr);
 1627 
 1628         QL_DPRINT12(ha, "exit [%d]\n", rc);
 1629         return (ERR_PTR(rc));
 1630 }
 1631 
 1632 int
 1633 qlnxr_dereg_mr(struct ib_mr *ib_mr, struct ib_udata *udata)
 1634 {
 1635         struct qlnxr_mr *mr = get_qlnxr_mr(ib_mr);
 1636         struct qlnxr_dev *dev = get_qlnxr_dev((ib_mr->device));
 1637         int             rc = 0;
 1638         qlnx_host_t     *ha;
 1639 
 1640         ha = dev->ha;
 1641 
 1642         QL_DPRINT12(ha, "enter\n");
 1643 
 1644         if ((mr->type != QLNXR_MR_DMA) && (mr->type != QLNXR_MR_FRMR))
 1645                 qlnxr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
 1646 
 1647         /* it could be user registered memory. */
 1648         if (mr->umem)
 1649                 ib_umem_release(mr->umem);
 1650 
 1651         kfree(mr->pages);
 1652 
 1653         kfree(mr);
 1654 
 1655         QL_DPRINT12(ha, "exit\n");
 1656         return rc;
 1657 }
 1658 
 1659 static int
 1660 qlnxr_copy_cq_uresp(struct qlnxr_dev *dev,
 1661         struct qlnxr_cq *cq, struct ib_udata *udata)
 1662 {
 1663         struct qlnxr_create_cq_uresp    uresp;
 1664         int                             rc;
 1665         qlnx_host_t                     *ha;
 1666 
 1667         ha = dev->ha;
 1668 
 1669         QL_DPRINT12(ha, "enter\n");
 1670 
 1671         memset(&uresp, 0, sizeof(uresp));
 1672 
 1673         uresp.db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
 1674         uresp.icid = cq->icid;
 1675 
 1676         rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
 1677 
 1678         if (rc) {
 1679                 QL_DPRINT12(ha, "ib_copy_to_udata error cqid=0x%x[%d]\n",
 1680                         cq->icid, rc);
 1681         }
 1682 
 1683         QL_DPRINT12(ha, "exit [%d]\n", rc);
 1684         return rc;
 1685 }
 1686 
 1687 static void
 1688 consume_cqe(struct qlnxr_cq *cq)
 1689 {
 1690 
 1691         if (cq->latest_cqe == cq->toggle_cqe)
 1692                 cq->pbl_toggle ^= RDMA_RESIZE_CQ_RAMROD_DATA_TOGGLE_BIT_MASK;
 1693 
 1694         cq->latest_cqe = ecore_chain_consume(&cq->pbl);
 1695 }
 1696 
 1697 static inline int
 1698 qlnxr_align_cq_entries(int entries)
 1699 {
 1700         u64 size, aligned_size;
 1701 
 1702         /* We allocate an extra entry that we don't report to the FW.
 1703          * Why?
 1704          * The CQE size is 32 bytes but the FW writes in chunks of 64 bytes
 1705          * (for performance purposes). Allocating an extra entry and telling
 1706          * the FW we have less prevents overwriting the first entry in case of
 1707          * a wrap i.e. when the FW writes the last entry and the application
 1708          * hasn't read the first one.
 1709          */
 1710         size = (entries + 1) * QLNXR_CQE_SIZE;
 1711 
 1712         /* We align to PAGE_SIZE.
 1713          * Why?
 1714          * Since the CQ is going to be mapped and the mapping is anyhow in whole
 1715          * kernel pages we benefit from the possibly extra CQEs.
 1716          */
 1717         aligned_size = ALIGN(size, PAGE_SIZE);
 1718 
 1719         /* note: for CQs created in user space the result of this function
 1720          * should match the size mapped in user space
 1721          */
 1722         return (aligned_size / QLNXR_CQE_SIZE);
 1723 }
 1724 
 1725 static inline int
 1726 qlnxr_init_user_queue(struct ib_ucontext *ib_ctx, struct qlnxr_dev *dev,
 1727         struct qlnxr_userq *q, u64 buf_addr, size_t buf_len,
 1728         int access, int dmasync, int alloc_and_init)
 1729 {
 1730         int             page_cnt;
 1731         int             rc;
 1732         qlnx_host_t     *ha;
 1733 
 1734         ha = dev->ha;
 1735 
 1736         QL_DPRINT12(ha, "enter\n");
 1737 
 1738         q->buf_addr = buf_addr;
 1739         q->buf_len = buf_len;
 1740 
 1741         QL_DPRINT12(ha, "buf_addr : %llx, buf_len : %x, access : %x"
 1742               " dmasync : %x\n", q->buf_addr, q->buf_len,
 1743                 access, dmasync);       
 1744 
 1745         q->umem = ib_umem_get(ib_ctx, q->buf_addr, q->buf_len, access, dmasync);
 1746 
 1747         if (IS_ERR(q->umem)) {
 1748                 QL_DPRINT11(ha, "ib_umem_get failed [%lx]\n", PTR_ERR(q->umem));
 1749                 return PTR_ERR(q->umem);
 1750         }
 1751 
 1752         page_cnt = ib_umem_page_count(q->umem);
 1753         rc = qlnxr_prepare_pbl_tbl(dev, &q->pbl_info, page_cnt,
 1754                                   0 /* SQ and RQ don't support dual layer pbl.
 1755                                      * CQ may, but this is yet uncoded.
 1756                                      */);
 1757         if (rc) {
 1758                 QL_DPRINT11(ha, "qlnxr_prepare_pbl_tbl failed [%d]\n", rc);
 1759                 goto err;
 1760         }
 1761 
 1762         if (alloc_and_init) {
 1763                 q->pbl_tbl = qlnxr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
 1764 
 1765                 if (!q->pbl_tbl) {
 1766                         QL_DPRINT11(ha, "qlnxr_alloc_pbl_tbl failed\n");
 1767                         rc = -ENOMEM;
 1768                         goto err;
 1769                 }
 1770 
 1771                 qlnxr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info);
 1772         } else {
 1773                 q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
 1774 
 1775                 if (!q->pbl_tbl) {
 1776                         QL_DPRINT11(ha, "qlnxr_alloc_pbl_tbl failed\n");
 1777                         rc = -ENOMEM;
 1778                         goto err;
 1779                 }
 1780         }
 1781 
 1782         QL_DPRINT12(ha, "exit\n");
 1783         return 0;
 1784 
 1785 err:
 1786         ib_umem_release(q->umem);
 1787         q->umem = NULL;
 1788 
 1789         QL_DPRINT12(ha, "exit [%d]\n", rc);
 1790         return rc;
 1791 }
 1792 
 1793 int
 1794 qlnxr_create_cq(struct ib_cq *ibcq,
 1795                 const struct ib_cq_init_attr *attr,
 1796                 struct ib_udata *udata)
 1797 {
 1798         struct qlnxr_ucontext                   *ctx;
 1799         struct ecore_rdma_destroy_cq_out_params destroy_oparams;
 1800         struct ecore_rdma_destroy_cq_in_params  destroy_iparams;
 1801         struct qlnxr_dev                        *dev;
 1802         struct ecore_rdma_create_cq_in_params   params;
 1803         struct qlnxr_create_cq_ureq             ureq;
 1804 
 1805 #if __FreeBSD_version >= 1100000
 1806         int                                     vector = attr->comp_vector;
 1807         int                                     entries = attr->cqe;
 1808 #endif
 1809         struct qlnxr_cq                         *cq = get_qlnxr_cq(ibcq);
 1810         int                                     chain_entries, rc, page_cnt;
 1811         u64                                     pbl_ptr;
 1812         u16                                     icid;
 1813         qlnx_host_t                             *ha;
 1814 
 1815         dev = get_qlnxr_dev(ibcq->device);
 1816         ha = dev->ha;
 1817 
 1818         QL_DPRINT12(ha, "called from %s. entries = %d, "
 1819                 "vector = %d\n",
 1820                 (udata ? "User Lib" : "Kernel"), entries, vector);
 1821 
 1822         memset(&params, 0, sizeof(struct ecore_rdma_create_cq_in_params));
 1823         memset(&destroy_iparams, 0, sizeof(struct ecore_rdma_destroy_cq_in_params));
 1824         memset(&destroy_oparams, 0, sizeof(struct ecore_rdma_destroy_cq_out_params));
 1825 
 1826         if (entries > QLNXR_MAX_CQES) {
 1827                 QL_DPRINT11(ha,
 1828                         "the number of entries %d is too high. "
 1829                         "Must be equal or below %d.\n",
 1830                         entries, QLNXR_MAX_CQES);
 1831                 return -EINVAL;
 1832         }
 1833         chain_entries = qlnxr_align_cq_entries(entries);
 1834         chain_entries = min_t(int, chain_entries, QLNXR_MAX_CQES);
 1835 
 1836         if (udata) {
 1837                 ctx = rdma_udata_to_drv_context(
 1838                     udata, struct qlnxr_ucontext, ibucontext);
 1839 
 1840                 memset(&ureq, 0, sizeof(ureq));
 1841 
 1842                 if (ib_copy_from_udata(&ureq, udata,
 1843                         min(sizeof(ureq), udata->inlen))) {
 1844                         QL_DPRINT11(ha, "ib_copy_from_udata failed\n");
 1845                         goto err0;
 1846                 }
 1847 
 1848                 if (!ureq.len) {
 1849                         QL_DPRINT11(ha, "ureq.len == 0\n");
 1850                         goto err0;
 1851                 }
 1852 
 1853                 cq->cq_type = QLNXR_CQ_TYPE_USER;
 1854 
 1855                 qlnxr_init_user_queue(&ctx->ibucontext, dev, &cq->q, ureq.addr, ureq.len,
 1856                                      IB_ACCESS_LOCAL_WRITE, 1, 1);
 1857 
 1858                 pbl_ptr = cq->q.pbl_tbl->pa;
 1859                 page_cnt = cq->q.pbl_info.num_pbes;
 1860                 cq->ibcq.cqe = chain_entries;
 1861         } else {
 1862                 ctx = NULL;
 1863 
 1864                 cq->cq_type = QLNXR_CQ_TYPE_KERNEL;
 1865 
 1866                 rc = ecore_chain_alloc(&dev->ha->cdev,
 1867                            ECORE_CHAIN_USE_TO_CONSUME,
 1868                            ECORE_CHAIN_MODE_PBL,
 1869                            ECORE_CHAIN_CNT_TYPE_U32,
 1870                            chain_entries,
 1871                            sizeof(union roce_cqe),
 1872                            &cq->pbl, NULL);
 1873 
 1874                 if (rc)
 1875                         goto err1;
 1876 
 1877                 page_cnt = ecore_chain_get_page_cnt(&cq->pbl);
 1878                 pbl_ptr = ecore_chain_get_pbl_phys(&cq->pbl);
 1879                 cq->ibcq.cqe = cq->pbl.capacity;
 1880         }
 1881 
 1882         params.cq_handle_hi = upper_32_bits((uintptr_t)cq);
 1883         params.cq_handle_lo = lower_32_bits((uintptr_t)cq);
 1884         params.cnq_id = vector;
 1885         params.cq_size = chain_entries - 1;
 1886         params.pbl_num_pages = page_cnt;
 1887         params.pbl_ptr = pbl_ptr;
 1888         params.pbl_two_level = 0;
 1889 
 1890         if (udata) {
 1891                 params.dpi = ctx->dpi;
 1892         } else {
 1893                 params.dpi = dev->dpi;
 1894         }
 1895 
 1896         rc = ecore_rdma_create_cq(dev->rdma_ctx, &params, &icid);
 1897         if (rc)
 1898                 goto err2;
 1899 
 1900         cq->icid = icid;
 1901         cq->sig = QLNXR_CQ_MAGIC_NUMBER;
 1902         spin_lock_init(&cq->cq_lock);
 1903 
 1904         if (udata) {
 1905                 rc = qlnxr_copy_cq_uresp(dev, cq, udata);
 1906                 if (rc)
 1907                         goto err3;
 1908         } else {
 1909                 /* Generate doorbell address.
 1910                  * Configure bits 3-9 with DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT.
 1911                  * TODO: consider moving to device scope as it is a function of
 1912                  *       the device.
 1913                  * TODO: add ifdef if plan to support 16 bit.
 1914                  */
 1915                 cq->db_addr = dev->db_addr +
 1916                         DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
 1917                 cq->db.data.icid = cq->icid;
 1918                 cq->db.data.params = DB_AGG_CMD_SET <<
 1919                                      RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
 1920 
 1921                 /* point to the very last element, passing it we will toggle */
 1922                 cq->toggle_cqe = ecore_chain_get_last_elem(&cq->pbl);
 1923                 cq->pbl_toggle = RDMA_RESIZE_CQ_RAMROD_DATA_TOGGLE_BIT_MASK;
 1924 
 1925                 /* must be different from pbl_toggle */
 1926                 cq->latest_cqe = NULL;
 1927                 consume_cqe(cq);
 1928                 cq->cq_cons = ecore_chain_get_cons_idx_u32(&cq->pbl);
 1929         }
 1930 
 1931         QL_DPRINT12(ha, "exit icid = 0x%0x, addr = %p,"
 1932                 " number of entries = 0x%x\n",
 1933                 cq->icid, cq, params.cq_size);
 1934         QL_DPRINT12(ha,"cq_addr = %p\n", cq);
 1935         return (0);
 1936 
 1937 err3:
 1938         destroy_iparams.icid = cq->icid;
 1939         ecore_rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams, &destroy_oparams);
 1940 err2:
 1941         if (udata)
 1942                 qlnxr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
 1943         else
 1944                 ecore_chain_free(&dev->ha->cdev, &cq->pbl);
 1945 err1:
 1946         if (udata)
 1947                 ib_umem_release(cq->q.umem);
 1948 err0:
 1949         QL_DPRINT12(ha, "exit error\n");
 1950 
 1951         return (-EINVAL);
 1952 }
 1953 
 1954 int qlnxr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
 1955 {
 1956         int                     status = 0;
 1957         struct qlnxr_dev        *dev = get_qlnxr_dev((ibcq->device));
 1958         qlnx_host_t             *ha;
 1959 
 1960         ha = dev->ha;
 1961 
 1962         QL_DPRINT12(ha, "enter/exit\n");
 1963 
 1964         return status;
 1965 }
 1966 
 1967 void
 1968 qlnxr_destroy_cq(struct ib_cq *ibcq, struct ib_udata *udata)
 1969 {
 1970         struct qlnxr_dev                        *dev = get_qlnxr_dev((ibcq->device));
 1971         struct ecore_rdma_destroy_cq_out_params oparams;
 1972         struct ecore_rdma_destroy_cq_in_params  iparams;
 1973         struct qlnxr_cq                         *cq = get_qlnxr_cq(ibcq);
 1974         int                                     rc = 0;
 1975         qlnx_host_t                             *ha;
 1976 
 1977         ha = dev->ha;
 1978 
 1979         QL_DPRINT12(ha, "enter cq_id = %d\n", cq->icid);
 1980 
 1981         cq->destroyed = 1;
 1982 
 1983         /* TODO: Syncronize irq of the CNQ the CQ belongs to for validation
 1984          * that all completions with notification are dealt with. The rest
 1985          * of the completions are not interesting
 1986          */
 1987 
 1988         /* GSIs CQs are handled by driver, so they don't exist in the FW */
 1989 
 1990         if (cq->cq_type != QLNXR_CQ_TYPE_GSI) {
 1991                 iparams.icid = cq->icid;
 1992 
 1993                 rc = ecore_rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
 1994 
 1995                 if (rc) {
 1996                         QL_DPRINT12(ha, "ecore_rdma_destroy_cq failed cq_id = %d\n",
 1997                                 cq->icid);
 1998                         return;
 1999                 }
 2000 
 2001                 QL_DPRINT12(ha, "free cq->pbl cq_id = %d\n", cq->icid);
 2002                 ecore_chain_free(&dev->ha->cdev, &cq->pbl);
 2003         }
 2004 
 2005         if (udata) {
 2006                 qlnxr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
 2007                 ib_umem_release(cq->q.umem);
 2008         }
 2009 
 2010         cq->sig = ~cq->sig;
 2011 
 2012         QL_DPRINT12(ha, "exit cq_id = %d\n", cq->icid);
 2013 }
 2014 
 2015 static int
 2016 qlnxr_check_qp_attrs(struct ib_pd *ibpd,
 2017         struct qlnxr_dev *dev,
 2018         struct ib_qp_init_attr *attrs,
 2019         struct ib_udata *udata)
 2020 {
 2021         struct ecore_rdma_device        *qattr;
 2022         qlnx_host_t                     *ha;
 2023 
 2024         qattr = ecore_rdma_query_device(dev->rdma_ctx);
 2025         ha = dev->ha;
 2026 
 2027         QL_DPRINT12(ha, "enter\n");
 2028 
 2029         QL_DPRINT12(ha, "attrs->sq_sig_type = %d\n", attrs->sq_sig_type);
 2030         QL_DPRINT12(ha, "attrs->qp_type = %d\n", attrs->qp_type);
 2031         QL_DPRINT12(ha, "attrs->create_flags = %d\n", attrs->create_flags);
 2032 
 2033 #if __FreeBSD_version < 1102000
 2034         QL_DPRINT12(ha, "attrs->qpg_type = %d\n", attrs->qpg_type);
 2035 #endif
 2036 
 2037         QL_DPRINT12(ha, "attrs->port_num = %d\n", attrs->port_num);
 2038         QL_DPRINT12(ha, "attrs->cap.max_send_wr = 0x%x\n", attrs->cap.max_send_wr);
 2039         QL_DPRINT12(ha, "attrs->cap.max_recv_wr = 0x%x\n", attrs->cap.max_recv_wr);
 2040         QL_DPRINT12(ha, "attrs->cap.max_send_sge = 0x%x\n", attrs->cap.max_send_sge);
 2041         QL_DPRINT12(ha, "attrs->cap.max_recv_sge = 0x%x\n", attrs->cap.max_recv_sge);
 2042         QL_DPRINT12(ha, "attrs->cap.max_inline_data = 0x%x\n",
 2043                 attrs->cap.max_inline_data);
 2044 
 2045 #if __FreeBSD_version < 1102000
 2046         QL_DPRINT12(ha, "attrs->cap.qpg_tss_mask_sz = 0x%x\n",
 2047                 attrs->cap.qpg_tss_mask_sz);
 2048 #endif
 2049 
 2050         QL_DPRINT12(ha, "\n\nqattr->vendor_id = 0x%x\n", qattr->vendor_id);
 2051         QL_DPRINT12(ha, "qattr->vendor_part_id = 0x%x\n", qattr->vendor_part_id);
 2052         QL_DPRINT12(ha, "qattr->hw_ver = 0x%x\n", qattr->hw_ver);
 2053         QL_DPRINT12(ha, "qattr->fw_ver = %p\n", (void *)qattr->fw_ver);
 2054         QL_DPRINT12(ha, "qattr->node_guid = %p\n", (void *)qattr->node_guid);
 2055         QL_DPRINT12(ha, "qattr->sys_image_guid = %p\n",
 2056                 (void *)qattr->sys_image_guid);
 2057         QL_DPRINT12(ha, "qattr->max_cnq = 0x%x\n", qattr->max_cnq);
 2058         QL_DPRINT12(ha, "qattr->max_sge = 0x%x\n", qattr->max_sge);
 2059         QL_DPRINT12(ha, "qattr->max_srq_sge = 0x%x\n", qattr->max_srq_sge);
 2060         QL_DPRINT12(ha, "qattr->max_inline = 0x%x\n", qattr->max_inline);
 2061         QL_DPRINT12(ha, "qattr->max_wqe = 0x%x\n", qattr->max_wqe);
 2062         QL_DPRINT12(ha, "qattr->max_srq_wqe = 0x%x\n", qattr->max_srq_wqe);
 2063         QL_DPRINT12(ha, "qattr->max_qp_resp_rd_atomic_resc = 0x%x\n",
 2064                 qattr->max_qp_resp_rd_atomic_resc);
 2065         QL_DPRINT12(ha, "qattr->max_qp_req_rd_atomic_resc = 0x%x\n",
 2066                 qattr->max_qp_req_rd_atomic_resc);
 2067         QL_DPRINT12(ha, "qattr->max_dev_resp_rd_atomic_resc = 0x%x\n",
 2068                 qattr->max_dev_resp_rd_atomic_resc);
 2069         QL_DPRINT12(ha, "qattr->max_cq = 0x%x\n", qattr->max_cq);
 2070         QL_DPRINT12(ha, "qattr->max_qp = 0x%x\n", qattr->max_qp);
 2071         QL_DPRINT12(ha, "qattr->max_srq = 0x%x\n", qattr->max_srq);
 2072         QL_DPRINT12(ha, "qattr->max_mr = 0x%x\n", qattr->max_mr);
 2073         QL_DPRINT12(ha, "qattr->max_mr_size = %p\n", (void *)qattr->max_mr_size);
 2074         QL_DPRINT12(ha, "qattr->max_cqe = 0x%x\n", qattr->max_cqe);
 2075         QL_DPRINT12(ha, "qattr->max_mw = 0x%x\n", qattr->max_mw);
 2076         QL_DPRINT12(ha, "qattr->max_fmr = 0x%x\n", qattr->max_fmr);
 2077         QL_DPRINT12(ha, "qattr->max_mr_mw_fmr_pbl = 0x%x\n",
 2078                 qattr->max_mr_mw_fmr_pbl);
 2079         QL_DPRINT12(ha, "qattr->max_mr_mw_fmr_size = %p\n",
 2080                 (void *)qattr->max_mr_mw_fmr_size);
 2081         QL_DPRINT12(ha, "qattr->max_pd = 0x%x\n", qattr->max_pd);
 2082         QL_DPRINT12(ha, "qattr->max_ah = 0x%x\n", qattr->max_ah);
 2083         QL_DPRINT12(ha, "qattr->max_pkey = 0x%x\n", qattr->max_pkey);
 2084         QL_DPRINT12(ha, "qattr->max_srq_wr = 0x%x\n", qattr->max_srq_wr);
 2085         QL_DPRINT12(ha, "qattr->max_stats_queues = 0x%x\n",
 2086                 qattr->max_stats_queues);
 2087         //QL_DPRINT12(ha, "qattr->dev_caps = 0x%x\n", qattr->dev_caps);
 2088         QL_DPRINT12(ha, "qattr->page_size_caps = %p\n",
 2089                 (void *)qattr->page_size_caps);
 2090         QL_DPRINT12(ha, "qattr->dev_ack_delay = 0x%x\n", qattr->dev_ack_delay);
 2091         QL_DPRINT12(ha, "qattr->reserved_lkey = 0x%x\n", qattr->reserved_lkey);
 2092         QL_DPRINT12(ha, "qattr->bad_pkey_counter = 0x%x\n",
 2093                 qattr->bad_pkey_counter);
 2094 
 2095         if ((attrs->qp_type == IB_QPT_GSI) && udata) {
 2096                 QL_DPRINT12(ha, "unexpected udata when creating GSI QP\n");
 2097                 return -EINVAL;
 2098         }
 2099 
 2100         if (udata && !(ibpd->uobject && ibpd->uobject->context)) {
 2101                 QL_DPRINT12(ha, "called from user without context\n");
 2102                 return -EINVAL;
 2103         }
 2104 
 2105         /* QP0... attrs->qp_type == IB_QPT_GSI */
 2106         if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
 2107                 QL_DPRINT12(ha, "unsupported qp type=0x%x requested\n", 
 2108                            attrs->qp_type);
 2109                 return -EINVAL;
 2110         }
 2111         if (attrs->qp_type == IB_QPT_GSI && attrs->srq) {
 2112                 QL_DPRINT12(ha, "cannot create GSI qp with SRQ\n");
 2113                 return -EINVAL;
 2114         }
 2115         /* Skip the check for QP1 to support CM size of 128 */
 2116         if (attrs->cap.max_send_wr > qattr->max_wqe) {
 2117                 QL_DPRINT12(ha, "cannot create a SQ with %d elements "
 2118                         " (max_send_wr=0x%x)\n",
 2119                         attrs->cap.max_send_wr, qattr->max_wqe);
 2120                 return -EINVAL;
 2121         }
 2122         if (!attrs->srq && (attrs->cap.max_recv_wr > qattr->max_wqe)) {
 2123                 QL_DPRINT12(ha, "cannot create a RQ with %d elements"
 2124                         " (max_recv_wr=0x%x)\n",
 2125                         attrs->cap.max_recv_wr, qattr->max_wqe);
 2126                 return -EINVAL;
 2127         }
 2128         if (attrs->cap.max_inline_data > qattr->max_inline) {
 2129                 QL_DPRINT12(ha,
 2130                         "unsupported inline data size=0x%x "
 2131                         "requested (max_inline=0x%x)\n",
 2132                         attrs->cap.max_inline_data, qattr->max_inline);
 2133                 return -EINVAL;
 2134         }
 2135         if (attrs->cap.max_send_sge > qattr->max_sge) {
 2136                 QL_DPRINT12(ha,
 2137                         "unsupported send_sge=0x%x "
 2138                         "requested (max_send_sge=0x%x)\n",
 2139                         attrs->cap.max_send_sge, qattr->max_sge);
 2140                 return -EINVAL;
 2141         }
 2142         if (attrs->cap.max_recv_sge > qattr->max_sge) {
 2143                 QL_DPRINT12(ha,
 2144                         "unsupported recv_sge=0x%x requested "
 2145                         " (max_recv_sge=0x%x)\n",
 2146                         attrs->cap.max_recv_sge, qattr->max_sge);
 2147                 return -EINVAL;
 2148         }
 2149         /* unprivileged user space cannot create special QP */
 2150         if (ibpd->uobject && attrs->qp_type == IB_QPT_GSI) {
 2151                 QL_DPRINT12(ha,
 2152                         "userspace can't create special QPs of type=0x%x\n",
 2153                         attrs->qp_type);
 2154                 return -EINVAL;
 2155         }
 2156         /* allow creating only one GSI type of QP */
 2157         if (attrs->qp_type == IB_QPT_GSI && dev->gsi_qp_created) {
 2158                 QL_DPRINT12(ha,
 2159                         "create qp: GSI special QPs already created.\n");
 2160                 return -EINVAL;
 2161         }
 2162 
 2163         /* verify consumer QPs are not trying to use GSI QP's CQ */
 2164         if ((attrs->qp_type != IB_QPT_GSI) && (dev->gsi_qp_created)) {
 2165                 struct qlnxr_cq *send_cq = get_qlnxr_cq(attrs->send_cq);
 2166                 struct qlnxr_cq *recv_cq = get_qlnxr_cq(attrs->recv_cq);
 2167 
 2168                 if ((send_cq->cq_type == QLNXR_CQ_TYPE_GSI) ||
 2169                     (recv_cq->cq_type == QLNXR_CQ_TYPE_GSI)) {
 2170                         QL_DPRINT11(ha, "consumer QP cannot use GSI CQs.\n");
 2171                         return -EINVAL;
 2172                 }
 2173         }
 2174         QL_DPRINT12(ha, "exit\n");
 2175         return 0;
 2176 }
 2177 
 2178 static int
 2179 qlnxr_copy_srq_uresp(struct qlnxr_dev *dev,
 2180         struct qlnxr_srq *srq,
 2181         struct ib_udata *udata)
 2182 {
 2183         struct qlnxr_create_srq_uresp   uresp;
 2184         qlnx_host_t                     *ha;
 2185         int                             rc;
 2186 
 2187         ha = dev->ha;
 2188 
 2189         QL_DPRINT12(ha, "enter\n");
 2190 
 2191         memset(&uresp, 0, sizeof(uresp));
 2192 
 2193         uresp.srq_id = srq->srq_id;
 2194 
 2195         rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
 2196 
 2197         QL_DPRINT12(ha, "exit [%d]\n", rc);
 2198         return rc;
 2199 }
 2200 
 2201 static void
 2202 qlnxr_copy_rq_uresp(struct qlnxr_dev *dev,
 2203         struct qlnxr_create_qp_uresp *uresp,
 2204         struct qlnxr_qp *qp)
 2205 {
 2206         qlnx_host_t     *ha;
 2207 
 2208         ha = dev->ha;
 2209 
 2210         /* Return if QP is associated with SRQ instead of RQ */
 2211         QL_DPRINT12(ha, "enter qp->srq = %p\n", qp->srq);
 2212 
 2213         if (qp->srq)
 2214                 return;
 2215 
 2216         /* iWARP requires two doorbells per RQ. */
 2217         if (QLNX_IS_IWARP(dev)) {
 2218                 uresp->rq_db_offset =
 2219                         DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
 2220                 uresp->rq_db2_offset =
 2221                         DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
 2222 
 2223                 QL_DPRINT12(ha, "uresp->rq_db_offset = 0x%x "
 2224                         "uresp->rq_db2_offset = 0x%x\n",
 2225                         uresp->rq_db_offset, uresp->rq_db2_offset);
 2226         } else {
 2227                 uresp->rq_db_offset =
 2228                         DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
 2229         }
 2230         uresp->rq_icid = qp->icid;
 2231 
 2232         QL_DPRINT12(ha, "exit\n");
 2233         return;
 2234 }
 2235 
 2236 static void
 2237 qlnxr_copy_sq_uresp(struct qlnxr_dev *dev,
 2238         struct qlnxr_create_qp_uresp *uresp,
 2239         struct qlnxr_qp *qp)
 2240 {
 2241         qlnx_host_t     *ha;
 2242 
 2243         ha = dev->ha;
 2244 
 2245         QL_DPRINT12(ha, "enter\n");
 2246 
 2247         uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
 2248 
 2249         /* iWARP uses the same cid for rq and sq*/
 2250         if (QLNX_IS_IWARP(dev)) {
 2251                 uresp->sq_icid = qp->icid;
 2252                 QL_DPRINT12(ha, "uresp->sq_icid = 0x%x\n", uresp->sq_icid);
 2253         } else
 2254                 uresp->sq_icid = qp->icid + 1;
 2255 
 2256         QL_DPRINT12(ha, "exit\n");
 2257         return;
 2258 }
 2259 
 2260 static int
 2261 qlnxr_copy_qp_uresp(struct qlnxr_dev *dev,
 2262         struct qlnxr_qp *qp,
 2263         struct ib_udata *udata)
 2264 {
 2265         int                             rc;
 2266         struct qlnxr_create_qp_uresp    uresp;
 2267         qlnx_host_t                     *ha;
 2268 
 2269         ha = dev->ha;
 2270 
 2271         QL_DPRINT12(ha, "enter qp->icid =0x%x\n", qp->icid);
 2272 
 2273         memset(&uresp, 0, sizeof(uresp));
 2274         qlnxr_copy_sq_uresp(dev, &uresp, qp);
 2275         qlnxr_copy_rq_uresp(dev, &uresp, qp);
 2276 
 2277         uresp.atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
 2278         uresp.qp_id = qp->qp_id;
 2279 
 2280         rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
 2281 
 2282         QL_DPRINT12(ha, "exit [%d]\n", rc);
 2283         return rc;
 2284 }
 2285 
 2286 static void
 2287 qlnxr_set_common_qp_params(struct qlnxr_dev *dev,
 2288         struct qlnxr_qp *qp,
 2289         struct qlnxr_pd *pd,
 2290         struct ib_qp_init_attr *attrs)
 2291 {
 2292         qlnx_host_t                     *ha;
 2293 
 2294         ha = dev->ha;
 2295 
 2296         QL_DPRINT12(ha, "enter\n");
 2297 
 2298         spin_lock_init(&qp->q_lock);
 2299 
 2300         atomic_set(&qp->refcnt, 1);
 2301         qp->pd = pd;
 2302         qp->sig = QLNXR_QP_MAGIC_NUMBER;
 2303         qp->qp_type = attrs->qp_type;
 2304         qp->max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
 2305         qp->sq.max_sges = attrs->cap.max_send_sge;
 2306         qp->state = ECORE_ROCE_QP_STATE_RESET;
 2307         qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
 2308         qp->sq_cq = get_qlnxr_cq(attrs->send_cq);
 2309         qp->rq_cq = get_qlnxr_cq(attrs->recv_cq);
 2310         qp->dev = dev;
 2311 
 2312         if (!attrs->srq) {
 2313                 /* QP is associated with RQ instead of SRQ */
 2314                 qp->rq.max_sges = attrs->cap.max_recv_sge;
 2315                 QL_DPRINT12(ha, "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
 2316                         qp->rq.max_sges, qp->rq_cq->icid);
 2317         } else {
 2318                 qp->srq = get_qlnxr_srq(attrs->srq);
 2319         }
 2320 
 2321         QL_DPRINT12(ha,
 2322                 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d,"
 2323                 " state = %d, signaled = %d, use_srq=%d\n",
 2324                 pd->pd_id, qp->qp_type, qp->max_inline_data,
 2325                 qp->state, qp->signaled, ((attrs->srq) ? 1 : 0));
 2326         QL_DPRINT12(ha, "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
 2327                 qp->sq.max_sges, qp->sq_cq->icid);
 2328         return;
 2329 }
 2330 
 2331 static int
 2332 qlnxr_check_srq_params(struct qlnxr_dev *dev,
 2333         struct ib_srq_init_attr *attrs)
 2334 {
 2335         struct ecore_rdma_device *qattr;
 2336         qlnx_host_t             *ha;
 2337 
 2338         ha = dev->ha;
 2339         qattr = ecore_rdma_query_device(dev->rdma_ctx);
 2340 
 2341         QL_DPRINT12(ha, "enter\n");
 2342 
 2343         if (attrs->attr.max_wr > qattr->max_srq_wqe) {
 2344                 QL_DPRINT12(ha, "unsupported srq_wr=0x%x"
 2345                         " requested (max_srq_wr=0x%x)\n",
 2346                         attrs->attr.max_wr, qattr->max_srq_wr);
 2347                 return -EINVAL;
 2348         }
 2349 
 2350         if (attrs->attr.max_sge > qattr->max_sge) {
 2351                 QL_DPRINT12(ha,
 2352                         "unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
 2353                         attrs->attr.max_sge, qattr->max_sge);
 2354                 return -EINVAL;
 2355         }
 2356 
 2357         if (attrs->attr.srq_limit > attrs->attr.max_wr) {
 2358                 QL_DPRINT12(ha,
 2359                        "unsupported srq_limit=0x%x requested"
 2360                         " (max_srq_limit=0x%x)\n",
 2361                         attrs->attr.srq_limit, attrs->attr.srq_limit);
 2362                 return -EINVAL;
 2363         }
 2364 
 2365         QL_DPRINT12(ha, "exit\n");
 2366         return 0;
 2367 }
 2368 
 2369 static void
 2370 qlnxr_free_srq_user_params(struct qlnxr_srq *srq)
 2371 {
 2372         struct qlnxr_dev        *dev = srq->dev;
 2373         qlnx_host_t             *ha;
 2374 
 2375         ha = dev->ha;
 2376 
 2377         QL_DPRINT12(ha, "enter\n");
 2378 
 2379         qlnxr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
 2380         ib_umem_release(srq->usrq.umem);
 2381         ib_umem_release(srq->prod_umem);
 2382 
 2383         QL_DPRINT12(ha, "exit\n");
 2384         return;
 2385 }
 2386 
 2387 static void
 2388 qlnxr_free_srq_kernel_params(struct qlnxr_srq *srq)
 2389 {
 2390         struct qlnxr_srq_hwq_info *hw_srq  = &srq->hw_srq;
 2391         struct qlnxr_dev        *dev = srq->dev;
 2392         qlnx_host_t             *ha;
 2393 
 2394         ha = dev->ha;
 2395 
 2396         QL_DPRINT12(ha, "enter\n");
 2397 
 2398         ecore_chain_free(dev->cdev, &hw_srq->pbl);
 2399 
 2400         qlnx_dma_free_coherent(&dev->cdev,
 2401                 hw_srq->virt_prod_pair_addr,
 2402                 hw_srq->phy_prod_pair_addr,
 2403                 sizeof(struct rdma_srq_producers));
 2404 
 2405         QL_DPRINT12(ha, "exit\n");
 2406 
 2407         return;
 2408 }
 2409 
 2410 static int
 2411 qlnxr_init_srq_user_params(struct ib_ucontext *ib_ctx,
 2412         struct qlnxr_srq *srq,
 2413         struct qlnxr_create_srq_ureq *ureq,
 2414         int access, int dmasync)
 2415 {
 2416 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
 2417         struct ib_umem_chunk    *chunk;
 2418 #endif
 2419         struct scatterlist      *sg;
 2420         int                     rc;
 2421         struct qlnxr_dev        *dev = srq->dev;
 2422         qlnx_host_t             *ha;
 2423 
 2424         ha = dev->ha;
 2425 
 2426         QL_DPRINT12(ha, "enter\n");
 2427 
 2428         rc = qlnxr_init_user_queue(ib_ctx, srq->dev, &srq->usrq, ureq->srq_addr,
 2429                                   ureq->srq_len, access, dmasync, 1);
 2430         if (rc)
 2431                 return rc;
 2432 
 2433         srq->prod_umem = ib_umem_get(ib_ctx, ureq->prod_pair_addr,
 2434                                      sizeof(struct rdma_srq_producers),
 2435                                      access, dmasync);
 2436         if (IS_ERR(srq->prod_umem)) {
 2437                 qlnxr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
 2438                 ib_umem_release(srq->usrq.umem);
 2439 
 2440                 QL_DPRINT12(ha, "ib_umem_get failed for producer [%p]\n",
 2441                         PTR_ERR(srq->prod_umem));
 2442 
 2443                 return PTR_ERR(srq->prod_umem);
 2444         }
 2445 
 2446 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
 2447         chunk = container_of((&srq->prod_umem->chunk_list)->next,
 2448                              typeof(*chunk), list);
 2449         sg = &chunk->page_list[0];
 2450 #else
 2451         sg = srq->prod_umem->sg_head.sgl;
 2452 #endif
 2453         srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
 2454 
 2455         QL_DPRINT12(ha, "exit\n");
 2456         return 0;
 2457 }
 2458 
 2459 static int
 2460 qlnxr_alloc_srq_kernel_params(struct qlnxr_srq *srq,
 2461         struct qlnxr_dev *dev,
 2462         struct ib_srq_init_attr *init_attr)
 2463 {
 2464         struct qlnxr_srq_hwq_info       *hw_srq  = &srq->hw_srq;
 2465         dma_addr_t                      phy_prod_pair_addr;
 2466         u32                             num_elems, max_wr;
 2467         void                            *va;
 2468         int                             rc;
 2469         qlnx_host_t                     *ha;
 2470 
 2471         ha = dev->ha;
 2472 
 2473         QL_DPRINT12(ha, "enter\n");
 2474 
 2475         va = qlnx_dma_alloc_coherent(&dev->cdev,
 2476                         &phy_prod_pair_addr,
 2477                         sizeof(struct rdma_srq_producers));
 2478         if (!va) {
 2479                 QL_DPRINT11(ha, "qlnx_dma_alloc_coherent failed for produceer\n");
 2480                 return -ENOMEM;
 2481         }
 2482 
 2483         hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
 2484         hw_srq->virt_prod_pair_addr = va;
 2485 
 2486         max_wr = init_attr->attr.max_wr;
 2487 
 2488         num_elems = max_wr * RDMA_MAX_SRQ_WQE_SIZE;
 2489 
 2490         rc = ecore_chain_alloc(dev->cdev,
 2491                    ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
 2492                    ECORE_CHAIN_MODE_PBL,
 2493                    ECORE_CHAIN_CNT_TYPE_U32,
 2494                    num_elems,
 2495                    ECORE_RDMA_SRQ_WQE_ELEM_SIZE,
 2496                    &hw_srq->pbl, NULL);
 2497 
 2498         if (rc) {
 2499                 QL_DPRINT11(ha, "ecore_chain_alloc failed [%d]\n", rc);
 2500                 goto err0;
 2501         }
 2502 
 2503         hw_srq->max_wr = max_wr;
 2504         hw_srq->num_elems = num_elems;
 2505         hw_srq->max_sges = RDMA_MAX_SGE_PER_SRQ;
 2506 
 2507         QL_DPRINT12(ha, "exit\n");
 2508         return 0;
 2509 
 2510 err0:
 2511         qlnx_dma_free_coherent(&dev->cdev, va, phy_prod_pair_addr,
 2512                 sizeof(struct rdma_srq_producers));
 2513 
 2514         QL_DPRINT12(ha, "exit [%d]\n", rc);
 2515         return rc;
 2516 }
 2517 
 2518 static inline void
 2519 qlnxr_init_common_qp_in_params(struct qlnxr_dev *dev,
 2520         struct qlnxr_pd *pd,
 2521         struct qlnxr_qp *qp,
 2522         struct ib_qp_init_attr *attrs,
 2523         bool fmr_and_reserved_lkey,
 2524         struct ecore_rdma_create_qp_in_params *params)
 2525 {
 2526         qlnx_host_t     *ha;
 2527 
 2528         ha = dev->ha;
 2529 
 2530         QL_DPRINT12(ha, "enter\n");
 2531 
 2532         /* QP handle to be written in an async event */
 2533         params->qp_handle_async_lo = lower_32_bits((uintptr_t)qp);
 2534         params->qp_handle_async_hi = upper_32_bits((uintptr_t)qp);
 2535 
 2536         params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
 2537         params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
 2538         params->pd = pd->pd_id;
 2539         params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
 2540         params->sq_cq_id = get_qlnxr_cq(attrs->send_cq)->icid;
 2541         params->stats_queue = 0;
 2542 
 2543         params->rq_cq_id = get_qlnxr_cq(attrs->recv_cq)->icid;
 2544 
 2545         if (qp->srq) {
 2546                 /* QP is associated with SRQ instead of RQ */
 2547                 params->srq_id = qp->srq->srq_id;
 2548                 params->use_srq = true;
 2549                 QL_DPRINT11(ha, "exit srq_id = 0x%x use_srq = 0x%x\n",
 2550                         params->srq_id, params->use_srq);
 2551                 return;
 2552         }
 2553 
 2554         params->srq_id = 0;
 2555         params->use_srq = false;
 2556 
 2557         QL_DPRINT12(ha, "exit\n");
 2558         return;
 2559 }
 2560 
 2561 static inline void
 2562 qlnxr_qp_user_print( struct qlnxr_dev *dev,
 2563         struct qlnxr_qp *qp)
 2564 {
 2565         QL_DPRINT12((dev->ha), "qp=%p. sq_addr=0x%llx, sq_len=%zd, "
 2566                 "rq_addr=0x%llx, rq_len=%zd\n",
 2567                 qp, qp->usq.buf_addr, qp->usq.buf_len, qp->urq.buf_addr,
 2568                 qp->urq.buf_len);
 2569         return;
 2570 }
 2571 
 2572 static int
 2573 qlnxr_idr_add(struct qlnxr_dev *dev, void *ptr, u32 id)
 2574 {
 2575         u32             newid;
 2576         int             rc;
 2577         qlnx_host_t     *ha;
 2578 
 2579         ha = dev->ha;
 2580 
 2581         QL_DPRINT12(ha, "enter\n");
 2582 
 2583         if (!QLNX_IS_IWARP(dev))
 2584                 return 0;
 2585 
 2586         do {
 2587                 if (!idr_pre_get(&dev->qpidr, GFP_KERNEL)) {
 2588                         QL_DPRINT11(ha, "idr_pre_get failed\n");
 2589                         return -ENOMEM;
 2590                 }
 2591 
 2592                 mtx_lock(&dev->idr_lock);
 2593 
 2594                 rc = idr_get_new_above(&dev->qpidr, ptr, id, &newid);
 2595 
 2596                 mtx_unlock(&dev->idr_lock);
 2597 
 2598         } while (rc == -EAGAIN);
 2599 
 2600         QL_DPRINT12(ha, "exit [%d]\n", rc);
 2601 
 2602         return rc;
 2603 }
 2604 
 2605 static void
 2606 qlnxr_idr_remove(struct qlnxr_dev *dev, u32 id)
 2607 {
 2608         qlnx_host_t     *ha;
 2609 
 2610         ha = dev->ha;
 2611 
 2612         QL_DPRINT12(ha, "enter\n");
 2613 
 2614         if (!QLNX_IS_IWARP(dev))
 2615                 return;
 2616 
 2617         mtx_lock(&dev->idr_lock);
 2618         idr_remove(&dev->qpidr, id);
 2619         mtx_unlock(&dev->idr_lock);
 2620 
 2621         QL_DPRINT12(ha, "exit \n");
 2622 
 2623         return;
 2624 }
 2625 
 2626 static inline void
 2627 qlnxr_iwarp_populate_user_qp(struct qlnxr_dev *dev,
 2628         struct qlnxr_qp *qp,
 2629         struct ecore_rdma_create_qp_out_params *out_params)
 2630 {
 2631         qlnx_host_t     *ha;
 2632 
 2633         ha = dev->ha;
 2634 
 2635         QL_DPRINT12(ha, "enter\n");
 2636 
 2637         qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
 2638         qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
 2639 
 2640         qlnxr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
 2641                            &qp->usq.pbl_info);
 2642 
 2643         if (qp->srq) {
 2644                 QL_DPRINT11(ha, "qp->srq = %p\n", qp->srq);
 2645                 return;
 2646         }
 2647 
 2648         qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
 2649         qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
 2650 
 2651         qlnxr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
 2652                            &qp->urq.pbl_info);
 2653 
 2654         QL_DPRINT12(ha, "exit\n");
 2655         return;
 2656 }
 2657 
 2658 static int
 2659 qlnxr_create_user_qp(struct qlnxr_dev *dev,
 2660         struct qlnxr_qp *qp,
 2661         struct ib_pd *ibpd,
 2662         struct ib_udata *udata,
 2663         struct ib_qp_init_attr *attrs)
 2664 {
 2665         struct ecore_rdma_destroy_qp_out_params d_out_params;
 2666         struct ecore_rdma_create_qp_in_params in_params;
 2667         struct ecore_rdma_create_qp_out_params out_params;
 2668         struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
 2669         struct ib_ucontext *ib_ctx = NULL;
 2670         struct qlnxr_create_qp_ureq ureq;
 2671         int alloc_and_init = QLNX_IS_ROCE(dev);
 2672         int rc = -EINVAL;
 2673         qlnx_host_t     *ha;
 2674 
 2675         ha = dev->ha;
 2676 
 2677         QL_DPRINT12(ha, "enter\n");
 2678 
 2679         ib_ctx = ibpd->uobject->context;
 2680 
 2681         memset(&ureq, 0, sizeof(ureq));
 2682         rc = ib_copy_from_udata(&ureq, udata, sizeof(ureq));
 2683 
 2684         if (rc) {
 2685                 QL_DPRINT11(ha, "ib_copy_from_udata failed [%d]\n", rc);
 2686                 return rc;
 2687         }
 2688 
 2689         /* SQ - read access only (0), dma sync not required (0) */
 2690         rc = qlnxr_init_user_queue(ib_ctx, dev, &qp->usq, ureq.sq_addr,
 2691                                   ureq.sq_len, 0, 0,
 2692                                   alloc_and_init);
 2693         if (rc) {
 2694                 QL_DPRINT11(ha, "qlnxr_init_user_queue failed [%d]\n", rc);
 2695                 return rc;
 2696         }
 2697 
 2698         if (!qp->srq) {
 2699                 /* RQ - read access only (0), dma sync not required (0) */
 2700                 rc = qlnxr_init_user_queue(ib_ctx, dev, &qp->urq, ureq.rq_addr,
 2701                                           ureq.rq_len, 0, 0,
 2702                                           alloc_and_init);
 2703 
 2704                 if (rc) {
 2705                         QL_DPRINT11(ha, "qlnxr_init_user_queue failed [%d]\n", rc);
 2706                         return rc;
 2707                 }
 2708         }
 2709 
 2710         memset(&in_params, 0, sizeof(in_params));
 2711         qlnxr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
 2712         in_params.qp_handle_lo = ureq.qp_handle_lo;
 2713         in_params.qp_handle_hi = ureq.qp_handle_hi;
 2714         in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
 2715         in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
 2716 
 2717         if (!qp->srq) {
 2718                 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
 2719                 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
 2720         }
 2721 
 2722         qp->ecore_qp = ecore_rdma_create_qp(dev->rdma_ctx, &in_params, &out_params);
 2723 
 2724         if (!qp->ecore_qp) {
 2725                 rc = -ENOMEM;
 2726                 QL_DPRINT11(ha, "ecore_rdma_create_qp failed\n");
 2727                 goto err1;
 2728         }
 2729 
 2730         if (QLNX_IS_IWARP(dev))
 2731                 qlnxr_iwarp_populate_user_qp(dev, qp, &out_params);
 2732 
 2733         qp->qp_id = out_params.qp_id;
 2734         qp->icid = out_params.icid;
 2735 
 2736         rc = qlnxr_copy_qp_uresp(dev, qp, udata);
 2737 
 2738         if (rc) {
 2739                 QL_DPRINT11(ha, "qlnxr_copy_qp_uresp failed\n");
 2740                 goto err;
 2741         }
 2742 
 2743         qlnxr_qp_user_print(dev, qp);
 2744 
 2745         QL_DPRINT12(ha, "exit\n");
 2746         return 0;
 2747 err:
 2748         rc = ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp, &d_out_params);
 2749 
 2750         if (rc)
 2751                 QL_DPRINT12(ha, "fatal fault\n");
 2752 
 2753 err1:
 2754         qlnxr_cleanup_user(dev, qp);
 2755 
 2756         QL_DPRINT12(ha, "exit[%d]\n", rc);
 2757         return rc;
 2758 }
 2759 
 2760 static void
 2761 qlnxr_set_roce_db_info(struct qlnxr_dev *dev,
 2762         struct qlnxr_qp *qp)
 2763 {
 2764         qlnx_host_t     *ha;
 2765 
 2766         ha = dev->ha;
 2767 
 2768         QL_DPRINT12(ha, "enter qp = %p qp->srq %p\n", qp, qp->srq);
 2769 
 2770         qp->sq.db = dev->db_addr +
 2771                 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
 2772         qp->sq.db_data.data.icid = qp->icid + 1;
 2773 
 2774         if (!qp->srq) {
 2775                 qp->rq.db = dev->db_addr +
 2776                         DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
 2777                 qp->rq.db_data.data.icid = qp->icid;
 2778         }
 2779 
 2780         QL_DPRINT12(ha, "exit\n");
 2781         return;
 2782 }
 2783 
 2784 static void
 2785 qlnxr_set_iwarp_db_info(struct qlnxr_dev *dev,
 2786         struct qlnxr_qp *qp)
 2787 
 2788 {
 2789         qlnx_host_t     *ha;
 2790 
 2791         ha = dev->ha;
 2792 
 2793         QL_DPRINT12(ha, "enter qp = %p qp->srq %p\n", qp, qp->srq);
 2794 
 2795         qp->sq.db = dev->db_addr +
 2796                 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
 2797         qp->sq.db_data.data.icid = qp->icid;
 2798 
 2799         if (!qp->srq) {
 2800                 qp->rq.db = dev->db_addr +
 2801                         DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
 2802                 qp->rq.db_data.data.icid = qp->icid;
 2803 
 2804                 qp->rq.iwarp_db2 = dev->db_addr +
 2805                         DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
 2806                 qp->rq.iwarp_db2_data.data.icid = qp->icid;
 2807                 qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
 2808         }
 2809 
 2810         QL_DPRINT12(ha,
 2811                 "qp->sq.db = %p qp->sq.db_data.data.icid =0x%x\n"
 2812                 "\t\t\tqp->rq.db = %p qp->rq.db_data.data.icid =0x%x\n"
 2813                 "\t\t\tqp->rq.iwarp_db2 = %p qp->rq.iwarp_db2.data.icid =0x%x"
 2814                 " qp->rq.iwarp_db2.data.prod_val =0x%x\n",
 2815                 qp->sq.db, qp->sq.db_data.data.icid,
 2816                 qp->rq.db, qp->rq.db_data.data.icid,
 2817                 qp->rq.iwarp_db2, qp->rq.iwarp_db2_data.data.icid,
 2818                 qp->rq.iwarp_db2_data.data.value);
 2819 
 2820         QL_DPRINT12(ha, "exit\n");
 2821         return;
 2822 }
 2823 
 2824 static int
 2825 qlnxr_roce_create_kernel_qp(struct qlnxr_dev *dev,
 2826         struct qlnxr_qp *qp,
 2827         struct ecore_rdma_create_qp_in_params *in_params,
 2828         u32 n_sq_elems,
 2829         u32 n_rq_elems)
 2830 {
 2831         struct ecore_rdma_create_qp_out_params out_params;
 2832         int             rc;
 2833         qlnx_host_t     *ha;
 2834 
 2835         ha = dev->ha;
 2836 
 2837         QL_DPRINT12(ha, "enter\n");
 2838 
 2839         rc = ecore_chain_alloc(
 2840                 dev->cdev,
 2841                 ECORE_CHAIN_USE_TO_PRODUCE,
 2842                 ECORE_CHAIN_MODE_PBL,
 2843                 ECORE_CHAIN_CNT_TYPE_U32,
 2844                 n_sq_elems,
 2845                 QLNXR_SQE_ELEMENT_SIZE,
 2846                 &qp->sq.pbl,
 2847                 NULL);
 2848 
 2849         if (rc) {
 2850                 QL_DPRINT11(ha, "ecore_chain_alloc qp->sq.pbl failed[%d]\n", rc);
 2851                 return rc;
 2852         }
 2853 
 2854         in_params->sq_num_pages = ecore_chain_get_page_cnt(&qp->sq.pbl);
 2855         in_params->sq_pbl_ptr = ecore_chain_get_pbl_phys(&qp->sq.pbl);
 2856 
 2857         if (!qp->srq) {
 2858                 rc = ecore_chain_alloc(
 2859                         dev->cdev,
 2860                         ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
 2861                         ECORE_CHAIN_MODE_PBL,
 2862                         ECORE_CHAIN_CNT_TYPE_U32,
 2863                         n_rq_elems,
 2864                         QLNXR_RQE_ELEMENT_SIZE,
 2865                         &qp->rq.pbl,
 2866                         NULL);
 2867 
 2868                 if (rc) {
 2869                         QL_DPRINT11(ha,
 2870                                 "ecore_chain_alloc qp->rq.pbl failed[%d]\n", rc);
 2871                         return rc;
 2872                 }
 2873 
 2874                 in_params->rq_num_pages = ecore_chain_get_page_cnt(&qp->rq.pbl);
 2875                 in_params->rq_pbl_ptr = ecore_chain_get_pbl_phys(&qp->rq.pbl);
 2876         }
 2877 
 2878         qp->ecore_qp = ecore_rdma_create_qp(dev->rdma_ctx, in_params, &out_params);
 2879 
 2880         if (!qp->ecore_qp) {
 2881                 QL_DPRINT11(ha, "qp->ecore_qp == NULL\n");
 2882                 return -EINVAL;
 2883         }
 2884 
 2885         qp->qp_id = out_params.qp_id;
 2886         qp->icid = out_params.icid;
 2887 
 2888         qlnxr_set_roce_db_info(dev, qp);
 2889 
 2890         QL_DPRINT12(ha, "exit\n");
 2891         return 0;
 2892 }
 2893 
 2894 static int
 2895 qlnxr_iwarp_create_kernel_qp(struct qlnxr_dev *dev,
 2896         struct qlnxr_qp *qp,
 2897         struct ecore_rdma_create_qp_in_params *in_params,
 2898         u32 n_sq_elems,
 2899         u32 n_rq_elems)
 2900 {
 2901         struct ecore_rdma_destroy_qp_out_params d_out_params;
 2902         struct ecore_rdma_create_qp_out_params out_params;
 2903         struct ecore_chain_ext_pbl ext_pbl;
 2904         int rc;
 2905         qlnx_host_t     *ha;
 2906 
 2907         ha = dev->ha;
 2908 
 2909         QL_DPRINT12(ha, "enter\n");
 2910 
 2911         in_params->sq_num_pages = ECORE_CHAIN_PAGE_CNT(n_sq_elems,
 2912                                                      QLNXR_SQE_ELEMENT_SIZE,
 2913                                                      ECORE_CHAIN_MODE_PBL);
 2914         in_params->rq_num_pages = ECORE_CHAIN_PAGE_CNT(n_rq_elems,
 2915                                                      QLNXR_RQE_ELEMENT_SIZE,
 2916                                                      ECORE_CHAIN_MODE_PBL);
 2917 
 2918         QL_DPRINT12(ha, "n_sq_elems = 0x%x"
 2919                 " n_rq_elems = 0x%x in_params\n"
 2920                 "\t\t\tqp_handle_lo\t\t= 0x%08x\n"
 2921                 "\t\t\tqp_handle_hi\t\t= 0x%08x\n"
 2922                 "\t\t\tqp_handle_async_lo\t\t= 0x%08x\n"
 2923                 "\t\t\tqp_handle_async_hi\t\t= 0x%08x\n"
 2924                 "\t\t\tuse_srq\t\t\t= 0x%x\n"
 2925                 "\t\t\tsignal_all\t\t= 0x%x\n"
 2926                 "\t\t\tfmr_and_reserved_lkey\t= 0x%x\n"
 2927                 "\t\t\tpd\t\t\t= 0x%x\n"
 2928                 "\t\t\tdpi\t\t\t= 0x%x\n"
 2929                 "\t\t\tsq_cq_id\t\t\t= 0x%x\n"
 2930                 "\t\t\tsq_num_pages\t\t= 0x%x\n"
 2931                 "\t\t\tsq_pbl_ptr\t\t= %p\n"
 2932                 "\t\t\tmax_sq_sges\t\t= 0x%x\n"
 2933                 "\t\t\trq_cq_id\t\t\t= 0x%x\n"
 2934                 "\t\t\trq_num_pages\t\t= 0x%x\n"
 2935                 "\t\t\trq_pbl_ptr\t\t= %p\n"
 2936                 "\t\t\tsrq_id\t\t\t= 0x%x\n"
 2937                 "\t\t\tstats_queue\t\t= 0x%x\n",
 2938                 n_sq_elems, n_rq_elems,
 2939                 in_params->qp_handle_lo,
 2940                 in_params->qp_handle_hi,
 2941                 in_params->qp_handle_async_lo,
 2942                 in_params->qp_handle_async_hi,
 2943                 in_params->use_srq,
 2944                 in_params->signal_all,
 2945                 in_params->fmr_and_reserved_lkey,
 2946                 in_params->pd,
 2947                 in_params->dpi,
 2948                 in_params->sq_cq_id,
 2949                 in_params->sq_num_pages,
 2950                 (void *)in_params->sq_pbl_ptr,
 2951                 in_params->max_sq_sges,
 2952                 in_params->rq_cq_id,
 2953                 in_params->rq_num_pages,
 2954                 (void *)in_params->rq_pbl_ptr,
 2955                 in_params->srq_id,
 2956                 in_params->stats_queue );
 2957 
 2958         memset(&out_params, 0, sizeof (struct ecore_rdma_create_qp_out_params));
 2959         memset(&ext_pbl, 0, sizeof (struct ecore_chain_ext_pbl));
 2960 
 2961         qp->ecore_qp = ecore_rdma_create_qp(dev->rdma_ctx, in_params, &out_params);
 2962 
 2963         if (!qp->ecore_qp) {
 2964                 QL_DPRINT11(ha, "ecore_rdma_create_qp failed\n");
 2965                 return -EINVAL;
 2966         }
 2967 
 2968         /* Now we allocate the chain */
 2969         ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
 2970         ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
 2971 
 2972         QL_DPRINT12(ha, "ext_pbl.p_pbl_virt = %p "
 2973                 "ext_pbl.p_pbl_phys = %p\n",
 2974                 ext_pbl.p_pbl_virt, ext_pbl.p_pbl_phys);
 2975                 
 2976         rc = ecore_chain_alloc(
 2977                 dev->cdev,
 2978                 ECORE_CHAIN_USE_TO_PRODUCE,
 2979                 ECORE_CHAIN_MODE_PBL,
 2980                 ECORE_CHAIN_CNT_TYPE_U32,
 2981                 n_sq_elems,
 2982                 QLNXR_SQE_ELEMENT_SIZE,
 2983                 &qp->sq.pbl,
 2984                 &ext_pbl);
 2985 
 2986         if (rc) {
 2987                 QL_DPRINT11(ha,
 2988                         "ecore_chain_alloc qp->sq.pbl failed rc = %d\n", rc);
 2989                 goto err;
 2990         }
 2991 
 2992         ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
 2993         ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
 2994 
 2995         QL_DPRINT12(ha, "ext_pbl.p_pbl_virt = %p "
 2996                 "ext_pbl.p_pbl_phys = %p\n",
 2997                 ext_pbl.p_pbl_virt, ext_pbl.p_pbl_phys);
 2998 
 2999         if (!qp->srq) {
 3000                 rc = ecore_chain_alloc(
 3001                         dev->cdev,
 3002                         ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
 3003                         ECORE_CHAIN_MODE_PBL,
 3004                         ECORE_CHAIN_CNT_TYPE_U32,
 3005                         n_rq_elems,
 3006                         QLNXR_RQE_ELEMENT_SIZE,
 3007                         &qp->rq.pbl,
 3008                         &ext_pbl);
 3009 
 3010                 if (rc) {
 3011                         QL_DPRINT11(ha,, "ecore_chain_alloc qp->rq.pbl"
 3012                                 " failed rc = %d\n", rc);
 3013                         goto err;
 3014                 }
 3015         }
 3016 
 3017         QL_DPRINT12(ha, "qp_id = 0x%x icid =0x%x\n",
 3018                 out_params.qp_id, out_params.icid);
 3019 
 3020         qp->qp_id = out_params.qp_id;
 3021         qp->icid = out_params.icid;
 3022 
 3023         qlnxr_set_iwarp_db_info(dev, qp);
 3024 
 3025         QL_DPRINT12(ha, "exit\n");
 3026         return 0;
 3027 
 3028 err:
 3029         ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp, &d_out_params);
 3030 
 3031         QL_DPRINT12(ha, "exit rc = %d\n", rc);
 3032         return rc;
 3033 }
 3034 
 3035 static int
 3036 qlnxr_create_kernel_qp(struct qlnxr_dev *dev,
 3037         struct qlnxr_qp *qp,
 3038         struct ib_pd *ibpd,
 3039         struct ib_qp_init_attr *attrs)
 3040 {
 3041         struct ecore_rdma_create_qp_in_params in_params;
 3042         struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
 3043         int rc = -EINVAL;
 3044         u32 n_rq_elems;
 3045         u32 n_sq_elems;
 3046         u32 n_sq_entries;
 3047         struct ecore_rdma_device *qattr = ecore_rdma_query_device(dev->rdma_ctx);
 3048         qlnx_host_t     *ha;
 3049 
 3050         ha = dev->ha;
 3051 
 3052         QL_DPRINT12(ha, "enter\n");
 3053 
 3054         memset(&in_params, 0, sizeof(in_params));
 3055 
 3056         /* A single work request may take up to MAX_SQ_WQE_SIZE elements in
 3057          * the ring. The ring should allow at least a single WR, even if the
 3058          * user requested none, due to allocation issues.
 3059          * We should add an extra WR since the prod and cons indices of
 3060          * wqe_wr_id are managed in such a way that the WQ is considered full
 3061          * when (prod+1)%max_wr==cons. We currently don't do that because we
 3062          * double the number of entries due an iSER issue that pushes far more
 3063          * WRs than indicated. If we decline its ib_post_send() then we get
 3064          * error prints in the dmesg we'd like to avoid.
 3065          */
 3066         qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
 3067                               qattr->max_wqe);
 3068 
 3069         qp->wqe_wr_id = kzalloc(qp->sq.max_wr * sizeof(*qp->wqe_wr_id),
 3070                         GFP_KERNEL);
 3071         if (!qp->wqe_wr_id) {
 3072                 QL_DPRINT11(ha, "failed SQ shadow memory allocation\n");
 3073                 return -ENOMEM;
 3074         }
 3075 
 3076         /* QP handle to be written in CQE */
 3077         in_params.qp_handle_lo = lower_32_bits((uintptr_t)qp);
 3078         in_params.qp_handle_hi = upper_32_bits((uintptr_t)qp);
 3079 
 3080         /* A single work request may take up to MAX_RQ_WQE_SIZE elements in
 3081          * the ring. There ring should allow at least a single WR, even if the
 3082          * user requested none, due to allocation issues.
 3083          */
 3084         qp->rq.max_wr = (u16)max_t(u32, attrs->cap.max_recv_wr, 1);
 3085 
 3086         /* Allocate driver internal RQ array */
 3087         if (!qp->srq) {
 3088                 qp->rqe_wr_id = kzalloc(qp->rq.max_wr * sizeof(*qp->rqe_wr_id),
 3089                                         GFP_KERNEL);
 3090                 if (!qp->rqe_wr_id) {
 3091                         QL_DPRINT11(ha, "failed RQ shadow memory allocation\n");
 3092                         kfree(qp->wqe_wr_id);
 3093                         return -ENOMEM;
 3094                 }
 3095         }
 3096 
 3097         //qlnxr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
 3098 
 3099         in_params.qp_handle_async_lo = lower_32_bits((uintptr_t)qp);
 3100         in_params.qp_handle_async_hi = upper_32_bits((uintptr_t)qp);
 3101 
 3102         in_params.signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
 3103         in_params.fmr_and_reserved_lkey = true;
 3104         in_params.pd = pd->pd_id;
 3105         in_params.dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
 3106         in_params.sq_cq_id = get_qlnxr_cq(attrs->send_cq)->icid;
 3107         in_params.stats_queue = 0;
 3108 
 3109         in_params.rq_cq_id = get_qlnxr_cq(attrs->recv_cq)->icid;
 3110 
 3111         if (qp->srq) {
 3112                 /* QP is associated with SRQ instead of RQ */
 3113                 in_params.srq_id = qp->srq->srq_id;
 3114                 in_params.use_srq = true;
 3115                 QL_DPRINT11(ha, "exit srq_id = 0x%x use_srq = 0x%x\n",
 3116                         in_params.srq_id, in_params.use_srq);
 3117         } else {
 3118                 in_params.srq_id = 0;
 3119                 in_params.use_srq = false;
 3120         }
 3121 
 3122         n_sq_entries = attrs->cap.max_send_wr;
 3123         n_sq_entries = min_t(u32, n_sq_entries, qattr->max_wqe);
 3124         n_sq_entries = max_t(u32, n_sq_entries, 1);
 3125         n_sq_elems = n_sq_entries * QLNXR_MAX_SQE_ELEMENTS_PER_SQE;
 3126 
 3127         n_rq_elems = qp->rq.max_wr * QLNXR_MAX_RQE_ELEMENTS_PER_RQE;
 3128 
 3129         if (QLNX_IS_ROCE(dev)) {
 3130                 rc = qlnxr_roce_create_kernel_qp(dev, qp, &in_params,
 3131                                                 n_sq_elems, n_rq_elems);
 3132         } else {
 3133                 rc = qlnxr_iwarp_create_kernel_qp(dev, qp, &in_params,
 3134                                                  n_sq_elems, n_rq_elems);
 3135         }
 3136 
 3137         if (rc)
 3138                 qlnxr_cleanup_kernel(dev, qp);
 3139 
 3140         QL_DPRINT12(ha, "exit [%d]\n", rc);
 3141         return rc;
 3142 }
 3143 
 3144 struct ib_qp *
 3145 qlnxr_create_qp(struct ib_pd *ibpd,
 3146                 struct ib_qp_init_attr *attrs,
 3147                 struct ib_udata *udata)
 3148 {
 3149         struct qlnxr_dev *dev = get_qlnxr_dev(ibpd->device);
 3150         struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
 3151         struct qlnxr_qp *qp;
 3152         int rc = 0;
 3153         qlnx_host_t     *ha;
 3154 
 3155         ha = dev->ha;
 3156 
 3157         QL_DPRINT12(ha, "enter\n");
 3158 
 3159         rc = qlnxr_check_qp_attrs(ibpd, dev, attrs, udata);
 3160         if (rc) {
 3161                 QL_DPRINT11(ha, "qlnxr_check_qp_attrs failed [%d]\n", rc);
 3162                 return ERR_PTR(rc);
 3163         }
 3164 
 3165         QL_DPRINT12(ha, "called from %s, event_handle=%p,"
 3166                 " eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
 3167                 (udata ? "user library" : "kernel"),
 3168                 attrs->event_handler, pd,
 3169                 get_qlnxr_cq(attrs->send_cq),
 3170                 get_qlnxr_cq(attrs->send_cq)->icid,
 3171                 get_qlnxr_cq(attrs->recv_cq),
 3172                 get_qlnxr_cq(attrs->recv_cq)->icid);
 3173 
 3174         qp = qlnx_zalloc(sizeof(struct qlnxr_qp));
 3175 
 3176         if (!qp) {
 3177                 QL_DPRINT11(ha, "kzalloc(qp) failed\n");
 3178                 return ERR_PTR(-ENOMEM);
 3179         }
 3180 
 3181         qlnxr_set_common_qp_params(dev, qp, pd, attrs);
 3182 
 3183         if (attrs->qp_type == IB_QPT_GSI) {
 3184                 QL_DPRINT11(ha, "calling qlnxr_create_gsi_qp\n");
 3185                 return qlnxr_create_gsi_qp(dev, attrs, qp);
 3186         }
 3187 
 3188         if (udata) {
 3189                 rc = qlnxr_create_user_qp(dev, qp, ibpd, udata, attrs);
 3190 
 3191                 if (rc) {
 3192                         QL_DPRINT11(ha, "qlnxr_create_user_qp failed\n");
 3193                         goto err;
 3194                 }
 3195         } else {
 3196                 rc = qlnxr_create_kernel_qp(dev, qp, ibpd, attrs);
 3197 
 3198                 if (rc) {
 3199                         QL_DPRINT11(ha, "qlnxr_create_kernel_qp failed\n");
 3200                         goto err;
 3201                 }
 3202         }
 3203 
 3204         qp->ibqp.qp_num = qp->qp_id;
 3205 
 3206         rc = qlnxr_idr_add(dev, qp, qp->qp_id);
 3207 
 3208         if (rc) {
 3209                 QL_DPRINT11(ha, "qlnxr_idr_add failed\n");
 3210                 goto err;
 3211         }
 3212 
 3213         QL_DPRINT12(ha, "exit [%p]\n", &qp->ibqp);
 3214 
 3215         return &qp->ibqp;
 3216 err:
 3217         QL_DPRINT12(ha, "failed exit\n");
 3218         return ERR_PTR(-EFAULT);
 3219 }
 3220 
 3221 static enum ib_qp_state
 3222 qlnxr_get_ibqp_state(enum ecore_roce_qp_state qp_state)
 3223 {
 3224         enum ib_qp_state state = IB_QPS_ERR;
 3225 
 3226         switch (qp_state) {
 3227         case ECORE_ROCE_QP_STATE_RESET:
 3228                 state = IB_QPS_RESET;
 3229                 break;
 3230 
 3231         case ECORE_ROCE_QP_STATE_INIT:
 3232                 state = IB_QPS_INIT;
 3233                 break;
 3234 
 3235         case ECORE_ROCE_QP_STATE_RTR:
 3236                 state = IB_QPS_RTR;
 3237                 break;
 3238 
 3239         case ECORE_ROCE_QP_STATE_RTS:
 3240                 state = IB_QPS_RTS;
 3241                 break;
 3242 
 3243         case ECORE_ROCE_QP_STATE_SQD:
 3244                 state = IB_QPS_SQD;
 3245                 break;
 3246 
 3247         case ECORE_ROCE_QP_STATE_ERR:
 3248                 state = IB_QPS_ERR;
 3249                 break;
 3250 
 3251         case ECORE_ROCE_QP_STATE_SQE:
 3252                 state = IB_QPS_SQE;
 3253                 break;
 3254         }
 3255         return state;
 3256 }
 3257 
 3258 static enum ecore_roce_qp_state
 3259 qlnxr_get_state_from_ibqp( enum ib_qp_state qp_state)
 3260 {
 3261         enum ecore_roce_qp_state ecore_qp_state;
 3262 
 3263         ecore_qp_state = ECORE_ROCE_QP_STATE_ERR;
 3264 
 3265         switch (qp_state) {
 3266         case IB_QPS_RESET:
 3267                 ecore_qp_state =  ECORE_ROCE_QP_STATE_RESET;
 3268                 break;
 3269 
 3270         case IB_QPS_INIT:
 3271                 ecore_qp_state =  ECORE_ROCE_QP_STATE_INIT;
 3272                 break;
 3273 
 3274         case IB_QPS_RTR:
 3275                 ecore_qp_state =  ECORE_ROCE_QP_STATE_RTR;
 3276                 break;
 3277 
 3278         case IB_QPS_RTS:
 3279                 ecore_qp_state =  ECORE_ROCE_QP_STATE_RTS;
 3280                 break;
 3281 
 3282         case IB_QPS_SQD:
 3283                 ecore_qp_state =  ECORE_ROCE_QP_STATE_SQD;
 3284                 break;
 3285 
 3286         case IB_QPS_ERR:
 3287                 ecore_qp_state =  ECORE_ROCE_QP_STATE_ERR;
 3288                 break;
 3289 
 3290         default:
 3291                 ecore_qp_state =  ECORE_ROCE_QP_STATE_ERR;
 3292                 break;
 3293         }
 3294 
 3295         return (ecore_qp_state);
 3296 }
 3297 
 3298 static void
 3299 qlnxr_reset_qp_hwq_info(struct qlnxr_qp_hwq_info *qph)
 3300 {
 3301         ecore_chain_reset(&qph->pbl);
 3302         qph->prod = qph->cons = 0;
 3303         qph->wqe_cons = 0;
 3304         qph->db_data.data.value = cpu_to_le16(0);
 3305 
 3306         return;
 3307 }
 3308 
 3309 static int
 3310 qlnxr_update_qp_state(struct qlnxr_dev *dev,
 3311         struct qlnxr_qp *qp,
 3312         enum ecore_roce_qp_state new_state)
 3313 {
 3314         int             status = 0;
 3315         uint32_t        reg_addr;
 3316         struct ecore_dev *cdev;
 3317         qlnx_host_t     *ha;
 3318 
 3319         ha = dev->ha;
 3320         cdev = &ha->cdev;
 3321 
 3322         QL_DPRINT12(ha, "enter qp = %p new_state = 0x%x qp->state = 0x%x\n",
 3323                 qp, new_state, qp->state);
 3324 
 3325         if (new_state == qp->state) {
 3326                 return 0;
 3327         }
 3328 
 3329         switch (qp->state) {
 3330         case ECORE_ROCE_QP_STATE_RESET:
 3331                 switch (new_state) {
 3332                 case ECORE_ROCE_QP_STATE_INIT:
 3333                         qp->prev_wqe_size = 0;
 3334                         qlnxr_reset_qp_hwq_info(&qp->sq);
 3335                         if (!(qp->srq))
 3336                                 qlnxr_reset_qp_hwq_info(&qp->rq);
 3337                         break;
 3338                 default:
 3339                         status = -EINVAL;
 3340                         break;
 3341                 };
 3342                 break;
 3343         case ECORE_ROCE_QP_STATE_INIT:
 3344                 /* INIT->XXX */
 3345                 switch (new_state) {
 3346                 case ECORE_ROCE_QP_STATE_RTR:
 3347                 /* Update doorbell (in case post_recv was done before move to RTR) */
 3348                         if (qp->srq)
 3349                                 break;
 3350                         wmb();
 3351                         //writel(qp->rq.db_data.raw, qp->rq.db);
 3352                         //if (QLNX_IS_IWARP(dev))
 3353                         //      writel(qp->rq.iwarp_db2_data.raw,
 3354                         //             qp->rq.iwarp_db2);
 3355 
 3356                         reg_addr = (uint32_t)((uint8_t *)qp->rq.db -
 3357                                         (uint8_t *)cdev->doorbells);
 3358 
 3359                         bus_write_4(ha->pci_dbells, reg_addr, qp->rq.db_data.raw);
 3360                         bus_barrier(ha->pci_dbells,  0, 0, BUS_SPACE_BARRIER_READ);
 3361 
 3362                         if (QLNX_IS_IWARP(dev)) {
 3363                                 reg_addr = (uint32_t)((uint8_t *)qp->rq.iwarp_db2 -
 3364                                         (uint8_t *)cdev->doorbells);
 3365                                 bus_write_4(ha->pci_dbells, reg_addr,\
 3366                                         qp->rq.iwarp_db2_data.raw);
 3367                                 bus_barrier(ha->pci_dbells,  0, 0,\
 3368                                         BUS_SPACE_BARRIER_READ);
 3369                         }
 3370 
 3371                         
 3372                         mmiowb();
 3373                         break;
 3374                 case ECORE_ROCE_QP_STATE_ERR:
 3375                         /* TBD:flush qps... */
 3376                         break;
 3377                 default:
 3378                         /* invalid state change. */
 3379                         status = -EINVAL;
 3380                         break;
 3381                 };
 3382                 break;
 3383         case ECORE_ROCE_QP_STATE_RTR:
 3384                 /* RTR->XXX */
 3385                 switch (new_state) {
 3386                 case ECORE_ROCE_QP_STATE_RTS:
 3387                         break;
 3388                 case ECORE_ROCE_QP_STATE_ERR:
 3389                         break;
 3390                 default:
 3391                         /* invalid state change. */
 3392                         status = -EINVAL;
 3393                         break;
 3394                 };
 3395                 break;
 3396         case ECORE_ROCE_QP_STATE_RTS:
 3397                 /* RTS->XXX */
 3398                 switch (new_state) {
 3399                 case ECORE_ROCE_QP_STATE_SQD:
 3400                         break;
 3401                 case ECORE_ROCE_QP_STATE_ERR:
 3402                         break;
 3403                 default:
 3404                         /* invalid state change. */
 3405                         status = -EINVAL;
 3406                         break;
 3407                 };
 3408                 break;
 3409         case ECORE_ROCE_QP_STATE_SQD:
 3410                 /* SQD->XXX */
 3411                 switch (new_state) {
 3412                 case ECORE_ROCE_QP_STATE_RTS:
 3413                 case ECORE_ROCE_QP_STATE_ERR:
 3414                         break;
 3415                 default:
 3416                         /* invalid state change. */
 3417                         status = -EINVAL;
 3418                         break;
 3419                 };
 3420                 break;
 3421         case ECORE_ROCE_QP_STATE_ERR:
 3422                 /* ERR->XXX */
 3423                 switch (new_state) {
 3424                 case ECORE_ROCE_QP_STATE_RESET:
 3425                         if ((qp->rq.prod != qp->rq.cons) ||
 3426                             (qp->sq.prod != qp->sq.cons)) {
 3427                                 QL_DPRINT11(ha,
 3428                                         "Error->Reset with rq/sq "
 3429                                         "not empty rq.prod=0x%x rq.cons=0x%x"
 3430                                         " sq.prod=0x%x sq.cons=0x%x\n",
 3431                                         qp->rq.prod, qp->rq.cons,
 3432                                         qp->sq.prod, qp->sq.cons);
 3433                                 status = -EINVAL;
 3434                         }
 3435                         break;
 3436                 default:
 3437                         status = -EINVAL;
 3438                         break;
 3439                 };
 3440                 break;
 3441         default:
 3442                 status = -EINVAL;
 3443                 break;
 3444         };
 3445 
 3446         QL_DPRINT12(ha, "exit\n");
 3447         return status;
 3448 }
 3449 
 3450 int
 3451 qlnxr_modify_qp(struct ib_qp    *ibqp,
 3452         struct ib_qp_attr       *attr,
 3453         int                     attr_mask,
 3454         struct ib_udata         *udata)
 3455 {
 3456         int rc = 0;
 3457         struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
 3458         struct qlnxr_dev *dev = get_qlnxr_dev(&qp->dev->ibdev);
 3459         struct ecore_rdma_modify_qp_in_params qp_params = { 0 };
 3460         enum ib_qp_state old_qp_state, new_qp_state;
 3461         struct ecore_rdma_device *qattr = ecore_rdma_query_device(dev->rdma_ctx);
 3462         qlnx_host_t     *ha;
 3463 
 3464         ha = dev->ha;
 3465 
 3466         QL_DPRINT12(ha,
 3467                 "enter qp = %p attr_mask = 0x%x, state = %d udata = %p\n",
 3468                 qp, attr_mask, attr->qp_state, udata);
 3469 
 3470         old_qp_state = qlnxr_get_ibqp_state(qp->state);
 3471         if (attr_mask & IB_QP_STATE)
 3472                 new_qp_state = attr->qp_state;
 3473         else
 3474                 new_qp_state = old_qp_state;
 3475 
 3476         if (QLNX_IS_ROCE(dev)) {
 3477                 if (!ib_modify_qp_is_ok(old_qp_state,
 3478                                         new_qp_state,
 3479                                         ibqp->qp_type,
 3480                                         attr_mask )) {
 3481                         QL_DPRINT12(ha,
 3482                                 "invalid attribute mask=0x%x"
 3483                                 " specified for qpn=0x%x of type=0x%x \n"
 3484                                 " old_qp_state=0x%x, new_qp_state=0x%x\n",
 3485                                 attr_mask, qp->qp_id, ibqp->qp_type,
 3486                                 old_qp_state, new_qp_state);
 3487                         rc = -EINVAL;
 3488                         goto err;
 3489                 }
 3490         }
 3491         /* translate the masks... */
 3492         if (attr_mask & IB_QP_STATE) {
 3493                 SET_FIELD(qp_params.modify_flags,
 3494                           ECORE_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
 3495                 qp_params.new_state = qlnxr_get_state_from_ibqp(attr->qp_state);
 3496         }
 3497 
 3498         // TBD consider changing ecore to be a flag as well...
 3499         if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
 3500                 qp_params.sqd_async = true;
 3501 
 3502         if (attr_mask & IB_QP_PKEY_INDEX) {
 3503                 SET_FIELD(qp_params.modify_flags,
 3504                           ECORE_ROCE_MODIFY_QP_VALID_PKEY,
 3505                           1);
 3506                 if (attr->pkey_index >= QLNXR_ROCE_PKEY_TABLE_LEN) {
 3507                         rc = -EINVAL;
 3508                         goto err;
 3509                 }
 3510 
 3511                 qp_params.pkey = QLNXR_ROCE_PKEY_DEFAULT;
 3512         }
 3513 
 3514         if (attr_mask & IB_QP_QKEY) {
 3515                 qp->qkey = attr->qkey;
 3516         }
 3517 
 3518         /* tbd consider splitting in ecore.. */
 3519         if (attr_mask & IB_QP_ACCESS_FLAGS) {
 3520                 SET_FIELD(qp_params.modify_flags,
 3521                           ECORE_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
 3522                 qp_params.incoming_rdma_read_en =
 3523                         attr->qp_access_flags & IB_ACCESS_REMOTE_READ;
 3524                 qp_params.incoming_rdma_write_en =
 3525                         attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE;
 3526                 qp_params.incoming_atomic_en =
 3527                         attr->qp_access_flags & IB_ACCESS_REMOTE_ATOMIC;
 3528         }
 3529 
 3530         if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
 3531                 if (attr_mask & IB_QP_PATH_MTU) {
 3532                         if (attr->path_mtu < IB_MTU_256 ||
 3533                             attr->path_mtu > IB_MTU_4096) {
 3534                                 QL_DPRINT12(ha,
 3535                                         "Only MTU sizes of 256, 512, 1024,"
 3536                                         " 2048 and 4096 are supported "
 3537                                         " attr->path_mtu = [%d]\n",
 3538                                         attr->path_mtu);
 3539 
 3540                                 rc = -EINVAL;
 3541                                 goto err;
 3542                         }
 3543                         qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
 3544                                       ib_mtu_enum_to_int(
 3545                                                 iboe_get_mtu(dev->ha->ifp->if_mtu)));
 3546                 }
 3547 
 3548                 if (qp->mtu == 0) {
 3549                         qp->mtu = ib_mtu_enum_to_int(
 3550                                         iboe_get_mtu(dev->ha->ifp->if_mtu));
 3551                         QL_DPRINT12(ha, "fixing zetoed MTU to qp->mtu = %d\n",
 3552                                 qp->mtu);
 3553                 }
 3554 
 3555                 SET_FIELD(qp_params.modify_flags,
 3556                           ECORE_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR,
 3557                           1);
 3558 
 3559                 qp_params.traffic_class_tos = attr->ah_attr.grh.traffic_class;
 3560                 qp_params.flow_label = attr->ah_attr.grh.flow_label;
 3561                 qp_params.hop_limit_ttl = attr->ah_attr.grh.hop_limit;
 3562 
 3563                 qp->sgid_idx = attr->ah_attr.grh.sgid_index;
 3564 
 3565                 get_gid_info(ibqp, attr, attr_mask, dev, qp, &qp_params);
 3566 
 3567                 rc = qlnxr_get_dmac(dev, &attr->ah_attr, qp_params.remote_mac_addr);
 3568                 if (rc)
 3569                         return rc;
 3570 
 3571                 qp_params.use_local_mac = true;
 3572                 memcpy(qp_params.local_mac_addr, dev->ha->primary_mac, ETH_ALEN);
 3573 
 3574                 QL_DPRINT12(ha, "dgid=0x%x:0x%x:0x%x:0x%x\n",
 3575                        qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
 3576                        qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
 3577                 QL_DPRINT12(ha, "sgid=0x%x:0x%x:0x%x:0x%x\n",
 3578                        qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
 3579                        qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
 3580                 QL_DPRINT12(ha,
 3581                         "remote_mac=[0x%x:0x%x:0x%x:0x%x:0x%x:0x%x]\n",
 3582                         qp_params.remote_mac_addr[0],
 3583                         qp_params.remote_mac_addr[1],
 3584                         qp_params.remote_mac_addr[2],
 3585                         qp_params.remote_mac_addr[3],
 3586                         qp_params.remote_mac_addr[4],
 3587                         qp_params.remote_mac_addr[5]);
 3588 
 3589                 qp_params.mtu = qp->mtu;
 3590         }
 3591 
 3592         if (qp_params.mtu == 0) {
 3593                 /* stay with current MTU */
 3594                 if (qp->mtu) {
 3595                         qp_params.mtu = qp->mtu;
 3596                 } else {
 3597                         qp_params.mtu = ib_mtu_enum_to_int(
 3598                                                 iboe_get_mtu(dev->ha->ifp->if_mtu));
 3599                 }
 3600         }
 3601 
 3602         if (attr_mask & IB_QP_TIMEOUT) {
 3603                 SET_FIELD(qp_params.modify_flags, \
 3604                         ECORE_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
 3605 
 3606                 qp_params.ack_timeout = attr->timeout;
 3607                 if (attr->timeout) {
 3608                         u32 temp;
 3609 
 3610                         /* 12.7.34 LOCAL ACK TIMEOUT
 3611                          * Value representing the transport (ACK) timeout for
 3612                          * use by the remote, expressed as (4.096 μS*2Local ACK
 3613                          * Timeout)
 3614                          */
 3615                         /* We use 1UL since the temporal value may be  overflow
 3616                          * 32 bits
 3617                          */
 3618                         temp = 4096 * (1UL << attr->timeout) / 1000 / 1000;
 3619                         qp_params.ack_timeout = temp; /* FW requires [msec] */
 3620                 }
 3621                 else
 3622                         qp_params.ack_timeout = 0; /* infinite */
 3623         }
 3624         if (attr_mask & IB_QP_RETRY_CNT) {
 3625                 SET_FIELD(qp_params.modify_flags,\
 3626                          ECORE_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
 3627                 qp_params.retry_cnt = attr->retry_cnt;
 3628         }
 3629 
 3630         if (attr_mask & IB_QP_RNR_RETRY) {
 3631                 SET_FIELD(qp_params.modify_flags,
 3632                           ECORE_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT,
 3633                           1);
 3634                 qp_params.rnr_retry_cnt = attr->rnr_retry;
 3635         }
 3636 
 3637         if (attr_mask & IB_QP_RQ_PSN) {
 3638                 SET_FIELD(qp_params.modify_flags,
 3639                           ECORE_ROCE_MODIFY_QP_VALID_RQ_PSN,
 3640                           1);
 3641                 qp_params.rq_psn = attr->rq_psn;
 3642                 qp->rq_psn = attr->rq_psn;
 3643         }
 3644 
 3645         if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
 3646                 if (attr->max_rd_atomic > qattr->max_qp_req_rd_atomic_resc) {
 3647                         rc = -EINVAL;
 3648                         QL_DPRINT12(ha,
 3649                                 "unsupported  max_rd_atomic=%d, supported=%d\n",
 3650                                 attr->max_rd_atomic,
 3651                                 qattr->max_qp_req_rd_atomic_resc);
 3652                         goto err;
 3653                 }
 3654 
 3655                 SET_FIELD(qp_params.modify_flags,
 3656                           ECORE_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ,
 3657                           1);
 3658                 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
 3659         }
 3660 
 3661         if (attr_mask & IB_QP_MIN_RNR_TIMER) {
 3662                 SET_FIELD(qp_params.modify_flags,
 3663                           ECORE_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER,
 3664                           1);
 3665                 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
 3666         }
 3667 
 3668         if (attr_mask & IB_QP_SQ_PSN) {
 3669                 SET_FIELD(qp_params.modify_flags,
 3670                           ECORE_ROCE_MODIFY_QP_VALID_SQ_PSN,
 3671                           1);
 3672                 qp_params.sq_psn = attr->sq_psn;
 3673                 qp->sq_psn = attr->sq_psn;
 3674         }
 3675 
 3676         if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
 3677                 if (attr->max_dest_rd_atomic >
 3678                     qattr->max_qp_resp_rd_atomic_resc) {
 3679                         QL_DPRINT12(ha,
 3680                                 "unsupported max_dest_rd_atomic=%d, "
 3681                                 "supported=%d\n",
 3682                                 attr->max_dest_rd_atomic,
 3683                                 qattr->max_qp_resp_rd_atomic_resc);
 3684 
 3685                         rc = -EINVAL;
 3686                         goto err;
 3687                 }
 3688 
 3689                 SET_FIELD(qp_params.modify_flags,
 3690                           ECORE_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP,
 3691                           1);
 3692                 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
 3693         }
 3694 
 3695         if (attr_mask & IB_QP_DEST_QPN) {
 3696                 SET_FIELD(qp_params.modify_flags,
 3697                           ECORE_ROCE_MODIFY_QP_VALID_DEST_QP,
 3698                           1);
 3699 
 3700                 qp_params.dest_qp = attr->dest_qp_num;
 3701                 qp->dest_qp_num = attr->dest_qp_num;
 3702         }
 3703 
 3704         /*
 3705          * Update the QP state before the actual ramrod to prevent a race with
 3706          * fast path. Modifying the QP state to error will cause the device to
 3707          * flush the CQEs and while polling the flushed CQEs will considered as
 3708          * a potential issue if the QP isn't in error state.
 3709          */
 3710         if ((attr_mask & IB_QP_STATE) && (qp->qp_type != IB_QPT_GSI) &&
 3711                 (!udata) && (qp_params.new_state == ECORE_ROCE_QP_STATE_ERR))
 3712                 qp->state = ECORE_ROCE_QP_STATE_ERR;
 3713 
 3714         if (qp->qp_type != IB_QPT_GSI)
 3715                 rc = ecore_rdma_modify_qp(dev->rdma_ctx, qp->ecore_qp, &qp_params);
 3716 
 3717         if (attr_mask & IB_QP_STATE) {
 3718                 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
 3719                         rc = qlnxr_update_qp_state(dev, qp, qp_params.new_state);
 3720                 qp->state = qp_params.new_state;
 3721         }
 3722 
 3723 err:
 3724         QL_DPRINT12(ha, "exit\n");
 3725         return rc;
 3726 }
 3727 
 3728 static int
 3729 qlnxr_to_ib_qp_acc_flags(struct ecore_rdma_query_qp_out_params *params)
 3730 {
 3731         int ib_qp_acc_flags = 0;
 3732 
 3733         if (params->incoming_rdma_write_en)
 3734                 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
 3735         if (params->incoming_rdma_read_en)
 3736                 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
 3737         if (params->incoming_atomic_en)
 3738                 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
 3739         if (true) /* FIXME -> local write ?? */
 3740                 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
 3741 
 3742         return ib_qp_acc_flags;
 3743 }
 3744 
 3745 static enum ib_mtu
 3746 qlnxr_mtu_int_to_enum(u16 mtu)
 3747 {
 3748         enum ib_mtu ib_mtu_size;
 3749 
 3750         switch (mtu) {
 3751         case 256:
 3752                 ib_mtu_size = IB_MTU_256;
 3753                 break;
 3754 
 3755         case 512:
 3756                 ib_mtu_size = IB_MTU_512;
 3757                 break;
 3758 
 3759         case 1024:
 3760                 ib_mtu_size = IB_MTU_1024;
 3761                 break;
 3762 
 3763         case 2048:
 3764                 ib_mtu_size = IB_MTU_2048;
 3765                 break;
 3766 
 3767         case 4096:
 3768                 ib_mtu_size = IB_MTU_4096;
 3769                 break;
 3770 
 3771         default:
 3772                 ib_mtu_size = IB_MTU_1024;
 3773                 break;
 3774         }
 3775         return (ib_mtu_size);
 3776 }
 3777 
 3778 int
 3779 qlnxr_query_qp(struct ib_qp *ibqp,
 3780         struct ib_qp_attr *qp_attr,
 3781         int attr_mask,
 3782         struct ib_qp_init_attr *qp_init_attr)
 3783 {
 3784         int rc = 0;
 3785         struct ecore_rdma_query_qp_out_params params;
 3786         struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
 3787         struct qlnxr_dev *dev = qp->dev;
 3788         qlnx_host_t     *ha;
 3789 
 3790         ha = dev->ha;
 3791 
 3792         QL_DPRINT12(ha, "enter\n");
 3793 
 3794         memset(&params, 0, sizeof(params));
 3795 
 3796         rc = ecore_rdma_query_qp(dev->rdma_ctx, qp->ecore_qp, &params);
 3797         if (rc)
 3798                 goto err;
 3799 
 3800         memset(qp_attr, 0, sizeof(*qp_attr));
 3801         memset(qp_init_attr, 0, sizeof(*qp_init_attr));
 3802 
 3803         qp_attr->qp_state = qlnxr_get_ibqp_state(params.state);
 3804         qp_attr->cur_qp_state = qlnxr_get_ibqp_state(params.state);
 3805 
 3806         /* In some cases in iWARP qelr will ask for the state only */
 3807         if (QLNX_IS_IWARP(dev) && (attr_mask == IB_QP_STATE)) {
 3808                 QL_DPRINT11(ha, "only state requested\n");
 3809                 return 0;
 3810         }
 3811 
 3812         qp_attr->path_mtu = qlnxr_mtu_int_to_enum(params.mtu);
 3813         qp_attr->path_mig_state = IB_MIG_MIGRATED;
 3814         qp_attr->rq_psn = params.rq_psn;
 3815         qp_attr->sq_psn = params.sq_psn;
 3816         qp_attr->dest_qp_num = params.dest_qp;
 3817 
 3818         qp_attr->qp_access_flags = qlnxr_to_ib_qp_acc_flags(&params);
 3819 
 3820         QL_DPRINT12(ha, "qp_state = 0x%x cur_qp_state = 0x%x "
 3821                 "path_mtu = %d qp_access_flags = 0x%x\n",
 3822                 qp_attr->qp_state, qp_attr->cur_qp_state, qp_attr->path_mtu,
 3823                 qp_attr->qp_access_flags);
 3824 
 3825         qp_attr->cap.max_send_wr = qp->sq.max_wr;
 3826         qp_attr->cap.max_recv_wr = qp->rq.max_wr;
 3827         qp_attr->cap.max_send_sge = qp->sq.max_sges;
 3828         qp_attr->cap.max_recv_sge = qp->rq.max_sges;
 3829         qp_attr->cap.max_inline_data = qp->max_inline_data;
 3830         qp_init_attr->cap = qp_attr->cap;
 3831 
 3832         memcpy(&qp_attr->ah_attr.grh.dgid.raw[0], &params.dgid.bytes[0],
 3833                sizeof(qp_attr->ah_attr.grh.dgid.raw));
 3834 
 3835         qp_attr->ah_attr.grh.flow_label = params.flow_label;
 3836         qp_attr->ah_attr.grh.sgid_index = qp->sgid_idx;
 3837         qp_attr->ah_attr.grh.hop_limit = params.hop_limit_ttl;
 3838         qp_attr->ah_attr.grh.traffic_class = params.traffic_class_tos;
 3839 
 3840         qp_attr->ah_attr.ah_flags = IB_AH_GRH;
 3841         qp_attr->ah_attr.port_num = 1; /* FIXME -> check this */
 3842         qp_attr->ah_attr.sl = 0;/* FIXME -> check this */
 3843         qp_attr->timeout = params.timeout;
 3844         qp_attr->rnr_retry = params.rnr_retry;
 3845         qp_attr->retry_cnt = params.retry_cnt;
 3846         qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
 3847         qp_attr->pkey_index = params.pkey_index;
 3848         qp_attr->port_num = 1; /* FIXME -> check this */
 3849         qp_attr->ah_attr.src_path_bits = 0;
 3850         qp_attr->ah_attr.static_rate = 0;
 3851         qp_attr->alt_pkey_index = 0;
 3852         qp_attr->alt_port_num = 0;
 3853         qp_attr->alt_timeout = 0;
 3854         memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
 3855 
 3856         qp_attr->sq_draining = (params.state == ECORE_ROCE_QP_STATE_SQD) ? 1 : 0;
 3857         qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
 3858         qp_attr->max_rd_atomic = params.max_rd_atomic;
 3859         qp_attr->en_sqd_async_notify = (params.sqd_async)? 1 : 0;
 3860 
 3861         QL_DPRINT12(ha, "max_inline_data=%d\n",
 3862                 qp_attr->cap.max_inline_data);
 3863 
 3864 err:
 3865         QL_DPRINT12(ha, "exit\n");
 3866         return rc;
 3867 }
 3868 
 3869 static void
 3870 qlnxr_cleanup_user(struct qlnxr_dev *dev, struct qlnxr_qp *qp)
 3871 {
 3872         qlnx_host_t     *ha;
 3873 
 3874         ha = dev->ha;
 3875 
 3876         QL_DPRINT12(ha, "enter\n");
 3877 
 3878         if (qp->usq.umem)
 3879                 ib_umem_release(qp->usq.umem);
 3880 
 3881         qp->usq.umem = NULL;
 3882 
 3883         if (qp->urq.umem)
 3884                 ib_umem_release(qp->urq.umem);
 3885 
 3886         qp->urq.umem = NULL;
 3887 
 3888         QL_DPRINT12(ha, "exit\n");
 3889         return;
 3890 }
 3891 
 3892 static void
 3893 qlnxr_cleanup_kernel(struct qlnxr_dev *dev, struct qlnxr_qp *qp)
 3894 {
 3895         qlnx_host_t     *ha;
 3896 
 3897         ha = dev->ha;
 3898 
 3899         QL_DPRINT12(ha, "enter\n");
 3900 
 3901         if (qlnxr_qp_has_sq(qp)) {
 3902                 QL_DPRINT12(ha, "freeing SQ\n");
 3903                 ha->qlnxr_debug = 1;
 3904 //              ecore_chain_free(dev->cdev, &qp->sq.pbl);
 3905                 ha->qlnxr_debug = 0;
 3906                 kfree(qp->wqe_wr_id);
 3907         }
 3908 
 3909         if (qlnxr_qp_has_rq(qp)) {
 3910                 QL_DPRINT12(ha, "freeing RQ\n");
 3911                 ha->qlnxr_debug = 1;
 3912         //      ecore_chain_free(dev->cdev, &qp->rq.pbl);
 3913                 ha->qlnxr_debug = 0;
 3914                 kfree(qp->rqe_wr_id);
 3915         }
 3916 
 3917         QL_DPRINT12(ha, "exit\n");
 3918         return;
 3919 }
 3920 
 3921 static int
 3922 qlnxr_free_qp_resources(struct qlnxr_dev *dev,
 3923     struct qlnxr_qp *qp, struct ib_udata *udata)
 3924 {
 3925         int             rc = 0;
 3926         qlnx_host_t     *ha;
 3927         struct ecore_rdma_destroy_qp_out_params d_out_params;
 3928 
 3929         ha = dev->ha;
 3930 
 3931         QL_DPRINT12(ha, "enter\n");
 3932 
 3933 #if 0
 3934         if (qp->qp_type != IB_QPT_GSI) {
 3935                 rc = ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp,
 3936                                 &d_out_params);
 3937                 if (rc)
 3938                         return rc;
 3939         }
 3940 
 3941         if (udata)
 3942                 qlnxr_cleanup_user(dev, qp);
 3943         else
 3944                 qlnxr_cleanup_kernel(dev, qp);
 3945 #endif
 3946 
 3947         if (udata)
 3948                 qlnxr_cleanup_user(dev, qp);
 3949         else
 3950                 qlnxr_cleanup_kernel(dev, qp);
 3951 
 3952         if (qp->qp_type != IB_QPT_GSI) {
 3953                 rc = ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp,
 3954                                 &d_out_params);
 3955                 if (rc)
 3956                         return rc;
 3957         }
 3958 
 3959         QL_DPRINT12(ha, "exit\n");
 3960         return 0;
 3961 }
 3962 
 3963 int
 3964 qlnxr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)
 3965 {
 3966         struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
 3967         struct qlnxr_dev *dev = qp->dev;
 3968         int rc = 0;
 3969         struct ib_qp_attr attr;
 3970         int attr_mask = 0;
 3971         qlnx_host_t     *ha;
 3972 
 3973         ha = dev->ha;
 3974 
 3975         QL_DPRINT12(ha, "enter qp = %p, qp_type=%d\n", qp, qp->qp_type);
 3976 
 3977         qp->destroyed = 1;
 3978 
 3979         if (QLNX_IS_ROCE(dev) && (qp->state != (ECORE_ROCE_QP_STATE_RESET |
 3980                                   ECORE_ROCE_QP_STATE_ERR |
 3981                                   ECORE_ROCE_QP_STATE_INIT))) {
 3982                 attr.qp_state = IB_QPS_ERR;
 3983                 attr_mask |= IB_QP_STATE;
 3984 
 3985                 /* change the QP state to ERROR */
 3986                 qlnxr_modify_qp(ibqp, &attr, attr_mask, NULL);
 3987         }
 3988 
 3989         if (qp->qp_type == IB_QPT_GSI)
 3990                 qlnxr_destroy_gsi_qp(dev);
 3991 
 3992         qp->sig = ~qp->sig;
 3993 
 3994         qlnxr_free_qp_resources(dev, qp, udata);
 3995 
 3996         if (atomic_dec_and_test(&qp->refcnt)) {
 3997                 /* TODO: only for iWARP? */
 3998                 qlnxr_idr_remove(dev, qp->qp_id);
 3999         }
 4000 
 4001         QL_DPRINT12(ha, "exit\n");
 4002         return rc;
 4003 }
 4004 
 4005 static inline int
 4006 qlnxr_wq_is_full(struct qlnxr_qp_hwq_info *wq)
 4007 {
 4008         return (((wq->prod + 1) % wq->max_wr) == wq->cons);
 4009 }
 4010 
 4011 static int
 4012 sge_data_len(struct ib_sge *sg_list, int num_sge)
 4013 {
 4014         int i, len = 0;
 4015         for (i = 0; i < num_sge; i++)
 4016                 len += sg_list[i].length;
 4017         return len;
 4018 }
 4019 
 4020 static void
 4021 swap_wqe_data64(u64 *p)
 4022 {
 4023         int i;
 4024 
 4025         for (i = 0; i < QLNXR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
 4026                 *p = cpu_to_be64(cpu_to_le64(*p));
 4027 }
 4028 
 4029 static u32
 4030 qlnxr_prepare_sq_inline_data(struct qlnxr_dev *dev,
 4031         struct qlnxr_qp         *qp,
 4032         u8                      *wqe_size,
 4033         const struct ib_send_wr *wr,
 4034         const struct ib_send_wr **bad_wr,
 4035         u8                      *bits,
 4036         u8                      bit)
 4037 {
 4038         int i, seg_siz;
 4039         char *seg_prt, *wqe;
 4040         u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
 4041         qlnx_host_t     *ha;
 4042 
 4043         ha = dev->ha;
 4044 
 4045         QL_DPRINT12(ha, "enter[%d]\n", data_size);
 4046 
 4047         if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
 4048                 QL_DPRINT12(ha,
 4049                         "Too much inline data in WR:[%d, %d]\n",
 4050                         data_size, ROCE_REQ_MAX_INLINE_DATA_SIZE);
 4051                 *bad_wr = wr;
 4052                 return 0;
 4053         }
 4054 
 4055         if (!data_size)
 4056                 return data_size;
 4057 
 4058         /* set the bit */
 4059         *bits |= bit;
 4060 
 4061         seg_prt = wqe = NULL;
 4062         seg_siz = 0;
 4063 
 4064         /* copy data inline */
 4065         for (i = 0; i < wr->num_sge; i++) {
 4066                 u32 len = wr->sg_list[i].length;
 4067                 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
 4068 
 4069                 while (len > 0) {
 4070                         u32 cur;
 4071 
 4072                         /* new segment required */
 4073                         if (!seg_siz) {
 4074                                 wqe = (char *)ecore_chain_produce(&qp->sq.pbl);
 4075                                 seg_prt = wqe;
 4076                                 seg_siz = sizeof(struct rdma_sq_common_wqe);
 4077                                 (*wqe_size)++;
 4078                         }
 4079 
 4080                         /* calculate currently allowed length */
 4081                         cur = MIN(len, seg_siz);
 4082 
 4083                         memcpy(seg_prt, src, cur);
 4084 
 4085                         /* update segment variables */
 4086                         seg_prt += cur;
 4087                         seg_siz -= cur;
 4088                         /* update sge variables */
 4089                         src += cur;
 4090                         len -= cur;
 4091 
 4092                         /* swap fully-completed segments */
 4093                         if (!seg_siz)
 4094                                 swap_wqe_data64((u64 *)wqe);
 4095                 }
 4096         }
 4097 
 4098         /* swap last not completed segment */
 4099         if (seg_siz)
 4100                 swap_wqe_data64((u64 *)wqe);
 4101 
 4102         QL_DPRINT12(ha, "exit\n");
 4103         return data_size;
 4104 }
 4105 
 4106 static u32
 4107 qlnxr_prepare_sq_sges(struct qlnxr_dev *dev, struct qlnxr_qp *qp,
 4108         u8 *wqe_size, const struct ib_send_wr *wr)
 4109 {
 4110         int i;
 4111         u32 data_size = 0;
 4112         qlnx_host_t     *ha;
 4113 
 4114         ha = dev->ha;
 4115 
 4116         QL_DPRINT12(ha, "enter wr->num_sge = %d \n", wr->num_sge);
 4117 
 4118         for (i = 0; i < wr->num_sge; i++) {
 4119                 struct rdma_sq_sge *sge = ecore_chain_produce(&qp->sq.pbl);
 4120 
 4121                 TYPEPTR_ADDR_SET(sge, addr, wr->sg_list[i].addr);
 4122                 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
 4123                 sge->length = cpu_to_le32(wr->sg_list[i].length);
 4124                 data_size += wr->sg_list[i].length;
 4125         }
 4126 
 4127         if (wqe_size)
 4128                 *wqe_size += wr->num_sge;
 4129 
 4130         QL_DPRINT12(ha, "exit data_size = %d\n", data_size);
 4131         return data_size;
 4132 }
 4133 
 4134 static u32
 4135 qlnxr_prepare_sq_rdma_data(struct qlnxr_dev *dev,
 4136         struct qlnxr_qp *qp,
 4137         struct rdma_sq_rdma_wqe_1st *rwqe,
 4138         struct rdma_sq_rdma_wqe_2nd *rwqe2,
 4139         const struct ib_send_wr *wr,
 4140         const struct ib_send_wr **bad_wr)
 4141 {
 4142         qlnx_host_t     *ha;
 4143         u32             ret = 0;
 4144 
 4145         ha = dev->ha;
 4146 
 4147         QL_DPRINT12(ha, "enter\n");
 4148 
 4149         rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
 4150         TYPEPTR_ADDR_SET(rwqe2, remote_va, rdma_wr(wr)->remote_addr);
 4151 
 4152         if (wr->send_flags & IB_SEND_INLINE) {
 4153                 u8 flags = 0;
 4154                 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
 4155                 return qlnxr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size,
 4156                                 wr, bad_wr, &rwqe->flags, flags);
 4157         }
 4158 
 4159         ret = qlnxr_prepare_sq_sges(dev, qp, &rwqe->wqe_size, wr);
 4160 
 4161         QL_DPRINT12(ha, "exit ret = 0x%x\n", ret);
 4162 
 4163         return (ret);
 4164 }
 4165 
 4166 static u32
 4167 qlnxr_prepare_sq_send_data(struct qlnxr_dev *dev,
 4168         struct qlnxr_qp *qp,
 4169         struct rdma_sq_send_wqe *swqe,
 4170         struct rdma_sq_send_wqe *swqe2,
 4171         const struct ib_send_wr *wr,
 4172         const struct ib_send_wr **bad_wr)
 4173 {
 4174         qlnx_host_t     *ha;
 4175         u32             ret = 0;
 4176 
 4177         ha = dev->ha;
 4178 
 4179         QL_DPRINT12(ha, "enter\n");
 4180 
 4181         memset(swqe2, 0, sizeof(*swqe2));
 4182 
 4183         if (wr->send_flags & IB_SEND_INLINE) {
 4184                 u8 flags = 0;
 4185                 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
 4186                 return qlnxr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size,
 4187                                 wr, bad_wr, &swqe->flags, flags);
 4188         }
 4189 
 4190         ret = qlnxr_prepare_sq_sges(dev, qp, &swqe->wqe_size, wr);
 4191 
 4192         QL_DPRINT12(ha, "exit ret = 0x%x\n", ret);
 4193 
 4194         return (ret);
 4195 }
 4196 
 4197 static void
 4198 qlnx_handle_completed_mrs(struct qlnxr_dev *dev, struct mr_info *info)
 4199 {
 4200         qlnx_host_t     *ha;
 4201 
 4202         ha = dev->ha;
 4203 
 4204         int work = info->completed - info->completed_handled - 1;
 4205 
 4206         QL_DPRINT12(ha, "enter [%d]\n", work);
 4207 
 4208         while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
 4209                 struct qlnxr_pbl *pbl;
 4210 
 4211                 /* Free all the page list that are possible to be freed
 4212                  * (all the ones that were invalidated), under the assumption
 4213                  * that if an FMR was completed successfully that means that
 4214                  * if there was an invalidate operation before it also ended
 4215                  */
 4216                 pbl = list_first_entry(&info->inuse_pbl_list,
 4217                                        struct qlnxr_pbl,
 4218                                        list_entry);
 4219                 list_del(&pbl->list_entry);
 4220                 list_add_tail(&pbl->list_entry, &info->free_pbl_list);
 4221                 info->completed_handled++;
 4222         }
 4223 
 4224         QL_DPRINT12(ha, "exit\n");
 4225         return;
 4226 }
 4227 
 4228 #if __FreeBSD_version >= 1102000
 4229 
 4230 static int qlnxr_prepare_reg(struct qlnxr_qp *qp,
 4231                 struct rdma_sq_fmr_wqe_1st *fwqe1,
 4232                 const struct ib_reg_wr *wr)
 4233 {
 4234         struct qlnxr_mr *mr = get_qlnxr_mr(wr->mr);
 4235         struct rdma_sq_fmr_wqe_2nd *fwqe2;
 4236 
 4237         fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)ecore_chain_produce(&qp->sq.pbl);
 4238         fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
 4239         fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
 4240         fwqe1->l_key = wr->key;
 4241 
 4242         fwqe2->access_ctrl = 0;
 4243 
 4244         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
 4245                 !!(wr->access & IB_ACCESS_REMOTE_READ));
 4246         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
 4247                 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
 4248         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
 4249                 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
 4250         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
 4251         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
 4252                 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
 4253         fwqe2->fmr_ctrl = 0;
 4254 
 4255         SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
 4256                 ilog2(mr->ibmr.page_size) - 12);
 4257 
 4258         fwqe2->length_hi = 0; /* TODO - figure out why length is only 32bit.. */
 4259         fwqe2->length_lo = mr->ibmr.length;
 4260         fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
 4261         fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
 4262 
 4263         qp->wqe_wr_id[qp->sq.prod].mr = mr;
 4264 
 4265         return 0;
 4266 }
 4267 
 4268 #else
 4269 
 4270 static void
 4271 build_frmr_pbes(struct qlnxr_dev *dev, const struct ib_send_wr *wr,
 4272         struct mr_info *info)
 4273 {
 4274         int i;
 4275         u64 buf_addr = 0;
 4276         int num_pbes, total_num_pbes = 0;
 4277         struct regpair *pbe;
 4278         struct qlnxr_pbl *pbl_tbl = info->pbl_table;
 4279         struct qlnxr_pbl_info *pbl_info = &info->pbl_info;
 4280         qlnx_host_t     *ha;
 4281 
 4282         ha = dev->ha;
 4283 
 4284         QL_DPRINT12(ha, "enter\n");
 4285 
 4286         pbe = (struct regpair *)pbl_tbl->va;
 4287         num_pbes = 0;
 4288 
 4289         for (i = 0; i < wr->wr.fast_reg.page_list_len; i++) {
 4290                 buf_addr = wr->wr.fast_reg.page_list->page_list[i];
 4291                 pbe->lo = cpu_to_le32((u32)buf_addr);
 4292                 pbe->hi = cpu_to_le32((u32)upper_32_bits(buf_addr));
 4293 
 4294                 num_pbes += 1;
 4295                 pbe++;
 4296                 total_num_pbes++;
 4297 
 4298                 if (total_num_pbes == pbl_info->num_pbes)
 4299                         return;
 4300 
 4301                 /* if the given pbl is full storing the pbes,
 4302                  * move to next pbl.
 4303                  */
 4304                 if (num_pbes ==
 4305                     (pbl_info->pbl_size / sizeof(u64))) {
 4306                         pbl_tbl++;
 4307                         pbe = (struct regpair *)pbl_tbl->va;
 4308                         num_pbes = 0;
 4309                 }
 4310         }
 4311         QL_DPRINT12(ha, "exit\n");
 4312 
 4313         return;
 4314 }
 4315 
 4316 static int
 4317 qlnxr_prepare_safe_pbl(struct qlnxr_dev *dev, struct mr_info *info)
 4318 {
 4319         int rc = 0;
 4320         qlnx_host_t     *ha;
 4321 
 4322         ha = dev->ha;
 4323 
 4324         QL_DPRINT12(ha, "enter\n");
 4325 
 4326         if (info->completed == 0) {
 4327                 //DP_VERBOSE(dev, QLNXR_MSG_MR, "First FMR\n");
 4328                 /* first fmr */
 4329                 return 0;
 4330         }
 4331 
 4332         qlnx_handle_completed_mrs(dev, info);
 4333 
 4334         list_add_tail(&info->pbl_table->list_entry, &info->inuse_pbl_list);
 4335 
 4336         if (list_empty(&info->free_pbl_list)) {
 4337                 info->pbl_table = qlnxr_alloc_pbl_tbl(dev, &info->pbl_info,
 4338                                                           GFP_ATOMIC);
 4339         } else {
 4340                 info->pbl_table = list_first_entry(&info->free_pbl_list,
 4341                                         struct qlnxr_pbl,
 4342                                         list_entry);
 4343                 list_del(&info->pbl_table->list_entry);
 4344         }
 4345 
 4346         if (!info->pbl_table)
 4347                 rc = -ENOMEM;
 4348 
 4349         QL_DPRINT12(ha, "exit\n");
 4350         return rc;
 4351 }
 4352 
 4353 static inline int
 4354 qlnxr_prepare_fmr(struct qlnxr_qp *qp,
 4355         struct rdma_sq_fmr_wqe_1st *fwqe1,
 4356         const struct ib_send_wr *wr)
 4357 {
 4358         struct qlnxr_dev *dev = qp->dev;
 4359         u64 fbo;
 4360         struct qlnxr_fast_reg_page_list *frmr_list =
 4361                 get_qlnxr_frmr_list(wr->wr.fast_reg.page_list);
 4362         struct rdma_sq_fmr_wqe *fwqe2 =
 4363                 (struct rdma_sq_fmr_wqe *)ecore_chain_produce(&qp->sq.pbl);
 4364         int rc = 0;
 4365         qlnx_host_t     *ha;
 4366 
 4367         ha = dev->ha;
 4368 
 4369         QL_DPRINT12(ha, "enter\n");
 4370 
 4371         if (wr->wr.fast_reg.page_list_len == 0)
 4372                 BUG();
 4373 
 4374         rc = qlnxr_prepare_safe_pbl(dev, &frmr_list->info);
 4375         if (rc)
 4376                 return rc;
 4377 
 4378         fwqe1->addr.hi = upper_32_bits(wr->wr.fast_reg.iova_start);
 4379         fwqe1->addr.lo = lower_32_bits(wr->wr.fast_reg.iova_start);
 4380         fwqe1->l_key = wr->wr.fast_reg.rkey;
 4381 
 4382         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_REMOTE_READ,
 4383                    !!(wr->wr.fast_reg.access_flags & IB_ACCESS_REMOTE_READ));
 4384         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_REMOTE_WRITE,
 4385                    !!(wr->wr.fast_reg.access_flags & IB_ACCESS_REMOTE_WRITE));
 4386         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_ENABLE_ATOMIC,
 4387                    !!(wr->wr.fast_reg.access_flags & IB_ACCESS_REMOTE_ATOMIC));
 4388         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_LOCAL_READ, 1);
 4389         SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_LOCAL_WRITE,
 4390                    !!(wr->wr.fast_reg.access_flags & IB_ACCESS_LOCAL_WRITE));
 4391 
 4392         fwqe2->fmr_ctrl = 0;
 4393 
 4394         SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
 4395                    ilog2(1 << wr->wr.fast_reg.page_shift) - 12);
 4396         SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_ZERO_BASED, 0);
 4397 
 4398         fwqe2->length_hi = 0; /* Todo - figure this out... why length is only 32bit.. */
 4399         fwqe2->length_lo = wr->wr.fast_reg.length;
 4400         fwqe2->pbl_addr.hi = upper_32_bits(frmr_list->info.pbl_table->pa);
 4401         fwqe2->pbl_addr.lo = lower_32_bits(frmr_list->info.pbl_table->pa);
 4402 
 4403         /* produce another wqe for fwqe3 */
 4404         ecore_chain_produce(&qp->sq.pbl);
 4405 
 4406         fbo = wr->wr.fast_reg.iova_start -
 4407             (wr->wr.fast_reg.page_list->page_list[0] & PAGE_MASK);
 4408 
 4409         QL_DPRINT12(ha, "wr.fast_reg.iova_start = %p rkey=%x addr=%x:%x"
 4410                 " length = %x pbl_addr %x:%x\n",
 4411                 wr->wr.fast_reg.iova_start, wr->wr.fast_reg.rkey,
 4412                 fwqe1->addr.hi, fwqe1->addr.lo, fwqe2->length_lo,
 4413                 fwqe2->pbl_addr.hi, fwqe2->pbl_addr.lo);
 4414 
 4415         build_frmr_pbes(dev, wr, &frmr_list->info);
 4416 
 4417         qp->wqe_wr_id[qp->sq.prod].frmr = frmr_list;
 4418 
 4419         QL_DPRINT12(ha, "exit\n");
 4420         return 0;
 4421 }
 4422 
 4423 #endif /* #if __FreeBSD_version >= 1102000 */
 4424 
 4425 static enum ib_wc_opcode
 4426 qlnxr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
 4427 {
 4428         switch (opcode) {
 4429         case IB_WR_RDMA_WRITE:
 4430         case IB_WR_RDMA_WRITE_WITH_IMM:
 4431                 return IB_WC_RDMA_WRITE;
 4432         case IB_WR_SEND_WITH_IMM:
 4433         case IB_WR_SEND:
 4434         case IB_WR_SEND_WITH_INV:
 4435                 return IB_WC_SEND;
 4436         case IB_WR_RDMA_READ:
 4437                 return IB_WC_RDMA_READ;
 4438         case IB_WR_ATOMIC_CMP_AND_SWP:
 4439                 return IB_WC_COMP_SWAP;
 4440         case IB_WR_ATOMIC_FETCH_AND_ADD:
 4441                 return IB_WC_FETCH_ADD;
 4442 
 4443 #if __FreeBSD_version >= 1102000
 4444         case IB_WR_REG_MR:
 4445                 return IB_WC_REG_MR;
 4446 #else
 4447         case IB_WR_FAST_REG_MR:
 4448                 return IB_WC_FAST_REG_MR;
 4449 #endif /* #if __FreeBSD_version >= 1102000 */
 4450 
 4451         case IB_WR_LOCAL_INV:
 4452                 return IB_WC_LOCAL_INV;
 4453         default:
 4454                 return IB_WC_SEND;
 4455         }
 4456 }
 4457 static inline bool
 4458 qlnxr_can_post_send(struct qlnxr_qp *qp, const struct ib_send_wr *wr)
 4459 {
 4460         int wq_is_full, err_wr, pbl_is_full;
 4461         struct qlnxr_dev *dev = qp->dev;
 4462         qlnx_host_t     *ha;
 4463 
 4464         ha = dev->ha;
 4465 
 4466         QL_DPRINT12(ha, "enter[qp, wr] = [%p,%p]\n", qp, wr);
 4467 
 4468         /* prevent SQ overflow and/or processing of a bad WR */
 4469         err_wr = wr->num_sge > qp->sq.max_sges;
 4470         wq_is_full = qlnxr_wq_is_full(&qp->sq);
 4471         pbl_is_full = ecore_chain_get_elem_left_u32(&qp->sq.pbl) <
 4472                       QLNXR_MAX_SQE_ELEMENTS_PER_SQE;
 4473         if (wq_is_full || err_wr || pbl_is_full) {
 4474                 if (wq_is_full &&
 4475                     !(qp->err_bitmap & QLNXR_QP_ERR_SQ_FULL)) {
 4476                         qp->err_bitmap |= QLNXR_QP_ERR_SQ_FULL;
 4477 
 4478                         QL_DPRINT12(ha,
 4479                                 "error: WQ is full. Post send on QP failed"
 4480                                 " (this error appears only once) "
 4481                                 "[qp, wr, qp->err_bitmap]=[%p, %p, 0x%x]\n",
 4482                                 qp, wr, qp->err_bitmap);
 4483                 }
 4484 
 4485                 if (err_wr &&
 4486                     !(qp->err_bitmap & QLNXR_QP_ERR_BAD_SR)) {
 4487                         qp->err_bitmap |= QLNXR_QP_ERR_BAD_SR;
 4488 
 4489                         QL_DPRINT12(ha,
 4490                                 "error: WQ is bad. Post send on QP failed"
 4491                                 " (this error appears only once) "
 4492                                 "[qp, wr, qp->err_bitmap]=[%p, %p, 0x%x]\n",
 4493                                 qp, wr, qp->err_bitmap);
 4494                 }
 4495 
 4496                 if (pbl_is_full &&
 4497                     !(qp->err_bitmap & QLNXR_QP_ERR_SQ_PBL_FULL)) {
 4498                         qp->err_bitmap |= QLNXR_QP_ERR_SQ_PBL_FULL;
 4499 
 4500                         QL_DPRINT12(ha,
 4501                                 "error: WQ PBL is full. Post send on QP failed"
 4502                                 " (this error appears only once) "
 4503                                 "[qp, wr, qp->err_bitmap]=[%p, %p, 0x%x]\n",
 4504                                 qp, wr, qp->err_bitmap);
 4505                 }
 4506                 return false;
 4507         }
 4508         QL_DPRINT12(ha, "exit[qp, wr] = [%p,%p]\n", qp, wr);
 4509         return true;
 4510 }
 4511 
 4512 int
 4513 qlnxr_post_send(struct ib_qp *ibqp,
 4514         const struct ib_send_wr *wr,
 4515         const struct ib_send_wr **bad_wr)
 4516 {
 4517         struct qlnxr_dev        *dev = get_qlnxr_dev(ibqp->device);
 4518         struct qlnxr_qp         *qp = get_qlnxr_qp(ibqp);
 4519         unsigned long           flags;
 4520         int                     status = 0, rc = 0;
 4521         bool                    comp;
 4522         qlnx_host_t             *ha;
 4523         uint32_t                reg_addr;
 4524 
 4525         *bad_wr = NULL;
 4526         ha = dev->ha;
 4527 
 4528         QL_DPRINT12(ha, "exit[ibqp, wr, bad_wr] = [%p, %p, %p]\n",
 4529                 ibqp, wr, bad_wr);
 4530 
 4531         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 4532                 return -EINVAL;
 4533 
 4534         if (qp->qp_type == IB_QPT_GSI)
 4535                 return qlnxr_gsi_post_send(ibqp, wr, bad_wr);
 4536 
 4537         spin_lock_irqsave(&qp->q_lock, flags);
 4538 
 4539         if (QLNX_IS_ROCE(dev) && (qp->state != ECORE_ROCE_QP_STATE_RTS) &&
 4540             (qp->state != ECORE_ROCE_QP_STATE_ERR) &&
 4541             (qp->state != ECORE_ROCE_QP_STATE_SQD)) {
 4542                 spin_unlock_irqrestore(&qp->q_lock, flags);
 4543                 *bad_wr = wr;
 4544                 QL_DPRINT11(ha, "QP in wrong state! QP icid=0x%x state %d\n",
 4545                         qp->icid, qp->state);
 4546                 return -EINVAL;
 4547         }
 4548 
 4549         if (!wr) {
 4550                 QL_DPRINT11(ha, "Got an empty post send???\n");
 4551         }
 4552 
 4553         while (wr) {
 4554                 struct rdma_sq_common_wqe       *wqe;
 4555                 struct rdma_sq_send_wqe         *swqe;
 4556                 struct rdma_sq_send_wqe         *swqe2;
 4557                 struct rdma_sq_rdma_wqe_1st     *rwqe;
 4558                 struct rdma_sq_rdma_wqe_2nd     *rwqe2;
 4559                 struct rdma_sq_local_inv_wqe    *iwqe;
 4560                 struct rdma_sq_atomic_wqe       *awqe1;
 4561                 struct rdma_sq_atomic_wqe       *awqe2;
 4562                 struct rdma_sq_atomic_wqe       *awqe3;
 4563                 struct rdma_sq_fmr_wqe_1st      *fwqe1;
 4564 
 4565                 if (!qlnxr_can_post_send(qp, wr)) {
 4566                         status = -ENOMEM;
 4567                         *bad_wr = wr;
 4568                         break;
 4569                 }
 4570 
 4571                 wqe = ecore_chain_produce(&qp->sq.pbl);
 4572 
 4573                 qp->wqe_wr_id[qp->sq.prod].signaled =
 4574                         !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
 4575 
 4576                 /* common fields */
 4577                 wqe->flags = 0;
 4578                 wqe->flags |= (RDMA_SQ_SEND_WQE_COMP_FLG_MASK <<
 4579                                 RDMA_SQ_SEND_WQE_COMP_FLG_SHIFT);
 4580 
 4581                 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG, \
 4582                         !!(wr->send_flags & IB_SEND_SOLICITED));
 4583 
 4584                 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) ||
 4585                                 (qp->signaled);
 4586 
 4587                 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
 4588                 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG,  \
 4589                         !!(wr->send_flags & IB_SEND_FENCE));
 4590 
 4591                 wqe->prev_wqe_size = qp->prev_wqe_size;
 4592 
 4593                 qp->wqe_wr_id[qp->sq.prod].opcode = qlnxr_ib_to_wc_opcode(wr->opcode);
 4594 
 4595                 switch (wr->opcode) {
 4596                 case IB_WR_SEND_WITH_IMM:
 4597 
 4598                         wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
 4599                         swqe = (struct rdma_sq_send_wqe *)wqe;
 4600                         swqe->wqe_size = 2;
 4601                         swqe2 = (struct rdma_sq_send_wqe *)
 4602                                         ecore_chain_produce(&qp->sq.pbl);
 4603                         swqe->inv_key_or_imm_data =
 4604                                 cpu_to_le32(wr->ex.imm_data);
 4605                         swqe->length = cpu_to_le32(
 4606                                                 qlnxr_prepare_sq_send_data(dev,
 4607                                                         qp, swqe, swqe2, wr,
 4608                                                         bad_wr));
 4609 
 4610                         qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
 4611                         qp->prev_wqe_size = swqe->wqe_size;
 4612                         qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
 4613 
 4614                         QL_DPRINT12(ha, "SEND w/ IMM length = %d imm data=%x\n",
 4615                                 swqe->length, wr->ex.imm_data);
 4616 
 4617                         break;
 4618 
 4619                 case IB_WR_SEND:
 4620 
 4621                         wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
 4622                         swqe = (struct rdma_sq_send_wqe *)wqe;
 4623 
 4624                         swqe->wqe_size = 2;
 4625                         swqe2 = (struct rdma_sq_send_wqe *)
 4626                                         ecore_chain_produce(&qp->sq.pbl);
 4627                         swqe->length = cpu_to_le32(
 4628                                                 qlnxr_prepare_sq_send_data(dev,
 4629                                                         qp, swqe, swqe2, wr,
 4630                                                         bad_wr));
 4631                         qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
 4632                         qp->prev_wqe_size = swqe->wqe_size;
 4633                         qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
 4634 
 4635                         QL_DPRINT12(ha, "SEND w/o IMM length = %d\n",
 4636                                 swqe->length);
 4637 
 4638                         break;
 4639 
 4640                 case IB_WR_SEND_WITH_INV:
 4641 
 4642                         wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
 4643                         swqe = (struct rdma_sq_send_wqe *)wqe;
 4644                         swqe2 = (struct rdma_sq_send_wqe *)
 4645                                         ecore_chain_produce(&qp->sq.pbl);
 4646                         swqe->wqe_size = 2;
 4647                         swqe->inv_key_or_imm_data =
 4648                                 cpu_to_le32(wr->ex.invalidate_rkey);
 4649                         swqe->length = cpu_to_le32(qlnxr_prepare_sq_send_data(dev,
 4650                                                 qp, swqe, swqe2, wr, bad_wr));
 4651                         qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
 4652                         qp->prev_wqe_size = swqe->wqe_size;
 4653                         qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
 4654 
 4655                         QL_DPRINT12(ha, "SEND w INVALIDATE length = %d\n",
 4656                                 swqe->length);
 4657                         break;
 4658 
 4659                 case IB_WR_RDMA_WRITE_WITH_IMM:
 4660 
 4661                         wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
 4662                         rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
 4663 
 4664                         rwqe->wqe_size = 2;
 4665                         rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
 4666                         rwqe2 = (struct rdma_sq_rdma_wqe_2nd *)
 4667                                         ecore_chain_produce(&qp->sq.pbl);
 4668                         rwqe->length = cpu_to_le32(qlnxr_prepare_sq_rdma_data(dev,
 4669                                                 qp, rwqe, rwqe2, wr, bad_wr));
 4670                         qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
 4671                         qp->prev_wqe_size = rwqe->wqe_size;
 4672                         qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
 4673 
 4674                         QL_DPRINT12(ha,
 4675                                 "RDMA WRITE w/ IMM length = %d imm data=%x\n",
 4676                                 rwqe->length, rwqe->imm_data);
 4677 
 4678                         break;
 4679 
 4680                 case IB_WR_RDMA_WRITE:
 4681 
 4682                         wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
 4683                         rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
 4684 
 4685                         rwqe->wqe_size = 2;
 4686                         rwqe2 = (struct rdma_sq_rdma_wqe_2nd *)
 4687                                         ecore_chain_produce(&qp->sq.pbl);
 4688                         rwqe->length = cpu_to_le32(qlnxr_prepare_sq_rdma_data(dev,
 4689                                                 qp, rwqe, rwqe2, wr, bad_wr));
 4690                         qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
 4691                         qp->prev_wqe_size = rwqe->wqe_size;
 4692                         qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
 4693 
 4694                         QL_DPRINT12(ha,
 4695                                 "RDMA WRITE w/o IMM length = %d\n",
 4696                                 rwqe->length);
 4697 
 4698                         break;
 4699 
 4700                 case IB_WR_RDMA_READ_WITH_INV:
 4701 
 4702                         QL_DPRINT12(ha,
 4703                                 "RDMA READ WITH INVALIDATE not supported\n");
 4704 
 4705                         *bad_wr = wr;
 4706                         rc = -EINVAL;
 4707 
 4708                         break;
 4709 
 4710                 case IB_WR_RDMA_READ:
 4711 
 4712                         wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
 4713                         rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
 4714 
 4715                         rwqe->wqe_size = 2;
 4716                         rwqe2 = (struct rdma_sq_rdma_wqe_2nd *)
 4717                                         ecore_chain_produce(&qp->sq.pbl);
 4718                         rwqe->length = cpu_to_le32(qlnxr_prepare_sq_rdma_data(dev,
 4719                                                 qp, rwqe, rwqe2, wr, bad_wr));
 4720 
 4721                         qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
 4722                         qp->prev_wqe_size = rwqe->wqe_size;
 4723                         qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
 4724 
 4725                         QL_DPRINT12(ha, "RDMA READ length = %d\n",
 4726                                 rwqe->length);
 4727 
 4728                         break;
 4729 
 4730                 case IB_WR_ATOMIC_CMP_AND_SWP:
 4731                 case IB_WR_ATOMIC_FETCH_AND_ADD:
 4732 
 4733                         QL_DPRINT12(ha,
 4734                                 "ATOMIC operation = %s\n",
 4735                                 ((wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) ?
 4736                                         "IB_WR_ATOMIC_CMP_AND_SWP" : 
 4737                                         "IB_WR_ATOMIC_FETCH_AND_ADD"));
 4738 
 4739                         awqe1 = (struct rdma_sq_atomic_wqe *)wqe;
 4740                         awqe1->prev_wqe_size = 4;
 4741 
 4742                         awqe2 = (struct rdma_sq_atomic_wqe *)
 4743                                         ecore_chain_produce(&qp->sq.pbl);
 4744 
 4745                         TYPEPTR_ADDR_SET(awqe2, remote_va, \
 4746                                 atomic_wr(wr)->remote_addr);
 4747 
 4748                         awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
 4749 
 4750                         awqe3 = (struct rdma_sq_atomic_wqe *)
 4751                                         ecore_chain_produce(&qp->sq.pbl);
 4752 
 4753                         if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
 4754                                 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
 4755                                 TYPEPTR_ADDR_SET(awqe3, swap_data,
 4756                                                  atomic_wr(wr)->compare_add);
 4757                         } else {
 4758                                 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
 4759                                 TYPEPTR_ADDR_SET(awqe3, swap_data,
 4760                                                  atomic_wr(wr)->swap);
 4761                                 TYPEPTR_ADDR_SET(awqe3, cmp_data,
 4762                                                  atomic_wr(wr)->compare_add);
 4763                         }
 4764 
 4765                         qlnxr_prepare_sq_sges(dev, qp, NULL, wr);
 4766 
 4767                         qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->prev_wqe_size;
 4768                         qp->prev_wqe_size = awqe1->prev_wqe_size;
 4769 
 4770                         break;
 4771 
 4772                 case IB_WR_LOCAL_INV:
 4773 
 4774                         QL_DPRINT12(ha,
 4775                                 "INVALIDATE length (IB_WR_LOCAL_INV)\n");
 4776 
 4777                         iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
 4778                         iwqe->prev_wqe_size = 1;
 4779 
 4780                         iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
 4781                         iwqe->inv_l_key = wr->ex.invalidate_rkey;
 4782                         qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->prev_wqe_size;
 4783                         qp->prev_wqe_size = iwqe->prev_wqe_size;
 4784 
 4785                         break;
 4786 
 4787 #if __FreeBSD_version >= 1102000
 4788 
 4789                 case IB_WR_REG_MR:
 4790 
 4791                         QL_DPRINT12(ha, "IB_WR_REG_MR\n");
 4792 
 4793                         wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
 4794                         fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
 4795                         fwqe1->wqe_size = 2;
 4796 
 4797                         rc = qlnxr_prepare_reg(qp, fwqe1, reg_wr(wr));
 4798                         if (rc) {
 4799                                 QL_DPRINT11(ha, "IB_WR_REG_MR failed rc=%d\n", rc);
 4800                                 *bad_wr = wr;
 4801                                 break;
 4802                         }
 4803 
 4804                         qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
 4805                         qp->prev_wqe_size = fwqe1->wqe_size;
 4806 
 4807                         break;
 4808 #else
 4809                 case IB_WR_FAST_REG_MR:
 4810 
 4811                         QL_DPRINT12(ha, "FAST_MR (IB_WR_FAST_REG_MR)\n");
 4812 
 4813                         wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
 4814                         fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
 4815                         fwqe1->prev_wqe_size = 3;
 4816 
 4817                         rc = qlnxr_prepare_fmr(qp, fwqe1, wr);
 4818 
 4819                         if (rc) {
 4820                                 QL_DPRINT12(ha,
 4821                                         "FAST_MR (IB_WR_FAST_REG_MR) failed"
 4822                                         " rc = %d\n", rc);
 4823                                 *bad_wr = wr;
 4824                                 break;
 4825                         }
 4826 
 4827                         qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->prev_wqe_size;
 4828                         qp->prev_wqe_size = fwqe1->prev_wqe_size;
 4829 
 4830                         break;
 4831 #endif /* #if __FreeBSD_version >= 1102000 */
 4832 
 4833                 default:
 4834 
 4835                         QL_DPRINT12(ha, "Invalid Opcode 0x%x!\n", wr->opcode);
 4836 
 4837                         rc = -EINVAL;
 4838                         *bad_wr = wr;
 4839                         break;
 4840                 }
 4841 
 4842                 if (*bad_wr) {
 4843                         /*
 4844                          * restore prod to its position before this WR was processed
 4845                          */
 4846                         ecore_chain_set_prod(&qp->sq.pbl,
 4847                              le16_to_cpu(qp->sq.db_data.data.value),
 4848                              wqe);
 4849                         /* restore prev_wqe_size */
 4850                         qp->prev_wqe_size = wqe->prev_wqe_size;
 4851                         status = rc;
 4852 
 4853                         QL_DPRINT12(ha, "failed *bad_wr = %p\n", *bad_wr);
 4854                         break; /* out of the loop */
 4855                 }
 4856 
 4857                 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
 4858 
 4859                 qlnxr_inc_sw_prod(&qp->sq);
 4860 
 4861                 qp->sq.db_data.data.value++;
 4862 
 4863                 wr = wr->next;
 4864         }
 4865 
 4866         /* Trigger doorbell
 4867          * If there was a failure in the first WR then it will be triggered in
 4868          * vane. However this is not harmful (as long as the producer value is
 4869          * unchanged). For performance reasons we avoid checking for this
 4870          * redundant doorbell.
 4871          */
 4872         wmb();
 4873         //writel(qp->sq.db_data.raw, qp->sq.db);
 4874 
 4875         reg_addr = (uint32_t)((uint8_t *)qp->sq.db - (uint8_t *)ha->cdev.doorbells);
 4876         bus_write_4(ha->pci_dbells, reg_addr, qp->sq.db_data.raw);
 4877         bus_barrier(ha->pci_dbells,  0, 0, BUS_SPACE_BARRIER_READ);
 4878 
 4879         mmiowb();
 4880 
 4881         spin_unlock_irqrestore(&qp->q_lock, flags);
 4882 
 4883         QL_DPRINT12(ha, "exit[ibqp, wr, bad_wr] = [%p, %p, %p]\n",
 4884                 ibqp, wr, bad_wr);
 4885 
 4886         return status;
 4887 }
 4888 
 4889 static u32
 4890 qlnxr_srq_elem_left(struct qlnxr_srq_hwq_info *hw_srq)
 4891 {
 4892         u32 used;
 4893 
 4894         /* Calculate number of elements used based on producer
 4895          * count and consumer count and subtract it from max
 4896          * work request supported so that we get elements left.
 4897          */
 4898         used = hw_srq->wr_prod_cnt - hw_srq->wr_cons_cnt;
 4899 
 4900         return hw_srq->max_wr - used;
 4901 }
 4902 
 4903 int
 4904 qlnxr_post_recv(struct ib_qp *ibqp,
 4905         const struct ib_recv_wr *wr,
 4906         const struct ib_recv_wr **bad_wr)
 4907 {
 4908         struct qlnxr_qp         *qp = get_qlnxr_qp(ibqp);
 4909         struct qlnxr_dev        *dev = qp->dev;
 4910         unsigned long           flags;
 4911         int                     status = 0;
 4912         qlnx_host_t             *ha;
 4913         uint32_t                reg_addr;
 4914 
 4915         ha = dev->ha;
 4916 
 4917         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 4918                 return -EINVAL;
 4919 
 4920         QL_DPRINT12(ha, "enter\n");
 4921 
 4922         if (qp->qp_type == IB_QPT_GSI) {
 4923                 QL_DPRINT12(ha, "(qp->qp_type = IB_QPT_GSI)\n");
 4924                 return qlnxr_gsi_post_recv(ibqp, wr, bad_wr);
 4925         }
 4926 
 4927         if (qp->srq) {
 4928                 QL_DPRINT11(ha, "qp->srq [%p]"
 4929                         " QP is associated with SRQ, cannot post RQ buffers\n",
 4930                         qp->srq);
 4931                 return -EINVAL;
 4932         }
 4933 
 4934         spin_lock_irqsave(&qp->q_lock, flags);
 4935 
 4936         if (qp->state == ECORE_ROCE_QP_STATE_RESET) {
 4937                 spin_unlock_irqrestore(&qp->q_lock, flags);
 4938                 *bad_wr = wr;
 4939 
 4940                 QL_DPRINT11(ha, "qp->qp_type = ECORE_ROCE_QP_STATE_RESET\n");
 4941 
 4942                 return -EINVAL;
 4943         }
 4944 
 4945         while (wr) {
 4946                 int i;
 4947 
 4948                 if ((ecore_chain_get_elem_left_u32(&qp->rq.pbl) <
 4949                         QLNXR_MAX_RQE_ELEMENTS_PER_RQE) ||
 4950                         (wr->num_sge > qp->rq.max_sges)) {
 4951                         status = -ENOMEM;
 4952                         *bad_wr = wr;
 4953                         break;
 4954                 }
 4955                 for (i = 0; i < wr->num_sge; i++) {
 4956                         u32 flags = 0;
 4957                         struct rdma_rq_sge *rqe = ecore_chain_produce(&qp->rq.pbl);
 4958 
 4959                         /* first one must include the number of SGE in the list */
 4960                         if (!i)
 4961                                 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, wr->num_sge);
 4962 
 4963                         SET_FIELD(flags, RDMA_RQ_SGE_L_KEY, wr->sg_list[i].lkey);
 4964 
 4965                         RQ_SGE_SET(rqe, wr->sg_list[i].addr, \
 4966                                 wr->sg_list[i].length, flags);
 4967                 }
 4968                 /* Special case of no sges. FW requires between 1-4 sges...
 4969                  * in this case we need to post 1 sge with length zero. this is
 4970                  * because rdma write with immediate consumes an RQ. */
 4971                 if (!wr->num_sge) {
 4972                         u32 flags = 0;
 4973                         struct rdma_rq_sge *rqe = ecore_chain_produce(&qp->rq.pbl);
 4974 
 4975                         /* first one must include the number of SGE in the list */
 4976                         SET_FIELD(flags, RDMA_RQ_SGE_L_KEY, 0);
 4977                         SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
 4978 
 4979                         //RQ_SGE_SET(rqe, 0, 0, flags);
 4980                         rqe->addr.hi = 0;
 4981                         rqe->addr.lo = 0;
 4982 
 4983                         rqe->length = 0;
 4984                         rqe->flags = cpu_to_le32(flags);
 4985 
 4986                         i = 1;
 4987                 }
 4988 
 4989                 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
 4990                 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
 4991 
 4992                 qlnxr_inc_sw_prod(&qp->rq);
 4993 
 4994                 wmb();
 4995 
 4996                 qp->rq.db_data.data.value++;
 4997 
 4998         //      writel(qp->rq.db_data.raw, qp->rq.db);
 4999                 mmiowb();
 5000         //      if (QLNX_IS_IWARP(dev)) {
 5001         //              writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
 5002         //              mmiowb(); /* for second doorbell */
 5003         //      }
 5004 
 5005                 reg_addr = (uint32_t)((uint8_t *)qp->rq.db -
 5006                                 (uint8_t *)ha->cdev.doorbells);
 5007 
 5008                 bus_write_4(ha->pci_dbells, reg_addr, qp->rq.db_data.raw);
 5009                 bus_barrier(ha->pci_dbells,  0, 0, BUS_SPACE_BARRIER_READ);
 5010 
 5011                 if (QLNX_IS_IWARP(dev)) {
 5012                         reg_addr = (uint32_t)((uint8_t *)qp->rq.iwarp_db2 -
 5013                                                 (uint8_t *)ha->cdev.doorbells);
 5014                         bus_write_4(ha->pci_dbells, reg_addr, \
 5015                                 qp->rq.iwarp_db2_data.raw);
 5016                         bus_barrier(ha->pci_dbells,  0, 0, \
 5017                                 BUS_SPACE_BARRIER_READ);
 5018                 }
 5019 
 5020                 wr = wr->next;
 5021         }
 5022 
 5023         spin_unlock_irqrestore(&qp->q_lock, flags);
 5024 
 5025         QL_DPRINT12(ha, "exit status = 0x%x\n", status);
 5026 
 5027         return status;
 5028 }
 5029 
 5030 /* In fmr we need to increase the number of fmr completed counter for the fmr
 5031  * algorithm determining whether we can free a pbl or not.
 5032  * we need to perform this whether the work request was signaled or not. for
 5033  * this purpose we call this function from the condition that checks if a wr
 5034  * should be skipped, to make sure we don't miss it ( possibly this fmr
 5035  * operation was not signalted)
 5036  */
 5037 static inline void
 5038 qlnxr_chk_if_fmr(struct qlnxr_qp *qp)
 5039 {
 5040 #if __FreeBSD_version >= 1102000
 5041 
 5042         if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
 5043                 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
 5044 #else
 5045         if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_FAST_REG_MR)
 5046                 qp->wqe_wr_id[qp->sq.cons].frmr->info.completed++;
 5047 
 5048 #endif /* #if __FreeBSD_version >= 1102000 */
 5049 }
 5050 
 5051 static int
 5052 process_req(struct qlnxr_dev *dev,
 5053         struct qlnxr_qp *qp,
 5054         struct qlnxr_cq *cq,
 5055         int num_entries,
 5056         struct ib_wc *wc,
 5057         u16 hw_cons,
 5058         enum ib_wc_status status,
 5059         int force)
 5060 {
 5061         u16             cnt = 0;
 5062         qlnx_host_t     *ha = dev->ha;
 5063 
 5064         QL_DPRINT12(ha, "enter\n");
 5065 
 5066         while (num_entries && qp->sq.wqe_cons != hw_cons) {
 5067                 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
 5068                         qlnxr_chk_if_fmr(qp);
 5069                         /* skip WC */
 5070                         goto next_cqe;
 5071                 }
 5072 
 5073                 /* fill WC */
 5074                 wc->status = status;
 5075                 wc->vendor_err = 0;
 5076                 wc->wc_flags = 0;
 5077                 wc->src_qp = qp->id;
 5078                 wc->qp = &qp->ibqp;
 5079 
 5080                 // common section
 5081                 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
 5082                 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
 5083 
 5084                 switch (wc->opcode) {
 5085                 case IB_WC_RDMA_WRITE:
 5086 
 5087                         wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
 5088 
 5089                         QL_DPRINT12(ha,
 5090                                 "opcode = IB_WC_RDMA_WRITE bytes = %d\n",
 5091                                 qp->wqe_wr_id[qp->sq.cons].bytes_len);
 5092                         break;
 5093 
 5094                 case IB_WC_COMP_SWAP:
 5095                 case IB_WC_FETCH_ADD:
 5096                         wc->byte_len = 8;
 5097                         break;
 5098 
 5099 #if __FreeBSD_version >= 1102000
 5100                 case IB_WC_REG_MR:
 5101                         qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
 5102                         break;
 5103 #else
 5104                 case IB_WC_FAST_REG_MR:
 5105                         qp->wqe_wr_id[qp->sq.cons].frmr->info.completed++;
 5106                         break;
 5107 #endif /* #if __FreeBSD_version >= 1102000 */
 5108 
 5109                 case IB_WC_RDMA_READ:
 5110                 case IB_WC_SEND:
 5111 
 5112                         QL_DPRINT12(ha, "opcode = 0x%x \n", wc->opcode);
 5113                         break;
 5114                 default:
 5115                         ;//DP_ERR("TBD ERROR");
 5116                 }
 5117 
 5118                 num_entries--;
 5119                 wc++;
 5120                 cnt++;
 5121 next_cqe:
 5122                 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
 5123                         ecore_chain_consume(&qp->sq.pbl);
 5124                 qlnxr_inc_sw_cons(&qp->sq);
 5125         }
 5126 
 5127         QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
 5128         return cnt;
 5129 }
 5130 
 5131 static int
 5132 qlnxr_poll_cq_req(struct qlnxr_dev *dev,
 5133         struct qlnxr_qp *qp,
 5134         struct qlnxr_cq *cq,
 5135         int num_entries,
 5136         struct ib_wc *wc,
 5137         struct rdma_cqe_requester *req)
 5138 {
 5139         int             cnt = 0;
 5140         qlnx_host_t     *ha = dev->ha;
 5141 
 5142         QL_DPRINT12(ha, "enter req->status = 0x%x\n", req->status);
 5143 
 5144         switch (req->status) {
 5145         case RDMA_CQE_REQ_STS_OK:
 5146 
 5147                 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
 5148                         IB_WC_SUCCESS, 0);
 5149                 break;
 5150 
 5151         case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
 5152 
 5153                 if (qp->state != ECORE_ROCE_QP_STATE_ERR)
 5154                 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
 5155                                   IB_WC_WR_FLUSH_ERR, 1);
 5156                 break;
 5157 
 5158         default: /* other errors case */
 5159 
 5160                 /* process all WQE before the cosumer */
 5161                 qp->state = ECORE_ROCE_QP_STATE_ERR;
 5162                 cnt = process_req(dev, qp, cq, num_entries, wc,
 5163                                 req->sq_cons - 1, IB_WC_SUCCESS, 0);
 5164                 wc += cnt;
 5165                 /* if we have extra WC fill it with actual error info */
 5166 
 5167                 if (cnt < num_entries) {
 5168                         enum ib_wc_status wc_status;
 5169 
 5170                         switch (req->status) {
 5171                         case    RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
 5172                                 wc_status = IB_WC_BAD_RESP_ERR;
 5173                                 break;
 5174                         case    RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
 5175                                 wc_status = IB_WC_LOC_LEN_ERR;
 5176                                 break;
 5177                         case    RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
 5178                                 wc_status = IB_WC_LOC_QP_OP_ERR;
 5179                                 break;
 5180                         case    RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
 5181                                 wc_status = IB_WC_LOC_PROT_ERR;
 5182                                 break;
 5183                         case    RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
 5184                                 wc_status = IB_WC_MW_BIND_ERR;
 5185                                 break;
 5186                         case    RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
 5187                                 wc_status = IB_WC_REM_INV_REQ_ERR;
 5188                                 break;
 5189                         case    RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
 5190                                 wc_status = IB_WC_REM_ACCESS_ERR;
 5191                                 break;
 5192                         case    RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
 5193                                 wc_status = IB_WC_REM_OP_ERR;
 5194                                 break;
 5195                         case    RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
 5196                                 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
 5197                                 break;
 5198                         case    RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
 5199                                 wc_status = IB_WC_RETRY_EXC_ERR;
 5200                                 break;
 5201                         default:
 5202                                 wc_status = IB_WC_GENERAL_ERR;
 5203                         }
 5204 
 5205                         cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
 5206                                         wc_status, 1 /* force use of WC */);
 5207                 }
 5208         }
 5209 
 5210         QL_DPRINT12(ha, "exit cnt = %d\n", cnt);
 5211         return cnt;
 5212 }
 5213 
 5214 static void
 5215 __process_resp_one(struct qlnxr_dev *dev,
 5216         struct qlnxr_qp *qp,
 5217         struct qlnxr_cq *cq,
 5218         struct ib_wc *wc,
 5219         struct rdma_cqe_responder *resp,
 5220         u64 wr_id)
 5221 {
 5222         enum ib_wc_status       wc_status = IB_WC_SUCCESS;
 5223 #if __FreeBSD_version < 1102000
 5224         u8                      flags;
 5225 #endif
 5226         qlnx_host_t             *ha = dev->ha;
 5227 
 5228         QL_DPRINT12(ha, "enter qp = %p resp->status = 0x%x\n",
 5229                 qp, resp->status);
 5230 
 5231         wc->opcode = IB_WC_RECV;
 5232         wc->wc_flags = 0;
 5233 
 5234         switch (resp->status) {
 5235         case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
 5236                 wc_status = IB_WC_LOC_ACCESS_ERR;
 5237                 break;
 5238 
 5239         case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
 5240                 wc_status = IB_WC_LOC_LEN_ERR;
 5241                 break;
 5242 
 5243         case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
 5244                 wc_status = IB_WC_LOC_QP_OP_ERR;
 5245                 break;
 5246 
 5247         case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
 5248                 wc_status = IB_WC_LOC_PROT_ERR;
 5249                 break;
 5250 
 5251         case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
 5252                 wc_status = IB_WC_MW_BIND_ERR;
 5253                 break;
 5254 
 5255         case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
 5256                 wc_status = IB_WC_REM_INV_RD_REQ_ERR;
 5257                 break;
 5258 
 5259         case RDMA_CQE_RESP_STS_OK:
 5260 
 5261 #if __FreeBSD_version >= 1102000
 5262                 if (resp->flags & QLNXR_RESP_IMM) {
 5263                         wc->ex.imm_data =
 5264                                 le32_to_cpu(resp->imm_data_or_inv_r_Key);
 5265                         wc->wc_flags |= IB_WC_WITH_IMM;
 5266 
 5267                         if (resp->flags & QLNXR_RESP_RDMA)
 5268                                 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
 5269 
 5270                         if (resp->flags & QLNXR_RESP_INV) {
 5271                                 QL_DPRINT11(ha,
 5272                                         "Invalid flags QLNXR_RESP_INV [0x%x]"
 5273                                         "qp = %p qp->id = 0x%x cq = %p"
 5274                                         " cq->icid = 0x%x\n",
 5275                                         resp->flags, qp, qp->id, cq, cq->icid );
 5276                         }
 5277                 } else if (resp->flags & QLNXR_RESP_INV) {
 5278                         wc->ex.imm_data =
 5279                                 le32_to_cpu(resp->imm_data_or_inv_r_Key);
 5280                         wc->wc_flags |= IB_WC_WITH_INVALIDATE;
 5281 
 5282                         if (resp->flags & QLNXR_RESP_RDMA) {
 5283                                 QL_DPRINT11(ha,
 5284                                         "Invalid flags QLNXR_RESP_RDMA [0x%x]"
 5285                                         "qp = %p qp->id = 0x%x cq = %p"
 5286                                         " cq->icid = 0x%x\n",
 5287                                         resp->flags, qp, qp->id, cq, cq->icid );
 5288                         }
 5289                 } else if (resp->flags & QLNXR_RESP_RDMA) {
 5290                         QL_DPRINT11(ha, "Invalid flags QLNXR_RESP_RDMA [0x%x]"
 5291                                 "qp = %p qp->id = 0x%x cq = %p cq->icid = 0x%x\n",
 5292                                 resp->flags, qp, qp->id, cq, cq->icid );
 5293                 }
 5294 #else
 5295                 wc_status = IB_WC_SUCCESS;
 5296                 wc->byte_len = le32_to_cpu(resp->length);
 5297 
 5298                 flags = resp->flags & QLNXR_RESP_RDMA_IMM;
 5299 
 5300                 switch (flags) {
 5301                 case QLNXR_RESP_RDMA_IMM:
 5302                         /* update opcode */
 5303                         wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
 5304                         /* fall to set imm data */
 5305                 case QLNXR_RESP_IMM:
 5306                         wc->ex.imm_data =
 5307                                 le32_to_cpu(resp->imm_data_or_inv_r_Key);
 5308                         wc->wc_flags |= IB_WC_WITH_IMM;
 5309                         break;
 5310                 case QLNXR_RESP_RDMA:
 5311                         QL_DPRINT11(ha, "Invalid flags QLNXR_RESP_RDMA [0x%x]"
 5312                                 "qp = %p qp->id = 0x%x cq = %p cq->icid = 0x%x\n",
 5313                                 resp->flags, qp, qp->id, cq, cq->icid );
 5314                         break;
 5315                 default:
 5316                         /* valid configuration, but nothing todo here */
 5317                         ;
 5318                 }
 5319 #endif /* #if __FreeBSD_version >= 1102000 */
 5320 
 5321                 break;
 5322         default:
 5323                 wc_status = IB_WC_GENERAL_ERR;
 5324         }
 5325 
 5326         /* fill WC */
 5327         wc->status = wc_status;
 5328         wc->vendor_err = 0;
 5329         wc->src_qp = qp->id;
 5330         wc->qp = &qp->ibqp;
 5331         wc->wr_id = wr_id;
 5332 
 5333         QL_DPRINT12(ha, "exit status = 0x%x\n", wc_status);
 5334 
 5335         return;
 5336 }
 5337 
 5338 static int
 5339 process_resp_one_srq(struct qlnxr_dev *dev,
 5340         struct qlnxr_qp *qp,
 5341         struct qlnxr_cq *cq,
 5342         struct ib_wc *wc,
 5343         struct rdma_cqe_responder *resp)
 5344 {
 5345         struct qlnxr_srq        *srq = qp->srq;
 5346         u64                     wr_id;
 5347         qlnx_host_t             *ha = dev->ha;
 5348 
 5349         QL_DPRINT12(ha, "enter\n");
 5350 
 5351         wr_id = HILO_U64(resp->srq_wr_id.hi, resp->srq_wr_id.lo);
 5352 
 5353         if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
 5354                 wc->status = IB_WC_WR_FLUSH_ERR;
 5355                 wc->vendor_err = 0;
 5356                 wc->wr_id = wr_id;
 5357                 wc->byte_len = 0;
 5358                 wc->src_qp = qp->id;
 5359                 wc->qp = &qp->ibqp;
 5360                 wc->wr_id = wr_id;
 5361         } else {
 5362                 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
 5363         }
 5364 
 5365         /* PBL is maintained in case of WR granularity.
 5366          * So increment WR consumer after consuming WR
 5367          */
 5368         srq->hw_srq.wr_cons_cnt++;
 5369 
 5370         QL_DPRINT12(ha, "exit\n");
 5371         return 1;
 5372 }
 5373 
 5374 static int
 5375 process_resp_one(struct qlnxr_dev *dev,
 5376         struct qlnxr_qp *qp,
 5377         struct qlnxr_cq *cq,
 5378         struct ib_wc *wc,
 5379         struct rdma_cqe_responder *resp)
 5380 {
 5381         qlnx_host_t     *ha = dev->ha;
 5382         u64             wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
 5383 
 5384         QL_DPRINT12(ha, "enter\n");
 5385 
 5386         __process_resp_one(dev, qp, cq, wc, resp, wr_id);
 5387 
 5388         while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
 5389                 ecore_chain_consume(&qp->rq.pbl);
 5390         qlnxr_inc_sw_cons(&qp->rq);
 5391 
 5392         QL_DPRINT12(ha, "exit\n");
 5393         return 1;
 5394 }
 5395 
 5396 static int
 5397 process_resp_flush(struct qlnxr_qp *qp,
 5398         int num_entries,
 5399         struct ib_wc *wc,
 5400         u16 hw_cons)
 5401 {
 5402         u16             cnt = 0;
 5403         qlnx_host_t     *ha = qp->dev->ha;
 5404 
 5405         QL_DPRINT12(ha, "enter\n");
 5406 
 5407         while (num_entries && qp->rq.wqe_cons != hw_cons) {
 5408                 /* fill WC */
 5409                 wc->status = IB_WC_WR_FLUSH_ERR;
 5410                 wc->vendor_err = 0;
 5411                 wc->wc_flags = 0;
 5412                 wc->src_qp = qp->id;
 5413                 wc->byte_len = 0;
 5414                 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
 5415                 wc->qp = &qp->ibqp;
 5416                 num_entries--;
 5417                 wc++;
 5418                 cnt++;
 5419                 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
 5420                         ecore_chain_consume(&qp->rq.pbl);
 5421                 qlnxr_inc_sw_cons(&qp->rq);
 5422         }
 5423 
 5424         QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
 5425         return cnt;
 5426 }
 5427 
 5428 static void
 5429 try_consume_resp_cqe(struct qlnxr_cq *cq,
 5430         struct qlnxr_qp *qp,
 5431         struct rdma_cqe_responder *resp,
 5432         int *update)
 5433 {
 5434         if (le16_to_cpu(resp->rq_cons) == qp->rq.wqe_cons) {
 5435                 consume_cqe(cq);
 5436                 *update |= 1;
 5437         }
 5438 }
 5439 
 5440 static int
 5441 qlnxr_poll_cq_resp_srq(struct qlnxr_dev *dev,
 5442         struct qlnxr_qp *qp,
 5443         struct qlnxr_cq *cq,
 5444         int num_entries,
 5445         struct ib_wc *wc,
 5446         struct rdma_cqe_responder *resp,
 5447         int *update)
 5448 {
 5449         int             cnt;
 5450         qlnx_host_t     *ha = dev->ha;
 5451 
 5452         QL_DPRINT12(ha, "enter\n");
 5453 
 5454         cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
 5455         consume_cqe(cq);
 5456         *update |= 1;
 5457 
 5458         QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
 5459         return cnt;
 5460 }
 5461 
 5462 static int
 5463 qlnxr_poll_cq_resp(struct qlnxr_dev *dev,
 5464         struct qlnxr_qp *qp,
 5465         struct qlnxr_cq *cq,
 5466         int num_entries,
 5467         struct ib_wc *wc,
 5468         struct rdma_cqe_responder *resp,
 5469         int *update)
 5470 {
 5471         int             cnt;
 5472         qlnx_host_t     *ha = dev->ha;
 5473 
 5474         QL_DPRINT12(ha, "enter\n");
 5475 
 5476         if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
 5477                 cnt = process_resp_flush(qp, num_entries, wc,
 5478                                 resp->rq_cons);
 5479                 try_consume_resp_cqe(cq, qp, resp, update);
 5480         } else {
 5481                 cnt = process_resp_one(dev, qp, cq, wc, resp);
 5482                 consume_cqe(cq);
 5483                 *update |= 1;
 5484         }
 5485 
 5486         QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
 5487         return cnt;
 5488 }
 5489 
 5490 static void
 5491 try_consume_req_cqe(struct qlnxr_cq *cq, struct qlnxr_qp *qp,
 5492         struct rdma_cqe_requester *req, int *update)
 5493 {
 5494         if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
 5495                 consume_cqe(cq);
 5496                 *update |= 1;
 5497         }
 5498 }
 5499 
 5500 static void
 5501 doorbell_cq(struct qlnxr_dev *dev, struct qlnxr_cq *cq, u32 cons, u8 flags)
 5502 {
 5503         uint64_t        reg_addr;
 5504         qlnx_host_t     *ha = dev->ha;
 5505 
 5506         QL_DPRINT12(ha, "enter\n");
 5507 
 5508         wmb();
 5509         cq->db.data.agg_flags = flags;
 5510         cq->db.data.value = cpu_to_le32(cons);
 5511 
 5512         reg_addr = (uint64_t)((uint8_t *)cq->db_addr -
 5513                                 (uint8_t *)(ha->cdev.doorbells));
 5514 
 5515         bus_write_8(ha->pci_dbells, reg_addr, cq->db.raw);
 5516         bus_barrier(ha->pci_dbells,  0, 0, BUS_SPACE_BARRIER_READ);
 5517 
 5518         QL_DPRINT12(ha, "exit\n");
 5519         return;
 5520 
 5521 //#ifdef __LP64__
 5522 //      writeq(cq->db.raw, cq->db_addr);
 5523 //#else
 5524         /* Note that since the FW allows 64 bit write only, in 32bit systems
 5525          * the value of db_addr must be low enough. This is currently not
 5526          * enforced.
 5527          */
 5528 //      writel(cq->db.raw & 0xffffffff, cq->db_addr);
 5529 //      mmiowb();
 5530 //#endif
 5531 }
 5532 
 5533 static int
 5534 is_valid_cqe(struct qlnxr_cq *cq, union rdma_cqe *cqe)
 5535 {
 5536         struct rdma_cqe_requester *resp_cqe = &cqe->req;
 5537         return (resp_cqe->flags & RDMA_RESIZE_CQ_RAMROD_DATA_TOGGLE_BIT_MASK) ==
 5538                         cq->pbl_toggle;
 5539 }
 5540 
 5541 int
 5542 qlnxr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
 5543 {
 5544         struct qlnxr_cq *cq = get_qlnxr_cq(ibcq);
 5545         struct qlnxr_dev *dev = get_qlnxr_dev((ibcq->device));
 5546         int             done = 0;
 5547         union rdma_cqe  *cqe = cq->latest_cqe;
 5548         int             update = 0;
 5549         u32             old_cons, new_cons;
 5550         unsigned long   flags;
 5551         qlnx_host_t     *ha = dev->ha;
 5552 
 5553         QL_DPRINT12(ha, "enter\n");
 5554 
 5555         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 5556                 return -EINVAL;
 5557 
 5558         if (cq->destroyed) {
 5559                 QL_DPRINT11(ha, "called after destroy for cq %p (icid=%d)\n",
 5560                         cq, cq->icid);
 5561                 return 0;
 5562         }
 5563 
 5564         if (cq->cq_type == QLNXR_CQ_TYPE_GSI)
 5565                 return qlnxr_gsi_poll_cq(ibcq, num_entries, wc);
 5566 
 5567         spin_lock_irqsave(&cq->cq_lock, flags);
 5568 
 5569         old_cons = ecore_chain_get_cons_idx_u32(&cq->pbl);
 5570 
 5571         while (num_entries && is_valid_cqe(cq, cqe)) {
 5572                 int cnt = 0;
 5573                 struct qlnxr_qp *qp;
 5574                 struct rdma_cqe_requester *resp_cqe;
 5575                 enum rdma_cqe_type cqe_type;
 5576 
 5577                 /* prevent speculative reads of any field of CQE */
 5578                 rmb();
 5579 
 5580                 resp_cqe = &cqe->req;
 5581                 qp = (struct qlnxr_qp *)(uintptr_t)HILO_U64(resp_cqe->qp_handle.hi,
 5582                                                 resp_cqe->qp_handle.lo);
 5583 
 5584                 if (!qp) {
 5585                         QL_DPRINT11(ha, "qp = NULL\n");
 5586                         break;
 5587                 }
 5588 
 5589                 wc->qp = &qp->ibqp;
 5590 
 5591                 cqe_type = GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
 5592 
 5593                 switch (cqe_type) {
 5594                 case RDMA_CQE_TYPE_REQUESTER:
 5595                         cnt = qlnxr_poll_cq_req(dev, qp, cq, num_entries,
 5596                                         wc, &cqe->req);
 5597                         try_consume_req_cqe(cq, qp, &cqe->req, &update);
 5598                         break;
 5599                 case RDMA_CQE_TYPE_RESPONDER_RQ:
 5600                         cnt = qlnxr_poll_cq_resp(dev, qp, cq, num_entries,
 5601                                         wc, &cqe->resp, &update);
 5602                         break;
 5603                 case RDMA_CQE_TYPE_RESPONDER_SRQ:
 5604                         cnt = qlnxr_poll_cq_resp_srq(dev, qp, cq, num_entries,
 5605                                         wc, &cqe->resp, &update);
 5606                         break;
 5607                 case RDMA_CQE_TYPE_INVALID:
 5608                 default:
 5609                         QL_DPRINT11(ha, "cqe type [0x%x] invalid\n", cqe_type);
 5610                         break;
 5611                 }
 5612                 num_entries -= cnt;
 5613                 wc += cnt;
 5614                 done += cnt;
 5615 
 5616                 cqe = cq->latest_cqe;
 5617         }
 5618         new_cons = ecore_chain_get_cons_idx_u32(&cq->pbl);
 5619 
 5620         cq->cq_cons += new_cons - old_cons;
 5621 
 5622         if (update) {
 5623                 /* doorbell notifies abount latest VALID entry,
 5624                  * but chain already point to the next INVALID one
 5625                  */
 5626                 doorbell_cq(dev, cq, cq->cq_cons - 1, cq->arm_flags);
 5627                 QL_DPRINT12(ha, "cq = %p cons = 0x%x "
 5628                         "arm_flags = 0x%x db.icid = 0x%x\n", cq,
 5629                         (cq->cq_cons - 1), cq->arm_flags, cq->db.data.icid);
 5630         }
 5631 
 5632         spin_unlock_irqrestore(&cq->cq_lock, flags);
 5633 
 5634         QL_DPRINT12(ha, "exit\n");
 5635 
 5636         return done;
 5637 }
 5638 
 5639 int
 5640 qlnxr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
 5641 {
 5642         struct qlnxr_cq *cq = get_qlnxr_cq(ibcq);
 5643         unsigned long sflags;
 5644         struct qlnxr_dev *dev;
 5645         qlnx_host_t     *ha;
 5646 
 5647         dev = get_qlnxr_dev((ibcq->device));
 5648         ha = dev->ha;
 5649 
 5650         QL_DPRINT12(ha, "enter ibcq = %p flags = 0x%x "
 5651                 "cp = %p cons = 0x%x cq_type = 0x%x\n", ibcq,
 5652                 flags, cq, cq->cq_cons, cq->cq_type);
 5653 
 5654         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 5655                 return -EINVAL;
 5656 
 5657         if (cq->destroyed) {
 5658                 QL_DPRINT11(ha, "cq was already destroyed cq = %p icid=%d\n",
 5659                         cq, cq->icid);
 5660                 return -EINVAL;
 5661         }
 5662 
 5663         if (cq->cq_type == QLNXR_CQ_TYPE_GSI) {
 5664                 return 0;
 5665         }
 5666 
 5667         spin_lock_irqsave(&cq->cq_lock, sflags);
 5668 
 5669         cq->arm_flags = 0;
 5670 
 5671         if (flags & IB_CQ_SOLICITED) {
 5672                 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
 5673         }
 5674         if (flags & IB_CQ_NEXT_COMP) {
 5675                 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
 5676         }
 5677 
 5678         doorbell_cq(dev, cq, (cq->cq_cons - 1), cq->arm_flags);
 5679 
 5680         spin_unlock_irqrestore(&cq->cq_lock, sflags);
 5681 
 5682         QL_DPRINT12(ha, "exit ibcq = %p flags = 0x%x\n", ibcq, flags);
 5683         return 0;
 5684 }
 5685 
 5686 static struct qlnxr_mr *
 5687 __qlnxr_alloc_mr(struct ib_pd *ibpd, int max_page_list_len)
 5688 {
 5689         struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
 5690         struct qlnxr_dev *dev = get_qlnxr_dev((ibpd->device));
 5691         struct qlnxr_mr *mr;
 5692         int             rc = -ENOMEM;
 5693         qlnx_host_t     *ha;
 5694 
 5695         ha = dev->ha;
 5696 
 5697         QL_DPRINT12(ha, "enter ibpd = %p pd = %p "
 5698                 " pd_id = %d max_page_list_len = %d\n",
 5699                 ibpd, pd, pd->pd_id, max_page_list_len);
 5700 
 5701         mr = kzalloc(sizeof(*mr), GFP_KERNEL);
 5702         if (!mr) {
 5703                 QL_DPRINT11(ha, "kzalloc(mr) failed\n");
 5704                 return ERR_PTR(rc);
 5705         }
 5706 
 5707         mr->dev = dev;
 5708         mr->type = QLNXR_MR_FRMR;
 5709 
 5710         rc = qlnxr_init_mr_info(dev, &mr->info, max_page_list_len,
 5711                                   1 /* allow dual layer pbl */);
 5712         if (rc) {
 5713                 QL_DPRINT11(ha, "qlnxr_init_mr_info failed\n");
 5714                 goto err0;
 5715         }
 5716 
 5717         rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
 5718         if (rc) {
 5719                 QL_DPRINT11(ha, "ecore_rdma_alloc_tid failed\n");
 5720                 goto err0;
 5721         }
 5722 
 5723         /* index only, 18 bit long, lkey = itid << 8 | key */
 5724         mr->hw_mr.tid_type = ECORE_RDMA_TID_FMR;
 5725         mr->hw_mr.key = 0;
 5726         mr->hw_mr.pd = pd->pd_id;
 5727         mr->hw_mr.local_read = 1;
 5728         mr->hw_mr.local_write = 0;
 5729         mr->hw_mr.remote_read = 0;
 5730         mr->hw_mr.remote_write = 0;
 5731         mr->hw_mr.remote_atomic = 0;
 5732         mr->hw_mr.mw_bind = false; /* TBD MW BIND */
 5733         mr->hw_mr.pbl_ptr = 0; /* Will be supplied during post */
 5734         mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
 5735         mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
 5736         mr->hw_mr.fbo = 0;
 5737         mr->hw_mr.length = 0;
 5738         mr->hw_mr.vaddr = 0;
 5739         mr->hw_mr.zbva = false; /* TBD figure when this should be true */
 5740         mr->hw_mr.phy_mr = true; /* Fast MR - True, Regular Register False */
 5741         mr->hw_mr.dma_mr = false;
 5742 
 5743         rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
 5744         if (rc) {
 5745                 QL_DPRINT11(ha, "ecore_rdma_register_tid failed\n");
 5746                 goto err1;
 5747         }
 5748 
 5749         mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
 5750         mr->ibmr.rkey = mr->ibmr.lkey;
 5751 
 5752         QL_DPRINT12(ha, "exit mr = %p mr->ibmr.lkey = 0x%x\n",
 5753                 mr, mr->ibmr.lkey);
 5754 
 5755         return mr;
 5756 
 5757 err1:
 5758         ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
 5759 err0:
 5760         kfree(mr);
 5761 
 5762         QL_DPRINT12(ha, "exit\n");
 5763 
 5764         return ERR_PTR(rc);
 5765 }
 5766 
 5767 #if __FreeBSD_version >= 1102000
 5768 
 5769 struct ib_mr *
 5770 qlnxr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type,
 5771     u32 max_num_sg, struct ib_udata *udata)
 5772 {
 5773         struct qlnxr_dev *dev;
 5774         struct qlnxr_mr *mr;
 5775         qlnx_host_t     *ha;
 5776 
 5777         dev = get_qlnxr_dev(ibpd->device);
 5778         ha = dev->ha;
 5779 
 5780         QL_DPRINT12(ha, "enter\n");
 5781 
 5782         if (mr_type != IB_MR_TYPE_MEM_REG)
 5783                 return ERR_PTR(-EINVAL);
 5784 
 5785         mr = __qlnxr_alloc_mr(ibpd, max_num_sg);
 5786 
 5787         if (IS_ERR(mr))
 5788                 return ERR_PTR(-EINVAL);
 5789 
 5790         QL_DPRINT12(ha, "exit mr = %p &mr->ibmr = %p\n", mr, &mr->ibmr);
 5791 
 5792         return &mr->ibmr;
 5793 }
 5794 
 5795 static int
 5796 qlnxr_set_page(struct ib_mr *ibmr, u64 addr)
 5797 {
 5798         struct qlnxr_mr *mr = get_qlnxr_mr(ibmr);
 5799         struct qlnxr_pbl *pbl_table;
 5800         struct regpair *pbe;
 5801         struct qlnxr_dev *dev;
 5802         qlnx_host_t     *ha;
 5803         u32 pbes_in_page;
 5804 
 5805         dev = mr->dev;
 5806         ha = dev->ha;
 5807 
 5808         if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
 5809                 QL_DPRINT12(ha, "fails mr->npages %d\n", mr->npages);
 5810                 return -ENOMEM;
 5811         }
 5812 
 5813         QL_DPRINT12(ha, "mr->npages %d addr = %p enter\n", mr->npages,
 5814                 ((void *)addr));
 5815 
 5816         pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
 5817         pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
 5818         pbe = (struct regpair *)pbl_table->va;
 5819         pbe +=  mr->npages % pbes_in_page;
 5820         pbe->lo = cpu_to_le32((u32)addr);
 5821         pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
 5822 
 5823         mr->npages++;
 5824 
 5825         QL_DPRINT12(ha, "mr->npages %d addr = %p exit \n", mr->npages,
 5826                 ((void *)addr));
 5827         return 0;
 5828 }
 5829 
 5830 int
 5831 qlnxr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
 5832         int sg_nents, unsigned int *sg_offset)
 5833 {
 5834         int             ret;
 5835         struct qlnxr_mr *mr = get_qlnxr_mr(ibmr);
 5836         qlnx_host_t     *ha;
 5837 
 5838         if (mr == NULL)
 5839                 return (-1);
 5840 
 5841         if (mr->dev == NULL)
 5842                 return (-1);
 5843 
 5844         ha = mr->dev->ha;
 5845 
 5846         QL_DPRINT12(ha, "enter\n");
 5847 
 5848         mr->npages = 0;
 5849         qlnx_handle_completed_mrs(mr->dev, &mr->info);
 5850 
 5851         ret = ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qlnxr_set_page);
 5852 
 5853         QL_DPRINT12(ha, "exit ret = %d\n", ret);
 5854 
 5855         return (ret);
 5856 }
 5857 
 5858 #else
 5859 
 5860 struct ib_mr *
 5861 qlnxr_alloc_frmr(struct ib_pd *ibpd, int max_page_list_len)
 5862 {
 5863         struct qlnxr_dev *dev;
 5864         struct qlnxr_mr *mr;
 5865         qlnx_host_t     *ha;
 5866         struct ib_mr *ibmr = NULL;
 5867 
 5868         dev = get_qlnxr_dev((ibpd->device));
 5869         ha = dev->ha;
 5870 
 5871         QL_DPRINT12(ha, "enter\n");
 5872 
 5873         mr = __qlnxr_alloc_mr(ibpd, max_page_list_len);
 5874 
 5875         if (IS_ERR(mr)) {
 5876                 ibmr = ERR_PTR(-EINVAL);
 5877         } else {
 5878                 ibmr = &mr->ibmr;
 5879         }
 5880 
 5881         QL_DPRINT12(ha, "exit %p\n", ibmr);
 5882         return (ibmr);
 5883 }
 5884 
 5885 void
 5886 qlnxr_free_frmr_page_list(struct ib_fast_reg_page_list *page_list)
 5887 {
 5888         struct qlnxr_fast_reg_page_list *frmr_list;
 5889 
 5890         frmr_list = get_qlnxr_frmr_list(page_list);
 5891 
 5892         free_mr_info(frmr_list->dev, &frmr_list->info);
 5893 
 5894         kfree(frmr_list->ibfrpl.page_list);
 5895         kfree(frmr_list);
 5896 
 5897         return;
 5898 }
 5899 
 5900 struct ib_fast_reg_page_list *
 5901 qlnxr_alloc_frmr_page_list(struct ib_device *ibdev, int page_list_len)
 5902 {
 5903         struct qlnxr_fast_reg_page_list *frmr_list = NULL;
 5904         struct qlnxr_dev                *dev;
 5905         int                             size = page_list_len * sizeof(u64);
 5906         int                             rc = -ENOMEM;
 5907         qlnx_host_t                     *ha;
 5908 
 5909         dev = get_qlnxr_dev(ibdev);
 5910         ha = dev->ha;
 5911 
 5912         QL_DPRINT12(ha, "enter\n");
 5913 
 5914         frmr_list = kzalloc(sizeof(*frmr_list), GFP_KERNEL);
 5915         if (!frmr_list) {
 5916                 QL_DPRINT11(ha, "kzalloc(frmr_list) failed\n");
 5917                 goto err;
 5918         }
 5919 
 5920         frmr_list->dev = dev;
 5921         frmr_list->ibfrpl.page_list = kzalloc(size, GFP_KERNEL);
 5922         if (!frmr_list->ibfrpl.page_list) {
 5923                 QL_DPRINT11(ha, "frmr_list->ibfrpl.page_list = NULL failed\n");
 5924                 goto err0;
 5925         }
 5926 
 5927         rc = qlnxr_init_mr_info(dev, &frmr_list->info, page_list_len,
 5928                           1 /* allow dual layer pbl */);
 5929         if (rc)
 5930                 goto err1;
 5931 
 5932         QL_DPRINT12(ha, "exit %p\n", &frmr_list->ibfrpl);
 5933 
 5934         return &frmr_list->ibfrpl;
 5935 
 5936 err1:
 5937         kfree(frmr_list->ibfrpl.page_list);
 5938 err0:
 5939         kfree(frmr_list);
 5940 err:
 5941         QL_DPRINT12(ha, "exit with error\n");
 5942 
 5943         return ERR_PTR(rc);
 5944 }
 5945 
 5946 static int
 5947 qlnxr_validate_phys_buf_list(qlnx_host_t *ha, struct ib_phys_buf *buf_list,
 5948         int buf_cnt, uint64_t *total_size)
 5949 {
 5950         u64 size = 0;
 5951 
 5952         *total_size = 0;
 5953 
 5954         if (!buf_cnt || buf_list == NULL) {
 5955                 QL_DPRINT11(ha,
 5956                         "failed buf_list = %p buf_cnt = %d\n", buf_list, buf_cnt);
 5957                 return (-1);
 5958         }
 5959 
 5960         size = buf_list->size;
 5961 
 5962         if (!size) {
 5963                 QL_DPRINT11(ha,
 5964                         "failed buf_list = %p buf_cnt = %d"
 5965                         " buf_list->size = 0\n", buf_list, buf_cnt);
 5966                 return (-1);
 5967         }
 5968 
 5969         while (buf_cnt) {
 5970                 *total_size += buf_list->size;
 5971 
 5972                 if (buf_list->size != size) {
 5973                         QL_DPRINT11(ha,
 5974                                 "failed buf_list = %p buf_cnt = %d"
 5975                                 " all buffers should have same size\n",
 5976                                 buf_list, buf_cnt);
 5977                         return (-1);
 5978                 }
 5979 
 5980                 buf_list++;
 5981                 buf_cnt--;
 5982         }
 5983         return (0);
 5984 }
 5985 
 5986 static size_t
 5987 qlnxr_get_num_pages(qlnx_host_t *ha, struct ib_phys_buf *buf_list,
 5988         int buf_cnt)
 5989 {
 5990         int     i;
 5991         size_t  num_pages = 0;
 5992         u64     size;
 5993 
 5994         for (i = 0; i < buf_cnt; i++) {
 5995                 size = 0;
 5996                 while (size < buf_list->size) {
 5997                         size += PAGE_SIZE;
 5998                         num_pages++;
 5999                 }
 6000                 buf_list++;
 6001         }
 6002         return (num_pages);
 6003 }
 6004 
 6005 static void
 6006 qlnxr_populate_phys_mem_pbls(struct qlnxr_dev *dev,
 6007         struct ib_phys_buf *buf_list, int buf_cnt,
 6008         struct qlnxr_pbl *pbl, struct qlnxr_pbl_info *pbl_info)
 6009 {
 6010         struct regpair          *pbe;
 6011         struct qlnxr_pbl        *pbl_tbl;
 6012         int                     pg_cnt, pages, pbe_cnt, total_num_pbes = 0;
 6013         qlnx_host_t             *ha;
 6014         int                     i;
 6015         u64                     pbe_addr;
 6016 
 6017         ha = dev->ha;
 6018 
 6019         QL_DPRINT12(ha, "enter\n");
 6020 
 6021         if (!pbl_info) {
 6022                 QL_DPRINT11(ha, "PBL_INFO not initialized\n");
 6023                 return;
 6024         }
 6025 
 6026         if (!pbl_info->num_pbes) {
 6027                 QL_DPRINT11(ha, "pbl_info->num_pbes == 0\n");
 6028                 return;
 6029         }
 6030 
 6031         /* If we have a two layered pbl, the first pbl points to the rest
 6032          * of the pbls and the first entry lays on the second pbl in the table
 6033          */
 6034         if (pbl_info->two_layered)
 6035                 pbl_tbl = &pbl[1];
 6036         else
 6037                 pbl_tbl = pbl;
 6038 
 6039         pbe = (struct regpair *)pbl_tbl->va;
 6040         if (!pbe) {
 6041                 QL_DPRINT12(ha, "pbe is NULL\n");
 6042                 return;
 6043         }
 6044 
 6045         pbe_cnt = 0;
 6046 
 6047         for (i = 0; i < buf_cnt; i++) {
 6048                 pages = buf_list->size >> PAGE_SHIFT;
 6049 
 6050                 for (pg_cnt = 0; pg_cnt < pages; pg_cnt++) {
 6051                         /* store the page address in pbe */
 6052 
 6053                         pbe_addr = buf_list->addr + (PAGE_SIZE * pg_cnt);
 6054 
 6055                         pbe->lo = cpu_to_le32((u32)pbe_addr);
 6056                         pbe->hi = cpu_to_le32(((u32)(pbe_addr >> 32)));
 6057 
 6058                         QL_DPRINT12(ha, "Populate pbl table:"
 6059                                 " pbe->addr=0x%x:0x%x "
 6060                                 " pbe_cnt = %d total_num_pbes=%d"
 6061                                 " pbe=%p\n", pbe->lo, pbe->hi, pbe_cnt,
 6062                                 total_num_pbes, pbe);
 6063 
 6064                         pbe_cnt ++;
 6065                         total_num_pbes ++;
 6066                         pbe++;
 6067 
 6068                         if (total_num_pbes == pbl_info->num_pbes)
 6069                                 return;
 6070 
 6071                         /* if the given pbl is full storing the pbes,
 6072                          * move to next pbl.  */
 6073 
 6074                         if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
 6075                                 pbl_tbl++;
 6076                                 pbe = (struct regpair *)pbl_tbl->va;
 6077                                 pbe_cnt = 0;
 6078                         }
 6079                 }
 6080                 buf_list++;
 6081         }
 6082         QL_DPRINT12(ha, "exit\n");
 6083         return;
 6084 }
 6085 
 6086 struct ib_mr *
 6087 qlnxr_reg_kernel_mr(struct ib_pd *ibpd,
 6088         struct ib_phys_buf *buf_list,
 6089         int buf_cnt, int acc, u64 *iova_start)
 6090 {
 6091         int             rc = -ENOMEM;
 6092         struct qlnxr_dev *dev = get_qlnxr_dev((ibpd->device));
 6093         struct qlnxr_mr *mr;
 6094         struct qlnxr_pd *pd;
 6095         qlnx_host_t     *ha;
 6096         size_t          num_pages = 0;
 6097         uint64_t        length;
 6098 
 6099         ha = dev->ha;
 6100 
 6101         QL_DPRINT12(ha, "enter\n");
 6102 
 6103         pd = get_qlnxr_pd(ibpd);
 6104 
 6105         QL_DPRINT12(ha, "pd = %d buf_list = %p, buf_cnt = %d,"
 6106                 " iova_start = %p, acc = %d\n",
 6107                 pd->pd_id, buf_list, buf_cnt, iova_start, acc);
 6108 
 6109         //if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE)) {
 6110         //      QL_DPRINT11(ha, "(acc & IB_ACCESS_REMOTE_WRITE &&"
 6111         //              " !(acc & IB_ACCESS_LOCAL_WRITE))\n");
 6112         //      return ERR_PTR(-EINVAL);
 6113         //}
 6114 
 6115         mr = kzalloc(sizeof(*mr), GFP_KERNEL);
 6116         if (!mr) {
 6117                 QL_DPRINT11(ha, "kzalloc(mr) failed\n");
 6118                 return ERR_PTR(rc);
 6119         }
 6120 
 6121         mr->type = QLNXR_MR_KERNEL;
 6122         mr->iova_start = iova_start;
 6123 
 6124         rc = qlnxr_validate_phys_buf_list(ha, buf_list, buf_cnt, &length);
 6125         if (rc)
 6126                 goto err0;
 6127 
 6128         num_pages = qlnxr_get_num_pages(ha, buf_list, buf_cnt);
 6129         if (!num_pages)
 6130                 goto err0;
 6131 
 6132         rc = qlnxr_init_mr_info(dev, &mr->info, num_pages, 1);
 6133         if (rc) {
 6134                 QL_DPRINT11(ha,
 6135                         "qlnxr_init_mr_info failed [%d]\n", rc);
 6136                 goto err1;
 6137         }
 6138 
 6139         qlnxr_populate_phys_mem_pbls(dev, buf_list, buf_cnt, mr->info.pbl_table,
 6140                    &mr->info.pbl_info);
 6141 
 6142         rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
 6143 
 6144         if (rc) {
 6145                 QL_DPRINT11(ha, "roce alloc tid returned an error %d\n", rc);
 6146                 goto err1;
 6147         }
 6148 
 6149         /* index only, 18 bit long, lkey = itid << 8 | key */
 6150         mr->hw_mr.tid_type = ECORE_RDMA_TID_REGISTERED_MR;
 6151         mr->hw_mr.key = 0;
 6152         mr->hw_mr.pd = pd->pd_id;
 6153         mr->hw_mr.local_read = 1;
 6154         mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
 6155         mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
 6156         mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
 6157         mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
 6158         mr->hw_mr.mw_bind = false; /* TBD MW BIND */
 6159         mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
 6160         mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
 6161         mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
 6162         mr->hw_mr.page_size_log = ilog2(PAGE_SIZE); /* for the MR pages */
 6163 
 6164         mr->hw_mr.fbo = 0;
 6165 
 6166         mr->hw_mr.length = length;
 6167         mr->hw_mr.vaddr = (uint64_t)iova_start;
 6168         mr->hw_mr.zbva = false; /* TBD figure when this should be true */
 6169         mr->hw_mr.phy_mr = false; /* Fast MR - True, Regular Register False */
 6170         mr->hw_mr.dma_mr = false;
 6171 
 6172         rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
 6173         if (rc) {
 6174                 QL_DPRINT11(ha, "roce register tid returned an error %d\n", rc);
 6175                 goto err2;
 6176         }
 6177 
 6178         mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
 6179         if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
 6180                 mr->hw_mr.remote_atomic)
 6181                 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
 6182 
 6183         QL_DPRINT12(ha, "lkey: %x\n", mr->ibmr.lkey);
 6184 
 6185         return (&mr->ibmr);
 6186 
 6187 err2:
 6188         ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
 6189 err1:
 6190         qlnxr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
 6191 err0:
 6192         kfree(mr);
 6193 
 6194         QL_DPRINT12(ha, "exit [%d]\n", rc);
 6195         return (ERR_PTR(rc));
 6196 }
 6197 
 6198 #endif /* #if __FreeBSD_version >= 1102000 */
 6199 
 6200 int
 6201 qlnxr_create_ah(struct ib_ah *ibah,
 6202         struct ib_ah_attr *attr, u32 flags,
 6203         struct ib_udata *udata)
 6204 {
 6205         struct qlnxr_dev *dev;
 6206         qlnx_host_t     *ha;
 6207         struct qlnxr_ah *ah = get_qlnxr_ah(ibah);
 6208 
 6209         dev = get_qlnxr_dev(ibah->device);
 6210         ha = dev->ha;
 6211 
 6212         QL_DPRINT12(ha, "in create_ah\n");
 6213 
 6214         ah->attr = *attr;       
 6215 
 6216         return (0);
 6217 }
 6218 
 6219 void
 6220 qlnxr_destroy_ah(struct ib_ah *ibah, u32 flags)
 6221 {
 6222 }
 6223 
 6224 int
 6225 qlnxr_query_ah(struct ib_ah *ibah, struct ib_ah_attr *attr)
 6226 {
 6227         struct qlnxr_dev *dev;
 6228         qlnx_host_t     *ha;
 6229 
 6230         dev = get_qlnxr_dev((ibah->device));
 6231         ha = dev->ha;
 6232         QL_DPRINT12(ha, "Query AH not supported\n");
 6233         return -EINVAL;
 6234 }
 6235 
 6236 int
 6237 qlnxr_modify_ah(struct ib_ah *ibah, struct ib_ah_attr *attr)
 6238 {
 6239         struct qlnxr_dev *dev;
 6240         qlnx_host_t     *ha;
 6241 
 6242         dev = get_qlnxr_dev((ibah->device));
 6243         ha = dev->ha;
 6244         QL_DPRINT12(ha, "Modify AH not supported\n");
 6245         return -ENOSYS;
 6246 }
 6247 
 6248 #if __FreeBSD_version >= 1102000
 6249 int
 6250 qlnxr_process_mad(struct ib_device *ibdev,
 6251                 int process_mad_flags,
 6252                 u8 port_num,
 6253                 const struct ib_wc *in_wc,
 6254                 const struct ib_grh *in_grh,
 6255                 const struct ib_mad_hdr *mad_hdr,
 6256                 size_t in_mad_size,
 6257                 struct ib_mad_hdr *out_mad,
 6258                 size_t *out_mad_size,
 6259                 u16 *out_mad_pkey_index)
 6260 
 6261 #else
 6262 
 6263 int
 6264 qlnxr_process_mad(struct ib_device *ibdev,
 6265                         int process_mad_flags,
 6266                         u8 port_num,
 6267                         struct ib_wc *in_wc,
 6268                         struct ib_grh *in_grh,
 6269                         struct ib_mad *in_mad,
 6270                         struct ib_mad *out_mad)
 6271 
 6272 #endif /* #if __FreeBSD_version >= 1102000 */
 6273 {
 6274         struct qlnxr_dev *dev;
 6275         qlnx_host_t     *ha;
 6276 
 6277         dev = get_qlnxr_dev(ibdev);
 6278         ha = dev->ha;
 6279         QL_DPRINT12(ha, "process mad not supported\n");
 6280 
 6281         return -ENOSYS;
 6282 //      QL_DPRINT12(ha, "qlnxr_process_mad in_mad %x %x %x %x %x %x %x %x\n",
 6283 //               in_mad->mad_hdr.attr_id, in_mad->mad_hdr.base_version,
 6284 //               in_mad->mad_hdr.attr_mod, in_mad->mad_hdr.class_specific,
 6285 //               in_mad->mad_hdr.class_version, in_mad->mad_hdr.method,
 6286 //               in_mad->mad_hdr.mgmt_class, in_mad->mad_hdr.status);
 6287 
 6288 //      return IB_MAD_RESULT_SUCCESS;   
 6289 }
 6290 
 6291 #if __FreeBSD_version >= 1102000
 6292 int
 6293 qlnxr_get_port_immutable(struct ib_device *ibdev, u8 port_num,
 6294         struct ib_port_immutable *immutable)
 6295 {
 6296         struct qlnxr_dev        *dev;
 6297         qlnx_host_t             *ha;
 6298         struct ib_port_attr     attr;
 6299         int                     err;
 6300 
 6301         dev = get_qlnxr_dev(ibdev);
 6302         ha = dev->ha;
 6303 
 6304         QL_DPRINT12(ha, "enter\n");
 6305 
 6306         err = qlnxr_query_port(ibdev, port_num, &attr);
 6307         if (err)
 6308                 return err;
 6309 
 6310         if (QLNX_IS_IWARP(dev)) {
 6311                 immutable->pkey_tbl_len = 1;
 6312                 immutable->gid_tbl_len = 1;
 6313                 immutable->core_cap_flags = RDMA_CORE_PORT_IWARP;
 6314                 immutable->max_mad_size = 0;
 6315         } else {
 6316                 immutable->pkey_tbl_len = attr.pkey_tbl_len;
 6317                 immutable->gid_tbl_len = attr.gid_tbl_len;
 6318                 immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE;
 6319                 immutable->max_mad_size = IB_MGMT_MAD_SIZE;
 6320         }
 6321 
 6322         QL_DPRINT12(ha, "exit\n");
 6323         return 0;
 6324 }
 6325 #endif /* #if __FreeBSD_version > 1102000 */
 6326 
 6327 /***** iWARP related functions *************/
 6328 
 6329 static void
 6330 qlnxr_iw_mpa_request(void *context,
 6331         struct ecore_iwarp_cm_event_params *params)
 6332 {
 6333         struct qlnxr_iw_listener *listener = (struct qlnxr_iw_listener *)context;
 6334         struct qlnxr_dev *dev = listener->dev;
 6335         struct qlnxr_iw_ep *ep;
 6336         struct iw_cm_event event;
 6337         struct sockaddr_in *laddr;
 6338         struct sockaddr_in *raddr;
 6339         qlnx_host_t     *ha;
 6340 
 6341         ha = dev->ha;
 6342 
 6343         QL_DPRINT12(ha, "enter\n");
 6344 
 6345         if (params->cm_info->ip_version != ECORE_TCP_IPV4) {
 6346                 QL_DPRINT11(ha, "only IPv4 supported [0x%x]\n",
 6347                         params->cm_info->ip_version);
 6348                 return;
 6349         }
 6350 
 6351         ep = kzalloc(sizeof(*ep), GFP_ATOMIC);
 6352 
 6353         if (!ep) {
 6354                 QL_DPRINT11(ha, "kzalloc{ep) failed\n");
 6355                 return;
 6356         }
 6357 
 6358         ep->dev = dev;
 6359         ep->ecore_context = params->ep_context;
 6360 
 6361         memset(&event, 0, sizeof(event));
 6362 
 6363         event.event = IW_CM_EVENT_CONNECT_REQUEST;
 6364         event.status = params->status;
 6365 
 6366         laddr = (struct sockaddr_in *)&event.local_addr;
 6367         raddr = (struct sockaddr_in *)&event.remote_addr;
 6368 
 6369         laddr->sin_family = AF_INET;
 6370         raddr->sin_family = AF_INET;
 6371 
 6372         laddr->sin_port = htons(params->cm_info->local_port);
 6373         raddr->sin_port = htons(params->cm_info->remote_port);
 6374 
 6375         laddr->sin_addr.s_addr = htonl(params->cm_info->local_ip[0]);
 6376         raddr->sin_addr.s_addr = htonl(params->cm_info->remote_ip[0]);
 6377 
 6378         event.provider_data = (void *)ep;
 6379         event.private_data = (void *)params->cm_info->private_data;
 6380         event.private_data_len = (u8)params->cm_info->private_data_len;
 6381 
 6382 #if __FreeBSD_version >= 1100000
 6383         event.ord = params->cm_info->ord;
 6384         event.ird = params->cm_info->ird;
 6385 #endif /* #if __FreeBSD_version >= 1100000 */
 6386 
 6387         listener->cm_id->event_handler(listener->cm_id, &event);
 6388 
 6389         QL_DPRINT12(ha, "exit\n");
 6390 
 6391         return;
 6392 }
 6393 
 6394 static void
 6395 qlnxr_iw_issue_event(void *context,
 6396          struct ecore_iwarp_cm_event_params *params,
 6397          enum iw_cm_event_type event_type,
 6398          char *str)
 6399 {
 6400         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
 6401         struct qlnxr_dev *dev = ep->dev;
 6402         struct iw_cm_event event;
 6403         qlnx_host_t     *ha;
 6404 
 6405         ha = dev->ha;
 6406 
 6407         QL_DPRINT12(ha, "enter\n");
 6408 
 6409         memset(&event, 0, sizeof(event));
 6410         event.status = params->status;
 6411         event.event = event_type;
 6412 
 6413         if (params->cm_info != NULL) {
 6414 #if __FreeBSD_version >= 1100000
 6415                 event.ird = params->cm_info->ird;
 6416                 event.ord = params->cm_info->ord;
 6417                 QL_DPRINT12(ha, "ord=[%d] \n", event.ord);
 6418                 QL_DPRINT12(ha, "ird=[%d] \n", event.ird);
 6419 #endif /* #if __FreeBSD_version >= 1100000 */
 6420 
 6421                 event.private_data_len = params->cm_info->private_data_len;
 6422                 event.private_data = (void *)params->cm_info->private_data;
 6423                 QL_DPRINT12(ha, "private_data_len=[%d] \n",
 6424                         event.private_data_len);
 6425         }
 6426 
 6427         QL_DPRINT12(ha, "event=[%d] %s\n", event.event, str);
 6428         QL_DPRINT12(ha, "status=[%d] \n", event.status);
 6429 
 6430         if (ep) {
 6431                 if (ep->cm_id)
 6432                         ep->cm_id->event_handler(ep->cm_id, &event);
 6433                 else
 6434                         QL_DPRINT11(ha, "ep->cm_id == NULL \n");
 6435         } else {
 6436                 QL_DPRINT11(ha, "ep == NULL \n");
 6437         }
 6438 
 6439         QL_DPRINT12(ha, "exit\n");
 6440 
 6441         return;
 6442 }
 6443 
 6444 static void
 6445 qlnxr_iw_close_event(void *context,
 6446          struct ecore_iwarp_cm_event_params *params)
 6447 {
 6448         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
 6449         struct qlnxr_dev *dev = ep->dev;
 6450         qlnx_host_t     *ha;
 6451 
 6452         ha = dev->ha;
 6453 
 6454         QL_DPRINT12(ha, "enter\n");
 6455 
 6456         if (ep->cm_id) {
 6457                 qlnxr_iw_issue_event(context,
 6458                                     params,
 6459                                     IW_CM_EVENT_CLOSE,
 6460                                     "IW_CM_EVENT_EVENT_CLOSE");
 6461                 ep->cm_id->rem_ref(ep->cm_id);
 6462                 ep->cm_id = NULL;
 6463         }
 6464 
 6465         QL_DPRINT12(ha, "exit\n");
 6466 
 6467         return;
 6468 }
 6469 
 6470 #if __FreeBSD_version >= 1102000
 6471 
 6472 static void
 6473 qlnxr_iw_passive_complete(void *context,
 6474         struct ecore_iwarp_cm_event_params *params)
 6475 {
 6476         struct qlnxr_iw_ep      *ep = (struct qlnxr_iw_ep *)context;
 6477         struct qlnxr_dev        *dev = ep->dev;
 6478         qlnx_host_t             *ha;
 6479 
 6480         ha = dev->ha;
 6481 
 6482         /* We will only reach the following state if MPA_REJECT was called on
 6483          * passive. In this case there will be no associated QP.
 6484          */
 6485         if ((params->status == -ECONNREFUSED) && (ep->qp == NULL)) {
 6486                 QL_DPRINT11(ha, "PASSIVE connection refused releasing ep...\n");
 6487                 kfree(ep);
 6488                 return;
 6489         }
 6490 
 6491         /* We always issue an established event, however, ofed does not look
 6492          * at event code for established. So if there was a failure, we follow
 6493          * with close...
 6494          */
 6495         qlnxr_iw_issue_event(context,
 6496                 params,
 6497                 IW_CM_EVENT_ESTABLISHED,
 6498                 "IW_CM_EVENT_ESTABLISHED");
 6499 
 6500         if (params->status < 0) {
 6501                 qlnxr_iw_close_event(context, params);
 6502         }
 6503 
 6504         return;
 6505 }
 6506 
 6507 struct qlnxr_discon_work {
 6508         struct work_struct work;
 6509         struct qlnxr_iw_ep *ep;
 6510         enum ecore_iwarp_event_type event;
 6511         int status;
 6512 };
 6513 
 6514 static void
 6515 qlnxr_iw_disconnect_worker(struct work_struct *work)
 6516 {
 6517         struct qlnxr_discon_work *dwork =
 6518                 container_of(work, struct qlnxr_discon_work, work);
 6519         struct ecore_rdma_modify_qp_in_params qp_params = { 0 };
 6520         struct qlnxr_iw_ep *ep = dwork->ep;
 6521         struct qlnxr_dev *dev = ep->dev;
 6522         struct qlnxr_qp *qp = ep->qp;
 6523         struct iw_cm_event event;
 6524 
 6525         if (qp->destroyed) {
 6526                 kfree(dwork);
 6527                 qlnxr_iw_qp_rem_ref(&qp->ibqp);
 6528                 return;
 6529         }
 6530 
 6531         memset(&event, 0, sizeof(event));
 6532         event.status = dwork->status;
 6533         event.event = IW_CM_EVENT_DISCONNECT;
 6534 
 6535         /* Success means graceful disconnect was requested. modifying
 6536          * to SQD is translated to graceful disconnect. O/w reset is sent
 6537          */
 6538         if (dwork->status)
 6539                 qp_params.new_state = ECORE_ROCE_QP_STATE_ERR;
 6540         else
 6541                 qp_params.new_state = ECORE_ROCE_QP_STATE_SQD;
 6542 
 6543         kfree(dwork);
 6544 
 6545         if (ep->cm_id)
 6546                 ep->cm_id->event_handler(ep->cm_id, &event);
 6547 
 6548         SET_FIELD(qp_params.modify_flags,
 6549                   ECORE_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
 6550 
 6551         ecore_rdma_modify_qp(dev->rdma_ctx, qp->ecore_qp, &qp_params);
 6552 
 6553         qlnxr_iw_qp_rem_ref(&qp->ibqp);
 6554 
 6555         return;
 6556 }
 6557 
 6558 void
 6559 qlnxr_iw_disconnect_event(void *context,
 6560         struct ecore_iwarp_cm_event_params *params)
 6561 {
 6562         struct qlnxr_discon_work *work;
 6563         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
 6564         struct qlnxr_dev *dev = ep->dev;
 6565         struct qlnxr_qp *qp = ep->qp;
 6566 
 6567         work = kzalloc(sizeof(*work), GFP_ATOMIC);
 6568         if (!work)
 6569                 return;
 6570 
 6571         qlnxr_iw_qp_add_ref(&qp->ibqp);
 6572         work->ep = ep;
 6573         work->event = params->event;
 6574         work->status = params->status;
 6575 
 6576         INIT_WORK(&work->work, qlnxr_iw_disconnect_worker);
 6577         queue_work(dev->iwarp_wq, &work->work);
 6578 
 6579         return;
 6580 }
 6581 
 6582 #endif /* #if __FreeBSD_version >= 1102000 */
 6583 
 6584 static int
 6585 qlnxr_iw_mpa_reply(void *context,
 6586         struct ecore_iwarp_cm_event_params *params)
 6587 {
 6588         struct qlnxr_iw_ep      *ep = (struct qlnxr_iw_ep *)context;
 6589         struct qlnxr_dev        *dev = ep->dev;
 6590         struct ecore_iwarp_send_rtr_in rtr_in;
 6591         int                     rc;
 6592         qlnx_host_t             *ha;
 6593 
 6594         ha = dev->ha;
 6595 
 6596         QL_DPRINT12(ha, "enter\n");
 6597 
 6598         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 6599                 return -EINVAL;
 6600 
 6601         bzero(&rtr_in, sizeof(struct ecore_iwarp_send_rtr_in));
 6602         rtr_in.ep_context = params->ep_context;
 6603 
 6604         rc = ecore_iwarp_send_rtr(dev->rdma_ctx, &rtr_in);
 6605 
 6606         QL_DPRINT12(ha, "exit rc = %d\n", rc);
 6607         return rc;
 6608 }
 6609 
 6610 void
 6611 qlnxr_iw_qp_event(void *context,
 6612         struct ecore_iwarp_cm_event_params *params,
 6613         enum ib_event_type ib_event,
 6614         char *str)
 6615 {
 6616         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
 6617         struct qlnxr_dev *dev = ep->dev;
 6618         struct ib_qp *ibqp = &(ep->qp->ibqp);
 6619         struct ib_event event;
 6620         qlnx_host_t     *ha;
 6621 
 6622         ha = dev->ha;
 6623 
 6624         QL_DPRINT12(ha,
 6625                 "[context, event, event_handler] = [%p, 0x%x, %s, %p] enter\n",
 6626                 context, params->event, str, ibqp->event_handler);
 6627 
 6628         if (ibqp->event_handler) {
 6629                 event.event = ib_event;
 6630                 event.device = ibqp->device;
 6631                 event.element.qp = ibqp;
 6632                 ibqp->event_handler(&event, ibqp->qp_context);
 6633         }
 6634 
 6635         return;
 6636 }
 6637 
 6638 int
 6639 qlnxr_iw_event_handler(void *context,
 6640         struct ecore_iwarp_cm_event_params *params)
 6641 {
 6642         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
 6643         struct qlnxr_dev *dev = ep->dev;
 6644         qlnx_host_t     *ha;
 6645 
 6646         ha = dev->ha;
 6647 
 6648         QL_DPRINT12(ha, "[context, event] = [%p, 0x%x] "
 6649                 "enter\n", context, params->event);
 6650 
 6651         switch (params->event) {
 6652         /* Passive side request received */
 6653         case ECORE_IWARP_EVENT_MPA_REQUEST:
 6654                 qlnxr_iw_mpa_request(context, params);
 6655                 break;
 6656 
 6657         case ECORE_IWARP_EVENT_ACTIVE_MPA_REPLY:
 6658                 qlnxr_iw_mpa_reply(context, params);
 6659                 break;
 6660 
 6661         /* Passive side established ( ack on mpa response ) */
 6662         case ECORE_IWARP_EVENT_PASSIVE_COMPLETE:
 6663 
 6664 #if __FreeBSD_version >= 1102000
 6665 
 6666                 ep->during_connect = 0;
 6667                 qlnxr_iw_passive_complete(context, params);
 6668 
 6669 #else
 6670                 qlnxr_iw_issue_event(context,
 6671                                     params,
 6672                                     IW_CM_EVENT_ESTABLISHED,
 6673                                     "IW_CM_EVENT_ESTABLISHED");
 6674 #endif /* #if __FreeBSD_version >= 1102000 */
 6675                 break;
 6676 
 6677         /* Active side reply received */
 6678         case ECORE_IWARP_EVENT_ACTIVE_COMPLETE:
 6679                 ep->during_connect = 0;
 6680                 qlnxr_iw_issue_event(context,
 6681                                     params,
 6682                                     IW_CM_EVENT_CONNECT_REPLY,
 6683                                     "IW_CM_EVENT_CONNECT_REPLY");
 6684                 if (params->status < 0) {
 6685                         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
 6686 
 6687                         ep->cm_id->rem_ref(ep->cm_id);
 6688                         ep->cm_id = NULL;
 6689                 }
 6690                 break;
 6691 
 6692         case ECORE_IWARP_EVENT_DISCONNECT:
 6693 
 6694 #if __FreeBSD_version >= 1102000
 6695                 qlnxr_iw_disconnect_event(context, params);
 6696 #else
 6697                 qlnxr_iw_issue_event(context,
 6698                                     params,
 6699                                     IW_CM_EVENT_DISCONNECT,
 6700                                     "IW_CM_EVENT_DISCONNECT");
 6701                 qlnxr_iw_close_event(context, params);
 6702 #endif /* #if __FreeBSD_version >= 1102000 */
 6703                 break;
 6704 
 6705         case ECORE_IWARP_EVENT_CLOSE:
 6706                 ep->during_connect = 0;
 6707                 qlnxr_iw_close_event(context, params);
 6708                 break;
 6709 
 6710         case ECORE_IWARP_EVENT_RQ_EMPTY:
 6711                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
 6712                                  "IWARP_EVENT_RQ_EMPTY");
 6713                 break;
 6714 
 6715         case ECORE_IWARP_EVENT_IRQ_FULL:
 6716                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
 6717                                  "IWARP_EVENT_IRQ_FULL");
 6718                 break;
 6719 
 6720         case ECORE_IWARP_EVENT_LLP_TIMEOUT:
 6721                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
 6722                                  "IWARP_EVENT_LLP_TIMEOUT");
 6723                 break;
 6724 
 6725         case ECORE_IWARP_EVENT_REMOTE_PROTECTION_ERROR:
 6726                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_ACCESS_ERR,
 6727                                  "IWARP_EVENT_REMOTE_PROTECTION_ERROR");
 6728                 break;
 6729 
 6730         case ECORE_IWARP_EVENT_CQ_OVERFLOW:
 6731                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
 6732                                  "QED_IWARP_EVENT_CQ_OVERFLOW");
 6733                 break;
 6734 
 6735         case ECORE_IWARP_EVENT_QP_CATASTROPHIC:
 6736                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
 6737                                  "QED_IWARP_EVENT_QP_CATASTROPHIC");
 6738                 break;
 6739 
 6740         case ECORE_IWARP_EVENT_LOCAL_ACCESS_ERROR:
 6741                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_ACCESS_ERR,
 6742                                  "IWARP_EVENT_LOCAL_ACCESS_ERROR");
 6743                 break;
 6744 
 6745         case ECORE_IWARP_EVENT_REMOTE_OPERATION_ERROR:
 6746                 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
 6747                                  "IWARP_EVENT_REMOTE_OPERATION_ERROR");
 6748                 break;
 6749 
 6750         case ECORE_IWARP_EVENT_TERMINATE_RECEIVED:
 6751                 QL_DPRINT12(ha, "Got terminate message"
 6752                         " ECORE_IWARP_EVENT_TERMINATE_RECEIVED\n");
 6753                 break;
 6754 
 6755         default:
 6756                 QL_DPRINT12(ha,
 6757                         "Unknown event [0x%x] received \n", params->event);
 6758                 break;
 6759         };
 6760 
 6761         QL_DPRINT12(ha, "[context, event] = [%p, 0x%x] "
 6762                 "exit\n", context, params->event);
 6763         return 0;
 6764 }
 6765 
 6766 static int
 6767 qlnxr_addr4_resolve(struct qlnxr_dev *dev,
 6768                               struct sockaddr_in *src_in,
 6769                               struct sockaddr_in *dst_in,
 6770                               u8 *dst_mac)
 6771 {
 6772         int rc;
 6773 
 6774 #if __FreeBSD_version >= 1100000
 6775         rc = arpresolve(dev->ha->ifp, 0, NULL, (struct sockaddr *)dst_in,
 6776                         dst_mac, NULL, NULL);
 6777 #else
 6778         struct llentry *lle;
 6779 
 6780         rc = arpresolve(dev->ha->ifp, NULL, NULL, (struct sockaddr *)dst_in,
 6781                         dst_mac, &lle);
 6782 #endif
 6783 
 6784         QL_DPRINT12(dev->ha, "rc = %d "
 6785                 "sa_len = 0x%x sa_family = 0x%x IP Address = %d.%d.%d.%d "
 6786                 "Dest MAC %02x:%02x:%02x:%02x:%02x:%02x\n", rc,
 6787                 dst_in->sin_len, dst_in->sin_family,
 6788                 NIPQUAD((dst_in->sin_addr.s_addr)),
 6789                 dst_mac[0], dst_mac[1], dst_mac[2],
 6790                 dst_mac[3], dst_mac[4], dst_mac[5]);
 6791 
 6792         return rc;
 6793 }
 6794 
 6795 int
 6796 qlnxr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
 6797 {
 6798         struct qlnxr_dev *dev;
 6799         struct ecore_iwarp_connect_out out_params;
 6800         struct ecore_iwarp_connect_in in_params;
 6801         struct qlnxr_iw_ep *ep;
 6802         struct qlnxr_qp *qp;
 6803         struct sockaddr_in *laddr;
 6804         struct sockaddr_in *raddr;
 6805         int rc = 0;
 6806         qlnx_host_t     *ha;
 6807 
 6808         dev = get_qlnxr_dev((cm_id->device));
 6809         ha = dev->ha;
 6810 
 6811         QL_DPRINT12(ha, "[cm_id, conn_param] = [%p, %p] "
 6812                 "enter \n", cm_id, conn_param);
 6813 
 6814         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 6815                 return -EINVAL;
 6816 
 6817         qp = idr_find(&dev->qpidr, conn_param->qpn);
 6818 
 6819         laddr = (struct sockaddr_in *)&cm_id->local_addr;
 6820         raddr = (struct sockaddr_in *)&cm_id->remote_addr;
 6821 
 6822         QL_DPRINT12(ha,
 6823                 "local = [%d.%d.%d.%d, %d] remote = [%d.%d.%d.%d, %d]\n",
 6824                 NIPQUAD((laddr->sin_addr.s_addr)), laddr->sin_port,
 6825                 NIPQUAD((raddr->sin_addr.s_addr)), raddr->sin_port);
 6826 
 6827         ep = kzalloc(sizeof(*ep), GFP_KERNEL);
 6828         if (!ep) {
 6829                 QL_DPRINT11(ha, "struct qlnxr_iw_ep "
 6830                         "alloc memory failed\n");
 6831                 return -ENOMEM;
 6832         }
 6833 
 6834         ep->dev = dev;
 6835         ep->qp = qp;
 6836         cm_id->add_ref(cm_id);
 6837         ep->cm_id = cm_id;
 6838 
 6839         memset(&in_params, 0, sizeof (struct ecore_iwarp_connect_in));
 6840         memset(&out_params, 0, sizeof (struct ecore_iwarp_connect_out));
 6841 
 6842         in_params.event_cb = qlnxr_iw_event_handler;
 6843         in_params.cb_context = ep;
 6844 
 6845         in_params.cm_info.ip_version = ECORE_TCP_IPV4;
 6846 
 6847         in_params.cm_info.remote_ip[0] = ntohl(raddr->sin_addr.s_addr);
 6848         in_params.cm_info.local_ip[0] = ntohl(laddr->sin_addr.s_addr);
 6849         in_params.cm_info.remote_port = ntohs(raddr->sin_port);
 6850         in_params.cm_info.local_port = ntohs(laddr->sin_port);
 6851         in_params.cm_info.vlan = 0;
 6852         in_params.mss = dev->ha->ifp->if_mtu - 40;
 6853 
 6854         QL_DPRINT12(ha, "remote_ip = [%d.%d.%d.%d] "
 6855                 "local_ip = [%d.%d.%d.%d] remote_port = %d local_port = %d "
 6856                 "vlan = %d\n",
 6857                 NIPQUAD((in_params.cm_info.remote_ip[0])),
 6858                 NIPQUAD((in_params.cm_info.local_ip[0])),
 6859                 in_params.cm_info.remote_port, in_params.cm_info.local_port,
 6860                 in_params.cm_info.vlan);
 6861 
 6862         rc = qlnxr_addr4_resolve(dev, laddr, raddr, (u8 *)in_params.remote_mac_addr);
 6863 
 6864         if (rc) {
 6865                 QL_DPRINT11(ha, "qlnxr_addr4_resolve failed\n");
 6866                 goto err;
 6867         }
 6868 
 6869         QL_DPRINT12(ha, "ord = %d ird=%d private_data=%p"
 6870                 " private_data_len=%d rq_psn=%d\n",
 6871                 conn_param->ord, conn_param->ird, conn_param->private_data,
 6872                 conn_param->private_data_len, qp->rq_psn);
 6873 
 6874         in_params.cm_info.ord = conn_param->ord;
 6875         in_params.cm_info.ird = conn_param->ird;
 6876         in_params.cm_info.private_data = conn_param->private_data;
 6877         in_params.cm_info.private_data_len = conn_param->private_data_len;
 6878         in_params.qp = qp->ecore_qp;
 6879 
 6880         memcpy(in_params.local_mac_addr, dev->ha->primary_mac, ETH_ALEN);
 6881 
 6882         rc = ecore_iwarp_connect(dev->rdma_ctx, &in_params, &out_params);
 6883 
 6884         if (rc) {
 6885                 QL_DPRINT12(ha, "ecore_iwarp_connect failed\n");
 6886                 goto err;
 6887         }
 6888 
 6889         QL_DPRINT12(ha, "exit\n");
 6890 
 6891         return rc;
 6892 
 6893 err:
 6894         cm_id->rem_ref(cm_id);
 6895         kfree(ep);
 6896 
 6897         QL_DPRINT12(ha, "exit [%d]\n", rc);
 6898         return rc;
 6899 }
 6900 
 6901 int
 6902 qlnxr_iw_create_listen(struct iw_cm_id *cm_id, int backlog)
 6903 {
 6904         struct qlnxr_dev *dev;
 6905         struct qlnxr_iw_listener *listener;
 6906         struct ecore_iwarp_listen_in iparams;
 6907         struct ecore_iwarp_listen_out oparams;
 6908         struct sockaddr_in *laddr;
 6909         qlnx_host_t     *ha;
 6910         int rc;
 6911 
 6912         dev = get_qlnxr_dev((cm_id->device));
 6913         ha = dev->ha;
 6914 
 6915         QL_DPRINT12(ha, "enter\n");
 6916 
 6917         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 6918                 return -EINVAL;
 6919 
 6920         laddr = (struct sockaddr_in *)&cm_id->local_addr;
 6921 
 6922         listener = kzalloc(sizeof(*listener), GFP_KERNEL);
 6923 
 6924         if (listener == NULL) {
 6925                 QL_DPRINT11(ha, "listener memory alloc failed\n");
 6926                 return -ENOMEM;
 6927         }
 6928 
 6929         listener->dev = dev;
 6930         cm_id->add_ref(cm_id);
 6931         listener->cm_id = cm_id;
 6932         listener->backlog = backlog;
 6933 
 6934         memset(&iparams, 0, sizeof (struct ecore_iwarp_listen_in));
 6935         memset(&oparams, 0, sizeof (struct ecore_iwarp_listen_out));
 6936 
 6937         iparams.cb_context = listener;
 6938         iparams.event_cb = qlnxr_iw_event_handler;
 6939         iparams.max_backlog = backlog;
 6940 
 6941         iparams.ip_version = ECORE_TCP_IPV4;
 6942 
 6943         iparams.ip_addr[0] = ntohl(laddr->sin_addr.s_addr);
 6944         iparams.port = ntohs(laddr->sin_port);
 6945         iparams.vlan = 0;
 6946 
 6947         QL_DPRINT12(ha, "[%d.%d.%d.%d, %d] iparamsport=%d\n",
 6948                 NIPQUAD((laddr->sin_addr.s_addr)),
 6949                 laddr->sin_port, iparams.port);
 6950 
 6951         rc = ecore_iwarp_create_listen(dev->rdma_ctx, &iparams, &oparams);
 6952         if (rc) {
 6953                 QL_DPRINT11(ha,
 6954                         "ecore_iwarp_create_listen failed rc = %d\n", rc);
 6955                 goto err;
 6956         }
 6957 
 6958         listener->ecore_handle = oparams.handle;
 6959         cm_id->provider_data = listener;
 6960 
 6961         QL_DPRINT12(ha, "exit\n");
 6962         return rc;
 6963 
 6964 err:
 6965         cm_id->rem_ref(cm_id);
 6966         kfree(listener);
 6967 
 6968         QL_DPRINT12(ha, "exit [%d]\n", rc);
 6969         return rc;
 6970 }
 6971 
 6972 void
 6973 qlnxr_iw_destroy_listen(struct iw_cm_id *cm_id)
 6974 {
 6975         struct qlnxr_iw_listener *listener = cm_id->provider_data;
 6976         struct qlnxr_dev *dev = get_qlnxr_dev((cm_id->device));
 6977         int rc = 0;
 6978         qlnx_host_t     *ha;
 6979 
 6980         ha = dev->ha;
 6981 
 6982         QL_DPRINT12(ha, "enter\n");
 6983 
 6984         if (listener->ecore_handle)
 6985                 rc = ecore_iwarp_destroy_listen(dev->rdma_ctx,
 6986                                 listener->ecore_handle);
 6987 
 6988         cm_id->rem_ref(cm_id);
 6989 
 6990         QL_DPRINT12(ha, "exit [%d]\n", rc);
 6991         return;
 6992 }
 6993 
 6994 int
 6995 qlnxr_iw_accept(struct iw_cm_id *cm_id,
 6996         struct iw_cm_conn_param *conn_param)
 6997 {
 6998         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)cm_id->provider_data;
 6999         struct qlnxr_dev *dev = ep->dev;
 7000         struct qlnxr_qp *qp;
 7001         struct ecore_iwarp_accept_in params;
 7002         int rc;
 7003         qlnx_host_t     *ha;
 7004 
 7005         ha = dev->ha;
 7006 
 7007         QL_DPRINT12(ha, "enter  qpid=%d\n", conn_param->qpn);
 7008 
 7009         if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
 7010                 return -EINVAL;
 7011 
 7012         qp = idr_find(&dev->qpidr, conn_param->qpn);
 7013         if (!qp) {
 7014                 QL_DPRINT11(ha, "idr_find failed invalid qpn = %d\n",
 7015                         conn_param->qpn);
 7016                 return -EINVAL;
 7017         }
 7018         ep->qp = qp;
 7019         qp->ep = ep;
 7020         cm_id->add_ref(cm_id);
 7021         ep->cm_id = cm_id;
 7022 
 7023         params.ep_context = ep->ecore_context;
 7024         params.cb_context = ep;
 7025         params.qp = ep->qp->ecore_qp;
 7026         params.private_data = conn_param->private_data;
 7027         params.private_data_len = conn_param->private_data_len;
 7028         params.ird = conn_param->ird;
 7029         params.ord = conn_param->ord;
 7030 
 7031         rc = ecore_iwarp_accept(dev->rdma_ctx, &params);
 7032         if (rc) {
 7033                 QL_DPRINT11(ha, "ecore_iwarp_accept failed %d\n", rc);
 7034                 goto err;
 7035         }
 7036 
 7037         QL_DPRINT12(ha, "exit\n");
 7038         return 0;
 7039 err:
 7040         cm_id->rem_ref(cm_id);
 7041         QL_DPRINT12(ha, "exit rc = %d\n", rc);
 7042         return rc;
 7043 }
 7044 
 7045 int
 7046 qlnxr_iw_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
 7047 {
 7048 #if __FreeBSD_version >= 1102000
 7049 
 7050         struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)cm_id->provider_data;
 7051         struct qlnxr_dev *dev = ep->dev;
 7052         struct ecore_iwarp_reject_in params;
 7053         int rc;
 7054 
 7055         params.ep_context = ep->ecore_context;
 7056         params.cb_context = ep;
 7057         params.private_data = pdata;
 7058         params.private_data_len = pdata_len;
 7059         ep->qp = NULL;
 7060 
 7061         rc = ecore_iwarp_reject(dev->rdma_ctx, &params);
 7062 
 7063         return rc;
 7064 
 7065 #else
 7066 
 7067         printf("iWARP reject_cr not implemented\n");
 7068         return -EINVAL;
 7069 
 7070 #endif /* #if __FreeBSD_version >= 1102000 */
 7071 }
 7072 
 7073 void
 7074 qlnxr_iw_qp_add_ref(struct ib_qp *ibqp)
 7075 {
 7076         struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
 7077         qlnx_host_t     *ha;
 7078 
 7079         ha = qp->dev->ha;
 7080 
 7081         QL_DPRINT12(ha, "enter ibqp = %p\n", ibqp);
 7082 
 7083         atomic_inc(&qp->refcnt);
 7084 
 7085         QL_DPRINT12(ha, "exit \n");
 7086         return;
 7087 }
 7088 
 7089 void
 7090 qlnxr_iw_qp_rem_ref(struct ib_qp *ibqp)
 7091 {
 7092         struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
 7093         qlnx_host_t     *ha;
 7094 
 7095         ha = qp->dev->ha;
 7096 
 7097         QL_DPRINT12(ha, "enter ibqp = %p qp = %p\n", ibqp, qp);
 7098 
 7099         if (atomic_dec_and_test(&qp->refcnt)) {
 7100                 qlnxr_idr_remove(qp->dev, qp->qp_id);
 7101         }
 7102 
 7103         QL_DPRINT12(ha, "exit \n");
 7104         return;
 7105 }
 7106 
 7107 struct ib_qp *
 7108 qlnxr_iw_get_qp(struct ib_device *ibdev, int qpn)
 7109 {
 7110         struct qlnxr_dev *dev = get_qlnxr_dev(ibdev);
 7111         struct ib_qp *qp;
 7112         qlnx_host_t     *ha;
 7113 
 7114         ha = dev->ha;
 7115 
 7116         QL_DPRINT12(ha, "enter dev = %p ibdev = %p qpn = %d\n", dev, ibdev, qpn);
 7117 
 7118         qp = idr_find(&dev->qpidr, qpn);
 7119 
 7120         QL_DPRINT12(ha, "exit qp = %p\n", qp);
 7121 
 7122         return (qp);
 7123 }

Cache object: 2a65c07acc9c45f5ee5bd7cb1790a0ca


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


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