staging/rdma/hfi1: Remove space after cast
[deliverable/linux.git] / drivers / staging / rdma / hfi1 / chip.c
index bbe5ad85cec07d47c460e35b53a0dae1e9672ed4..cf578654e48b86fe69c1c9bcb3b4ccf8e4767c9c 100644 (file)
@@ -64,6 +64,8 @@
 #include "sdma.h"
 #include "eprom.h"
 #include "efivar.h"
+#include "platform.h"
+#include "aspm.h"
 
 #define NUM_IB_PORTS 1
 
@@ -420,10 +422,10 @@ static struct flag_table pio_err_status_flags[] = {
        SEC_SPC_FREEZE,
        SEND_PIO_ERR_STATUS_PIO_STATE_MACHINE_ERR_SMASK),
 /*23*/ FLAG_ENTRY("PioWriteQwValidParity",
-       SEC_WRITE_DROPPED|SEC_SPC_FREEZE,
+       SEC_WRITE_DROPPED | SEC_SPC_FREEZE,
        SEND_PIO_ERR_STATUS_PIO_WRITE_QW_VALID_PARITY_ERR_SMASK),
 /*24*/ FLAG_ENTRY("PioBlockQwCountParity",
-       SEC_WRITE_DROPPED|SEC_SPC_FREEZE,
+       SEC_WRITE_DROPPED | SEC_SPC_FREEZE,
        SEND_PIO_ERR_STATUS_PIO_BLOCK_QW_COUNT_PARITY_ERR_SMASK),
 /*25*/ FLAG_ENTRY("PioVlfVlLenParity",
        SEC_SPC_FREEZE,
@@ -509,6 +511,12 @@ static struct flag_table sdma_err_status_flags[] = {
                | SEND_DMA_ERR_STATUS_SDMA_CSR_PARITY_ERR_SMASK \
                | SEND_DMA_ERR_STATUS_SDMA_PCIE_REQ_TRACKING_UNC_ERR_SMASK)
 
+/* SendEgressErrInfo bits that correspond to a PortXmitDiscard counter */
+#define PORT_DISCARD_EGRESS_ERRS \
+       (SEND_EGRESS_ERR_INFO_TOO_LONG_IB_PACKET_ERR_SMASK \
+       | SEND_EGRESS_ERR_INFO_VL_MAPPING_ERR_SMASK \
+       | SEND_EGRESS_ERR_INFO_VL_ERR_SMASK)
+
 /*
  * TXE Egress Error flags
  */
@@ -978,7 +986,6 @@ static struct flag_table dc8051_info_host_msg_flags[] = {
        FLAG_ENTRY0("Link going down", 0x0100),
 };
 
-
 static u32 encoded_size(u32 size);
 static u32 chip_to_opa_lstate(struct hfi1_devdata *dd, u32 chip_lstate);
 static int set_physical_link_state(struct hfi1_devdata *dd, u64 state);
@@ -1188,7 +1195,7 @@ CNTR_ELEM(#name, \
 #define OVR_LBL(ctx) C_RCV_HDR_OVF_ ## ctx
 #define OVR_ELM(ctx) \
 CNTR_ELEM("RcvHdrOvr" #ctx, \
-         (RCV_HDR_OVFL_CNT + ctx*0x100), \
+         (RCV_HDR_OVFL_CNT + ctx * 0x100), \
          0, CNTR_NORMAL, port_access_u64_csr)
 
 /* 32bit TXE */
@@ -1277,7 +1284,6 @@ static inline u64 read_write_csr(const struct hfi1_devdata *dd, u32 csr,
 {
        u64 ret;
 
-
        if (mode == CNTR_MODE_R) {
                ret = read_csr(dd, csr);
        } else if (mode == CNTR_MODE_W) {
@@ -1297,10 +1303,58 @@ static u64 dev_access_u32_csr(const struct cntr_entry *entry,
                            void *context, int vl, int mode, u64 data)
 {
        struct hfi1_devdata *dd = context;
+       u64 csr = entry->csr;
 
-       if (vl != CNTR_INVALID_VL)
-               return 0;
-       return read_write_csr(dd, entry->csr, mode, data);
+       if (entry->flags & CNTR_SDMA) {
+               if (vl == CNTR_INVALID_VL)
+                       return 0;
+               csr += 0x100 * vl;
+       } else {
+               if (vl != CNTR_INVALID_VL)
+                       return 0;
+       }
+       return read_write_csr(dd, csr, mode, data);
+}
+
+static u64 access_sde_err_cnt(const struct cntr_entry *entry,
+                             void *context, int idx, int mode, u64 data)
+{
+       struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
+
+       if (dd->per_sdma && idx < dd->num_sdma)
+               return dd->per_sdma[idx].err_cnt;
+       return 0;
+}
+
+static u64 access_sde_int_cnt(const struct cntr_entry *entry,
+                             void *context, int idx, int mode, u64 data)
+{
+       struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
+
+       if (dd->per_sdma && idx < dd->num_sdma)
+               return dd->per_sdma[idx].sdma_int_cnt;
+       return 0;
+}
+
+static u64 access_sde_idle_int_cnt(const struct cntr_entry *entry,
+                                  void *context, int idx, int mode, u64 data)
+{
+       struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
+
+       if (dd->per_sdma && idx < dd->num_sdma)
+               return dd->per_sdma[idx].idle_int_cnt;
+       return 0;
+}
+
+static u64 access_sde_progress_int_cnt(const struct cntr_entry *entry,
+                                      void *context, int idx, int mode,
+                                      u64 data)
+{
+       struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
+
+       if (dd->per_sdma && idx < dd->num_sdma)
+               return dd->per_sdma[idx].progress_int_cnt;
+       return 0;
 }
 
 static u64 dev_access_u64_csr(const struct cntr_entry *entry, void *context,
@@ -1432,12 +1486,18 @@ static u64 access_sw_unknown_frame_cnt(const struct cntr_entry *entry,
 static u64 access_sw_xmit_discards(const struct cntr_entry *entry,
                                    void *context, int vl, int mode, u64 data)
 {
-       struct hfi1_pportdata *ppd = context;
+       struct hfi1_pportdata *ppd = (struct hfi1_pportdata *)context;
+       u64 zero = 0;
+       u64 *counter;
 
-       if (vl != CNTR_INVALID_VL)
-               return 0;
+       if (vl == CNTR_INVALID_VL)
+               counter = &ppd->port_xmit_discards;
+       else if (vl >= 0 && vl < C_VL_COUNT)
+               counter = &ppd->port_xmit_discards_vl[vl];
+       else
+               counter = &zero;
 
-       return read_write_sw(ppd->dd, &ppd->port_xmit_discards, mode, data);
+       return read_write_sw(ppd->dd, counter, mode, data);
 }
 
 static u64 access_xmit_constraint_errs(const struct cntr_entry *entry,
@@ -1526,6 +1586,14 @@ static u64 access_sw_pio_wait(const struct cntr_entry *entry,
        return dd->verbs_dev.n_piowait;
 }
 
+static u64 access_sw_pio_drain(const struct cntr_entry *entry,
+                              void *context, int vl, int mode, u64 data)
+{
+       struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
+
+       return dd->verbs_dev.n_piodrain;
+}
+
 static u64 access_sw_vtx_wait(const struct cntr_entry *entry,
                              void *context, int vl, int mode, u64 data)
 {
@@ -1547,7 +1615,8 @@ static u64 access_sw_send_schedule(const struct cntr_entry *entry,
 {
        struct hfi1_devdata *dd = (struct hfi1_devdata *)context;
 
-       return dd->verbs_dev.n_send_schedule;
+       return read_write_cpu(dd, &dd->z_send_schedule, dd->send_schedule, vl,
+                             mode, data);
 }
 
 /* Software counters for the error status bits within MISC_ERR_STATUS */
@@ -3885,8 +3954,8 @@ static u64 access_sw_cpu_##cntr(const struct cntr_entry *entry,                 \
                              void *context, int vl, int mode, u64 data)      \
 {                                                                            \
        struct hfi1_pportdata *ppd = (struct hfi1_pportdata *)context;        \
-       return read_write_cpu(ppd->dd, &ppd->ibport_data.z_ ##cntr,           \
-                             ppd->ibport_data.cntr, vl,                      \
+       return read_write_cpu(ppd->dd, &ppd->ibport_data.rvp.z_ ##cntr,       \
+                             ppd->ibport_data.rvp.cntr, vl,                  \
                              mode, data);                                    \
 }
 
@@ -3903,7 +3972,7 @@ static u64 access_ibp_##cntr(const struct cntr_entry *entry,                    \
        if (vl != CNTR_INVALID_VL)                                            \
                return 0;                                                     \
                                                                              \
-       return read_write_sw(ppd->dd, &ppd->ibport_data.n_ ##cntr,            \
+       return read_write_sw(ppd->dd, &ppd->ibport_data.rvp.n_ ##cntr,        \
                             mode, data);                                     \
 }
 
@@ -4066,10 +4135,28 @@ static struct cntr_entry dev_cntrs[DEV_CNTR_LAST] = {
                            access_sw_vtx_wait),
 [C_SW_PIO_WAIT] = CNTR_ELEM("PioWait", 0, 0, CNTR_NORMAL,
                            access_sw_pio_wait),
+[C_SW_PIO_DRAIN] = CNTR_ELEM("PioDrain", 0, 0, CNTR_NORMAL,
+                           access_sw_pio_drain),
 [C_SW_KMEM_WAIT] = CNTR_ELEM("KmemWait", 0, 0, CNTR_NORMAL,
                            access_sw_kmem_wait),
 [C_SW_SEND_SCHED] = CNTR_ELEM("SendSched", 0, 0, CNTR_NORMAL,
                            access_sw_send_schedule),
+[C_SDMA_DESC_FETCHED_CNT] = CNTR_ELEM("SDEDscFdCn",
+                                     SEND_DMA_DESC_FETCHED_CNT, 0,
+                                     CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
+                                     dev_access_u32_csr),
+[C_SDMA_INT_CNT] = CNTR_ELEM("SDMAInt", 0, 0,
+                            CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
+                            access_sde_int_cnt),
+[C_SDMA_ERR_CNT] = CNTR_ELEM("SDMAErrCt", 0, 0,
+                            CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
+                            access_sde_err_cnt),
+[C_SDMA_IDLE_INT_CNT] = CNTR_ELEM("SDMAIdInt", 0, 0,
+                                 CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
+                                 access_sde_idle_int_cnt),
+[C_SDMA_PROGRESS_INT_CNT] = CNTR_ELEM("SDMAPrIntCn", 0, 0,
+                                     CNTR_NORMAL | CNTR_32BIT | CNTR_SDMA,
+                                     access_sde_progress_int_cnt),
 /* MISC_ERR_STATUS */
 [C_MISC_PLL_LOCK_FAIL_ERR] = CNTR_ELEM("MISC_PLL_LOCK_FAIL_ERR", 0, 0,
                                CNTR_NORMAL,
@@ -5170,7 +5257,7 @@ static char *is_various_name(char *buf, size_t bsize, unsigned int source)
        if (source < ARRAY_SIZE(various_names))
                strncpy(buf, various_names[source], bsize);
        else
-               snprintf(buf, bsize, "Reserved%u", source+IS_VARIOUS_START);
+               snprintf(buf, bsize, "Reserved%u", source + IS_VARIOUS_START);
        return buf;
 }
 
@@ -5349,7 +5436,7 @@ static void update_rcverr_timer(unsigned long opaque)
                        OPA_LINKDOWN_REASON_EXCESSIVE_BUFFER_OVERRUN);
                queue_work(ppd->hfi1_wq, &ppd->link_bounce_work);
        }
-       dd->rcv_ovfl_cnt = (u32) cur_ovfl_cnt;
+       dd->rcv_ovfl_cnt = (u32)cur_ovfl_cnt;
 
        mod_timer(&dd->rcverr_timer, jiffies + HZ * RCVERR_CHECK_TIME);
 }
@@ -5443,12 +5530,14 @@ static void handle_sdma_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
        }
 }
 
-static void count_port_inactive(struct hfi1_devdata *dd)
+static inline void __count_port_discards(struct hfi1_pportdata *ppd)
 {
-       struct hfi1_pportdata *ppd = dd->pport;
+       incr_cntr64(&ppd->port_xmit_discards);
+}
 
-       if (ppd->port_xmit_discards < ~(u64)0)
-               ppd->port_xmit_discards++;
+static void count_port_inactive(struct hfi1_devdata *dd)
+{
+       __count_port_discards(dd->pport);
 }
 
 /*
@@ -5460,7 +5549,8 @@ static void count_port_inactive(struct hfi1_devdata *dd)
  * egress error if more than one packet fails the same integrity check
  * since we cleared the corresponding bit in SEND_EGRESS_ERR_INFO.
  */
-static void handle_send_egress_err_info(struct hfi1_devdata *dd)
+static void handle_send_egress_err_info(struct hfi1_devdata *dd,
+                                       int vl)
 {
        struct hfi1_pportdata *ppd = dd->pport;
        u64 src = read_csr(dd, SEND_EGRESS_ERR_SOURCE); /* read first */
@@ -5475,10 +5565,24 @@ static void handle_send_egress_err_info(struct hfi1_devdata *dd)
                info, egress_err_info_string(buf, sizeof(buf), info), src);
 
        /* Eventually add other counters for each bit */
+       if (info & PORT_DISCARD_EGRESS_ERRS) {
+               int weight, i;
 
-       if (info & SEND_EGRESS_ERR_INFO_TOO_LONG_IB_PACKET_ERR_SMASK) {
-               if (ppd->port_xmit_discards < ~(u64)0)
-                       ppd->port_xmit_discards++;
+               /*
+                * Count all, in case multiple bits are set.  Reminder:
+                * since there is only one info register for many sources,
+                * these may be attributed to the wrong VL if they occur
+                * too close together.
+                */
+               weight = hweight64(info);
+               for (i = 0; i < weight; i++) {
+                       __count_port_discards(ppd);
+                       if (vl >= 0 && vl < TXE_NUM_DATA_VL)
+                               incr_cntr64(&ppd->port_xmit_discards_vl[vl]);
+                       else if (vl == 15)
+                               incr_cntr64(&ppd->port_xmit_discards_vl
+                                           [C_VL_15]);
+               }
        }
 }
 
@@ -5496,12 +5600,71 @@ static inline int port_inactive_err(u64 posn)
  * Input value is a bit position within the SEND_EGRESS_ERR_STATUS
  * register. Does it represent a 'disallowed packet' error?
  */
-static inline int disallowed_pkt_err(u64 posn)
+static inline int disallowed_pkt_err(int posn)
 {
        return (posn >= SEES(TX_SDMA0_DISALLOWED_PACKET) &&
                posn <= SEES(TX_SDMA15_DISALLOWED_PACKET));
 }
 
+/*
+ * Input value is a bit position of one of the SDMA engine disallowed
+ * packet errors.  Return which engine.  Use of this must be guarded by
+ * disallowed_pkt_err().
+ */
+static inline int disallowed_pkt_engine(int posn)
+{
+       return posn - SEES(TX_SDMA0_DISALLOWED_PACKET);
+}
+
+/*
+ * Translate an SDMA engine to a VL.  Return -1 if the tranlation cannot
+ * be done.
+ */
+static int engine_to_vl(struct hfi1_devdata *dd, int engine)
+{
+       struct sdma_vl_map *m;
+       int vl;
+
+       /* range check */
+       if (engine < 0 || engine >= TXE_NUM_SDMA_ENGINES)
+               return -1;
+
+       rcu_read_lock();
+       m = rcu_dereference(dd->sdma_map);
+       vl = m->engine_to_vl[engine];
+       rcu_read_unlock();
+
+       return vl;
+}
+
+/*
+ * Translate the send context (sofware index) into a VL.  Return -1 if the
+ * translation cannot be done.
+ */
+static int sc_to_vl(struct hfi1_devdata *dd, int sw_index)
+{
+       struct send_context_info *sci;
+       struct send_context *sc;
+       int i;
+
+       sci = &dd->send_contexts[sw_index];
+
+       /* there is no information for user (PSM) and ack contexts */
+       if (sci->type != SC_KERNEL)
+               return -1;
+
+       sc = sci->sc;
+       if (!sc)
+               return -1;
+       if (dd->vld[15].sc == sc)
+               return 15;
+       for (i = 0; i < num_vls; i++)
+               if (dd->vld[i].sc == sc)
+                       return i;
+
+       return -1;
+}
+
 static void handle_egress_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
 {
        u64 reg_copy = reg, handled = 0;
@@ -5510,27 +5673,27 @@ static void handle_egress_err(struct hfi1_devdata *dd, u32 unused, u64 reg)
 
        if (reg & ALL_TXE_EGRESS_FREEZE_ERR)
                start_freeze_handling(dd->pport, 0);
-       if (is_ax(dd) && (reg &
-                   SEND_EGRESS_ERR_STATUS_TX_CREDIT_RETURN_VL_ERR_SMASK)
-                   && (dd->icode != ICODE_FUNCTIONAL_SIMULATOR))
+       else if (is_ax(dd) &&
+                (reg & SEND_EGRESS_ERR_STATUS_TX_CREDIT_RETURN_VL_ERR_SMASK) &&
+                (dd->icode != ICODE_FUNCTIONAL_SIMULATOR))
                start_freeze_handling(dd->pport, 0);
 
        while (reg_copy) {
                int posn = fls64(reg_copy);
-               /*
-                * fls64() returns a 1-based offset, but we generally
-                * want 0-based offsets.
-                */
+               /* fls64() returns a 1-based offset, we want it zero based */
                int shift = posn - 1;
+               u64 mask = 1ULL << shift;
 
                if (port_inactive_err(shift)) {
                        count_port_inactive(dd);
-                       handled |= (1ULL << shift);
+                       handled |= mask;
                } else if (disallowed_pkt_err(shift)) {
-                       handle_send_egress_err_info(dd);
-                       handled |= (1ULL << shift);
+                       int vl = engine_to_vl(dd, disallowed_pkt_engine(shift));
+
+                       handle_send_egress_err_info(dd, vl);
+                       handled |= mask;
                }
-               clear_bit(shift, (unsigned long *)&reg_copy);
+               reg_copy &= ~mask;
        }
 
        reg &= ~handled;
@@ -5674,7 +5837,7 @@ static void is_sendctxt_err_int(struct hfi1_devdata *dd,
                send_context_err_status_string(flags, sizeof(flags), status));
 
        if (status & SEND_CTXT_ERR_STATUS_PIO_DISALLOWED_PACKET_ERR_SMASK)
-               handle_send_egress_err_info(dd);
+               handle_send_egress_err_info(dd, sc_to_vl(dd, sw_index));
 
        /*
         * Automatically restart halted kernel contexts out of interrupt
@@ -5707,6 +5870,7 @@ static void handle_sdma_eng_err(struct hfi1_devdata *dd,
        dd_dev_err(sde->dd, "CONFIG SDMA(%u) source: %u status 0x%llx\n",
                   sde->this_idx, source, (unsigned long long)status);
 #endif
+       sde->err_cnt++;
        sdma_engine_error(sde, status);
 
        /*
@@ -5761,7 +5925,7 @@ static void is_various_int(struct hfi1_devdata *dd, unsigned int source)
 
 static void handle_qsfp_int(struct hfi1_devdata *dd, u32 src_ctx, u64 reg)
 {
-       /* source is always zero */
+       /* src_ctx is always zero */
        struct hfi1_pportdata *ppd = dd->pport;
        unsigned long flags;
        u64 qsfp_int_mgmt = (u64)(QSFP_HFI0_INT_N | QSFP_HFI0_MODPRST_N);
@@ -5784,14 +5948,23 @@ static void handle_qsfp_int(struct hfi1_devdata *dd, u32 src_ctx, u64 reg)
                         * an interrupt when a cable is inserted
                         */
                        ppd->qsfp_info.cache_valid = 0;
-                       ppd->qsfp_info.qsfp_interrupt_functional = 0;
+                       ppd->qsfp_info.reset_needed = 0;
+                       ppd->qsfp_info.limiting_active = 0;
                        spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock,
                                                flags);
-                       write_csr(dd,
-                                       dd->hfi1_id ?
-                                               ASIC_QSFP2_INVERT :
-                                               ASIC_QSFP1_INVERT,
-                               qsfp_int_mgmt);
+                       /* Invert the ModPresent pin now to detect plug-in */
+                       write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_INVERT :
+                                 ASIC_QSFP1_INVERT, qsfp_int_mgmt);
+
+                       if ((ppd->offline_disabled_reason >
+                         HFI1_ODR_MASK(
+                         OPA_LINKDOWN_REASON_LOCAL_MEDIA_NOT_INSTALLED)) ||
+                         (ppd->offline_disabled_reason ==
+                         HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE)))
+                               ppd->offline_disabled_reason =
+                               HFI1_ODR_MASK(
+                               OPA_LINKDOWN_REASON_LOCAL_MEDIA_NOT_INSTALLED);
+
                        if (ppd->host_link_state == HLS_DN_POLL) {
                                /*
                                 * The link is still in POLL. This means
@@ -5808,12 +5981,16 @@ static void handle_qsfp_int(struct hfi1_devdata *dd, u32 src_ctx, u64 reg)
                        spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock,
                                                flags);
 
+                       /*
+                        * Stop inversion of ModPresent pin to detect
+                        * removal of the cable
+                        */
                        qsfp_int_mgmt &= ~(u64)QSFP_HFI0_MODPRST_N;
-                       write_csr(dd,
-                                       dd->hfi1_id ?
-                                               ASIC_QSFP2_INVERT :
-                                               ASIC_QSFP1_INVERT,
-                               qsfp_int_mgmt);
+                       write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_INVERT :
+                                 ASIC_QSFP1_INVERT, qsfp_int_mgmt);
+
+                       ppd->offline_disabled_reason =
+                               HFI1_ODR_MASK(OPA_LINKDOWN_REASON_TRANSIENT);
                }
        }
 
@@ -5823,7 +6000,6 @@ static void handle_qsfp_int(struct hfi1_devdata *dd, u32 src_ctx, u64 reg)
                                __func__);
                spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
                ppd->qsfp_info.check_interrupt_flags = 1;
