Hi Vlad,

please apply the following fixes for OFED-1.5, thanks!

Index: ofa_kernel-1.5/kernel_patches/fixes/ehca-0080-mad_redirection.patch
===================================================================
--- /dev/null
+++ ofa_kernel-1.5/kernel_patches/fixes/ehca-0080-mad_redirection.patch
@@ -0,0 +1,102 @@
+commit d706834d995939c96b4952bf042918879b4db18b
+Author: Joachim Fenkes <fen...@de.ibm.com>
+Date:   Sat Sep 5 20:22:55 2009 -0700
+
+    IB/ehca: Construct MAD redirect replies from request MAD
+    
+    The old code used a lot of hard-coded values, which might not be valid
+    in all environments (especially routed fabrics or partitioned
+    subnets).  Copy as much information as possible from the incoming
+    request to correct that.
+    
+    Signed-off-by: Joachim Fenkes <fen...@de.ibm.com>
+    Signed-off-by: Roland Dreier <rola...@cisco.com>
+
+diff --git a/drivers/infiniband/hw/ehca/ehca_sqp.c 
b/drivers/infiniband/hw/ehca/ehca_sqp.c
+index c568b28..8c1213f 100644
+--- a/drivers/infiniband/hw/ehca/ehca_sqp.c
++++ b/drivers/infiniband/hw/ehca/ehca_sqp.c
+@@ -125,14 +125,30 @@ struct ib_perf {
+       u8 data[192];
+ } __attribute__ ((packed));
+ 
++/* TC/SL/FL packed into 32 bits, as in ClassPortInfo */
++struct tcslfl {
++      u32 tc:8;
++      u32 sl:4;
++      u32 fl:20;
++} __attribute__ ((packed));
++
++/* IP Version/TC/FL packed into 32 bits, as in GRH */
++struct vertcfl {
++      u32 ver:4;
++      u32 tc:8;
++      u32 fl:20;
++} __attribute__ ((packed));
+ 
+ static int ehca_process_perf(struct ib_device *ibdev, u8 port_num,
++                           struct ib_wc *in_wc, struct ib_grh *in_grh,
+                            struct ib_mad *in_mad, struct ib_mad *out_mad)
+ {
+       struct ib_perf *in_perf = (struct ib_perf *)in_mad;
+       struct ib_perf *out_perf = (struct ib_perf *)out_mad;
+       struct ib_class_port_info *poi =
+               (struct ib_class_port_info *)out_perf->data;
++      struct tcslfl *tcslfl =
++              (struct tcslfl *)&poi->redirect_tcslfl;
+       struct ehca_shca *shca =
+               container_of(ibdev, struct ehca_shca, ib_device);
+       struct ehca_sport *sport = &shca->sport[port_num - 1];
+@@ -158,10 +174,29 @@ static int ehca_process_perf(struct ib_device *ibdev, u8 
port_num,
+               poi->base_version = 1;
+               poi->class_version = 1;
+               poi->resp_time_value = 18;
+-              poi->redirect_lid = sport->saved_attr.lid;
+-              poi->redirect_qp = sport->pma_qp_nr;
++
++              /* copy local routing information from WC where applicable */
++              tcslfl->sl         = in_wc->sl;
++              poi->redirect_lid  =
++                      sport->saved_attr.lid | in_wc->dlid_path_bits;
++              poi->redirect_qp   = sport->pma_qp_nr;
+               poi->redirect_qkey = IB_QP1_QKEY;
+-              poi->redirect_pkey = IB_DEFAULT_PKEY_FULL;
++
++              ehca_query_pkey(ibdev, port_num, in_wc->pkey_index,
++                              &poi->redirect_pkey);
++
++              /* if request was globally routed, copy route info */
++              if (in_grh) {
++                      struct vertcfl *vertcfl =
++                              (struct vertcfl *)&in_grh->version_tclass_flow;
++                      memcpy(poi->redirect_gid, in_grh->dgid.raw,
++                             sizeof(poi->redirect_gid));
++                      tcslfl->tc        = vertcfl->tc;
++                      tcslfl->fl        = vertcfl->fl;
++              } else
++                      /* else only fill in default GID */
++                      ehca_query_gid(ibdev, port_num, 0,
++                                     (union ib_gid *)&poi->redirect_gid);
+ 
+               ehca_dbg(ibdev, "ehca_pma_lid=%x ehca_pma_qp=%x",
+                        sport->saved_attr.lid, sport->pma_qp_nr);
+@@ -183,8 +218,7 @@ perf_reply:
+ 
+ int ehca_process_mad(struct ib_device *ibdev, int mad_flags, u8 port_num,
+                    struct ib_wc *in_wc, struct ib_grh *in_grh,
+-                   struct ib_mad *in_mad,
+-                   struct ib_mad *out_mad)
++                   struct ib_mad *in_mad, struct ib_mad *out_mad)
+ {
+       int ret;
+ 
+@@ -196,7 +230,8 @@ int ehca_process_mad(struct ib_device *ibdev, int 
mad_flags, u8 port_num,
+               return IB_MAD_RESULT_SUCCESS;
+ 
+       ehca_dbg(ibdev, "port_num=%x src_qp=%x", port_num, in_wc->src_qp);
+-      ret = ehca_process_perf(ibdev, port_num, in_mad, out_mad);
++      ret = ehca_process_perf(ibdev, port_num, in_wc, in_grh,
++                              in_mad, out_mad);
+ 
+       return ret;
+ }
Index: ofa_kernel-1.5/kernel_patches/fixes/ehca-0090-cqe_flag_reporting.patch
===================================================================
--- /dev/null
+++ ofa_kernel-1.5/kernel_patches/fixes/ehca-0090-cqe_flag_reporting.patch
@@ -0,0 +1,29 @@
+commit 6303e74c699d6ba8bd3d44ec6898b2d6aa55d788
+Author: Joachim Fenkes <fen...@de.ibm.com>
+Date:   Sat Sep 5 20:22:55 2009 -0700
+
+    IB/ehca: Fix CQE flags reporting
+    
+    The driver was reporting CQE flags in the wrong bit positions, causing
+    consumers to miss incoming immediate data.
+    
+    Signed-off-by: Joachim Fenkes <fen...@de.ibm.com>
+    Signed-off-by: Roland Dreier <rola...@cisco.com>
+
+diff --git a/drivers/infiniband/hw/ehca/ehca_reqs.c 
b/drivers/infiniband/hw/ehca/ehca_reqs.c
+index 5a3d96f..8fd88cd 100644
+--- a/drivers/infiniband/hw/ehca/ehca_reqs.c
++++ b/drivers/infiniband/hw/ehca/ehca_reqs.c
+@@ -786,7 +786,11 @@ repoll:
+       wc->slid = cqe->rlid;
+       wc->dlid_path_bits = cqe->dlid;
+       wc->src_qp = cqe->remote_qp_number;
+-      wc->wc_flags = cqe->w_completion_flags;
++      /*
++       * HW has "Immed data present" and "GRH present" in bits 6 and 5.
++       * SW defines those in bits 1 and 0, so we can just shift and mask.
++       */
++      wc->wc_flags = (cqe->w_completion_flags >> 5) & 3;
+       wc->ex.imm_data = cpu_to_be32(cqe->immediate_data);
+       wc->sl = cqe->service_level;
+ 
_______________________________________________
ewg mailing list
ewg@lists.openfabrics.org
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to