2 * Copyright (c) 2004 Topspin Communications. All rights reserved.
3 * Copyright (c) 2005 Cisco Systems. All rights reserved.
4 * Copyright (c) 2005 Mellanox Technologies. All rights reserved.
5 * Copyright (c) 2004 Voltaire, Inc. All rights reserved.
6 * Copyright (c) 2005 Open Grid Computing, Inc. All rights reserved.
8 * This software is available to you under a choice of one of two
9 * licenses. You may choose to be licensed under the terms of the GNU
10 * General Public License (GPL) Version 2, available from the file
11 * COPYING in the main directory of this source tree, or the
12 * OpenIB.org BSD license below:
14 * Redistribution and use in source and binary forms, with or
15 * without modification, are permitted provided that the following
18 * - Redistributions of source code must retain the above
19 * copyright notice, this list of conditions and the following
22 * - Redistributions in binary form must reproduce the above
23 * copyright notice, this list of conditions and the following
24 * disclaimer in the documentation and/or other materials
25 * provided with the distribution.
27 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
28 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
29 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
30 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
31 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
32 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38 #include <linux/delay.h>
39 #include <linux/gfp.h>
43 #include "c2_status.h"
45 #define C2_MAX_ORD_PER_QP 128
46 #define C2_MAX_IRD_PER_QP 128
48 #define C2_HINT_MAKE(q_index, hint_count) (((q_index) << 16) | hint_count)
49 #define C2_HINT_GET_INDEX(hint) (((hint) & 0x7FFF0000) >> 16)
50 #define C2_HINT_GET_COUNT(hint) ((hint) & 0x0000FFFF)
53 static const u8 c2_opcode
[] = {
54 [IB_WR_SEND
] = C2_WR_TYPE_SEND
,
55 [IB_WR_SEND_WITH_IMM
] = NO_SUPPORT
,
56 [IB_WR_RDMA_WRITE
] = C2_WR_TYPE_RDMA_WRITE
,
57 [IB_WR_RDMA_WRITE_WITH_IMM
] = NO_SUPPORT
,
58 [IB_WR_RDMA_READ
] = C2_WR_TYPE_RDMA_READ
,
59 [IB_WR_ATOMIC_CMP_AND_SWP
] = NO_SUPPORT
,
60 [IB_WR_ATOMIC_FETCH_AND_ADD
] = NO_SUPPORT
,
63 static int to_c2_state(enum ib_qp_state ib_state
)
67 return C2_QP_STATE_IDLE
;
69 return C2_QP_STATE_RTS
;
71 return C2_QP_STATE_CLOSING
;
73 return C2_QP_STATE_CLOSING
;
75 return C2_QP_STATE_ERROR
;
81 static int to_ib_state(enum c2_qp_state c2_state
)
84 case C2_QP_STATE_IDLE
:
86 case C2_QP_STATE_CONNECTING
:
90 case C2_QP_STATE_CLOSING
:
92 case C2_QP_STATE_ERROR
:
94 case C2_QP_STATE_TERMINATE
:
101 static const char *to_ib_state_str(int ib_state
)
103 static const char *state_str
[] = {
112 if (ib_state
< IB_QPS_RESET
||
113 ib_state
> IB_QPS_ERR
)
114 return "<invalid IB QP state>";
116 ib_state
-= IB_QPS_RESET
;
117 return state_str
[ib_state
];
120 void c2_set_qp_state(struct c2_qp
*qp
, int c2_state
)
122 int new_state
= to_ib_state(c2_state
);
124 pr_debug("%s: qp[%p] state modify %s --> %s\n",
127 to_ib_state_str(qp
->state
),
128 to_ib_state_str(new_state
));
129 qp
->state
= new_state
;
132 #define C2_QP_NO_ATTR_CHANGE 0xFFFFFFFF
134 int c2_qp_modify(struct c2_dev
*c2dev
, struct c2_qp
*qp
,
135 struct ib_qp_attr
*attr
, int attr_mask
)
137 struct c2wr_qp_modify_req wr
;
138 struct c2wr_qp_modify_rep
*reply
;
139 struct c2_vq_req
*vq_req
;
144 pr_debug("%s:%d qp=%p, %s --> %s\n",
147 to_ib_state_str(qp
->state
),
148 to_ib_state_str(attr
->qp_state
));
150 vq_req
= vq_req_alloc(c2dev
);
154 c2_wr_set_id(&wr
, CCWR_QP_MODIFY
);
155 wr
.hdr
.context
= (unsigned long) vq_req
;
156 wr
.rnic_handle
= c2dev
->adapter_handle
;
157 wr
.qp_handle
= qp
->adapter_handle
;
158 wr
.ord
= cpu_to_be32(C2_QP_NO_ATTR_CHANGE
);
159 wr
.ird
= cpu_to_be32(C2_QP_NO_ATTR_CHANGE
);
160 wr
.sq_depth
= cpu_to_be32(C2_QP_NO_ATTR_CHANGE
);
161 wr
.rq_depth
= cpu_to_be32(C2_QP_NO_ATTR_CHANGE
);
163 if (attr_mask
& IB_QP_STATE
) {
164 /* Ensure the state is valid */
165 if (attr
->qp_state
< 0 || attr
->qp_state
> IB_QPS_ERR
) {
170 wr
.next_qp_state
= cpu_to_be32(to_c2_state(attr
->qp_state
));
172 if (attr
->qp_state
== IB_QPS_ERR
) {
173 spin_lock_irqsave(&qp
->lock
, flags
);
174 if (qp
->cm_id
&& qp
->state
== IB_QPS_RTS
) {
175 pr_debug("Generating CLOSE event for QP-->ERR, "
176 "qp=%p, cm_id=%p\n",qp
,qp
->cm_id
);
177 /* Generate an CLOSE event */
178 vq_req
->cm_id
= qp
->cm_id
;
179 vq_req
->event
= IW_CM_EVENT_CLOSE
;
181 spin_unlock_irqrestore(&qp
->lock
, flags
);
183 next_state
= attr
->qp_state
;
185 } else if (attr_mask
& IB_QP_CUR_STATE
) {
187 if (attr
->cur_qp_state
!= IB_QPS_RTR
&&
188 attr
->cur_qp_state
!= IB_QPS_RTS
&&
189 attr
->cur_qp_state
!= IB_QPS_SQD
&&
190 attr
->cur_qp_state
!= IB_QPS_SQE
) {
195 cpu_to_be32(to_c2_state(attr
->cur_qp_state
));
197 next_state
= attr
->cur_qp_state
;
204 /* reference the request struct */
205 vq_req_get(c2dev
, vq_req
);
207 err
= vq_send_wr(c2dev
, (union c2wr
*) & wr
);
209 vq_req_put(c2dev
, vq_req
);
213 err
= vq_wait_for_reply(c2dev
, vq_req
);
217 reply
= (struct c2wr_qp_modify_rep
*) (unsigned long) vq_req
->reply_msg
;
223 err
= c2_errno(reply
);
225 qp
->state
= next_state
;
228 pr_debug("%s: c2_errno=%d\n", __func__
, err
);
231 * If we're going to error and generating the event here, then
232 * we need to remove the reference because there will be no
233 * close event generated by the adapter
235 spin_lock_irqsave(&qp
->lock
, flags
);
236 if (vq_req
->event
==IW_CM_EVENT_CLOSE
&& qp
->cm_id
) {
237 qp
->cm_id
->rem_ref(qp
->cm_id
);
240 spin_unlock_irqrestore(&qp
->lock
, flags
);
242 vq_repbuf_free(c2dev
, reply
);
244 vq_req_free(c2dev
, vq_req
);
246 pr_debug("%s:%d qp=%p, cur_state=%s\n",
249 to_ib_state_str(qp
->state
));
253 int c2_qp_set_read_limits(struct c2_dev
*c2dev
, struct c2_qp
*qp
,
256 struct c2wr_qp_modify_req wr
;
257 struct c2wr_qp_modify_rep
*reply
;
258 struct c2_vq_req
*vq_req
;
261 vq_req
= vq_req_alloc(c2dev
);
265 c2_wr_set_id(&wr
, CCWR_QP_MODIFY
);
266 wr
.hdr
.context
= (unsigned long) vq_req
;
267 wr
.rnic_handle
= c2dev
->adapter_handle
;
268 wr
.qp_handle
= qp
->adapter_handle
;
269 wr
.ord
= cpu_to_be32(ord
);
270 wr
.ird
= cpu_to_be32(ird
);
271 wr
.sq_depth
= cpu_to_be32(C2_QP_NO_ATTR_CHANGE
);
272 wr
.rq_depth
= cpu_to_be32(C2_QP_NO_ATTR_CHANGE
);
273 wr
.next_qp_state
= cpu_to_be32(C2_QP_NO_ATTR_CHANGE
);
275 /* reference the request struct */
276 vq_req_get(c2dev
, vq_req
);
278 err
= vq_send_wr(c2dev
, (union c2wr
*) & wr
);
280 vq_req_put(c2dev
, vq_req
);
284 err
= vq_wait_for_reply(c2dev
, vq_req
);
288 reply
= (struct c2wr_qp_modify_rep
*) (unsigned long)
295 err
= c2_errno(reply
);
296 vq_repbuf_free(c2dev
, reply
);
298 vq_req_free(c2dev
, vq_req
);
302 static int destroy_qp(struct c2_dev
*c2dev
, struct c2_qp
*qp
)
304 struct c2_vq_req
*vq_req
;
305 struct c2wr_qp_destroy_req wr
;
306 struct c2wr_qp_destroy_rep
*reply
;
311 * Allocate a verb request message
313 vq_req
= vq_req_alloc(c2dev
);
321 c2_wr_set_id(&wr
, CCWR_QP_DESTROY
);
322 wr
.hdr
.context
= (unsigned long) vq_req
;
323 wr
.rnic_handle
= c2dev
->adapter_handle
;
324 wr
.qp_handle
= qp
->adapter_handle
;
327 * reference the request struct. dereferenced in the int handler.
329 vq_req_get(c2dev
, vq_req
);
331 spin_lock_irqsave(&qp
->lock
, flags
);
332 if (qp
->cm_id
&& qp
->state
== IB_QPS_RTS
) {
333 pr_debug("destroy_qp: generating CLOSE event for QP-->ERR, "
334 "qp=%p, cm_id=%p\n",qp
,qp
->cm_id
);
335 /* Generate an CLOSE event */
337 vq_req
->cm_id
= qp
->cm_id
;
338 vq_req
->event
= IW_CM_EVENT_CLOSE
;
340 spin_unlock_irqrestore(&qp
->lock
, flags
);
345 err
= vq_send_wr(c2dev
, (union c2wr
*) & wr
);
347 vq_req_put(c2dev
, vq_req
);
352 * Wait for reply from adapter
354 err
= vq_wait_for_reply(c2dev
, vq_req
);
362 reply
= (struct c2wr_qp_destroy_rep
*) (unsigned long) (vq_req
->reply_msg
);
368 spin_lock_irqsave(&qp
->lock
, flags
);
370 qp
->cm_id
->rem_ref(qp
->cm_id
);
373 spin_unlock_irqrestore(&qp
->lock
, flags
);
375 vq_repbuf_free(c2dev
, reply
);
377 vq_req_free(c2dev
, vq_req
);
381 static int c2_alloc_qpn(struct c2_dev
*c2dev
, struct c2_qp
*qp
)
385 idr_preload(GFP_KERNEL
);
386 spin_lock_irq(&c2dev
->qp_table
.lock
);
388 ret
= idr_alloc_cyclic(&c2dev
->qp_table
.idr
, qp
, 0, 0, GFP_NOWAIT
);
392 spin_unlock_irq(&c2dev
->qp_table
.lock
);
394 return ret
< 0 ? ret
: 0;
397 static void c2_free_qpn(struct c2_dev
*c2dev
, int qpn
)
399 spin_lock_irq(&c2dev
->qp_table
.lock
);
400 idr_remove(&c2dev
->qp_table
.idr
, qpn
);
401 spin_unlock_irq(&c2dev
->qp_table
.lock
);
404 struct c2_qp
*c2_find_qpn(struct c2_dev
*c2dev
, int qpn
)
409 spin_lock_irqsave(&c2dev
->qp_table
.lock
, flags
);
410 qp
= idr_find(&c2dev
->qp_table
.idr
, qpn
);
411 spin_unlock_irqrestore(&c2dev
->qp_table
.lock
, flags
);
415 int c2_alloc_qp(struct c2_dev
*c2dev
,
417 struct ib_qp_init_attr
*qp_attrs
, struct c2_qp
*qp
)
419 struct c2wr_qp_create_req wr
;
420 struct c2wr_qp_create_rep
*reply
;
421 struct c2_vq_req
*vq_req
;
422 struct c2_cq
*send_cq
= to_c2cq(qp_attrs
->send_cq
);
423 struct c2_cq
*recv_cq
= to_c2cq(qp_attrs
->recv_cq
);
424 unsigned long peer_pa
;
425 u32 q_size
, msg_size
, mmap_size
;
429 err
= c2_alloc_qpn(c2dev
, qp
);
432 qp
->ibqp
.qp_num
= qp
->qpn
;
433 qp
->ibqp
.qp_type
= IB_QPT_RC
;
435 /* Allocate the SQ and RQ shared pointers */
436 qp
->sq_mq
.shared
= c2_alloc_mqsp(c2dev
, c2dev
->kern_mqsp_pool
,
437 &qp
->sq_mq
.shared_dma
, GFP_KERNEL
);
438 if (!qp
->sq_mq
.shared
) {
443 qp
->rq_mq
.shared
= c2_alloc_mqsp(c2dev
, c2dev
->kern_mqsp_pool
,
444 &qp
->rq_mq
.shared_dma
, GFP_KERNEL
);
445 if (!qp
->rq_mq
.shared
) {
450 /* Allocate the verbs request */
451 vq_req
= vq_req_alloc(c2dev
);
452 if (vq_req
== NULL
) {
457 /* Initialize the work request */
458 memset(&wr
, 0, sizeof(wr
));
459 c2_wr_set_id(&wr
, CCWR_QP_CREATE
);
460 wr
.hdr
.context
= (unsigned long) vq_req
;
461 wr
.rnic_handle
= c2dev
->adapter_handle
;
462 wr
.sq_cq_handle
= send_cq
->adapter_handle
;
463 wr
.rq_cq_handle
= recv_cq
->adapter_handle
;
464 wr
.sq_depth
= cpu_to_be32(qp_attrs
->cap
.max_send_wr
+ 1);
465 wr
.rq_depth
= cpu_to_be32(qp_attrs
->cap
.max_recv_wr
+ 1);
467 wr
.flags
= cpu_to_be32(QP_RDMA_READ
| QP_RDMA_WRITE
| QP_MW_BIND
|
468 QP_ZERO_STAG
| QP_RDMA_READ_RESPONSE
);
469 wr
.send_sgl_depth
= cpu_to_be32(qp_attrs
->cap
.max_send_sge
);
470 wr
.recv_sgl_depth
= cpu_to_be32(qp_attrs
->cap
.max_recv_sge
);
471 wr
.rdma_write_sgl_depth
= cpu_to_be32(qp_attrs
->cap
.max_send_sge
);
472 wr
.shared_sq_ht
= cpu_to_be64(qp
->sq_mq
.shared_dma
);
473 wr
.shared_rq_ht
= cpu_to_be64(qp
->rq_mq
.shared_dma
);
474 wr
.ord
= cpu_to_be32(C2_MAX_ORD_PER_QP
);
475 wr
.ird
= cpu_to_be32(C2_MAX_IRD_PER_QP
);
476 wr
.pd_id
= pd
->pd_id
;
477 wr
.user_context
= (unsigned long) qp
;
479 vq_req_get(c2dev
, vq_req
);
481 /* Send the WR to the adapter */
482 err
= vq_send_wr(c2dev
, (union c2wr
*) & wr
);
484 vq_req_put(c2dev
, vq_req
);
488 /* Wait for the verb reply */
489 err
= vq_wait_for_reply(c2dev
, vq_req
);
494 /* Process the reply */
495 reply
= (struct c2wr_qp_create_rep
*) (unsigned long) (vq_req
->reply_msg
);
501 if ((err
= c2_wr_get_result(reply
)) != 0) {
505 /* Fill in the kernel QP struct */
506 atomic_set(&qp
->refcount
, 1);
507 qp
->adapter_handle
= reply
->qp_handle
;
508 qp
->state
= IB_QPS_RESET
;
509 qp
->send_sgl_depth
= qp_attrs
->cap
.max_send_sge
;
510 qp
->rdma_write_sgl_depth
= qp_attrs
->cap
.max_send_sge
;
511 qp
->recv_sgl_depth
= qp_attrs
->cap
.max_recv_sge
;
512 init_waitqueue_head(&qp
->wait
);
514 /* Initialize the SQ MQ */
515 q_size
= be32_to_cpu(reply
->sq_depth
);
516 msg_size
= be32_to_cpu(reply
->sq_msg_size
);
517 peer_pa
= c2dev
->pa
+ be32_to_cpu(reply
->sq_mq_start
);
518 mmap_size
= PAGE_ALIGN(sizeof(struct c2_mq_shared
) + msg_size
* q_size
);
519 mmap
= ioremap_nocache(peer_pa
, mmap_size
);
525 c2_mq_req_init(&qp
->sq_mq
,
526 be32_to_cpu(reply
->sq_mq_index
),
529 mmap
+ sizeof(struct c2_mq_shared
), /* pool start */
531 C2_MQ_ADAPTER_TARGET
);
533 /* Initialize the RQ mq */
534 q_size
= be32_to_cpu(reply
->rq_depth
);
535 msg_size
= be32_to_cpu(reply
->rq_msg_size
);
536 peer_pa
= c2dev
->pa
+ be32_to_cpu(reply
->rq_mq_start
);
537 mmap_size
= PAGE_ALIGN(sizeof(struct c2_mq_shared
) + msg_size
* q_size
);
538 mmap
= ioremap_nocache(peer_pa
, mmap_size
);
544 c2_mq_req_init(&qp
->rq_mq
,
545 be32_to_cpu(reply
->rq_mq_index
),
548 mmap
+ sizeof(struct c2_mq_shared
), /* pool start */
550 C2_MQ_ADAPTER_TARGET
);
552 vq_repbuf_free(c2dev
, reply
);
553 vq_req_free(c2dev
, vq_req
);
558 iounmap(qp
->sq_mq
.peer
);
560 destroy_qp(c2dev
, qp
);
562 vq_repbuf_free(c2dev
, reply
);
564 vq_req_free(c2dev
, vq_req
);
566 c2_free_mqsp(qp
->rq_mq
.shared
);
568 c2_free_mqsp(qp
->sq_mq
.shared
);
570 c2_free_qpn(c2dev
, qp
->qpn
);
574 static inline void c2_lock_cqs(struct c2_cq
*send_cq
, struct c2_cq
*recv_cq
)
576 if (send_cq
== recv_cq
)
577 spin_lock_irq(&send_cq
->lock
);
578 else if (send_cq
> recv_cq
) {
579 spin_lock_irq(&send_cq
->lock
);
580 spin_lock_nested(&recv_cq
->lock
, SINGLE_DEPTH_NESTING
);
582 spin_lock_irq(&recv_cq
->lock
);
583 spin_lock_nested(&send_cq
->lock
, SINGLE_DEPTH_NESTING
);
587 static inline void c2_unlock_cqs(struct c2_cq
*send_cq
, struct c2_cq
*recv_cq
)
589 if (send_cq
== recv_cq
)
590 spin_unlock_irq(&send_cq
->lock
);
591 else if (send_cq
> recv_cq
) {
592 spin_unlock(&recv_cq
->lock
);
593 spin_unlock_irq(&send_cq
->lock
);
595 spin_unlock(&send_cq
->lock
);
596 spin_unlock_irq(&recv_cq
->lock
);
600 void c2_free_qp(struct c2_dev
*c2dev
, struct c2_qp
*qp
)
602 struct c2_cq
*send_cq
;
603 struct c2_cq
*recv_cq
;
605 send_cq
= to_c2cq(qp
->ibqp
.send_cq
);
606 recv_cq
= to_c2cq(qp
->ibqp
.recv_cq
);
609 * Lock CQs here, so that CQ polling code can do QP lookup
610 * without taking a lock.
612 c2_lock_cqs(send_cq
, recv_cq
);
613 c2_free_qpn(c2dev
, qp
->qpn
);
614 c2_unlock_cqs(send_cq
, recv_cq
);
617 * Destroy qp in the rnic...
619 destroy_qp(c2dev
, qp
);
622 * Mark any unreaped CQEs as null and void.
624 c2_cq_clean(c2dev
, qp
, send_cq
->cqn
);
625 if (send_cq
!= recv_cq
)
626 c2_cq_clean(c2dev
, qp
, recv_cq
->cqn
);
628 * Unmap the MQs and return the shared pointers
629 * to the message pool.
631 iounmap(qp
->sq_mq
.peer
);
632 iounmap(qp
->rq_mq
.peer
);
633 c2_free_mqsp(qp
->sq_mq
.shared
);
634 c2_free_mqsp(qp
->rq_mq
.shared
);
636 atomic_dec(&qp
->refcount
);
637 wait_event(qp
->wait
, !atomic_read(&qp
->refcount
));
644 * Move an SGL from the user's work request struct into a CCIL Work Request
645 * message, swapping to WR byte order and ensure the total length doesn't
649 * dst - ptr to CCIL Work Request message SGL memory.
650 * src - ptr to the consumers SGL memory.
658 move_sgl(struct c2_data_addr
* dst
, struct ib_sge
*src
, int count
, u32
* p_len
,
661 u32 tot
= 0; /* running total */
662 u8 acount
= 0; /* running total non-0 len sge's */
666 * If the addition of this SGE causes the
667 * total SGL length to exceed 2^32-1, then
670 * If the current total plus the next element length
671 * wraps, then it will go negative and be less than the
674 if ((tot
+ src
->length
) < tot
) {
678 * Bug: 1456 (as well as 1498 & 1643)
679 * Skip over any sge's supplied with len=0
683 dst
->stag
= cpu_to_be32(src
->lkey
);
684 dst
->to
= cpu_to_be64(src
->addr
);
685 dst
->length
= cpu_to_be32(src
->length
);
695 * Bug: 1476 (as well as 1498, 1456 and 1643)
696 * Setup the SGL in the WR to make it easier for the RNIC.
697 * This way, the FW doesn't have to deal with special cases.
698 * Setting length=0 should be sufficient.
706 *actual_count
= acount
;
711 * Function: c2_activity (private function)
714 * Post an mq index to the host->adapter activity fifo.
717 * c2dev - ptr to c2dev structure
718 * mq_index - mq index to post
719 * shared - value most recently written to shared
726 static inline void c2_activity(struct c2_dev
*c2dev
, u32 mq_index
, u16 shared
)
729 * First read the register to see if the FIFO is full, and if so,
730 * spin until it's not. This isn't perfect -- there is no
731 * synchronization among the clients of the register, but in
732 * practice it prevents multiple CPU from hammering the bus
733 * with PCI RETRY. Note that when this does happen, the card
734 * cannot get on the bus and the card and system hang in a
735 * deadlock -- thus the need for this code. [TOT]
737 while (readl(c2dev
->regs
+ PCI_BAR0_ADAPTER_HINT
) & 0x80000000)
740 __raw_writel(C2_HINT_MAKE(mq_index
, shared
),
741 c2dev
->regs
+ PCI_BAR0_ADAPTER_HINT
);
745 * Function: qp_wr_post
748 * This in-line function allocates a MQ msg, then moves the host-copy of
749 * the completed WR into msg. Then it posts the message.
752 * q - ptr to user MQ.
753 * wr - ptr to host-copy of the WR.
754 * qp - ptr to user qp
755 * size - Number of bytes to post. Assumed to be divisible by 4.
762 static int qp_wr_post(struct c2_mq
*q
, union c2wr
* wr
, struct c2_qp
*qp
, u32 size
)
766 msg
= c2_mq_alloc(q
);
771 ((c2wr_hdr_t
*) wr
)->magic
= cpu_to_be32(CCWR_MAGIC
);
775 * Since all header fields in the WR are the same as the
776 * CQE, set the following so the adapter need not.
778 c2_wr_set_result(wr
, CCERR_PENDING
);
781 * Copy the wr down to the adapter
783 memcpy((void *) msg
, (void *) wr
, size
);
790 int c2_post_send(struct ib_qp
*ibqp
, struct ib_send_wr
*ib_wr
,
791 struct ib_send_wr
**bad_wr
)
793 struct c2_dev
*c2dev
= to_c2dev(ibqp
->device
);
794 struct c2_qp
*qp
= to_c2qp(ibqp
);
796 unsigned long lock_flags
;
804 if (qp
->state
> IB_QPS_RTS
) {
812 wr
.sqwr
.sq_hdr
.user_hdr
.hdr
.context
= ib_wr
->wr_id
;
813 if (ib_wr
->send_flags
& IB_SEND_SIGNALED
) {
814 flags
|= SQ_SIGNALED
;
817 switch (ib_wr
->opcode
) {
819 case IB_WR_SEND_WITH_INV
:
820 if (ib_wr
->opcode
== IB_WR_SEND
) {
821 if (ib_wr
->send_flags
& IB_SEND_SOLICITED
)
822 c2_wr_set_id(&wr
, C2_WR_TYPE_SEND_SE
);
824 c2_wr_set_id(&wr
, C2_WR_TYPE_SEND
);
825 wr
.sqwr
.send
.remote_stag
= 0;
827 if (ib_wr
->send_flags
& IB_SEND_SOLICITED
)
828 c2_wr_set_id(&wr
, C2_WR_TYPE_SEND_SE_INV
);
830 c2_wr_set_id(&wr
, C2_WR_TYPE_SEND_INV
);
831 wr
.sqwr
.send
.remote_stag
=
832 cpu_to_be32(ib_wr
->ex
.invalidate_rkey
);
835 msg_size
= sizeof(struct c2wr_send_req
) +
836 sizeof(struct c2_data_addr
) * ib_wr
->num_sge
;
837 if (ib_wr
->num_sge
> qp
->send_sgl_depth
) {
841 if (ib_wr
->send_flags
& IB_SEND_FENCE
) {
842 flags
|= SQ_READ_FENCE
;
844 err
= move_sgl((struct c2_data_addr
*) & (wr
.sqwr
.send
.data
),
847 &tot_len
, &actual_sge_count
);
848 wr
.sqwr
.send
.sge_len
= cpu_to_be32(tot_len
);
849 c2_wr_set_sge_count(&wr
, actual_sge_count
);
851 case IB_WR_RDMA_WRITE
:
852 c2_wr_set_id(&wr
, C2_WR_TYPE_RDMA_WRITE
);
853 msg_size
= sizeof(struct c2wr_rdma_write_req
) +
854 (sizeof(struct c2_data_addr
) * ib_wr
->num_sge
);
855 if (ib_wr
->num_sge
> qp
->rdma_write_sgl_depth
) {
859 if (ib_wr
->send_flags
& IB_SEND_FENCE
) {
860 flags
|= SQ_READ_FENCE
;
862 wr
.sqwr
.rdma_write
.remote_stag
=
863 cpu_to_be32(ib_wr
->wr
.rdma
.rkey
);
864 wr
.sqwr
.rdma_write
.remote_to
=
865 cpu_to_be64(ib_wr
->wr
.rdma
.remote_addr
);
866 err
= move_sgl((struct c2_data_addr
*)
867 & (wr
.sqwr
.rdma_write
.data
),
870 &tot_len
, &actual_sge_count
);
871 wr
.sqwr
.rdma_write
.sge_len
= cpu_to_be32(tot_len
);
872 c2_wr_set_sge_count(&wr
, actual_sge_count
);
874 case IB_WR_RDMA_READ
:
875 c2_wr_set_id(&wr
, C2_WR_TYPE_RDMA_READ
);
876 msg_size
= sizeof(struct c2wr_rdma_read_req
);
878 /* IWarp only suppots 1 sge for RDMA reads */
879 if (ib_wr
->num_sge
> 1) {
885 * Move the local and remote stag/to/len into the WR.
887 wr
.sqwr
.rdma_read
.local_stag
=
888 cpu_to_be32(ib_wr
->sg_list
->lkey
);
889 wr
.sqwr
.rdma_read
.local_to
=
890 cpu_to_be64(ib_wr
->sg_list
->addr
);
891 wr
.sqwr
.rdma_read
.remote_stag
=
892 cpu_to_be32(ib_wr
->wr
.rdma
.rkey
);
893 wr
.sqwr
.rdma_read
.remote_to
=
894 cpu_to_be64(ib_wr
->wr
.rdma
.remote_addr
);
895 wr
.sqwr
.rdma_read
.length
=
896 cpu_to_be32(ib_wr
->sg_list
->length
);
906 * If we had an error on the last wr build, then
907 * break out. Possible errors include bogus WR
908 * type, and a bogus SGL length...
917 c2_wr_set_flags(&wr
, flags
);
922 spin_lock_irqsave(&qp
->lock
, lock_flags
);
923 err
= qp_wr_post(&qp
->sq_mq
, &wr
, qp
, msg_size
);
925 spin_unlock_irqrestore(&qp
->lock
, lock_flags
);
930 * Enqueue mq index to activity FIFO.
932 c2_activity(c2dev
, qp
->sq_mq
.index
, qp
->sq_mq
.hint_count
);
933 spin_unlock_irqrestore(&qp
->lock
, lock_flags
);
944 int c2_post_receive(struct ib_qp
*ibqp
, struct ib_recv_wr
*ib_wr
,
945 struct ib_recv_wr
**bad_wr
)
947 struct c2_dev
*c2dev
= to_c2dev(ibqp
->device
);
948 struct c2_qp
*qp
= to_c2qp(ibqp
);
950 unsigned long lock_flags
;
953 if (qp
->state
> IB_QPS_RTS
) {
959 * Try and post each work request
965 if (ib_wr
->num_sge
> qp
->recv_sgl_depth
) {
971 * Create local host-copy of the WR
973 wr
.rqwr
.rq_hdr
.user_hdr
.hdr
.context
= ib_wr
->wr_id
;
974 c2_wr_set_id(&wr
, CCWR_RECV
);
975 c2_wr_set_flags(&wr
, 0);
977 /* sge_count is limited to eight bits. */
978 BUG_ON(ib_wr
->num_sge
>= 256);
979 err
= move_sgl((struct c2_data_addr
*) & (wr
.rqwr
.data
),
981 ib_wr
->num_sge
, &tot_len
, &actual_sge_count
);
982 c2_wr_set_sge_count(&wr
, actual_sge_count
);
985 * If we had an error on the last wr build, then
986 * break out. Possible errors include bogus WR
987 * type, and a bogus SGL length...
993 spin_lock_irqsave(&qp
->lock
, lock_flags
);
994 err
= qp_wr_post(&qp
->rq_mq
, &wr
, qp
, qp
->rq_mq
.msg_size
);
996 spin_unlock_irqrestore(&qp
->lock
, lock_flags
);
1001 * Enqueue mq index to activity FIFO
1003 c2_activity(c2dev
, qp
->rq_mq
.index
, qp
->rq_mq
.hint_count
);
1004 spin_unlock_irqrestore(&qp
->lock
, lock_flags
);
1006 ib_wr
= ib_wr
->next
;
1015 void c2_init_qp_table(struct c2_dev
*c2dev
)
1017 spin_lock_init(&c2dev
->qp_table
.lock
);
1018 idr_init(&c2dev
->qp_table
.idr
);
1021 void c2_cleanup_qp_table(struct c2_dev
*c2dev
)
1023 idr_destroy(&c2dev
->qp_table
.idr
);