lpfc 8.3.2 : Addition of SLI4 Interface - FCOE Discovery support
Subsystems (2)
PATCH 13/17 lpfc 8.3.2 : Addition of SLI4 Interface - FCOE Discovery support
Addition of SLI4 Interface - FCOE Discovery support
SLI4 supports both FC and FCOE, with some extended topology objects. This patch adss support for the objects, and updates the disovery engines for their use.
Signed-off-by James Smart <[email protected]>
---
lpfc_attr.c | 32 - lpfc_crtn.h | 3 lpfc_els.c | 179 ++++++++- lpfc_hbadisc.c | 1055 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- lpfc_nportdisc.c | 34 + lpfc_sli.c | 517 ++++++++++++++++++++++++++ 6 files changed, 1756 insertions(+), 64 deletions(-)
drivers/scsi/lpfc/lpfc_attr.c +13 -19
@@ -2924,6 +2924,14 @@ LPFC_ATTR_R(enable_hba_heartbeat, 1, 0,*/ LPFC_ATTR_R (enable_bg,0 ,0 ,1 ,"Enable BlockGuard Support" ); +/* +# lpfc_enable_fip: When set, FIP is required to start discovery. If not +# set, the driver will add an FCF record manually if the port has no +# FCF records available and start discovery. +# Value range is [0,1]. Default value is 1 (enabled) +*/ +LPFC_ATTR_RW (enable_fip,0 ,0 ,1 ,"Enable FIP Discovery" ); +/* # lpfc_prot_mask: i
@@ -2990,6 +2998,7 @@ struct device_attribute *lpfc_hba_attrs[ &dev_attr_lpfc_peer_port_login, &dev_attr_lpfc_nodev_tmo, &dev_attr_lpfc_devloss_tmo, + &dev_attr_lpfc_enable_fip, &dev_attr_lpfc_fcp_class, &dev_attr_lpfc_use_adisc, &dev_attr_lpfc_ack0,
@@ -3042,6 +3051,7 @@ struct device_attribute *lpfc_vport_attr &dev_attr_lpfc_lun_queue_depth, &dev_attr_lpfc_nodev_tmo, &dev_attr_lpfc_devloss_tmo, + &dev_attr_lpfc_enable_fip, &dev_attr_lpfc_hba_queue_depth, &dev_attr_lpfc_peer_port_login, &dev_attr_lpfc_restrict_login,
@@ -4167,26 +4177,10 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) phba->cfg_soft_wwpn =0L ;lpfc_sg_seg_cnt_init (phba, lpfc_sg_seg_cnt);lpfc_prot_sg_seg_cnt_init (phba, lpfc_prot_sg_seg_cnt); -/* -* Since the sg_tablesize is module parameter, the sg_dma_buf_size -* used to create the sg_dma_buf_pool must be dynamically calculated. -* 2 segments are added since the IOCB needs a command and response bde. -*/ - phba->cfg_sg_dma_buf_size =sizeof (struct fcp_cmnd ) + -sizeof (struct fcp_rsp ) + - ((phba->cfg_sg_seg_cnt +2 ) *sizeof (struct ulp_bde64 )); - -if (phba->cfg_enable_bg) { - phba->cfg_sg_seg_cnt =LPFC_MAX_SG_SEG_CNT ; - phba->cfg_sg_dma_buf_size += - phba->cfg_prot_sg_seg_cnt *sizeof (struct ulp_bde64 ); - } - -/* Also reinitialize the host templates with new values. */ - lpfc_vport_template.sg_tablesize = phba->cfg_sg_seg_cnt; - lpfc_template.sg_tablesize = phba->cfg_sg_seg_cnt; -lpfc_hba_queue_depth_init (phba, lpfc_hba_queue_depth); +lpfc_enable_fip_init (phba, lpfc_enable_fip); +lpfc_hba_log_verbose_init (phba, lpfc_log_verbose); +return ; }
drivers/scsi/lpfc/lpfc_crtn.h +3 -0
@@ -23,6 +23,8 @@ typedef int (*node_filter)(struct lpfc_nstruct fc_rport ;void lpfc_dump_mem (struct lpfc_hba *,LPFC_MBOXQ_t *,uint16_t );void lpfc_dump_wakeup_param (struct lpfc_hba *,LPFC_MBOXQ_t *); +void lpfc_dump_static_vport (struct lpfc_hba *,LPFC_MBOXQ_t *,uint16_t ); +int lpfc_dump_fcoe_param (struct lpfc_hba *,struct lpfcMboxq *);void lpfc_read_nv (struct lpfc_hba *,LPFC_MBOXQ_t *);void lpfc_config_async (struct lpfc_hba *,LPFC_MBOXQ_t *,uint32_t );
@@ -108,6 +110,7 @@ int lpfc_issue_els_adisc(struct lpfc_vpoint lpfc_issue_els_logo (struct lpfc_vport *,struct lpfc_nodelist *,uint8_t );int lpfc_issue_els_npiv_logo (struct lpfc_vport *,struct lpfc_nodelist *);int lpfc_issue_els_scr (struct lpfc_vport *,uint32_t ,uint8_t ); +int lpfc_issue_fabric_reglogin (struct lpfc_vport *);int lpfc_els_free_iocb (struct lpfc_hba *,struct lpfc_iocbq *);int lpfc_ct_free_iocb (struct lpfc_hba *,struct lpfc_iocbq *); int lpfc_els_rsp_acc(struct lpfc_vport *, uint32_t, struct lpfc_iocbq *,
drivers/scsi/lpfc/lpfc_els.c +156 -23
259 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_hbadisc.c +1040 -15
1,132 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_nportdisc.c +27 -7
@@ -363,7 +363,7 @@ lpfc_rcv_plogi(struct lpfc_vport *vport,if (!mbox) goto out; - rc =lpfc_reg_login (phba, vport->vpi, icmd->un.rcvels.remoteID, + rc =lpfc_reg_rpi (phba, vport->vpi, icmd->un.rcvels.remoteID, (uint8_t *) sp, mbox,0 );if (rc) {mempool_free (mbox, phba->mbox_mem_pool);
@@ -497,11 +497,19 @@ lpfc_rcv_logo(struct lpfc_vport *vport,lpfc_els_rsp_acc (vport,ELS_CMD_PRLO , cmdiocb, ndlp,NULL ); elselpfc_els_rsp_acc (vport ,ELS_CMD_ACC ,cmdiocb ,ndlp ,NULL ); +if ((ndlp->nlp_type &NLP_FABRIC ) && + vport->port_type ==LPFC_NPIV_PORT ) { +lpfc_linkdown_port (vport); +mod_timer (&ndlp->nlp_delayfunc, jiffies +HZ *1 ); +spin_lock_irq (shost->host_lock); + ndlp->nlp_flag |=NLP_DELAY_TMO ; +spin_unlock_irq (shost->host_lock); -if ((!(ndlp->nlp_type &NLP_FABRIC ) && - ((ndlp->nlp_type &NLP_FCP_TARGET ) || - !(ndlp->nlp_type &NLP_FCP_INITIATOR ))) || - (ndlp->nlp_state ==NLP_STE_ADISC_ISSUE )) { + ndlp->nlp_last_elscmd =ELS_CMD_FDISC ; + }else if ((!(ndlp->nlp_type &NLP_FABRIC ) && + ((ndlp->nlp_type &NLP_FCP_TARGET ) || + !(ndlp->nlp_type &NLP_FCP_INITIATOR ))) || + (ndlp->nlp_state ==NLP_STE_ADISC_ISSUE )) {/* Only try to re-login if this is NOT a Fabric Node */ mod_timer (&ndlp->nlp_delayfunc, jiffies +HZ *1 );spin_lock_irq (shost->host_lock);
@@ -569,7 +577,7 @@ lpfc_disc_set_adisc(struct lpfc_vport *v {struct Scsi_Host *shost =lpfc_shost_from_vport (vport); -if (!ndlp->nlp_rpi) { +if (!(ndlp->nlp_flag &NLP_RPI_VALID )) { ndlp->nlp_flag &= ~NLP_NPR_ADISC ;return 0 ; }
@@ -859,7 +867,7 @@ lpfc_cmpl_plogi_plogi_issue(struct lpfc_lpfc_unreg_rpi (vport, ndlp); -if (lpfc_reg_login (phba, vport->vpi, irsp->un.elsreq64.remoteID, +if (lpfc_reg_rpi (phba, vport->vpi, irsp->un.elsreq64.remoteID, (uint8_t *) sp, mbox,0 ) ==0 ) {switch (ndlp->nlp_DID) {case NameServer_DID:
@@ -1070,6 +1078,7 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_struct lpfc_iocbq *cmdiocb, *rspiocb;IOCB_t *irsp;ADISC *ap; +int rc; cmdiocb = (struct lpfc_iocbq *) arg; rspiocb = cmdiocb->context_un.rsp_iocb;
@@ -1095,6 +1104,15 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_return ndlp->nlp_state; } +if (phba->sli_rev ==LPFC_SLI_REV4 ) { + rc =lpfc_sli4_resume_rpi (ndlp); +if (rc) { +/* Stay in state and retry. */ + ndlp->nlp_prev_state =NLP_STE_ADISC_ISSUE ; +return ndlp->nlp_state; + } + } +if (ndlp->nlp_type &NLP_FCP_TARGET ) { ndlp->nlp_prev_state =NLP_STE_ADISC_ISSUE ;lpfc_nlp_set_state (vport, ndlp,NLP_STE_MAPPED_NODE );
@@ -1102,6 +1120,7 @@ lpfc_cmpl_adisc_adisc_issue(struct lpfc_ ndlp->nlp_prev_state =NLP_STE_ADISC_ISSUE ;lpfc_nlp_set_state (vport, ndlp,NLP_STE_UNMAPPED_NODE ); } +return ndlp->nlp_state; }
@@ -1285,6 +1304,7 @@ lpfc_cmpl_reglogin_reglogin_issue(struct } ndlp->nlp_rpi = mb->un.varWords[0 ]; + ndlp->nlp_flag |=NLP_RPI_VALID ;/* Only if we are not a fabric nport do we issue PRLI */ if (!(ndlp->nlp_type &NLP_FABRIC )) {
drivers/scsi/lpfc/lpfc_sli.c +517 -0
520 lines not on this page · raw message