-               ppd->qsfp_info.qsfp_interrupt_functional = 1;
                spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock, flags);
        }
 
@@ -6007,13 +6183,19 @@ static void hreq_response(struct hfi1_devdata *dd, u8 return_code, u16 rsp_data)
 }
 
 /*
- * Handle requests from the 8051.
+ * Handle host requests from the 8051.
+ *
+ * This is a work-queue function outside of the interrupt.
  */
-static void handle_8051_request(struct hfi1_devdata *dd)
+void handle_8051_request(struct work_struct *work)
 {
+       struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
+                                                       dc_host_req_work);
+       struct hfi1_devdata *dd = ppd->dd;
        u64 reg;
-       u16 data;
-       u8 type;
+       u16 data = 0;
+       u8 type, i, lanes, *cache = ppd->qsfp_info.cache;
+       u8 cdr_ctrl_byte = cache[QSFP_CDR_CTRL_BYTE_OFFS];
 
        reg = read_csr(dd, DC_DC8051_CFG_EXT_DEV_1);
        if ((reg & DC_DC8051_CFG_EXT_DEV_1_REQ_NEW_SMASK) == 0)
@@ -6034,12 +6216,46 @@ static void handle_8051_request(struct hfi1_devdata *dd)
        case HREQ_READ_CONFIG:
        case HREQ_SET_TX_EQ_ABS:
        case HREQ_SET_TX_EQ_REL:
-       case HREQ_ENABLE:
                dd_dev_info(dd, "8051 request: request 0x%x not supported\n",
                        type);
                hreq_response(dd, HREQ_NOT_SUPPORTED, 0);
                break;
 
