[SCSI] be2iscsi: Fix MSIx creation for SKH-R adapter
authorJayamohan Kallickal <jayamohank@gmail.com>
Sat, 28 Sep 2013 22:35:54 +0000 (15:35 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 25 Oct 2013 08:58:09 +0000 (09:58 +0100)
The MSIx to be created for SKH-R adapter should be based on
eq_count returned by get_fw_config.

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
drivers/scsi/be2iscsi/be_main.h
drivers/scsi/be2iscsi/be_mgmt.c

index de948d36fb15bfb2bb739d898dbe7eaa74989786..ddacd2c990793a3610a1723fc3183840b20ca3cd 100644 (file)
@@ -3758,8 +3758,19 @@ static void find_num_cpus(struct beiscsi_hba *phba)
                                  BEISCSI_MAX_NUM_CPUS : num_cpus;
                break;
        case BE_GEN4:
-               phba->num_cpus = (num_cpus > OC_SKH_MAX_NUM_CPUS) ?
-                                 OC_SKH_MAX_NUM_CPUS : num_cpus;
+               /*
+                * If eqid_count == 1 fall back to
+                * INTX mechanism
+                **/
+               if (phba->fw_config.eqid_count == 1) {
+                       enable_msix = 0;
+                       phba->num_cpus = 1;
+                       return;
+               }
+
+               phba->num_cpus =
+                       (num_cpus > (phba->fw_config.eqid_count - 1)) ?
+                       (phba->fw_config.eqid_count - 1) : num_cpus;
                break;
        default:
                phba->num_cpus = 1;
@@ -5275,20 +5286,6 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
                phba->generation = 0;
        }
 
-       if (enable_msix)
-               find_num_cpus(phba);
-       else
-               phba->num_cpus = 1;
-
-       beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
-                   "BM_%d : num_cpus = %d\n",
-                   phba->num_cpus);
-
-       if (enable_msix) {
-               beiscsi_msix_enable(phba);
-               if (!phba->msix_enabled)
-                       phba->num_cpus = 1;
-       }
        ret = be_ctrl_init(phba, pcidev);
        if (ret) {
                beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
@@ -5320,6 +5317,22 @@ static int beiscsi_dev_probe(struct pci_dev *pcidev,
                            "BM_%d : Error getting fw config\n");
                goto free_port;
        }
+
+       if (enable_msix)
+               find_num_cpus(phba);
+       else
+               phba->num_cpus = 1;
+
+       beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
+                   "BM_%d : num_cpus = %d\n",
+                   phba->num_cpus);
+
+       if (enable_msix) {
+               beiscsi_msix_enable(phba);
+               if (!phba->msix_enabled)
+                       phba->num_cpus = 1;
+       }
+
        phba->shost->max_id = phba->params.cxns_per_ctrl;
        beiscsi_get_params(phba);
        phba->shost->can_queue = phba->params.ios_per_ctrl;
index 3fa1e819f42d1765f0126d58443b7aee7763e7c6..88291b0051bfd82abd2ca89d1fd3d926e7f4318b 100644 (file)
@@ -65,7 +65,6 @@
 
 #define MAX_CPUS               64
 #define BEISCSI_MAX_NUM_CPUS   7
-#define OC_SKH_MAX_NUM_CPUS    31
 
 #define BEISCSI_VER_STRLEN 32
 
@@ -377,6 +376,8 @@ struct beiscsi_hba {
                 * for cid to cri conversion
                 */
                unsigned int phys_port;
+               unsigned int eqid_count;
+               unsigned int cqid_count;
                unsigned int iscsi_cid_start[BEISCSI_ULP_COUNT];
 #define BEISCSI_GET_CID_COUNT(phba, ulp_num) \
                (phba->fw_config.iscsi_cid_count[ulp_num])
index 7b0b13f69b69de6d74595f035ef7a3089b98fbf1..befeace182579f008f9eb8f37efe7a5165090310 100644 (file)
@@ -311,6 +311,17 @@ int mgmt_get_fw_config(struct be_ctrl_info *ctrl,
                struct be_fw_cfg *pfw_cfg;
                pfw_cfg = req;
 
+               if (!is_chip_be2_be3r(phba)) {
+                       phba->fw_config.eqid_count = pfw_cfg->eqid_count;
+                       phba->fw_config.cqid_count = pfw_cfg->cqid_count;
+
+                       beiscsi_log(phba, KERN_INFO,
+                                   BEISCSI_LOG_INIT,
+                                   "BG_%d : EQ_Count : %d CQ_Count : %d\n",
+                                   phba->fw_config.eqid_count,
+                                   phba->fw_config.cqid_count);
+               }
+
                for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
                        if (pfw_cfg->ulp[ulp_num].ulp_mode &
                            BEISCSI_ULP_ISCSI_INI_MODE)