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