+       case HREQ_ENABLE:
+               lanes = data & 0xF;
+               for (i = 0; lanes; lanes >>= 1, i++) {
+                       if (!(lanes & 1))
+                               continue;
+                       if (data & 0x200) {
+                               /* enable TX CDR */
+                               if (cache[QSFP_MOD_PWR_OFFS] & 0x8 &&
+                                   cache[QSFP_CDR_INFO_OFFS] & 0x80)
+                                       cdr_ctrl_byte |= (1 << (i + 4));
+                       } else {
+                               /* disable TX CDR */
+                               if (cache[QSFP_MOD_PWR_OFFS] & 0x8 &&
+                                   cache[QSFP_CDR_INFO_OFFS] & 0x80)
+                                       cdr_ctrl_byte &= ~(1 << (i + 4));
+                       }
+
+                       if (data & 0x800) {
+                               /* enable RX CDR */
+                               if (cache[QSFP_MOD_PWR_OFFS] & 0x4 &&
+                                   cache[QSFP_CDR_INFO_OFFS] & 0x40)
+                                       cdr_ctrl_byte |= (1 << i);
+                       } else {
+                               /* disable RX CDR */
+                               if (cache[QSFP_MOD_PWR_OFFS] & 0x4 &&
+                                   cache[QSFP_CDR_INFO_OFFS] & 0x40)
+                                       cdr_ctrl_byte &= ~(1 << i);
+                       }
+               }
+               qsfp_write(ppd, ppd->dd->hfi1_id, QSFP_CDR_CTRL_BYTE_OFFS,
+                          &cdr_ctrl_byte, 1);
+               hreq_response(dd, HREQ_SUCCESS, data);
+               refresh_qsfp_cache(ppd, &ppd->qsfp_info);
+               break;
+
        case HREQ_CONFIG_DONE:
                hreq_response(dd, HREQ_SUCCESS, 0);
                break;
@@ -6100,7 +6316,7 @@ void reset_link_credits(struct hfi1_devdata *dd)
 
        /* remove all previous VL credit limits */
        for (i = 0; i < TXE_NUM_DATA_VL; i++)
-               write_csr(dd, SEND_CM_CREDIT_VL + (8*i), 0);
+               write_csr(dd, SEND_CM_CREDIT_VL + (8 * i), 0);
        write_csr(dd, SEND_CM_CREDIT_VL15, 0);
        write_global_credit(dd, 0, 0, 0);
        /* reset the CM block */
@@ -6150,7 +6366,7 @@ static void lcb_shutdown(struct hfi1_devdata *dd, int abort)
                reg
                | (1ull << DCC_CFG_RESET_RESET_LCB_SHIFT)
                | (1ull << DCC_CFG_RESET_RESET_RX_FPE_SHIFT));
-       (void) read_csr(dd, DCC_CFG_RESET); /* make sure the write completed */
+       (void)read_csr(dd, DCC_CFG_RESET); /* make sure the write completed */
        if (!abort) {
                udelay(1);    /* must hold for the longer of 16cclks or 20ns */
                write_csr(dd, DCC_CFG_RESET, reg);
@@ -6478,11 +6694,17 @@ static void rxe_freeze(struct hfi1_devdata *dd)
  */
 static void rxe_kernel_unfreeze(struct hfi1_devdata *dd)
 {
+       u32 rcvmask;
        int i;
 
        /* enable all kernel contexts */
-       for (i = 0; i < dd->n_krcv_queues; i++)
-               hfi1_rcvctrl(dd, HFI1_RCVCTRL_CTXT_ENB, i);
+       for (i = 0; i < dd->n_krcv_queues; i++) {
+               rcvmask = HFI1_RCVCTRL_CTXT_ENB;
+               /* HFI1_RCVCTRL_TAILUPD_[ENB|DIS] needs to be set explicitly */
+               rcvmask |= HFI1_CAP_KGET_MASK(dd->rcd[i]->flags, DMA_RTAIL) ?
+                       HFI1_RCVCTRL_TAILUPD_ENB : HFI1_RCVCTRL_TAILUPD_DIS;
+               hfi1_rcvctrl(dd, rcvmask, i);
+       }
 
        /* enable port */
        add_rcvctrl(dd, RCV_CTRL_RCV_PORT_ENABLE_SMASK);
@@ -6591,6 +6813,7 @@ void handle_link_up(struct work_struct *work)
                set_link_down_reason(ppd, OPA_LINKDOWN_REASON_SPEED_POLICY, 0,
                        OPA_LINKDOWN_REASON_SPEED_POLICY);
                set_link_state(ppd, HLS_DN_OFFLINE);
+               tune_serdes(ppd);
                start_link(ppd);
        }
 }
@@ -6616,7 +6839,13 @@ void handle_link_down(struct work_struct *work)
        struct hfi1_pportdata *ppd = container_of(work, struct hfi1_pportdata,
                                                                link_down_work);
 
-       /* go offline first, then deal with reasons */
+       if ((ppd->host_link_state &
+            (HLS_DN_POLL | HLS_VERIFY_CAP | HLS_GOING_UP)) &&
+            ppd->port_type == PORT_TYPE_FIXED)
+               ppd->offline_disabled_reason =
+                       HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NOT_INSTALLED);
+
+       /* Go offline first, then deal with reading/writing through 8051 */
        set_link_state(ppd, HLS_DN_OFFLINE);
 
        lcl_reason = 0;
@@ -6638,10 +6867,12 @@ void handle_link_down(struct work_struct *work)
 
        /* If there is no cable attached, turn the DC off. Otherwise,
         * start the link bring up. */
-       if (!qsfp_mod_present(ppd))
+       if (!qsfp_mod_present(ppd)) {
                dc_shutdown(ppd->dd);
-       else
+       } else {
+               tune_serdes(ppd);
                start_link(ppd);
+       }
 }
 
 void handle_link_bounce(struct work_struct *work)
@@ -6654,6 +6885,7 @@ void handle_link_bounce(struct work_struct *work)
         */
        if (ppd->host_link_state & HLS_UP) {
                set_link_state(ppd, HLS_DN_OFFLINE);
+               tune_serdes(ppd);
                start_link(ppd);
        } else {
                dd_dev_info(ppd->dd, "%s: link not up (%s), nothing to do\n",
@@ -7162,6 +7394,7 @@ done:
                set_link_down_reason(ppd, OPA_LINKDOWN_REASON_WIDTH_POLICY, 0,
                  OPA_LINKDOWN_REASON_WIDTH_POLICY);
                set_link_state(ppd, HLS_DN_OFFLINE);
+               tune_serdes(ppd);
                start_link(ppd);
        }
 }
@@ -7284,7 +7517,7 @@ static void handle_8051_interrupt(struct hfi1_devdata *dd, u32 unused, u64 reg)
                        host_msg &= ~(u64)LINKUP_ACHIEVED;
                }
                if (host_msg & EXT_DEVICE_CFG_REQ) {
-                       handle_8051_request(dd);
+                       queue_work(ppd->hfi1_wq, &ppd->dc_host_req_work);
                        host_msg &= ~(u64)EXT_DEVICE_CFG_REQ;
                }
                if (host_msg & VERIFY_CAP_FRAME) {
@@ -7338,7 +7571,7 @@ static void handle_8051_interrupt(struct hfi1_devdata *dd, u32 unused, u64 reg)
                /* if the link is already going down or disabled, do not
                 * queue another */
                if ((ppd->host_link_state
-                                   & (HLS_GOING_OFFLINE|HLS_LINK_COOLDOWN))
+                                   & (HLS_GOING_OFFLINE | HLS_LINK_COOLDOWN))
                                || ppd->link_enabled == 0) {
                        dd_dev_info(dd, "%s: not queuing link down\n",
                                __func__);
@@ -7756,7 +7989,7 @@ static irqreturn_t general_interrupt(int irq, void *data)
 
        /* phase 2: call the appropriate handler */
        for_each_set_bit(bit, (unsigned long *)&regs[0],
-                                               CCE_NUM_INT_CSRS*64) {
+                                               CCE_NUM_INT_CSRS * 64) {
                is_interrupt(dd, bit);
        }
 
@@ -7779,12 +8012,12 @@ static irqreturn_t sdma_interrupt(int irq, void *data)
 
        /* This read_csr is really bad in the hot path */
        status = read_csr(dd,
-                       CCE_INT_STATUS + (8*(IS_SDMA_START/64)))
+                       CCE_INT_STATUS + (8 * (IS_SDMA_START / 64)))
                        & sde->imask;
        if (likely(status)) {
                /* clear the interrupt(s) */
                write_csr(dd,
-                       CCE_INT_CLEAR + (8*(IS_SDMA_START/64)),
+                       CCE_INT_CLEAR + (8 * (IS_SDMA_START / 64)),
                        status);
 
                /* handle the interrupt(s) */
@@ -7797,9 +8030,9 @@ static irqreturn_t sdma_interrupt(int irq, void *data)
 }
 
 /*
- * Clear the receive interrupt, forcing the write and making sure
- * we have data from the chip, pushing everything in front of it
- * back to the host.
+ * Clear the receive interrupt.  Use a read of the interrupt clear CSR
+ * to insure that the write completed.  This does NOT guarantee that
+ * queued DMA writes to memory from the chip are pushed.
  */
 static inline void clear_recv_intr(struct hfi1_ctxtdata *rcd)
 {
@@ -7813,20 +8046,38 @@ static inline void clear_recv_intr(struct hfi1_ctxtdata *rcd)
 }
 
 /* force the receive interrupt */
-static inline void force_recv_intr(struct hfi1_ctxtdata *rcd)
+void force_recv_intr(struct hfi1_ctxtdata *rcd)
 {
        write_csr(rcd->dd, CCE_INT_FORCE + (8 * rcd->ireg), rcd->imask);
 }
 
-/* return non-zero if a packet is present */
+/*
+ * Return non-zero if a packet is present.
+ *
+ * This routine is called when rechecking for packets after the RcvAvail
+ * interrupt has been cleared down.  First, do a quick check of memory for
+ * a packet present.  If not found, use an expensive CSR read of the context
+ * tail to determine the actual tail.  The CSR read is necessary because there
+ * is no method to push pending DMAs to memory other than an interrupt and we
+ * are trying to determine if we need to force an interrupt.
+ */
 static inline int check_packet_present(struct hfi1_ctxtdata *rcd)
 {
+       u32 tail;
+       int present;
+
        if (!HFI1_CAP_IS_KSET(DMA_RTAIL))
-               return (rcd->seq_cnt ==
+               present = (rcd->seq_cnt ==
                                rhf_rcv_seq(rhf_to_cpu(get_rhf_addr(rcd))));
+       else /* is RDMA rtail */
+               present = (rcd->head != get_rcvhdrtail(rcd));
 
-       /* else is RDMA rtail */
-       return (rcd->head != get_rcvhdrtail(rcd));
+       if (present)
+               return 1;
+
+       /* fall back to a CSR read, correct indpendent of DMA_RTAIL */
+       tail = (u32)read_uctxt_csr(rcd->dd, rcd->ctxt, RCV_HDR_TAIL);
+       return rcd->head != tail;
 }
 
 /*
@@ -7846,6 +8097,7 @@ static irqreturn_t receive_context_interrupt(int irq, void *data)
 
        trace_hfi1_receive_interrupt(dd, rcd->ctxt);
        this_cpu_inc(*dd->int_counter);
+       aspm_ctx_disable(rcd);
 
        /* receive interrupt remains blocked while processing packets */
        disposition = rcd->do_interrupt(rcd, 0);
@@ -7912,7 +8164,7 @@ u32 read_physical_state(struct hfi1_devdata *dd)
                                & DC_DC8051_STS_CUR_STATE_PORT_MASK;
 }
 
-static u32 read_logical_state(struct hfi1_devdata *dd)
+u32 read_logical_state(struct hfi1_devdata *dd)
 {
        u64 reg;
 
@@ -8160,8 +8412,8 @@ static int set_physical_link_state(struct hfi1_devdata *dd, u64 state)
        return do_8051_command(dd, HCMD_CHANGE_PHY_STATE, state, NULL);
 }
 
