{
        u32 i;
 
-       for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) {
+       for (i = 0; i < cp->max_cid_space; i++) {
                if (cp->ctx_tbl[i].cid == cid) {
                        *l5_cid = i;
                        return 0;
 static int cnic_alloc_bnx2x_context(struct cnic_dev *dev)
 {
        struct cnic_local *cp = dev->cnic_priv;
-       struct cnic_eth_dev *ethdev = cp->ethdev;
        int ctx_blk_size = cp->ethdev->ctx_blk_size;
-       int total_mem, blks, i, cid_space;
-
-       if (BNX2X_ISCSI_START_CID < ethdev->starting_cid)
-               return -EINVAL;
-
-       cid_space = MAX_ISCSI_TBL_SZ +
-                   (BNX2X_ISCSI_START_CID - ethdev->starting_cid);
+       int total_mem, blks, i;
 
-       total_mem = BNX2X_CONTEXT_MEM_SIZE * cid_space;
+       total_mem = BNX2X_CONTEXT_MEM_SIZE * cp->max_cid_space;
        blks = total_mem / ctx_blk_size;
        if (total_mem % ctx_blk_size)
                blks++;
 static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
 {
        struct cnic_local *cp = dev->cnic_priv;
+       struct cnic_eth_dev *ethdev = cp->ethdev;
+       u32 start_cid = ethdev->starting_cid;
        int i, j, n, ret, pages;
        struct cnic_dma *kwq_16_dma = &cp->kwq_16_data_info;
 
+       cp->max_cid_space = MAX_ISCSI_TBL_SZ;
+       cp->iscsi_start_cid = start_cid;
+       if (start_cid < BNX2X_ISCSI_START_CID) {
+               u32 delta = BNX2X_ISCSI_START_CID - start_cid;
+
+               cp->iscsi_start_cid = BNX2X_ISCSI_START_CID;
+               cp->max_cid_space += delta;
+       }
+
        cp->iscsi_tbl = kzalloc(sizeof(struct cnic_iscsi) * MAX_ISCSI_TBL_SZ,
                                GFP_KERNEL);
        if (!cp->iscsi_tbl)
                goto error;
 
        cp->ctx_tbl = kzalloc(sizeof(struct cnic_context) *
-                                 MAX_CNIC_L5_CONTEXT, GFP_KERNEL);
+                               cp->max_cid_space, GFP_KERNEL);
        if (!cp->ctx_tbl)
                goto error;
 
                cp->ctx_tbl[i].ulp_proto_id = CNIC_ULP_ISCSI;
        }
 
-       pages = PAGE_ALIGN(MAX_CNIC_L5_CONTEXT * CNIC_KWQ16_DATA_SIZE) /
+       pages = PAGE_ALIGN(cp->max_cid_space * CNIC_KWQ16_DATA_SIZE) /
                PAGE_SIZE;
 
        ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0);
                return -ENOMEM;
 
        n = PAGE_SIZE / CNIC_KWQ16_DATA_SIZE;
-       for (i = 0, j = 0; i < MAX_ISCSI_TBL_SZ; i++) {
+       for (i = 0, j = 0; i < cp->max_cid_space; i++) {
                long off = CNIC_KWQ16_DATA_SIZE * (i % n);
 
                cp->ctx_tbl[i].kwqe_data = kwq_16_dma->pg_arr[j] + off;
        u8 sb_id = cp->status_blk_num;
 
        ret = cnic_init_id_tbl(&cp->cid_tbl, MAX_ISCSI_TBL_SZ,
-                              BNX2X_ISCSI_START_CID);
+                              cp->iscsi_start_cid);
 
        if (ret)
                return -ENOMEM;