#define NVME_PRLI_SP_INITIATOR  BIT_5
 #define NVME_PRLI_SP_TARGET     BIT_4
 #define NVME_PRLI_SP_DISCOVERY  BIT_3
+#define NVME_PRLI_SP_FIRST_BURST       BIT_0
        uint8_t nvme_flag;
+       uint32_t nvme_first_burst_size;
 #define NVME_FLAG_REGISTERED 4
 #define NVME_FLAG_DELETING 2
 #define NVME_FLAG_RESETTING 1
        uint16_t        fw_subminor_version;
        uint16_t        fw_attributes;
        uint16_t        fw_attributes_h;
+#define FW_ATTR_H_NVME_FBURST  BIT_1
 #define FW_ATTR_H_NVME         BIT_10
 #define FW_ATTR_H_NVME_UPDATED  BIT_14
 
                uint32_t        qpairs_req_created:1;
                uint32_t        qpairs_rsp_created:1;
                uint32_t        nvme_enabled:1;
+               uint32_t        nvme_first_burst:1;
        } flags;
 
        atomic_t        loop_state;
 
 
                ea->fcport->chip_reset = vha->hw->base_qpair->chip_reset;
                ea->fcport->logout_on_delete = 1;
+               ea->fcport->nvme_prli_service_param = ea->iop[0];
+               if (ea->iop[0] & NVME_PRLI_SP_FIRST_BURST)
+                       ea->fcport->nvme_first_burst_size =
+                           (ea->iop[1] & 0xffff) * 512;
+               else
+                       ea->fcport->nvme_first_burst_size = 0;
                qla24xx_post_gpdb_work(vha, ea->fcport, 0);
                break;
        default:
 
 
        logio->entry_type = LOGINOUT_PORT_IOCB_TYPE;
        logio->control_flags = cpu_to_le16(LCF_COMMAND_PRLI);
-       if (lio->u.logio.flags & SRB_LOGIN_NVME_PRLI)
+       if (lio->u.logio.flags & SRB_LOGIN_NVME_PRLI) {
                logio->control_flags |= LCF_NVME_PRLI;
+               if (sp->vha->flags.nvme_first_burst)
+                       logio->io_parameter[0] = NVME_PRLI_SP_FIRST_BURST;
+       }
 
        logio->nport_handle = cpu_to_le16(sp->fcport->loop_id);
        logio->port_id[0] = sp->fcport->d_id.b.al_pa;
 
 
                vha->hw->exch_starvation = 0;
                data[0] = MBS_COMMAND_COMPLETE;
+
+               if (sp->type == SRB_PRLI_CMD) {
+                       lio->u.logio.iop[0] =
+                           le32_to_cpu(logio->io_parameter[0]);
+                       lio->u.logio.iop[1] =
+                           le32_to_cpu(logio->io_parameter[1]);
+                       goto logio_done;
+               }
+
                if (sp->type != SRB_LOGIN_CMD)
                        goto logio_done;
 
 
                if ((ha->fw_attributes_h &
                    (FW_ATTR_H_NVME | FW_ATTR_H_NVME_UPDATED)) &&
                        ql2xnvmeenable) {
+                       if (ha->fw_attributes_h & FW_ATTR_H_NVME_FBURST)
+                               vha->flags.nvme_first_burst = 1;
+
                        vha->flags.nvme_enabled = 1;
                        ql_log(ql_log_info, vha, 0xd302,
                            "%s: FC-NVMe is Enabled (0x%x)\n",
        fcport->d_id.b.rsvd_1 = 0;
 
        if (fcport->fc4f_nvme) {
-               fcport->nvme_prli_service_param =
-                   pd->prli_nvme_svc_param_word_3;
                fcport->port_type = FCT_NVME;
        } else {
                /* If not target must be initiator or unknown type. */
 
 
        /* No data transfer how do we check buffer len == 0?? */
        if (fd->io_dir == NVMEFC_FCP_READ) {
-               cmd_pkt->control_flags =
-                   cpu_to_le16(CF_READ_DATA | CF_NVME_ENABLE);
+               cmd_pkt->control_flags = CF_READ_DATA;
                vha->qla_stats.input_bytes += fd->payload_length;
                vha->qla_stats.input_requests++;
        } else if (fd->io_dir == NVMEFC_FCP_WRITE) {
-               cmd_pkt->control_flags =
-                   cpu_to_le16(CF_WRITE_DATA | CF_NVME_ENABLE);
+               cmd_pkt->control_flags = CF_WRITE_DATA;
+               if ((vha->flags.nvme_first_burst) &&
+                   (sp->fcport->nvme_prli_service_param &
+                       NVME_PRLI_SP_FIRST_BURST)) {
+                       if ((fd->payload_length <=
+                           sp->fcport->nvme_first_burst_size) ||
+                               (sp->fcport->nvme_first_burst_size == 0))
+                               cmd_pkt->control_flags |=
+                                   CF_NVME_FIRST_BURST_ENABLE;
+               }
                vha->qla_stats.output_bytes += fd->payload_length;
                vha->qla_stats.output_requests++;
        } else if (fd->io_dir == 0) {
-               cmd_pkt->control_flags = cpu_to_le16(CF_NVME_ENABLE);
+               cmd_pkt->control_flags = 0;
        }
 
        /* Set NPORT-ID */
 
        uint64_t rsvd;
 
        uint16_t control_flags;         /* Control Flags */
-#define CF_NVME_ENABLE                  BIT_9
+#define CF_NVME_FIRST_BURST_ENABLE     BIT_11
 #define CF_DIF_SEG_DESCR_ENABLE         BIT_3
 #define CF_DATA_SEG_DESCR_ENABLE        BIT_2
 #define CF_READ_DATA                    BIT_1