diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_init.c')
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 142 | 
1 files changed, 17 insertions, 125 deletions
| diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 71f340dd4fbd..1e4c792bb660 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c @@ -1,7 +1,7 @@  /*******************************************************************   * This file is part of the Emulex Linux Device Driver for         *   * Fibre Channel Host Bus Adapters.                                * - * Copyright (C) 2017-2020 Broadcom. All Rights Reserved. The term * + * Copyright (C) 2017-2021 Broadcom. All Rights Reserved. The term *   * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries.  *   * Copyright (C) 2004-2016 Emulex.  All rights reserved.           *   * EMULEX and SLI are trademarks of Emulex.                        * @@ -1043,12 +1043,11 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba)  	 * driver is unloading or reposted if the driver is restarting  	 * the port.  	 */ -	spin_lock_irq(&phba->hbalock);  /* required for lpfc_els_sgl_list and */ -					/* scsl_buf_list */ +  	/* sgl_list_lock required because worker thread uses this  	 * list.  	 */ -	spin_lock(&phba->sli4_hba.sgl_list_lock); +	spin_lock_irq(&phba->sli4_hba.sgl_list_lock);  	list_for_each_entry(sglq_entry,  		&phba->sli4_hba.lpfc_abts_els_sgl_list, list)  		sglq_entry->state = SGL_FREED; @@ -1057,11 +1056,12 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba)  			&phba->sli4_hba.lpfc_els_sgl_list); -	spin_unlock(&phba->sli4_hba.sgl_list_lock); +	spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);  	/* abts_xxxx_buf_list_lock required because worker thread uses this  	 * list.  	 */ +	spin_lock_irq(&phba->hbalock);  	cnt = 0;  	for (idx = 0; idx < phba->cfg_hdw_queue; idx++) {  		qp = &phba->sli4_hba.hdwq[idx]; @@ -3552,7 +3552,7 @@ lpfc_offline_prep(struct lpfc_hba *phba, int mbx_action)  					lpfc_printf_vlog(vports[i], KERN_INFO,  						 LOG_NODE | LOG_DISCOVERY,  						 "0011 Free RPI x%x on " -						 "ndlp: %p did x%x\n", +						 "ndlp: x%px did x%x\n",  						 ndlp->nlp_rpi, ndlp,  						 ndlp->nlp_DID);  					lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi); @@ -3804,12 +3804,10 @@ lpfc_sli4_els_sgl_update(struct lpfc_hba *phba)  			sglq_entry->state = SGL_FREED;  			list_add_tail(&sglq_entry->list, &els_sgl_list);  		} -		spin_lock_irq(&phba->hbalock); -		spin_lock(&phba->sli4_hba.sgl_list_lock); +		spin_lock_irq(&phba->sli4_hba.sgl_list_lock);  		list_splice_init(&els_sgl_list,  				 &phba->sli4_hba.lpfc_els_sgl_list); -		spin_unlock(&phba->sli4_hba.sgl_list_lock); -		spin_unlock_irq(&phba->hbalock); +		spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);  	} else if (els_xri_cnt < phba->sli4_hba.els_xri_cnt) {  		/* els xri-sgl shrinked */  		xri_cnt = phba->sli4_hba.els_xri_cnt - els_xri_cnt; @@ -3817,8 +3815,7 @@ lpfc_sli4_els_sgl_update(struct lpfc_hba *phba)  				"3158 ELS xri-sgl count decreased from "  				"%d to %d\n", phba->sli4_hba.els_xri_cnt,  				els_xri_cnt); -		spin_lock_irq(&phba->hbalock); -		spin_lock(&phba->sli4_hba.sgl_list_lock); +		spin_lock_irq(&phba->sli4_hba.sgl_list_lock);  		list_splice_init(&phba->sli4_hba.lpfc_els_sgl_list,  				 &els_sgl_list);  		/* release extra els sgls from list */ @@ -3833,8 +3830,7 @@ lpfc_sli4_els_sgl_update(struct lpfc_hba *phba)  		}  		list_splice_init(&els_sgl_list,  				 &phba->sli4_hba.lpfc_els_sgl_list); -		spin_unlock(&phba->sli4_hba.sgl_list_lock); -		spin_unlock_irq(&phba->hbalock); +		spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);  	} else  		lpfc_printf_log(phba, KERN_INFO, LOG_SLI,  				"3163 ELS xri-sgl count unchanged: %d\n", @@ -6573,8 +6569,6 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)  	LPFC_MBOXQ_t *mboxq;  	MAILBOX_t *mb;  	int rc, i, max_buf_size; -	uint8_t pn_page[LPFC_MAX_SUPPORTED_PAGES] = {0}; -	struct lpfc_mqe *mqe;  	int longs;  	int extra;  	uint64_t wwn; @@ -6808,32 +6802,6 @@ lpfc_sli4_driver_resource_setup(struct lpfc_hba *phba)  	lpfc_nvme_mod_param_dep(phba); -	/* Get the Supported Pages if PORT_CAPABILITIES is supported by port. */ -	lpfc_supported_pages(mboxq); -	rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); -	if (!rc) { -		mqe = &mboxq->u.mqe; -		memcpy(&pn_page[0], ((uint8_t *)&mqe->un.supp_pages.word3), -		       LPFC_MAX_SUPPORTED_PAGES); -		for (i = 0; i < LPFC_MAX_SUPPORTED_PAGES; i++) { -			switch (pn_page[i]) { -			case LPFC_SLI4_PARAMETERS: -				phba->sli4_hba.pc_sli4_params.supported = 1; -				break; -			default: -				break; -			} -		} -		/* Read the port's SLI4 Parameters capabilities if supported. */ -		if (phba->sli4_hba.pc_sli4_params.supported) -			rc = lpfc_pc_sli4_params_get(phba, mboxq); -		if (rc) { -			mempool_free(mboxq, phba->mbox_mem_pool); -			rc = -EIO; -			goto out_free_bsmbx; -		} -	} -  	/*  	 * Get sli4 parameters that override parameters from Port capabilities.  	 * If this call fails, it isn't critical unless the SLI4 parameters come @@ -7388,11 +7356,9 @@ lpfc_free_els_sgl_list(struct lpfc_hba *phba)  	LIST_HEAD(sglq_list);  	/* Retrieve all els sgls from driver list */ -	spin_lock_irq(&phba->hbalock); -	spin_lock(&phba->sli4_hba.sgl_list_lock); +	spin_lock_irq(&phba->sli4_hba.sgl_list_lock);  	list_splice_init(&phba->sli4_hba.lpfc_els_sgl_list, &sglq_list); -	spin_unlock(&phba->sli4_hba.sgl_list_lock); -	spin_unlock_irq(&phba->hbalock); +	spin_unlock_irq(&phba->sli4_hba.sgl_list_lock);  	/* Now free the sgl list */  	lpfc_free_sgl_list(phba, &sglq_list); @@ -9660,8 +9626,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)  				"3250 QUERY_FW_CFG mailbox failed with status "  				"x%x add_status x%x, mbx status x%x\n",  				shdr_status, shdr_add_status, rc); -		if (rc != MBX_TIMEOUT) -			mempool_free(mboxq, phba->mbox_mem_pool); +		mempool_free(mboxq, phba->mbox_mem_pool);  		rc = -ENXIO;  		goto out_error;  	} @@ -9677,8 +9642,7 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba)  			"ulp1_mode:x%x\n", phba->sli4_hba.fw_func_mode,  			phba->sli4_hba.ulp0_mode, phba->sli4_hba.ulp1_mode); -	if (rc != MBX_TIMEOUT) -		mempool_free(mboxq, phba->mbox_mem_pool); +	mempool_free(mboxq, phba->mbox_mem_pool);  	/*  	 * Set up HBA Event Queues (EQs) @@ -10276,8 +10240,7 @@ lpfc_pci_function_reset(struct lpfc_hba *phba)  		shdr_status = bf_get(lpfc_mbox_hdr_status, &shdr->response);  		shdr_add_status = bf_get(lpfc_mbox_hdr_add_status,  					 &shdr->response); -		if (rc != MBX_TIMEOUT) -			mempool_free(mboxq, phba->mbox_mem_pool); +		mempool_free(mboxq, phba->mbox_mem_pool);  		if (shdr_status || shdr_add_status || rc) {  			lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT,  					"0495 SLI_FUNCTION_RESET mailbox " @@ -12075,78 +12038,6 @@ lpfc_sli4_hba_unset(struct lpfc_hba *phba)  		phba->pport->work_port_events = 0;  } - /** - * lpfc_pc_sli4_params_get - Get the SLI4_PARAMS port capabilities. - * @phba: Pointer to HBA context object. - * @mboxq: Pointer to the mailboxq memory for the mailbox command response. - * - * This function is called in the SLI4 code path to read the port's - * sli4 capabilities. - * - * This function may be be called from any context that can block-wait - * for the completion.  The expectation is that this routine is called - * typically from probe_one or from the online routine. - **/ -int -lpfc_pc_sli4_params_get(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) -{ -	int rc; -	struct lpfc_mqe *mqe; -	struct lpfc_pc_sli4_params *sli4_params; -	uint32_t mbox_tmo; - -	rc = 0; -	mqe = &mboxq->u.mqe; - -	/* Read the port's SLI4 Parameters port capabilities */ -	lpfc_pc_sli4_params(mboxq); -	if (!phba->sli4_hba.intr_enable) -		rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL); -	else { -		mbox_tmo = lpfc_mbox_tmo_val(phba, mboxq); -		rc = lpfc_sli_issue_mbox_wait(phba, mboxq, mbox_tmo); -	} - -	if (unlikely(rc)) -		return 1; - -	sli4_params = &phba->sli4_hba.pc_sli4_params; -	sli4_params->if_type = bf_get(if_type, &mqe->un.sli4_params); -	sli4_params->sli_rev = bf_get(sli_rev, &mqe->un.sli4_params); -	sli4_params->sli_family = bf_get(sli_family, &mqe->un.sli4_params); -	sli4_params->featurelevel_1 = bf_get(featurelevel_1, -					     &mqe->un.sli4_params); -	sli4_params->featurelevel_2 = bf_get(featurelevel_2, -					     &mqe->un.sli4_params); -	sli4_params->proto_types = mqe->un.sli4_params.word3; -	sli4_params->sge_supp_len = mqe->un.sli4_params.sge_supp_len; -	sli4_params->if_page_sz = bf_get(if_page_sz, &mqe->un.sli4_params); -	sli4_params->rq_db_window = bf_get(rq_db_window, &mqe->un.sli4_params); -	sli4_params->loopbk_scope = bf_get(loopbk_scope, &mqe->un.sli4_params); -	sli4_params->eq_pages_max = bf_get(eq_pages, &mqe->un.sli4_params); -	sli4_params->eqe_size = bf_get(eqe_size, &mqe->un.sli4_params); -	sli4_params->cq_pages_max = bf_get(cq_pages, &mqe->un.sli4_params); -	sli4_params->cqe_size = bf_get(cqe_size, &mqe->un.sli4_params); -	sli4_params->mq_pages_max = bf_get(mq_pages, &mqe->un.sli4_params); -	sli4_params->mqe_size = bf_get(mqe_size, &mqe->un.sli4_params); -	sli4_params->mq_elem_cnt = bf_get(mq_elem_cnt, &mqe->un.sli4_params); -	sli4_params->wq_pages_max = bf_get(wq_pages, &mqe->un.sli4_params); -	sli4_params->wqe_size = bf_get(wqe_size, &mqe->un.sli4_params); -	sli4_params->rq_pages_max = bf_get(rq_pages, &mqe->un.sli4_params); -	sli4_params->rqe_size = bf_get(rqe_size, &mqe->un.sli4_params); -	sli4_params->hdr_pages_max = bf_get(hdr_pages, &mqe->un.sli4_params); -	sli4_params->hdr_size = bf_get(hdr_size, &mqe->un.sli4_params); -	sli4_params->hdr_pp_align = bf_get(hdr_pp_align, &mqe->un.sli4_params); -	sli4_params->sgl_pages_max = bf_get(sgl_pages, &mqe->un.sli4_params); -	sli4_params->sgl_pp_align = bf_get(sgl_pp_align, &mqe->un.sli4_params); - -	/* Make sure that sge_supp_len can be handled by the driver */ -	if (sli4_params->sge_supp_len > LPFC_MAX_SGE_SIZE) -		sli4_params->sge_supp_len = LPFC_MAX_SGE_SIZE; - -	return rc; -} -  /**   * lpfc_get_sli4_parameters - Get the SLI4 Config PARAMETERS.   * @phba: Pointer to HBA context object. @@ -12205,7 +12096,8 @@ lpfc_get_sli4_parameters(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)  	else  		phba->sli3_options &= ~LPFC_SLI4_PHWQ_ENABLED;  	sli4_params->sge_supp_len = mbx_sli4_parameters->sge_supp_len; -	sli4_params->loopbk_scope = bf_get(loopbk_scope, mbx_sli4_parameters); +	sli4_params->loopbk_scope = bf_get(cfg_loopbk_scope, +					   mbx_sli4_parameters);  	sli4_params->oas_supported = bf_get(cfg_oas, mbx_sli4_parameters);  	sli4_params->cqv = bf_get(cfg_cqv, mbx_sli4_parameters);  	sli4_params->mqv = bf_get(cfg_mqv, mbx_sli4_parameters); | 
