[PATCH] IB: RMPP fixes
authorHal Rosenstock <halr@voltaire.com>
Wed, 7 Sep 2005 18:03:41 +0000 (11:03 -0700)
committerRoland Dreier <rolandd@cisco.com>
Wed, 7 Sep 2005 18:03:41 +0000 (11:03 -0700)
- Fix payload length of middle RMPP sent segments. Middle payload
  lengths should be 0 on the send side.

  (This is perhaps a compliance and should not be an interop issue as
  middle payload lengths are supposed to be ignored on receive).

- Fix length in first segment of multipacket sends

  (This is a compliance issue but does not affect at least OpenIB to
  OpenIB RMPP transfers).

Signed-off-by: Hal Rosenstock <halr@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/core/mad_rmpp.c

index 43fd805e02659ce6f81befac85696c34f47beb9f..2bd8b1cc57c4c925fe8db42ecfb6c8a82797dc14 100644 (file)
@@ -593,7 +593,8 @@ static int send_next_seg(struct ib_mad_send_wr_private *mad_send_wr)
                rmpp_mad->rmpp_hdr.paylen_newwin =
                        cpu_to_be32(mad_send_wr->total_seg *
                                    (sizeof(struct ib_rmpp_mad) -
-                                      offsetof(struct ib_rmpp_mad, data)));
+                                      offsetof(struct ib_rmpp_mad, data)) -
+                                   mad_send_wr->pad);
                mad_send_wr->sg_list[0].length = sizeof(struct ib_rmpp_mad);
        } else {
                mad_send_wr->send_wr.num_sge = 2;
@@ -602,6 +603,7 @@ static int send_next_seg(struct ib_mad_send_wr_private *mad_send_wr)
                mad_send_wr->sg_list[1].length = sizeof(struct ib_rmpp_mad) -
                                                 mad_send_wr->data_offset;
                mad_send_wr->sg_list[1].lkey = mad_send_wr->sg_list[0].lkey;
+               rmpp_mad->rmpp_hdr.paylen_newwin = 0;
        }
 
        if (mad_send_wr->seg_num == mad_send_wr->total_seg) {