}
        if (op & HFI1_RCVCTRL_CTXT_DIS) {
                write_csr(dd, RCV_VL15, 0);
+               /*
+                * When receive context is being disabled turn on tail
+                * update with a dummy tail address and then disable
+                * receive context.
+                */
+               if (dd->rcvhdrtail_dummy_physaddr) {
+                       write_kctxt_csr(dd, ctxt, RCV_HDR_TAIL_ADDR,
+                                       dd->rcvhdrtail_dummy_physaddr);
+                       rcvctrl |= RCV_CTXT_CTRL_TAIL_UPD_SMASK;
+               }
+
                rcvctrl &= ~RCV_CTXT_CTRL_ENABLE_SMASK;
        }
        if (op & HFI1_RCVCTRL_INTRAVAIL_ENB)
        if (op & (HFI1_RCVCTRL_TAILUPD_DIS | HFI1_RCVCTRL_CTXT_DIS))
                /*
                 * If the context has been disabled and the Tail Update has
-                * been cleared, clear the RCV_HDR_TAIL_ADDR CSR so
-                * it doesn't contain an address that is invalid.
+                * been cleared, set the RCV_HDR_TAIL_ADDR CSR to dummy address
+                * so it doesn't contain an address that is invalid.
                 */
-               write_kctxt_csr(dd, ctxt, RCV_HDR_TAIL_ADDR, 0);
+               write_kctxt_csr(dd, ctxt, RCV_HDR_TAIL_ADDR,
+                               dd->rcvhdrtail_dummy_physaddr);
 }
 
 u32 hfi1_read_cntrs(struct hfi1_devdata *dd, loff_t pos, char **namep,
 
        /* Save the enabled LCB error bits */
        u64 lcb_err_en;
        u8 dc_shutdown;
+
+       /* receive context tail dummy address */
+       __le64 *rcvhdrtail_dummy_kvaddr;
+       dma_addr_t rcvhdrtail_dummy_physaddr;
 };
 
 /* 8051 firmware version helper */
 
        if (ret)
                goto done;
 
+       /* allocate dummy tail memory for all receive contexts */
+       dd->rcvhdrtail_dummy_kvaddr = dma_zalloc_coherent(
+               &dd->pcidev->dev, sizeof(u64),
+               &dd->rcvhdrtail_dummy_physaddr,
+               GFP_KERNEL);
+
+       if (!dd->rcvhdrtail_dummy_kvaddr) {
+               dd_dev_err(dd, "cannot allocate dummy tail memory\n");
+               ret = -ENOMEM;
+               goto done;
+       }
+
        /* dd->rcd can be NULL if early initialization failed */
        for (i = 0; dd->rcd && i < dd->first_user_ctxt; ++i) {
                /*
        tmp = dd->rcd;
        dd->rcd = NULL;
        spin_unlock_irqrestore(&dd->uctxt_lock, flags);
+
+       if (dd->rcvhdrtail_dummy_kvaddr) {
+               dma_free_coherent(&dd->pcidev->dev, sizeof(u64),
+                                 (void *)dd->rcvhdrtail_dummy_kvaddr,
+                                 dd->rcvhdrtail_dummy_physaddr);
+                                 dd->rcvhdrtail_dummy_kvaddr = NULL;
+       }
+
        for (ctxt = 0; tmp && ctxt < dd->num_rcv_contexts; ctxt++) {
                struct hfi1_ctxtdata *rcd = tmp[ctxt];
 
        reg = (dd->rcvhdrsize & RCV_HDR_SIZE_HDR_SIZE_MASK)
                << RCV_HDR_SIZE_HDR_SIZE_SHIFT;
        write_kctxt_csr(dd, rcd->ctxt, RCV_HDR_SIZE, reg);
+
+       /*
+        * Program dummy tail address for every receive context
+        * before enabling any receive context
+        */
+       write_kctxt_csr(dd, rcd->ctxt, RCV_HDR_TAIL_ADDR,
+                       dd->rcvhdrtail_dummy_physaddr);
+
        return 0;
 
 bail_free: