Commit 9f1177a3 authored by James Smart's avatar James Smart Committed by James Bottomley
Browse files

[SCSI] lpfc 8.3.10: Fix Initialization issues



- Add NULL checks to the pointers for the config_async mailbox
  and dump_wakeup_params mailbox.
- Add code to check return value of lpfc_read_sparams everywhere
  and handle failures appropriately.

Signed-off-by: default avatarJames Smart <james.smart@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 43aebfa1
Loading
Loading
Loading
Loading
+18 −14
Original line number Original line Diff line number Diff line
@@ -2024,8 +2024,6 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la)
	int rc;
	int rc;
	struct fcf_record *fcf_record;
	struct fcf_record *fcf_record;


	sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);

	spin_lock_irq(&phba->hbalock);
	spin_lock_irq(&phba->hbalock);
	switch (la->UlnkSpeed) {
	switch (la->UlnkSpeed) {
	case LA_1GHZ_LINK:
	case LA_1GHZ_LINK:
@@ -2117,8 +2115,15 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la)
	spin_unlock_irq(&phba->hbalock);
	spin_unlock_irq(&phba->hbalock);


	lpfc_linkup(phba);
	lpfc_linkup(phba);
	if (sparam_mbox) {
	sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
		lpfc_read_sparam(phba, sparam_mbox, 0);
	if (!sparam_mbox)
		goto out;

	rc = lpfc_read_sparam(phba, sparam_mbox, 0);
	if (rc) {
		mempool_free(sparam_mbox, phba->mbox_mem_pool);
		goto out;
	}
	sparam_mbox->vport = vport;
	sparam_mbox->vport = vport;
	sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam;
	sparam_mbox->mbox_cmpl = lpfc_mbx_cmpl_read_sparam;
	rc = lpfc_sli_issue_mbox(phba, sparam_mbox, MBX_NOWAIT);
	rc = lpfc_sli_issue_mbox(phba, sparam_mbox, MBX_NOWAIT);
@@ -2129,7 +2134,6 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la)
		mempool_free(sparam_mbox, phba->mbox_mem_pool);
		mempool_free(sparam_mbox, phba->mbox_mem_pool);
		goto out;
		goto out;
	}
	}
	}


	if (!(phba->hba_flag & HBA_FCOE_SUPPORT)) {
	if (!(phba->hba_flag & HBA_FCOE_SUPPORT)) {
		cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
		cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
+17 −2
Original line number Original line Diff line number Diff line
@@ -350,7 +350,12 @@ lpfc_config_port_post(struct lpfc_hba *phba)
	mb = &pmb->u.mb;
	mb = &pmb->u.mb;


	/* Get login parameters for NID.  */
	/* Get login parameters for NID.  */
	lpfc_read_sparam(phba, pmb, 0);
	rc = lpfc_read_sparam(phba, pmb, 0);
	if (rc) {
		mempool_free(pmb, phba->mbox_mem_pool);
		return -ENOMEM;
	}

	pmb->vport = vport;
	pmb->vport = vport;
	if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) {
	if (lpfc_sli_issue_mbox(phba, pmb, MBX_POLL) != MBX_SUCCESS) {
		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
		lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
@@ -571,6 +576,11 @@ lpfc_config_port_post(struct lpfc_hba *phba)
	}
	}
	/* MBOX buffer will be freed in mbox compl */
	/* MBOX buffer will be freed in mbox compl */
	pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
	pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
	if (!pmb) {
		phba->link_state = LPFC_HBA_ERROR;
		return -ENOMEM;
	}

	lpfc_config_async(phba, pmb, LPFC_ELS_RING);
	lpfc_config_async(phba, pmb, LPFC_ELS_RING);
	pmb->mbox_cmpl = lpfc_config_async_cmpl;
	pmb->mbox_cmpl = lpfc_config_async_cmpl;
	pmb->vport = phba->pport;
	pmb->vport = phba->pport;
@@ -588,6 +598,11 @@ lpfc_config_port_post(struct lpfc_hba *phba)


	/* Get Option rom version */
	/* Get Option rom version */
	pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
	pmb = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
	if (!pmb) {
		phba->link_state = LPFC_HBA_ERROR;
		return -ENOMEM;
	}

	lpfc_dump_wakeup_param(phba, pmb);
	lpfc_dump_wakeup_param(phba, pmb);
	pmb->mbox_cmpl = lpfc_dump_wakeup_param_cmpl;
	pmb->mbox_cmpl = lpfc_dump_wakeup_param_cmpl;
	pmb->vport = phba->pport;
	pmb->vport = phba->pport;
+7 −1
Original line number Original line Diff line number Diff line
@@ -4388,7 +4388,13 @@ lpfc_sli4_hba_setup(struct lpfc_hba *phba)
	spin_unlock_irq(&phba->hbalock);
	spin_unlock_irq(&phba->hbalock);


	/* Read the port's service parameters. */
	/* Read the port's service parameters. */
	lpfc_read_sparam(phba, mboxq, vport->vpi);
	rc = lpfc_read_sparam(phba, mboxq, vport->vpi);
	if (rc) {
		phba->link_state = LPFC_HBA_ERROR;
		rc = -ENOMEM;
		goto out_free_vpd;
	}

	mboxq->vport = vport;
	mboxq->vport = vport;
	rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
	rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_POLL);
	mp = (struct lpfc_dmabuf *) mboxq->context1;
	mp = (struct lpfc_dmabuf *) mboxq->context1;
+6 −1
Original line number Original line Diff line number Diff line
@@ -123,7 +123,12 @@ lpfc_vport_sparm(struct lpfc_hba *phba, struct lpfc_vport *vport)
	}
	}
	mb = &pmb->u.mb;
	mb = &pmb->u.mb;


	lpfc_read_sparam(phba, pmb, vport->vpi);
	rc = lpfc_read_sparam(phba, pmb, vport->vpi);
	if (rc) {
		mempool_free(pmb, phba->mbox_mem_pool);
		return -ENOMEM;
	}

	/*
	/*
	 * Grab buffer pointer and clear context1 so we can use
	 * Grab buffer pointer and clear context1 so we can use
	 * lpfc_sli_issue_box_wait
	 * lpfc_sli_issue_box_wait