aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRoland Dreier <rolandd@cisco.com>2008-04-17 00:09:32 -0400
committerRoland Dreier <rolandd@cisco.com>2008-04-17 00:09:32 -0400
commit139b2db7951ed0c808884cfebca02a884aebe0c3 (patch)
treedf4a799be1302f4776db9b612d38e0c1ca8eab79 /drivers
parent0f39cf3d54e67a705773fd0ec56ca3dcd3e9272f (diff)
RDMA/amso1100: Add support for "send with invalidate" work requests
Handle IB_WR_SEND_WITH_INV work requests. This resurrects a patch sent long ago by Mikkel Hagen <mhagen@iol.unh.edu>. Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/infiniband/hw/amso1100/c2_qp.c22
-rw-r--r--drivers/infiniband/hw/amso1100/c2_rnic.c3
2 files changed, 17 insertions, 8 deletions
diff --git a/drivers/infiniband/hw/amso1100/c2_qp.c b/drivers/infiniband/hw/amso1100/c2_qp.c
index 9190bd52f51f..a6d89440ad2c 100644
--- a/drivers/infiniband/hw/amso1100/c2_qp.c
+++ b/drivers/infiniband/hw/amso1100/c2_qp.c
@@ -811,16 +811,24 @@ int c2_post_send(struct ib_qp *ibqp, struct ib_send_wr *ib_wr,
811 811
812 switch (ib_wr->opcode) { 812 switch (ib_wr->opcode) {
813 case IB_WR_SEND: 813 case IB_WR_SEND:
814 if (ib_wr->send_flags & IB_SEND_SOLICITED) { 814 case IB_WR_SEND_WITH_INV:
815 c2_wr_set_id(&wr, C2_WR_TYPE_SEND_SE); 815 if (ib_wr->opcode == IB_WR_SEND) {
816 msg_size = sizeof(struct c2wr_send_req); 816 if (ib_wr->send_flags & IB_SEND_SOLICITED)
817 c2_wr_set_id(&wr, C2_WR_TYPE_SEND_SE);
818 else
819 c2_wr_set_id(&wr, C2_WR_TYPE_SEND);
820 wr.sqwr.send.remote_stag = 0;
817 } else { 821 } else {
818 c2_wr_set_id(&wr, C2_WR_TYPE_SEND); 822 if (ib_wr->send_flags & IB_SEND_SOLICITED)
819 msg_size = sizeof(struct c2wr_send_req); 823 c2_wr_set_id(&wr, C2_WR_TYPE_SEND_SE_INV);
824 else
825 c2_wr_set_id(&wr, C2_WR_TYPE_SEND_INV);
826 wr.sqwr.send.remote_stag =
827 cpu_to_be32(ib_wr->ex.invalidate_rkey);
820 } 828 }
821 829
822 wr.sqwr.send.remote_stag = 0; 830 msg_size = sizeof(struct c2wr_send_req) +
823 msg_size += sizeof(struct c2_data_addr) * ib_wr->num_sge; 831 sizeof(struct c2_data_addr) * ib_wr->num_sge;
824 if (ib_wr->num_sge > qp->send_sgl_depth) { 832 if (ib_wr->num_sge > qp->send_sgl_depth) {
825 err = -EINVAL; 833 err = -EINVAL;
826 break; 834 break;
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c b/drivers/infiniband/hw/amso1100/c2_rnic.c
index b1441aeb60c2..9a054c6941a4 100644
--- a/drivers/infiniband/hw/amso1100/c2_rnic.c
+++ b/drivers/infiniband/hw/amso1100/c2_rnic.c
@@ -455,7 +455,8 @@ int __devinit c2_rnic_init(struct c2_dev *c2dev)
455 IB_DEVICE_CURR_QP_STATE_MOD | 455 IB_DEVICE_CURR_QP_STATE_MOD |
456 IB_DEVICE_SYS_IMAGE_GUID | 456 IB_DEVICE_SYS_IMAGE_GUID |
457 IB_DEVICE_ZERO_STAG | 457 IB_DEVICE_ZERO_STAG |
458 IB_DEVICE_MEM_WINDOW); 458 IB_DEVICE_MEM_WINDOW |
459 IB_DEVICE_SEND_W_INV);
459 460
460 /* Allocate the qptr_array */ 461 /* Allocate the qptr_array */
461 c2dev->qptr_array = vmalloc(C2_MAX_CQS * sizeof(void *)); 462 c2dev->qptr_array = vmalloc(C2_MAX_CQS * sizeof(void *));