Commit 25594c6b authored by Jamie Wellnitz's avatar Jamie Wellnitz Committed by James Bottomley
Browse files

[SCSI] lpfc 8.1.2: Code cleanup of lpfc_mbx_cmpl_config_link



Code cleanup of lpfc_mbx_cmpl_config_link

Signed-off-by: default avatarJamie Wellnitz <Jamie.Wellnitz@emulex.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 367c2713
Loading
Loading
Loading
Loading
+43 −64
Original line number Diff line number Diff line
@@ -538,81 +538,60 @@ lpfc_mbx_cmpl_clear_la(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
}

static void
lpfc_mbx_cmpl_config_link(struct lpfc_hba * phba, LPFC_MBOXQ_t * pmb)
lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
{
	struct lpfc_sli *psli;
	MAILBOX_t *mb;

	psli = &phba->sli;
	mb = &pmb->mb;
	/* Check for error */
	if (mb->mbxStatus) {
		/* CONFIG_LINK mbox error <mbxStatus> state <hba_state> */
		lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
				"%d:0306 CONFIG_LINK mbxStatus error x%x "
				"HBA state x%x\n",
				phba->brd_no, mb->mbxStatus, phba->hba_state);
	struct lpfc_sli *psli = &phba->sli;
	int rc;

		lpfc_linkdown(phba);
		phba->hba_state = LPFC_HBA_ERROR;
	if (pmb->mb.mbxStatus)
		goto out;
	}

	if (phba->hba_state == LPFC_LOCAL_CFG_LINK) {
		if (phba->fc_topology == TOPOLOGY_LOOP) {
			/* If we are public loop and L bit was set */
			if ((phba->fc_flag & FC_PUBLIC_LOOP) &&
	mempool_free(pmb, phba->mbox_mem_pool);

	if (phba->fc_topology == TOPOLOGY_LOOP &&
		phba->fc_flag & FC_PUBLIC_LOOP &&
		 !(phba->fc_flag & FC_LBIT)) {
			/* Need to wait for FAN - use discovery timer
			 * for timeout.  hba_state is identically
			 * LPFC_LOCAL_CFG_LINK while waiting for FAN
			 */
			lpfc_set_disctmo(phba);
				mempool_free( pmb, phba->mbox_mem_pool);
			return;
		}
		}

		/* Start discovery by sending a FLOGI hba_state is identically
	/* Start discovery by sending a FLOGI. hba_state is identically
	 * LPFC_FLOGI while waiting for FLOGI cmpl
	 */
	phba->hba_state = LPFC_FLOGI;
	lpfc_set_disctmo(phba);
	lpfc_initial_flogi(phba);
		mempool_free( pmb, phba->mbox_mem_pool);
	return;
	}
	if (phba->hba_state == LPFC_FABRIC_CFG_LINK) {
		mempool_free( pmb, phba->mbox_mem_pool);
		return;
	}

out:
	/* CONFIG_LINK bad hba state <hba_state> */
	lpfc_printf_log(phba,
			KERN_ERR,
			LOG_DISCOVERY,
	lpfc_printf_log(phba, KERN_ERR, LOG_MBOX,
			"%d:0306 CONFIG_LINK mbxStatus error x%x "
			"HBA state x%x\n",
			phba->brd_no, pmb->mb.mbxStatus, phba->hba_state);

	lpfc_linkdown(phba);

	phba->hba_state = LPFC_HBA_ERROR;

	lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY,
			"%d:0200 CONFIG_LINK bad hba state x%x\n",
			phba->brd_no, phba->hba_state);

	if (phba->hba_state != LPFC_CLEAR_LA) {
	lpfc_clear_la(phba, pmb);
	pmb->mbox_cmpl = lpfc_mbx_cmpl_clear_la;
		if (lpfc_sli_issue_mbox(phba, pmb, (MBX_NOWAIT | MBX_STOP_IOCB))
		    == MBX_NOT_FINISHED) {
	rc = lpfc_sli_issue_mbox(phba, pmb, (MBX_NOWAIT | MBX_STOP_IOCB));
	if (rc == MBX_NOT_FINISHED) {
		mempool_free(pmb, phba->mbox_mem_pool);
		lpfc_disc_flush_list(phba);
			psli->ring[(psli->ip_ring)].flag &=
				~LPFC_STOP_IOCB_EVENT;
			psli->ring[(psli->fcp_ring)].flag &=
				~LPFC_STOP_IOCB_EVENT;
			psli->ring[(psli->next_ring)].flag &=
				~LPFC_STOP_IOCB_EVENT;
		psli->ring[(psli->ip_ring)].flag &= ~LPFC_STOP_IOCB_EVENT;
		psli->ring[(psli->fcp_ring)].flag &= ~LPFC_STOP_IOCB_EVENT;
		psli->ring[(psli->next_ring)].flag &= ~LPFC_STOP_IOCB_EVENT;
		phba->hba_state = LPFC_HBA_READY;
	}
	} else {
		mempool_free( pmb, phba->mbox_mem_pool);
	}
	return;
}

@@ -765,7 +744,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la)
	if (cfglink_mbox) {
		phba->hba_state = LPFC_LOCAL_CFG_LINK;
		lpfc_config_link(phba, cfglink_mbox);
		cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_config_link;
		cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link;
		lpfc_sli_issue_mbox(phba, cfglink_mbox,
						(MBX_NOWAIT | MBX_STOP_IOCB));
	}