unsigned ngroups;
 
        /*
-        * Kernel contexts: (to be fixed later):
-        * - min or 2 or 1 context/numa
+        * Kernel receive contexts:
+        * - min of 2 or 1 context/numa (excluding control context)
         * - Context 0 - control context (VL15/multicast/error)
-        * - Context 1 - default context
+        * - Context 1 - first kernel context
+        * - Context 2 - second kernel context
+        * ...
         */
        if (n_krcvqs)
                /*
-                * Don't count context 0 in n_krcvqs since
-                * is isn't used for normal verbs traffic.
-                *
-                * krcvqs will reflect number of kernel
-                * receive contexts above 0.
+                * n_krcvqs is the sum of module parameter kernel receive
+                * contexts, krcvqs[].  It does not include the control
+                * context, so add that.
                 */
-               num_kernel_contexts = n_krcvqs + MIN_KERNEL_KCTXTS - 1;
+               num_kernel_contexts = n_krcvqs + 1;
        else
                num_kernel_contexts = num_online_nodes() + 1;
        num_kernel_contexts =
 /**
  * init_qos - init RX qos
  * @dd - device data
- * @first_context
- *
- * This routine initializes Rule 0 and the
- * RSM map table to implement qos.
  *
- * If all of the limit tests succeed,
- * qos is applied based on the array
- * interpretation of krcvqs where
- * entry 0 is VL0.
+ * This routine initializes Rule 0 and the RSM map table to implement
+ * quality of service (qos).
  *
- * The number of vl bits (n) and the number of qpn
- * bits (m) are computed to feed both the RSM map table
- * and the single rule.
+ * If all of the limit tests succeed, qos is applied based on the array
+ * interpretation of krcvqs where entry 0 is VL0.
  *
+ * The number of vl bits (n) and the number of qpn bits (m) are computed to
+ * feed both the RSM map table and the single rule.
  */
-static void init_qos(struct hfi1_devdata *dd, u32 first_ctxt)
+static void init_qos(struct hfi1_devdata *dd)
 {
        u8 max_by_vl = 0;
        unsigned qpns_per_vl, ctxt, i, qpn, n = 1, m;
                goto bail;
        memset(rsmmap, rxcontext, NUM_MAP_REGS * sizeof(u64));
        /* init the local copy of the table */
-       for (i = 0, ctxt = first_ctxt; i < num_vls; i++) {
+       for (i = 0, ctxt = FIRST_KERNEL_KCTXT; i < num_vls; i++) {
                unsigned tctxt;
 
                for (qpn = 0, tctxt = ctxt;
        /* add rule0 */
        write_csr(dd, RCV_RSM_CFG /* + (8 * 0) */,
                  RCV_RSM_CFG_ENABLE_OR_CHAIN_RSM0_MASK <<
-                 RCV_RSM_CFG_ENABLE_OR_CHAIN_RSM0_SHIFT |
+                       RCV_RSM_CFG_ENABLE_OR_CHAIN_RSM0_SHIFT |
                  2ull << RCV_RSM_CFG_PACKET_TYPE_SHIFT);
        write_csr(dd, RCV_RSM_SELECT /* + (8 * 0) */,
                  LRH_BTH_MATCH_OFFSET << RCV_RSM_SELECT_FIELD1_OFFSET_SHIFT |
        /* Enable RSM */
        add_rcvctrl(dd, RCV_CTRL_RCV_RSM_ENABLE_SMASK);
        kfree(rsmmap);
-       /* map everything else to first context */
-       init_qpmap_table(dd, FIRST_KERNEL_KCTXT, MIN_KERNEL_KCTXTS - 1);
+       /* map everything else to the mcast/err/vl15 context */
+       init_qpmap_table(dd, HFI1_CTRL_CTXT, HFI1_CTRL_CTXT);
        dd->qos_shift = n + 1;
        return;
 bail:
        /* enable all receive errors */
        write_csr(dd, RCV_ERR_MASK, ~0ull);
        /* setup QPN map table - start where VL15 context leaves off */
-       init_qos(dd, dd->n_krcv_queues > MIN_KERNEL_KCTXTS ?
-                MIN_KERNEL_KCTXTS : 0);
+       init_qos(dd);
        /*
         * make sure RcvCtrl.RcvWcb <= PCIe Device Control
         * Register Max_Payload_Size (PCI_EXP_DEVCTL in Linux PCIe config