-static int load_8051_config(struct hfi1_devdata *dd, u8 field_id,
-                           u8 lane_id, u32 config_data)
+int load_8051_config(struct hfi1_devdata *dd, u8 field_id,
+                    u8 lane_id, u32 config_data)
 {
        u64 data;
        int ret;
@@ -8183,8 +8435,8 @@ static int load_8051_config(struct hfi1_devdata *dd, u8 field_id,
  * set the result, even on error.
  * Return 0 on success, -errno on failure
  */
-static int read_8051_config(struct hfi1_devdata *dd, u8 field_id, u8 lane_id,
-                           u32 *result)
+int read_8051_config(struct hfi1_devdata *dd, u8 field_id, u8 lane_id,
+                    u32 *result)
 {
        u64 big_data;
        u32 addr;
@@ -8690,10 +8942,10 @@ static u16 opa_to_vc_link_widths(u16 opa_widths)
                u16 from;
                u16 to;
        } opa_link_xlate[] = {
-               { OPA_LINK_WIDTH_1X, 1 << (1-1)  },
-               { OPA_LINK_WIDTH_2X, 1 << (2-1)  },
-               { OPA_LINK_WIDTH_3X, 1 << (3-1)  },
-               { OPA_LINK_WIDTH_4X, 1 << (4-1)  },
+               { OPA_LINK_WIDTH_1X, 1 << (1 - 1)  },
+               { OPA_LINK_WIDTH_2X, 1 << (2 - 1)  },
+               { OPA_LINK_WIDTH_3X, 1 << (3 - 1)  },
+               { OPA_LINK_WIDTH_4X, 1 << (4 - 1)  },
        };
 
        for (i = 0; i < ARRAY_SIZE(opa_link_xlate); i++) {
@@ -8806,32 +9058,80 @@ int start_link(struct hfi1_pportdata *ppd)
        return -EAGAIN;
 }
 
-static void reset_qsfp(struct hfi1_pportdata *ppd)
+static void wait_for_qsfp_init(struct hfi1_pportdata *ppd)
+{
+       struct hfi1_devdata *dd = ppd->dd;
+       u64 mask;
+       unsigned long timeout;
+
+       /*
+        * Check for QSFP interrupt for t_init (SFF 8679)
+        */
+       timeout = jiffies + msecs_to_jiffies(2000);
+       while (1) {
+               mask = read_csr(dd, dd->hfi1_id ?
+                               ASIC_QSFP2_IN : ASIC_QSFP1_IN);
+               if (!(mask & QSFP_HFI0_INT_N)) {
+                       write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_CLEAR :
+                                 ASIC_QSFP1_CLEAR, QSFP_HFI0_INT_N);
+                       break;
+               }
+               if (time_after(jiffies, timeout)) {
+                       dd_dev_info(dd, "%s: No IntN detected, reset complete\n",
+                                   __func__);
+                       break;
+               }
+               udelay(2);
+       }
+}
+
+static void set_qsfp_int_n(struct hfi1_pportdata *ppd, u8 enable)
+{
+       struct hfi1_devdata *dd = ppd->dd;
+       u64 mask;
+
+       mask = read_csr(dd, dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK);
+       if (enable)
+               mask |= (u64)QSFP_HFI0_INT_N;
+       else
+               mask &= ~(u64)QSFP_HFI0_INT_N;
+       write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK, mask);
+}
+
+void reset_qsfp(struct hfi1_pportdata *ppd)
 {
        struct hfi1_devdata *dd = ppd->dd;
        u64 mask, qsfp_mask;
 
+       /* Disable INT_N from triggering QSFP interrupts */
+       set_qsfp_int_n(ppd, 0);
+
+       /* Reset the QSFP */
        mask = (u64)QSFP_HFI0_RESET_N;
-       qsfp_mask = read_csr(dd,
-               dd->hfi1_id ? ASIC_QSFP2_OE : ASIC_QSFP1_OE);
+       qsfp_mask = read_csr(dd, dd->hfi1_id ? ASIC_QSFP2_OE : ASIC_QSFP1_OE);
        qsfp_mask |= mask;
        write_csr(dd,
-               dd->hfi1_id ? ASIC_QSFP2_OE : ASIC_QSFP1_OE,
-               qsfp_mask);
+               dd->hfi1_id ? ASIC_QSFP2_OE : ASIC_QSFP1_OE, qsfp_mask);
 
-       qsfp_mask = read_csr(dd,
-               dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT);
+       qsfp_mask = read_csr(dd, dd->hfi1_id ?
+                               ASIC_QSFP2_OUT : ASIC_QSFP1_OUT);
        qsfp_mask &= ~mask;
        write_csr(dd,
-               dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT,
-               qsfp_mask);
+               dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT, qsfp_mask);
 
        udelay(10);
 
        qsfp_mask |= mask;
        write_csr(dd,
-               dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT,
-               qsfp_mask);
+               dd->hfi1_id ? ASIC_QSFP2_OUT : ASIC_QSFP1_OUT, qsfp_mask);
+
+       wait_for_qsfp_init(ppd);
+
+       /*
+        * Allow INT_N to trigger the QSFP interrupt to watch
+        * for alarms and warnings
+        */
+       set_qsfp_int_n(ppd, 1);
 }
 
 static int handle_qsfp_error_conditions(struct hfi1_pportdata *ppd,
@@ -8943,35 +9243,8 @@ static int handle_qsfp_error_conditions(struct hfi1_pportdata *ppd,
        return 0;
 }
 
-static int do_pre_lni_host_behaviors(struct hfi1_pportdata *ppd)
-{
-       refresh_qsfp_cache(ppd, &ppd->qsfp_info);
-
-       return 0;
-}
-
-static int do_qsfp_intr_fallback(struct hfi1_pportdata *ppd)
-{
-       struct hfi1_devdata *dd = ppd->dd;
-       u8 qsfp_interrupt_status = 0;
-
-       if (qsfp_read(ppd, dd->hfi1_id, 2, &qsfp_interrupt_status, 1)
-               != 1) {
-               dd_dev_info(dd,
-                       "%s: Failed to read status of QSFP module\n",
-                       __func__);
-               return -EIO;
-       }
-
-       /* We don't care about alarms & warnings with a non-functional INT_N */
-       if (!(qsfp_interrupt_status & QSFP_DATA_NOT_READY))
-               do_pre_lni_host_behaviors(ppd);
-
-       return 0;
-}
-
 /* This routine will only be scheduled if the QSFP module is present */
-static void qsfp_event(struct work_struct *work)
+void qsfp_event(struct work_struct *work)
 {
        struct qsfp_data *qd;
        struct hfi1_pportdata *ppd;
@@ -8993,20 +9266,20 @@ static void qsfp_event(struct work_struct *work)
        dc_start(dd);
 
        if (qd->cache_refresh_required) {
-               msleep(3000);
-               reset_qsfp(ppd);
 
-               /* Check for QSFP interrupt after t_init (SFF 8679)
-                * + extra
+               set_qsfp_int_n(ppd, 0);
+
+               wait_for_qsfp_init(ppd);
+
+               /*
+                * Allow INT_N to trigger the QSFP interrupt to watch
+                * for alarms and warnings
                 */
-               msleep(3000);
-               if (!qd->qsfp_interrupt_functional) {
-                       if (do_qsfp_intr_fallback(ppd) < 0)
-                               dd_dev_info(dd, "%s: QSFP fallback failed\n",
-                                       __func__);
-                       ppd->driver_link_ready = 1;
-                       start_link(ppd);
-               }
+               set_qsfp_int_n(ppd, 1);
+
+               tune_serdes(ppd);
+
+               start_link(ppd);
        }
 
        if (qd->check_interrupt_flags) {
@@ -9019,50 +9292,50 @@ static void qsfp_event(struct work_struct *work)
                                __func__);
                } else {
                        unsigned long flags;
-                       u8 data_status;
 
+                       handle_qsfp_error_conditions(
+                                       ppd, qsfp_interrupt_status);
                        spin_lock_irqsave(&ppd->qsfp_info.qsfp_lock, flags);
                        ppd->qsfp_info.check_interrupt_flags = 0;
                        spin_unlock_irqrestore(&ppd->qsfp_info.qsfp_lock,
                                                                flags);
-
-                       if (qsfp_read(ppd, dd->hfi1_id, 2, &data_status, 1)
-                                != 1) {
-                               dd_dev_info(dd,
-                               "%s: Failed to read status of QSFP module\n",
-                                       __func__);
-                       }
-                       if (!(data_status & QSFP_DATA_NOT_READY)) {
-                               do_pre_lni_host_behaviors(ppd);
-                               start_link(ppd);
-                       } else
-                               handle_qsfp_error_conditions(ppd,
-                                               qsfp_interrupt_status);
                }
        }
 }
 
-void init_qsfp(struct hfi1_pportdata *ppd)
+static void init_qsfp_int(struct hfi1_devdata *dd)
 {
-       struct hfi1_devdata *dd = ppd->dd;
-       u64 qsfp_mask;
+       struct hfi1_pportdata *ppd = dd->pport;
+       u64 qsfp_mask, cce_int_mask;
+       const int qsfp1_int_smask = QSFP1_INT % 64;
+       const int qsfp2_int_smask = QSFP2_INT % 64;
 
-       if (loopback == LOOPBACK_SERDES || loopback == LOOPBACK_LCB ||
-                       ppd->dd->icode == ICODE_FUNCTIONAL_SIMULATOR) {
-               ppd->driver_link_ready = 1;
-               return;
+       /*
+        * disable QSFP1 interrupts for HFI1, QSFP2 interrupts for HFI0
+        * Qsfp1Int and Qsfp2Int are adjacent bits in the same CSR,
+        * therefore just one of QSFP1_INT/QSFP2_INT can be used to find
+        * the index of the appropriate CSR in the CCEIntMask CSR array
+        */
+       cce_int_mask = read_csr(dd, CCE_INT_MASK +
+                               (8 * (QSFP1_INT / 64)));
+       if (dd->hfi1_id) {
+               cce_int_mask &= ~((u64)1 << qsfp1_int_smask);
+               write_csr(dd, CCE_INT_MASK + (8 * (QSFP1_INT / 64)),
+                         cce_int_mask);
+       } else {
+               cce_int_mask &= ~((u64)1 << qsfp2_int_smask);
+               write_csr(dd, CCE_INT_MASK + (8 * (QSFP2_INT / 64)),
+                         cce_int_mask);
        }
 
-       ppd->qsfp_info.ppd = ppd;
-       INIT_WORK(&ppd->qsfp_info.qsfp_work, qsfp_event);
-
        qsfp_mask = (u64)(QSFP_HFI0_INT_N | QSFP_HFI0_MODPRST_N);
        /* Clear current status to avoid spurious interrupts */
-       write_csr(dd,
-                       dd->hfi1_id ?
-                               ASIC_QSFP2_CLEAR :
-                               ASIC_QSFP1_CLEAR,
-               qsfp_mask);
+       write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_CLEAR : ASIC_QSFP1_CLEAR,
+                 qsfp_mask);
+       write_csr(dd, dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK,
+                 qsfp_mask);
+
+       set_qsfp_int_n(ppd, 0);
 
        /* Handle active low nature of INT_N and MODPRST_N pins */
        if (qsfp_mod_present(ppd))
@@ -9070,29 +9343,6 @@ void init_qsfp(struct hfi1_pportdata *ppd)
        write_csr(dd,
                  dd->hfi1_id ? ASIC_QSFP2_INVERT : ASIC_QSFP1_INVERT,
                  qsfp_mask);
-
-       /* Allow only INT_N and MODPRST_N to trigger QSFP interrupts */
-       qsfp_mask |= (u64)QSFP_HFI0_MODPRST_N;
-       write_csr(dd,
-               dd->hfi1_id ? ASIC_QSFP2_MASK : ASIC_QSFP1_MASK,
-               qsfp_mask);
-
-       if (qsfp_mod_present(ppd)) {
-               msleep(3000);
-               reset_qsfp(ppd);
-
-               /* Check for QSFP interrupt after t_init (SFF 8679)
-                * + extra
-                */
-               msleep(3000);
-               if (!ppd->qsfp_info.qsfp_interrupt_functional) {
-                       if (do_qsfp_intr_fallback(ppd) < 0)
-                               dd_dev_info(dd,
-                                       "%s: QSFP fallback failed\n",
-                                       __func__);
-                       ppd->driver_link_ready = 1;
-               }
-       }
 }
 
 /*
@@ -9100,6 +9350,10 @@ void init_qsfp(struct hfi1_pportdata *ppd)
  */
 static void init_lcb(struct hfi1_devdata *dd)
 {
+       /* simulator does not correctly handle LCB cclk loopback, skip */
+       if (dd->icode == ICODE_FUNCTIONAL_SIMULATOR)
+               return;
+
        /* the DC has been reset earlier in the driver load */
 
        /* set LCB for cclk loopback on the port */
@@ -9128,8 +9382,6 @@ int bringup_serdes(struct hfi1_pportdata *ppd)
                ppd->guid = guid;
        }
 
-       /* the link defaults to enabled */
-       ppd->link_enabled = 1;
        /* Set linkinit_reason on power up per OPA spec */
        ppd->linkinit_reason = OPA_LINKINIT_REASON_LINKUP;
 
@@ -9142,6 +9394,12 @@ int bringup_serdes(struct hfi1_pportdata *ppd)
                        return ret;
        }
 
