struct c4iw_create_cq_resp uresp;
        struct c4iw_ucontext *ucontext = NULL;
        int ret;
-       size_t memsize;
+       size_t memsize, hwentries;
        struct c4iw_mm_entry *mm, *mm2;
 
        PDBG("%s ib_dev %p entries %d\n", __func__, ibdev, entries);
         * entries must be multiple of 16 for HW.
         */
        entries = roundup(entries, 16);
-       memsize = entries * sizeof *chp->cq.queue;
+
+       /*
+        * Make actual HW queue 2x to avoid cdix_inc overflows.
+        */
+       hwentries = entries * 2;
+
+       /*
+        * Make HW queue at least 64 entries so GTS updates aren't too
+        * frequent.
+        */
+       if (hwentries < 64)
+               hwentries = 64;
+
+       memsize = hwentries * sizeof *chp->cq.queue;
 
        /*
         * memsize must be a multiple of the page size if its a user cq.
         */
-       if (ucontext)
+       if (ucontext) {
                memsize = roundup(memsize, PAGE_SIZE);
-       chp->cq.size = entries;
+               hwentries = memsize / sizeof *chp->cq.queue;
+       }
+       chp->cq.size = hwentries;
        chp->cq.memsize = memsize;
 
        ret = create_cq(&rhp->rdev, &chp->cq,
 
        chp->rhp = rhp;
        chp->cq.size--;                         /* status page */
-       chp->ibcq.cqe = chp->cq.size - 1;
+       chp->ibcq.cqe = entries - 2;
        spin_lock_init(&chp->lock);
        atomic_set(&chp->refcnt, 1);
        init_waitqueue_head(&chp->wait);