}
 
 /**
- * _scsih_is_nvme_device - determines if device is an nvme device
+ * _scsih_is_nvme_pciescsi_device - determines if
+ *                     device is an pcie nvme/scsi device
  * @device_info: bitfield providing information about the device.
  * Context: none
  *
- * Return: 1 if nvme device.
+ * Returns 1 if device is pcie device type nvme/scsi.
  */
 static int
-_scsih_is_nvme_device(u32 device_info)
+_scsih_is_nvme_pciescsi_device(u32 device_info)
 {
-       if ((device_info & MPI26_PCIE_DEVINFO_MASK_DEVICE_TYPE)
-                                       == MPI26_PCIE_DEVINFO_NVME)
+       if (((device_info & MPI26_PCIE_DEVINFO_MASK_DEVICE_TYPE)
+           == MPI26_PCIE_DEVINFO_NVME) ||
+           ((device_info & MPI26_PCIE_DEVINFO_MASK_DEVICE_TYPE)
+           == MPI26_PCIE_DEVINFO_SCSI))
                return 1;
        else
                return 0;
 
        handle = sas_device_priv_data->sas_target->handle;
        pcie_device = mpt3sas_get_pdev_by_handle(ioc, handle);
-       if (pcie_device && (!ioc->tm_custom_handling))
+       if (pcie_device && (!ioc->tm_custom_handling) &&
+           (!(mpt3sas_scsih_is_pcie_scsi_device(pcie_device->device_info))))
                timeout = ioc->nvme_abort_timeout;
        r = mpt3sas_scsih_issue_locked_tm(ioc, handle, scmd->device->lun,
                MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK,
 
        pcie_device = mpt3sas_get_pdev_by_handle(ioc, handle);
 
-       if (pcie_device && (!ioc->tm_custom_handling)) {
+       if (pcie_device && (!ioc->tm_custom_handling) &&
+           (!(mpt3sas_scsih_is_pcie_scsi_device(pcie_device->device_info)))) {
                tr_timeout = pcie_device->reset_timeout;
                tr_method = MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE;
        } else
                tr_method = MPI2_SCSITASKMGMT_MSGFLAGS_LINK_RESET;
+
        r = mpt3sas_scsih_issue_locked_tm(ioc, handle, scmd->device->lun,
                MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET, 0, 0,
                tr_timeout, tr_method);
 
        pcie_device = mpt3sas_get_pdev_by_handle(ioc, handle);
 
-       if (pcie_device && (!ioc->tm_custom_handling)) {
+       if (pcie_device && (!ioc->tm_custom_handling) &&
+           (!(mpt3sas_scsih_is_pcie_scsi_device(pcie_device->device_info)))) {
                tr_timeout = pcie_device->reset_timeout;
                tr_method = MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE;
        } else
                        sas_address = pcie_device->wwid;
                }
                spin_unlock_irqrestore(&ioc->pcie_device_lock, flags);
-               if (pcie_device && (!ioc->tm_custom_handling))
+               if (pcie_device && (!ioc->tm_custom_handling) &&
+                   (!(mpt3sas_scsih_is_pcie_scsi_device(
+                   pcie_device->device_info))))
                        tr_method =
                            MPI26_SCSITASKMGMT_MSGFLAGS_PROTOCOL_LVL_RST_PCIE;
                else
 
        /* check if this is end device */
        device_info = le32_to_cpu(pcie_device_pg0.DeviceInfo);
-       if (!(_scsih_is_nvme_device(device_info)))
+       if (!(_scsih_is_nvme_pciescsi_device(device_info)))
                return;
 
        wwid = le64_to_cpu(pcie_device_pg0.WWID);
            pcie_device_pg0.AccessStatus))
                return 0;
 
-       if (!(_scsih_is_nvme_device(le32_to_cpu(pcie_device_pg0.DeviceInfo))))
+       if (!(_scsih_is_nvme_pciescsi_device(le32_to_cpu
+           (pcie_device_pg0.DeviceInfo))))
                return 0;
 
        pcie_device = mpt3sas_get_pdev_by_wwid(ioc, wwid);
                return 0;
        }
 
