mdata->rsize = packet->rsize;
        mdata->maxcnt = packet->maxcnt;
 
-       if (rcd->ps_state.initialized == 0) {
-               mdata->ps_head = packet->rhqoff;
-               rcd->ps_state.initialized++;
-       } else
-               mdata->ps_head = rcd->ps_state.ps_head;
+       mdata->ps_head = packet->rhqoff;
 
        if (HFI1_CAP_IS_KSET(DMA_RTAIL)) {
-               mdata->ps_tail = packet->hdrqtail;
+               mdata->ps_tail = get_rcvhdrtail(rcd);
                mdata->ps_seq = 0; /* not used with DMA_RTAIL */
        } else {
                mdata->ps_tail = 0; /* used only with DMA_RTAIL*/
 
 static inline void update_ps_mdata(struct ps_mdata *mdata)
 {
-       struct hfi1_ctxtdata *rcd = mdata->rcd;
-
        mdata->ps_head += mdata->rsize;
-       if (mdata->ps_head > mdata->maxcnt)
+       if (mdata->ps_head >= mdata->maxcnt)
                mdata->ps_head = 0;
-       rcd->ps_state.ps_head = mdata->ps_head;
        if (!HFI1_CAP_IS_KSET(DMA_RTAIL)) {
                if (++mdata->ps_seq > 13)
                        mdata->ps_seq = 1;
 
 struct hfi1_opcode_stats_perctx;
 #endif
 
-/*
- * struct ps_state keeps state associated with RX queue "prescanning"
- * (prescanning for FECNs, and BECNs), if prescanning is in use.
- */
-struct ps_state {
-       u32 ps_head;
-       int initialized;
-};
-
 struct ctxt_eager_bufs {
        ssize_t size;            /* total size of eager buffers */
        u32 count;               /* size of buffers array */
        struct list_head sdma_queues;
        spinlock_t sdma_qlock;
 
-#ifdef CONFIG_PRESCAN_RXQ
-       struct ps_state ps_state;
-#endif /* CONFIG_PRESCAN_RXQ */
-
        /*
         * The interrupt handler for a particular receive context can vary
         * throughout it's lifetime. This is not a lock protected data member so