Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
[linux-2.6-block.git] / drivers / infiniband / hw / hfi1 / ruc.c
index 13b994738f416efa7320f575bfdf92d74b310299..3daa94bdae3a9adebc7908577db4bd7290b8e048 100644 (file)
@@ -225,19 +225,8 @@ int hfi1_ruc_check_hdr(struct hfi1_ibport *ibp, struct hfi1_packet *packet)
        u32 dlid = packet->dlid;
        u32 slid = packet->slid;
        u32 sl = packet->sl;
-       int migrated;
-       u32 bth0, bth1;
-       u16 pkey;
-
-       bth0 = be32_to_cpu(packet->ohdr->bth[0]);
-       bth1 = be32_to_cpu(packet->ohdr->bth[1]);
-       if (packet->etype == RHF_RCV_TYPE_BYPASS) {
-               pkey = hfi1_16B_get_pkey(packet->hdr);
-               migrated = bth1 & OPA_BTH_MIG_REQ;
-       } else {
-               pkey = ib_bth_get_pkey(packet->ohdr);
-               migrated = bth0 & IB_BTH_MIG_REQ;
-       }
+       bool migrated = packet->migrated;
+       u16 pkey = packet->pkey;
 
        if (qp->s_mig_state == IB_MIG_ARMED && migrated) {
                if (!packet->grh) {
@@ -756,19 +745,18 @@ static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
        u32 slid;
        u16 pkey = hfi1_get_pkey(ibp, qp->s_pkey_index);
        u8 l4 = OPA_16B_L4_IB_LOCAL;
-       u8 extra_bytes = hfi1_get_16b_padding((qp->s_hdrwords << 2),
-                                  ps->s_txreq->s_cur_size);
+       u8 extra_bytes = hfi1_get_16b_padding(
+                               (ps->s_txreq->hdr_dwords << 2),
+                               ps->s_txreq->s_cur_size);
        u32 nwords = SIZE_OF_CRC + ((ps->s_txreq->s_cur_size +
                                 extra_bytes + SIZE_OF_LT) >> 2);
-       u8 becn = 0;
+       bool becn = false;
 
        if (unlikely(rdma_ah_get_ah_flags(&qp->remote_ah_attr) & IB_AH_GRH) &&
            hfi1_check_mcast(rdma_ah_get_dlid(&qp->remote_ah_attr))) {
                struct ib_grh *grh;
                struct ib_global_route *grd =
                        rdma_ah_retrieve_grh(&qp->remote_ah_attr);
-               int hdrwords;
-
                /*
                 * Ensure OPA GIDs are transformed to IB gids
                 * before creating the GRH.
@@ -777,9 +765,10 @@ static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
                        grd->sgid_index = 0;
                grh = &ps->s_txreq->phdr.hdr.opah.u.l.grh;
                l4 = OPA_16B_L4_IB_GLOBAL;
-               hdrwords = qp->s_hdrwords - 4;
-               qp->s_hdrwords += hfi1_make_grh(ibp, grh, grd,
-                                               hdrwords, nwords);
+               ps->s_txreq->hdr_dwords +=
+                       hfi1_make_grh(ibp, grh, grd,
+                                     ps->s_txreq->hdr_dwords - LRH_16B_DWORDS,
+                                     nwords);
                middle = 0;
        }
 
@@ -798,7 +787,7 @@ static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
        if (qp->s_flags & RVT_S_ECN) {
                qp->s_flags &= ~RVT_S_ECN;
                /* we recently received a FECN, so return a BECN */
-               becn = 1;
+               becn = true;
        }
        hfi1_make_ruc_bth(qp, ohdr, bth0, bth1, bth2);
 
@@ -813,7 +802,7 @@ static inline void hfi1_make_ruc_header_16B(struct rvt_qp *qp,
                          slid,
                          opa_get_lid(rdma_ah_get_dlid(&qp->remote_ah_attr),
                                      16B),
-                         (qp->s_hdrwords + nwords) >> 1,
+                         (ps->s_txreq->hdr_dwords + nwords) >> 1,
                          pkey, becn, 0, l4, priv->s_sc);
 }
 
@@ -833,13 +822,13 @@ static inline void hfi1_make_ruc_header_9B(struct rvt_qp *qp,
 
        if (unlikely(rdma_ah_get_ah_flags(&qp->remote_ah_attr) & IB_AH_GRH)) {
                struct ib_grh *grh = &ps->s_txreq->phdr.hdr.ibh.u.l.grh;
-               int hdrwords = qp->s_hdrwords - 2;
 
                lrh0 = HFI1_LRH_GRH;
-               qp->s_hdrwords +=
+               ps->s_txreq->hdr_dwords +=
                        hfi1_make_grh(ibp, grh,
                                      rdma_ah_read_grh(&qp->remote_ah_attr),
-                                     hdrwords, nwords);
+                                     ps->s_txreq->hdr_dwords - LRH_9B_DWORDS,
+                                     nwords);
                middle = 0;
        }
        lrh0 |= (priv->s_sc & 0xf) << 12 |
@@ -865,7 +854,7 @@ static inline void hfi1_make_ruc_header_9B(struct rvt_qp *qp,
        hfi1_make_ruc_bth(qp, ohdr, bth0, bth1, bth2);
        hfi1_make_ib_hdr(&ps->s_txreq->phdr.hdr.ibh,
                         lrh0,
-                        qp->s_hdrwords + nwords,
+                        ps->s_txreq->hdr_dwords + nwords,
                         opa_get_lid(rdma_ah_get_dlid(&qp->remote_ah_attr), 9B),
                         ppd_from_ibp(ibp)->lid |
                                rdma_ah_get_path_bits(&qp->remote_ah_attr));
@@ -1030,7 +1019,7 @@ void hfi1_do_send(struct rvt_qp *qp, bool in_thread)
        ps.s_txreq = get_waiting_verbs_txreq(qp);
        do {
                /* Check for a constructed packet to be sent. */
-               if (qp->s_hdrwords != 0) {
+               if (ps.s_txreq) {
                        spin_unlock_irqrestore(&qp->s_lock, ps.flags);
                        /*
                         * If the packet cannot be sent now, return and
@@ -1038,8 +1027,6 @@ void hfi1_do_send(struct rvt_qp *qp, bool in_thread)
                         */
                        if (hfi1_verbs_send(qp, &ps))
                                return;
-                       /* Record that s_ahg is empty. */
-                       qp->s_hdrwords = 0;
                        /* allow other tasks to run */
                        if (schedule_send_yield(qp, &ps))
                                return;