int mig = 0;
        int ret;
        u32 pmtu = 0; /* for gcc warning only */
-       struct hfi1_devdata *dd;
+       struct hfi1_devdata *dd = dd_from_dev(dev);
 
        spin_lock_irq(&qp->r_lock);
        spin_lock(&qp->s_lock);
                goto inval;
 
        if (attr_mask & IB_QP_AV) {
+               u8 sc;
+
                if (attr->ah_attr.dlid >= HFI1_MULTICAST_LID_BASE)
                        goto inval;
                if (hfi1_check_ah(qp->ibqp.device, &attr->ah_attr))
                        goto inval;
+               sc = ah_to_sc(ibqp->device, &attr->ah_attr);
+               if (!qp_to_sdma_engine(qp, sc) &&
+                   dd->flags & HFI1_HAS_SEND_DMA)
+                       goto inval;
        }
 
        if (attr_mask & IB_QP_ALT_PATH) {
+               u8 sc;
+
                if (attr->alt_ah_attr.dlid >= HFI1_MULTICAST_LID_BASE)
                        goto inval;
                if (hfi1_check_ah(qp->ibqp.device, &attr->alt_ah_attr))
                        goto inval;
-               if (attr->alt_pkey_index >= hfi1_get_npkeys(dd_from_dev(dev)))
+               if (attr->alt_pkey_index >= hfi1_get_npkeys(dd))
+                       goto inval;
+               sc = ah_to_sc(ibqp->device, &attr->alt_ah_attr);
+               if (!qp_to_sdma_engine(qp, sc) &&
+                   dd->flags & HFI1_HAS_SEND_DMA)
                        goto inval;
        }
 
        if (attr_mask & IB_QP_PKEY_INDEX)
-               if (attr->pkey_index >= hfi1_get_npkeys(dd_from_dev(dev)))
+               if (attr->pkey_index >= hfi1_get_npkeys(dd))
                        goto inval;
 
        if (attr_mask & IB_QP_MIN_RNR_TIMER)
                qp->remote_ah_attr = attr->ah_attr;
                qp->s_srate = attr->ah_attr.static_rate;
                qp->srate_mbps = ib_rate_to_mbps(qp->s_srate);
+               qp->s_sc = ah_to_sc(ibqp->device, &qp->remote_ah_attr);
+               qp->s_sde = qp_to_sdma_engine(qp, qp->s_sc);
        }
 
        if (attr_mask & IB_QP_ALT_PATH) {
                        qp->port_num = qp->alt_ah_attr.port_num;
                        qp->s_pkey_index = qp->s_alt_pkey_index;
                        qp->s_flags |= HFI1_S_AHG_CLEAR;
+                       qp->s_sc = ah_to_sc(ibqp->device, &qp->remote_ah_attr);
+                       qp->s_sde = qp_to_sdma_engine(qp, qp->s_sc);
                }
        }
 
        if (!(dd->flags & HFI1_HAS_SEND_DMA))
                return NULL;
        switch (qp->ibqp.qp_type) {
-       case IB_QPT_UC:
-       case IB_QPT_RC:
-               break;
        case IB_QPT_SMI:
                return NULL;
        default:
        qp->port_num = qp->alt_ah_attr.port_num;
        qp->s_pkey_index = qp->s_alt_pkey_index;
        qp->s_flags |= HFI1_S_AHG_CLEAR;
+       qp->s_sc = ah_to_sc(qp->ibqp.device, &qp->remote_ah_attr);
+       qp->s_sde = qp_to_sdma_engine(qp, qp->s_sc);
 
        ev.device = qp->ibqp.device;
        ev.element.qp = &qp->ibqp;
 
                clear_ahg(qp);
        if (!(qp->s_flags & HFI1_S_AHG_VALID)) {
                /* first middle that needs copy  */
-               if (qp->s_ahgidx < 0) {
-                       if (!qp->s_sde)
-                               qp->s_sde = qp_to_sdma_engine(qp, qp->s_sc);
+               if (qp->s_ahgidx < 0)
                        qp->s_ahgidx = sdma_ahg_alloc(qp->s_sde);
-               }
                if (qp->s_ahgidx >= 0) {
                        qp->s_ahgpsn = npsn;
                        qp->s_hdr->tx_flags |= SDMA_TXREQ_F_AHG_COPY;
        u16 lrh0;
        u32 nwords;
        u32 extra_bytes;
-       u8 sc5;
        u32 bth1;
 
        /* Construct the header. */
                lrh0 = HFI1_LRH_GRH;
                middle = 0;
        }
-       sc5 = ibp->sl_to_sc[qp->remote_ah_attr.sl];
-       lrh0 |= (sc5 & 0xf) << 12 | (qp->remote_ah_attr.sl & 0xf) << 4;
-       qp->s_sc = sc5;
+       lrh0 |= (qp->s_sc & 0xf) << 12 | (qp->remote_ah_attr.sl & 0xf) << 4;
        /*
         * reset s_hdr/AHG fields
         *
 
        struct verbs_txreq *tx;
        struct sdma_txreq *stx;
        u64 pbc_flags = 0;
-       struct sdma_engine *sde;
        u8 sc5 = qp->s_sc;
        int ret;
 
        if (IS_ERR(tx))
                goto bail_tx;
 
-       if (!qp->s_hdr->sde) {
-               tx->sde = sde = qp_to_sdma_engine(qp, sc5);
-               if (!sde)
-                       goto bail_no_sde;
-       } else
-               tx->sde = sde = qp->s_hdr->sde;
+       tx->sde = qp->s_sde;
 
        if (likely(pbc == 0)) {
                u32 vl = sc_to_vlt(dd_from_ibdev(qp->ibqp.device), sc5);
        if (qp->s_rdma_mr)
                qp->s_rdma_mr = NULL;
        tx->hdr_dwords = hdrwords + 2;
-       ret = build_verbs_tx_desc(sde, ss, len, tx, ahdr, pbc);
+       ret = build_verbs_tx_desc(tx->sde, ss, len, tx, ahdr, pbc);
        if (unlikely(ret))
                goto bail_build;
        trace_output_ibhdr(dd_from_ibdev(qp->ibqp.device), &ahdr->ibh);
-       ret =  sdma_send_txreq(sde, &qp->s_iowait, &tx->txreq);
+       ret =  sdma_send_txreq(tx->sde, &qp->s_iowait, &tx->txreq);
        if (unlikely(ret == -ECOMM))
                goto bail_ecomm;
        return ret;
 
-bail_no_sde:
-       hfi1_put_txreq(tx);
 bail_ecomm:
        /* The current one got "sent" */
        return 0;