}
        priv->rx_ring_num = prof->rx_ring_num;
        priv->cqe_factor = (mdev->dev->caps.cqe_size == 64) ? 1 : 0;
+       priv->cqe_size = mdev->dev->caps.cqe_size;
        priv->mac_index = -1;
        priv->msg_enable = MLX4_EN_MSG_LEVEL;
        spin_lock_init(&priv->stats_lock);
 
         * descriptor offset can be deduced from the CQE index instead of
         * reading 'cqe->index' */
        index = cq->mcq.cons_index & ring->size_mask;
-       cqe = &cq->buf[(index << factor) + factor];
+       cqe = mlx4_en_get_cqe(cq->buf, index, priv->cqe_size) + factor;
 
        /* Process all completed CQEs */
        while (XNOR(cqe->owner_sr_opcode & MLX4_CQE_OWNER_MASK,
 
                ++cq->mcq.cons_index;
                index = (cq->mcq.cons_index) & ring->size_mask;
-               cqe = &cq->buf[(index << factor) + factor];
+               cqe = mlx4_en_get_cqe(cq->buf, index, priv->cqe_size) + factor;
                if (++polled == budget)
                        goto out;
        }
 
                return true;
 
        index = cons_index & size_mask;
-       cqe = &buf[(index << factor) + factor];
+       cqe = mlx4_en_get_cqe(buf, index, priv->cqe_size) + factor;
        ring_index = ring->cons & size_mask;
        stamp_index = ring_index;
 
 
                ++cons_index;
                index = cons_index & size_mask;
-               cqe = &buf[(index << factor) + factor];
+               cqe = mlx4_en_get_cqe(buf, index, priv->cqe_size) + factor;
        }
 
 
 
        unsigned max_mtu;
        int base_qpn;
        int cqe_factor;
+       int cqe_size;
 
        struct mlx4_en_rss_map rss_map;
        __be32 ctrl_flags;
        struct rcu_head rcu;
 };
 
+static inline struct mlx4_cqe *mlx4_en_get_cqe(void *buf, int idx, int cqe_sz)
+{
+       return buf + idx * cqe_sz;
+}
+
 #ifdef CONFIG_NET_RX_BUSY_POLL
 static inline void mlx4_en_cq_init_lock(struct mlx4_en_cq *cq)
 {