+       /* tune the SERDES to a ballpark setting for
+        * optimal signal and bit error rate
+        * Needs to be done before starting the link
+        */
+       tune_serdes(ppd);
+
        return start_link(ppd);
 }
 
@@ -9159,6 +9417,8 @@ void hfi1_quiet_serdes(struct hfi1_pportdata *ppd)
        ppd->driver_link_ready = 0;
        ppd->link_enabled = 0;
 
+       ppd->offline_disabled_reason =
+                       HFI1_ODR_MASK(OPA_LINKDOWN_REASON_SMA_DISABLED);
        set_link_down_reason(ppd, OPA_LINKDOWN_REASON_SMA_DISABLED, 0,
          OPA_LINKDOWN_REASON_SMA_DISABLED);
        set_link_state(ppd, HLS_DN_OFFLINE);
@@ -9174,14 +9434,14 @@ static inline int init_cpu_counters(struct hfi1_devdata *dd)
 
        ppd = (struct hfi1_pportdata *)(dd + 1);
        for (i = 0; i < dd->num_pports; i++, ppd++) {
-               ppd->ibport_data.rc_acks = NULL;
-               ppd->ibport_data.rc_qacks = NULL;
-               ppd->ibport_data.rc_acks = alloc_percpu(u64);
-               ppd->ibport_data.rc_qacks = alloc_percpu(u64);
-               ppd->ibport_data.rc_delayed_comp = alloc_percpu(u64);
-               if ((ppd->ibport_data.rc_acks == NULL) ||
-                   (ppd->ibport_data.rc_delayed_comp == NULL) ||
-                   (ppd->ibport_data.rc_qacks == NULL))
+               ppd->ibport_data.rvp.rc_acks = NULL;
+               ppd->ibport_data.rvp.rc_qacks = NULL;
+               ppd->ibport_data.rvp.rc_acks = alloc_percpu(u64);
+               ppd->ibport_data.rvp.rc_qacks = alloc_percpu(u64);
+               ppd->ibport_data.rvp.rc_delayed_comp = alloc_percpu(u64);
+               if (!ppd->ibport_data.rvp.rc_acks ||
+                   !ppd->ibport_data.rvp.rc_delayed_comp ||
+                   !ppd->ibport_data.rvp.rc_qacks)
                        return -ENOMEM;
        }
 
@@ -9463,7 +9723,7 @@ static void set_lidlmc(struct hfi1_pportdata *ppd)
        c1 &= ~(DCC_CFG_PORT_CONFIG1_TARGET_DLID_SMASK
                | DCC_CFG_PORT_CONFIG1_DLID_MASK_SMASK);
        c1 |= ((ppd->lid & DCC_CFG_PORT_CONFIG1_TARGET_DLID_MASK)
-                       << DCC_CFG_PORT_CONFIG1_TARGET_DLID_SHIFT)|
+                       << DCC_CFG_PORT_CONFIG1_TARGET_DLID_SHIFT) |
              ((mask & DCC_CFG_PORT_CONFIG1_DLID_MASK_MASK)
                        << DCC_CFG_PORT_CONFIG1_DLID_MASK_SHIFT);
        write_csr(ppd->dd, DCC_CFG_PORT_CONFIG1, c1);
@@ -9550,9 +9810,10 @@ static int goto_offline(struct hfi1_pportdata *ppd, u8 rem_reason)
                                ret);
                        return -EINVAL;
                }
-               if (ppd->offline_disabled_reason == OPA_LINKDOWN_REASON_NONE)
+               if (ppd->offline_disabled_reason ==
+                               HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE))
                        ppd->offline_disabled_reason =
-                       OPA_LINKDOWN_REASON_TRANSIENT;
+                       HFI1_ODR_MASK(OPA_LINKDOWN_REASON_TRANSIENT);
        }
 
        if (do_wait) {
@@ -9573,6 +9834,12 @@ static int goto_offline(struct hfi1_pportdata *ppd, u8 rem_reason)
        write_csr(dd, DC_LCB_ERR_EN, ~0ull); /* watch LCB errors */
        ppd->host_link_state = HLS_LINK_COOLDOWN; /* LCB access allowed */
 
+       if (ppd->port_type == PORT_TYPE_QSFP &&
+           ppd->qsfp_info.limiting_active &&
+           qsfp_mod_present(ppd)) {
+               set_qsfp_tx(ppd, 0);
+       }
+
        /*
         * The LNI has a mandatory wait time after the physical state
         * moves to Offline.Quiet.  The wait time may be different
@@ -9860,7 +10127,7 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
                        sdma_all_running(dd);
 
                        /* Signal the IB layer that the port has went active */
-                       event.device = &dd->verbs_dev.ibdev;
+                       event.device = &dd->verbs_dev.rdi.ibdev;
                        event.element.port_num = ppd->port;
                        event.event = IB_EVENT_PORT_ACTIVE;
                }
@@ -9887,6 +10154,7 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
                                ppd->link_enabled = 1;
                }
 
+               set_all_slowpath(ppd->dd);
                ret = set_local_link_attributes(ppd);
                if (ret)
                        break;
@@ -9906,7 +10174,8 @@ int set_link_state(struct hfi1_pportdata *ppd, u32 state)
                                ret = -EINVAL;
                        }
                }
-               ppd->offline_disabled_reason = OPA_LINKDOWN_REASON_NONE;
+               ppd->offline_disabled_reason =
+                       HFI1_ODR_MASK(OPA_LINKDOWN_REASON_NONE);
                /*
                 * If an error occurred above, go back to offline.  The
                 * caller may reschedule another attempt.
@@ -10019,7 +10288,7 @@ int hfi1_set_ib_cfg(struct hfi1_pportdata *ppd, int which, u32 val)
                 * The VL Arbitrator high limit is sent in units of 4k
                 * bytes, while HFI stores it in units of 64 bytes.
                 */
-               val *= 4096/64;
+               val *= 4096 / 64;
                reg = ((u64)val & SEND_HIGH_PRIORITY_LIMIT_LIMIT_MASK)
                        << SEND_HIGH_PRIORITY_LIMIT_LIMIT_SHIFT;
                write_csr(ppd->dd, SEND_HIGH_PRIORITY_LIMIT, reg);
@@ -10034,12 +10303,6 @@ int hfi1_set_ib_cfg(struct hfi1_pportdata *ppd, int which, u32 val)
                        ppd->vls_operational = val;
                        if (!ppd->port)
                                ret = -EINVAL;
-                       else
-                               ret = sdma_map_init(
-                                       ppd->dd,
-                                       ppd->port - 1,
-                                       val,
-                                       NULL);
                }
                break;
        /*
@@ -10242,7 +10505,7 @@ static int get_buffer_control(struct hfi1_devdata *dd,
 
        /* OPA and HFI have a 1-1 mapping */
        for (i = 0; i < TXE_NUM_DATA_VL; i++)
-               read_one_cm_vl(dd, SEND_CM_CREDIT_VL + (8*i), &bc->vl[i]);
+               read_one_cm_vl(dd, SEND_CM_CREDIT_VL + (8 * i), &bc->vl[i]);
 
        /* NOTE: assumes that VL* and VL15 CSRs are bit-wise identical */
        read_one_cm_vl(dd, SEND_CM_CREDIT_VL15, &bc->vl[15]);
