2 * Copyright (c) 2018-2019 Cavium, Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
35 #include "qlnxr_def.h"
36 #include "rdma_common.h"
37 #include "qlnxr_roce.h"
40 #define upper_32_bits(x) (uint32_t)(x >> 32)
41 #define lower_32_bits(x) (uint32_t)(x)
42 #define HILO_U64(hi, lo) ((((u64)(hi)) << 32) + (lo))
44 #define TYPEPTR_ADDR_SET(type_ptr, field, vaddr) \
46 (type_ptr)->field.hi = cpu_to_le32(upper_32_bits(vaddr));\
47 (type_ptr)->field.lo = cpu_to_le32(lower_32_bits(vaddr));\
51 #define RQ_SGE_SET(sge, vaddr, vlength, vflags) \
53 TYPEPTR_ADDR_SET(sge, addr, vaddr); \
54 (sge)->length = cpu_to_le32(vlength); \
55 (sge)->flags = cpu_to_le32(vflags); \
58 #define SRQ_HDR_SET(hdr, vwr_id, num_sge) \
60 TYPEPTR_ADDR_SET(hdr, wr_id, vwr_id); \
61 (hdr)->num_sges = num_sge; \
64 #define SRQ_SGE_SET(sge, vaddr, vlength, vlkey) \
66 TYPEPTR_ADDR_SET(sge, addr, vaddr); \
67 (sge)->length = cpu_to_le32(vlength); \
68 (sge)->l_key = cpu_to_le32(vlkey); \
71 #define NIPQUAD(addr) \
72 ((unsigned char *)&addr)[0], \
73 ((unsigned char *)&addr)[1], \
74 ((unsigned char *)&addr)[2], \
75 ((unsigned char *)&addr)[3]
77 struct ib_srq *qlnxr_create_srq(struct ib_pd *,
78 struct ib_srq_init_attr *,
81 int qlnxr_destroy_srq(struct ib_srq *);
83 int qlnxr_modify_srq(struct ib_srq *,
85 enum ib_srq_attr_mask,
88 qlnxr_check_srq_params(struct ib_pd *ibpd,
89 struct qlnxr_dev *dev,
90 struct ib_srq_init_attr *attrs);
93 qlnxr_init_srq_user_params(struct ib_ucontext *ib_ctx,
94 struct qlnxr_srq *srq,
95 struct qlnxr_create_srq_ureq *ureq,
96 int access, int dmasync);
99 qlnxr_alloc_srq_kernel_params(struct qlnxr_srq *srq,
100 struct qlnxr_dev *dev,
101 struct ib_srq_init_attr *init_attr);
103 extern enum _ecore_status_t
104 ecore_rdma_modify_srq(void *rdma_cxt,
105 struct ecore_rdma_modify_srq_in_params *in_params);
107 extern enum _ecore_status_t
108 ecore_rdma_destroy_srq(void *rdma_cxt,
109 struct ecore_rdma_destroy_srq_in_params *in_params);
111 extern enum _ecore_status_t
112 ecore_rdma_create_srq(void *rdma_cxt,
113 struct ecore_rdma_create_srq_in_params *in_params,
114 struct ecore_rdma_create_srq_out_params *out_params);
118 qlnxr_copy_srq_uresp(struct qlnxr_dev *dev,
119 struct qlnxr_srq *srq,
120 struct ib_udata *udata);
123 qlnxr_free_srq_user_params(struct qlnxr_srq *srq);
126 qlnxr_free_srq_kernel_params(struct qlnxr_srq *srq);
130 qlnxr_srq_elem_left(struct qlnxr_srq_hwq_info *hw_srq);
133 qlnxr_iw_query_gid(struct ib_device *ibdev, u8 port, int index,
136 struct qlnxr_dev *dev;
139 dev = get_qlnxr_dev(ibdev);
142 QL_DPRINT12(ha, "enter\n");
144 memset(sgid->raw, 0, sizeof(sgid->raw));
146 memcpy(sgid->raw, dev->ha->primary_mac, sizeof (dev->ha->primary_mac));
148 QL_DPRINT12(ha, "exit\n");
154 qlnxr_query_gid(struct ib_device *ibdev, u8 port, int index,
157 struct qlnxr_dev *dev;
160 dev = get_qlnxr_dev(ibdev);
162 QL_DPRINT12(ha, "enter index: %d\n", index);
165 /* @@@: if DEFINE_ROCE_GID_TABLE to be used here */
166 //if (!rdma_cap_roce_gid_table(ibdev, port)) {
167 if (!(rdma_protocol_roce(ibdev, port) &&
168 ibdev->add_gid && ibdev->del_gid)) {
169 QL_DPRINT11(ha, "acquire gid failed\n");
173 ret = ib_get_cached_gid(ibdev, port, index, sgid, NULL);
174 if (ret == -EAGAIN) {
175 memcpy(sgid, &zgid, sizeof(*sgid));
179 if ((index >= QLNXR_MAX_SGID) || (index < 0)) {
180 QL_DPRINT12(ha, "invalid gid index %d\n", index);
181 memset(sgid, 0, sizeof(*sgid));
184 memcpy(sgid, &dev->sgid_tbl[index], sizeof(*sgid));
186 QL_DPRINT12(ha, "exit : %p\n", sgid);
192 qlnxr_create_srq(struct ib_pd *ibpd, struct ib_srq_init_attr *init_attr,
193 struct ib_udata *udata)
195 struct qlnxr_dev *dev;
197 struct ecore_rdma_destroy_srq_in_params destroy_in_params;
198 struct ecore_rdma_create_srq_out_params out_params;
199 struct ecore_rdma_create_srq_in_params in_params;
200 u64 pbl_base_addr, phy_prod_pair_addr;
201 struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
202 struct ib_ucontext *ib_ctx = NULL;
203 struct qlnxr_srq_hwq_info *hw_srq;
204 struct qlnxr_ucontext *ctx = NULL;
205 struct qlnxr_create_srq_ureq ureq;
206 u32 page_cnt, page_size;
207 struct qlnxr_srq *srq;
210 dev = get_qlnxr_dev((ibpd->device));
213 QL_DPRINT12(ha, "enter\n");
215 ret = qlnxr_check_srq_params(ibpd, dev, init_attr);
217 srq = kzalloc(sizeof(*srq), GFP_KERNEL);
219 QL_DPRINT11(ha, "cannot allocate memory for srq\n");
220 return NULL; //@@@ : TODO what to return here?
224 hw_srq = &srq->hw_srq;
225 spin_lock_init(&srq->lock);
226 memset(&in_params, 0, sizeof(in_params));
228 if (udata && ibpd->uobject && ibpd->uobject->context) {
229 ib_ctx = ibpd->uobject->context;
230 ctx = get_qlnxr_ucontext(ib_ctx);
232 memset(&ureq, 0, sizeof(ureq));
233 if (ib_copy_from_udata(&ureq, udata, min(sizeof(ureq),
235 QL_DPRINT11(ha, "problem"
236 " copying data from user space\n");
240 ret = qlnxr_init_srq_user_params(ib_ctx, srq, &ureq, 0, 0);
244 page_cnt = srq->usrq.pbl_info.num_pbes;
245 pbl_base_addr = srq->usrq.pbl_tbl->pa;
246 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
247 // @@@ : if DEFINE_IB_UMEM_PAGE_SHIFT
248 // page_size = BIT(srq->usrq.umem->page_shift);
250 page_size = srq->usrq.umem->page_size;
252 struct ecore_chain *pbl;
253 ret = qlnxr_alloc_srq_kernel_params(srq, dev, init_attr);
258 page_cnt = ecore_chain_get_page_cnt(pbl);
259 pbl_base_addr = ecore_chain_get_pbl_phys(pbl);
260 phy_prod_pair_addr = hw_srq->phy_prod_pair_addr;
261 page_size = pbl->elem_per_page << 4;
264 in_params.pd_id = pd->pd_id;
265 in_params.pbl_base_addr = pbl_base_addr;
266 in_params.prod_pair_addr = phy_prod_pair_addr;
267 in_params.num_pages = page_cnt;
268 in_params.page_size = page_size;
270 ret = ecore_rdma_create_srq(dev->rdma_ctx, &in_params, &out_params);
274 srq->srq_id = out_params.srq_id;
277 ret = qlnxr_copy_srq_uresp(dev, srq, udata);
282 QL_DPRINT12(ha, "created srq with srq_id = 0x%0x\n", srq->srq_id);
285 memset(&in_params, 0, sizeof(in_params));
286 destroy_in_params.srq_id = srq->srq_id;
287 ecore_rdma_destroy_srq(dev->rdma_ctx, &destroy_in_params);
291 qlnxr_free_srq_user_params(srq);
293 qlnxr_free_srq_kernel_params(srq);
297 return ERR_PTR(-EFAULT);
301 qlnxr_destroy_srq(struct ib_srq *ibsrq)
303 struct qlnxr_dev *dev;
304 struct qlnxr_srq *srq;
306 struct ecore_rdma_destroy_srq_in_params in_params;
308 srq = get_qlnxr_srq(ibsrq);
312 memset(&in_params, 0, sizeof(in_params));
313 in_params.srq_id = srq->srq_id;
315 ecore_rdma_destroy_srq(dev->rdma_ctx, &in_params);
317 if (ibsrq->pd->uobject && ibsrq->pd->uobject->context)
318 qlnxr_free_srq_user_params(srq);
320 qlnxr_free_srq_kernel_params(srq);
322 QL_DPRINT12(ha, "destroyed srq_id=0x%0x\n", srq->srq_id);
328 qlnxr_modify_srq(struct ib_srq *ibsrq, struct ib_srq_attr *attr,
329 enum ib_srq_attr_mask attr_mask, struct ib_udata *udata)
331 struct qlnxr_dev *dev;
332 struct qlnxr_srq *srq;
334 struct ecore_rdma_modify_srq_in_params in_params;
337 srq = get_qlnxr_srq(ibsrq);
341 QL_DPRINT12(ha, "enter\n");
342 if (attr_mask & IB_SRQ_MAX_WR) {
343 QL_DPRINT12(ha, "invalid attribute mask=0x%x"
344 " specified for %p\n", attr_mask, srq);
348 if (attr_mask & IB_SRQ_LIMIT) {
349 if (attr->srq_limit >= srq->hw_srq.max_wr) {
350 QL_DPRINT12(ha, "invalid srq_limit=0x%x"
351 " (max_srq_limit = 0x%x)\n",
352 attr->srq_limit, srq->hw_srq.max_wr);
355 memset(&in_params, 0, sizeof(in_params));
356 in_params.srq_id = srq->srq_id;
357 in_params.wqe_limit = attr->srq_limit;
358 ret = ecore_rdma_modify_srq(dev->rdma_ctx, &in_params);
363 QL_DPRINT12(ha, "modified srq with srq_id = 0x%0x\n", srq->srq_id);
368 qlnxr_query_srq(struct ib_srq *ibsrq, struct ib_srq_attr *srq_attr)
370 struct qlnxr_dev *dev;
371 struct qlnxr_srq *srq;
373 struct ecore_rdma_device *qattr;
374 srq = get_qlnxr_srq(ibsrq);
377 //qattr = &dev->attr;
378 qattr = ecore_rdma_query_device(dev->rdma_ctx);
379 QL_DPRINT12(ha, "enter\n");
381 if (!dev->rdma_ctx) {
382 QL_DPRINT12(ha, "called with invalid params"
383 " rdma_ctx is NULL\n");
387 srq_attr->srq_limit = qattr->max_srq;
388 srq_attr->max_wr = qattr->max_srq_wr;
389 srq_attr->max_sge = qattr->max_sge;
391 QL_DPRINT12(ha, "exit\n");
395 /* Increment srq wr producer by one */
397 void qlnxr_inc_srq_wr_prod (struct qlnxr_srq_hwq_info *info)
402 /* Increment srq wr consumer by one */
404 void qlnxr_inc_srq_wr_cons(struct qlnxr_srq_hwq_info *info)
409 /* get_port_immutable verb is not available in FreeBSD */
412 qlnxr_roce_port_immutable(struct ib_device *ibdev, u8 port_num,
413 struct ib_port_immutable *immutable)
415 struct qlnxr_dev *dev;
417 dev = get_qlnxr_dev(ibdev);
420 QL_DPRINT12(ha, "entered but not implemented!!!\n");
425 qlnxr_post_srq_recv(struct ib_srq *ibsrq, struct ib_recv_wr *wr,
426 struct ib_recv_wr **bad_wr)
428 struct qlnxr_dev *dev;
429 struct qlnxr_srq *srq;
431 struct qlnxr_srq_hwq_info *hw_srq;
432 struct ecore_chain *pbl;
437 srq = get_qlnxr_srq(ibsrq);
440 hw_srq = &srq->hw_srq;
442 QL_DPRINT12(ha, "enter\n");
443 spin_lock_irqsave(&srq->lock, flags);
445 pbl = &srq->hw_srq.pbl;
447 struct rdma_srq_wqe_header *hdr;
450 if (!qlnxr_srq_elem_left(hw_srq) ||
451 wr->num_sge > srq->hw_srq.max_sges) {
452 QL_DPRINT11(ha, "WR cannot be posted"
453 " (%d, %d) || (%d > %d)\n",
454 hw_srq->wr_prod_cnt, hw_srq->wr_cons_cnt,
455 wr->num_sge, srq->hw_srq.max_sges);
461 hdr = ecore_chain_produce(pbl);
462 num_sge = wr->num_sge;
463 /* Set number of sge and WR id in header */
464 SRQ_HDR_SET(hdr, wr->wr_id, num_sge);
466 /* PBL is maintained in case of WR granularity.
467 * So increment WR producer in case we post a WR.
469 qlnxr_inc_srq_wr_prod(hw_srq);
473 QL_DPRINT12(ha, "SRQ WR : SGEs: %d with wr_id[%d] = %llx\n",
474 wr->num_sge, hw_srq->wqe_prod, wr->wr_id);
476 for (i = 0; i < wr->num_sge; i++) {
477 struct rdma_srq_sge *srq_sge =
478 ecore_chain_produce(pbl);
479 /* Set SGE length, lkey and address */
480 SRQ_SGE_SET(srq_sge, wr->sg_list[i].addr,
481 wr->sg_list[i].length, wr->sg_list[i].lkey);
483 QL_DPRINT12(ha, "[%d]: len %d, key %x, addr %x:%x\n",
484 i, srq_sge->length, srq_sge->l_key,
485 srq_sge->addr.hi, srq_sge->addr.lo);
490 * SRQ prod is 8 bytes. Need to update SGE prod in index
491 * in first 4 bytes and need to update WQE prod in next
494 *(srq->hw_srq.virt_prod_pair_addr) = hw_srq->sge_prod;
495 offset = offsetof(struct rdma_srq_producers, wqe_prod);
496 *((u8 *)srq->hw_srq.virt_prod_pair_addr + offset) =
498 /* Flush prod after updating it */
503 QL_DPRINT12(ha, "Elements in SRQ: %d\n",
504 ecore_chain_get_elem_left(pbl));
506 spin_unlock_irqrestore(&srq->lock, flags);
507 QL_DPRINT12(ha, "exit\n");
512 #if __FreeBSD_version < 1102000
513 qlnxr_query_device(struct ib_device *ibdev, struct ib_device_attr *attr)
515 qlnxr_query_device(struct ib_device *ibdev, struct ib_device_attr *attr,
516 struct ib_udata *udata)
517 #endif /* #if __FreeBSD_version < 1102000 */
520 struct qlnxr_dev *dev;
521 struct ecore_rdma_device *qattr;
524 dev = get_qlnxr_dev(ibdev);
527 QL_DPRINT12(ha, "enter\n");
529 #if __FreeBSD_version > 1102000
530 if (udata->inlen || udata->outlen)
532 #endif /* #if __FreeBSD_version > 1102000 */
534 if (dev->rdma_ctx == NULL) {
538 qattr = ecore_rdma_query_device(dev->rdma_ctx);
540 memset(attr, 0, sizeof *attr);
542 attr->fw_ver = qattr->fw_ver;
543 attr->sys_image_guid = qattr->sys_image_guid;
544 attr->max_mr_size = qattr->max_mr_size;
545 attr->page_size_cap = qattr->page_size_caps;
546 attr->vendor_id = qattr->vendor_id;
547 attr->vendor_part_id = qattr->vendor_part_id;
548 attr->hw_ver = qattr->hw_ver;
549 attr->max_qp = qattr->max_qp;
550 attr->device_cap_flags = IB_DEVICE_CURR_QP_STATE_MOD |
551 IB_DEVICE_RC_RNR_NAK_GEN |
552 IB_DEVICE_LOCAL_DMA_LKEY |
553 IB_DEVICE_MEM_MGT_EXTENSIONS;
555 attr->max_sge = qattr->max_sge;
556 attr->max_sge_rd = qattr->max_sge;
557 attr->max_cq = qattr->max_cq;
558 attr->max_cqe = qattr->max_cqe;
559 attr->max_mr = qattr->max_mr;
560 attr->max_mw = qattr->max_mw;
561 attr->max_pd = qattr->max_pd;
562 attr->atomic_cap = dev->atomic_cap;
563 attr->max_fmr = qattr->max_fmr;
564 attr->max_map_per_fmr = 16; /* TBD: FMR */
566 /* There is an implicit assumption in some of the ib_xxx apps that the
567 * qp_rd_atom is smaller than the qp_init_rd_atom. Specifically, in
568 * communication the qp_rd_atom is passed to the other side and used as
569 * init_rd_atom without check device capabilities for init_rd_atom.
570 * for this reason, we set the qp_rd_atom to be the minimum between the
571 * two...There is an additional assumption in mlx4 driver that the
572 * values are power of two, fls is performed on the value - 1, which
573 * in fact gives a larger power of two for values which are not a power
574 * of two. This should be fixed in mlx4 driver, but until then ->
575 * we provide a value that is a power of two in our code.
577 attr->max_qp_init_rd_atom =
578 1 << (fls(qattr->max_qp_req_rd_atomic_resc) - 1);
579 attr->max_qp_rd_atom =
580 min(1 << (fls(qattr->max_qp_resp_rd_atomic_resc) - 1),
581 attr->max_qp_init_rd_atom);
583 attr->max_srq = qattr->max_srq;
584 attr->max_srq_sge = qattr->max_srq_sge;
585 attr->max_srq_wr = qattr->max_srq_wr;
587 /* TODO: R&D to more properly configure the following */
588 attr->local_ca_ack_delay = qattr->dev_ack_delay;
589 attr->max_fast_reg_page_list_len = qattr->max_mr/8;
590 attr->max_pkeys = QLNXR_ROCE_PKEY_MAX;
591 attr->max_ah = qattr->max_ah;
593 QL_DPRINT12(ha, "exit\n");
598 get_link_speed_and_width(int speed, uint8_t *ib_speed, uint8_t *ib_width)
602 *ib_speed = IB_SPEED_SDR;
603 *ib_width = IB_WIDTH_1X;
606 *ib_speed = IB_SPEED_QDR;
607 *ib_width = IB_WIDTH_1X;
611 *ib_speed = IB_SPEED_DDR;
612 *ib_width = IB_WIDTH_4X;
616 *ib_speed = IB_SPEED_EDR;
617 *ib_width = IB_WIDTH_1X;
621 *ib_speed = IB_SPEED_QDR;
622 *ib_width = IB_WIDTH_4X;
626 *ib_speed = IB_SPEED_QDR;
627 *ib_width = IB_WIDTH_4X; // TODO doesn't add up to 50...
631 *ib_speed = IB_SPEED_EDR;
632 *ib_width = IB_WIDTH_4X;
637 *ib_speed = IB_SPEED_SDR;
638 *ib_width = IB_WIDTH_1X;
644 qlnxr_query_port(struct ib_device *ibdev, uint8_t port,
645 struct ib_port_attr *attr)
647 struct qlnxr_dev *dev;
648 struct ecore_rdma_port *rdma_port;
651 dev = get_qlnxr_dev(ibdev);
654 QL_DPRINT12(ha, "enter\n");
657 QL_DPRINT12(ha, "port [%d] > 1 \n", port);
661 if (dev->rdma_ctx == NULL) {
662 QL_DPRINT12(ha, "rdma_ctx == NULL\n");
666 rdma_port = ecore_rdma_query_port(dev->rdma_ctx);
667 memset(attr, 0, sizeof *attr);
669 if (rdma_port->port_state == ECORE_RDMA_PORT_UP) {
670 attr->state = IB_PORT_ACTIVE;
671 attr->phys_state = 5;
673 attr->state = IB_PORT_DOWN;
674 attr->phys_state = 3;
677 attr->max_mtu = IB_MTU_4096;
678 attr->active_mtu = iboe_get_mtu(dev->ha->ifp->if_mtu);
683 attr->port_cap_flags = 0;
685 if (QLNX_IS_IWARP(dev)) {
686 attr->gid_tbl_len = 1;
687 attr->pkey_tbl_len = 1;
689 attr->gid_tbl_len = QLNXR_MAX_SGID;
690 attr->pkey_tbl_len = QLNXR_ROCE_PKEY_TABLE_LEN;
693 attr->bad_pkey_cntr = rdma_port->pkey_bad_counter;
694 attr->qkey_viol_cntr = 0;
696 get_link_speed_and_width(rdma_port->link_speed,
697 &attr->active_speed, &attr->active_width);
699 attr->max_msg_sz = rdma_port->max_msg_size;
700 attr->max_vl_num = 4; /* TODO -> figure this one out... */
702 QL_DPRINT12(ha, "state = %d phys_state = %d "
703 " link_speed = %d active_speed = %d active_width = %d"
704 " attr->gid_tbl_len = %d attr->pkey_tbl_len = %d"
705 " max_msg_sz = 0x%x max_vl_num = 0x%x \n",
706 attr->state, attr->phys_state,
707 rdma_port->link_speed, attr->active_speed,
708 attr->active_width, attr->gid_tbl_len, attr->pkey_tbl_len,
709 attr->max_msg_sz, attr->max_vl_num);
711 QL_DPRINT12(ha, "exit\n");
716 qlnxr_modify_port(struct ib_device *ibdev, uint8_t port, int mask,
717 struct ib_port_modify *props)
719 struct qlnxr_dev *dev;
722 dev = get_qlnxr_dev(ibdev);
725 QL_DPRINT12(ha, "enter\n");
728 QL_DPRINT12(ha, "port (%d) > 1\n", port);
732 QL_DPRINT12(ha, "exit\n");
737 qlnxr_link_layer(struct ib_device *ibdev, uint8_t port_num)
739 struct qlnxr_dev *dev;
742 dev = get_qlnxr_dev(ibdev);
745 QL_DPRINT12(ha, "ibdev = %p port_num = 0x%x\n", ibdev, port_num);
747 return IB_LINK_LAYER_ETHERNET;
751 qlnxr_alloc_pd(struct ib_device *ibdev, struct ib_ucontext *context,
752 struct ib_udata *udata)
754 struct qlnxr_pd *pd = NULL;
757 struct qlnxr_dev *dev;
760 dev = get_qlnxr_dev(ibdev);
763 QL_DPRINT12(ha, "ibdev = %p context = %p"
764 " udata = %p enter\n", ibdev, context, udata);
766 if (dev->rdma_ctx == NULL) {
767 QL_DPRINT11(ha, "dev->rdma_ctx = NULL\n");
772 pd = kzalloc(sizeof(*pd), GFP_KERNEL);
775 QL_DPRINT11(ha, "kzalloc(pd) = NULL\n");
779 rc = ecore_rdma_alloc_pd(dev->rdma_ctx, &pd_id);
781 QL_DPRINT11(ha, "ecore_rdma_alloc_pd failed\n");
787 if (udata && context) {
789 rc = ib_copy_to_udata(udata, &pd->pd_id, sizeof(pd->pd_id));
791 QL_DPRINT11(ha, "ib_copy_to_udata failed\n");
792 ecore_rdma_free_pd(dev->rdma_ctx, pd_id);
796 pd->uctx = get_qlnxr_ucontext(context);
800 atomic_add_rel_32(&dev->pd_count, 1);
801 QL_DPRINT12(ha, "exit [pd, pd_id, pd_count] = [%p, 0x%x, %d]\n",
802 pd, pd_id, dev->pd_count);
808 QL_DPRINT12(ha, "exit -1\n");
813 qlnxr_dealloc_pd(struct ib_pd *ibpd)
816 struct qlnxr_dev *dev;
819 pd = get_qlnxr_pd(ibpd);
820 dev = get_qlnxr_dev((ibpd->device));
823 QL_DPRINT12(ha, "enter\n");
826 QL_DPRINT11(ha, "pd = NULL\n");
828 ecore_rdma_free_pd(dev->rdma_ctx, pd->pd_id);
830 atomic_subtract_rel_32(&dev->pd_count, 1);
831 QL_DPRINT12(ha, "exit [pd, pd_id, pd_count] = [%p, 0x%x, %d]\n",
832 pd, pd->pd_id, dev->pd_count);
835 QL_DPRINT12(ha, "exit\n");
839 #define ROCE_WQE_ELEM_SIZE sizeof(struct rdma_sq_sge)
840 #define RDMA_MAX_SGE_PER_SRQ (4) /* Should be part of HSI */
841 /* Should be part of HSI */
842 #define RDMA_MAX_SRQ_WQE_SIZE (RDMA_MAX_SGE_PER_SRQ + 1) /* +1 for header */
843 #define DB_ADDR_SHIFT(addr) ((addr) << DB_PWM_ADDR_OFFSET_SHIFT)
845 static void qlnxr_cleanup_user(struct qlnxr_dev *, struct qlnxr_qp *);
846 static void qlnxr_cleanup_kernel(struct qlnxr_dev *, struct qlnxr_qp *);
849 qlnxr_query_pkey(struct ib_device *ibdev, u8 port, u16 index, u16 *pkey)
851 struct qlnxr_dev *dev;
854 dev = get_qlnxr_dev(ibdev);
857 QL_DPRINT12(ha, "enter index = 0x%x\n", index);
859 if (index > QLNXR_ROCE_PKEY_TABLE_LEN)
862 *pkey = QLNXR_ROCE_PKEY_DEFAULT;
864 QL_DPRINT12(ha, "exit\n");
870 qlnxr_get_vlan_id_qp(qlnx_host_t *ha, struct ib_qp_attr *attr, int attr_mask,
875 QL_DPRINT12(ha, "enter \n");
879 #if __FreeBSD_version >= 1100000
882 #if __FreeBSD_version >= 1102000
885 dgid = &attr->ah_attr.grh.dgid;
886 tmp_vlan_id = (dgid->raw[11] << 8) | dgid->raw[12];
888 if (!(tmp_vlan_id & ~EVL_VLID_MASK)) {
889 *vlan_id = tmp_vlan_id;
893 tmp_vlan_id = attr->vlan_id;
895 if ((attr_mask & IB_QP_VID) && (!(tmp_vlan_id & ~EVL_VLID_MASK))) {
896 *vlan_id = tmp_vlan_id;
900 #endif /* #if __FreeBSD_version > 1102000 */
905 #endif /* #if __FreeBSD_version >= 1100000 */
907 QL_DPRINT12(ha, "exit vlan_id = 0x%x ret = %d \n", *vlan_id, ret);
913 get_gid_info(struct ib_qp *ibqp, struct ib_qp_attr *attr,
915 struct qlnxr_dev *dev,
917 struct ecore_rdma_modify_qp_in_params *qp_params)
924 QL_DPRINT12(ha, "enter\n");
926 memcpy(&qp_params->sgid.bytes[0],
927 &dev->sgid_tbl[qp->sgid_idx].raw[0],
928 sizeof(qp_params->sgid.bytes));
929 memcpy(&qp_params->dgid.bytes[0],
930 &attr->ah_attr.grh.dgid.raw[0],
931 sizeof(qp_params->dgid));
933 qlnxr_get_vlan_id_qp(ha, attr, attr_mask, &qp_params->vlan_id);
935 for (i = 0; i < (sizeof(qp_params->sgid.dwords)/sizeof(uint32_t)); i++) {
936 qp_params->sgid.dwords[i] = ntohl(qp_params->sgid.dwords[i]);
937 qp_params->dgid.dwords[i] = ntohl(qp_params->dgid.dwords[i]);
940 QL_DPRINT12(ha, "exit\n");
947 qlnxr_add_mmap(struct qlnxr_ucontext *uctx, u64 phy_addr, unsigned long len)
954 QL_DPRINT12(ha, "enter\n");
956 mm = kzalloc(sizeof(*mm), GFP_KERNEL);
958 QL_DPRINT11(ha, "mm = NULL\n");
962 mm->key.phy_addr = phy_addr;
964 /* This function might be called with a length which is not a multiple
965 * of PAGE_SIZE, while the mapping is PAGE_SIZE grained and the kernel
966 * forces this granularity by increasing the requested size if needed.
967 * When qedr_mmap is called, it will search the list with the updated
968 * length as a key. To prevent search failures, the length is rounded up
969 * in advance to PAGE_SIZE.
971 mm->key.len = roundup(len, PAGE_SIZE);
972 INIT_LIST_HEAD(&mm->entry);
974 mutex_lock(&uctx->mm_list_lock);
975 list_add(&mm->entry, &uctx->mm_head);
976 mutex_unlock(&uctx->mm_list_lock);
978 QL_DPRINT12(ha, "added (addr=0x%llx,len=0x%lx) for ctx=%p\n",
979 (unsigned long long)mm->key.phy_addr,
980 (unsigned long)mm->key.len, uctx);
986 qlnxr_search_mmap(struct qlnxr_ucontext *uctx, u64 phy_addr, unsigned long len)
994 QL_DPRINT12(ha, "enter\n");
996 mutex_lock(&uctx->mm_list_lock);
997 list_for_each_entry(mm, &uctx->mm_head, entry) {
998 if (len != mm->key.len || phy_addr != mm->key.phy_addr)
1004 mutex_unlock(&uctx->mm_list_lock);
1007 "searched for (addr=0x%llx,len=0x%lx) for ctx=%p, found=%d\n",
1008 mm->key.phy_addr, mm->key.len, uctx, found);
1014 ib_ucontext *qlnxr_alloc_ucontext(struct ib_device *ibdev,
1015 struct ib_udata *udata)
1018 struct qlnxr_ucontext *ctx;
1019 struct qlnxr_alloc_ucontext_resp uresp;
1020 struct qlnxr_dev *dev = get_qlnxr_dev(ibdev);
1021 qlnx_host_t *ha = dev->ha;
1022 struct ecore_rdma_add_user_out_params oparams;
1025 return ERR_PTR(-EFAULT);
1028 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
1030 return ERR_PTR(-ENOMEM);
1032 rc = ecore_rdma_add_user(dev->rdma_ctx, &oparams);
1035 "Failed to allocate a DPI for a new RoCE application "
1036 ",rc = %d. To overcome this, consider to increase "
1037 "the number of DPIs, increase the doorbell BAR size "
1038 "or just close unnecessary RoCE applications. In "
1039 "order to increase the number of DPIs consult the "
1044 ctx->dpi = oparams.dpi;
1045 ctx->dpi_addr = oparams.dpi_addr;
1046 ctx->dpi_phys_addr = oparams.dpi_phys_addr;
1047 ctx->dpi_size = oparams.dpi_size;
1048 INIT_LIST_HEAD(&ctx->mm_head);
1049 mutex_init(&ctx->mm_list_lock);
1051 memset(&uresp, 0, sizeof(uresp));
1052 uresp.dpm_enabled = offsetof(struct qlnxr_alloc_ucontext_resp, dpm_enabled)
1053 < udata->outlen ? dev->user_dpm_enabled : 0; //TODO: figure this out
1054 uresp.wids_enabled = offsetof(struct qlnxr_alloc_ucontext_resp, wids_enabled)
1055 < udata->outlen ? 1 : 0; //TODO: figure this out
1056 uresp.wid_count = offsetof(struct qlnxr_alloc_ucontext_resp, wid_count)
1057 < udata->outlen ? oparams.wid_count : 0; //TODO: figure this out
1058 uresp.db_pa = ctx->dpi_phys_addr;
1059 uresp.db_size = ctx->dpi_size;
1060 uresp.max_send_wr = dev->attr.max_sqe;
1061 uresp.max_recv_wr = dev->attr.max_rqe;
1062 uresp.max_srq_wr = dev->attr.max_srq_wr;
1063 uresp.sges_per_send_wr = QLNXR_MAX_SQE_ELEMENTS_PER_SQE;
1064 uresp.sges_per_recv_wr = QLNXR_MAX_RQE_ELEMENTS_PER_RQE;
1065 uresp.sges_per_srq_wr = dev->attr.max_srq_sge;
1066 uresp.max_cqes = QLNXR_MAX_CQES;
1068 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1074 rc = qlnxr_add_mmap(ctx, ctx->dpi_phys_addr, ctx->dpi_size);
1077 QL_DPRINT12(ha, "Allocated user context %p\n",
1080 return &ctx->ibucontext;
1087 qlnxr_dealloc_ucontext(struct ib_ucontext *ibctx)
1089 struct qlnxr_ucontext *uctx = get_qlnxr_ucontext(ibctx);
1090 struct qlnxr_dev *dev = uctx->dev;
1091 qlnx_host_t *ha = dev->ha;
1092 struct qlnxr_mm *mm, *tmp;
1095 QL_DPRINT12(ha, "Deallocating user context %p\n",
1099 ecore_rdma_remove_user(uctx->dev->rdma_ctx, uctx->dpi);
1102 list_for_each_entry_safe(mm, tmp, &uctx->mm_head, entry) {
1103 QL_DPRINT12(ha, "deleted addr= 0x%llx, len = 0x%lx for"
1105 mm->key.phy_addr, mm->key.len, uctx);
1106 list_del(&mm->entry);
1114 qlnxr_mmap(struct ib_ucontext *context, struct vm_area_struct *vma)
1116 struct qlnxr_ucontext *ucontext = get_qlnxr_ucontext(context);
1117 struct qlnxr_dev *dev = get_qlnxr_dev((context->device));
1118 unsigned long vm_page = vma->vm_pgoff << PAGE_SHIFT;
1120 unsigned long len = (vma->vm_end - vma->vm_start);
1127 #if __FreeBSD_version > 1102000
1128 unmapped_db = dev->db_phys_addr + (ucontext->dpi * ucontext->dpi_size);
1130 unmapped_db = dev->db_phys_addr;
1131 #endif /* #if __FreeBSD_version > 1102000 */
1133 QL_DPRINT12(ha, "qedr_mmap enter vm_page=0x%lx"
1134 " vm_pgoff=0x%lx unmapped_db=0x%llx db_size=%x, len=%lx\n",
1135 vm_page, vma->vm_pgoff, unmapped_db,
1138 if ((vma->vm_start & (PAGE_SIZE - 1)) || (len & (PAGE_SIZE - 1))) {
1139 QL_DPRINT11(ha, "Vma_start not page aligned "
1140 "vm_start = %ld vma_end = %ld\n", vma->vm_start,
1145 found = qlnxr_search_mmap(ucontext, vm_page, len);
1147 QL_DPRINT11(ha, "Vma_pgoff not found in mapped array = %ld\n",
1152 QL_DPRINT12(ha, "Mapping doorbell bar\n");
1154 #if __FreeBSD_version > 1102000
1156 if ((vm_page < unmapped_db) ||
1157 ((vm_page + len) > (unmapped_db + ucontext->dpi_size))) {
1158 QL_DPRINT11(ha, "failed pages are outside of dpi;"
1159 "page address=0x%lx, unmapped_db=0x%lx, dpi_size=0x%x\n",
1160 vm_page, unmapped_db, ucontext->dpi_size);
1164 if (vma->vm_flags & VM_READ) {
1165 QL_DPRINT11(ha, "failed mmap, cannot map doorbell bar for read\n");
1169 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
1170 rc = io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, len,
1175 if ((vm_page >= unmapped_db) && (vm_page <= (unmapped_db +
1178 QL_DPRINT12(ha, "Mapping doorbell bar\n");
1180 vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
1182 rc = io_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
1183 PAGE_SIZE, vma->vm_page_prot);
1185 QL_DPRINT12(ha, "Mapping chains\n");
1186 rc = io_remap_pfn_range(vma, vma->vm_start,
1187 vma->vm_pgoff, len, vma->vm_page_prot);
1190 #endif /* #if __FreeBSD_version > 1102000 */
1192 QL_DPRINT12(ha, "exit [%d]\n", rc);
1197 qlnxr_get_dma_mr(struct ib_pd *ibpd, int acc)
1199 struct qlnxr_mr *mr;
1200 struct qlnxr_dev *dev = get_qlnxr_dev((ibpd->device));
1201 struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
1207 QL_DPRINT12(ha, "enter\n");
1209 if (acc & IB_ACCESS_MW_BIND) {
1210 QL_DPRINT12(ha, "Unsupported access flags received for dma mr\n");
1213 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
1216 QL_DPRINT12(ha, "kzalloc(mr) failed %d\n", rc);
1220 mr->type = QLNXR_MR_DMA;
1222 rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
1224 QL_DPRINT12(ha, "ecore_rdma_alloc_tid failed %d\n", rc);
1228 /* index only, 18 bit long, lkey = itid << 8 | key */
1229 mr->hw_mr.tid_type = ECORE_RDMA_TID_REGISTERED_MR;
1230 mr->hw_mr.pd = pd->pd_id;
1231 mr->hw_mr.local_read = 1;
1232 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
1233 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
1234 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
1235 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
1236 mr->hw_mr.dma_mr = true;
1238 rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
1240 QL_DPRINT12(ha, "ecore_rdma_register_tid failed %d\n", rc);
1244 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
1246 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
1247 mr->hw_mr.remote_atomic) {
1248 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
1251 QL_DPRINT12(ha, "lkey = %x\n", mr->ibmr.lkey);
1256 ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
1260 QL_DPRINT12(ha, "exit [%d]\n", rc);
1266 qlnxr_free_pbl(struct qlnxr_dev *dev, struct qlnxr_pbl_info *pbl_info,
1267 struct qlnxr_pbl *pbl)
1274 QL_DPRINT12(ha, "enter\n");
1276 for (i = 0; i < pbl_info->num_pbls; i++) {
1279 qlnx_dma_free_coherent(&dev->ha->cdev, pbl[i].va, pbl[i].pa,
1280 pbl_info->pbl_size);
1284 QL_DPRINT12(ha, "exit\n");
1288 #define MIN_FW_PBL_PAGE_SIZE (4*1024)
1289 #define MAX_FW_PBL_PAGE_SIZE (64*1024)
1291 #define NUM_PBES_ON_PAGE(_page_size) (_page_size / sizeof(u64))
1292 #define MAX_PBES_ON_PAGE NUM_PBES_ON_PAGE(MAX_FW_PBL_PAGE_SIZE)
1293 #define MAX_PBES_TWO_LAYER (MAX_PBES_ON_PAGE*MAX_PBES_ON_PAGE)
1295 static struct qlnxr_pbl *
1296 qlnxr_alloc_pbl_tbl(struct qlnxr_dev *dev,
1297 struct qlnxr_pbl_info *pbl_info, gfp_t flags)
1301 dma_addr_t *pbl_main_tbl;
1302 struct qlnxr_pbl *pbl_table;
1308 QL_DPRINT12(ha, "enter\n");
1310 pbl_table = kzalloc(sizeof(*pbl_table) * pbl_info->num_pbls, flags);
1313 QL_DPRINT12(ha, "pbl_table = NULL\n");
1317 for (i = 0; i < pbl_info->num_pbls; i++) {
1318 va = qlnx_dma_alloc_coherent(&dev->ha->cdev, &pa, pbl_info->pbl_size);
1320 QL_DPRINT11(ha, "Failed to allocate pbl#%d\n", i);
1324 memset(va, 0, pbl_info->pbl_size);
1325 pbl_table[i].va = va;
1326 pbl_table[i].pa = pa;
1329 /* Two-Layer PBLs, if we have more than one pbl we need to initialize
1330 * the first one with physical pointers to all of the rest
1332 pbl_main_tbl = (dma_addr_t *)pbl_table[0].va;
1333 for (i = 0; i < pbl_info->num_pbls - 1; i++)
1334 pbl_main_tbl[i] = pbl_table[i + 1].pa;
1336 QL_DPRINT12(ha, "exit\n");
1340 qlnxr_free_pbl(dev, pbl_info, pbl_table);
1342 QL_DPRINT12(ha, "exit with error\n");
1347 qlnxr_prepare_pbl_tbl(struct qlnxr_dev *dev,
1348 struct qlnxr_pbl_info *pbl_info,
1350 int two_layer_capable)
1359 QL_DPRINT12(ha, "enter\n");
1361 if ((num_pbes > MAX_PBES_ON_PAGE) && two_layer_capable) {
1362 if (num_pbes > MAX_PBES_TWO_LAYER) {
1363 QL_DPRINT11(ha, "prepare pbl table: too many pages %d\n",
1368 /* calculate required pbl page size */
1369 pbl_size = MIN_FW_PBL_PAGE_SIZE;
1370 pbl_capacity = NUM_PBES_ON_PAGE(pbl_size) *
1371 NUM_PBES_ON_PAGE(pbl_size);
1373 while (pbl_capacity < num_pbes) {
1375 pbl_capacity = pbl_size / sizeof(u64);
1376 pbl_capacity = pbl_capacity * pbl_capacity;
1379 num_pbls = DIV_ROUND_UP(num_pbes, NUM_PBES_ON_PAGE(pbl_size));
1380 num_pbls++; /* One for the layer0 ( points to the pbls) */
1381 pbl_info->two_layered = true;
1383 /* One layered PBL */
1385 pbl_size = max_t(u32, MIN_FW_PBL_PAGE_SIZE, \
1386 roundup_pow_of_two((num_pbes * sizeof(u64))));
1387 pbl_info->two_layered = false;
1390 pbl_info->num_pbls = num_pbls;
1391 pbl_info->pbl_size = pbl_size;
1392 pbl_info->num_pbes = num_pbes;
1394 QL_DPRINT12(ha, "prepare pbl table: num_pbes=%d, num_pbls=%d pbl_size=%d\n",
1395 pbl_info->num_pbes, pbl_info->num_pbls, pbl_info->pbl_size);
1400 #define upper_32_bits(x) (uint32_t)(x >> 32)
1401 #define lower_32_bits(x) (uint32_t)(x)
1404 qlnxr_populate_pbls(struct qlnxr_dev *dev, struct ib_umem *umem,
1405 struct qlnxr_pbl *pbl, struct qlnxr_pbl_info *pbl_info)
1407 struct regpair *pbe;
1408 struct qlnxr_pbl *pbl_tbl;
1409 struct scatterlist *sg;
1410 int shift, pg_cnt, pages, pbe_cnt, total_num_pbes = 0;
1413 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
1415 struct ib_umem_chunk *chunk = NULL;
1423 QL_DPRINT12(ha, "enter\n");
1426 QL_DPRINT11(ha, "PBL_INFO not initialized\n");
1430 if (!pbl_info->num_pbes) {
1431 QL_DPRINT11(ha, "pbl_info->num_pbes == 0\n");
1435 /* If we have a two layered pbl, the first pbl points to the rest
1436 * of the pbls and the first entry lays on the second pbl in the table
1438 if (pbl_info->two_layered)
1443 pbe = (struct regpair *)pbl_tbl->va;
1445 QL_DPRINT12(ha, "pbe is NULL\n");
1451 shift = ilog2(umem->page_size);
1453 #ifndef DEFINE_IB_UMEM_WITH_CHUNK
1455 for_each_sg(umem->sg_head.sgl, sg, umem->nmap, entry) {
1458 list_for_each_entry(chunk, &umem->chunk_list, list) {
1459 /* get all the dma regions from the chunk. */
1460 for (i = 0; i < chunk->nmap; i++) {
1461 sg = &chunk->page_list[i];
1463 pages = sg_dma_len(sg) >> shift;
1464 for (pg_cnt = 0; pg_cnt < pages; pg_cnt++) {
1465 /* store the page address in pbe */
1467 cpu_to_le32(sg_dma_address(sg) +
1468 (umem->page_size * pg_cnt));
1470 cpu_to_le32(upper_32_bits
1471 ((sg_dma_address(sg) +
1472 umem->page_size * pg_cnt)));
1475 "Populate pbl table:"
1476 " pbe->addr=0x%x:0x%x "
1477 " pbe_cnt = %d total_num_pbes=%d"
1478 " pbe=%p\n", pbe->lo, pbe->hi, pbe_cnt,
1479 total_num_pbes, pbe);
1485 if (total_num_pbes == pbl_info->num_pbes)
1488 /* if the given pbl is full storing the pbes,
1492 (pbl_info->pbl_size / sizeof(u64))) {
1494 pbe = (struct regpair *)pbl_tbl->va;
1498 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
1502 QL_DPRINT12(ha, "exit\n");
1507 free_mr_info(struct qlnxr_dev *dev, struct mr_info *info)
1509 struct qlnxr_pbl *pbl, *tmp;
1514 QL_DPRINT12(ha, "enter\n");
1516 if (info->pbl_table)
1517 list_add_tail(&info->pbl_table->list_entry,
1518 &info->free_pbl_list);
1520 if (!list_empty(&info->inuse_pbl_list))
1521 list_splice(&info->inuse_pbl_list, &info->free_pbl_list);
1523 list_for_each_entry_safe(pbl, tmp, &info->free_pbl_list, list_entry) {
1524 list_del(&pbl->list_entry);
1525 qlnxr_free_pbl(dev, &info->pbl_info, pbl);
1527 QL_DPRINT12(ha, "exit\n");
1533 qlnxr_init_mr_info(struct qlnxr_dev *dev, struct mr_info *info,
1534 size_t page_list_len, bool two_layered)
1537 struct qlnxr_pbl *tmp;
1542 QL_DPRINT12(ha, "enter\n");
1544 INIT_LIST_HEAD(&info->free_pbl_list);
1545 INIT_LIST_HEAD(&info->inuse_pbl_list);
1547 rc = qlnxr_prepare_pbl_tbl(dev, &info->pbl_info,
1548 page_list_len, two_layered);
1550 QL_DPRINT11(ha, "qlnxr_prepare_pbl_tbl [%d]\n", rc);
1554 info->pbl_table = qlnxr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
1556 if (!info->pbl_table) {
1558 QL_DPRINT11(ha, "qlnxr_alloc_pbl_tbl returned NULL\n");
1562 QL_DPRINT12(ha, "pbl_table_pa = %pa\n", &info->pbl_table->pa);
1564 /* in usual case we use 2 PBLs, so we add one to free
1565 * list and allocating another one
1567 tmp = qlnxr_alloc_pbl_tbl(dev, &info->pbl_info, GFP_KERNEL);
1570 QL_DPRINT11(ha, "Extra PBL is not allocated\n");
1571 goto done; /* it's OK if second allocation fails, so rc = 0*/
1574 list_add_tail(&tmp->list_entry, &info->free_pbl_list);
1576 QL_DPRINT12(ha, "extra pbl_table_pa = %pa\n", &tmp->pa);
1580 free_mr_info(dev, info);
1582 QL_DPRINT12(ha, "exit [%d]\n", rc);
1589 #if __FreeBSD_version >= 1102000
1590 qlnxr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
1591 u64 usr_addr, int acc, struct ib_udata *udata)
1593 qlnxr_reg_user_mr(struct ib_pd *ibpd, u64 start, u64 len,
1594 u64 usr_addr, int acc, struct ib_udata *udata, int mr_id)
1595 #endif /* #if __FreeBSD_version >= 1102000 */
1598 struct qlnxr_dev *dev = get_qlnxr_dev((ibpd->device));
1599 struct qlnxr_mr *mr;
1600 struct qlnxr_pd *pd;
1605 QL_DPRINT12(ha, "enter\n");
1607 pd = get_qlnxr_pd(ibpd);
1609 QL_DPRINT12(ha, "qedr_register user mr pd = %d"
1610 " start = %lld, len = %lld, usr_addr = %lld, acc = %d\n",
1611 pd->pd_id, start, len, usr_addr, acc);
1613 if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE)) {
1615 "(acc & IB_ACCESS_REMOTE_WRITE &&"
1616 " !(acc & IB_ACCESS_LOCAL_WRITE))\n");
1617 return ERR_PTR(-EINVAL);
1620 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
1622 QL_DPRINT11(ha, "kzalloc(mr) failed\n");
1626 mr->type = QLNXR_MR_USER;
1628 mr->umem = ib_umem_get(ibpd->uobject->context, start, len, acc, 0);
1629 if (IS_ERR(mr->umem)) {
1631 QL_DPRINT11(ha, "ib_umem_get failed [%p]\n", mr->umem);
1635 rc = qlnxr_init_mr_info(dev, &mr->info, ib_umem_page_count(mr->umem), 1);
1638 "qlnxr_init_mr_info failed [%d]\n", rc);
1642 qlnxr_populate_pbls(dev, mr->umem, mr->info.pbl_table,
1643 &mr->info.pbl_info);
1645 rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
1648 QL_DPRINT11(ha, "roce alloc tid returned an error %d\n", rc);
1652 /* index only, 18 bit long, lkey = itid << 8 | key */
1653 mr->hw_mr.tid_type = ECORE_RDMA_TID_REGISTERED_MR;
1655 mr->hw_mr.pd = pd->pd_id;
1656 mr->hw_mr.local_read = 1;
1657 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
1658 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
1659 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
1660 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
1661 mr->hw_mr.mw_bind = false; /* TBD MW BIND */
1662 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
1663 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
1664 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
1665 mr->hw_mr.page_size_log = ilog2(mr->umem->page_size); /* for the MR pages */
1667 #if __FreeBSD_version >= 1102000
1668 mr->hw_mr.fbo = ib_umem_offset(mr->umem);
1670 mr->hw_mr.fbo = mr->umem->offset;
1672 mr->hw_mr.length = len;
1673 mr->hw_mr.vaddr = usr_addr;
1674 mr->hw_mr.zbva = false; /* TBD figure when this should be true */
1675 mr->hw_mr.phy_mr = false; /* Fast MR - True, Regular Register False */
1676 mr->hw_mr.dma_mr = false;
1678 rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
1680 QL_DPRINT11(ha, "roce register tid returned an error %d\n", rc);
1684 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
1685 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
1686 mr->hw_mr.remote_atomic)
1687 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
1689 QL_DPRINT12(ha, "register user mr lkey: %x\n", mr->ibmr.lkey);
1694 ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
1696 qlnxr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
1700 QL_DPRINT12(ha, "exit [%d]\n", rc);
1701 return (ERR_PTR(rc));
1705 qlnxr_dereg_mr(struct ib_mr *ib_mr)
1707 struct qlnxr_mr *mr = get_qlnxr_mr(ib_mr);
1708 struct qlnxr_dev *dev = get_qlnxr_dev((ib_mr->device));
1714 QL_DPRINT12(ha, "enter\n");
1716 if ((mr->type != QLNXR_MR_DMA) && (mr->type != QLNXR_MR_FRMR))
1717 qlnxr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
1719 /* it could be user registered memory. */
1721 ib_umem_release(mr->umem);
1727 QL_DPRINT12(ha, "exit\n");
1732 qlnxr_copy_cq_uresp(struct qlnxr_dev *dev,
1733 struct qlnxr_cq *cq, struct ib_udata *udata)
1735 struct qlnxr_create_cq_uresp uresp;
1741 QL_DPRINT12(ha, "enter\n");
1743 memset(&uresp, 0, sizeof(uresp));
1745 uresp.db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
1746 uresp.icid = cq->icid;
1748 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
1751 QL_DPRINT12(ha, "ib_copy_to_udata error cqid=0x%x[%d]\n",
1755 QL_DPRINT12(ha, "exit [%d]\n", rc);
1760 consume_cqe(struct qlnxr_cq *cq)
1763 if (cq->latest_cqe == cq->toggle_cqe)
1764 cq->pbl_toggle ^= RDMA_RESIZE_CQ_RAMROD_DATA_TOGGLE_BIT_MASK;
1766 cq->latest_cqe = ecore_chain_consume(&cq->pbl);
1770 qlnxr_align_cq_entries(int entries)
1772 u64 size, aligned_size;
1774 /* We allocate an extra entry that we don't report to the FW.
1776 * The CQE size is 32 bytes but the FW writes in chunks of 64 bytes
1777 * (for performance purposes). Allocating an extra entry and telling
1778 * the FW we have less prevents overwriting the first entry in case of
1779 * a wrap i.e. when the FW writes the last entry and the application
1780 * hasn't read the first one.
1782 size = (entries + 1) * QLNXR_CQE_SIZE;
1784 /* We align to PAGE_SIZE.
1786 * Since the CQ is going to be mapped and the mapping is anyhow in whole
1787 * kernel pages we benefit from the possibly extra CQEs.
1789 aligned_size = ALIGN(size, PAGE_SIZE);
1791 /* note: for CQs created in user space the result of this function
1792 * should match the size mapped in user space
1794 return (aligned_size / QLNXR_CQE_SIZE);
1798 qlnxr_init_user_queue(struct ib_ucontext *ib_ctx, struct qlnxr_dev *dev,
1799 struct qlnxr_userq *q, u64 buf_addr, size_t buf_len,
1800 int access, int dmasync, int alloc_and_init)
1808 QL_DPRINT12(ha, "enter\n");
1810 q->buf_addr = buf_addr;
1811 q->buf_len = buf_len;
1813 QL_DPRINT12(ha, "buf_addr : %llx, buf_len : %x, access : %x"
1814 " dmasync : %x\n", q->buf_addr, q->buf_len,
1817 q->umem = ib_umem_get(ib_ctx, q->buf_addr, q->buf_len, access, dmasync);
1819 if (IS_ERR(q->umem)) {
1820 QL_DPRINT11(ha, "ib_umem_get failed [%lx]\n", PTR_ERR(q->umem));
1821 return PTR_ERR(q->umem);
1824 page_cnt = ib_umem_page_count(q->umem);
1825 rc = qlnxr_prepare_pbl_tbl(dev, &q->pbl_info, page_cnt,
1826 0 /* SQ and RQ don't support dual layer pbl.
1827 * CQ may, but this is yet uncoded.
1830 QL_DPRINT11(ha, "qlnxr_prepare_pbl_tbl failed [%d]\n", rc);
1834 if (alloc_and_init) {
1835 q->pbl_tbl = qlnxr_alloc_pbl_tbl(dev, &q->pbl_info, GFP_KERNEL);
1838 QL_DPRINT11(ha, "qlnxr_alloc_pbl_tbl failed\n");
1843 qlnxr_populate_pbls(dev, q->umem, q->pbl_tbl, &q->pbl_info);
1845 q->pbl_tbl = kzalloc(sizeof(*q->pbl_tbl), GFP_KERNEL);
1848 QL_DPRINT11(ha, "qlnxr_alloc_pbl_tbl failed\n");
1854 QL_DPRINT12(ha, "exit\n");
1858 ib_umem_release(q->umem);
1861 QL_DPRINT12(ha, "exit [%d]\n", rc);
1865 #if __FreeBSD_version >= 1102000
1868 qlnxr_create_cq(struct ib_device *ibdev,
1869 const struct ib_cq_init_attr *attr,
1870 struct ib_ucontext *ib_ctx,
1871 struct ib_udata *udata)
1875 #if __FreeBSD_version >= 1100000
1878 qlnxr_create_cq(struct ib_device *ibdev,
1879 struct ib_cq_init_attr *attr,
1880 struct ib_ucontext *ib_ctx,
1881 struct ib_udata *udata)
1886 qlnxr_create_cq(struct ib_device *ibdev,
1889 struct ib_ucontext *ib_ctx,
1890 struct ib_udata *udata)
1891 #endif /* #if __FreeBSD_version >= 1100000 */
1893 #endif /* #if __FreeBSD_version >= 1102000 */
1895 struct qlnxr_ucontext *ctx;
1896 struct ecore_rdma_destroy_cq_out_params destroy_oparams;
1897 struct ecore_rdma_destroy_cq_in_params destroy_iparams;
1898 struct qlnxr_dev *dev;
1899 struct ecore_rdma_create_cq_in_params params;
1900 struct qlnxr_create_cq_ureq ureq;
1902 #if __FreeBSD_version >= 1100000
1903 int vector = attr->comp_vector;
1904 int entries = attr->cqe;
1906 struct qlnxr_cq *cq;
1907 int chain_entries, rc, page_cnt;
1912 dev = get_qlnxr_dev(ibdev);
1915 QL_DPRINT12(ha, "called from %s. entries = %d, "
1917 (udata ? "User Lib" : "Kernel"), entries, vector);
1919 memset(¶ms, 0, sizeof(struct ecore_rdma_create_cq_in_params));
1920 memset(&destroy_iparams, 0, sizeof(struct ecore_rdma_destroy_cq_in_params));
1921 memset(&destroy_oparams, 0, sizeof(struct ecore_rdma_destroy_cq_out_params));
1923 if (entries > QLNXR_MAX_CQES) {
1925 "the number of entries %d is too high. "
1926 "Must be equal or below %d.\n",
1927 entries, QLNXR_MAX_CQES);
1928 return ERR_PTR(-EINVAL);
1930 chain_entries = qlnxr_align_cq_entries(entries);
1931 chain_entries = min_t(int, chain_entries, QLNXR_MAX_CQES);
1933 cq = qlnx_zalloc((sizeof(struct qlnxr_cq)));
1936 return ERR_PTR(-ENOMEM);
1939 memset(&ureq, 0, sizeof(ureq));
1941 if (ib_copy_from_udata(&ureq, udata,
1942 min(sizeof(ureq), udata->inlen))) {
1943 QL_DPRINT11(ha, "ib_copy_from_udata failed\n");
1948 QL_DPRINT11(ha, "ureq.len == 0\n");
1952 cq->cq_type = QLNXR_CQ_TYPE_USER;
1954 qlnxr_init_user_queue(ib_ctx, dev, &cq->q, ureq.addr, ureq.len,
1955 IB_ACCESS_LOCAL_WRITE, 1, 1);
1957 pbl_ptr = cq->q.pbl_tbl->pa;
1958 page_cnt = cq->q.pbl_info.num_pbes;
1959 cq->ibcq.cqe = chain_entries;
1961 cq->cq_type = QLNXR_CQ_TYPE_KERNEL;
1963 rc = ecore_chain_alloc(&dev->ha->cdev,
1964 ECORE_CHAIN_USE_TO_CONSUME,
1965 ECORE_CHAIN_MODE_PBL,
1966 ECORE_CHAIN_CNT_TYPE_U32,
1968 sizeof(union roce_cqe),
1974 page_cnt = ecore_chain_get_page_cnt(&cq->pbl);
1975 pbl_ptr = ecore_chain_get_pbl_phys(&cq->pbl);
1976 cq->ibcq.cqe = cq->pbl.capacity;
1979 params.cq_handle_hi = upper_32_bits((uintptr_t)cq);
1980 params.cq_handle_lo = lower_32_bits((uintptr_t)cq);
1981 params.cnq_id = vector;
1982 params.cq_size = chain_entries - 1;
1983 params.pbl_num_pages = page_cnt;
1984 params.pbl_ptr = pbl_ptr;
1985 params.pbl_two_level = 0;
1987 if (ib_ctx != NULL) {
1988 ctx = get_qlnxr_ucontext(ib_ctx);
1989 params.dpi = ctx->dpi;
1991 params.dpi = dev->dpi;
1994 rc = ecore_rdma_create_cq(dev->rdma_ctx, ¶ms, &icid);
1999 cq->sig = QLNXR_CQ_MAGIC_NUMBER;
2000 spin_lock_init(&cq->cq_lock);
2003 rc = qlnxr_copy_cq_uresp(dev, cq, udata);
2007 /* Generate doorbell address.
2008 * Configure bits 3-9 with DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT.
2009 * TODO: consider moving to device scope as it is a function of
2011 * TODO: add ifdef if plan to support 16 bit.
2013 cq->db_addr = dev->db_addr +
2014 DB_ADDR_SHIFT(DQ_PWM_OFFSET_UCM_RDMA_CQ_CONS_32BIT);
2015 cq->db.data.icid = cq->icid;
2016 cq->db.data.params = DB_AGG_CMD_SET <<
2017 RDMA_PWM_VAL32_DATA_AGG_CMD_SHIFT;
2019 /* point to the very last element, passing it we will toggle */
2020 cq->toggle_cqe = ecore_chain_get_last_elem(&cq->pbl);
2021 cq->pbl_toggle = RDMA_RESIZE_CQ_RAMROD_DATA_TOGGLE_BIT_MASK;
2023 /* must be different from pbl_toggle */
2024 cq->latest_cqe = NULL;
2026 cq->cq_cons = ecore_chain_get_cons_idx_u32(&cq->pbl);
2029 QL_DPRINT12(ha, "exit icid = 0x%0x, addr = %p,"
2030 " number of entries = 0x%x\n",
2031 cq->icid, cq, params.cq_size);
2032 QL_DPRINT12(ha,"cq_addr = %p\n", cq);
2036 destroy_iparams.icid = cq->icid;
2037 ecore_rdma_destroy_cq(dev->rdma_ctx, &destroy_iparams, &destroy_oparams);
2040 qlnxr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
2042 ecore_chain_free(&dev->ha->cdev, &cq->pbl);
2045 ib_umem_release(cq->q.umem);
2049 QL_DPRINT12(ha, "exit error\n");
2051 return ERR_PTR(-EINVAL);
2054 int qlnxr_resize_cq(struct ib_cq *ibcq, int new_cnt, struct ib_udata *udata)
2057 struct qlnxr_dev *dev = get_qlnxr_dev((ibcq->device));
2062 QL_DPRINT12(ha, "enter/exit\n");
2068 qlnxr_destroy_cq(struct ib_cq *ibcq)
2070 struct qlnxr_dev *dev = get_qlnxr_dev((ibcq->device));
2071 struct ecore_rdma_destroy_cq_out_params oparams;
2072 struct ecore_rdma_destroy_cq_in_params iparams;
2073 struct qlnxr_cq *cq = get_qlnxr_cq(ibcq);
2079 QL_DPRINT12(ha, "enter cq_id = %d\n", cq->icid);
2083 /* TODO: Syncronize irq of the CNQ the CQ belongs to for validation
2084 * that all completions with notification are dealt with. The rest
2085 * of the completions are not interesting
2088 /* GSIs CQs are handled by driver, so they don't exist in the FW */
2090 if (cq->cq_type != QLNXR_CQ_TYPE_GSI) {
2092 iparams.icid = cq->icid;
2094 rc = ecore_rdma_destroy_cq(dev->rdma_ctx, &iparams, &oparams);
2097 QL_DPRINT12(ha, "ecore_rdma_destroy_cq failed cq_id = %d\n",
2102 QL_DPRINT12(ha, "free cq->pbl cq_id = %d\n", cq->icid);
2103 ecore_chain_free(&dev->ha->cdev, &cq->pbl);
2106 if (ibcq->uobject && ibcq->uobject->context) {
2107 qlnxr_free_pbl(dev, &cq->q.pbl_info, cq->q.pbl_tbl);
2108 ib_umem_release(cq->q.umem);
2115 QL_DPRINT12(ha, "exit cq_id = %d\n", cq->icid);
2121 qlnxr_check_qp_attrs(struct ib_pd *ibpd,
2122 struct qlnxr_dev *dev,
2123 struct ib_qp_init_attr *attrs,
2124 struct ib_udata *udata)
2126 struct ecore_rdma_device *qattr;
2129 qattr = ecore_rdma_query_device(dev->rdma_ctx);
2132 QL_DPRINT12(ha, "enter\n");
2134 QL_DPRINT12(ha, "attrs->sq_sig_type = %d\n", attrs->sq_sig_type);
2135 QL_DPRINT12(ha, "attrs->qp_type = %d\n", attrs->qp_type);
2136 QL_DPRINT12(ha, "attrs->create_flags = %d\n", attrs->create_flags);
2138 #if __FreeBSD_version < 1102000
2139 QL_DPRINT12(ha, "attrs->qpg_type = %d\n", attrs->qpg_type);
2142 QL_DPRINT12(ha, "attrs->port_num = %d\n", attrs->port_num);
2143 QL_DPRINT12(ha, "attrs->cap.max_send_wr = 0x%x\n", attrs->cap.max_send_wr);
2144 QL_DPRINT12(ha, "attrs->cap.max_recv_wr = 0x%x\n", attrs->cap.max_recv_wr);
2145 QL_DPRINT12(ha, "attrs->cap.max_send_sge = 0x%x\n", attrs->cap.max_send_sge);
2146 QL_DPRINT12(ha, "attrs->cap.max_recv_sge = 0x%x\n", attrs->cap.max_recv_sge);
2147 QL_DPRINT12(ha, "attrs->cap.max_inline_data = 0x%x\n",
2148 attrs->cap.max_inline_data);
2150 #if __FreeBSD_version < 1102000
2151 QL_DPRINT12(ha, "attrs->cap.qpg_tss_mask_sz = 0x%x\n",
2152 attrs->cap.qpg_tss_mask_sz);
2155 QL_DPRINT12(ha, "\n\nqattr->vendor_id = 0x%x\n", qattr->vendor_id);
2156 QL_DPRINT12(ha, "qattr->vendor_part_id = 0x%x\n", qattr->vendor_part_id);
2157 QL_DPRINT12(ha, "qattr->hw_ver = 0x%x\n", qattr->hw_ver);
2158 QL_DPRINT12(ha, "qattr->fw_ver = %p\n", (void *)qattr->fw_ver);
2159 QL_DPRINT12(ha, "qattr->node_guid = %p\n", (void *)qattr->node_guid);
2160 QL_DPRINT12(ha, "qattr->sys_image_guid = %p\n",
2161 (void *)qattr->sys_image_guid);
2162 QL_DPRINT12(ha, "qattr->max_cnq = 0x%x\n", qattr->max_cnq);
2163 QL_DPRINT12(ha, "qattr->max_sge = 0x%x\n", qattr->max_sge);
2164 QL_DPRINT12(ha, "qattr->max_srq_sge = 0x%x\n", qattr->max_srq_sge);
2165 QL_DPRINT12(ha, "qattr->max_inline = 0x%x\n", qattr->max_inline);
2166 QL_DPRINT12(ha, "qattr->max_wqe = 0x%x\n", qattr->max_wqe);
2167 QL_DPRINT12(ha, "qattr->max_srq_wqe = 0x%x\n", qattr->max_srq_wqe);
2168 QL_DPRINT12(ha, "qattr->max_qp_resp_rd_atomic_resc = 0x%x\n",
2169 qattr->max_qp_resp_rd_atomic_resc);
2170 QL_DPRINT12(ha, "qattr->max_qp_req_rd_atomic_resc = 0x%x\n",
2171 qattr->max_qp_req_rd_atomic_resc);
2172 QL_DPRINT12(ha, "qattr->max_dev_resp_rd_atomic_resc = 0x%x\n",
2173 qattr->max_dev_resp_rd_atomic_resc);
2174 QL_DPRINT12(ha, "qattr->max_cq = 0x%x\n", qattr->max_cq);
2175 QL_DPRINT12(ha, "qattr->max_qp = 0x%x\n", qattr->max_qp);
2176 QL_DPRINT12(ha, "qattr->max_srq = 0x%x\n", qattr->max_srq);
2177 QL_DPRINT12(ha, "qattr->max_mr = 0x%x\n", qattr->max_mr);
2178 QL_DPRINT12(ha, "qattr->max_mr_size = %p\n", (void *)qattr->max_mr_size);
2179 QL_DPRINT12(ha, "qattr->max_cqe = 0x%x\n", qattr->max_cqe);
2180 QL_DPRINT12(ha, "qattr->max_mw = 0x%x\n", qattr->max_mw);
2181 QL_DPRINT12(ha, "qattr->max_fmr = 0x%x\n", qattr->max_fmr);
2182 QL_DPRINT12(ha, "qattr->max_mr_mw_fmr_pbl = 0x%x\n",
2183 qattr->max_mr_mw_fmr_pbl);
2184 QL_DPRINT12(ha, "qattr->max_mr_mw_fmr_size = %p\n",
2185 (void *)qattr->max_mr_mw_fmr_size);
2186 QL_DPRINT12(ha, "qattr->max_pd = 0x%x\n", qattr->max_pd);
2187 QL_DPRINT12(ha, "qattr->max_ah = 0x%x\n", qattr->max_ah);
2188 QL_DPRINT12(ha, "qattr->max_pkey = 0x%x\n", qattr->max_pkey);
2189 QL_DPRINT12(ha, "qattr->max_srq_wr = 0x%x\n", qattr->max_srq_wr);
2190 QL_DPRINT12(ha, "qattr->max_stats_queues = 0x%x\n",
2191 qattr->max_stats_queues);
2192 //QL_DPRINT12(ha, "qattr->dev_caps = 0x%x\n", qattr->dev_caps);
2193 QL_DPRINT12(ha, "qattr->page_size_caps = %p\n",
2194 (void *)qattr->page_size_caps);
2195 QL_DPRINT12(ha, "qattr->dev_ack_delay = 0x%x\n", qattr->dev_ack_delay);
2196 QL_DPRINT12(ha, "qattr->reserved_lkey = 0x%x\n", qattr->reserved_lkey);
2197 QL_DPRINT12(ha, "qattr->bad_pkey_counter = 0x%x\n",
2198 qattr->bad_pkey_counter);
2200 if ((attrs->qp_type == IB_QPT_GSI) && udata) {
2201 QL_DPRINT12(ha, "unexpected udata when creating GSI QP\n");
2205 if (udata && !(ibpd->uobject && ibpd->uobject->context)) {
2206 QL_DPRINT12(ha, "called from user without context\n");
2210 /* QP0... attrs->qp_type == IB_QPT_GSI */
2211 if (attrs->qp_type != IB_QPT_RC && attrs->qp_type != IB_QPT_GSI) {
2212 QL_DPRINT12(ha, "unsupported qp type=0x%x requested\n",
2216 if (attrs->qp_type == IB_QPT_GSI && attrs->srq) {
2217 QL_DPRINT12(ha, "cannot create GSI qp with SRQ\n");
2220 /* Skip the check for QP1 to support CM size of 128 */
2221 if (attrs->cap.max_send_wr > qattr->max_wqe) {
2222 QL_DPRINT12(ha, "cannot create a SQ with %d elements "
2223 " (max_send_wr=0x%x)\n",
2224 attrs->cap.max_send_wr, qattr->max_wqe);
2227 if (!attrs->srq && (attrs->cap.max_recv_wr > qattr->max_wqe)) {
2228 QL_DPRINT12(ha, "cannot create a RQ with %d elements"
2229 " (max_recv_wr=0x%x)\n",
2230 attrs->cap.max_recv_wr, qattr->max_wqe);
2233 if (attrs->cap.max_inline_data > qattr->max_inline) {
2235 "unsupported inline data size=0x%x "
2236 "requested (max_inline=0x%x)\n",
2237 attrs->cap.max_inline_data, qattr->max_inline);
2240 if (attrs->cap.max_send_sge > qattr->max_sge) {
2242 "unsupported send_sge=0x%x "
2243 "requested (max_send_sge=0x%x)\n",
2244 attrs->cap.max_send_sge, qattr->max_sge);
2247 if (attrs->cap.max_recv_sge > qattr->max_sge) {
2249 "unsupported recv_sge=0x%x requested "
2250 " (max_recv_sge=0x%x)\n",
2251 attrs->cap.max_recv_sge, qattr->max_sge);
2254 /* unprivileged user space cannot create special QP */
2255 if (ibpd->uobject && attrs->qp_type == IB_QPT_GSI) {
2257 "userspace can't create special QPs of type=0x%x\n",
2261 /* allow creating only one GSI type of QP */
2262 if (attrs->qp_type == IB_QPT_GSI && dev->gsi_qp_created) {
2264 "create qp: GSI special QPs already created.\n");
2268 /* verify consumer QPs are not trying to use GSI QP's CQ */
2269 if ((attrs->qp_type != IB_QPT_GSI) && (dev->gsi_qp_created)) {
2270 struct qlnxr_cq *send_cq = get_qlnxr_cq(attrs->send_cq);
2271 struct qlnxr_cq *recv_cq = get_qlnxr_cq(attrs->recv_cq);
2273 if ((send_cq->cq_type == QLNXR_CQ_TYPE_GSI) ||
2274 (recv_cq->cq_type == QLNXR_CQ_TYPE_GSI)) {
2275 QL_DPRINT11(ha, "consumer QP cannot use GSI CQs.\n");
2279 QL_DPRINT12(ha, "exit\n");
2284 qlnxr_copy_srq_uresp(struct qlnxr_dev *dev,
2285 struct qlnxr_srq *srq,
2286 struct ib_udata *udata)
2288 struct qlnxr_create_srq_uresp uresp;
2294 QL_DPRINT12(ha, "enter\n");
2296 memset(&uresp, 0, sizeof(uresp));
2298 uresp.srq_id = srq->srq_id;
2300 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
2302 QL_DPRINT12(ha, "exit [%d]\n", rc);
2307 qlnxr_copy_rq_uresp(struct qlnxr_dev *dev,
2308 struct qlnxr_create_qp_uresp *uresp,
2309 struct qlnxr_qp *qp)
2315 /* Return if QP is associated with SRQ instead of RQ */
2316 QL_DPRINT12(ha, "enter qp->srq = %p\n", qp->srq);
2321 /* iWARP requires two doorbells per RQ. */
2322 if (QLNX_IS_IWARP(dev)) {
2324 uresp->rq_db_offset =
2325 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
2326 uresp->rq_db2_offset =
2327 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
2329 QL_DPRINT12(ha, "uresp->rq_db_offset = 0x%x "
2330 "uresp->rq_db2_offset = 0x%x\n",
2331 uresp->rq_db_offset, uresp->rq_db2_offset);
2333 uresp->rq_db_offset =
2334 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
2336 uresp->rq_icid = qp->icid;
2338 QL_DPRINT12(ha, "exit\n");
2343 qlnxr_copy_sq_uresp(struct qlnxr_dev *dev,
2344 struct qlnxr_create_qp_uresp *uresp,
2345 struct qlnxr_qp *qp)
2351 QL_DPRINT12(ha, "enter\n");
2353 uresp->sq_db_offset = DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
2355 /* iWARP uses the same cid for rq and sq*/
2356 if (QLNX_IS_IWARP(dev)) {
2357 uresp->sq_icid = qp->icid;
2358 QL_DPRINT12(ha, "uresp->sq_icid = 0x%x\n", uresp->sq_icid);
2360 uresp->sq_icid = qp->icid + 1;
2362 QL_DPRINT12(ha, "exit\n");
2367 qlnxr_copy_qp_uresp(struct qlnxr_dev *dev,
2368 struct qlnxr_qp *qp,
2369 struct ib_udata *udata)
2372 struct qlnxr_create_qp_uresp uresp;
2377 QL_DPRINT12(ha, "enter qp->icid =0x%x\n", qp->icid);
2379 memset(&uresp, 0, sizeof(uresp));
2380 qlnxr_copy_sq_uresp(dev, &uresp, qp);
2381 qlnxr_copy_rq_uresp(dev, &uresp, qp);
2383 uresp.atomic_supported = dev->atomic_cap != IB_ATOMIC_NONE;
2384 uresp.qp_id = qp->qp_id;
2386 rc = ib_copy_to_udata(udata, &uresp, sizeof(uresp));
2388 QL_DPRINT12(ha, "exit [%d]\n", rc);
2394 qlnxr_set_common_qp_params(struct qlnxr_dev *dev,
2395 struct qlnxr_qp *qp,
2396 struct qlnxr_pd *pd,
2397 struct ib_qp_init_attr *attrs)
2403 QL_DPRINT12(ha, "enter\n");
2405 spin_lock_init(&qp->q_lock);
2407 atomic_set(&qp->refcnt, 1);
2409 qp->sig = QLNXR_QP_MAGIC_NUMBER;
2410 qp->qp_type = attrs->qp_type;
2411 qp->max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
2412 qp->sq.max_sges = attrs->cap.max_send_sge;
2413 qp->state = ECORE_ROCE_QP_STATE_RESET;
2414 qp->signaled = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR) ? true : false;
2415 qp->sq_cq = get_qlnxr_cq(attrs->send_cq);
2416 qp->rq_cq = get_qlnxr_cq(attrs->recv_cq);
2420 /* QP is associated with RQ instead of SRQ */
2421 qp->rq.max_sges = attrs->cap.max_recv_sge;
2422 QL_DPRINT12(ha, "RQ params:\trq_max_sges = %d, rq_cq_id = %d\n",
2423 qp->rq.max_sges, qp->rq_cq->icid);
2425 qp->srq = get_qlnxr_srq(attrs->srq);
2429 "QP params:\tpd = %d, qp_type = %d, max_inline_data = %d,"
2430 " state = %d, signaled = %d, use_srq=%d\n",
2431 pd->pd_id, qp->qp_type, qp->max_inline_data,
2432 qp->state, qp->signaled, ((attrs->srq) ? 1 : 0));
2433 QL_DPRINT12(ha, "SQ params:\tsq_max_sges = %d, sq_cq_id = %d\n",
2434 qp->sq.max_sges, qp->sq_cq->icid);
2439 qlnxr_check_srq_params(struct ib_pd *ibpd,
2440 struct qlnxr_dev *dev,
2441 struct ib_srq_init_attr *attrs)
2443 struct ecore_rdma_device *qattr;
2447 qattr = ecore_rdma_query_device(dev->rdma_ctx);
2449 QL_DPRINT12(ha, "enter\n");
2451 if (attrs->attr.max_wr > qattr->max_srq_wqe) {
2452 QL_DPRINT12(ha, "unsupported srq_wr=0x%x"
2453 " requested (max_srq_wr=0x%x)\n",
2454 attrs->attr.max_wr, qattr->max_srq_wr);
2458 if (attrs->attr.max_sge > qattr->max_sge) {
2460 "unsupported sge=0x%x requested (max_srq_sge=0x%x)\n",
2461 attrs->attr.max_sge, qattr->max_sge);
2465 if (attrs->attr.srq_limit > attrs->attr.max_wr) {
2467 "unsupported srq_limit=0x%x requested"
2468 " (max_srq_limit=0x%x)\n",
2469 attrs->attr.srq_limit, attrs->attr.srq_limit);
2473 QL_DPRINT12(ha, "exit\n");
2479 qlnxr_free_srq_user_params(struct qlnxr_srq *srq)
2481 struct qlnxr_dev *dev = srq->dev;
2486 QL_DPRINT12(ha, "enter\n");
2488 qlnxr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
2489 ib_umem_release(srq->usrq.umem);
2490 ib_umem_release(srq->prod_umem);
2492 QL_DPRINT12(ha, "exit\n");
2497 qlnxr_free_srq_kernel_params(struct qlnxr_srq *srq)
2499 struct qlnxr_srq_hwq_info *hw_srq = &srq->hw_srq;
2500 struct qlnxr_dev *dev = srq->dev;
2505 QL_DPRINT12(ha, "enter\n");
2507 ecore_chain_free(dev->cdev, &hw_srq->pbl);
2509 qlnx_dma_free_coherent(&dev->cdev,
2510 hw_srq->virt_prod_pair_addr,
2511 hw_srq->phy_prod_pair_addr,
2512 sizeof(struct rdma_srq_producers));
2514 QL_DPRINT12(ha, "exit\n");
2520 qlnxr_init_srq_user_params(struct ib_ucontext *ib_ctx,
2521 struct qlnxr_srq *srq,
2522 struct qlnxr_create_srq_ureq *ureq,
2523 int access, int dmasync)
2525 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
2526 struct ib_umem_chunk *chunk;
2528 struct scatterlist *sg;
2530 struct qlnxr_dev *dev = srq->dev;
2535 QL_DPRINT12(ha, "enter\n");
2537 rc = qlnxr_init_user_queue(ib_ctx, srq->dev, &srq->usrq, ureq->srq_addr,
2538 ureq->srq_len, access, dmasync, 1);
2542 srq->prod_umem = ib_umem_get(ib_ctx, ureq->prod_pair_addr,
2543 sizeof(struct rdma_srq_producers),
2545 if (IS_ERR(srq->prod_umem)) {
2547 qlnxr_free_pbl(srq->dev, &srq->usrq.pbl_info, srq->usrq.pbl_tbl);
2548 ib_umem_release(srq->usrq.umem);
2550 QL_DPRINT12(ha, "ib_umem_get failed for producer [%p]\n",
2551 PTR_ERR(srq->prod_umem));
2553 return PTR_ERR(srq->prod_umem);
2556 #ifdef DEFINE_IB_UMEM_WITH_CHUNK
2557 chunk = container_of((&srq->prod_umem->chunk_list)->next,
2558 typeof(*chunk), list);
2559 sg = &chunk->page_list[0];
2561 sg = srq->prod_umem->sg_head.sgl;
2563 srq->hw_srq.phy_prod_pair_addr = sg_dma_address(sg);
2565 QL_DPRINT12(ha, "exit\n");
2571 qlnxr_alloc_srq_kernel_params(struct qlnxr_srq *srq,
2572 struct qlnxr_dev *dev,
2573 struct ib_srq_init_attr *init_attr)
2575 struct qlnxr_srq_hwq_info *hw_srq = &srq->hw_srq;
2576 dma_addr_t phy_prod_pair_addr;
2577 u32 num_elems, max_wr;
2584 QL_DPRINT12(ha, "enter\n");
2586 va = qlnx_dma_alloc_coherent(&dev->cdev,
2587 &phy_prod_pair_addr,
2588 sizeof(struct rdma_srq_producers));
2590 QL_DPRINT11(ha, "qlnx_dma_alloc_coherent failed for produceer\n");
2594 hw_srq->phy_prod_pair_addr = phy_prod_pair_addr;
2595 hw_srq->virt_prod_pair_addr = va;
2597 max_wr = init_attr->attr.max_wr;
2599 num_elems = max_wr * RDMA_MAX_SRQ_WQE_SIZE;
2601 rc = ecore_chain_alloc(dev->cdev,
2602 ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
2603 ECORE_CHAIN_MODE_PBL,
2604 ECORE_CHAIN_CNT_TYPE_U32,
2606 ECORE_RDMA_SRQ_WQE_ELEM_SIZE,
2607 &hw_srq->pbl, NULL);
2610 QL_DPRINT11(ha, "ecore_chain_alloc failed [%d]\n", rc);
2614 hw_srq->max_wr = max_wr;
2615 hw_srq->num_elems = num_elems;
2616 hw_srq->max_sges = RDMA_MAX_SGE_PER_SRQ;
2618 QL_DPRINT12(ha, "exit\n");
2622 qlnx_dma_free_coherent(&dev->cdev, va, phy_prod_pair_addr,
2623 sizeof(struct rdma_srq_producers));
2625 QL_DPRINT12(ha, "exit [%d]\n", rc);
2630 qlnxr_init_common_qp_in_params(struct qlnxr_dev *dev,
2631 struct qlnxr_pd *pd,
2632 struct qlnxr_qp *qp,
2633 struct ib_qp_init_attr *attrs,
2634 bool fmr_and_reserved_lkey,
2635 struct ecore_rdma_create_qp_in_params *params)
2641 QL_DPRINT12(ha, "enter\n");
2643 /* QP handle to be written in an async event */
2644 params->qp_handle_async_lo = lower_32_bits((uintptr_t)qp);
2645 params->qp_handle_async_hi = upper_32_bits((uintptr_t)qp);
2647 params->signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
2648 params->fmr_and_reserved_lkey = fmr_and_reserved_lkey;
2649 params->pd = pd->pd_id;
2650 params->dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
2651 params->sq_cq_id = get_qlnxr_cq(attrs->send_cq)->icid;
2652 params->stats_queue = 0;
2654 params->rq_cq_id = get_qlnxr_cq(attrs->recv_cq)->icid;
2657 /* QP is associated with SRQ instead of RQ */
2658 params->srq_id = qp->srq->srq_id;
2659 params->use_srq = true;
2660 QL_DPRINT11(ha, "exit srq_id = 0x%x use_srq = 0x%x\n",
2661 params->srq_id, params->use_srq);
2666 params->use_srq = false;
2668 QL_DPRINT12(ha, "exit\n");
2674 qlnxr_qp_user_print( struct qlnxr_dev *dev,
2675 struct qlnxr_qp *qp)
2677 QL_DPRINT12((dev->ha), "qp=%p. sq_addr=0x%llx, sq_len=%zd, "
2678 "rq_addr=0x%llx, rq_len=%zd\n",
2679 qp, qp->usq.buf_addr, qp->usq.buf_len, qp->urq.buf_addr,
2685 qlnxr_idr_add(struct qlnxr_dev *dev, void *ptr, u32 id)
2693 QL_DPRINT12(ha, "enter\n");
2695 if (!QLNX_IS_IWARP(dev))
2699 if (!idr_pre_get(&dev->qpidr, GFP_KERNEL)) {
2700 QL_DPRINT11(ha, "idr_pre_get failed\n");
2704 mtx_lock(&dev->idr_lock);
2706 rc = idr_get_new_above(&dev->qpidr, ptr, id, &newid);
2708 mtx_unlock(&dev->idr_lock);
2710 } while (rc == -EAGAIN);
2712 QL_DPRINT12(ha, "exit [%d]\n", rc);
2718 qlnxr_idr_remove(struct qlnxr_dev *dev, u32 id)
2724 QL_DPRINT12(ha, "enter\n");
2726 if (!QLNX_IS_IWARP(dev))
2729 mtx_lock(&dev->idr_lock);
2730 idr_remove(&dev->qpidr, id);
2731 mtx_unlock(&dev->idr_lock);
2733 QL_DPRINT12(ha, "exit \n");
2739 qlnxr_iwarp_populate_user_qp(struct qlnxr_dev *dev,
2740 struct qlnxr_qp *qp,
2741 struct ecore_rdma_create_qp_out_params *out_params)
2747 QL_DPRINT12(ha, "enter\n");
2749 qp->usq.pbl_tbl->va = out_params->sq_pbl_virt;
2750 qp->usq.pbl_tbl->pa = out_params->sq_pbl_phys;
2752 qlnxr_populate_pbls(dev, qp->usq.umem, qp->usq.pbl_tbl,
2756 QL_DPRINT11(ha, "qp->srq = %p\n", qp->srq);
2760 qp->urq.pbl_tbl->va = out_params->rq_pbl_virt;
2761 qp->urq.pbl_tbl->pa = out_params->rq_pbl_phys;
2763 qlnxr_populate_pbls(dev, qp->urq.umem, qp->urq.pbl_tbl,
2766 QL_DPRINT12(ha, "exit\n");
2771 qlnxr_create_user_qp(struct qlnxr_dev *dev,
2772 struct qlnxr_qp *qp,
2774 struct ib_udata *udata,
2775 struct ib_qp_init_attr *attrs)
2777 struct ecore_rdma_destroy_qp_out_params d_out_params;
2778 struct ecore_rdma_create_qp_in_params in_params;
2779 struct ecore_rdma_create_qp_out_params out_params;
2780 struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
2781 struct ib_ucontext *ib_ctx = NULL;
2782 struct qlnxr_ucontext *ctx = NULL;
2783 struct qlnxr_create_qp_ureq ureq;
2784 int alloc_and_init = QLNX_IS_ROCE(dev);
2790 QL_DPRINT12(ha, "enter\n");
2792 ib_ctx = ibpd->uobject->context;
2793 ctx = get_qlnxr_ucontext(ib_ctx);
2795 memset(&ureq, 0, sizeof(ureq));
2796 rc = ib_copy_from_udata(&ureq, udata, sizeof(ureq));
2799 QL_DPRINT11(ha, "ib_copy_from_udata failed [%d]\n", rc);
2803 /* SQ - read access only (0), dma sync not required (0) */
2804 rc = qlnxr_init_user_queue(ib_ctx, dev, &qp->usq, ureq.sq_addr,
2808 QL_DPRINT11(ha, "qlnxr_init_user_queue failed [%d]\n", rc);
2813 /* RQ - read access only (0), dma sync not required (0) */
2814 rc = qlnxr_init_user_queue(ib_ctx, dev, &qp->urq, ureq.rq_addr,
2819 QL_DPRINT11(ha, "qlnxr_init_user_queue failed [%d]\n", rc);
2824 memset(&in_params, 0, sizeof(in_params));
2825 qlnxr_init_common_qp_in_params(dev, pd, qp, attrs, false, &in_params);
2826 in_params.qp_handle_lo = ureq.qp_handle_lo;
2827 in_params.qp_handle_hi = ureq.qp_handle_hi;
2828 in_params.sq_num_pages = qp->usq.pbl_info.num_pbes;
2829 in_params.sq_pbl_ptr = qp->usq.pbl_tbl->pa;
2832 in_params.rq_num_pages = qp->urq.pbl_info.num_pbes;
2833 in_params.rq_pbl_ptr = qp->urq.pbl_tbl->pa;
2836 qp->ecore_qp = ecore_rdma_create_qp(dev->rdma_ctx, &in_params, &out_params);
2838 if (!qp->ecore_qp) {
2840 QL_DPRINT11(ha, "ecore_rdma_create_qp failed\n");
2844 if (QLNX_IS_IWARP(dev))
2845 qlnxr_iwarp_populate_user_qp(dev, qp, &out_params);
2847 qp->qp_id = out_params.qp_id;
2848 qp->icid = out_params.icid;
2850 rc = qlnxr_copy_qp_uresp(dev, qp, udata);
2853 QL_DPRINT11(ha, "qlnxr_copy_qp_uresp failed\n");
2857 qlnxr_qp_user_print(dev, qp);
2859 QL_DPRINT12(ha, "exit\n");
2862 rc = ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp, &d_out_params);
2865 QL_DPRINT12(ha, "fatal fault\n");
2868 qlnxr_cleanup_user(dev, qp);
2870 QL_DPRINT12(ha, "exit[%d]\n", rc);
2875 qlnxr_set_roce_db_info(struct qlnxr_dev *dev,
2876 struct qlnxr_qp *qp)
2882 QL_DPRINT12(ha, "enter qp = %p qp->srq %p\n", qp, qp->srq);
2884 qp->sq.db = dev->db_addr +
2885 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
2886 qp->sq.db_data.data.icid = qp->icid + 1;
2889 qp->rq.db = dev->db_addr +
2890 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_ROCE_RQ_PROD);
2891 qp->rq.db_data.data.icid = qp->icid;
2894 QL_DPRINT12(ha, "exit\n");
2899 qlnxr_set_iwarp_db_info(struct qlnxr_dev *dev,
2900 struct qlnxr_qp *qp)
2907 QL_DPRINT12(ha, "enter qp = %p qp->srq %p\n", qp, qp->srq);
2909 qp->sq.db = dev->db_addr +
2910 DB_ADDR_SHIFT(DQ_PWM_OFFSET_XCM_RDMA_SQ_PROD);
2911 qp->sq.db_data.data.icid = qp->icid;
2914 qp->rq.db = dev->db_addr +
2915 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_IWARP_RQ_PROD);
2916 qp->rq.db_data.data.icid = qp->icid;
2918 qp->rq.iwarp_db2 = dev->db_addr +
2919 DB_ADDR_SHIFT(DQ_PWM_OFFSET_TCM_FLAGS);
2920 qp->rq.iwarp_db2_data.data.icid = qp->icid;
2921 qp->rq.iwarp_db2_data.data.value = DQ_TCM_IWARP_POST_RQ_CF_CMD;
2925 "qp->sq.db = %p qp->sq.db_data.data.icid =0x%x\n"
2926 "\t\t\tqp->rq.db = %p qp->rq.db_data.data.icid =0x%x\n"
2927 "\t\t\tqp->rq.iwarp_db2 = %p qp->rq.iwarp_db2.data.icid =0x%x"
2928 " qp->rq.iwarp_db2.data.prod_val =0x%x\n",
2929 qp->sq.db, qp->sq.db_data.data.icid,
2930 qp->rq.db, qp->rq.db_data.data.icid,
2931 qp->rq.iwarp_db2, qp->rq.iwarp_db2_data.data.icid,
2932 qp->rq.iwarp_db2_data.data.value);
2934 QL_DPRINT12(ha, "exit\n");
2939 qlnxr_roce_create_kernel_qp(struct qlnxr_dev *dev,
2940 struct qlnxr_qp *qp,
2941 struct ecore_rdma_create_qp_in_params *in_params,
2945 struct ecore_rdma_create_qp_out_params out_params;
2951 QL_DPRINT12(ha, "enter\n");
2953 rc = ecore_chain_alloc(
2955 ECORE_CHAIN_USE_TO_PRODUCE,
2956 ECORE_CHAIN_MODE_PBL,
2957 ECORE_CHAIN_CNT_TYPE_U32,
2959 QLNXR_SQE_ELEMENT_SIZE,
2964 QL_DPRINT11(ha, "ecore_chain_alloc qp->sq.pbl failed[%d]\n", rc);
2968 in_params->sq_num_pages = ecore_chain_get_page_cnt(&qp->sq.pbl);
2969 in_params->sq_pbl_ptr = ecore_chain_get_pbl_phys(&qp->sq.pbl);
2973 rc = ecore_chain_alloc(
2975 ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
2976 ECORE_CHAIN_MODE_PBL,
2977 ECORE_CHAIN_CNT_TYPE_U32,
2979 QLNXR_RQE_ELEMENT_SIZE,
2985 "ecore_chain_alloc qp->rq.pbl failed[%d]\n", rc);
2989 in_params->rq_num_pages = ecore_chain_get_page_cnt(&qp->rq.pbl);
2990 in_params->rq_pbl_ptr = ecore_chain_get_pbl_phys(&qp->rq.pbl);
2993 qp->ecore_qp = ecore_rdma_create_qp(dev->rdma_ctx, in_params, &out_params);
2995 if (!qp->ecore_qp) {
2996 QL_DPRINT11(ha, "qp->ecore_qp == NULL\n");
3000 qp->qp_id = out_params.qp_id;
3001 qp->icid = out_params.icid;
3003 qlnxr_set_roce_db_info(dev, qp);
3005 QL_DPRINT12(ha, "exit\n");
3010 qlnxr_iwarp_create_kernel_qp(struct qlnxr_dev *dev,
3011 struct qlnxr_qp *qp,
3012 struct ecore_rdma_create_qp_in_params *in_params,
3016 struct ecore_rdma_destroy_qp_out_params d_out_params;
3017 struct ecore_rdma_create_qp_out_params out_params;
3018 struct ecore_chain_ext_pbl ext_pbl;
3024 QL_DPRINT12(ha, "enter\n");
3026 in_params->sq_num_pages = ECORE_CHAIN_PAGE_CNT(n_sq_elems,
3027 QLNXR_SQE_ELEMENT_SIZE,
3028 ECORE_CHAIN_MODE_PBL);
3029 in_params->rq_num_pages = ECORE_CHAIN_PAGE_CNT(n_rq_elems,
3030 QLNXR_RQE_ELEMENT_SIZE,
3031 ECORE_CHAIN_MODE_PBL);
3033 QL_DPRINT12(ha, "n_sq_elems = 0x%x"
3034 " n_rq_elems = 0x%x in_params\n"
3035 "\t\t\tqp_handle_lo\t\t= 0x%08x\n"
3036 "\t\t\tqp_handle_hi\t\t= 0x%08x\n"
3037 "\t\t\tqp_handle_async_lo\t\t= 0x%08x\n"
3038 "\t\t\tqp_handle_async_hi\t\t= 0x%08x\n"
3039 "\t\t\tuse_srq\t\t\t= 0x%x\n"
3040 "\t\t\tsignal_all\t\t= 0x%x\n"
3041 "\t\t\tfmr_and_reserved_lkey\t= 0x%x\n"
3042 "\t\t\tpd\t\t\t= 0x%x\n"
3043 "\t\t\tdpi\t\t\t= 0x%x\n"
3044 "\t\t\tsq_cq_id\t\t\t= 0x%x\n"
3045 "\t\t\tsq_num_pages\t\t= 0x%x\n"
3046 "\t\t\tsq_pbl_ptr\t\t= %p\n"
3047 "\t\t\tmax_sq_sges\t\t= 0x%x\n"
3048 "\t\t\trq_cq_id\t\t\t= 0x%x\n"
3049 "\t\t\trq_num_pages\t\t= 0x%x\n"
3050 "\t\t\trq_pbl_ptr\t\t= %p\n"
3051 "\t\t\tsrq_id\t\t\t= 0x%x\n"
3052 "\t\t\tstats_queue\t\t= 0x%x\n",
3053 n_sq_elems, n_rq_elems,
3054 in_params->qp_handle_lo,
3055 in_params->qp_handle_hi,
3056 in_params->qp_handle_async_lo,
3057 in_params->qp_handle_async_hi,
3059 in_params->signal_all,
3060 in_params->fmr_and_reserved_lkey,
3063 in_params->sq_cq_id,
3064 in_params->sq_num_pages,
3065 (void *)in_params->sq_pbl_ptr,
3066 in_params->max_sq_sges,
3067 in_params->rq_cq_id,
3068 in_params->rq_num_pages,
3069 (void *)in_params->rq_pbl_ptr,
3071 in_params->stats_queue );
3073 memset(&out_params, 0, sizeof (struct ecore_rdma_create_qp_out_params));
3074 memset(&ext_pbl, 0, sizeof (struct ecore_chain_ext_pbl));
3076 qp->ecore_qp = ecore_rdma_create_qp(dev->rdma_ctx, in_params, &out_params);
3078 if (!qp->ecore_qp) {
3079 QL_DPRINT11(ha, "ecore_rdma_create_qp failed\n");
3083 /* Now we allocate the chain */
3084 ext_pbl.p_pbl_virt = out_params.sq_pbl_virt;
3085 ext_pbl.p_pbl_phys = out_params.sq_pbl_phys;
3087 QL_DPRINT12(ha, "ext_pbl.p_pbl_virt = %p "
3088 "ext_pbl.p_pbl_phys = %p\n",
3089 ext_pbl.p_pbl_virt, ext_pbl.p_pbl_phys);
3091 rc = ecore_chain_alloc(
3093 ECORE_CHAIN_USE_TO_PRODUCE,
3094 ECORE_CHAIN_MODE_PBL,
3095 ECORE_CHAIN_CNT_TYPE_U32,
3097 QLNXR_SQE_ELEMENT_SIZE,
3103 "ecore_chain_alloc qp->sq.pbl failed rc = %d\n", rc);
3107 ext_pbl.p_pbl_virt = out_params.rq_pbl_virt;
3108 ext_pbl.p_pbl_phys = out_params.rq_pbl_phys;
3110 QL_DPRINT12(ha, "ext_pbl.p_pbl_virt = %p "
3111 "ext_pbl.p_pbl_phys = %p\n",
3112 ext_pbl.p_pbl_virt, ext_pbl.p_pbl_phys);
3116 rc = ecore_chain_alloc(
3118 ECORE_CHAIN_USE_TO_CONSUME_PRODUCE,
3119 ECORE_CHAIN_MODE_PBL,
3120 ECORE_CHAIN_CNT_TYPE_U32,
3122 QLNXR_RQE_ELEMENT_SIZE,
3127 QL_DPRINT11(ha,, "ecore_chain_alloc qp->rq.pbl"
3128 " failed rc = %d\n", rc);
3133 QL_DPRINT12(ha, "qp_id = 0x%x icid =0x%x\n",
3134 out_params.qp_id, out_params.icid);
3136 qp->qp_id = out_params.qp_id;
3137 qp->icid = out_params.icid;
3139 qlnxr_set_iwarp_db_info(dev, qp);
3141 QL_DPRINT12(ha, "exit\n");
3145 ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp, &d_out_params);
3147 QL_DPRINT12(ha, "exit rc = %d\n", rc);
3152 qlnxr_create_kernel_qp(struct qlnxr_dev *dev,
3153 struct qlnxr_qp *qp,
3155 struct ib_qp_init_attr *attrs)
3157 struct ecore_rdma_create_qp_in_params in_params;
3158 struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
3163 struct ecore_rdma_device *qattr = ecore_rdma_query_device(dev->rdma_ctx);
3168 QL_DPRINT12(ha, "enter\n");
3170 memset(&in_params, 0, sizeof(in_params));
3172 /* A single work request may take up to MAX_SQ_WQE_SIZE elements in
3173 * the ring. The ring should allow at least a single WR, even if the
3174 * user requested none, due to allocation issues.
3175 * We should add an extra WR since the prod and cons indices of
3176 * wqe_wr_id are managed in such a way that the WQ is considered full
3177 * when (prod+1)%max_wr==cons. We currently don't do that because we
3178 * double the number of entries due an iSER issue that pushes far more
3179 * WRs than indicated. If we decline its ib_post_send() then we get
3180 * error prints in the dmesg we'd like to avoid.
3182 qp->sq.max_wr = min_t(u32, attrs->cap.max_send_wr * dev->wq_multiplier,
3185 qp->wqe_wr_id = kzalloc(qp->sq.max_wr * sizeof(*qp->wqe_wr_id),
3187 if (!qp->wqe_wr_id) {
3188 QL_DPRINT11(ha, "failed SQ shadow memory allocation\n");
3192 /* QP handle to be written in CQE */
3193 in_params.qp_handle_lo = lower_32_bits((uintptr_t)qp);
3194 in_params.qp_handle_hi = upper_32_bits((uintptr_t)qp);
3196 /* A single work request may take up to MAX_RQ_WQE_SIZE elements in
3197 * the ring. There ring should allow at least a single WR, even if the
3198 * user requested none, due to allocation issues.
3200 qp->rq.max_wr = (u16)max_t(u32, attrs->cap.max_recv_wr, 1);
3202 /* Allocate driver internal RQ array */
3204 qp->rqe_wr_id = kzalloc(qp->rq.max_wr * sizeof(*qp->rqe_wr_id),
3206 if (!qp->rqe_wr_id) {
3207 QL_DPRINT11(ha, "failed RQ shadow memory allocation\n");
3208 kfree(qp->wqe_wr_id);
3213 //qlnxr_init_common_qp_in_params(dev, pd, qp, attrs, true, &in_params);
3215 in_params.qp_handle_async_lo = lower_32_bits((uintptr_t)qp);
3216 in_params.qp_handle_async_hi = upper_32_bits((uintptr_t)qp);
3218 in_params.signal_all = (attrs->sq_sig_type == IB_SIGNAL_ALL_WR);
3219 in_params.fmr_and_reserved_lkey = true;
3220 in_params.pd = pd->pd_id;
3221 in_params.dpi = pd->uctx ? pd->uctx->dpi : dev->dpi;
3222 in_params.sq_cq_id = get_qlnxr_cq(attrs->send_cq)->icid;
3223 in_params.stats_queue = 0;
3225 in_params.rq_cq_id = get_qlnxr_cq(attrs->recv_cq)->icid;
3228 /* QP is associated with SRQ instead of RQ */
3229 in_params.srq_id = qp->srq->srq_id;
3230 in_params.use_srq = true;
3231 QL_DPRINT11(ha, "exit srq_id = 0x%x use_srq = 0x%x\n",
3232 in_params.srq_id, in_params.use_srq);
3234 in_params.srq_id = 0;
3235 in_params.use_srq = false;
3238 n_sq_entries = attrs->cap.max_send_wr;
3239 n_sq_entries = min_t(u32, n_sq_entries, qattr->max_wqe);
3240 n_sq_entries = max_t(u32, n_sq_entries, 1);
3241 n_sq_elems = n_sq_entries * QLNXR_MAX_SQE_ELEMENTS_PER_SQE;
3243 n_rq_elems = qp->rq.max_wr * QLNXR_MAX_RQE_ELEMENTS_PER_RQE;
3245 if (QLNX_IS_ROCE(dev)) {
3246 rc = qlnxr_roce_create_kernel_qp(dev, qp, &in_params,
3247 n_sq_elems, n_rq_elems);
3249 rc = qlnxr_iwarp_create_kernel_qp(dev, qp, &in_params,
3250 n_sq_elems, n_rq_elems);
3254 qlnxr_cleanup_kernel(dev, qp);
3256 QL_DPRINT12(ha, "exit [%d]\n", rc);
3261 qlnxr_create_qp(struct ib_pd *ibpd,
3262 struct ib_qp_init_attr *attrs,
3263 struct ib_udata *udata)
3265 struct qlnxr_dev *dev = get_qlnxr_dev(ibpd->device);
3266 struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
3267 struct qlnxr_qp *qp;
3273 QL_DPRINT12(ha, "enter\n");
3275 rc = qlnxr_check_qp_attrs(ibpd, dev, attrs, udata);
3277 QL_DPRINT11(ha, "qlnxr_check_qp_attrs failed [%d]\n", rc);
3281 QL_DPRINT12(ha, "called from %s, event_handle=%p,"
3282 " eepd=%p sq_cq=%p, sq_icid=%d, rq_cq=%p, rq_icid=%d\n",
3283 (udata ? "user library" : "kernel"),
3284 attrs->event_handler, pd,
3285 get_qlnxr_cq(attrs->send_cq),
3286 get_qlnxr_cq(attrs->send_cq)->icid,
3287 get_qlnxr_cq(attrs->recv_cq),
3288 get_qlnxr_cq(attrs->recv_cq)->icid);
3290 qp = qlnx_zalloc(sizeof(struct qlnxr_qp));
3293 QL_DPRINT11(ha, "kzalloc(qp) failed\n");
3294 return ERR_PTR(-ENOMEM);
3297 qlnxr_set_common_qp_params(dev, qp, pd, attrs);
3299 if (attrs->qp_type == IB_QPT_GSI) {
3300 QL_DPRINT11(ha, "calling qlnxr_create_gsi_qp\n");
3301 return qlnxr_create_gsi_qp(dev, attrs, qp);
3305 rc = qlnxr_create_user_qp(dev, qp, ibpd, udata, attrs);
3308 QL_DPRINT11(ha, "qlnxr_create_user_qp failed\n");
3312 rc = qlnxr_create_kernel_qp(dev, qp, ibpd, attrs);
3315 QL_DPRINT11(ha, "qlnxr_create_kernel_qp failed\n");
3320 qp->ibqp.qp_num = qp->qp_id;
3322 rc = qlnxr_idr_add(dev, qp, qp->qp_id);
3325 QL_DPRINT11(ha, "qlnxr_idr_add failed\n");
3329 QL_DPRINT12(ha, "exit [%p]\n", &qp->ibqp);
3335 QL_DPRINT12(ha, "failed exit\n");
3336 return ERR_PTR(-EFAULT);
3340 static enum ib_qp_state
3341 qlnxr_get_ibqp_state(enum ecore_roce_qp_state qp_state)
3343 enum ib_qp_state state = IB_QPS_ERR;
3346 case ECORE_ROCE_QP_STATE_RESET:
3347 state = IB_QPS_RESET;
3350 case ECORE_ROCE_QP_STATE_INIT:
3351 state = IB_QPS_INIT;
3354 case ECORE_ROCE_QP_STATE_RTR:
3358 case ECORE_ROCE_QP_STATE_RTS:
3362 case ECORE_ROCE_QP_STATE_SQD:
3366 case ECORE_ROCE_QP_STATE_ERR:
3370 case ECORE_ROCE_QP_STATE_SQE:
3377 static enum ecore_roce_qp_state
3378 qlnxr_get_state_from_ibqp( enum ib_qp_state qp_state)
3380 enum ecore_roce_qp_state ecore_qp_state;
3382 ecore_qp_state = ECORE_ROCE_QP_STATE_ERR;
3386 ecore_qp_state = ECORE_ROCE_QP_STATE_RESET;
3390 ecore_qp_state = ECORE_ROCE_QP_STATE_INIT;
3394 ecore_qp_state = ECORE_ROCE_QP_STATE_RTR;
3398 ecore_qp_state = ECORE_ROCE_QP_STATE_RTS;
3402 ecore_qp_state = ECORE_ROCE_QP_STATE_SQD;
3406 ecore_qp_state = ECORE_ROCE_QP_STATE_ERR;
3410 ecore_qp_state = ECORE_ROCE_QP_STATE_ERR;
3414 return (ecore_qp_state);
3418 qlnxr_reset_qp_hwq_info(struct qlnxr_qp_hwq_info *qph)
3420 ecore_chain_reset(&qph->pbl);
3421 qph->prod = qph->cons = 0;
3423 qph->db_data.data.value = cpu_to_le16(0);
3429 qlnxr_update_qp_state(struct qlnxr_dev *dev,
3430 struct qlnxr_qp *qp,
3431 enum ecore_roce_qp_state new_state)
3435 struct ecore_dev *cdev;
3441 QL_DPRINT12(ha, "enter qp = %p new_state = 0x%x qp->state = 0x%x\n",
3442 qp, new_state, qp->state);
3444 if (new_state == qp->state) {
3448 switch (qp->state) {
3449 case ECORE_ROCE_QP_STATE_RESET:
3450 switch (new_state) {
3451 case ECORE_ROCE_QP_STATE_INIT:
3452 qp->prev_wqe_size = 0;
3453 qlnxr_reset_qp_hwq_info(&qp->sq);
3455 qlnxr_reset_qp_hwq_info(&qp->rq);
3462 case ECORE_ROCE_QP_STATE_INIT:
3464 switch (new_state) {
3465 case ECORE_ROCE_QP_STATE_RTR:
3466 /* Update doorbell (in case post_recv was done before move to RTR) */
3470 //writel(qp->rq.db_data.raw, qp->rq.db);
3471 //if (QLNX_IS_IWARP(dev))
3472 // writel(qp->rq.iwarp_db2_data.raw,
3473 // qp->rq.iwarp_db2);
3475 reg_addr = (uint32_t)((uint8_t *)qp->rq.db -
3476 (uint8_t *)cdev->doorbells);
3478 bus_write_4(ha->pci_dbells, reg_addr, qp->rq.db_data.raw);
3479 bus_barrier(ha->pci_dbells, 0, 0, BUS_SPACE_BARRIER_READ);
3481 if (QLNX_IS_IWARP(dev)) {
3482 reg_addr = (uint32_t)((uint8_t *)qp->rq.iwarp_db2 -
3483 (uint8_t *)cdev->doorbells);
3484 bus_write_4(ha->pci_dbells, reg_addr,\
3485 qp->rq.iwarp_db2_data.raw);
3486 bus_barrier(ha->pci_dbells, 0, 0,\
3487 BUS_SPACE_BARRIER_READ);
3493 case ECORE_ROCE_QP_STATE_ERR:
3494 /* TBD:flush qps... */
3497 /* invalid state change. */
3502 case ECORE_ROCE_QP_STATE_RTR:
3504 switch (new_state) {
3505 case ECORE_ROCE_QP_STATE_RTS:
3507 case ECORE_ROCE_QP_STATE_ERR:
3510 /* invalid state change. */
3515 case ECORE_ROCE_QP_STATE_RTS:
3517 switch (new_state) {
3518 case ECORE_ROCE_QP_STATE_SQD:
3520 case ECORE_ROCE_QP_STATE_ERR:
3523 /* invalid state change. */
3528 case ECORE_ROCE_QP_STATE_SQD:
3530 switch (new_state) {
3531 case ECORE_ROCE_QP_STATE_RTS:
3532 case ECORE_ROCE_QP_STATE_ERR:
3535 /* invalid state change. */
3540 case ECORE_ROCE_QP_STATE_ERR:
3542 switch (new_state) {
3543 case ECORE_ROCE_QP_STATE_RESET:
3544 if ((qp->rq.prod != qp->rq.cons) ||
3545 (qp->sq.prod != qp->sq.cons)) {
3547 "Error->Reset with rq/sq "
3548 "not empty rq.prod=0x%x rq.cons=0x%x"
3549 " sq.prod=0x%x sq.cons=0x%x\n",
3550 qp->rq.prod, qp->rq.cons,
3551 qp->sq.prod, qp->sq.cons);
3565 QL_DPRINT12(ha, "exit\n");
3570 qlnxr_modify_qp(struct ib_qp *ibqp,
3571 struct ib_qp_attr *attr,
3573 struct ib_udata *udata)
3576 struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
3577 struct qlnxr_dev *dev = get_qlnxr_dev(&qp->dev->ibdev);
3578 struct ecore_rdma_modify_qp_in_params qp_params = { 0 };
3579 enum ib_qp_state old_qp_state, new_qp_state;
3580 struct ecore_rdma_device *qattr = ecore_rdma_query_device(dev->rdma_ctx);
3586 "enter qp = %p attr_mask = 0x%x, state = %d udata = %p\n",
3587 qp, attr_mask, attr->qp_state, udata);
3589 old_qp_state = qlnxr_get_ibqp_state(qp->state);
3590 if (attr_mask & IB_QP_STATE)
3591 new_qp_state = attr->qp_state;
3593 new_qp_state = old_qp_state;
3595 if (QLNX_IS_ROCE(dev)) {
3596 #if __FreeBSD_version >= 1100000
3597 if (!ib_modify_qp_is_ok(old_qp_state,
3601 IB_LINK_LAYER_ETHERNET)) {
3603 "invalid attribute mask=0x%x"
3604 " specified for qpn=0x%x of type=0x%x \n"
3605 " old_qp_state=0x%x, new_qp_state=0x%x\n",
3606 attr_mask, qp->qp_id, ibqp->qp_type,
3607 old_qp_state, new_qp_state);
3612 if (!ib_modify_qp_is_ok(old_qp_state,
3617 "invalid attribute mask=0x%x"
3618 " specified for qpn=0x%x of type=0x%x \n"
3619 " old_qp_state=0x%x, new_qp_state=0x%x\n",
3620 attr_mask, qp->qp_id, ibqp->qp_type,
3621 old_qp_state, new_qp_state);
3626 #endif /* #if __FreeBSD_version >= 1100000 */
3628 /* translate the masks... */
3629 if (attr_mask & IB_QP_STATE) {
3630 SET_FIELD(qp_params.modify_flags,
3631 ECORE_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
3632 qp_params.new_state = qlnxr_get_state_from_ibqp(attr->qp_state);
3635 // TBD consider changing ecore to be a flag as well...
3636 if (attr_mask & IB_QP_EN_SQD_ASYNC_NOTIFY)
3637 qp_params.sqd_async = true;
3639 if (attr_mask & IB_QP_PKEY_INDEX) {
3640 SET_FIELD(qp_params.modify_flags,
3641 ECORE_ROCE_MODIFY_QP_VALID_PKEY,
3643 if (attr->pkey_index >= QLNXR_ROCE_PKEY_TABLE_LEN) {
3648 qp_params.pkey = QLNXR_ROCE_PKEY_DEFAULT;
3651 if (attr_mask & IB_QP_QKEY) {
3652 qp->qkey = attr->qkey;
3655 /* tbd consider splitting in ecore.. */
3656 if (attr_mask & IB_QP_ACCESS_FLAGS) {
3657 SET_FIELD(qp_params.modify_flags,
3658 ECORE_RDMA_MODIFY_QP_VALID_RDMA_OPS_EN, 1);
3659 qp_params.incoming_rdma_read_en =
3660 attr->qp_access_flags & IB_ACCESS_REMOTE_READ;
3661 qp_params.incoming_rdma_write_en =
3662 attr->qp_access_flags & IB_ACCESS_REMOTE_WRITE;
3663 qp_params.incoming_atomic_en =
3664 attr->qp_access_flags & IB_ACCESS_REMOTE_ATOMIC;
3667 if (attr_mask & (IB_QP_AV | IB_QP_PATH_MTU)) {
3668 if (attr_mask & IB_QP_PATH_MTU) {
3669 if (attr->path_mtu < IB_MTU_256 ||
3670 attr->path_mtu > IB_MTU_4096) {
3673 "Only MTU sizes of 256, 512, 1024,"
3674 " 2048 and 4096 are supported "
3675 " attr->path_mtu = [%d]\n",
3681 qp->mtu = min(ib_mtu_enum_to_int(attr->path_mtu),
3683 iboe_get_mtu(dev->ha->ifp->if_mtu)));
3687 qp->mtu = ib_mtu_enum_to_int(
3688 iboe_get_mtu(dev->ha->ifp->if_mtu));
3689 QL_DPRINT12(ha, "fixing zetoed MTU to qp->mtu = %d\n",
3693 SET_FIELD(qp_params.modify_flags,
3694 ECORE_ROCE_MODIFY_QP_VALID_ADDRESS_VECTOR,
3697 qp_params.traffic_class_tos = attr->ah_attr.grh.traffic_class;
3698 qp_params.flow_label = attr->ah_attr.grh.flow_label;
3699 qp_params.hop_limit_ttl = attr->ah_attr.grh.hop_limit;
3701 qp->sgid_idx = attr->ah_attr.grh.sgid_index;
3703 get_gid_info(ibqp, attr, attr_mask, dev, qp, &qp_params);
3705 rc = qlnxr_get_dmac(dev, &attr->ah_attr, qp_params.remote_mac_addr);
3709 qp_params.use_local_mac = true;
3710 memcpy(qp_params.local_mac_addr, dev->ha->primary_mac, ETH_ALEN);
3712 QL_DPRINT12(ha, "dgid=0x%x:0x%x:0x%x:0x%x\n",
3713 qp_params.dgid.dwords[0], qp_params.dgid.dwords[1],
3714 qp_params.dgid.dwords[2], qp_params.dgid.dwords[3]);
3715 QL_DPRINT12(ha, "sgid=0x%x:0x%x:0x%x:0x%x\n",
3716 qp_params.sgid.dwords[0], qp_params.sgid.dwords[1],
3717 qp_params.sgid.dwords[2], qp_params.sgid.dwords[3]);
3719 "remote_mac=[0x%x:0x%x:0x%x:0x%x:0x%x:0x%x]\n",
3720 qp_params.remote_mac_addr[0],
3721 qp_params.remote_mac_addr[1],
3722 qp_params.remote_mac_addr[2],
3723 qp_params.remote_mac_addr[3],
3724 qp_params.remote_mac_addr[4],
3725 qp_params.remote_mac_addr[5]);
3727 qp_params.mtu = qp->mtu;
3730 if (qp_params.mtu == 0) {
3731 /* stay with current MTU */
3733 qp_params.mtu = qp->mtu;
3735 qp_params.mtu = ib_mtu_enum_to_int(
3736 iboe_get_mtu(dev->ha->ifp->if_mtu));
3740 if (attr_mask & IB_QP_TIMEOUT) {
3741 SET_FIELD(qp_params.modify_flags, \
3742 ECORE_ROCE_MODIFY_QP_VALID_ACK_TIMEOUT, 1);
3744 qp_params.ack_timeout = attr->timeout;
3745 if (attr->timeout) {
3748 /* 12.7.34 LOCAL ACK TIMEOUT
3749 * Value representing the transport (ACK) timeout for
3750 * use by the remote, expressed as (4.096 μS*2Local ACK
3753 /* We use 1UL since the temporal value may be overflow
3756 temp = 4096 * (1UL << attr->timeout) / 1000 / 1000;
3757 qp_params.ack_timeout = temp; /* FW requires [msec] */
3760 qp_params.ack_timeout = 0; /* infinite */
3762 if (attr_mask & IB_QP_RETRY_CNT) {
3763 SET_FIELD(qp_params.modify_flags,\
3764 ECORE_ROCE_MODIFY_QP_VALID_RETRY_CNT, 1);
3765 qp_params.retry_cnt = attr->retry_cnt;
3768 if (attr_mask & IB_QP_RNR_RETRY) {
3769 SET_FIELD(qp_params.modify_flags,
3770 ECORE_ROCE_MODIFY_QP_VALID_RNR_RETRY_CNT,
3772 qp_params.rnr_retry_cnt = attr->rnr_retry;
3775 if (attr_mask & IB_QP_RQ_PSN) {
3776 SET_FIELD(qp_params.modify_flags,
3777 ECORE_ROCE_MODIFY_QP_VALID_RQ_PSN,
3779 qp_params.rq_psn = attr->rq_psn;
3780 qp->rq_psn = attr->rq_psn;
3783 if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC) {
3784 if (attr->max_rd_atomic > qattr->max_qp_req_rd_atomic_resc) {
3787 "unsupported max_rd_atomic=%d, supported=%d\n",
3788 attr->max_rd_atomic,
3789 qattr->max_qp_req_rd_atomic_resc);
3793 SET_FIELD(qp_params.modify_flags,
3794 ECORE_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_REQ,
3796 qp_params.max_rd_atomic_req = attr->max_rd_atomic;
3799 if (attr_mask & IB_QP_MIN_RNR_TIMER) {
3800 SET_FIELD(qp_params.modify_flags,
3801 ECORE_ROCE_MODIFY_QP_VALID_MIN_RNR_NAK_TIMER,
3803 qp_params.min_rnr_nak_timer = attr->min_rnr_timer;
3806 if (attr_mask & IB_QP_SQ_PSN) {
3807 SET_FIELD(qp_params.modify_flags,
3808 ECORE_ROCE_MODIFY_QP_VALID_SQ_PSN,
3810 qp_params.sq_psn = attr->sq_psn;
3811 qp->sq_psn = attr->sq_psn;
3814 if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) {
3815 if (attr->max_dest_rd_atomic >
3816 qattr->max_qp_resp_rd_atomic_resc) {
3818 "unsupported max_dest_rd_atomic=%d, "
3820 attr->max_dest_rd_atomic,
3821 qattr->max_qp_resp_rd_atomic_resc);
3827 SET_FIELD(qp_params.modify_flags,
3828 ECORE_RDMA_MODIFY_QP_VALID_MAX_RD_ATOMIC_RESP,
3830 qp_params.max_rd_atomic_resp = attr->max_dest_rd_atomic;
3833 if (attr_mask & IB_QP_DEST_QPN) {
3834 SET_FIELD(qp_params.modify_flags,
3835 ECORE_ROCE_MODIFY_QP_VALID_DEST_QP,
3838 qp_params.dest_qp = attr->dest_qp_num;
3839 qp->dest_qp_num = attr->dest_qp_num;
3843 * Update the QP state before the actual ramrod to prevent a race with
3844 * fast path. Modifying the QP state to error will cause the device to
3845 * flush the CQEs and while polling the flushed CQEs will considered as
3846 * a potential issue if the QP isn't in error state.
3848 if ((attr_mask & IB_QP_STATE) && (qp->qp_type != IB_QPT_GSI) &&
3849 (!udata) && (qp_params.new_state == ECORE_ROCE_QP_STATE_ERR))
3850 qp->state = ECORE_ROCE_QP_STATE_ERR;
3852 if (qp->qp_type != IB_QPT_GSI)
3853 rc = ecore_rdma_modify_qp(dev->rdma_ctx, qp->ecore_qp, &qp_params);
3855 if (attr_mask & IB_QP_STATE) {
3856 if ((qp->qp_type != IB_QPT_GSI) && (!udata))
3857 rc = qlnxr_update_qp_state(dev, qp, qp_params.new_state);
3858 qp->state = qp_params.new_state;
3862 QL_DPRINT12(ha, "exit\n");
3867 qlnxr_to_ib_qp_acc_flags(struct ecore_rdma_query_qp_out_params *params)
3869 int ib_qp_acc_flags = 0;
3871 if (params->incoming_rdma_write_en)
3872 ib_qp_acc_flags |= IB_ACCESS_REMOTE_WRITE;
3873 if (params->incoming_rdma_read_en)
3874 ib_qp_acc_flags |= IB_ACCESS_REMOTE_READ;
3875 if (params->incoming_atomic_en)
3876 ib_qp_acc_flags |= IB_ACCESS_REMOTE_ATOMIC;
3877 if (true) /* FIXME -> local write ?? */
3878 ib_qp_acc_flags |= IB_ACCESS_LOCAL_WRITE;
3880 return ib_qp_acc_flags;
3884 qlnxr_mtu_int_to_enum(u16 mtu)
3886 enum ib_mtu ib_mtu_size;
3890 ib_mtu_size = IB_MTU_256;
3894 ib_mtu_size = IB_MTU_512;
3898 ib_mtu_size = IB_MTU_1024;
3902 ib_mtu_size = IB_MTU_2048;
3906 ib_mtu_size = IB_MTU_4096;
3910 ib_mtu_size = IB_MTU_1024;
3913 return (ib_mtu_size);
3917 qlnxr_query_qp(struct ib_qp *ibqp,
3918 struct ib_qp_attr *qp_attr,
3920 struct ib_qp_init_attr *qp_init_attr)
3923 struct ecore_rdma_query_qp_out_params params;
3924 struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
3925 struct qlnxr_dev *dev = qp->dev;
3930 QL_DPRINT12(ha, "enter\n");
3932 memset(¶ms, 0, sizeof(params));
3934 rc = ecore_rdma_query_qp(dev->rdma_ctx, qp->ecore_qp, ¶ms);
3938 memset(qp_attr, 0, sizeof(*qp_attr));
3939 memset(qp_init_attr, 0, sizeof(*qp_init_attr));
3941 qp_attr->qp_state = qlnxr_get_ibqp_state(params.state);
3942 qp_attr->cur_qp_state = qlnxr_get_ibqp_state(params.state);
3944 /* In some cases in iWARP qelr will ask for the state only */
3945 if (QLNX_IS_IWARP(dev) && (attr_mask == IB_QP_STATE)) {
3946 QL_DPRINT11(ha, "only state requested\n");
3950 qp_attr->path_mtu = qlnxr_mtu_int_to_enum(params.mtu);
3951 qp_attr->path_mig_state = IB_MIG_MIGRATED;
3952 qp_attr->rq_psn = params.rq_psn;
3953 qp_attr->sq_psn = params.sq_psn;
3954 qp_attr->dest_qp_num = params.dest_qp;
3956 qp_attr->qp_access_flags = qlnxr_to_ib_qp_acc_flags(¶ms);
3958 QL_DPRINT12(ha, "qp_state = 0x%x cur_qp_state = 0x%x "
3959 "path_mtu = %d qp_access_flags = 0x%x\n",
3960 qp_attr->qp_state, qp_attr->cur_qp_state, qp_attr->path_mtu,
3961 qp_attr->qp_access_flags);
3963 qp_attr->cap.max_send_wr = qp->sq.max_wr;
3964 qp_attr->cap.max_recv_wr = qp->rq.max_wr;
3965 qp_attr->cap.max_send_sge = qp->sq.max_sges;
3966 qp_attr->cap.max_recv_sge = qp->rq.max_sges;
3967 qp_attr->cap.max_inline_data = qp->max_inline_data;
3968 qp_init_attr->cap = qp_attr->cap;
3970 memcpy(&qp_attr->ah_attr.grh.dgid.raw[0], ¶ms.dgid.bytes[0],
3971 sizeof(qp_attr->ah_attr.grh.dgid.raw));
3973 qp_attr->ah_attr.grh.flow_label = params.flow_label;
3974 qp_attr->ah_attr.grh.sgid_index = qp->sgid_idx;
3975 qp_attr->ah_attr.grh.hop_limit = params.hop_limit_ttl;
3976 qp_attr->ah_attr.grh.traffic_class = params.traffic_class_tos;
3978 qp_attr->ah_attr.ah_flags = IB_AH_GRH;
3979 qp_attr->ah_attr.port_num = 1; /* FIXME -> check this */
3980 qp_attr->ah_attr.sl = 0;/* FIXME -> check this */
3981 qp_attr->timeout = params.timeout;
3982 qp_attr->rnr_retry = params.rnr_retry;
3983 qp_attr->retry_cnt = params.retry_cnt;
3984 qp_attr->min_rnr_timer = params.min_rnr_nak_timer;
3985 qp_attr->pkey_index = params.pkey_index;
3986 qp_attr->port_num = 1; /* FIXME -> check this */
3987 qp_attr->ah_attr.src_path_bits = 0;
3988 qp_attr->ah_attr.static_rate = 0;
3989 qp_attr->alt_pkey_index = 0;
3990 qp_attr->alt_port_num = 0;
3991 qp_attr->alt_timeout = 0;
3992 memset(&qp_attr->alt_ah_attr, 0, sizeof(qp_attr->alt_ah_attr));
3994 qp_attr->sq_draining = (params.state == ECORE_ROCE_QP_STATE_SQD) ? 1 : 0;
3995 qp_attr->max_dest_rd_atomic = params.max_dest_rd_atomic;
3996 qp_attr->max_rd_atomic = params.max_rd_atomic;
3997 qp_attr->en_sqd_async_notify = (params.sqd_async)? 1 : 0;
3999 QL_DPRINT12(ha, "max_inline_data=%d\n",
4000 qp_attr->cap.max_inline_data);
4003 QL_DPRINT12(ha, "exit\n");
4009 qlnxr_cleanup_user(struct qlnxr_dev *dev, struct qlnxr_qp *qp)
4015 QL_DPRINT12(ha, "enter\n");
4018 ib_umem_release(qp->usq.umem);
4020 qp->usq.umem = NULL;
4023 ib_umem_release(qp->urq.umem);
4025 qp->urq.umem = NULL;
4027 QL_DPRINT12(ha, "exit\n");
4032 qlnxr_cleanup_kernel(struct qlnxr_dev *dev, struct qlnxr_qp *qp)
4038 QL_DPRINT12(ha, "enter\n");
4040 if (qlnxr_qp_has_sq(qp)) {
4041 QL_DPRINT12(ha, "freeing SQ\n");
4042 ha->qlnxr_debug = 1;
4043 // ecore_chain_free(dev->cdev, &qp->sq.pbl);
4044 ha->qlnxr_debug = 0;
4045 kfree(qp->wqe_wr_id);
4048 if (qlnxr_qp_has_rq(qp)) {
4049 QL_DPRINT12(ha, "freeing RQ\n");
4050 ha->qlnxr_debug = 1;
4051 // ecore_chain_free(dev->cdev, &qp->rq.pbl);
4052 ha->qlnxr_debug = 0;
4053 kfree(qp->rqe_wr_id);
4056 QL_DPRINT12(ha, "exit\n");
4061 qlnxr_free_qp_resources(struct qlnxr_dev *dev,
4062 struct qlnxr_qp *qp)
4066 struct ecore_rdma_destroy_qp_out_params d_out_params;
4070 QL_DPRINT12(ha, "enter\n");
4073 if (qp->qp_type != IB_QPT_GSI) {
4074 rc = ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp,
4080 if (qp->ibqp.uobject && qp->ibqp.uobject->context)
4081 qlnxr_cleanup_user(dev, qp);
4083 qlnxr_cleanup_kernel(dev, qp);
4086 if (qp->ibqp.uobject && qp->ibqp.uobject->context)
4087 qlnxr_cleanup_user(dev, qp);
4089 qlnxr_cleanup_kernel(dev, qp);
4091 if (qp->qp_type != IB_QPT_GSI) {
4092 rc = ecore_rdma_destroy_qp(dev->rdma_ctx, qp->ecore_qp,
4098 QL_DPRINT12(ha, "exit\n");
4103 qlnxr_destroy_qp(struct ib_qp *ibqp)
4105 struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
4106 struct qlnxr_dev *dev = qp->dev;
4108 struct ib_qp_attr attr;
4114 QL_DPRINT12(ha, "enter qp = %p, qp_type=%d\n", qp, qp->qp_type);
4118 if (QLNX_IS_ROCE(dev) && (qp->state != (ECORE_ROCE_QP_STATE_RESET |
4119 ECORE_ROCE_QP_STATE_ERR |
4120 ECORE_ROCE_QP_STATE_INIT))) {
4122 attr.qp_state = IB_QPS_ERR;
4123 attr_mask |= IB_QP_STATE;
4125 /* change the QP state to ERROR */
4126 qlnxr_modify_qp(ibqp, &attr, attr_mask, NULL);
4129 if (qp->qp_type == IB_QPT_GSI)
4130 qlnxr_destroy_gsi_qp(dev);
4134 qlnxr_free_qp_resources(dev, qp);
4136 if (atomic_dec_and_test(&qp->refcnt)) {
4137 /* TODO: only for iWARP? */
4138 qlnxr_idr_remove(dev, qp->qp_id);
4142 QL_DPRINT12(ha, "exit\n");
4147 qlnxr_wq_is_full(struct qlnxr_qp_hwq_info *wq)
4149 return (((wq->prod + 1) % wq->max_wr) == wq->cons);
4153 sge_data_len(struct ib_sge *sg_list, int num_sge)
4156 for (i = 0; i < num_sge; i++)
4157 len += sg_list[i].length;
4162 swap_wqe_data64(u64 *p)
4166 for (i = 0; i < QLNXR_SQE_ELEMENT_SIZE / sizeof(u64); i++, p++)
4167 *p = cpu_to_be64(cpu_to_le64(*p));
4172 qlnxr_prepare_sq_inline_data(struct qlnxr_dev *dev,
4173 struct qlnxr_qp *qp,
4175 struct ib_send_wr *wr,
4176 struct ib_send_wr **bad_wr,
4181 char *seg_prt, *wqe;
4182 u32 data_size = sge_data_len(wr->sg_list, wr->num_sge);
4187 QL_DPRINT12(ha, "enter[%d]\n", data_size);
4189 if (data_size > ROCE_REQ_MAX_INLINE_DATA_SIZE) {
4191 "Too much inline data in WR:[%d, %d]\n",
4192 data_size, ROCE_REQ_MAX_INLINE_DATA_SIZE);
4203 seg_prt = wqe = NULL;
4206 /* copy data inline */
4207 for (i = 0; i < wr->num_sge; i++) {
4208 u32 len = wr->sg_list[i].length;
4209 void *src = (void *)(uintptr_t)wr->sg_list[i].addr;
4214 /* new segment required */
4216 wqe = (char *)ecore_chain_produce(&qp->sq.pbl);
4218 seg_siz = sizeof(struct rdma_sq_common_wqe);
4222 /* calculate currently allowed length */
4223 cur = MIN(len, seg_siz);
4225 memcpy(seg_prt, src, cur);
4227 /* update segment variables */
4230 /* update sge variables */
4234 /* swap fully-completed segments */
4236 swap_wqe_data64((u64 *)wqe);
4240 /* swap last not completed segment */
4242 swap_wqe_data64((u64 *)wqe);
4244 QL_DPRINT12(ha, "exit\n");
4249 qlnxr_prepare_sq_sges(struct qlnxr_dev *dev, struct qlnxr_qp *qp,
4250 u8 *wqe_size, struct ib_send_wr *wr)
4258 QL_DPRINT12(ha, "enter wr->num_sge = %d \n", wr->num_sge);
4260 for (i = 0; i < wr->num_sge; i++) {
4261 struct rdma_sq_sge *sge = ecore_chain_produce(&qp->sq.pbl);
4263 TYPEPTR_ADDR_SET(sge, addr, wr->sg_list[i].addr);
4264 sge->l_key = cpu_to_le32(wr->sg_list[i].lkey);
4265 sge->length = cpu_to_le32(wr->sg_list[i].length);
4266 data_size += wr->sg_list[i].length;
4270 *wqe_size += wr->num_sge;
4272 QL_DPRINT12(ha, "exit data_size = %d\n", data_size);
4277 qlnxr_prepare_sq_rdma_data(struct qlnxr_dev *dev,
4278 struct qlnxr_qp *qp,
4279 struct rdma_sq_rdma_wqe_1st *rwqe,
4280 struct rdma_sq_rdma_wqe_2nd *rwqe2,
4281 struct ib_send_wr *wr,
4282 struct ib_send_wr **bad_wr)
4289 QL_DPRINT12(ha, "enter\n");
4291 rwqe2->r_key = cpu_to_le32(rdma_wr(wr)->rkey);
4292 TYPEPTR_ADDR_SET(rwqe2, remote_va, rdma_wr(wr)->remote_addr);
4294 if (wr->send_flags & IB_SEND_INLINE) {
4296 SET_FIELD2(flags, RDMA_SQ_RDMA_WQE_1ST_INLINE_FLG, 1);
4297 return qlnxr_prepare_sq_inline_data(dev, qp, &rwqe->wqe_size,
4298 wr, bad_wr, &rwqe->flags, flags);
4301 ret = qlnxr_prepare_sq_sges(dev, qp, &rwqe->wqe_size, wr);
4303 QL_DPRINT12(ha, "exit ret = 0x%x\n", ret);
4309 qlnxr_prepare_sq_send_data(struct qlnxr_dev *dev,
4310 struct qlnxr_qp *qp,
4311 struct rdma_sq_send_wqe *swqe,
4312 struct rdma_sq_send_wqe *swqe2,
4313 struct ib_send_wr *wr,
4314 struct ib_send_wr **bad_wr)
4321 QL_DPRINT12(ha, "enter\n");
4323 memset(swqe2, 0, sizeof(*swqe2));
4325 if (wr->send_flags & IB_SEND_INLINE) {
4327 SET_FIELD2(flags, RDMA_SQ_SEND_WQE_INLINE_FLG, 1);
4328 return qlnxr_prepare_sq_inline_data(dev, qp, &swqe->wqe_size,
4329 wr, bad_wr, &swqe->flags, flags);
4332 ret = qlnxr_prepare_sq_sges(dev, qp, &swqe->wqe_size, wr);
4334 QL_DPRINT12(ha, "exit ret = 0x%x\n", ret);
4340 qlnx_handle_completed_mrs(struct qlnxr_dev *dev, struct mr_info *info)
4346 int work = info->completed - info->completed_handled - 1;
4348 QL_DPRINT12(ha, "enter [%d]\n", work);
4350 while (work-- > 0 && !list_empty(&info->inuse_pbl_list)) {
4351 struct qlnxr_pbl *pbl;
4353 /* Free all the page list that are possible to be freed
4354 * (all the ones that were invalidated), under the assumption
4355 * that if an FMR was completed successfully that means that
4356 * if there was an invalidate operation before it also ended
4358 pbl = list_first_entry(&info->inuse_pbl_list,
4361 list_del(&pbl->list_entry);
4362 list_add_tail(&pbl->list_entry, &info->free_pbl_list);
4363 info->completed_handled++;
4366 QL_DPRINT12(ha, "exit\n");
4370 #if __FreeBSD_version >= 1102000
4372 static int qlnxr_prepare_reg(struct qlnxr_qp *qp,
4373 struct rdma_sq_fmr_wqe_1st *fwqe1,
4374 struct ib_reg_wr *wr)
4376 struct qlnxr_mr *mr = get_qlnxr_mr(wr->mr);
4377 struct rdma_sq_fmr_wqe_2nd *fwqe2;
4379 fwqe2 = (struct rdma_sq_fmr_wqe_2nd *)ecore_chain_produce(&qp->sq.pbl);
4380 fwqe1->addr.hi = upper_32_bits(mr->ibmr.iova);
4381 fwqe1->addr.lo = lower_32_bits(mr->ibmr.iova);
4382 fwqe1->l_key = wr->key;
4384 fwqe2->access_ctrl = 0;
4386 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_READ,
4387 !!(wr->access & IB_ACCESS_REMOTE_READ));
4388 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_REMOTE_WRITE,
4389 !!(wr->access & IB_ACCESS_REMOTE_WRITE));
4390 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_ENABLE_ATOMIC,
4391 !!(wr->access & IB_ACCESS_REMOTE_ATOMIC));
4392 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_READ, 1);
4393 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_2ND_LOCAL_WRITE,
4394 !!(wr->access & IB_ACCESS_LOCAL_WRITE));
4395 fwqe2->fmr_ctrl = 0;
4397 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
4398 ilog2(mr->ibmr.page_size) - 12);
4400 fwqe2->length_hi = 0; /* TODO - figure out why length is only 32bit.. */
4401 fwqe2->length_lo = mr->ibmr.length;
4402 fwqe2->pbl_addr.hi = upper_32_bits(mr->info.pbl_table->pa);
4403 fwqe2->pbl_addr.lo = lower_32_bits(mr->info.pbl_table->pa);
4405 qp->wqe_wr_id[qp->sq.prod].mr = mr;
4413 build_frmr_pbes(struct qlnxr_dev *dev, struct ib_send_wr *wr,
4414 struct mr_info *info)
4418 int num_pbes, total_num_pbes = 0;
4419 struct regpair *pbe;
4420 struct qlnxr_pbl *pbl_tbl = info->pbl_table;
4421 struct qlnxr_pbl_info *pbl_info = &info->pbl_info;
4426 QL_DPRINT12(ha, "enter\n");
4428 pbe = (struct regpair *)pbl_tbl->va;
4431 for (i = 0; i < wr->wr.fast_reg.page_list_len; i++) {
4432 buf_addr = wr->wr.fast_reg.page_list->page_list[i];
4433 pbe->lo = cpu_to_le32((u32)buf_addr);
4434 pbe->hi = cpu_to_le32((u32)upper_32_bits(buf_addr));
4440 if (total_num_pbes == pbl_info->num_pbes)
4443 /* if the given pbl is full storing the pbes,
4447 (pbl_info->pbl_size / sizeof(u64))) {
4449 pbe = (struct regpair *)pbl_tbl->va;
4453 QL_DPRINT12(ha, "exit\n");
4459 qlnxr_prepare_safe_pbl(struct qlnxr_dev *dev, struct mr_info *info)
4466 QL_DPRINT12(ha, "enter\n");
4468 if (info->completed == 0) {
4469 //DP_VERBOSE(dev, QLNXR_MSG_MR, "First FMR\n");
4474 qlnx_handle_completed_mrs(dev, info);
4476 list_add_tail(&info->pbl_table->list_entry, &info->inuse_pbl_list);
4478 if (list_empty(&info->free_pbl_list)) {
4479 info->pbl_table = qlnxr_alloc_pbl_tbl(dev, &info->pbl_info,
4482 info->pbl_table = list_first_entry(&info->free_pbl_list,
4485 list_del(&info->pbl_table->list_entry);
4488 if (!info->pbl_table)
4491 QL_DPRINT12(ha, "exit\n");
4496 qlnxr_prepare_fmr(struct qlnxr_qp *qp,
4497 struct rdma_sq_fmr_wqe_1st *fwqe1,
4498 struct ib_send_wr *wr)
4500 struct qlnxr_dev *dev = qp->dev;
4502 struct qlnxr_fast_reg_page_list *frmr_list =
4503 get_qlnxr_frmr_list(wr->wr.fast_reg.page_list);
4504 struct rdma_sq_fmr_wqe *fwqe2 =
4505 (struct rdma_sq_fmr_wqe *)ecore_chain_produce(&qp->sq.pbl);
4511 QL_DPRINT12(ha, "enter\n");
4513 if (wr->wr.fast_reg.page_list_len == 0)
4516 rc = qlnxr_prepare_safe_pbl(dev, &frmr_list->info);
4520 fwqe1->addr.hi = upper_32_bits(wr->wr.fast_reg.iova_start);
4521 fwqe1->addr.lo = lower_32_bits(wr->wr.fast_reg.iova_start);
4522 fwqe1->l_key = wr->wr.fast_reg.rkey;
4524 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_REMOTE_READ,
4525 !!(wr->wr.fast_reg.access_flags & IB_ACCESS_REMOTE_READ));
4526 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_REMOTE_WRITE,
4527 !!(wr->wr.fast_reg.access_flags & IB_ACCESS_REMOTE_WRITE));
4528 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_ENABLE_ATOMIC,
4529 !!(wr->wr.fast_reg.access_flags & IB_ACCESS_REMOTE_ATOMIC));
4530 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_LOCAL_READ, 1);
4531 SET_FIELD2(fwqe2->access_ctrl, RDMA_SQ_FMR_WQE_LOCAL_WRITE,
4532 !!(wr->wr.fast_reg.access_flags & IB_ACCESS_LOCAL_WRITE));
4534 fwqe2->fmr_ctrl = 0;
4536 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_PAGE_SIZE_LOG,
4537 ilog2(1 << wr->wr.fast_reg.page_shift) - 12);
4538 SET_FIELD2(fwqe2->fmr_ctrl, RDMA_SQ_FMR_WQE_2ND_ZERO_BASED, 0);
4540 fwqe2->length_hi = 0; /* Todo - figure this out... why length is only 32bit.. */
4541 fwqe2->length_lo = wr->wr.fast_reg.length;
4542 fwqe2->pbl_addr.hi = upper_32_bits(frmr_list->info.pbl_table->pa);
4543 fwqe2->pbl_addr.lo = lower_32_bits(frmr_list->info.pbl_table->pa);
4545 /* produce another wqe for fwqe3 */
4546 ecore_chain_produce(&qp->sq.pbl);
4548 fbo = wr->wr.fast_reg.iova_start -
4549 (wr->wr.fast_reg.page_list->page_list[0] & PAGE_MASK);
4551 QL_DPRINT12(ha, "wr.fast_reg.iova_start = %p rkey=%x addr=%x:%x"
4552 " length = %x pbl_addr %x:%x\n",
4553 wr->wr.fast_reg.iova_start, wr->wr.fast_reg.rkey,
4554 fwqe1->addr.hi, fwqe1->addr.lo, fwqe2->length_lo,
4555 fwqe2->pbl_addr.hi, fwqe2->pbl_addr.lo);
4557 build_frmr_pbes(dev, wr, &frmr_list->info);
4559 qp->wqe_wr_id[qp->sq.prod].frmr = frmr_list;
4561 QL_DPRINT12(ha, "exit\n");
4565 #endif /* #if __FreeBSD_version >= 1102000 */
4567 static enum ib_wc_opcode
4568 qlnxr_ib_to_wc_opcode(enum ib_wr_opcode opcode)
4571 case IB_WR_RDMA_WRITE:
4572 case IB_WR_RDMA_WRITE_WITH_IMM:
4573 return IB_WC_RDMA_WRITE;
4574 case IB_WR_SEND_WITH_IMM:
4576 case IB_WR_SEND_WITH_INV:
4578 case IB_WR_RDMA_READ:
4579 return IB_WC_RDMA_READ;
4580 case IB_WR_ATOMIC_CMP_AND_SWP:
4581 return IB_WC_COMP_SWAP;
4582 case IB_WR_ATOMIC_FETCH_AND_ADD:
4583 return IB_WC_FETCH_ADD;
4585 #if __FreeBSD_version >= 1102000
4587 return IB_WC_REG_MR;
4589 case IB_WR_FAST_REG_MR:
4590 return IB_WC_FAST_REG_MR;
4591 #endif /* #if __FreeBSD_version >= 1102000 */
4593 case IB_WR_LOCAL_INV:
4594 return IB_WC_LOCAL_INV;
4600 qlnxr_can_post_send(struct qlnxr_qp *qp, struct ib_send_wr *wr)
4602 int wq_is_full, err_wr, pbl_is_full;
4603 struct qlnxr_dev *dev = qp->dev;
4608 QL_DPRINT12(ha, "enter[qp, wr] = [%p,%p]\n", qp, wr);
4610 /* prevent SQ overflow and/or processing of a bad WR */
4611 err_wr = wr->num_sge > qp->sq.max_sges;
4612 wq_is_full = qlnxr_wq_is_full(&qp->sq);
4613 pbl_is_full = ecore_chain_get_elem_left_u32(&qp->sq.pbl) <
4614 QLNXR_MAX_SQE_ELEMENTS_PER_SQE;
4615 if (wq_is_full || err_wr || pbl_is_full) {
4617 !(qp->err_bitmap & QLNXR_QP_ERR_SQ_FULL)) {
4619 qp->err_bitmap |= QLNXR_QP_ERR_SQ_FULL;
4622 "error: WQ is full. Post send on QP failed"
4623 " (this error appears only once) "
4624 "[qp, wr, qp->err_bitmap]=[%p, %p, 0x%x]\n",
4625 qp, wr, qp->err_bitmap);
4629 !(qp->err_bitmap & QLNXR_QP_ERR_BAD_SR)) {
4631 qp->err_bitmap |= QLNXR_QP_ERR_BAD_SR;
4634 "error: WQ is bad. Post send on QP failed"
4635 " (this error appears only once) "
4636 "[qp, wr, qp->err_bitmap]=[%p, %p, 0x%x]\n",
4637 qp, wr, qp->err_bitmap);
4641 !(qp->err_bitmap & QLNXR_QP_ERR_SQ_PBL_FULL)) {
4643 qp->err_bitmap |= QLNXR_QP_ERR_SQ_PBL_FULL;
4646 "error: WQ PBL is full. Post send on QP failed"
4647 " (this error appears only once) "
4648 "[qp, wr, qp->err_bitmap]=[%p, %p, 0x%x]\n",
4649 qp, wr, qp->err_bitmap);
4653 QL_DPRINT12(ha, "exit[qp, wr] = [%p,%p]\n", qp, wr);
4658 qlnxr_post_send(struct ib_qp *ibqp,
4659 struct ib_send_wr *wr,
4660 struct ib_send_wr **bad_wr)
4662 struct qlnxr_dev *dev = get_qlnxr_dev(ibqp->device);
4663 struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
4664 unsigned long flags;
4665 int status = 0, rc = 0;
4673 QL_DPRINT12(ha, "exit[ibqp, wr, bad_wr] = [%p, %p, %p]\n",
4676 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
4679 if (qp->qp_type == IB_QPT_GSI)
4680 return qlnxr_gsi_post_send(ibqp, wr, bad_wr);
4682 spin_lock_irqsave(&qp->q_lock, flags);
4684 if (QLNX_IS_ROCE(dev) && (qp->state != ECORE_ROCE_QP_STATE_RTS) &&
4685 (qp->state != ECORE_ROCE_QP_STATE_ERR) &&
4686 (qp->state != ECORE_ROCE_QP_STATE_SQD)) {
4687 spin_unlock_irqrestore(&qp->q_lock, flags);
4689 QL_DPRINT11(ha, "QP in wrong state! QP icid=0x%x state %d\n",
4690 qp->icid, qp->state);
4695 QL_DPRINT11(ha, "Got an empty post send???\n");
4699 struct rdma_sq_common_wqe *wqe;
4700 struct rdma_sq_send_wqe *swqe;
4701 struct rdma_sq_send_wqe *swqe2;
4702 struct rdma_sq_rdma_wqe_1st *rwqe;
4703 struct rdma_sq_rdma_wqe_2nd *rwqe2;
4704 struct rdma_sq_local_inv_wqe *iwqe;
4705 struct rdma_sq_atomic_wqe *awqe1;
4706 struct rdma_sq_atomic_wqe *awqe2;
4707 struct rdma_sq_atomic_wqe *awqe3;
4708 struct rdma_sq_fmr_wqe_1st *fwqe1;
4710 if (!qlnxr_can_post_send(qp, wr)) {
4716 wqe = ecore_chain_produce(&qp->sq.pbl);
4718 qp->wqe_wr_id[qp->sq.prod].signaled =
4719 !!(wr->send_flags & IB_SEND_SIGNALED) || qp->signaled;
4723 wqe->flags |= (RDMA_SQ_SEND_WQE_COMP_FLG_MASK <<
4724 RDMA_SQ_SEND_WQE_COMP_FLG_SHIFT);
4726 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_SE_FLG, \
4727 !!(wr->send_flags & IB_SEND_SOLICITED));
4729 comp = (!!(wr->send_flags & IB_SEND_SIGNALED)) ||
4732 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_COMP_FLG, comp);
4733 SET_FIELD2(wqe->flags, RDMA_SQ_SEND_WQE_RD_FENCE_FLG, \
4734 !!(wr->send_flags & IB_SEND_FENCE));
4736 wqe->prev_wqe_size = qp->prev_wqe_size;
4738 qp->wqe_wr_id[qp->sq.prod].opcode = qlnxr_ib_to_wc_opcode(wr->opcode);
4741 switch (wr->opcode) {
4743 case IB_WR_SEND_WITH_IMM:
4745 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_IMM;
4746 swqe = (struct rdma_sq_send_wqe *)wqe;
4748 swqe2 = (struct rdma_sq_send_wqe *)
4749 ecore_chain_produce(&qp->sq.pbl);
4750 swqe->inv_key_or_imm_data =
4751 cpu_to_le32(wr->ex.imm_data);
4752 swqe->length = cpu_to_le32(
4753 qlnxr_prepare_sq_send_data(dev,
4754 qp, swqe, swqe2, wr,
4757 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
4758 qp->prev_wqe_size = swqe->wqe_size;
4759 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
4761 QL_DPRINT12(ha, "SEND w/ IMM length = %d imm data=%x\n",
4762 swqe->length, wr->ex.imm_data);
4768 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND;
4769 swqe = (struct rdma_sq_send_wqe *)wqe;
4772 swqe2 = (struct rdma_sq_send_wqe *)
4773 ecore_chain_produce(&qp->sq.pbl);
4774 swqe->length = cpu_to_le32(
4775 qlnxr_prepare_sq_send_data(dev,
4776 qp, swqe, swqe2, wr,
4778 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
4779 qp->prev_wqe_size = swqe->wqe_size;
4780 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
4782 QL_DPRINT12(ha, "SEND w/o IMM length = %d\n",
4787 case IB_WR_SEND_WITH_INV:
4789 wqe->req_type = RDMA_SQ_REQ_TYPE_SEND_WITH_INVALIDATE;
4790 swqe = (struct rdma_sq_send_wqe *)wqe;
4791 swqe2 = (struct rdma_sq_send_wqe *)
4792 ecore_chain_produce(&qp->sq.pbl);
4794 swqe->inv_key_or_imm_data =
4795 cpu_to_le32(wr->ex.invalidate_rkey);
4796 swqe->length = cpu_to_le32(qlnxr_prepare_sq_send_data(dev,
4797 qp, swqe, swqe2, wr, bad_wr));
4798 qp->wqe_wr_id[qp->sq.prod].wqe_size = swqe->wqe_size;
4799 qp->prev_wqe_size = swqe->wqe_size;
4800 qp->wqe_wr_id[qp->sq.prod].bytes_len = swqe->length;
4802 QL_DPRINT12(ha, "SEND w INVALIDATE length = %d\n",
4806 case IB_WR_RDMA_WRITE_WITH_IMM:
4808 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR_WITH_IMM;
4809 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
4812 rwqe->imm_data = htonl(cpu_to_le32(wr->ex.imm_data));
4813 rwqe2 = (struct rdma_sq_rdma_wqe_2nd *)
4814 ecore_chain_produce(&qp->sq.pbl);
4815 rwqe->length = cpu_to_le32(qlnxr_prepare_sq_rdma_data(dev,
4816 qp, rwqe, rwqe2, wr, bad_wr));
4817 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
4818 qp->prev_wqe_size = rwqe->wqe_size;
4819 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
4822 "RDMA WRITE w/ IMM length = %d imm data=%x\n",
4823 rwqe->length, rwqe->imm_data);
4827 case IB_WR_RDMA_WRITE:
4829 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_WR;
4830 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
4833 rwqe2 = (struct rdma_sq_rdma_wqe_2nd *)
4834 ecore_chain_produce(&qp->sq.pbl);
4835 rwqe->length = cpu_to_le32(qlnxr_prepare_sq_rdma_data(dev,
4836 qp, rwqe, rwqe2, wr, bad_wr));
4837 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
4838 qp->prev_wqe_size = rwqe->wqe_size;
4839 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
4842 "RDMA WRITE w/o IMM length = %d\n",
4847 case IB_WR_RDMA_READ_WITH_INV:
4850 "RDMA READ WITH INVALIDATE not supported\n");
4857 case IB_WR_RDMA_READ:
4859 wqe->req_type = RDMA_SQ_REQ_TYPE_RDMA_RD;
4860 rwqe = (struct rdma_sq_rdma_wqe_1st *)wqe;
4863 rwqe2 = (struct rdma_sq_rdma_wqe_2nd *)
4864 ecore_chain_produce(&qp->sq.pbl);
4865 rwqe->length = cpu_to_le32(qlnxr_prepare_sq_rdma_data(dev,
4866 qp, rwqe, rwqe2, wr, bad_wr));
4868 qp->wqe_wr_id[qp->sq.prod].wqe_size = rwqe->wqe_size;
4869 qp->prev_wqe_size = rwqe->wqe_size;
4870 qp->wqe_wr_id[qp->sq.prod].bytes_len = rwqe->length;
4872 QL_DPRINT12(ha, "RDMA READ length = %d\n",
4877 case IB_WR_ATOMIC_CMP_AND_SWP:
4878 case IB_WR_ATOMIC_FETCH_AND_ADD:
4881 "ATOMIC operation = %s\n",
4882 ((wr->opcode == IB_WR_ATOMIC_CMP_AND_SWP) ?
4883 "IB_WR_ATOMIC_CMP_AND_SWP" :
4884 "IB_WR_ATOMIC_FETCH_AND_ADD"));
4886 awqe1 = (struct rdma_sq_atomic_wqe *)wqe;
4887 awqe1->prev_wqe_size = 4;
4889 awqe2 = (struct rdma_sq_atomic_wqe *)
4890 ecore_chain_produce(&qp->sq.pbl);
4892 TYPEPTR_ADDR_SET(awqe2, remote_va, \
4893 atomic_wr(wr)->remote_addr);
4895 awqe2->r_key = cpu_to_le32(atomic_wr(wr)->rkey);
4897 awqe3 = (struct rdma_sq_atomic_wqe *)
4898 ecore_chain_produce(&qp->sq.pbl);
4900 if (wr->opcode == IB_WR_ATOMIC_FETCH_AND_ADD) {
4901 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_ADD;
4902 TYPEPTR_ADDR_SET(awqe3, swap_data,
4903 atomic_wr(wr)->compare_add);
4905 wqe->req_type = RDMA_SQ_REQ_TYPE_ATOMIC_CMP_AND_SWAP;
4906 TYPEPTR_ADDR_SET(awqe3, swap_data,
4907 atomic_wr(wr)->swap);
4908 TYPEPTR_ADDR_SET(awqe3, cmp_data,
4909 atomic_wr(wr)->compare_add);
4912 qlnxr_prepare_sq_sges(dev, qp, NULL, wr);
4914 qp->wqe_wr_id[qp->sq.prod].wqe_size = awqe1->prev_wqe_size;
4915 qp->prev_wqe_size = awqe1->prev_wqe_size;
4919 case IB_WR_LOCAL_INV:
4922 "INVALIDATE length (IB_WR_LOCAL_INV)\n");
4924 iwqe = (struct rdma_sq_local_inv_wqe *)wqe;
4925 iwqe->prev_wqe_size = 1;
4927 iwqe->req_type = RDMA_SQ_REQ_TYPE_LOCAL_INVALIDATE;
4928 iwqe->inv_l_key = wr->ex.invalidate_rkey;
4929 qp->wqe_wr_id[qp->sq.prod].wqe_size = iwqe->prev_wqe_size;
4930 qp->prev_wqe_size = iwqe->prev_wqe_size;
4934 #if __FreeBSD_version >= 1102000
4938 QL_DPRINT12(ha, "IB_WR_REG_MR\n");
4940 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
4941 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
4942 fwqe1->wqe_size = 2;
4944 rc = qlnxr_prepare_reg(qp, fwqe1, reg_wr(wr));
4946 QL_DPRINT11(ha, "IB_WR_REG_MR failed rc=%d\n", rc);
4951 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->wqe_size;
4952 qp->prev_wqe_size = fwqe1->wqe_size;
4956 case IB_WR_FAST_REG_MR:
4958 QL_DPRINT12(ha, "FAST_MR (IB_WR_FAST_REG_MR)\n");
4960 wqe->req_type = RDMA_SQ_REQ_TYPE_FAST_MR;
4961 fwqe1 = (struct rdma_sq_fmr_wqe_1st *)wqe;
4962 fwqe1->prev_wqe_size = 3;
4964 rc = qlnxr_prepare_fmr(qp, fwqe1, wr);
4968 "FAST_MR (IB_WR_FAST_REG_MR) failed"
4974 qp->wqe_wr_id[qp->sq.prod].wqe_size = fwqe1->prev_wqe_size;
4975 qp->prev_wqe_size = fwqe1->prev_wqe_size;
4978 #endif /* #if __FreeBSD_version >= 1102000 */
4982 QL_DPRINT12(ha, "Invalid Opcode 0x%x!\n", wr->opcode);
4991 * restore prod to its position before this WR was processed
4993 ecore_chain_set_prod(&qp->sq.pbl,
4994 le16_to_cpu(qp->sq.db_data.data.value),
4996 /* restore prev_wqe_size */
4997 qp->prev_wqe_size = wqe->prev_wqe_size;
5000 QL_DPRINT12(ha, "failed *bad_wr = %p\n", *bad_wr);
5001 break; /* out of the loop */
5004 qp->wqe_wr_id[qp->sq.prod].wr_id = wr->wr_id;
5006 qlnxr_inc_sw_prod(&qp->sq);
5008 qp->sq.db_data.data.value++;
5014 * If there was a failure in the first WR then it will be triggered in
5015 * vane. However this is not harmful (as long as the producer value is
5016 * unchanged). For performance reasons we avoid checking for this
5017 * redundant doorbell.
5020 //writel(qp->sq.db_data.raw, qp->sq.db);
5022 reg_addr = (uint32_t)((uint8_t *)qp->sq.db - (uint8_t *)ha->cdev.doorbells);
5023 bus_write_4(ha->pci_dbells, reg_addr, qp->sq.db_data.raw);
5024 bus_barrier(ha->pci_dbells, 0, 0, BUS_SPACE_BARRIER_READ);
5028 spin_unlock_irqrestore(&qp->q_lock, flags);
5030 QL_DPRINT12(ha, "exit[ibqp, wr, bad_wr] = [%p, %p, %p]\n",
5037 qlnxr_srq_elem_left(struct qlnxr_srq_hwq_info *hw_srq)
5041 /* Calculate number of elements used based on producer
5042 * count and consumer count and subtract it from max
5043 * work request supported so that we get elements left.
5045 used = hw_srq->wr_prod_cnt - hw_srq->wr_cons_cnt;
5047 return hw_srq->max_wr - used;
5052 qlnxr_post_recv(struct ib_qp *ibqp,
5053 struct ib_recv_wr *wr,
5054 struct ib_recv_wr **bad_wr)
5056 struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
5057 struct qlnxr_dev *dev = qp->dev;
5058 unsigned long flags;
5065 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
5068 QL_DPRINT12(ha, "enter\n");
5070 if (qp->qp_type == IB_QPT_GSI) {
5071 QL_DPRINT12(ha, "(qp->qp_type = IB_QPT_GSI)\n");
5072 return qlnxr_gsi_post_recv(ibqp, wr, bad_wr);
5076 QL_DPRINT11(ha, "qp->srq [%p]"
5077 " QP is associated with SRQ, cannot post RQ buffers\n",
5082 spin_lock_irqsave(&qp->q_lock, flags);
5084 if (qp->state == ECORE_ROCE_QP_STATE_RESET) {
5085 spin_unlock_irqrestore(&qp->q_lock, flags);
5088 QL_DPRINT11(ha, "qp->qp_type = ECORE_ROCE_QP_STATE_RESET\n");
5096 if ((ecore_chain_get_elem_left_u32(&qp->rq.pbl) <
5097 QLNXR_MAX_RQE_ELEMENTS_PER_RQE) ||
5098 (wr->num_sge > qp->rq.max_sges)) {
5103 for (i = 0; i < wr->num_sge; i++) {
5105 struct rdma_rq_sge *rqe = ecore_chain_produce(&qp->rq.pbl);
5107 /* first one must include the number of SGE in the list */
5109 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, wr->num_sge);
5111 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY, wr->sg_list[i].lkey);
5113 RQ_SGE_SET(rqe, wr->sg_list[i].addr, \
5114 wr->sg_list[i].length, flags);
5116 /* Special case of no sges. FW requires between 1-4 sges...
5117 * in this case we need to post 1 sge with length zero. this is
5118 * because rdma write with immediate consumes an RQ. */
5121 struct rdma_rq_sge *rqe = ecore_chain_produce(&qp->rq.pbl);
5123 /* first one must include the number of SGE in the list */
5124 SET_FIELD(flags, RDMA_RQ_SGE_L_KEY, 0);
5125 SET_FIELD(flags, RDMA_RQ_SGE_NUM_SGES, 1);
5127 //RQ_SGE_SET(rqe, 0, 0, flags);
5132 rqe->flags = cpu_to_le32(flags);
5137 qp->rqe_wr_id[qp->rq.prod].wr_id = wr->wr_id;
5138 qp->rqe_wr_id[qp->rq.prod].wqe_size = i;
5140 qlnxr_inc_sw_prod(&qp->rq);
5144 qp->rq.db_data.data.value++;
5146 // writel(qp->rq.db_data.raw, qp->rq.db);
5148 // if (QLNX_IS_IWARP(dev)) {
5149 // writel(qp->rq.iwarp_db2_data.raw, qp->rq.iwarp_db2);
5150 // mmiowb(); /* for second doorbell */
5153 reg_addr = (uint32_t)((uint8_t *)qp->rq.db -
5154 (uint8_t *)ha->cdev.doorbells);
5156 bus_write_4(ha->pci_dbells, reg_addr, qp->rq.db_data.raw);
5157 bus_barrier(ha->pci_dbells, 0, 0, BUS_SPACE_BARRIER_READ);
5159 if (QLNX_IS_IWARP(dev)) {
5160 reg_addr = (uint32_t)((uint8_t *)qp->rq.iwarp_db2 -
5161 (uint8_t *)ha->cdev.doorbells);
5162 bus_write_4(ha->pci_dbells, reg_addr, \
5163 qp->rq.iwarp_db2_data.raw);
5164 bus_barrier(ha->pci_dbells, 0, 0, \
5165 BUS_SPACE_BARRIER_READ);
5171 spin_unlock_irqrestore(&qp->q_lock, flags);
5173 QL_DPRINT12(ha, "exit status = 0x%x\n", status);
5178 /* In fmr we need to increase the number of fmr completed counter for the fmr
5179 * algorithm determining whether we can free a pbl or not.
5180 * we need to perform this whether the work request was signaled or not. for
5181 * this purpose we call this function from the condition that checks if a wr
5182 * should be skipped, to make sure we don't miss it ( possibly this fmr
5183 * operation was not signalted)
5186 qlnxr_chk_if_fmr(struct qlnxr_qp *qp)
5188 #if __FreeBSD_version >= 1102000
5190 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_REG_MR)
5191 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
5193 if (qp->wqe_wr_id[qp->sq.cons].opcode == IB_WC_FAST_REG_MR)
5194 qp->wqe_wr_id[qp->sq.cons].frmr->info.completed++;
5196 #endif /* #if __FreeBSD_version >= 1102000 */
5200 process_req(struct qlnxr_dev *dev,
5201 struct qlnxr_qp *qp,
5202 struct qlnxr_cq *cq,
5206 enum ib_wc_status status,
5210 qlnx_host_t *ha = dev->ha;
5212 QL_DPRINT12(ha, "enter\n");
5214 while (num_entries && qp->sq.wqe_cons != hw_cons) {
5215 if (!qp->wqe_wr_id[qp->sq.cons].signaled && !force) {
5216 qlnxr_chk_if_fmr(qp);
5222 wc->status = status;
5225 wc->src_qp = qp->id;
5229 wc->wr_id = qp->wqe_wr_id[qp->sq.cons].wr_id;
5230 wc->opcode = qp->wqe_wr_id[qp->sq.cons].opcode;
5232 switch (wc->opcode) {
5234 case IB_WC_RDMA_WRITE:
5236 wc->byte_len = qp->wqe_wr_id[qp->sq.cons].bytes_len;
5239 "opcode = IB_WC_RDMA_WRITE bytes = %d\n",
5240 qp->wqe_wr_id[qp->sq.cons].bytes_len);
5243 case IB_WC_COMP_SWAP:
5244 case IB_WC_FETCH_ADD:
5248 #if __FreeBSD_version >= 1102000
5250 qp->wqe_wr_id[qp->sq.cons].mr->info.completed++;
5253 case IB_WC_FAST_REG_MR:
5254 qp->wqe_wr_id[qp->sq.cons].frmr->info.completed++;
5256 #endif /* #if __FreeBSD_version >= 1102000 */
5258 case IB_WC_RDMA_READ:
5261 QL_DPRINT12(ha, "opcode = 0x%x \n", wc->opcode);
5264 ;//DP_ERR("TBD ERROR");
5271 while (qp->wqe_wr_id[qp->sq.cons].wqe_size--)
5272 ecore_chain_consume(&qp->sq.pbl);
5273 qlnxr_inc_sw_cons(&qp->sq);
5276 QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
5281 qlnxr_poll_cq_req(struct qlnxr_dev *dev,
5282 struct qlnxr_qp *qp,
5283 struct qlnxr_cq *cq,
5286 struct rdma_cqe_requester *req)
5289 qlnx_host_t *ha = dev->ha;
5291 QL_DPRINT12(ha, "enter req->status = 0x%x\n", req->status);
5293 switch (req->status) {
5295 case RDMA_CQE_REQ_STS_OK:
5297 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
5301 case RDMA_CQE_REQ_STS_WORK_REQUEST_FLUSHED_ERR:
5303 if (qp->state != ECORE_ROCE_QP_STATE_ERR)
5304 cnt = process_req(dev, qp, cq, num_entries, wc, req->sq_cons,
5305 IB_WC_WR_FLUSH_ERR, 1);
5308 default: /* other errors case */
5310 /* process all WQE before the cosumer */
5311 qp->state = ECORE_ROCE_QP_STATE_ERR;
5312 cnt = process_req(dev, qp, cq, num_entries, wc,
5313 req->sq_cons - 1, IB_WC_SUCCESS, 0);
5315 /* if we have extra WC fill it with actual error info */
5317 if (cnt < num_entries) {
5318 enum ib_wc_status wc_status;
5320 switch (req->status) {
5321 case RDMA_CQE_REQ_STS_BAD_RESPONSE_ERR:
5322 wc_status = IB_WC_BAD_RESP_ERR;
5324 case RDMA_CQE_REQ_STS_LOCAL_LENGTH_ERR:
5325 wc_status = IB_WC_LOC_LEN_ERR;
5327 case RDMA_CQE_REQ_STS_LOCAL_QP_OPERATION_ERR:
5328 wc_status = IB_WC_LOC_QP_OP_ERR;
5330 case RDMA_CQE_REQ_STS_LOCAL_PROTECTION_ERR:
5331 wc_status = IB_WC_LOC_PROT_ERR;
5333 case RDMA_CQE_REQ_STS_MEMORY_MGT_OPERATION_ERR:
5334 wc_status = IB_WC_MW_BIND_ERR;
5336 case RDMA_CQE_REQ_STS_REMOTE_INVALID_REQUEST_ERR:
5337 wc_status = IB_WC_REM_INV_REQ_ERR;
5339 case RDMA_CQE_REQ_STS_REMOTE_ACCESS_ERR:
5340 wc_status = IB_WC_REM_ACCESS_ERR;
5342 case RDMA_CQE_REQ_STS_REMOTE_OPERATION_ERR:
5343 wc_status = IB_WC_REM_OP_ERR;
5345 case RDMA_CQE_REQ_STS_RNR_NAK_RETRY_CNT_ERR:
5346 wc_status = IB_WC_RNR_RETRY_EXC_ERR;
5348 case RDMA_CQE_REQ_STS_TRANSPORT_RETRY_CNT_ERR:
5349 wc_status = IB_WC_RETRY_EXC_ERR;
5352 wc_status = IB_WC_GENERAL_ERR;
5355 cnt += process_req(dev, qp, cq, 1, wc, req->sq_cons,
5356 wc_status, 1 /* force use of WC */);
5360 QL_DPRINT12(ha, "exit cnt = %d\n", cnt);
5365 __process_resp_one(struct qlnxr_dev *dev,
5366 struct qlnxr_qp *qp,
5367 struct qlnxr_cq *cq,
5369 struct rdma_cqe_responder *resp,
5372 enum ib_wc_status wc_status = IB_WC_SUCCESS;
5373 #if __FreeBSD_version < 1102000
5376 qlnx_host_t *ha = dev->ha;
5378 QL_DPRINT12(ha, "enter qp = %p resp->status = 0x%x\n",
5381 wc->opcode = IB_WC_RECV;
5384 switch (resp->status) {
5386 case RDMA_CQE_RESP_STS_LOCAL_ACCESS_ERR:
5387 wc_status = IB_WC_LOC_ACCESS_ERR;
5390 case RDMA_CQE_RESP_STS_LOCAL_LENGTH_ERR:
5391 wc_status = IB_WC_LOC_LEN_ERR;
5394 case RDMA_CQE_RESP_STS_LOCAL_QP_OPERATION_ERR:
5395 wc_status = IB_WC_LOC_QP_OP_ERR;
5398 case RDMA_CQE_RESP_STS_LOCAL_PROTECTION_ERR:
5399 wc_status = IB_WC_LOC_PROT_ERR;
5402 case RDMA_CQE_RESP_STS_MEMORY_MGT_OPERATION_ERR:
5403 wc_status = IB_WC_MW_BIND_ERR;
5406 case RDMA_CQE_RESP_STS_REMOTE_INVALID_REQUEST_ERR:
5407 wc_status = IB_WC_REM_INV_RD_REQ_ERR;
5410 case RDMA_CQE_RESP_STS_OK:
5412 #if __FreeBSD_version >= 1102000
5413 if (resp->flags & QLNXR_RESP_IMM) {
5415 le32_to_cpu(resp->imm_data_or_inv_r_Key);
5416 wc->wc_flags |= IB_WC_WITH_IMM;
5418 if (resp->flags & QLNXR_RESP_RDMA)
5419 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
5421 if (resp->flags & QLNXR_RESP_INV) {
5423 "Invalid flags QLNXR_RESP_INV [0x%x]"
5424 "qp = %p qp->id = 0x%x cq = %p"
5425 " cq->icid = 0x%x\n",
5426 resp->flags, qp, qp->id, cq, cq->icid );
5428 } else if (resp->flags & QLNXR_RESP_INV) {
5430 le32_to_cpu(resp->imm_data_or_inv_r_Key);
5431 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
5433 if (resp->flags & QLNXR_RESP_RDMA) {
5435 "Invalid flags QLNXR_RESP_RDMA [0x%x]"
5436 "qp = %p qp->id = 0x%x cq = %p"
5437 " cq->icid = 0x%x\n",
5438 resp->flags, qp, qp->id, cq, cq->icid );
5440 } else if (resp->flags & QLNXR_RESP_RDMA) {
5441 QL_DPRINT11(ha, "Invalid flags QLNXR_RESP_RDMA [0x%x]"
5442 "qp = %p qp->id = 0x%x cq = %p cq->icid = 0x%x\n",
5443 resp->flags, qp, qp->id, cq, cq->icid );
5446 wc_status = IB_WC_SUCCESS;
5447 wc->byte_len = le32_to_cpu(resp->length);
5449 flags = resp->flags & QLNXR_RESP_RDMA_IMM;
5453 case QLNXR_RESP_RDMA_IMM:
5455 wc->opcode = IB_WC_RECV_RDMA_WITH_IMM;
5456 /* fall to set imm data */
5457 case QLNXR_RESP_IMM:
5459 le32_to_cpu(resp->imm_data_or_inv_r_Key);
5460 wc->wc_flags |= IB_WC_WITH_IMM;
5462 case QLNXR_RESP_RDMA:
5463 QL_DPRINT11(ha, "Invalid flags QLNXR_RESP_RDMA [0x%x]"
5464 "qp = %p qp->id = 0x%x cq = %p cq->icid = 0x%x\n",
5465 resp->flags, qp, qp->id, cq, cq->icid );
5468 /* valid configuration, but nothing todo here */
5471 #endif /* #if __FreeBSD_version >= 1102000 */
5475 wc_status = IB_WC_GENERAL_ERR;
5479 wc->status = wc_status;
5481 wc->src_qp = qp->id;
5485 QL_DPRINT12(ha, "exit status = 0x%x\n", wc_status);
5491 process_resp_one_srq(struct qlnxr_dev *dev,
5492 struct qlnxr_qp *qp,
5493 struct qlnxr_cq *cq,
5495 struct rdma_cqe_responder *resp)
5497 struct qlnxr_srq *srq = qp->srq;
5499 qlnx_host_t *ha = dev->ha;
5501 QL_DPRINT12(ha, "enter\n");
5503 wr_id = HILO_U64(resp->srq_wr_id.hi, resp->srq_wr_id.lo);
5505 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
5506 wc->status = IB_WC_WR_FLUSH_ERR;
5510 wc->src_qp = qp->id;
5514 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
5517 /* PBL is maintained in case of WR granularity.
5518 * So increment WR consumer after consuming WR
5520 srq->hw_srq.wr_cons_cnt++;
5522 QL_DPRINT12(ha, "exit\n");
5527 process_resp_one(struct qlnxr_dev *dev,
5528 struct qlnxr_qp *qp,
5529 struct qlnxr_cq *cq,
5531 struct rdma_cqe_responder *resp)
5533 qlnx_host_t *ha = dev->ha;
5534 u64 wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
5536 QL_DPRINT12(ha, "enter\n");
5538 __process_resp_one(dev, qp, cq, wc, resp, wr_id);
5540 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
5541 ecore_chain_consume(&qp->rq.pbl);
5542 qlnxr_inc_sw_cons(&qp->rq);
5544 QL_DPRINT12(ha, "exit\n");
5549 process_resp_flush(struct qlnxr_qp *qp,
5555 qlnx_host_t *ha = qp->dev->ha;
5557 QL_DPRINT12(ha, "enter\n");
5559 while (num_entries && qp->rq.wqe_cons != hw_cons) {
5561 wc->status = IB_WC_WR_FLUSH_ERR;
5564 wc->src_qp = qp->id;
5566 wc->wr_id = qp->rqe_wr_id[qp->rq.cons].wr_id;
5571 while (qp->rqe_wr_id[qp->rq.cons].wqe_size--)
5572 ecore_chain_consume(&qp->rq.pbl);
5573 qlnxr_inc_sw_cons(&qp->rq);
5576 QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
5581 try_consume_resp_cqe(struct qlnxr_cq *cq,
5582 struct qlnxr_qp *qp,
5583 struct rdma_cqe_responder *resp,
5586 if (le16_to_cpu(resp->rq_cons) == qp->rq.wqe_cons) {
5593 qlnxr_poll_cq_resp_srq(struct qlnxr_dev *dev,
5594 struct qlnxr_qp *qp,
5595 struct qlnxr_cq *cq,
5598 struct rdma_cqe_responder *resp,
5602 qlnx_host_t *ha = dev->ha;
5604 QL_DPRINT12(ha, "enter\n");
5606 cnt = process_resp_one_srq(dev, qp, cq, wc, resp);
5610 QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
5615 qlnxr_poll_cq_resp(struct qlnxr_dev *dev,
5616 struct qlnxr_qp *qp,
5617 struct qlnxr_cq *cq,
5620 struct rdma_cqe_responder *resp,
5624 qlnx_host_t *ha = dev->ha;
5626 QL_DPRINT12(ha, "enter\n");
5628 if (resp->status == RDMA_CQE_RESP_STS_WORK_REQUEST_FLUSHED_ERR) {
5629 cnt = process_resp_flush(qp, num_entries, wc,
5631 try_consume_resp_cqe(cq, qp, resp, update);
5633 cnt = process_resp_one(dev, qp, cq, wc, resp);
5638 QL_DPRINT12(ha, "exit cnt = 0x%x\n", cnt);
5643 try_consume_req_cqe(struct qlnxr_cq *cq, struct qlnxr_qp *qp,
5644 struct rdma_cqe_requester *req, int *update)
5646 if (le16_to_cpu(req->sq_cons) == qp->sq.wqe_cons) {
5653 doorbell_cq(struct qlnxr_dev *dev, struct qlnxr_cq *cq, u32 cons, u8 flags)
5656 qlnx_host_t *ha = dev->ha;
5658 QL_DPRINT12(ha, "enter\n");
5661 cq->db.data.agg_flags = flags;
5662 cq->db.data.value = cpu_to_le32(cons);
5664 reg_addr = (uint64_t)((uint8_t *)cq->db_addr -
5665 (uint8_t *)(ha->cdev.doorbells));
5667 bus_write_8(ha->pci_dbells, reg_addr, cq->db.raw);
5668 bus_barrier(ha->pci_dbells, 0, 0, BUS_SPACE_BARRIER_READ);
5670 QL_DPRINT12(ha, "exit\n");
5674 // writeq(cq->db.raw, cq->db_addr);
5676 /* Note that since the FW allows 64 bit write only, in 32bit systems
5677 * the value of db_addr must be low enough. This is currently not
5680 // writel(cq->db.raw & 0xffffffff, cq->db_addr);
5687 is_valid_cqe(struct qlnxr_cq *cq, union rdma_cqe *cqe)
5689 struct rdma_cqe_requester *resp_cqe = &cqe->req;
5690 return (resp_cqe->flags & RDMA_RESIZE_CQ_RAMROD_DATA_TOGGLE_BIT_MASK) ==
5695 qlnxr_poll_cq(struct ib_cq *ibcq, int num_entries, struct ib_wc *wc)
5697 struct qlnxr_cq *cq = get_qlnxr_cq(ibcq);
5698 struct qlnxr_dev *dev = get_qlnxr_dev((ibcq->device));
5700 union rdma_cqe *cqe = cq->latest_cqe;
5702 u32 old_cons, new_cons;
5703 unsigned long flags;
5704 qlnx_host_t *ha = dev->ha;
5706 QL_DPRINT12(ha, "enter\n");
5708 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
5711 if (cq->destroyed) {
5712 QL_DPRINT11(ha, "called after destroy for cq %p (icid=%d)\n",
5717 if (cq->cq_type == QLNXR_CQ_TYPE_GSI)
5718 return qlnxr_gsi_poll_cq(ibcq, num_entries, wc);
5720 spin_lock_irqsave(&cq->cq_lock, flags);
5722 old_cons = ecore_chain_get_cons_idx_u32(&cq->pbl);
5724 while (num_entries && is_valid_cqe(cq, cqe)) {
5726 struct qlnxr_qp *qp;
5727 struct rdma_cqe_requester *resp_cqe;
5728 enum rdma_cqe_type cqe_type;
5730 /* prevent speculative reads of any field of CQE */
5733 resp_cqe = &cqe->req;
5734 qp = (struct qlnxr_qp *)(uintptr_t)HILO_U64(resp_cqe->qp_handle.hi,
5735 resp_cqe->qp_handle.lo);
5738 QL_DPRINT11(ha, "qp = NULL\n");
5744 cqe_type = GET_FIELD(resp_cqe->flags, RDMA_CQE_REQUESTER_TYPE);
5747 case RDMA_CQE_TYPE_REQUESTER:
5748 cnt = qlnxr_poll_cq_req(dev, qp, cq, num_entries,
5750 try_consume_req_cqe(cq, qp, &cqe->req, &update);
5752 case RDMA_CQE_TYPE_RESPONDER_RQ:
5753 cnt = qlnxr_poll_cq_resp(dev, qp, cq, num_entries,
5754 wc, &cqe->resp, &update);
5756 case RDMA_CQE_TYPE_RESPONDER_SRQ:
5757 cnt = qlnxr_poll_cq_resp_srq(dev, qp, cq, num_entries,
5758 wc, &cqe->resp, &update);
5760 case RDMA_CQE_TYPE_INVALID:
5762 QL_DPRINT11(ha, "cqe type [0x%x] invalid\n", cqe_type);
5769 cqe = cq->latest_cqe;
5771 new_cons = ecore_chain_get_cons_idx_u32(&cq->pbl);
5773 cq->cq_cons += new_cons - old_cons;
5776 /* doorbell notifies abount latest VALID entry,
5777 * but chain already point to the next INVALID one
5779 doorbell_cq(dev, cq, cq->cq_cons - 1, cq->arm_flags);
5780 QL_DPRINT12(ha, "cq = %p cons = 0x%x "
5781 "arm_flags = 0x%x db.icid = 0x%x\n", cq,
5782 (cq->cq_cons - 1), cq->arm_flags, cq->db.data.icid);
5785 spin_unlock_irqrestore(&cq->cq_lock, flags);
5787 QL_DPRINT12(ha, "exit\n");
5794 qlnxr_arm_cq(struct ib_cq *ibcq, enum ib_cq_notify_flags flags)
5796 struct qlnxr_cq *cq = get_qlnxr_cq(ibcq);
5797 unsigned long sflags;
5798 struct qlnxr_dev *dev;
5801 dev = get_qlnxr_dev((ibcq->device));
5804 QL_DPRINT12(ha, "enter ibcq = %p flags = 0x%x "
5805 "cp = %p cons = 0x%x cq_type = 0x%x\n", ibcq,
5806 flags, cq, cq->cq_cons, cq->cq_type);
5808 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
5811 if (cq->destroyed) {
5812 QL_DPRINT11(ha, "cq was already destroyed cq = %p icid=%d\n",
5817 if (cq->cq_type == QLNXR_CQ_TYPE_GSI) {
5821 spin_lock_irqsave(&cq->cq_lock, sflags);
5825 if (flags & IB_CQ_SOLICITED) {
5826 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_SE_CF_CMD;
5828 if (flags & IB_CQ_NEXT_COMP) {
5829 cq->arm_flags |= DQ_UCM_ROCE_CQ_ARM_CF_CMD;
5832 doorbell_cq(dev, cq, (cq->cq_cons - 1), cq->arm_flags);
5834 spin_unlock_irqrestore(&cq->cq_lock, sflags);
5836 QL_DPRINT12(ha, "exit ibcq = %p flags = 0x%x\n", ibcq, flags);
5841 static struct qlnxr_mr *
5842 __qlnxr_alloc_mr(struct ib_pd *ibpd, int max_page_list_len)
5844 struct qlnxr_pd *pd = get_qlnxr_pd(ibpd);
5845 struct qlnxr_dev *dev = get_qlnxr_dev((ibpd->device));
5846 struct qlnxr_mr *mr;
5852 QL_DPRINT12(ha, "enter ibpd = %p pd = %p "
5853 " pd_id = %d max_page_list_len = %d\n",
5854 ibpd, pd, pd->pd_id, max_page_list_len);
5856 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
5858 QL_DPRINT11(ha, "kzalloc(mr) failed\n");
5863 mr->type = QLNXR_MR_FRMR;
5865 rc = qlnxr_init_mr_info(dev, &mr->info, max_page_list_len,
5866 1 /* allow dual layer pbl */);
5868 QL_DPRINT11(ha, "qlnxr_init_mr_info failed\n");
5872 rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
5874 QL_DPRINT11(ha, "ecore_rdma_alloc_tid failed\n");
5878 /* index only, 18 bit long, lkey = itid << 8 | key */
5879 mr->hw_mr.tid_type = ECORE_RDMA_TID_FMR;
5881 mr->hw_mr.pd = pd->pd_id;
5882 mr->hw_mr.local_read = 1;
5883 mr->hw_mr.local_write = 0;
5884 mr->hw_mr.remote_read = 0;
5885 mr->hw_mr.remote_write = 0;
5886 mr->hw_mr.remote_atomic = 0;
5887 mr->hw_mr.mw_bind = false; /* TBD MW BIND */
5888 mr->hw_mr.pbl_ptr = 0; /* Will be supplied during post */
5889 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
5890 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
5892 mr->hw_mr.length = 0;
5893 mr->hw_mr.vaddr = 0;
5894 mr->hw_mr.zbva = false; /* TBD figure when this should be true */
5895 mr->hw_mr.phy_mr = true; /* Fast MR - True, Regular Register False */
5896 mr->hw_mr.dma_mr = false;
5898 rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
5900 QL_DPRINT11(ha, "ecore_rdma_register_tid failed\n");
5904 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
5905 mr->ibmr.rkey = mr->ibmr.lkey;
5907 QL_DPRINT12(ha, "exit mr = %p mr->ibmr.lkey = 0x%x\n",
5913 ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
5917 QL_DPRINT12(ha, "exit\n");
5922 #if __FreeBSD_version >= 1102000
5925 qlnxr_alloc_mr(struct ib_pd *ibpd, enum ib_mr_type mr_type, u32 max_num_sg)
5927 struct qlnxr_dev *dev;
5928 struct qlnxr_mr *mr;
5931 dev = get_qlnxr_dev(ibpd->device);
5934 QL_DPRINT12(ha, "enter\n");
5936 if (mr_type != IB_MR_TYPE_MEM_REG)
5937 return ERR_PTR(-EINVAL);
5939 mr = __qlnxr_alloc_mr(ibpd, max_num_sg);
5942 return ERR_PTR(-EINVAL);
5944 QL_DPRINT12(ha, "exit mr = %p &mr->ibmr = %p\n", mr, &mr->ibmr);
5950 qlnxr_set_page(struct ib_mr *ibmr, u64 addr)
5952 struct qlnxr_mr *mr = get_qlnxr_mr(ibmr);
5953 struct qlnxr_pbl *pbl_table;
5954 struct regpair *pbe;
5955 struct qlnxr_dev *dev;
5962 if (unlikely(mr->npages == mr->info.pbl_info.num_pbes)) {
5963 QL_DPRINT12(ha, "fails mr->npages %d\n", mr->npages);
5967 QL_DPRINT12(ha, "mr->npages %d addr = %p enter\n", mr->npages,
5970 pbes_in_page = mr->info.pbl_info.pbl_size / sizeof(u64);
5971 pbl_table = mr->info.pbl_table + (mr->npages / pbes_in_page);
5972 pbe = (struct regpair *)pbl_table->va;
5973 pbe += mr->npages % pbes_in_page;
5974 pbe->lo = cpu_to_le32((u32)addr);
5975 pbe->hi = cpu_to_le32((u32)upper_32_bits(addr));
5979 QL_DPRINT12(ha, "mr->npages %d addr = %p exit \n", mr->npages,
5985 qlnxr_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg,
5986 int sg_nents, unsigned int *sg_offset)
5989 struct qlnxr_mr *mr = get_qlnxr_mr(ibmr);
5995 if (mr->dev == NULL)
6000 QL_DPRINT12(ha, "enter\n");
6003 qlnx_handle_completed_mrs(mr->dev, &mr->info);
6005 ret = ib_sg_to_pages(ibmr, sg, sg_nents, NULL, qlnxr_set_page);
6007 QL_DPRINT12(ha, "exit ret = %d\n", ret);
6015 qlnxr_alloc_frmr(struct ib_pd *ibpd, int max_page_list_len)
6017 struct qlnxr_dev *dev;
6018 struct qlnxr_mr *mr;
6020 struct ib_mr *ibmr = NULL;
6022 dev = get_qlnxr_dev((ibpd->device));
6025 QL_DPRINT12(ha, "enter\n");
6027 mr = __qlnxr_alloc_mr(ibpd, max_page_list_len);
6030 ibmr = ERR_PTR(-EINVAL);
6035 QL_DPRINT12(ha, "exit %p\n", ibmr);
6040 qlnxr_free_frmr_page_list(struct ib_fast_reg_page_list *page_list)
6042 struct qlnxr_fast_reg_page_list *frmr_list;
6044 frmr_list = get_qlnxr_frmr_list(page_list);
6046 free_mr_info(frmr_list->dev, &frmr_list->info);
6048 kfree(frmr_list->ibfrpl.page_list);
6054 struct ib_fast_reg_page_list *
6055 qlnxr_alloc_frmr_page_list(struct ib_device *ibdev, int page_list_len)
6057 struct qlnxr_fast_reg_page_list *frmr_list = NULL;
6058 struct qlnxr_dev *dev;
6059 int size = page_list_len * sizeof(u64);
6063 dev = get_qlnxr_dev(ibdev);
6066 QL_DPRINT12(ha, "enter\n");
6068 frmr_list = kzalloc(sizeof(*frmr_list), GFP_KERNEL);
6070 QL_DPRINT11(ha, "kzalloc(frmr_list) failed\n");
6074 frmr_list->dev = dev;
6075 frmr_list->ibfrpl.page_list = kzalloc(size, GFP_KERNEL);
6076 if (!frmr_list->ibfrpl.page_list) {
6077 QL_DPRINT11(ha, "frmr_list->ibfrpl.page_list = NULL failed\n");
6081 rc = qlnxr_init_mr_info(dev, &frmr_list->info, page_list_len,
6082 1 /* allow dual layer pbl */);
6086 QL_DPRINT12(ha, "exit %p\n", &frmr_list->ibfrpl);
6088 return &frmr_list->ibfrpl;
6091 kfree(frmr_list->ibfrpl.page_list);
6095 QL_DPRINT12(ha, "exit with error\n");
6101 qlnxr_validate_phys_buf_list(qlnx_host_t *ha, struct ib_phys_buf *buf_list,
6102 int buf_cnt, uint64_t *total_size)
6108 if (!buf_cnt || buf_list == NULL) {
6110 "failed buf_list = %p buf_cnt = %d\n", buf_list, buf_cnt);
6114 size = buf_list->size;
6118 "failed buf_list = %p buf_cnt = %d"
6119 " buf_list->size = 0\n", buf_list, buf_cnt);
6125 *total_size += buf_list->size;
6127 if (buf_list->size != size) {
6129 "failed buf_list = %p buf_cnt = %d"
6130 " all buffers should have same size\n",
6142 qlnxr_get_num_pages(qlnx_host_t *ha, struct ib_phys_buf *buf_list,
6146 size_t num_pages = 0;
6149 for (i = 0; i < buf_cnt; i++) {
6152 while (size < buf_list->size) {
6162 qlnxr_populate_phys_mem_pbls(struct qlnxr_dev *dev,
6163 struct ib_phys_buf *buf_list, int buf_cnt,
6164 struct qlnxr_pbl *pbl, struct qlnxr_pbl_info *pbl_info)
6166 struct regpair *pbe;
6167 struct qlnxr_pbl *pbl_tbl;
6168 int pg_cnt, pages, pbe_cnt, total_num_pbes = 0;
6175 QL_DPRINT12(ha, "enter\n");
6178 QL_DPRINT11(ha, "PBL_INFO not initialized\n");
6182 if (!pbl_info->num_pbes) {
6183 QL_DPRINT11(ha, "pbl_info->num_pbes == 0\n");
6187 /* If we have a two layered pbl, the first pbl points to the rest
6188 * of the pbls and the first entry lays on the second pbl in the table
6190 if (pbl_info->two_layered)
6195 pbe = (struct regpair *)pbl_tbl->va;
6197 QL_DPRINT12(ha, "pbe is NULL\n");
6203 for (i = 0; i < buf_cnt; i++) {
6205 pages = buf_list->size >> PAGE_SHIFT;
6207 for (pg_cnt = 0; pg_cnt < pages; pg_cnt++) {
6208 /* store the page address in pbe */
6210 pbe_addr = buf_list->addr + (PAGE_SIZE * pg_cnt);
6212 pbe->lo = cpu_to_le32((u32)pbe_addr);
6213 pbe->hi = cpu_to_le32(((u32)(pbe_addr >> 32)));
6215 QL_DPRINT12(ha, "Populate pbl table:"
6216 " pbe->addr=0x%x:0x%x "
6217 " pbe_cnt = %d total_num_pbes=%d"
6218 " pbe=%p\n", pbe->lo, pbe->hi, pbe_cnt,
6219 total_num_pbes, pbe);
6225 if (total_num_pbes == pbl_info->num_pbes)
6228 /* if the given pbl is full storing the pbes,
6229 * move to next pbl. */
6231 if (pbe_cnt == (pbl_info->pbl_size / sizeof(u64))) {
6233 pbe = (struct regpair *)pbl_tbl->va;
6239 QL_DPRINT12(ha, "exit\n");
6244 qlnxr_reg_kernel_mr(struct ib_pd *ibpd,
6245 struct ib_phys_buf *buf_list,
6246 int buf_cnt, int acc, u64 *iova_start)
6249 struct qlnxr_dev *dev = get_qlnxr_dev((ibpd->device));
6250 struct qlnxr_mr *mr;
6251 struct qlnxr_pd *pd;
6253 size_t num_pages = 0;
6258 QL_DPRINT12(ha, "enter\n");
6260 pd = get_qlnxr_pd(ibpd);
6262 QL_DPRINT12(ha, "pd = %d buf_list = %p, buf_cnt = %d,"
6263 " iova_start = %p, acc = %d\n",
6264 pd->pd_id, buf_list, buf_cnt, iova_start, acc);
6266 //if (acc & IB_ACCESS_REMOTE_WRITE && !(acc & IB_ACCESS_LOCAL_WRITE)) {
6267 // QL_DPRINT11(ha, "(acc & IB_ACCESS_REMOTE_WRITE &&"
6268 // " !(acc & IB_ACCESS_LOCAL_WRITE))\n");
6269 // return ERR_PTR(-EINVAL);
6272 mr = kzalloc(sizeof(*mr), GFP_KERNEL);
6274 QL_DPRINT11(ha, "kzalloc(mr) failed\n");
6278 mr->type = QLNXR_MR_KERNEL;
6279 mr->iova_start = iova_start;
6281 rc = qlnxr_validate_phys_buf_list(ha, buf_list, buf_cnt, &length);
6285 num_pages = qlnxr_get_num_pages(ha, buf_list, buf_cnt);
6289 rc = qlnxr_init_mr_info(dev, &mr->info, num_pages, 1);
6292 "qlnxr_init_mr_info failed [%d]\n", rc);
6296 qlnxr_populate_phys_mem_pbls(dev, buf_list, buf_cnt, mr->info.pbl_table,
6297 &mr->info.pbl_info);
6299 rc = ecore_rdma_alloc_tid(dev->rdma_ctx, &mr->hw_mr.itid);
6302 QL_DPRINT11(ha, "roce alloc tid returned an error %d\n", rc);
6306 /* index only, 18 bit long, lkey = itid << 8 | key */
6307 mr->hw_mr.tid_type = ECORE_RDMA_TID_REGISTERED_MR;
6309 mr->hw_mr.pd = pd->pd_id;
6310 mr->hw_mr.local_read = 1;
6311 mr->hw_mr.local_write = (acc & IB_ACCESS_LOCAL_WRITE) ? 1 : 0;
6312 mr->hw_mr.remote_read = (acc & IB_ACCESS_REMOTE_READ) ? 1 : 0;
6313 mr->hw_mr.remote_write = (acc & IB_ACCESS_REMOTE_WRITE) ? 1 : 0;
6314 mr->hw_mr.remote_atomic = (acc & IB_ACCESS_REMOTE_ATOMIC) ? 1 : 0;
6315 mr->hw_mr.mw_bind = false; /* TBD MW BIND */
6316 mr->hw_mr.pbl_ptr = mr->info.pbl_table[0].pa;
6317 mr->hw_mr.pbl_two_level = mr->info.pbl_info.two_layered;
6318 mr->hw_mr.pbl_page_size_log = ilog2(mr->info.pbl_info.pbl_size);
6319 mr->hw_mr.page_size_log = ilog2(PAGE_SIZE); /* for the MR pages */
6323 mr->hw_mr.length = length;
6324 mr->hw_mr.vaddr = (uint64_t)iova_start;
6325 mr->hw_mr.zbva = false; /* TBD figure when this should be true */
6326 mr->hw_mr.phy_mr = false; /* Fast MR - True, Regular Register False */
6327 mr->hw_mr.dma_mr = false;
6329 rc = ecore_rdma_register_tid(dev->rdma_ctx, &mr->hw_mr);
6331 QL_DPRINT11(ha, "roce register tid returned an error %d\n", rc);
6335 mr->ibmr.lkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
6336 if (mr->hw_mr.remote_write || mr->hw_mr.remote_read ||
6337 mr->hw_mr.remote_atomic)
6338 mr->ibmr.rkey = mr->hw_mr.itid << 8 | mr->hw_mr.key;
6340 QL_DPRINT12(ha, "lkey: %x\n", mr->ibmr.lkey);
6345 ecore_rdma_free_tid(dev->rdma_ctx, mr->hw_mr.itid);
6347 qlnxr_free_pbl(dev, &mr->info.pbl_info, mr->info.pbl_table);
6351 QL_DPRINT12(ha, "exit [%d]\n", rc);
6352 return (ERR_PTR(rc));
6355 #endif /* #if __FreeBSD_version >= 1102000 */
6358 #if __FreeBSD_version >= 1102000
6359 qlnxr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr,
6360 struct ib_udata *udata)
6362 qlnxr_create_ah(struct ib_pd *ibpd, struct ib_ah_attr *attr)
6363 #endif /* #if __FreeBSD_version >= 1102000 */
6365 struct qlnxr_dev *dev;
6367 struct qlnxr_ah *ah;
6369 dev = get_qlnxr_dev((ibpd->device));
6372 QL_DPRINT12(ha, "in create_ah\n");
6374 ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
6376 QL_DPRINT12(ha, "no address handle can be allocated\n");
6377 return ERR_PTR(-ENOMEM);
6386 qlnxr_destroy_ah(struct ib_ah *ibah)
6388 struct qlnxr_dev *dev;
6390 struct qlnxr_ah *ah = get_qlnxr_ah(ibah);
6392 dev = get_qlnxr_dev((ibah->device));
6395 QL_DPRINT12(ha, "in destroy_ah\n");
6402 qlnxr_query_ah(struct ib_ah *ibah, struct ib_ah_attr *attr)
6404 struct qlnxr_dev *dev;
6407 dev = get_qlnxr_dev((ibah->device));
6409 QL_DPRINT12(ha, "Query AH not supported\n");
6414 qlnxr_modify_ah(struct ib_ah *ibah, struct ib_ah_attr *attr)
6416 struct qlnxr_dev *dev;
6419 dev = get_qlnxr_dev((ibah->device));
6421 QL_DPRINT12(ha, "Modify AH not supported\n");
6425 #if __FreeBSD_version >= 1102000
6427 qlnxr_process_mad(struct ib_device *ibdev,
6428 int process_mad_flags,
6430 const struct ib_wc *in_wc,
6431 const struct ib_grh *in_grh,
6432 const struct ib_mad_hdr *mad_hdr,
6434 struct ib_mad_hdr *out_mad,
6435 size_t *out_mad_size,
6436 u16 *out_mad_pkey_index)
6441 qlnxr_process_mad(struct ib_device *ibdev,
6442 int process_mad_flags,
6444 struct ib_wc *in_wc,
6445 struct ib_grh *in_grh,
6446 struct ib_mad *in_mad,
6447 struct ib_mad *out_mad)
6449 #endif /* #if __FreeBSD_version >= 1102000 */
6451 struct qlnxr_dev *dev;
6454 dev = get_qlnxr_dev(ibdev);
6456 QL_DPRINT12(ha, "process mad not supported\n");
6459 // QL_DPRINT12(ha, "qlnxr_process_mad in_mad %x %x %x %x %x %x %x %x\n",
6460 // in_mad->mad_hdr.attr_id, in_mad->mad_hdr.base_version,
6461 // in_mad->mad_hdr.attr_mod, in_mad->mad_hdr.class_specific,
6462 // in_mad->mad_hdr.class_version, in_mad->mad_hdr.method,
6463 // in_mad->mad_hdr.mgmt_class, in_mad->mad_hdr.status);
6465 // return IB_MAD_RESULT_SUCCESS;
6469 #if __FreeBSD_version >= 1102000
6471 qlnxr_get_port_immutable(struct ib_device *ibdev, u8 port_num,
6472 struct ib_port_immutable *immutable)
6474 struct qlnxr_dev *dev;
6476 struct ib_port_attr attr;
6479 dev = get_qlnxr_dev(ibdev);
6482 QL_DPRINT12(ha, "enter\n");
6484 err = qlnxr_query_port(ibdev, port_num, &attr);
6488 if (QLNX_IS_IWARP(dev)) {
6489 immutable->pkey_tbl_len = 1;
6490 immutable->gid_tbl_len = 1;
6491 immutable->core_cap_flags = RDMA_CORE_PORT_IWARP;
6492 immutable->max_mad_size = 0;
6494 immutable->pkey_tbl_len = attr.pkey_tbl_len;
6495 immutable->gid_tbl_len = attr.gid_tbl_len;
6496 immutable->core_cap_flags = RDMA_CORE_PORT_IBA_ROCE;
6497 immutable->max_mad_size = IB_MGMT_MAD_SIZE;
6500 QL_DPRINT12(ha, "exit\n");
6503 #endif /* #if __FreeBSD_version > 1102000 */
6506 /***** iWARP related functions *************/
6510 qlnxr_iw_mpa_request(void *context,
6511 struct ecore_iwarp_cm_event_params *params)
6513 struct qlnxr_iw_listener *listener = (struct qlnxr_iw_listener *)context;
6514 struct qlnxr_dev *dev = listener->dev;
6515 struct qlnxr_iw_ep *ep;
6516 struct iw_cm_event event;
6517 struct sockaddr_in *laddr;
6518 struct sockaddr_in *raddr;
6523 QL_DPRINT12(ha, "enter\n");
6525 if (params->cm_info->ip_version != ECORE_TCP_IPV4) {
6526 QL_DPRINT11(ha, "only IPv4 supported [0x%x]\n",
6527 params->cm_info->ip_version);
6531 ep = kzalloc(sizeof(*ep), GFP_ATOMIC);
6534 QL_DPRINT11(ha, "kzalloc{ep) failed\n");
6539 ep->ecore_context = params->ep_context;
6541 memset(&event, 0, sizeof(event));
6543 event.event = IW_CM_EVENT_CONNECT_REQUEST;
6544 event.status = params->status;
6546 laddr = (struct sockaddr_in *)&event.local_addr;
6547 raddr = (struct sockaddr_in *)&event.remote_addr;
6549 laddr->sin_family = AF_INET;
6550 raddr->sin_family = AF_INET;
6552 laddr->sin_port = htons(params->cm_info->local_port);
6553 raddr->sin_port = htons(params->cm_info->remote_port);
6555 laddr->sin_addr.s_addr = htonl(params->cm_info->local_ip[0]);
6556 raddr->sin_addr.s_addr = htonl(params->cm_info->remote_ip[0]);
6558 event.provider_data = (void *)ep;
6559 event.private_data = (void *)params->cm_info->private_data;
6560 event.private_data_len = (u8)params->cm_info->private_data_len;
6562 #if __FreeBSD_version >= 1100000
6563 event.ord = params->cm_info->ord;
6564 event.ird = params->cm_info->ird;
6565 #endif /* #if __FreeBSD_version >= 1100000 */
6567 listener->cm_id->event_handler(listener->cm_id, &event);
6569 QL_DPRINT12(ha, "exit\n");
6575 qlnxr_iw_issue_event(void *context,
6576 struct ecore_iwarp_cm_event_params *params,
6577 enum iw_cm_event_type event_type,
6580 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6581 struct qlnxr_dev *dev = ep->dev;
6582 struct iw_cm_event event;
6587 QL_DPRINT12(ha, "enter\n");
6589 memset(&event, 0, sizeof(event));
6590 event.status = params->status;
6591 event.event = event_type;
6593 if (params->cm_info != NULL) {
6594 #if __FreeBSD_version >= 1100000
6595 event.ird = params->cm_info->ird;
6596 event.ord = params->cm_info->ord;
6597 QL_DPRINT12(ha, "ord=[%d] \n", event.ord);
6598 QL_DPRINT12(ha, "ird=[%d] \n", event.ird);
6599 #endif /* #if __FreeBSD_version >= 1100000 */
6601 event.private_data_len = params->cm_info->private_data_len;
6602 event.private_data = (void *)params->cm_info->private_data;
6603 QL_DPRINT12(ha, "private_data_len=[%d] \n",
6604 event.private_data_len);
6607 QL_DPRINT12(ha, "event=[%d] %s\n", event.event, str);
6608 QL_DPRINT12(ha, "status=[%d] \n", event.status);
6612 ep->cm_id->event_handler(ep->cm_id, &event);
6614 QL_DPRINT11(ha, "ep->cm_id == NULL \n");
6616 QL_DPRINT11(ha, "ep == NULL \n");
6619 QL_DPRINT12(ha, "exit\n");
6625 qlnxr_iw_close_event(void *context,
6626 struct ecore_iwarp_cm_event_params *params)
6628 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6629 struct qlnxr_dev *dev = ep->dev;
6634 QL_DPRINT12(ha, "enter\n");
6637 qlnxr_iw_issue_event(context,
6640 "IW_CM_EVENT_EVENT_CLOSE");
6641 ep->cm_id->rem_ref(ep->cm_id);
6645 QL_DPRINT12(ha, "exit\n");
6650 #if __FreeBSD_version >= 1102000
6653 qlnxr_iw_passive_complete(void *context,
6654 struct ecore_iwarp_cm_event_params *params)
6656 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6657 struct qlnxr_dev *dev = ep->dev;
6662 /* We will only reach the following state if MPA_REJECT was called on
6663 * passive. In this case there will be no associated QP.
6665 if ((params->status == -ECONNREFUSED) && (ep->qp == NULL)) {
6666 QL_DPRINT11(ha, "PASSIVE connection refused releasing ep...\n");
6671 /* We always issue an established event, however, ofed does not look
6672 * at event code for established. So if there was a failure, we follow
6675 qlnxr_iw_issue_event(context,
6677 IW_CM_EVENT_ESTABLISHED,
6678 "IW_CM_EVENT_ESTABLISHED");
6680 if (params->status < 0) {
6681 qlnxr_iw_close_event(context, params);
6687 struct qlnxr_discon_work {
6688 struct work_struct work;
6689 struct qlnxr_iw_ep *ep;
6690 enum ecore_iwarp_event_type event;
6695 qlnxr_iw_disconnect_worker(struct work_struct *work)
6697 struct qlnxr_discon_work *dwork =
6698 container_of(work, struct qlnxr_discon_work, work);
6699 struct ecore_rdma_modify_qp_in_params qp_params = { 0 };
6700 struct qlnxr_iw_ep *ep = dwork->ep;
6701 struct qlnxr_dev *dev = ep->dev;
6702 struct qlnxr_qp *qp = ep->qp;
6703 struct iw_cm_event event;
6705 if (qp->destroyed) {
6707 qlnxr_iw_qp_rem_ref(&qp->ibqp);
6711 memset(&event, 0, sizeof(event));
6712 event.status = dwork->status;
6713 event.event = IW_CM_EVENT_DISCONNECT;
6715 /* Success means graceful disconnect was requested. modifying
6716 * to SQD is translated to graceful disconnect. O/w reset is sent
6719 qp_params.new_state = ECORE_ROCE_QP_STATE_ERR;
6721 qp_params.new_state = ECORE_ROCE_QP_STATE_SQD;
6726 ep->cm_id->event_handler(ep->cm_id, &event);
6728 SET_FIELD(qp_params.modify_flags,
6729 ECORE_RDMA_MODIFY_QP_VALID_NEW_STATE, 1);
6731 ecore_rdma_modify_qp(dev->rdma_ctx, qp->ecore_qp, &qp_params);
6733 qlnxr_iw_qp_rem_ref(&qp->ibqp);
6739 qlnxr_iw_disconnect_event(void *context,
6740 struct ecore_iwarp_cm_event_params *params)
6742 struct qlnxr_discon_work *work;
6743 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6744 struct qlnxr_dev *dev = ep->dev;
6745 struct qlnxr_qp *qp = ep->qp;
6747 work = kzalloc(sizeof(*work), GFP_ATOMIC);
6751 qlnxr_iw_qp_add_ref(&qp->ibqp);
6753 work->event = params->event;
6754 work->status = params->status;
6756 INIT_WORK(&work->work, qlnxr_iw_disconnect_worker);
6757 queue_work(dev->iwarp_wq, &work->work);
6762 #endif /* #if __FreeBSD_version >= 1102000 */
6765 qlnxr_iw_mpa_reply(void *context,
6766 struct ecore_iwarp_cm_event_params *params)
6768 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6769 struct qlnxr_dev *dev = ep->dev;
6770 struct ecore_iwarp_send_rtr_in rtr_in;
6776 QL_DPRINT12(ha, "enter\n");
6778 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
6781 bzero(&rtr_in, sizeof(struct ecore_iwarp_send_rtr_in));
6782 rtr_in.ep_context = params->ep_context;
6784 rc = ecore_iwarp_send_rtr(dev->rdma_ctx, &rtr_in);
6786 QL_DPRINT12(ha, "exit rc = %d\n", rc);
6792 qlnxr_iw_qp_event(void *context,
6793 struct ecore_iwarp_cm_event_params *params,
6794 enum ib_event_type ib_event,
6797 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6798 struct qlnxr_dev *dev = ep->dev;
6799 struct ib_qp *ibqp = &(ep->qp->ibqp);
6800 struct ib_event event;
6806 "[context, event, event_handler] = [%p, 0x%x, %s, %p] enter\n",
6807 context, params->event, str, ibqp->event_handler);
6809 if (ibqp->event_handler) {
6810 event.event = ib_event;
6811 event.device = ibqp->device;
6812 event.element.qp = ibqp;
6813 ibqp->event_handler(&event, ibqp->qp_context);
6820 qlnxr_iw_event_handler(void *context,
6821 struct ecore_iwarp_cm_event_params *params)
6823 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6824 struct qlnxr_dev *dev = ep->dev;
6829 QL_DPRINT12(ha, "[context, event] = [%p, 0x%x] "
6830 "enter\n", context, params->event);
6832 switch (params->event) {
6834 /* Passive side request received */
6835 case ECORE_IWARP_EVENT_MPA_REQUEST:
6836 qlnxr_iw_mpa_request(context, params);
6839 case ECORE_IWARP_EVENT_ACTIVE_MPA_REPLY:
6840 qlnxr_iw_mpa_reply(context, params);
6843 /* Passive side established ( ack on mpa response ) */
6844 case ECORE_IWARP_EVENT_PASSIVE_COMPLETE:
6846 #if __FreeBSD_version >= 1102000
6848 ep->during_connect = 0;
6849 qlnxr_iw_passive_complete(context, params);
6852 qlnxr_iw_issue_event(context,
6854 IW_CM_EVENT_ESTABLISHED,
6855 "IW_CM_EVENT_ESTABLISHED");
6856 #endif /* #if __FreeBSD_version >= 1102000 */
6859 /* Active side reply received */
6860 case ECORE_IWARP_EVENT_ACTIVE_COMPLETE:
6861 ep->during_connect = 0;
6862 qlnxr_iw_issue_event(context,
6864 IW_CM_EVENT_CONNECT_REPLY,
6865 "IW_CM_EVENT_CONNECT_REPLY");
6866 if (params->status < 0) {
6867 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)context;
6869 ep->cm_id->rem_ref(ep->cm_id);
6874 case ECORE_IWARP_EVENT_DISCONNECT:
6876 #if __FreeBSD_version >= 1102000
6877 qlnxr_iw_disconnect_event(context, params);
6879 qlnxr_iw_issue_event(context,
6881 IW_CM_EVENT_DISCONNECT,
6882 "IW_CM_EVENT_DISCONNECT");
6883 qlnxr_iw_close_event(context, params);
6884 #endif /* #if __FreeBSD_version >= 1102000 */
6887 case ECORE_IWARP_EVENT_CLOSE:
6888 ep->during_connect = 0;
6889 qlnxr_iw_close_event(context, params);
6892 case ECORE_IWARP_EVENT_RQ_EMPTY:
6893 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
6894 "IWARP_EVENT_RQ_EMPTY");
6897 case ECORE_IWARP_EVENT_IRQ_FULL:
6898 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
6899 "IWARP_EVENT_IRQ_FULL");
6902 case ECORE_IWARP_EVENT_LLP_TIMEOUT:
6903 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
6904 "IWARP_EVENT_LLP_TIMEOUT");
6907 case ECORE_IWARP_EVENT_REMOTE_PROTECTION_ERROR:
6908 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_ACCESS_ERR,
6909 "IWARP_EVENT_REMOTE_PROTECTION_ERROR");
6912 case ECORE_IWARP_EVENT_CQ_OVERFLOW:
6913 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
6914 "QED_IWARP_EVENT_CQ_OVERFLOW");
6917 case ECORE_IWARP_EVENT_QP_CATASTROPHIC:
6918 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
6919 "QED_IWARP_EVENT_QP_CATASTROPHIC");
6922 case ECORE_IWARP_EVENT_LOCAL_ACCESS_ERROR:
6923 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_ACCESS_ERR,
6924 "IWARP_EVENT_LOCAL_ACCESS_ERROR");
6927 case ECORE_IWARP_EVENT_REMOTE_OPERATION_ERROR:
6928 qlnxr_iw_qp_event(context, params, IB_EVENT_QP_FATAL,
6929 "IWARP_EVENT_REMOTE_OPERATION_ERROR");
6932 case ECORE_IWARP_EVENT_TERMINATE_RECEIVED:
6933 QL_DPRINT12(ha, "Got terminate message"
6934 " ECORE_IWARP_EVENT_TERMINATE_RECEIVED\n");
6939 "Unknown event [0x%x] received \n", params->event);
6943 QL_DPRINT12(ha, "[context, event] = [%p, 0x%x] "
6944 "exit\n", context, params->event);
6949 qlnxr_addr4_resolve(struct qlnxr_dev *dev,
6950 struct sockaddr_in *src_in,
6951 struct sockaddr_in *dst_in,
6956 #if __FreeBSD_version >= 1100000
6957 rc = arpresolve(dev->ha->ifp, 0, NULL, (struct sockaddr *)dst_in,
6958 dst_mac, NULL, NULL);
6960 struct llentry *lle;
6962 rc = arpresolve(dev->ha->ifp, NULL, NULL, (struct sockaddr *)dst_in,
6966 QL_DPRINT12(dev->ha, "rc = %d "
6967 "sa_len = 0x%x sa_family = 0x%x IP Address = %d.%d.%d.%d "
6968 "Dest MAC %02x:%02x:%02x:%02x:%02x:%02x\n", rc,
6969 dst_in->sin_len, dst_in->sin_family,
6970 NIPQUAD((dst_in->sin_addr.s_addr)),
6971 dst_mac[0], dst_mac[1], dst_mac[2],
6972 dst_mac[3], dst_mac[4], dst_mac[5]);
6978 qlnxr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
6980 struct qlnxr_dev *dev;
6981 struct ecore_iwarp_connect_out out_params;
6982 struct ecore_iwarp_connect_in in_params;
6983 struct qlnxr_iw_ep *ep;
6984 struct qlnxr_qp *qp;
6985 struct sockaddr_in *laddr;
6986 struct sockaddr_in *raddr;
6990 dev = get_qlnxr_dev((cm_id->device));
6993 QL_DPRINT12(ha, "[cm_id, conn_param] = [%p, %p] "
6994 "enter \n", cm_id, conn_param);
6996 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
6999 qp = idr_find(&dev->qpidr, conn_param->qpn);
7001 laddr = (struct sockaddr_in *)&cm_id->local_addr;
7002 raddr = (struct sockaddr_in *)&cm_id->remote_addr;
7005 "local = [%d.%d.%d.%d, %d] remote = [%d.%d.%d.%d, %d]\n",
7006 NIPQUAD((laddr->sin_addr.s_addr)), laddr->sin_port,
7007 NIPQUAD((raddr->sin_addr.s_addr)), raddr->sin_port);
7009 ep = kzalloc(sizeof(*ep), GFP_KERNEL);
7011 QL_DPRINT11(ha, "struct qlnxr_iw_ep "
7012 "alloc memory failed\n");
7018 cm_id->add_ref(cm_id);
7021 memset(&in_params, 0, sizeof (struct ecore_iwarp_connect_in));
7022 memset(&out_params, 0, sizeof (struct ecore_iwarp_connect_out));
7024 in_params.event_cb = qlnxr_iw_event_handler;
7025 in_params.cb_context = ep;
7027 in_params.cm_info.ip_version = ECORE_TCP_IPV4;
7029 in_params.cm_info.remote_ip[0] = ntohl(raddr->sin_addr.s_addr);
7030 in_params.cm_info.local_ip[0] = ntohl(laddr->sin_addr.s_addr);
7031 in_params.cm_info.remote_port = ntohs(raddr->sin_port);
7032 in_params.cm_info.local_port = ntohs(laddr->sin_port);
7033 in_params.cm_info.vlan = 0;
7034 in_params.mss = dev->ha->ifp->if_mtu - 40;
7036 QL_DPRINT12(ha, "remote_ip = [%d.%d.%d.%d] "
7037 "local_ip = [%d.%d.%d.%d] remote_port = %d local_port = %d "
7039 NIPQUAD((in_params.cm_info.remote_ip[0])),
7040 NIPQUAD((in_params.cm_info.local_ip[0])),
7041 in_params.cm_info.remote_port, in_params.cm_info.local_port,
7042 in_params.cm_info.vlan);
7044 rc = qlnxr_addr4_resolve(dev, laddr, raddr, (u8 *)in_params.remote_mac_addr);
7047 QL_DPRINT11(ha, "qlnxr_addr4_resolve failed\n");
7051 QL_DPRINT12(ha, "ord = %d ird=%d private_data=%p"
7052 " private_data_len=%d rq_psn=%d\n",
7053 conn_param->ord, conn_param->ird, conn_param->private_data,
7054 conn_param->private_data_len, qp->rq_psn);
7056 in_params.cm_info.ord = conn_param->ord;
7057 in_params.cm_info.ird = conn_param->ird;
7058 in_params.cm_info.private_data = conn_param->private_data;
7059 in_params.cm_info.private_data_len = conn_param->private_data_len;
7060 in_params.qp = qp->ecore_qp;
7062 memcpy(in_params.local_mac_addr, dev->ha->primary_mac, ETH_ALEN);
7064 rc = ecore_iwarp_connect(dev->rdma_ctx, &in_params, &out_params);
7067 QL_DPRINT12(ha, "ecore_iwarp_connect failed\n");
7071 QL_DPRINT12(ha, "exit\n");
7076 cm_id->rem_ref(cm_id);
7079 QL_DPRINT12(ha, "exit [%d]\n", rc);
7084 qlnxr_iw_create_listen(struct iw_cm_id *cm_id, int backlog)
7086 struct qlnxr_dev *dev;
7087 struct qlnxr_iw_listener *listener;
7088 struct ecore_iwarp_listen_in iparams;
7089 struct ecore_iwarp_listen_out oparams;
7090 struct sockaddr_in *laddr;
7094 dev = get_qlnxr_dev((cm_id->device));
7097 QL_DPRINT12(ha, "enter\n");
7099 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
7102 laddr = (struct sockaddr_in *)&cm_id->local_addr;
7104 listener = kzalloc(sizeof(*listener), GFP_KERNEL);
7106 if (listener == NULL) {
7107 QL_DPRINT11(ha, "listener memory alloc failed\n");
7111 listener->dev = dev;
7112 cm_id->add_ref(cm_id);
7113 listener->cm_id = cm_id;
7114 listener->backlog = backlog;
7116 memset(&iparams, 0, sizeof (struct ecore_iwarp_listen_in));
7117 memset(&oparams, 0, sizeof (struct ecore_iwarp_listen_out));
7119 iparams.cb_context = listener;
7120 iparams.event_cb = qlnxr_iw_event_handler;
7121 iparams.max_backlog = backlog;
7123 iparams.ip_version = ECORE_TCP_IPV4;
7125 iparams.ip_addr[0] = ntohl(laddr->sin_addr.s_addr);
7126 iparams.port = ntohs(laddr->sin_port);
7129 QL_DPRINT12(ha, "[%d.%d.%d.%d, %d] iparamsport=%d\n",
7130 NIPQUAD((laddr->sin_addr.s_addr)),
7131 laddr->sin_port, iparams.port);
7133 rc = ecore_iwarp_create_listen(dev->rdma_ctx, &iparams, &oparams);
7136 "ecore_iwarp_create_listen failed rc = %d\n", rc);
7140 listener->ecore_handle = oparams.handle;
7141 cm_id->provider_data = listener;
7143 QL_DPRINT12(ha, "exit\n");
7147 cm_id->rem_ref(cm_id);
7150 QL_DPRINT12(ha, "exit [%d]\n", rc);
7155 qlnxr_iw_destroy_listen(struct iw_cm_id *cm_id)
7157 struct qlnxr_iw_listener *listener = cm_id->provider_data;
7158 struct qlnxr_dev *dev = get_qlnxr_dev((cm_id->device));
7164 QL_DPRINT12(ha, "enter\n");
7166 if (listener->ecore_handle)
7167 rc = ecore_iwarp_destroy_listen(dev->rdma_ctx,
7168 listener->ecore_handle);
7170 cm_id->rem_ref(cm_id);
7172 QL_DPRINT12(ha, "exit [%d]\n", rc);
7177 qlnxr_iw_accept(struct iw_cm_id *cm_id,
7178 struct iw_cm_conn_param *conn_param)
7180 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)cm_id->provider_data;
7181 struct qlnxr_dev *dev = ep->dev;
7182 struct qlnxr_qp *qp;
7183 struct ecore_iwarp_accept_in params;
7189 QL_DPRINT12(ha, "enter qpid=%d\n", conn_param->qpn);
7191 if (!(ha->ifp->if_drv_flags & IFF_DRV_RUNNING))
7194 qp = idr_find(&dev->qpidr, conn_param->qpn);
7196 QL_DPRINT11(ha, "idr_find failed invalid qpn = %d\n",
7202 cm_id->add_ref(cm_id);
7205 params.ep_context = ep->ecore_context;
7206 params.cb_context = ep;
7207 params.qp = ep->qp->ecore_qp;
7208 params.private_data = conn_param->private_data;
7209 params.private_data_len = conn_param->private_data_len;
7210 params.ird = conn_param->ird;
7211 params.ord = conn_param->ord;
7213 rc = ecore_iwarp_accept(dev->rdma_ctx, ¶ms);
7215 QL_DPRINT11(ha, "ecore_iwarp_accept failed %d\n", rc);
7219 QL_DPRINT12(ha, "exit\n");
7222 cm_id->rem_ref(cm_id);
7223 QL_DPRINT12(ha, "exit rc = %d\n", rc);
7228 qlnxr_iw_reject(struct iw_cm_id *cm_id, const void *pdata, u8 pdata_len)
7230 #if __FreeBSD_version >= 1102000
7232 struct qlnxr_iw_ep *ep = (struct qlnxr_iw_ep *)cm_id->provider_data;
7233 struct qlnxr_dev *dev = ep->dev;
7234 struct ecore_iwarp_reject_in params;
7237 params.ep_context = ep->ecore_context;
7238 params.cb_context = ep;
7239 params.private_data = pdata;
7240 params.private_data_len = pdata_len;
7243 rc = ecore_iwarp_reject(dev->rdma_ctx, ¶ms);
7249 printf("iWARP reject_cr not implemented\n");
7252 #endif /* #if __FreeBSD_version >= 1102000 */
7256 qlnxr_iw_qp_add_ref(struct ib_qp *ibqp)
7258 struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
7263 QL_DPRINT12(ha, "enter ibqp = %p\n", ibqp);
7265 atomic_inc(&qp->refcnt);
7267 QL_DPRINT12(ha, "exit \n");
7272 qlnxr_iw_qp_rem_ref(struct ib_qp *ibqp)
7274 struct qlnxr_qp *qp = get_qlnxr_qp(ibqp);
7279 QL_DPRINT12(ha, "enter ibqp = %p qp = %p\n", ibqp, qp);
7281 if (atomic_dec_and_test(&qp->refcnt)) {
7282 qlnxr_idr_remove(qp->dev, qp->qp_id);
7286 QL_DPRINT12(ha, "exit \n");
7291 qlnxr_iw_get_qp(struct ib_device *ibdev, int qpn)
7293 struct qlnxr_dev *dev = get_qlnxr_dev(ibdev);
7299 QL_DPRINT12(ha, "enter dev = %p ibdev = %p qpn = %d\n", dev, ibdev, qpn);
7301 qp = idr_find(&dev->qpidr, qpn);
7303 QL_DPRINT12(ha, "exit qp = %p\n", qp);