IB/core: Fix and clean up ib_ud_header_init()
authorEli Cohen <eli@mellanox.co.il>
Mon, 8 Feb 2010 11:40:37 +0000 (11:40 +0000)
committerRoland Dreier <rolandd@cisco.com>
Wed, 24 Feb 2010 22:54:10 +0000 (14:54 -0800)
ib_ud_header_init() first clears header and then fills up the various
fields.  Later on, it tests header->immediate_present, which it has
already cleared, so the condition is always false.  Fix this by adding
an immediate_present parameter and setting header->immediate_present
as is done with grh_present.  Also remove unused calculation of
header_len.

Signed-off-by: Eli Cohen <eli@mellanox.co.il>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/core/ud_header.c
drivers/infiniband/hw/mlx4/qp.c
drivers/infiniband/hw/mthca/mthca_qp.c
include/rdma/ib_pack.h

index 8ec7876..650b501 100644 (file)
@@ -181,6 +181,7 @@ static const struct ib_field deth_table[] = {
  * ib_ud_header_init - Initialize UD header structure
  * @payload_bytes:Length of packet payload
  * @grh_present:GRH flag (if non-zero, GRH will be included)
+ * @immediate_present: specify if immediate data should be used
  * @header:Structure to initialize
  *
  * ib_ud_header_init() initializes the lrh.link_version, lrh.link_next_header,
@@ -191,21 +192,13 @@ static const struct ib_field deth_table[] = {
  */
 void ib_ud_header_init(int                         payload_bytes,
                       int                  grh_present,
+                      int                  immediate_present,
                       struct ib_ud_header *header)
 {
-       int header_len;
        u16 packet_length;
 
        memset(header, 0, sizeof *header);
 
-       header_len =
-               IB_LRH_BYTES  +
-               IB_BTH_BYTES  +
-               IB_DETH_BYTES;
-       if (grh_present) {
-               header_len += IB_GRH_BYTES;
-       }
-
        header->lrh.link_version     = 0;
        header->lrh.link_next_header =
                grh_present ? IB_LNH_IBA_GLOBAL : IB_LNH_IBA_LOCAL;
@@ -231,7 +224,8 @@ void ib_ud_header_init(int                      payload_bytes,
 
        header->lrh.packet_length = cpu_to_be16(packet_length);
 
-       if (header->immediate_present)
+       header->immediate_present            = immediate_present;
+       if (immediate_present)
                header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;
        else
                header->bth.opcode           = IB_OPCODE_UD_SEND_ONLY;
index 2a97c96..a182352 100644 (file)
@@ -1228,7 +1228,7 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
        for (i = 0; i < wr->num_sge; ++i)
                send_size += wr->sg_list[i].length;
 
-       ib_ud_header_init(send_size, mlx4_ib_ah_grh_present(ah), &sqp->ud_header);
+       ib_ud_header_init(send_size, mlx4_ib_ah_grh_present(ah), 0, &sqp->ud_header);
 
        sqp->ud_header.lrh.service_level   =
                be32_to_cpu(ah->av.sl_tclass_flowlabel) >> 28;
index c10576f..d2d172e 100644 (file)
@@ -1494,7 +1494,7 @@ static int build_mlx_header(struct mthca_dev *dev, struct mthca_sqp *sqp,
        u16 pkey;
 
        ib_ud_header_init(256, /* assume a MAD */
-                         mthca_ah_grh_present(to_mah(wr->wr.ud.ah)),
+                         mthca_ah_grh_present(to_mah(wr->wr.ud.ah)), 0,
                          &sqp->ud_header);
 
        err = mthca_read_ah(dev, to_mah(wr->wr.ud.ah), &sqp->ud_header);
index d7fc45c..cbb50f4 100644 (file)
@@ -232,6 +232,7 @@ void ib_unpack(const struct ib_field        *desc,
 
 void ib_ud_header_init(int                        payload_bytes,
                       int                 grh_present,
+                      int                 immediate_present,
                       struct ib_ud_header *header);
 
 int ib_ud_header_pack(struct ib_ud_header *header,