@@ -10450,13 +10713,15 @@ static void wait_for_vl_status_clear(struct hfi1_devdata *dd, u64 mask,
  * raise = if the new limit is higher than the current value (may be changed
  *     earlier in the algorithm), set the new limit to the new value
  */
-static int set_buffer_control(struct hfi1_devdata *dd,
-                             struct buffer_control *new_bc)
+int set_buffer_control(struct hfi1_pportdata *ppd,
+                      struct buffer_control *new_bc)
 {
+       struct hfi1_devdata *dd = ppd->dd;
        u64 changing_mask, ld_mask, stat_mask;
        int change_count;
        int i, use_all_mask;
        int this_shared_changing;
+       int vl_count = 0, ret;
        /*
         * A0: add the variable any_shared_limit_changing below and in the
         * algorithm above.  If removing A0 support, it can be removed.
@@ -10481,7 +10746,6 @@ static int set_buffer_control(struct hfi1_devdata *dd,
 #define valid_vl(idx) ((idx) < TXE_NUM_DATA_VL || (idx) == 15)
 #define NUM_USABLE_VLS 16      /* look at VL15 and less */
 
-
        /* find the new total credits, do sanity check on unused VLs */
        for (i = 0; i < OPA_MAX_VLS; i++) {
                if (valid_vl(i)) {
@@ -10608,6 +10872,28 @@ static int set_buffer_control(struct hfi1_devdata *dd,
        /* bracket the credit change with a total adjustment */
        if (new_total < cur_total)
                set_global_limit(dd, new_total);
+
+       /*
+        * Determine the actual number of operational VLS using the number of
+        * dedicated and shared credits for each VL.
+        */
+       if (change_count > 0) {
+               for (i = 0; i < TXE_NUM_DATA_VL; i++)
+                       if (be16_to_cpu(new_bc->vl[i].dedicated) > 0 ||
+                           be16_to_cpu(new_bc->vl[i].shared) > 0)
+                               vl_count++;
+               ppd->actual_vls_operational = vl_count;
+               ret = sdma_map_init(dd, ppd->port - 1, vl_count ?
+                                   ppd->actual_vls_operational :
+                                   ppd->vls_operational,
+                                   NULL);
+               if (ret == 0)
+                       ret = pio_map_init(dd, ppd->port - 1, vl_count ?
+                                          ppd->actual_vls_operational :
+                                          ppd->vls_operational, NULL);
+               if (ret)
+                       return ret;
+       }
        return 0;
 }
 
@@ -10699,7 +10985,7 @@ int fm_set_table(struct hfi1_pportdata *ppd, int which, void *t)
                                     VL_ARB_LOW_PRIO_TABLE_SIZE, t);
                break;
        case FM_TBL_BUFFER_CONTROL:
-               ret = set_buffer_control(ppd->dd, t);
+               ret = set_buffer_control(ppd, t);
                break;
        case FM_TBL_SC2VLNT:
                set_sc2vlnt(ppd->dd, t);
@@ -10918,16 +11204,16 @@ u32 hdrqempty(struct hfi1_ctxtdata *rcd)
 static u32 encoded_size(u32 size)
 {
        switch (size) {
-       case   4*1024: return 0x1;
-       case   8*1024: return 0x2;
-       case  16*1024: return 0x3;
-       case  32*1024: return 0x4;
-       case  64*1024: return 0x5;
-       case 128*1024: return 0x6;
-       case 256*1024: return 0x7;
-       case 512*1024: return 0x8;
-       case   1*1024*1024: return 0x9;
-       case   2*1024*1024: return 0xa;
+       case   4 * 1024: return 0x1;
+       case   8 * 1024: return 0x2;
+       case  16 * 1024: return 0x3;
+       case  32 * 1024: return 0x4;
+       case  64 * 1024: return 0x5;
+       case 128 * 1024: return 0x6;
+       case 256 * 1024: return 0x7;
+       case 512 * 1024: return 0x8;
+       case   1 * 1024 * 1024: return 0x9;
+       case   2 * 1024 * 1024: return 0xa;
        }
        return 0x1;     /* if invalid, go with the minimum size */
 }
@@ -11021,6 +11307,7 @@ void hfi1_rcvctrl(struct hfi1_devdata *dd, unsigned int op, int ctxt)
                if (dd->rcvhdrtail_dummy_physaddr) {
                        write_kctxt_csr(dd, ctxt, RCV_HDR_TAIL_ADDR,
                                        dd->rcvhdrtail_dummy_physaddr);
+                       /* Enabling RcvCtxtCtrl.TailUpd is intentional. */
                        rcvctrl |= RCV_CTXT_CTRL_TAIL_UPD_SMASK;
                }
 
@@ -11032,8 +11319,11 @@ void hfi1_rcvctrl(struct hfi1_devdata *dd, unsigned int op, int ctxt)
                rcvctrl &= ~RCV_CTXT_CTRL_INTR_AVAIL_SMASK;
        if (op & HFI1_RCVCTRL_TAILUPD_ENB && rcd->rcvhdrqtailaddr_phys)
                rcvctrl |= RCV_CTXT_CTRL_TAIL_UPD_SMASK;
-       if (op & HFI1_RCVCTRL_TAILUPD_DIS)
-               rcvctrl &= ~RCV_CTXT_CTRL_TAIL_UPD_SMASK;
+       if (op & HFI1_RCVCTRL_TAILUPD_DIS) {
+               /* See comment on RcvCtxtCtrl.TailUpd above */
+               if (!(op & HFI1_RCVCTRL_CTXT_DIS))
+                       rcvctrl &= ~RCV_CTXT_CTRL_TAIL_UPD_SMASK;
+       }
        if (op & HFI1_RCVCTRL_TIDFLOW_ENB)
                rcvctrl |= RCV_CTXT_CTRL_TID_FLOW_ENABLE_SMASK;
        if (op & HFI1_RCVCTRL_TIDFLOW_DIS)
@@ -11150,6 +11440,20 @@ u32 hfi1_read_cntrs(struct hfi1_devdata *dd, loff_t pos, char **namep,
                                                dd->cntrs[entry->offset + j] =
                                                                            val;
                                        }
+                               } else if (entry->flags & CNTR_SDMA) {
+                                       hfi1_cdbg(CNTR,
+                                                 "\t Per SDMA Engine\n");
+                                       for (j = 0; j < dd->chip_sdma_engines;
+                                            j++) {
+                                               val =
+                                               entry->rw_cntr(entry, dd, j,
+                                                              CNTR_MODE_R, 0);
+                                               hfi1_cdbg(CNTR,
+                                                         "\t\tRead 0x%llx for %d\n",
+                                                         val, j);
+                                               dd->cntrs[entry->offset + j] =
+                                                                       val;
+                                       }
                                } else {
                                        val = entry->rw_cntr(entry, dd,
                                                        CNTR_INVALID_VL,
@@ -11238,14 +11542,14 @@ static void free_cntrs(struct hfi1_devdata *dd)
        for (i = 0; i < dd->num_pports; i++, ppd++) {
                kfree(ppd->cntrs);
                kfree(ppd->scntrs);
-               free_percpu(ppd->ibport_data.rc_acks);
-               free_percpu(ppd->ibport_data.rc_qacks);
-               free_percpu(ppd->ibport_data.rc_delayed_comp);
+               free_percpu(ppd->ibport_data.rvp.rc_acks);
+               free_percpu(ppd->ibport_data.rvp.rc_qacks);
+               free_percpu(ppd->ibport_data.rvp.rc_delayed_comp);
                ppd->cntrs = NULL;
                ppd->scntrs = NULL;
-               ppd->ibport_data.rc_acks = NULL;
-               ppd->ibport_data.rc_qacks = NULL;
-               ppd->ibport_data.rc_delayed_comp = NULL;
+               ppd->ibport_data.rvp.rc_acks = NULL;
+               ppd->ibport_data.rvp.rc_qacks = NULL;
+               ppd->ibport_data.rvp.rc_delayed_comp = NULL;
        }
        kfree(dd->portcntrnames);
        dd->portcntrnames = NULL;
@@ -11513,11 +11817,13 @@ mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME);
 #define C_MAX_NAME 13 /* 12 chars + one for /0 */
 static int init_cntrs(struct hfi1_devdata *dd)
 {
-       int i, rcv_ctxts, index, j;
+       int i, rcv_ctxts, j;
        size_t sz;
        char *p;
        char name[C_MAX_NAME];
        struct hfi1_pportdata *ppd;
+       const char *bit_type_32 = ",32";
+       const int bit_type_32_sz = strlen(bit_type_32);
 
        /* set up the stats timer; the add_timer is done at the end */
        setup_timer(&dd->synth_stats_timer, update_synth_timer,
@@ -11530,49 +11836,58 @@ static int init_cntrs(struct hfi1_devdata *dd)
        /* size names and determine how many we have*/
        dd->ndevcntrs = 0;
        sz = 0;
-       index = 0;
 
        for (i = 0; i < DEV_CNTR_LAST; i++) {
-               hfi1_dbg_early("Init cntr %s\n", dev_cntrs[i].name);
                if (dev_cntrs[i].flags & CNTR_DISABLED) {
                        hfi1_dbg_early("\tSkipping %s\n", dev_cntrs[i].name);
                        continue;
                }
 
                if (dev_cntrs[i].flags & CNTR_VL) {
-                       hfi1_dbg_early("\tProcessing VL cntr\n");
-                       dev_cntrs[i].offset = index;
+                       dev_cntrs[i].offset = dd->ndevcntrs;
                        for (j = 0; j < C_VL_COUNT; j++) {
-                               memset(name, '\0', C_MAX_NAME);
                                snprintf(name, C_MAX_NAME, "%s%d",
                                        dev_cntrs[i].name,
                                        vl_from_idx(j));
                                sz += strlen(name);
+                               /* Add ",32" for 32-bit counters */
+                               if (dev_cntrs[i].flags & CNTR_32BIT)
+                                       sz += bit_type_32_sz;
+                               sz++;
+                               dd->ndevcntrs++;
+                       }
+               } else if (dev_cntrs[i].flags & CNTR_SDMA) {
+                       dev_cntrs[i].offset = dd->ndevcntrs;
+                       for (j = 0; j < dd->chip_sdma_engines; j++) {
+                               snprintf(name, C_MAX_NAME, "%s%d",
+                                        dev_cntrs[i].name, j);
+                               sz += strlen(name);
+                               /* Add ",32" for 32-bit counters */
+                               if (dev_cntrs[i].flags & CNTR_32BIT)
+                                       sz += bit_type_32_sz;
                                sz++;
-                               hfi1_dbg_early("\t\t%s\n", name);
                                dd->ndevcntrs++;
-                               index++;
                        }
                } else {
-                       /* +1 for newline  */
+                       /* +1 for newline. */
                        sz += strlen(dev_cntrs[i].name) + 1;
+                       /* Add ",32" for 32-bit counters */
+                       if (dev_cntrs[i].flags & CNTR_32BIT)
+                               sz += bit_type_32_sz;
+                       dev_cntrs[i].offset = dd->ndevcntrs;
                        dd->ndevcntrs++;
-                       dev_cntrs[i].offset = index;
-                       index++;
-                       hfi1_dbg_early("\tAdding %s\n", dev_cntrs[i].name);
                }
        }
 
        /* allocate space for the counter values */
-       dd->cntrs = kcalloc(index, sizeof(u64), GFP_KERNEL);
+       dd->cntrs = kcalloc(dd->ndevcntrs, sizeof(u64), GFP_KERNEL);
        if (!dd->cntrs)
                goto bail;
 
-       dd->scntrs = kcalloc(index, sizeof(u64), GFP_KERNEL);
+       dd->scntrs = kcalloc(dd->ndevcntrs, sizeof(u64), GFP_KERNEL);
        if (!dd->scntrs)
                goto bail;
 
-
        /* allocate space for the counter names */
        dd->cntrnameslen = sz;
        dd->cntrnames = kmalloc(sz, GFP_KERNEL);
@@ -11580,27 +11895,51 @@ static int init_cntrs(struct hfi1_devdata *dd)
                goto bail;
 
        /* fill in the names */
-       for (p = dd->cntrnames, i = 0, index = 0; i < DEV_CNTR_LAST; i++) {
+       for (p = dd->cntrnames, i = 0; i < DEV_CNTR_LAST; i++) {
                if (dev_cntrs[i].flags & CNTR_DISABLED) {
                        /* Nothing */
-               } else {
-                       if (dev_cntrs[i].flags & CNTR_VL) {
-                               for (j = 0; j < C_VL_COUNT; j++) {
-                                       memset(name, '\0', C_MAX_NAME);
-                                       snprintf(name, C_MAX_NAME, "%s%d",
-                                               dev_cntrs[i].name,
-                                               vl_from_idx(j));
-                                       memcpy(p, name, strlen(name));
-                                       p += strlen(name);
-                                       *p++ = '\n';
+               } else if (dev_cntrs[i].flags & CNTR_VL) {
+                       for (j = 0; j < C_VL_COUNT; j++) {
+                               snprintf(name, C_MAX_NAME, "%s%d",
+                                        dev_cntrs[i].name,
+                                        vl_from_idx(j));
+                               memcpy(p, name, strlen(name));
+                               p += strlen(name);
+
+                               /* Counter is 32 bits */
+                               if (dev_cntrs[i].flags & CNTR_32BIT) {
+                                       memcpy(p, bit_type_32, bit_type_32_sz);
+                                       p += bit_type_32_sz;
                                }
-                       } else {
-                               memcpy(p, dev_cntrs[i].name,
-                                      strlen(dev_cntrs[i].name));
-                               p += strlen(dev_cntrs[i].name);
+
+                               *p++ = '\n';
+                       }
+               } else if (dev_cntrs[i].flags & CNTR_SDMA) {
+                       for (j = 0; j < dd->chip_sdma_engines; j++) {
+                               snprintf(name, C_MAX_NAME, "%s%d",
+                                        dev_cntrs[i].name, j);
+                               memcpy(p, name, strlen(name));
+                               p += strlen(name);
+
+                               /* Counter is 32 bits */
+                               if (dev_cntrs[i].flags & CNTR_32BIT) {
+                                       memcpy(p, bit_type_32, bit_type_32_sz);
+                                       p += bit_type_32_sz;
+                               }
+
                                *p++ = '\n';
                        }
-                       index++;
+               } else {
+                       memcpy(p, dev_cntrs[i].name, strlen(dev_cntrs[i].name));
+                       p += strlen(dev_cntrs[i].name);
+
+                       /* Counter is 32 bits */
+                       if (dev_cntrs[i].flags & CNTR_32BIT) {
+                               memcpy(p, bit_type_32, bit_type_32_sz);
+                               p += bit_type_32_sz;
+                       }
+
+                       *p++ = '\n';
                }
        }
 
@@ -11623,31 +11962,32 @@ static int init_cntrs(struct hfi1_devdata *dd)
        sz = 0;
        dd->nportcntrs = 0;
        for (i = 0; i < PORT_CNTR_LAST; i++) {
-               hfi1_dbg_early("Init pcntr %s\n", port_cntrs[i].name);
                if (port_cntrs[i].flags & CNTR_DISABLED) {
                        hfi1_dbg_early("\tSkipping %s\n", port_cntrs[i].name);
                        continue;
                }
 
                if (port_cntrs[i].flags & CNTR_VL) {
-                       hfi1_dbg_early("\tProcessing VL cntr\n");
                        port_cntrs[i].offset = dd->nportcntrs;
                        for (j = 0; j < C_VL_COUNT; j++) {
-                               memset(name, '\0', C_MAX_NAME);
                                snprintf(name, C_MAX_NAME, "%s%d",
                                        port_cntrs[i].name,
                                        vl_from_idx(j));
                                sz += strlen(name);
+                               /* Add ",32" for 32-bit counters */
+                               if (port_cntrs[i].flags & CNTR_32BIT)
+                                       sz += bit_type_32_sz;
                                sz++;
-                               hfi1_dbg_early("\t\t%s\n", name);
                                dd->nportcntrs++;
                        }
                } else {
-                       /* +1 for newline  */
+                       /* +1 for newline */
                        sz += strlen(port_cntrs[i].name) + 1;
+                       /* Add ",32" for 32-bit counters */
+                       if (port_cntrs[i].flags & CNTR_32BIT)
+                               sz += bit_type_32_sz;
                        port_cntrs[i].offset = dd->nportcntrs;
                        dd->nportcntrs++;
-                       hfi1_dbg_early("\tAdding %s\n", port_cntrs[i].name);
                }
        }
 
@@ -11664,18 +12004,31 @@ static int init_cntrs(struct hfi1_devdata *dd)
 
                if (port_cntrs[i].flags & CNTR_VL) {
                        for (j = 0; j < C_VL_COUNT; j++) {
-                               memset(name, '\0', C_MAX_NAME);
                                snprintf(name, C_MAX_NAME, "%s%d",
                                        port_cntrs[i].name,
                                        vl_from_idx(j));
                                memcpy(p, name, strlen(name));
                                p += strlen(name);
+
+                               /* Counter is 32 bits */
+                               if (port_cntrs[i].flags & CNTR_32BIT) {
+                                       memcpy(p, bit_type_32, bit_type_32_sz);
+                                       p += bit_type_32_sz;
+                               }
+
                                *p++ = '\n';
                        }
                } else {
                        memcpy(p, port_cntrs[i].name,
                               strlen(port_cntrs[i].name));
                        p += strlen(port_cntrs[i].name);
+
+                       /* Counter is 32 bits */
+                       if (port_cntrs[i].flags & CNTR_32BIT) {
+                               memcpy(p, bit_type_32, bit_type_32_sz);
+                               p += bit_type_32_sz;
+                       }
+
                        *p++ = '\n';
                }
        }
@@ -11703,7 +12056,6 @@ bail:
        return -ENOMEM;
 }
 
-
 static u32 chip_to_opa_lstate(struct hfi1_devdata *dd, u32 chip_lstate)
 {
        switch (chip_lstate) {
@@ -11854,18 +12206,17 @@ static int wait_logical_linkstate(struct hfi1_pportdata *ppd, u32 state,
 
 u8 hfi1_ibphys_portstate(struct hfi1_pportdata *ppd)
 {
-       static u32 remembered_state = 0xff;
        u32 pstate;
        u32 ib_pstate;
 
        pstate = read_physical_state(ppd->dd);
        ib_pstate = chip_to_opa_pstate(ppd->dd, pstate);
-       if (remembered_state != ib_pstate) {
+       if (ppd->last_pstate != ib_pstate) {
                dd_dev_info(ppd->dd,
                        "%s: physical state changed to %s (0x%x), phy 0x%x\n",
                        __func__, opa_pstate_name(ib_pstate), ib_pstate,
                        pstate);
-               remembered_state = ib_pstate;
+               ppd->last_pstate = ib_pstate;
        }
        return ib_pstate;
 }
@@ -11966,34 +12317,14 @@ void set_intr_state(struct hfi1_devdata *dd, u32 enable)
         * In HFI, the mask needs to be 1 to allow interrupts.
         */
        if (enable) {
-               u64 cce_int_mask;
-               const int qsfp1_int_smask = QSFP1_INT % 64;
-               const int qsfp2_int_smask = QSFP2_INT % 64;
-
                /* enable all interrupts */
                for (i = 0; i < CCE_NUM_INT_CSRS; i++)
-                       write_csr(dd, CCE_INT_MASK + (8*i), ~(u64)0);
+                       write_csr(dd, CCE_INT_MASK + (8 * i), ~(u64)0);
 
-               /*
-                * disable QSFP1 interrupts for HFI1, QSFP2 interrupts for HFI0
-                * Qsfp1Int and Qsfp2Int are adjacent bits in the same CSR,
-                * therefore just one of QSFP1_INT/QSFP2_INT can be used to find
-                * the index of the appropriate CSR in the CCEIntMask CSR array
-                */
-               cce_int_mask = read_csr(dd, CCE_INT_MASK +
-                                               (8*(QSFP1_INT/64)));
-               if (dd->hfi1_id) {
-                       cce_int_mask &= ~((u64)1 << qsfp1_int_smask);
-                       write_csr(dd, CCE_INT_MASK + (8*(QSFP1_INT/64)),
-                                       cce_int_mask);
-               } else {
-                       cce_int_mask &= ~((u64)1 << qsfp2_int_smask);
-                       write_csr(dd, CCE_INT_MASK + (8*(QSFP2_INT/64)),
-                                       cce_int_mask);
-               }
+               init_qsfp_int(dd);
        } else {
                for (i = 0; i < CCE_NUM_INT_CSRS; i++)
-                       write_csr(dd, CCE_INT_MASK + (8*i), 0ull);
+                       write_csr(dd, CCE_INT_MASK + (8 * i), 0ull);
        }
 }
 
@@ -12005,7 +12336,7 @@ static void clear_all_interrupts(struct hfi1_devdata *dd)
        int i;
 
        for (i = 0; i < CCE_NUM_INT_CSRS; i++)
-               write_csr(dd, CCE_INT_CLEAR + (8*i), ~(u64)0);
+               write_csr(dd, CCE_INT_CLEAR + (8 * i), ~(u64)0);
 
        write_csr(dd, CCE_ERR_CLEAR, ~(u64)0);
        write_csr(dd, MISC_ERR_CLEAR, ~(u64)0);
@@ -12041,9 +12372,8 @@ static void clean_up_interrupts(struct hfi1_devdata *dd)
 
                for (i = 0; i < dd->num_msix_entries; i++, me++) {
                        if (me->arg == NULL) /* => no irq, no affinity */
-                               break;
-                       irq_set_affinity_hint(dd->msix_entries[i].msix.vector,
-                                       NULL);
+                               continue;
+                       hfi1_put_irq_affinity(dd, &dd->msix_entries[i]);
                        free_irq(me->msix.vector, me->arg);
                }
        } else {
@@ -12064,8 +12394,6 @@ static void clean_up_interrupts(struct hfi1_devdata *dd)
        }
 
        /* clean structures */
-       for (i = 0; i < dd->num_msix_entries; i++)
-               free_cpumask_var(dd->msix_entries[i].mask);
        kfree(dd->msix_entries);
        dd->msix_entries = NULL;
        dd->num_msix_entries = 0;
@@ -12088,10 +12416,10 @@ static void remap_intr(struct hfi1_devdata *dd, int isrc, int msix_intr)
        /* direct the chip source to the given MSI-X interrupt */
        m = isrc / 8;
        n = isrc % 8;
-       reg = read_csr(dd, CCE_INT_MAP + (8*m));
-       reg &= ~((u64)0xff << (8*n));
-       reg |= ((u64)msix_intr & 0xff) << (8*n);
-       write_csr(dd, CCE_INT_MAP + (8*m), reg);
+       reg = read_csr(dd, CCE_INT_MAP + (8 * m));
+       reg &= ~((u64)0xff << (8 * n));
+       reg |= ((u64)msix_intr & 0xff) << (8 * n);
+       write_csr(dd, CCE_INT_MAP + (8 * m), reg);
 }
 
 static void remap_sdma_interrupts(struct hfi1_devdata *dd,
@@ -12104,11 +12432,11 @@ static void remap_sdma_interrupts(struct hfi1_devdata *dd,
         *      SDMAProgress
         *      SDMAIdle
         */
-       remap_intr(dd, IS_SDMA_START + 0*TXE_NUM_SDMA_ENGINES + engine,
+       remap_intr(dd, IS_SDMA_START + 0 * TXE_NUM_SDMA_ENGINES + engine,
                msix_intr);
-       remap_intr(dd, IS_SDMA_START + 1*TXE_NUM_SDMA_ENGINES + engine,
+       remap_intr(dd, IS_SDMA_START + 1 * TXE_NUM_SDMA_ENGINES + engine,
                msix_intr);
-       remap_intr(dd, IS_SDMA_START + 2*TXE_NUM_SDMA_ENGINES + engine,
+       remap_intr(dd, IS_SDMA_START + 2 * TXE_NUM_SDMA_ENGINES + engine,
                msix_intr);
 }
 
@@ -12130,16 +12458,10 @@ static int request_intx_irq(struct hfi1_devdata *dd)
 
 static int request_msix_irqs(struct hfi1_devdata *dd)
 {
-       const struct cpumask *local_mask;
-       cpumask_var_t def, rcv;
-       bool def_ret, rcv_ret;
        int first_general, last_general;
        int first_sdma, last_sdma;
        int first_rx, last_rx;
-       int first_cpu, curr_cpu;
-       int rcv_cpu, sdma_cpu;
-       int i, ret = 0, possible;
-       int ht;
+       int i, ret = 0;
 
        /* calculate the ranges we are going to use */
        first_general = 0;
@@ -12147,52 +12469,6 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
        first_rx = last_sdma = first_sdma + dd->num_sdma;
        last_rx = first_rx + dd->n_krcv_queues;
 
-       /*
-        * Interrupt affinity.
-        *
-        * non-rcv avail gets a default mask that
-        * starts as possible cpus with threads reset
-        * and each rcv avail reset.
-        *
-        * rcv avail gets node relative 1 wrapping back
-        * to the node relative 1 as necessary.
-        *
-        */
-       local_mask = cpumask_of_pcibus(dd->pcidev->bus);
-       /* if first cpu is invalid, use NUMA 0 */
-       if (cpumask_first(local_mask) >= nr_cpu_ids)
-               local_mask = topology_core_cpumask(0);
-
-       def_ret = zalloc_cpumask_var(&def, GFP_KERNEL);
-       rcv_ret = zalloc_cpumask_var(&rcv, GFP_KERNEL);
-       if (!def_ret || !rcv_ret)
-               goto bail;
-       /* use local mask as default */
-       cpumask_copy(def, local_mask);
-       possible = cpumask_weight(def);
-       /* disarm threads from default */
-       ht = cpumask_weight(
-                       topology_sibling_cpumask(cpumask_first(local_mask)));
-       for (i = possible/ht; i < possible; i++)
-               cpumask_clear_cpu(i, def);
-       /* def now has full cores on chosen node*/
-       first_cpu = cpumask_first(def);
-       if (nr_cpu_ids >= first_cpu)
-               first_cpu++;
-       curr_cpu = first_cpu;
-
-       /*  One context is reserved as control context */
-       for (i = first_cpu; i < dd->n_krcv_queues + first_cpu - 1; i++) {
-               cpumask_clear_cpu(curr_cpu, def);
-               cpumask_set_cpu(curr_cpu, rcv);
-               curr_cpu = cpumask_next(curr_cpu, def);
-               if (curr_cpu >= nr_cpu_ids)
-                       break;
-       }
-       /* def mask has non-rcv, rcv has recv mask */
-       rcv_cpu = cpumask_first(rcv);
-       sdma_cpu = cpumask_first(def);
-
        /*
         * Sanity check - the code expects all SDMA chip source
         * interrupts to be in the same CSR, starting at bit 0.  Verify
@@ -12218,6 +12494,7 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
                        snprintf(me->name, sizeof(me->name),
                                 DRIVER_NAME "_%d", dd->unit);
                        err_info = "general";
+                       me->type = IRQ_GENERAL;
                } else if (first_sdma <= i && i < last_sdma) {
                        idx = i - first_sdma;
                        sde = &dd->per_sdma[idx];
@@ -12227,6 +12504,7 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
                                 DRIVER_NAME "_%d sdma%d", dd->unit, idx);
                        err_info = "sdma";
                        remap_sdma_interrupts(dd, idx, i);
+                       me->type = IRQ_SDMA;
                } else if (first_rx <= i && i < last_rx) {
                        idx = i - first_rx;
                        rcd = dd->rcd[idx];
@@ -12237,9 +12515,9 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
                         * Set the interrupt register and mask for this
                         * context's interrupt.
                         */
-                       rcd->ireg = (IS_RCVAVAIL_START+idx) / 64;
+                       rcd->ireg = (IS_RCVAVAIL_START + idx) / 64;
                        rcd->imask = ((u64)1) <<
-                                       ((IS_RCVAVAIL_START+idx) % 64);
+                                       ((IS_RCVAVAIL_START + idx) % 64);
                        handler = receive_context_interrupt;
                        thread = receive_context_thread;
                        arg = rcd;
@@ -12247,6 +12525,7 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
                                 DRIVER_NAME "_%d kctxt%d", dd->unit, idx);
                        err_info = "receive context";
                        remap_intr(dd, IS_RCVAVAIL_START + idx, i);
+                       me->type = IRQ_RCVCTXT;
                } else {
                        /* not in our expected range - complain, then
                           ignore it */
@@ -12258,7 +12537,7 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
                if (arg == NULL)
                        continue;
                /* make sure the name is terminated */
-               me->name[sizeof(me->name)-1] = 0;
+               me->name[sizeof(me->name) - 1] = 0;
 
                ret = request_threaded_irq(me->msix.vector, handler, thread, 0,
                                                me->name, arg);
@@ -12274,52 +12553,13 @@ static int request_msix_irqs(struct hfi1_devdata *dd)
                 */
                me->arg = arg;
 
-               if (!zalloc_cpumask_var(
-                       &dd->msix_entries[i].mask,
-                       GFP_KERNEL))
-                       goto bail;
-               if (handler == sdma_interrupt) {
-                       dd_dev_info(dd, "sdma engine %d cpu %d\n",
-                               sde->this_idx, sdma_cpu);
-                       sde->cpu = sdma_cpu;
-                       cpumask_set_cpu(sdma_cpu, dd->msix_entries[i].mask);
-                       sdma_cpu = cpumask_next(sdma_cpu, def);
-                       if (sdma_cpu >= nr_cpu_ids)
-                               sdma_cpu = cpumask_first(def);
-               } else if (handler == receive_context_interrupt) {
-                       dd_dev_info(dd, "rcv ctxt %d cpu %d\n", rcd->ctxt,
-                                   (rcd->ctxt == HFI1_CTRL_CTXT) ?
-                                           cpumask_first(def) : rcv_cpu);
-                       if (rcd->ctxt == HFI1_CTRL_CTXT) {
-                               /* map to first default */
-                               cpumask_set_cpu(cpumask_first(def),
-                                               dd->msix_entries[i].mask);
-                       } else {
-                               cpumask_set_cpu(rcv_cpu,
-                                               dd->msix_entries[i].mask);
-                               rcv_cpu = cpumask_next(rcv_cpu, rcv);
-                               if (rcv_cpu >= nr_cpu_ids)
-                                       rcv_cpu = cpumask_first(rcv);
-                       }
-               } else {
-                       /* otherwise first def */
-                       dd_dev_info(dd, "%s cpu %d\n",
-                               err_info, cpumask_first(def));
-                       cpumask_set_cpu(
-                               cpumask_first(def), dd->msix_entries[i].mask);
-               }
-               irq_set_affinity_hint(
-                       dd->msix_entries[i].msix.vector,
-                       dd->msix_entries[i].mask);
+               ret = hfi1_get_irq_affinity(dd, me);
+               if (ret)
+                       dd_dev_err(dd,
+                                  "unable to pin IRQ %d\n", ret);
        }
 
-out:
-       free_cpumask_var(def);
-       free_cpumask_var(rcv);
        return ret;
-bail:
-       ret = -ENOMEM;
-       goto  out;
 }
 
 /*
@@ -12336,7 +12576,7 @@ static void reset_interrupts(struct hfi1_devdata *dd)
 
        /* all chip interrupts map to MSI-X 0 */
        for (i = 0; i < CCE_NUM_INT_MAP_CSRS; i++)
-               write_csr(dd, CCE_INT_MAP + (8*i), 0);
+               write_csr(dd, CCE_INT_MAP + (8 * i), 0);
 }
 
 static int set_up_interrupts(struct hfi1_devdata *dd)
@@ -12445,7 +12685,7 @@ static int set_up_context_variables(struct hfi1_devdata *dd)
                 */
                num_kernel_contexts = n_krcvqs + MIN_KERNEL_KCTXTS - 1;
        else
-               num_kernel_contexts = num_online_nodes();
+               num_kernel_contexts = num_online_nodes() + 1;
        num_kernel_contexts =
                max_t(int, MIN_KERNEL_KCTXTS, num_kernel_contexts);
        /*
@@ -12486,6 +12726,7 @@ static int set_up_context_variables(struct hfi1_devdata *dd)
        dd->num_rcv_contexts = total_contexts;
        dd->n_krcv_queues = num_kernel_contexts;
        dd->first_user_ctxt = num_kernel_contexts;
+       dd->num_user_contexts = num_user_contexts;
        dd->freectxts = num_user_contexts;
        dd_dev_info(dd,
                "rcv contexts: chip %d, used %d (kernel %d, user %d)\n",
@@ -12585,7 +12826,7 @@ static void write_uninitialized_csrs_and_memories(struct hfi1_devdata *dd)
 
        /* CceIntMap */
        for (i = 0; i < CCE_NUM_INT_MAP_CSRS; i++)
-               write_csr(dd, CCE_INT_MAP+(8*i), 0);
+               write_csr(dd, CCE_INT_MAP + (8 * i), 0);
 
        /* SendCtxtCreditReturnAddr */
        for (i = 0; i < dd->chip_send_contexts; i++)
@@ -12603,12 +12844,12 @@ static void write_uninitialized_csrs_and_memories(struct hfi1_devdata *dd)
                write_kctxt_csr(dd, i, RCV_HDR_ADDR, 0);
                write_kctxt_csr(dd, i, RCV_HDR_TAIL_ADDR, 0);
                for (j = 0; j < RXE_NUM_TID_FLOWS; j++)
-                       write_uctxt_csr(dd, i, RCV_TID_FLOW_TABLE+(8*j), 0);
+                       write_uctxt_csr(dd, i, RCV_TID_FLOW_TABLE + (8 * j), 0);
        }
 
        /* RcvArray */
        for (i = 0; i < dd->chip_rcv_array_count; i++)
-               write_csr(dd, RCV_ARRAY + (8*i),
+               write_csr(dd, RCV_ARRAY + (8 * i),
                                        RCV_ARRAY_RT_WRITE_ENABLE_SMASK);
 
        /* RcvQPMapTable */
@@ -12846,15 +13087,15 @@ static void reset_txe_csrs(struct hfi1_devdata *dd)
        write_csr(dd, SEND_ERR_CLEAR, ~0ull);
        /* SEND_ERR_FORCE read-only */
        for (i = 0; i < VL_ARB_LOW_PRIO_TABLE_SIZE; i++)
-               write_csr(dd, SEND_LOW_PRIORITY_LIST + (8*i), 0);
+               write_csr(dd, SEND_LOW_PRIORITY_LIST + (8 * i), 0);
        for (i = 0; i < VL_ARB_HIGH_PRIO_TABLE_SIZE; i++)
-               write_csr(dd, SEND_HIGH_PRIORITY_LIST + (8*i), 0);
-       for (i = 0; i < dd->chip_send_contexts/NUM_CONTEXTS_PER_SET; i++)
-               write_csr(dd, SEND_CONTEXT_SET_CTRL + (8*i), 0);
+               write_csr(dd, SEND_HIGH_PRIORITY_LIST + (8 * i), 0);
+       for (i = 0; i < dd->chip_send_contexts / NUM_CONTEXTS_PER_SET; i++)
+               write_csr(dd, SEND_CONTEXT_SET_CTRL + (8 * i), 0);
        for (i = 0; i < TXE_NUM_32_BIT_COUNTER; i++)
-               write_csr(dd, SEND_COUNTER_ARRAY32 + (8*i), 0);
+               write_csr(dd, SEND_COUNTER_ARRAY32 + (8 * i), 0);
        for (i = 0; i < TXE_NUM_64_BIT_COUNTER; i++)
-               write_csr(dd, SEND_COUNTER_ARRAY64 + (8*i), 0);
+               write_csr(dd, SEND_COUNTER_ARRAY64 + (8 * i), 0);
        write_csr(dd, SEND_CM_CTRL, SEND_CM_CTRL_RESETCSR);
        write_csr(dd, SEND_CM_GLOBAL_CREDIT,
                                        SEND_CM_GLOBAL_CREDIT_RESETCSR);
@@ -12865,7 +13106,7 @@ static void reset_txe_csrs(struct hfi1_devdata *dd)
        write_csr(dd, SEND_CM_REMOTE_AU_TABLE0_TO3, 0);
        write_csr(dd, SEND_CM_REMOTE_AU_TABLE4_TO7, 0);
        for (i = 0; i < TXE_NUM_DATA_VL; i++)
-               write_csr(dd, SEND_CM_CREDIT_VL + (8*i), 0);
+               write_csr(dd, SEND_CM_CREDIT_VL + (8 * i), 0);
        write_csr(dd, SEND_CM_CREDIT_VL15, 0);
        /* SEND_CM_CREDIT_USED_VL read-only */
        /* SEND_CM_CREDIT_USED_VL15 read-only */
@@ -13157,7 +13398,7 @@ static void init_chip(struct hfi1_devdata *dd)
                write_csr(dd, RCV_CTXT_CTRL, 0);
        /* mask all interrupt sources */
        for (i = 0; i < CCE_NUM_INT_CSRS; i++)
-               write_csr(dd, CCE_INT_MASK + (8*i), 0ull);
+               write_csr(dd, CCE_INT_MASK + (8 * i), 0ull);
 
        /*
         * DC Reset: do a full DC reset before the register clear.
@@ -13166,7 +13407,7 @@ static void init_chip(struct hfi1_devdata *dd)
         * across the clear.
         */
        write_csr(dd, CCE_DC_CTRL, CCE_DC_CTRL_DC_RESET_SMASK);
-       (void) read_csr(dd, CCE_DC_CTRL);
+       (void)read_csr(dd, CCE_DC_CTRL);
 
        if (use_flr) {
                /*
@@ -13201,8 +13442,8 @@ static void init_chip(struct hfi1_devdata *dd)
        write_csr(dd, CCE_DC_CTRL, 0);
 
        /* Set the LED off */
-       if (is_ax(dd))
-               setextled(dd, 0);
+       setextled(dd, 0);
+
        /*
         * Clear the QSFP reset.
         * An FLR enforces a 0 on all out pins. The driver does not touch
@@ -13537,7 +13778,6 @@ int hfi1_set_ctxt_jkey(struct hfi1_devdata *dd, unsigned ctxt, u16 jkey)
        write_kctxt_csr(dd, sctxt, SEND_CTXT_CHECK_JOB_KEY, reg);
        /*
         * Enable send-side J_KEY integrity check, unless this is A0 h/w
-        * (due to A0 erratum).
         */
        if (!is_ax(dd)) {
                reg = read_kctxt_csr(dd, sctxt, SEND_CTXT_CHECK_ENABLE);
@@ -13643,6 +13883,7 @@ done:
  */
 void hfi1_start_cleanup(struct hfi1_devdata *dd)
 {
+       aspm_exit(dd);
        free_cntrs(dd);
        free_rcverr(dd);
        clean_up_interrupts(dd);
@@ -13698,7 +13939,7 @@ static int obtain_boardname(struct hfi1_devdata *dd)
        ret = read_hfi1_efi_var(dd, "description", &size,
                                (void **)&dd->boardname);
        if (ret) {
-               dd_dev_err(dd, "Board description not found\n");
+               dd_dev_info(dd, "Board description not found\n");
                /* use generic description */
                dd->boardname = kstrdup(generic, GFP_KERNEL);
                if (!dd->boardname)
@@ -13763,6 +14004,7 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
                }
                ppd->vls_supported = num_vls;
                ppd->vls_operational = ppd->vls_supported;
+               ppd->actual_vls_operational = ppd->vls_supported;
                /* Set the default MTU. */
                for (vl = 0; vl < num_vls; vl++)
                        dd->vld[vl].mtu = hfi1_max_mtu;
@@ -13782,6 +14024,7 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
                /* start in offline */
                ppd->host_link_state = HLS_DN_OFFLINE;
                init_vl_arb_caches(ppd);
+               ppd->last_pstate = 0xff; /* invalid value */
        }
 
        dd->link_default = HLS_DN_POLL;
@@ -13846,6 +14089,7 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
                           num_vls, dd->chip_sdma_engines);
                num_vls = dd->chip_sdma_engines;
                ppd->vls_supported = dd->chip_sdma_engines;
+               ppd->vls_operational = ppd->vls_supported;
        }
 
        /*
@@ -13878,6 +14122,9 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
        if (ret)
                goto bail_cleanup;
 
+       /* Needs to be called before hfi1_firmware_init */
+       get_platform_config(dd);
+
        /* read in firmware */
        ret = hfi1_firmware_init(dd);
        if (ret)
@@ -13929,6 +14176,10 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
        /* set up KDETH QP prefix in both RX and TX CSRs */
        init_kdeth_qp(dd);
 
+       ret = hfi1_dev_affinity_init(dd);
+       if (ret)
+               goto bail_cleanup;
+
        /* send contexts must be set up before receive contexts */
        ret = init_send_contexts(dd);
        if (ret)
@@ -14026,7 +14277,6 @@ static u16 delay_cycles(struct hfi1_pportdata *ppd, u32 desired_egress_rate,
        return (u16)delta_cycles;
 }
 
-
 /**
  * create_pbc - build a pbc for transmission
  * @flags: special case flags or-ed in built pbc
@@ -14148,7 +14398,7 @@ static void handle_temp_err(struct hfi1_devdata *dd)
        dd_dev_emerg(dd,
                     "Critical temperature reached! Forcing device into freeze mode!\n");
        dd->flags |= HFI1_FORCED_FREEZE;
-       start_freeze_handling(ppd, FREEZE_SELF|FREEZE_ABORT);
+       start_freeze_handling(ppd, FREEZE_SELF | FREEZE_ABORT);
        /*
         * Shut DC down as much and as quickly as possible.
         *
This page took 0.0559 seconds and 5 git commands to generate.