lnk->lgr = lgr;
        smc_lgr_hold(lgr); /* lgr_put in smcr_link_clear() */
        lnk->link_idx = link_idx;
+       lnk->wr_rx_id_compl = 0;
        smc_ibdev_cnt_inc(lnk);
        smcr_copy_dev_info_to_link(lnk);
        atomic_set(&lnk->conn_cnt, 0);
 
        dma_addr_t              wr_rx_dma_addr; /* DMA address of wr_rx_bufs */
        dma_addr_t              wr_rx_v2_dma_addr; /* DMA address of v2 rx buf*/
        u64                     wr_rx_id;       /* seq # of last recv WR */
+       u64                     wr_rx_id_compl; /* seq # of last completed WR */
        u32                     wr_rx_cnt;      /* number of WR recv buffers */
        unsigned long           wr_rx_tstamp;   /* jiffies when last buf rx */
+       wait_queue_head_t       wr_rx_empty_wait; /* wait for RQ empty */
 
        struct ib_reg_wr        wr_reg;         /* WR register memory region */
        wait_queue_head_t       wr_reg_wait;    /* wait for wr_reg result */
 
 
        for (i = 0; i < num; i++) {
                link = wc[i].qp->qp_context;
+               link->wr_rx_id_compl = wc[i].wr_id;
                if (wc[i].status == IB_WC_SUCCESS) {
                        link->wr_rx_tstamp = jiffies;
                        smc_wr_rx_demultiplex(&wc[i]);
                        case IB_WC_RNR_RETRY_EXC_ERR:
                        case IB_WC_WR_FLUSH_ERR:
                                smcr_link_down_cond_sched(link);
+                               if (link->wr_rx_id_compl == link->wr_rx_id)
+                                       wake_up(&link->wr_rx_empty_wait);
                                break;
                        default:
                                smc_wr_rx_post(link); /* refill WR RX */
                return;
        ibdev = lnk->smcibdev->ibdev;
 
+       smc_wr_drain_cq(lnk);
        smc_wr_wakeup_reg_wait(lnk);
        smc_wr_wakeup_tx_wait(lnk);
 
        atomic_set(&lnk->wr_tx_refcnt, 0);
        init_waitqueue_head(&lnk->wr_reg_wait);
        atomic_set(&lnk->wr_reg_refcnt, 0);
+       init_waitqueue_head(&lnk->wr_rx_empty_wait);
        return rc;
 
 dma_unmap:
 
                wake_up_all(&link->wr_tx_wait);
 }
 
+static inline void smc_wr_drain_cq(struct smc_link *lnk)
+{
+       wait_event(lnk->wr_rx_empty_wait, lnk->wr_rx_id_compl == lnk->wr_rx_id);
+}
+
 static inline void smc_wr_wakeup_tx_wait(struct smc_link *lnk)
 {
        wake_up_all(&lnk->wr_tx_wait);