[SCSI] be2iscsi: Fix SGL Initilization and posting Pages for Dual Chute
authorJayamohan Kallickal <jayamohank@gmail.com>
Sat, 28 Sep 2013 22:35:47 +0000 (15:35 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 25 Oct 2013 08:58:07 +0000 (09:58 +0100)
Initialization of SGL and related PAGE posting is to be done for the chute.
Based on configuration value of each Chute,SGL initialization and page posting
is done.

For BE-X family iSCSI protocol is loaded only on single chute

Signed-off-by: John Soni Jose <sony.john-n@emulex.com>
Signed-off-by: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/be2iscsi/be_main.c

index 942a896..59d7e93 100644 (file)
@@ -3450,6 +3450,10 @@ beiscsi_post_pages(struct beiscsi_hba *phba)
        mem_descr += HWI_MEM_SGE;
        pm_arr = mem_descr->mem_array;
 
+       for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
+               if (test_bit(ulp_num, &phba->fw_config.ulp_supported))
+                       break;
+
        page_offset = (sizeof(struct iscsi_sge) * phba->params.num_sge_per_io *
                        phba->fw_config.iscsi_icd_start[ulp_num]) / PAGE_SIZE;
        for (i = 0; i < mem_descr->num_elements; i++) {
@@ -3946,7 +3950,8 @@ static int beiscsi_init_sgl_handle(struct beiscsi_hba *phba)
        struct be_mem_descriptor *mem_descr_sglh, *mem_descr_sg;
        struct sgl_handle *psgl_handle;
        struct iscsi_sge *pfrag;
-       unsigned int arr_index, i, idx, ulp_num = 0;
+       unsigned int arr_index, i, idx;
+       unsigned int ulp_icd_start, ulp_num = 0;
 
        phba->io_sgl_hndl_avbl = 0;
        phba->eh_sgl_hndl_avbl = 0;
@@ -4013,6 +4018,12 @@ static int beiscsi_init_sgl_handle(struct beiscsi_hba *phba)
                    "\n BM_%d : mem_descr_sg->num_elements=%d\n",
                    mem_descr_sg->num_elements);
 
+       for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
+               if (test_bit(ulp_num, &phba->fw_config.ulp_supported))
+                       break;
+
+       ulp_icd_start = phba->fw_config.iscsi_icd_start[ulp_num];
+
        arr_index = 0;
        idx = 0;
        while (idx < mem_descr_sg->num_elements) {
@@ -4031,9 +4042,7 @@ static int beiscsi_init_sgl_handle(struct beiscsi_hba *phba)
                        AMAP_SET_BITS(struct amap_iscsi_sge, addr_hi, pfrag, 0);
                        AMAP_SET_BITS(struct amap_iscsi_sge, addr_lo, pfrag, 0);
                        pfrag += phba->params.num_sge_per_io;
-                       psgl_handle->sgl_index =
-                               phba->fw_config.iscsi_icd_start[ulp_num] +
-                               arr_index++;
+                       psgl_handle->sgl_index = ulp_icd_start + arr_index++;
                }
                idx++;
        }