static int megasas_issue_init_mfi(struct megasas_instance *instance);
 static int megasas_register_aen(struct megasas_instance *instance,
                                u32 seq_num, u32 class_locale_word);
-static int
-megasas_get_pd_info(struct megasas_instance *instance, u16 device_id);
+static void megasas_get_pd_info(struct megasas_instance *instance,
+                               struct scsi_device *sdev);
 /*
  * PCI ID table for all supported controllers
  */
 }
 
 /*
-* megasas_update_sdev_properties - Update sdev structure based on controller's FW capabilities
+* megasas_set_dynamic_target_properties -
+* Device property set by driver may not be static and it is required to be
+* updated after OCR
+*
+* set tm_capable.
+* set dma alignment (only for eedp protection enable vd).
 *
 * @sdev: OS provided scsi device
 *
 * Returns void
 */
-void megasas_update_sdev_properties(struct scsi_device *sdev)
+void megasas_set_dynamic_target_properties(struct scsi_device *sdev)
 {
-       u16 pd_index = 0;
-       u32 device_id, ld;
+       u16 pd_index = 0, ld;
+       u32 device_id;
        struct megasas_instance *instance;
        struct fusion_context *fusion;
        struct MR_PRIV_DEVICE *mr_device_priv_data;
                raid = MR_LdRaidGet(ld, local_map_ptr);
 
                if (raid->capability.ldPiMode == MR_PROT_INFO_TYPE_CONTROLLER)
-                       blk_queue_update_dma_alignment(sdev->request_queue,
-                                                      0x7);
+               blk_queue_update_dma_alignment(sdev->request_queue, 0x7);
 
                mr_device_priv_data->is_tm_capable =
                        raid->capability.tmCapable;
        } else if (instance->use_seqnum_jbod_fp) {
                pd_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) +
-                               sdev->id;
+                       sdev->id;
                pd_sync = (void *)fusion->pd_seq_sync
                                [(instance->pd_seq_map_id - 1) & 1];
                mr_device_priv_data->is_tm_capable =
-                               pd_sync->seq[pd_index].capability.tmCapable;
+                       pd_sync->seq[pd_index].capability.tmCapable;
        }
 }
 
-static void megasas_set_device_queue_depth(struct scsi_device *sdev)
+/*
+ * megasas_set_nvme_device_properties -
+ * set nomerges=2
+ * set virtual page boundary = 4K (current mr_nvme_pg_size is 4K).
+ * set maximum io transfer = MDTS of NVME device provided by MR firmware.
+ *
+ * MR firmware provides value in KB. Caller of this function converts
+ * kb into bytes.
+ *
+ * e.a MDTS=5 means 2^5 * nvme page size. (In case of 4K page size,
+ * MR firmware provides value 128 as (32 * 4K) = 128K.
+ *
+ * @sdev:                              scsi device
+ * @max_io_size:                               maximum io transfer size
+ *
+ */
+static inline void
+megasas_set_nvme_device_properties(struct scsi_device *sdev, u32 max_io_size)
 {
-       u16                             pd_index = 0;
-       int             ret = DCMD_FAILED;
        struct megasas_instance *instance;
+       u32 mr_nvme_pg_size;
 
-       instance = megasas_lookup_instance(sdev->host->host_no);
+       instance = (struct megasas_instance *)sdev->host->hostdata;
+       mr_nvme_pg_size = max_t(u32, instance->nvme_page_size,
+                               MR_DEFAULT_NVME_PAGE_SIZE);
 
-       if (sdev->channel < MEGASAS_MAX_PD_CHANNELS) {
-               pd_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id;
+       blk_queue_max_hw_sectors(sdev->request_queue, (max_io_size / 512));
 
-               if (instance->pd_info) {
-                       mutex_lock(&instance->hba_mutex);
-                       ret = megasas_get_pd_info(instance, pd_index);
-                       mutex_unlock(&instance->hba_mutex);
-               }
+       queue_flag_set_unlocked(QUEUE_FLAG_NOMERGES, sdev->request_queue);
+       blk_queue_virt_boundary(sdev->request_queue, mr_nvme_pg_size - 1);
+}
 
-               if (ret != DCMD_SUCCESS)
-                       return;
 
-               if (instance->pd_list[pd_index].driveState == MR_PD_STATE_SYSTEM) {
+/*
+ * megasas_set_static_target_properties -
+ * Device property set by driver are static and it is not required to be
+ * updated after OCR.
+ *
+ * set io timeout
+ * set device queue depth
+ * set nvme device properties. see - megasas_set_nvme_device_properties
+ *
+ * @sdev:                              scsi device
+ *
+ */
+static void megasas_set_static_target_properties(struct scsi_device *sdev)
+{
+       u16     target_index = 0;
+       u8 interface_type;
+       u32 device_qd = MEGASAS_DEFAULT_CMD_PER_LUN;
+       u32 max_io_size_kb = MR_DEFAULT_NVME_MDTS_KB;
+       struct megasas_instance *instance;
+       struct MR_PRIV_DEVICE *mr_device_priv_data;
 
-                       switch (instance->pd_list[pd_index].interface) {
-                       case SAS_PD:
-                               scsi_change_queue_depth(sdev, MEGASAS_SAS_QD);
-                               break;
+       instance = megasas_lookup_instance(sdev->host->host_no);
+       mr_device_priv_data = sdev->hostdata;
+       interface_type  = mr_device_priv_data->interface_type;
 
-                       case SATA_PD:
-                               scsi_change_queue_depth(sdev, MEGASAS_SATA_QD);
-                               break;
+       /*
+        * The RAID firmware may require extended timeouts.
+        */
+       blk_queue_rq_timeout(sdev->request_queue, scmd_timeout * HZ);
 
-                       default:
-                               scsi_change_queue_depth(sdev, MEGASAS_DEFAULT_PD_QD);
-                       }
-               }
+       target_index = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id;
+
+       switch (interface_type) {
+       case SAS_PD:
+               device_qd = MEGASAS_SAS_QD;
+               break;
+       case SATA_PD:
+               device_qd = MEGASAS_SATA_QD;
+               break;
+       case NVME_PD:
+               device_qd = MEGASAS_NVME_QD;
+               break;
        }
+
+       if (instance->nvme_page_size && max_io_size_kb)
+               megasas_set_nvme_device_properties(sdev, (max_io_size_kb << 10));
+
+       scsi_change_queue_depth(sdev, device_qd);
+
 }
 
 
                                return -ENXIO;
                }
        }
