return idx;
 }
 
-static int cnic_get_kcqes(struct cnic_dev *dev, u16 hw_prod, u16 *sw_prod)
+static int cnic_get_kcqes(struct cnic_dev *dev, struct kcq_info *info)
 {
        struct cnic_local *cp = dev->cnic_priv;
-       u16 i, ri, last;
+       u16 i, ri, hw_prod, last;
        struct kcqe *kcqe;
        int kcqe_cnt = 0, last_cnt = 0;
 
-       i = ri = last = *sw_prod;
+       i = ri = last = info->sw_prod_idx;
        ri &= MAX_KCQ_IDX;
+       hw_prod = *info->hw_prod_idx_ptr;
+       hw_prod = cp->hw_idx(hw_prod);
 
        while ((i != hw_prod) && (kcqe_cnt < MAX_COMPLETED_KCQE)) {
-               kcqe = &cp->kcq1.kcq[KCQ_PG(ri)][KCQ_IDX(ri)];
+               kcqe = &info->kcq[KCQ_PG(ri)][KCQ_IDX(ri)];
                cp->completed_kcq[kcqe_cnt++] = kcqe;
                i = cp->next_idx(i);
                ri = i & MAX_KCQ_IDX;
                }
        }
 
-       *sw_prod = last;
+       info->sw_prod_idx = last;
        return last_cnt;
 }
 
 static int cnic_service_bnx2(void *data, void *status_blk)
 {
        struct cnic_dev *dev = data;
-       struct status_block *sblk = status_blk;
        struct cnic_local *cp = dev->cnic_priv;
-       u32 status_idx = sblk->status_idx;
-       u16 hw_prod, sw_prod;
+       u32 status_idx = *cp->kcq1.status_idx_ptr;
        int kcqe_cnt;
 
        if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags)))
 
        cp->kwq_con_idx = *cp->kwq_con_idx_ptr;
 
-       hw_prod = sblk->status_completion_producer_index;
-       sw_prod = cp->kcq1.sw_prod_idx;
-       while (sw_prod != hw_prod) {
-               kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod);
-               if (kcqe_cnt == 0)
-                       goto done;
+       while ((kcqe_cnt = cnic_get_kcqes(dev, &cp->kcq1))) {
 
                service_kcqes(dev, kcqe_cnt);
 
                /* Tell compiler that status_blk fields can change. */
                barrier();
-               if (status_idx != sblk->status_idx) {
-                       status_idx = sblk->status_idx;
+               if (status_idx != *cp->kcq1.status_idx_ptr) {
+                       status_idx = *cp->kcq1.status_idx_ptr;
                        cp->kwq_con_idx = *cp->kwq_con_idx_ptr;
-                       hw_prod = sblk->status_completion_producer_index;
                } else
                        break;
        }
 
-done:
-       CNIC_WR16(dev, cp->kcq1.io_addr, sw_prod);
-
-       cp->kcq1.sw_prod_idx = sw_prod;
+       CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx);
 
        cnic_chk_pkt_rings(cp);
        return status_idx;
        struct cnic_dev *dev = (struct cnic_dev *) data;
        struct cnic_local *cp = dev->cnic_priv;
        struct status_block_msix *status_blk = cp->status_blk.bnx2;
-       u32 status_idx = status_blk->status_idx;
-       u16 hw_prod, sw_prod;
+       u32 status_idx = *cp->kcq1.status_idx_ptr;
        int kcqe_cnt;
 
        cp->kwq_con_idx = status_blk->status_cmd_consumer_index;
 
-       hw_prod = status_blk->status_completion_producer_index;
-       sw_prod = cp->kcq1.sw_prod_idx;
-       while (sw_prod != hw_prod) {
-               kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod);
-               if (kcqe_cnt == 0)
-                       goto done;
+       while ((kcqe_cnt = cnic_get_kcqes(dev, &cp->kcq1))) {
 
                service_kcqes(dev, kcqe_cnt);
 
                /* Tell compiler that status_blk fields can change. */
                barrier();
-               if (status_idx != status_blk->status_idx) {
-                       status_idx = status_blk->status_idx;
+               if (status_idx != *cp->kcq1.status_idx_ptr) {
+                       status_idx = *cp->kcq1.status_idx_ptr;
                        cp->kwq_con_idx = status_blk->status_cmd_consumer_index;
-                       hw_prod = status_blk->status_completion_producer_index;
                } else
                        break;
        }
 
-done:
-       CNIC_WR16(dev, cp->kcq1.io_addr, sw_prod);
-       cp->kcq1.sw_prod_idx = sw_prod;
+       CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx);
 
        cnic_chk_pkt_rings(cp);
 
 {
        struct cnic_dev *dev = (struct cnic_dev *) data;
        struct cnic_local *cp = dev->cnic_priv;
-       u16 hw_prod, sw_prod;
-       struct cstorm_status_block_c *sblk =
-               &cp->status_blk.bnx2x->c_status_block;
-       u32 status_idx = sblk->status_block_index;
+       u32 status_idx = *cp->kcq1.status_idx_ptr;
        int kcqe_cnt;
 
        if (unlikely(!test_bit(CNIC_F_CNIC_UP, &dev->flags)))
                return;
 
-       hw_prod = sblk->index_values[HC_INDEX_C_ISCSI_EQ_CONS];
-       hw_prod = cp->hw_idx(hw_prod);
-       sw_prod = cp->kcq1.sw_prod_idx;
-       while (sw_prod != hw_prod) {
-               kcqe_cnt = cnic_get_kcqes(dev, hw_prod, &sw_prod);
-               if (kcqe_cnt == 0)
-                       goto done;
+       while ((kcqe_cnt = cnic_get_kcqes(dev, &cp->kcq1))) {
 
                service_kcqes(dev, kcqe_cnt);
 
                /* Tell compiler that sblk fields can change. */
                barrier();
-               if (status_idx == sblk->status_block_index)
+               if (status_idx == *cp->kcq1.status_idx_ptr)
                        break;
 
-               status_idx = sblk->status_block_index;
-               hw_prod = sblk->index_values[HC_INDEX_C_ISCSI_EQ_CONS];
-               hw_prod = cp->hw_idx(hw_prod);
+               status_idx = *cp->kcq1.status_idx_ptr;
        }
 
-done:
-       CNIC_WR16(dev, cp->kcq1.io_addr, sw_prod + MAX_KCQ_IDX);
+       CNIC_WR16(dev, cp->kcq1.io_addr, cp->kcq1.sw_prod_idx + MAX_KCQ_IDX);
        cnic_ack_bnx2x_int(dev, cp->status_blk_num, CSTORM_ID,
                           status_idx, IGU_INT_ENABLE, 1);
-
-       cp->kcq1.sw_prod_idx = sw_prod;
 }
 
 static int cnic_service_bnx2x(void *data, void *status_blk)