lpfc 8.3.6 : FC Protocol Fixes
Subsystems (2)
PATCH 2/6 lpfc 8.3.6 : FC Protocol Fixes
FC protocol fixes.
- Fix send sequence logic to handle multi SGL IOCBs.
- Fix FDISC completion always setting VPORT state to failed.
- Ported the fix on reporting of max_vpi to uppper layer.
- Fix incorrect number of Vports allowed to be created.
- Fixed Dead FCoE port after creating vports.
- Added handling of ELS request for Reinstate Recovery Qualifier (RRQ)
- Handle unsolicited CT exchange initiator receiving CT exchange ABTS
- Migrate LUN queue depth ramp up code to scsi mid-layer.
- Made ABTS WQE go to the same WQ as the WQE to be aborted.
- Fix Vport does not rediscover after FCF goes away.
- Fixed lpfc_unreg_vfi failure after devloss timeout.
- Fixed RPI bit leak.
- Fix hbq pointer corruption during target discovery.
---
lpfc.h | 1 lpfc_disc.h | 2 lpfc_els.c | 40 +++++++++++++--- lpfc_hw.h | 2 lpfc_hw4.h | 23 ++++++++- lpfc_init.c | 3 - lpfc_nportdisc.c | 7 ++ lpfc_scsi.c | 135 +++++++++++++++++++++---------------------------------- lpfc_sli.c | 133 +++++++++++++++++++++++++++++++++++++++++++----------- lpfc_sli.h | 1 lpfc_sli4.h | 5 ++ lpfc_vport.c | 2 12 files changed, 235 insertions(+), 119 deletions(-)
drivers/scsi/lpfc/lpfc_disc.h +0 -2
@@ -105,8 +105,6 @@ struct lpfc_nodelist {struct lpfc_vport *vport;struct lpfc_work_evt els_retry_evt;struct lpfc_work_evt dev_loss_evt; -unsigned long last_ramp_up_time;/* jiffy of last ramp up */ -unsigned long last_q_full_time;/* jiffy of last queue full */ struct kref kref;atomic_t cmd_pending;uint32_t cmd_qdepth;
drivers/scsi/lpfc/lpfc_els.c +34 -6
@@ -4521,6 +4521,29 @@ lpfc_els_rcv_lirr(struct lpfc_vport *vpo }/** +* lpfc_els_rcv_rrq - Process an unsolicited rrq iocb +* @vport: pointer to a host virtual N_Port data structure. +* @cmdiocb: pointer to lpfc command iocb data structure. +* @ndlp: pointer to a node-list data structure. +* +* This routine processes a Reinstate Recovery Qualifier (RRQ) IOCB +* received as an ELS unsolicited event. A request to RRQ shall only +* be accepted if the Originator Nx_Port N_Port_ID or the Responder +* Nx_Port N_Port_ID of the target Exchange is the same as the +* N_Port_ID of the Nx_Port that makes the request. If the RRQ is +* not accepted, an LS_RJT with reason code "Unable to perform +* command request" and reason code explanation "Invalid Originator +* S_ID" shall be returned. For now, we just unconditionally accept +* RRQ from the target. +**/ +static void +lpfc_els_rcv_rrq (struct lpfc_vport *vport,struct lpfc_iocbq *cmdiocb, +struct lpfc_nodelist *ndlp) +{ +lpfc_els_rsp_acc (vport,ELS_CMD_ACC , cmdiocb, ndlp,NULL ); +} + +/** * lpfc_els_rsp_rps_acc - Completion callbk func for MBX_READ_LNK_STAT mbox cmd * @phba: pointer to lpfc hba data structure. * @pmb: pointer to the driver internal queue element for mailbox command.
@@ -5636,6 +5659,16 @@ lpfc_els_unsol_buffer(struct lpfc_hba *pif (newnode)lpfc_nlp_put (ndlp);break ; +case ELS_CMD_RRQ : +lpfc_debugfs_disc_trc (vport,LPFC_DISC_TRC_ELS_UNSOL , +"RCV RRQ: did:x%x/ste:x%x flg:x%x" , + did, vport->port_state, ndlp->nlp_flag); + + phba->fc_stat.elsRcvRRQ++; +lpfc_els_rcv_rrq (vport, elsiocb, ndlp); +if (newnode) +lpfc_nlp_put (ndlp); +break ;default : lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, "RCV ELS cmd: cmd:x%x did:x%x/ste:x%x",
@@ -6042,11 +6075,6 @@ lpfc_cmpl_els_fdisc(struct lpfc_hba *phb irsp->ulpStatus, irsp->un.ulpWord[4]); goto fdisc_failed; } -if (vport->fc_vport->vport_state ==FC_VPORT_INITIALIZING ) -lpfc_vport_set_state (vport,FC_VPORT_FAILED ); -lpfc_nlp_put (ndlp); -/* giving up on FDISC. Cancel discovery timer */ -lpfc_can_disctmo (vport);spin_lock_irq (shost->host_lock); vport->fc_flag |=FC_FABRIC ;if (vport->phba->fc_topology ==TOPOLOGY_LOOP )
@@ -6125,6 +6153,7 @@ lpfc_issue_els_fdisc(struct lpfc_vport *int did = ndlp->nlp_DID;int rc; + vport->port_state =LPFC_FDISC ; cmdsize = (sizeof (uint32_t ) +sizeof (struct serv_parm )); elsiocb =lpfc_prep_els_iocb (vport,1 , cmdsize, retry, ndlp, did,ELS_CMD_FDISC );
@@ -6190,7 +6219,6 @@ lpfc_issue_els_fdisc(struct lpfc_vport *return 1 ; }lpfc_vport_set_state (vport,FC_VPORT_INITIALIZING ); - vport->port_state =LPFC_FDISC ;return 0 ; }
drivers/scsi/lpfc/lpfc.h +1 -0
@@ -202,6 +202,7 @@ struct lpfc_stats {uint32_t elsRcvLIRR;uint32_t elsRcvRPS;uint32_t elsRcvRPL; +uint32_t elsRcvRRQ;uint32_t elsXmitFLOGI;uint32_t elsXmitFDISC;uint32_t elsXmitPLOGI;
drivers/scsi/lpfc/lpfc_hw4.h +22 -1
@@ -194,6 +194,26 @@ struct lpfc_sli4_flags {#define lpfc_fip_flag_WORD word0 }; +struct sli4_bls_acc { +uint32_t word0_rsvd;/* Word0 must be reserved */ +uint32_t word1; +#define lpfc_abts_orig_SHIFT 0 +#define lpfc_abts_orig_MASK 0x00000001 +#define lpfc_abts_orig_WORD word1 +#define LPFC_ABTS_UNSOL_RSP 1 +#define LPFC_ABTS_UNSOL_INT 0 +uint32_t word2; +#define lpfc_abts_rxid_SHIFT 0 +#define lpfc_abts_rxid_MASK 0x0000FFFF +#define lpfc_abts_rxid_WORD word2 +#define lpfc_abts_oxid_SHIFT 16 +#define lpfc_abts_oxid_MASK 0x0000FFFF +#define lpfc_abts_oxid_WORD word2 +uint32_t word3; +uint32_t word4; +uint32_t word5_rsvd;/* Word5 must be reserved */ +}; +/* event queue entry structure */ struct lpfc_eqe {uint32_t word0;
@@ -1980,7 +2000,8 @@ struct lpfc_bmbx_create {#define SGL_ALIGN_SZ 64#define SGL_PAGE_SIZE 4096/* align SGL addr on a size boundary - adjust address up */ -#define NO_XRI ((uint16_t)-1) +#define NO_XRI ((uint16_t)-1) +struct wqe_common {uint32_t word6;#define wqe_xri_tag_SHIFT 0
drivers/scsi/lpfc/lpfc_hw.h +1 -1
@@ -3538,7 +3538,7 @@ typedef struct _IOCB { /* IOCB structureASYNCSTAT_FIELDS asyncstat;/* async_status iocb */ QUE_XRI64_CX_FIELDS quexri64cx;/* que_xri64_cx fields */ struct rcv_seq64 rcvseq64;/* RCV_SEQ64 and RCV_CONT64 */ - +struct sli4_bls_acc bls_acc;/* UNSOL ABTS BLS_ACC params */ uint32_t ulpWord[IOCB_WORD_SZ -2 ];/* generic 6 'words' */ } un;union {
drivers/scsi/lpfc/lpfc_init.c +2 -1
@@ -4931,7 +4931,8 @@ lpfc_sli4_read_config(struct lpfc_hba *p phba->vpi_base = phba->sli4_hba.max_cfg_param.vpi_base; phba->vfi_base = phba->sli4_hba.max_cfg_param.vfi_base; phba->sli4_hba.next_rpi = phba->sli4_hba.max_cfg_param.rpi_base; - phba->max_vpi = phba->sli4_hba.max_cfg_param.max_vpi; + phba->max_vpi = (phba->sli4_hba.max_cfg_param.max_vpi >0 ) ? + (phba->sli4_hba.max_cfg_param.max_vpi -1 ) :0 ; phba->max_vports = phba->max_vpi;lpfc_printf_log (phba,KERN_INFO ,LOG_SLI , "2003 cfg params XRI(B:%d M:%d), "
drivers/scsi/lpfc/lpfc_nportdisc.c +7 -0
@@ -1223,6 +1223,12 @@ lpfc_rcv_logo_reglogin_issue(struct lpfclist_for_each_entry_safe (mb, nextmb, &phba->sli.mboxq, list) {if ((mb->u.mb.mbxCommand ==MBX_REG_LOGIN64 ) && (ndlp == (struct lpfc_nodelist *) mb->context2)) { +if (phba->sli_rev ==LPFC_SLI_REV4 ) { +spin_unlock_irq (&phba->hbalock); +lpfc_sli4_free_rpi (phba, + mb->u.mb.un.varRegLogin.rpi); +spin_lock_irq (&phba->hbalock); + } mp = (struct lpfc_dmabuf *) (mb->context1);if (mp) {__lpfc_mbuf_free (phba, mp->virt, mp->phys);
@@ -1230,6 +1236,7 @@ lpfc_rcv_logo_reglogin_issue(struct lpfc }lpfc_nlp_put (ndlp);list_del (&mb->list); + phba->sli.mboxq_cnt--;mempool_free (mb, phba->mbox_mem_pool); } }
drivers/scsi/lpfc/lpfc_scsi.c +53 -82
218 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_sli4.h +5 -0
@@ -63,6 +63,11 @@ (fc_hdr)->fh_s_id[1] << 8 | \ (fc_hdr)->fh_s_id[2]) +#define sli4_fctl_from_fc_hdr (fc_hdr) \ + ((fc_hdr)->fh_f_ctl[0] << 16 | \ + (fc_hdr)->fh_f_ctl[1] << 8 | \ + (fc_hdr)->fh_f_ctl[2]) +enum lpfc_sli4_queue_type {LPFC_EQ ,LPFC_GCQ ,
drivers/scsi/lpfc/lpfc_sli.c +107 -26
274 lines not on this page · raw message
drivers/scsi/lpfc/lpfc_sli.h +1 -0
@@ -66,6 +66,7 @@ struct lpfc_iocbq {uint8_t abort_count;uint8_t rsvd2;uint32_t drvrTimeout;/* driver timeout in seconds */ +uint32_t fcp_wqidx;/* index to FCP work queue */ struct lpfc_vport *vport;/* virtual port pointer */ void *context1;/* caller context information */ void *context2;/* caller context information */
drivers/scsi/lpfc/lpfc_vport.c +2 -0
@@ -700,6 +700,8 @@ lpfc_vport_delete(struct fc_vport *fc_vp }spin_unlock_irq (&phba->ndlp_lock); } +if (vport->vpi_state !=LPFC_VPI_REGISTERED ) + goto skip_logo; vport->unreg_vpi_cmpl =VPORT_INVAL ; timeout =msecs_to_jiffies (phba->fc_ratov *2000 );if (!lpfc_issue_els_npiv_logo (vport, ndlp))