-       megasas_set_device_queue_depth(sdev);
-       megasas_update_sdev_properties(sdev);
 
-       /*
-        * The RAID firmware may require extended timeouts.
-        */
-       blk_queue_rq_timeout(sdev->request_queue,
-               scmd_timeout * HZ);
+       mutex_lock(&instance->hba_mutex);
+       /* Send DCMD to Firmware and cache the information */
+       if ((instance->pd_info) && !MEGASAS_IS_LOGICAL(sdev))
+               megasas_get_pd_info(instance, sdev);
+
+       megasas_set_static_target_properties(sdev);
+
+       mutex_unlock(&instance->hba_mutex);
+
+       /* This sdev property may change post OCR */
+       megasas_set_dynamic_target_properties(sdev);
 
        return 0;
 }
                return INITIATE_OCR;
 }
 
-static int
-megasas_get_pd_info(struct megasas_instance *instance, u16 device_id)
+static void
+megasas_get_pd_info(struct megasas_instance *instance, struct scsi_device *sdev)
 {
        int ret;
        struct megasas_cmd *cmd;
        struct megasas_dcmd_frame *dcmd;
 
+       struct MR_PRIV_DEVICE *mr_device_priv_data;
+       u16 device_id = 0;
+
+       device_id = (sdev->channel * MEGASAS_MAX_DEV_PER_CHANNEL) + sdev->id;
        cmd = megasas_get_cmd(instance);
 
        if (!cmd) {
                dev_err(&instance->pdev->dev, "Failed to get cmd %s\n", __func__);
-               return -ENOMEM;
+               return;
        }
 
        dcmd = &cmd->frame->dcmd;
 
        switch (ret) {
        case DCMD_SUCCESS:
-               instance->pd_list[device_id].interface =
+               mr_device_priv_data = sdev->hostdata;
+               le16_to_cpus((u16 *)&instance->pd_info->state.ddf.pdType);
+               mr_device_priv_data->interface_type =
                                instance->pd_info->state.ddf.pdType.intf;
                break;
 
        if (ret != DCMD_TIMEOUT)
                megasas_return_cmd(instance, cmd);
 
-       return ret;
+       return;
 }
 /*
  * megasas_get_pd_list_info -  Returns FW's pd_list structure
 static int megasas_init_fw(struct megasas_instance *instance)
 {
        u32 max_sectors_1;
-       u32 max_sectors_2;
-       u32 tmp_sectors, msix_enable, scratch_pad_2, scratch_pad_3;
+       u32 max_sectors_2, tmp_sectors, msix_enable;
+       u32 scratch_pad_2, scratch_pad_3, scratch_pad_4;
        resource_size_t base_addr;
        struct megasas_register_set __iomem *reg_set;
        struct megasas_ctrl_info *ctrl_info = NULL;
        if (instance->instancet->init_adapter(instance))
                goto fail_init_adapter;
 
+       if (instance->is_ventura) {
+               scratch_pad_4 =
+                       readl(&instance->reg_set->outbound_scratch_pad_4);
+               if ((scratch_pad_4 & MR_NVME_PAGE_SIZE_MASK) >=
+                       MR_DEFAULT_NVME_PAGE_SHIFT)
+                       instance->nvme_page_size =
+                               (1 << (scratch_pad_4 & MR_NVME_PAGE_SIZE_MASK));
+
+               dev_info(&instance->pdev->dev,
+                        "NVME page size\t: (%d)\n", instance->nvme_page_size);
+       }
+
        if (instance->msix_vectors ?
                megasas_setup_irqs_msix(instance, 1) :
                megasas_setup_irqs_ioapic(instance))