+       /* PCIe Device Page 2 contains read-only information about a
+        * specific NVMe device; therefore, this page is only
+        * valid for NVMe devices and skip for pcie devices of type scsi.
+        */
+       if (!(mpt3sas_scsih_is_pcie_scsi_device(
+               le32_to_cpu(pcie_device_pg0.DeviceInfo)))) {
+               if (mpt3sas_config_get_pcie_device_pg2(ioc, &mpi_reply,
+                   &pcie_device_pg2, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE,
+                   handle)) {
+                       ioc_err(ioc,
+                           "failure at %s:%d/%s()!\n", __FILE__,
+                           __LINE__, __func__);
+                       return 0;
+               }
+
+               ioc_status = le16_to_cpu(mpi_reply.IOCStatus) &
+                                       MPI2_IOCSTATUS_MASK;
+               if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
+                       ioc_err(ioc,
+                           "failure at %s:%d/%s()!\n", __FILE__,
+                           __LINE__, __func__);
+                       return 0;
+               }
+       }
+
        pcie_device = kzalloc(sizeof(struct _pcie_device), GFP_KERNEL);
        if (!pcie_device) {
                ioc_err(ioc, "failure at %s:%d/%s()!\n",
                            le64_to_cpu(enclosure_dev->pg0.EnclosureLogicalID);
        }
        /* TODO -- Add device name once FW supports it */
-       if (mpt3sas_config_get_pcie_device_pg2(ioc, &mpi_reply,
-               &pcie_device_pg2, MPI2_SAS_DEVICE_PGAD_FORM_HANDLE, handle)) {
-               ioc_err(ioc, "failure at %s:%d/%s()!\n",
-                       __FILE__, __LINE__, __func__);
-               kfree(pcie_device);
-               return 0;
-       }
-
-       ioc_status = le16_to_cpu(mpi_reply.IOCStatus) & MPI2_IOCSTATUS_MASK;
-       if (ioc_status != MPI2_IOCSTATUS_SUCCESS) {
-               ioc_err(ioc, "failure at %s:%d/%s()!\n",
-                       __FILE__, __LINE__, __func__);
-               kfree(pcie_device);
-               return 0;
-       }
-       pcie_device->nvme_mdts =
-               le32_to_cpu(pcie_device_pg2.MaximumDataTransferSize);
-       if (pcie_device_pg2.ControllerResetTO)
-               pcie_device->reset_timeout =
-                       pcie_device_pg2.ControllerResetTO;
-       else
+       if (!(mpt3sas_scsih_is_pcie_scsi_device(
+           le32_to_cpu(pcie_device_pg0.DeviceInfo)))) {
+               pcie_device->nvme_mdts =
+                   le32_to_cpu(pcie_device_pg2.MaximumDataTransferSize);
+               if (pcie_device_pg2.ControllerResetTO)
+                       pcie_device->reset_timeout =
+                           pcie_device_pg2.ControllerResetTO;
+               else
+                       pcie_device->reset_timeout = 30;
+       } else
                pcie_device->reset_timeout = 30;
 
        if (ioc->wait_for_discovery_to_complete)
                }
                handle = le16_to_cpu(pcie_device_pg0.DevHandle);
                device_info = le32_to_cpu(pcie_device_pg0.DeviceInfo);
-               if (!(_scsih_is_nvme_device(device_info)))
+               if (!(_scsih_is_nvme_pciescsi_device(device_info)))
                        continue;
                _scsih_mark_responding_pcie_device(ioc, &pcie_device_pg0);
        }
                        break;
                }
                handle = le16_to_cpu(pcie_device_pg0.DevHandle);
-               if (!(_scsih_is_nvme_device(
+               if (!(_scsih_is_nvme_pciescsi_device(
                        le32_to_cpu(pcie_device_pg0.DeviceInfo))))
                        continue;
                pcie_device = mpt3sas_get_pdev_by_wwid(ioc,