Loading drivers/scsi/lpfc/lpfc_hbadisc.c +43 −64 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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)); } Loading Loading
drivers/scsi/lpfc/lpfc_hbadisc.c +43 −64 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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)); } Loading