提交 3cb01c57 编写于 作者: J James Smart 提交者: James Bottomley

[SCSI] lpfc 8.3.41: Add first burst support to driver

Signed-off-by: NJames Smart <james.smart@emulex.com>
Signed-off-by: NJames Bottomley <JBottomley@Parallels.com>
上级 71157c9e
...@@ -421,6 +421,7 @@ struct lpfc_vport { ...@@ -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, ...@@ -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[] = { ...@@ -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[] = { ...@@ -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) ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册