[SCSI] lpfc 8.3.41: Add first burst support to driver
Signed-off-by: James Smart <james.smart@emulex.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
71157c9eb2
commit
3cb01c57c9
|
@ -421,6 +421,7 @@ struct lpfc_vport {
|
||||||
uint32_t cfg_enable_da_id;
|
uint32_t cfg_enable_da_id;
|
||||||
uint32_t cfg_max_scsicmpl_time;
|
uint32_t cfg_max_scsicmpl_time;
|
||||||
uint32_t cfg_tgt_queue_depth;
|
uint32_t cfg_tgt_queue_depth;
|
||||||
|
uint32_t cfg_first_burst_size;
|
||||||
|
|
||||||
uint32_t dev_loss_tmo_changed;
|
uint32_t dev_loss_tmo_changed;
|
||||||
|
|
||||||
|
|
|
@ -3949,6 +3949,14 @@ LPFC_VPORT_ATTR_R(fcp_class, 3, 2, 3,
|
||||||
LPFC_VPORT_ATTR_RW(use_adisc, 0, 0, 1,
|
LPFC_VPORT_ATTR_RW(use_adisc, 0, 0, 1,
|
||||||
"Use ADISC on rediscovery to authenticate FCP devices");
|
"Use ADISC on rediscovery to authenticate FCP devices");
|
||||||
|
|
||||||
|
/*
|
||||||
|
# lpfc_first_burst_size: First burst size to use on the NPorts
|
||||||
|
# that support first burst.
|
||||||
|
# Value range is [0,65536]. Default value is 0.
|
||||||
|
*/
|
||||||
|
LPFC_VPORT_ATTR_RW(first_burst_size, 0, 0, 65536,
|
||||||
|
"First burst size for Targets that support first burst");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
# lpfc_max_scsicmpl_time: Use scsi command completion time to control I/O queue
|
# lpfc_max_scsicmpl_time: Use scsi command completion time to control I/O queue
|
||||||
# depth. Default value is 0. When the value of this parameter is zero the
|
# depth. Default value is 0. When the value of this parameter is zero the
|
||||||
|
@ -4277,6 +4285,7 @@ struct device_attribute *lpfc_hba_attrs[] = {
|
||||||
&dev_attr_lpfc_devloss_tmo,
|
&dev_attr_lpfc_devloss_tmo,
|
||||||
&dev_attr_lpfc_fcp_class,
|
&dev_attr_lpfc_fcp_class,
|
||||||
&dev_attr_lpfc_use_adisc,
|
&dev_attr_lpfc_use_adisc,
|
||||||
|
&dev_attr_lpfc_first_burst_size,
|
||||||
&dev_attr_lpfc_ack0,
|
&dev_attr_lpfc_ack0,
|
||||||
&dev_attr_lpfc_topology,
|
&dev_attr_lpfc_topology,
|
||||||
&dev_attr_lpfc_scan_down,
|
&dev_attr_lpfc_scan_down,
|
||||||
|
@ -4353,6 +4362,7 @@ struct device_attribute *lpfc_vport_attrs[] = {
|
||||||
&dev_attr_lpfc_restrict_login,
|
&dev_attr_lpfc_restrict_login,
|
||||||
&dev_attr_lpfc_fcp_class,
|
&dev_attr_lpfc_fcp_class,
|
||||||
&dev_attr_lpfc_use_adisc,
|
&dev_attr_lpfc_use_adisc,
|
||||||
|
&dev_attr_lpfc_first_burst_size,
|
||||||
&dev_attr_lpfc_fdmi_on,
|
&dev_attr_lpfc_fdmi_on,
|
||||||
&dev_attr_lpfc_max_luns,
|
&dev_attr_lpfc_max_luns,
|
||||||
&dev_attr_nport_evt_cnt,
|
&dev_attr_nport_evt_cnt,
|
||||||
|
@ -5332,6 +5342,7 @@ lpfc_get_vport_cfgparam(struct lpfc_vport *vport)
|
||||||
lpfc_restrict_login_init(vport, lpfc_restrict_login);
|
lpfc_restrict_login_init(vport, lpfc_restrict_login);
|
||||||
lpfc_fcp_class_init(vport, lpfc_fcp_class);
|
lpfc_fcp_class_init(vport, lpfc_fcp_class);
|
||||||
lpfc_use_adisc_init(vport, lpfc_use_adisc);
|
lpfc_use_adisc_init(vport, lpfc_use_adisc);
|
||||||
|
lpfc_first_burst_size_init(vport, lpfc_first_burst_size);
|
||||||
lpfc_max_scsicmpl_time_init(vport, lpfc_max_scsicmpl_time);
|
lpfc_max_scsicmpl_time_init(vport, lpfc_max_scsicmpl_time);
|
||||||
lpfc_fdmi_on_init(vport, lpfc_fdmi_on);
|
lpfc_fdmi_on_init(vport, lpfc_fdmi_on);
|
||||||
lpfc_discovery_threads_init(vport, lpfc_discovery_threads);
|
lpfc_discovery_threads_init(vport, lpfc_discovery_threads);
|
||||||
|
|
|
@ -154,6 +154,7 @@ struct lpfc_node_rrq {
|
||||||
#define NLP_NODEV_REMOVE 0x08000000 /* Defer removal till discovery ends */
|
#define NLP_NODEV_REMOVE 0x08000000 /* Defer removal till discovery ends */
|
||||||
#define NLP_TARGET_REMOVE 0x10000000 /* Target remove in process */
|
#define NLP_TARGET_REMOVE 0x10000000 /* Target remove in process */
|
||||||
#define NLP_SC_REQ 0x20000000 /* Target requires authentication */
|
#define NLP_SC_REQ 0x20000000 /* Target requires authentication */
|
||||||
|
#define NLP_FIRSTBURST 0x40000000 /* Target supports FirstBurst */
|
||||||
#define NLP_RPI_REGISTERED 0x80000000 /* nlp_rpi is valid */
|
#define NLP_RPI_REGISTERED 0x80000000 /* nlp_rpi is valid */
|
||||||
|
|
||||||
/* ndlp usage management macros */
|
/* ndlp usage management macros */
|
||||||
|
|
|
@ -2122,6 +2122,8 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||||
}
|
}
|
||||||
npr->estabImagePair = 1;
|
npr->estabImagePair = 1;
|
||||||
npr->readXferRdyDis = 1;
|
npr->readXferRdyDis = 1;
|
||||||
|
if (vport->cfg_first_burst_size)
|
||||||
|
npr->writeXferRdyDis = 1;
|
||||||
|
|
||||||
/* For FCP support */
|
/* For FCP support */
|
||||||
npr->prliType = PRLI_FCP_TYPE;
|
npr->prliType = PRLI_FCP_TYPE;
|
||||||
|
|
|
@ -690,11 +690,15 @@ lpfc_rcv_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||||
|
|
||||||
ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);
|
ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);
|
||||||
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||||
|
ndlp->nlp_flag &= ~NLP_FIRSTBURST;
|
||||||
if (npr->prliType == PRLI_FCP_TYPE) {
|
if (npr->prliType == PRLI_FCP_TYPE) {
|
||||||
if (npr->initiatorFunc)
|
if (npr->initiatorFunc)
|
||||||
ndlp->nlp_type |= NLP_FCP_INITIATOR;
|
ndlp->nlp_type |= NLP_FCP_INITIATOR;
|
||||||
if (npr->targetFunc)
|
if (npr->targetFunc) {
|
||||||
ndlp->nlp_type |= NLP_FCP_TARGET;
|
ndlp->nlp_type |= NLP_FCP_TARGET;
|
||||||
|
if (npr->writeXferRdyDis)
|
||||||
|
ndlp->nlp_flag |= NLP_FIRSTBURST;
|
||||||
|
}
|
||||||
if (npr->Retry)
|
if (npr->Retry)
|
||||||
ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
|
ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
|
||||||
}
|
}
|
||||||
|
@ -1676,12 +1680,16 @@ lpfc_cmpl_prli_prli_issue(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||||
/* Check out PRLI rsp */
|
/* Check out PRLI rsp */
|
||||||
ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);
|
ndlp->nlp_type &= ~(NLP_FCP_TARGET | NLP_FCP_INITIATOR);
|
||||||
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
ndlp->nlp_fcp_info &= ~NLP_FCP_2_DEVICE;
|
||||||
|
ndlp->nlp_flag &= ~NLP_FIRSTBURST;
|
||||||
if ((npr->acceptRspCode == PRLI_REQ_EXECUTED) &&
|
if ((npr->acceptRspCode == PRLI_REQ_EXECUTED) &&
|
||||||
(npr->prliType == PRLI_FCP_TYPE)) {
|
(npr->prliType == PRLI_FCP_TYPE)) {
|
||||||
if (npr->initiatorFunc)
|
if (npr->initiatorFunc)
|
||||||
ndlp->nlp_type |= NLP_FCP_INITIATOR;
|
ndlp->nlp_type |= NLP_FCP_INITIATOR;
|
||||||
if (npr->targetFunc)
|
if (npr->targetFunc) {
|
||||||
ndlp->nlp_type |= NLP_FCP_TARGET;
|
ndlp->nlp_type |= NLP_FCP_TARGET;
|
||||||
|
if (npr->writeXferRdyDis)
|
||||||
|
ndlp->nlp_flag |= NLP_FIRSTBURST;
|
||||||
|
}
|
||||||
if (npr->Retry)
|
if (npr->Retry)
|
||||||
ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
|
ndlp->nlp_fcp_info |= NLP_FCP_2_DEVICE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4387,6 +4387,11 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd,
|
||||||
if (datadir == DMA_TO_DEVICE) {
|
if (datadir == DMA_TO_DEVICE) {
|
||||||
iocb_cmd->ulpCommand = CMD_FCP_IWRITE64_CR;
|
iocb_cmd->ulpCommand = CMD_FCP_IWRITE64_CR;
|
||||||
iocb_cmd->ulpPU = PARM_READ_CHECK;
|
iocb_cmd->ulpPU = PARM_READ_CHECK;
|
||||||
|
if (vport->cfg_first_burst_size &&
|
||||||
|
(pnode->nlp_flag & NLP_FIRSTBURST)) {
|
||||||
|
piocbq->iocb.un.fcpi.fcpi_XRdy =
|
||||||
|
vport->cfg_first_burst_size;
|
||||||
|
}
|
||||||
fcp_cmnd->fcpCntl3 = WRITE_DATA;
|
fcp_cmnd->fcpCntl3 = WRITE_DATA;
|
||||||
phba->fc4OutputRequests++;
|
phba->fc4OutputRequests++;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue