{
        struct mthca_cq *cq;
        struct mthca_cqe *cqe;
-       int prod_index;
+       u32 prod_index;
        int nfreed = 0;
 
        spin_lock_irq(&dev->cq_table.lock);
         * Now sweep backwards through the CQ, removing CQ entries
         * that match our QP by copying older entries on top of them.
         */
-       while (prod_index > cq->cons_index) {
-               cqe = get_cqe(cq, (prod_index - 1) & cq->ibcq.cqe);
+       while ((int) --prod_index - (int) cq->cons_index >= 0) {
+               cqe = get_cqe(cq, prod_index & cq->ibcq.cqe);
                if (cqe->my_qpn == cpu_to_be32(qpn)) {
                        if (srq)
                                mthca_free_srq_wqe(srq, be32_to_cpu(cqe->wqe));
                        ++nfreed;
-               }
-               else if (nfreed)
-                       memcpy(get_cqe(cq, (prod_index - 1 + nfreed) &
-                                      cq->ibcq.cqe),
-                              cqe,
-                              MTHCA_CQ_ENTRY_SIZE);
-               --prod_index;
+               } else if (nfreed)
+                       memcpy(get_cqe(cq, (prod_index + nfreed) & cq->ibcq.cqe),
+                              cqe, MTHCA_CQ_ENTRY_SIZE);
        }
 
        if (nfreed) {