Handle IB_WR_SEND_WITH_INV work requests.

This resurrects a patch sent long ago by Mikkel Hagen <[EMAIL PROTECTED]>.

Signed-off-by: Roland Dreier <[EMAIL PROTECTED]>
---
 drivers/infiniband/hw/amso1100/c2_qp.c   |   22 +++++++++++++++-------
 drivers/infiniband/hw/amso1100/c2_rnic.c |    3 ++-
 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 9190bd5..a6d8944 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,
 
                switch (ib_wr->opcode) {
                case IB_WR_SEND:
-                       if (ib_wr->send_flags & IB_SEND_SOLICITED) {
-                               c2_wr_set_id(&wr, C2_WR_TYPE_SEND_SE);
-                               msg_size = sizeof(struct c2wr_send_req);
+               case IB_WR_SEND_WITH_INV:
+                       if (ib_wr->opcode == IB_WR_SEND) {
+                               if (ib_wr->send_flags & IB_SEND_SOLICITED)
+                                       c2_wr_set_id(&wr, C2_WR_TYPE_SEND_SE);
+                               else
+                                       c2_wr_set_id(&wr, C2_WR_TYPE_SEND);
+                               wr.sqwr.send.remote_stag = 0;
                        } else {
-                               c2_wr_set_id(&wr, C2_WR_TYPE_SEND);
-                               msg_size = sizeof(struct c2wr_send_req);
+                               if (ib_wr->send_flags & IB_SEND_SOLICITED)
+                                       c2_wr_set_id(&wr, 
C2_WR_TYPE_SEND_SE_INV);
+                               else
+                                       c2_wr_set_id(&wr, C2_WR_TYPE_SEND_INV);
+                               wr.sqwr.send.remote_stag =
+                                       cpu_to_be32(ib_wr->ex.invalidate_rkey);
                        }
 
-                       wr.sqwr.send.remote_stag = 0;
-                       msg_size += sizeof(struct c2_data_addr) * 
ib_wr->num_sge;
+                       msg_size = sizeof(struct c2wr_send_req) +
+                               sizeof(struct c2_data_addr) * ib_wr->num_sge;
                        if (ib_wr->num_sge > qp->send_sgl_depth) {
                                err = -EINVAL;
                                break;
diff --git a/drivers/infiniband/hw/amso1100/c2_rnic.c 
b/drivers/infiniband/hw/amso1100/c2_rnic.c
index b1441ae..9a054c6 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)
             IB_DEVICE_CURR_QP_STATE_MOD |
             IB_DEVICE_SYS_IMAGE_GUID |
             IB_DEVICE_ZERO_STAG |
-            IB_DEVICE_MEM_WINDOW);
+            IB_DEVICE_MEM_WINDOW |
+            IB_DEVICE_SEND_W_INV);
 
        /* Allocate the qptr_array */
        c2dev->qptr_array = vmalloc(C2_MAX_CQS * sizeof(void *));
-- 
1.5.4.5

_______________________________________________
general mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to