if (!shost)
                return -ENODEV;
 
+       sprintf(driver_name, "%s", MPT2SAS_DRIVER_NAME);
        rv = scsih_probe(pdev, shost);
        return rv;
 }
 
        atomic_set(&reply_q->busy, 0);
        if (ioc->msix_enable)
                snprintf(reply_q->name, MPT_NAME_LENGTH, "%s%d-msix%d",
-                   MPT3SAS_DRIVER_NAME, ioc->id, index);
+                   driver_name, ioc->id, index);
        else
                snprintf(reply_q->name, MPT_NAME_LENGTH, "%s%d",
-                   MPT3SAS_DRIVER_NAME, ioc->id);
+                   driver_name, ioc->id);
        r = request_irq(vector, _base_interrupt, IRQF_SHARED, reply_q->name,
            reply_q);
        if (r) {
 
 
        if (pci_request_selected_regions(pdev, ioc->bars,
-           MPT3SAS_DRIVER_NAME)) {
+           driver_name)) {
                pr_warn(MPT3SAS_FMT "pci_request_selected_regions: failed\n",
                        ioc->name);
                ioc->bars = 0;
        mpi_request.WhoInit = MPI2_WHOINIT_HOST_DRIVER;
        mpi_request.VF_ID = 0; /* TODO */
        mpi_request.VP_ID = 0;
-       mpi_request.MsgVersion = cpu_to_le16(MPI25_VERSION);
+       mpi_request.MsgVersion = cpu_to_le16(ioc->hba_mpi_version_belonged);
        mpi_request.HeaderVersion = cpu_to_le16(MPI2_HEADER_VERSION);
 
        if (_base_is_controller_msix_enabled(ioc))
 
        MPT_BUILD_SG    build_sg;
        MPT_BUILD_ZERO_LEN_SGE build_zero_len_sge;
        u16             sge_size_ieee;
+       u16             hba_mpi_version_belonged;
 
        /* function ptr for MPI sg elements only */
        MPT_BUILD_SG    build_sg_mpi;
 
 /* base shared API */
 extern struct list_head mpt3sas_ioc_list;
+extern char    driver_name[MPT_NAME_LENGTH];
+
 void mpt3sas_base_start_watchdog(struct MPT3SAS_ADAPTER *ioc);
 void mpt3sas_base_stop_watchdog(struct MPT3SAS_ADAPTER *ioc);
 
 
            __func__));
 
        memset(&karg, 0 , sizeof(karg));
-       karg.adapter_type = MPT3_IOCTL_INTERFACE_SAS3;
        if (ioc->pfacts)
                karg.port_number = ioc->pfacts[0].PortNumber;
        karg.hw_rev = ioc->pdev->revision;
        karg.pci_information.u.bits.function = PCI_FUNC(ioc->pdev->devfn);
        karg.pci_information.segment_id = pci_domain_nr(ioc->pdev->bus);
        karg.firmware_version = ioc->facts.FWVersion.Word;
-       strcpy(karg.driver_version, MPT3SAS_DRIVER_NAME);
+       strcpy(karg.driver_version, driver_name);
        strcat(karg.driver_version, "-");
-       strcat(karg.driver_version, MPT3SAS_DRIVER_VERSION);
+       switch  (ioc->hba_mpi_version_belonged) {
+       case MPI2_VERSION:
+               karg.adapter_type = MPT2_IOCTL_INTERFACE_SAS2;
+               strcat(karg.driver_version, MPT2SAS_DRIVER_VERSION);
+               break;
+       case MPI25_VERSION:
+               karg.adapter_type = MPT3_IOCTL_INTERFACE_SAS3;
+               strcat(karg.driver_version, MPT3SAS_DRIVER_VERSION);
+               break;
+       }
+       if (ioc->hba_mpi_version_belonged == MPI2_VERSION)
+               strcat(karg.driver_version, MPT2SAS_DRIVER_VERSION);
+       else
+               strcat(karg.driver_version, MPT3SAS_DRIVER_VERSION);
        karg.bios_version = le32_to_cpu(ioc->bios_pg3.BiosVersion);
 
        if (copy_to_user(arg, &karg, sizeof(karg))) {
 
        if (!shost)
                return -ENODEV;
 
+       sprintf(driver_name, "%s", MPT3SAS_DRIVER_NAME);
        rv = scsih_probe(pdev, shost);
        return rv;
 }
 
 
 /* global parameters */
 LIST_HEAD(mpt3sas_ioc_list);
+char    driver_name[MPT_NAME_LENGTH];
 
 /* local parameters */
 static u8 scsi_io_cb_idx = -1;
        return 1;
 }
 
+void
+_scsih_determine_hba_mpi_version(struct MPT3SAS_ADAPTER *ioc) {
+
+       switch (ioc->pdev->device) {
+       case MPI2_MFGPAGE_DEVID_SAS2004:
+       case MPI2_MFGPAGE_DEVID_SAS2008:
+       case MPI2_MFGPAGE_DEVID_SAS2108_1:
+       case MPI2_MFGPAGE_DEVID_SAS2108_2:
+       case MPI2_MFGPAGE_DEVID_SAS2108_3:
+       case MPI2_MFGPAGE_DEVID_SAS2116_1:
+       case MPI2_MFGPAGE_DEVID_SAS2116_2:
+       case MPI2_MFGPAGE_DEVID_SAS2208_1:
+       case MPI2_MFGPAGE_DEVID_SAS2208_2:
+       case MPI2_MFGPAGE_DEVID_SAS2208_3:
+       case MPI2_MFGPAGE_DEVID_SAS2208_4:
+       case MPI2_MFGPAGE_DEVID_SAS2208_5:
+       case MPI2_MFGPAGE_DEVID_SAS2208_6:
+       case MPI2_MFGPAGE_DEVID_SAS2308_1:
+       case MPI2_MFGPAGE_DEVID_SAS2308_2:
+       case MPI2_MFGPAGE_DEVID_SAS2308_3:
+               ioc->hba_mpi_version_belonged = MPI2_VERSION;
+               break;
+       case MPI25_MFGPAGE_DEVID_SAS3004:
+       case MPI25_MFGPAGE_DEVID_SAS3008:
+       case MPI25_MFGPAGE_DEVID_SAS3108_1:
+       case MPI25_MFGPAGE_DEVID_SAS3108_2:
+       case MPI25_MFGPAGE_DEVID_SAS3108_5:
+       case MPI25_MFGPAGE_DEVID_SAS3108_6:
+               ioc->hba_mpi_version_belonged = MPI25_VERSION;
+               break;
+       }
+}
+
 /**
  * scsih_probe - attach and add scsi host
  * @pdev: PCI device struct
        list_add_tail(&ioc->list, &mpt3sas_ioc_list);
        ioc->shost = shost;
        ioc->id = mpt_ids++;
-       sprintf(ioc->name, "%s%d", MPT3SAS_DRIVER_NAME, ioc->id);
+
        ioc->pdev = pdev;
        ioc->scsi_io_cb_idx = scsi_io_cb_idx;
        ioc->tm_cb_idx = tm_cb_idx;
        INIT_LIST_HEAD(&ioc->delayed_tr_volume_list);
        INIT_LIST_HEAD(&ioc->reply_queue_list);
 
+       _scsih_determine_hba_mpi_version(ioc);
+       sprintf(ioc->name, "%s_cm%d", driver_name, ioc->id);
+
        /* init shost parameters */
        shost->max_cmd_len = 32;
        shost->max_lun = max_lun;