diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_hbadisc.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 239 |
1 files changed, 161 insertions, 78 deletions
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index a5d1695dac3d..f9f160ab2ee9 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -607,6 +607,8 @@ lpfc_work_done(struct lpfc_hba *phba) | |||
607 | 607 | ||
608 | /* Process SLI4 events */ | 608 | /* Process SLI4 events */ |
609 | if (phba->pci_dev_grp == LPFC_PCI_DEV_OC) { | 609 | if (phba->pci_dev_grp == LPFC_PCI_DEV_OC) { |
610 | if (phba->hba_flag & HBA_RRQ_ACTIVE) | ||
611 | lpfc_handle_rrq_active(phba); | ||
610 | if (phba->hba_flag & FCP_XRI_ABORT_EVENT) | 612 | if (phba->hba_flag & FCP_XRI_ABORT_EVENT) |
611 | lpfc_sli4_fcp_xri_abort_event_proc(phba); | 613 | lpfc_sli4_fcp_xri_abort_event_proc(phba); |
612 | if (phba->hba_flag & ELS_XRI_ABORT_EVENT) | 614 | if (phba->hba_flag & ELS_XRI_ABORT_EVENT) |
@@ -966,6 +968,7 @@ lpfc_linkup(struct lpfc_hba *phba) | |||
966 | struct lpfc_vport **vports; | 968 | struct lpfc_vport **vports; |
967 | int i; | 969 | int i; |
968 | 970 | ||
971 | lpfc_cleanup_wt_rrqs(phba); | ||
969 | phba->link_state = LPFC_LINK_UP; | 972 | phba->link_state = LPFC_LINK_UP; |
970 | 973 | ||
971 | /* Unblock fabric iocbs if they are blocked */ | 974 | /* Unblock fabric iocbs if they are blocked */ |
@@ -1064,7 +1067,7 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
1064 | 1067 | ||
1065 | mempool_free(pmb, phba->mbox_mem_pool); | 1068 | mempool_free(pmb, phba->mbox_mem_pool); |
1066 | 1069 | ||
1067 | if (phba->fc_topology == TOPOLOGY_LOOP && | 1070 | if (phba->fc_topology == LPFC_TOPOLOGY_LOOP && |
1068 | vport->fc_flag & FC_PUBLIC_LOOP && | 1071 | vport->fc_flag & FC_PUBLIC_LOOP && |
1069 | !(vport->fc_flag & FC_LBIT)) { | 1072 | !(vport->fc_flag & FC_LBIT)) { |
1070 | /* Need to wait for FAN - use discovery timer | 1073 | /* Need to wait for FAN - use discovery timer |
@@ -1078,9 +1081,8 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
1078 | /* Start discovery by sending a FLOGI. port_state is identically | 1081 | /* Start discovery by sending a FLOGI. port_state is identically |
1079 | * LPFC_FLOGI while waiting for FLOGI cmpl | 1082 | * LPFC_FLOGI while waiting for FLOGI cmpl |
1080 | */ | 1083 | */ |
1081 | if (vport->port_state != LPFC_FLOGI) { | 1084 | if (vport->port_state != LPFC_FLOGI) |
1082 | lpfc_initial_flogi(vport); | 1085 | lpfc_initial_flogi(vport); |
1083 | } | ||
1084 | return; | 1086 | return; |
1085 | 1087 | ||
1086 | out: | 1088 | out: |
@@ -1131,7 +1133,7 @@ lpfc_mbx_cmpl_reg_fcfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
1131 | if (vport->port_state != LPFC_FLOGI) { | 1133 | if (vport->port_state != LPFC_FLOGI) { |
1132 | phba->hba_flag |= FCF_RR_INPROG; | 1134 | phba->hba_flag |= FCF_RR_INPROG; |
1133 | spin_unlock_irq(&phba->hbalock); | 1135 | spin_unlock_irq(&phba->hbalock); |
1134 | lpfc_initial_flogi(vport); | 1136 | lpfc_issue_init_vfi(vport); |
1135 | goto out; | 1137 | goto out; |
1136 | } | 1138 | } |
1137 | spin_unlock_irq(&phba->hbalock); | 1139 | spin_unlock_irq(&phba->hbalock); |
@@ -1353,7 +1355,7 @@ lpfc_register_fcf(struct lpfc_hba *phba) | |||
1353 | if (phba->pport->port_state != LPFC_FLOGI) { | 1355 | if (phba->pport->port_state != LPFC_FLOGI) { |
1354 | phba->hba_flag |= FCF_RR_INPROG; | 1356 | phba->hba_flag |= FCF_RR_INPROG; |
1355 | spin_unlock_irq(&phba->hbalock); | 1357 | spin_unlock_irq(&phba->hbalock); |
1356 | lpfc_initial_flogi(phba->pport); | 1358 | lpfc_issue_init_vfi(phba->pport); |
1357 | return; | 1359 | return; |
1358 | } | 1360 | } |
1359 | spin_unlock_irq(&phba->hbalock); | 1361 | spin_unlock_irq(&phba->hbalock); |
@@ -2331,7 +2333,7 @@ lpfc_mbx_cmpl_fcf_rr_read_fcf_rec(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
2331 | phba->fcf.current_rec.fcf_indx, fcf_index); | 2333 | phba->fcf.current_rec.fcf_indx, fcf_index); |
2332 | /* Wait 500 ms before retrying FLOGI to current FCF */ | 2334 | /* Wait 500 ms before retrying FLOGI to current FCF */ |
2333 | msleep(500); | 2335 | msleep(500); |
2334 | lpfc_initial_flogi(phba->pport); | 2336 | lpfc_issue_init_vfi(phba->pport); |
2335 | goto out; | 2337 | goto out; |
2336 | } | 2338 | } |
2337 | 2339 | ||
@@ -2422,6 +2424,63 @@ out: | |||
2422 | } | 2424 | } |
2423 | 2425 | ||
2424 | /** | 2426 | /** |
2427 | * lpfc_init_vfi_cmpl - Completion handler for init_vfi mbox command. | ||
2428 | * @phba: pointer to lpfc hba data structure. | ||
2429 | * @mboxq: pointer to mailbox data structure. | ||
2430 | * | ||
2431 | * This function handles completion of init vfi mailbox command. | ||
2432 | */ | ||
2433 | void | ||
2434 | lpfc_init_vfi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | ||
2435 | { | ||
2436 | struct lpfc_vport *vport = mboxq->vport; | ||
2437 | |||
2438 | if (mboxq->u.mb.mbxStatus && (mboxq->u.mb.mbxStatus != 0x4002)) { | ||
2439 | lpfc_printf_vlog(vport, KERN_ERR, | ||
2440 | LOG_MBOX, | ||
2441 | "2891 Init VFI mailbox failed 0x%x\n", | ||
2442 | mboxq->u.mb.mbxStatus); | ||
2443 | mempool_free(mboxq, phba->mbox_mem_pool); | ||
2444 | lpfc_vport_set_state(vport, FC_VPORT_FAILED); | ||
2445 | return; | ||
2446 | } | ||
2447 | lpfc_initial_flogi(vport); | ||
2448 | mempool_free(mboxq, phba->mbox_mem_pool); | ||
2449 | return; | ||
2450 | } | ||
2451 | |||
2452 | /** | ||
2453 | * lpfc_issue_init_vfi - Issue init_vfi mailbox command. | ||
2454 | * @vport: pointer to lpfc_vport data structure. | ||
2455 | * | ||
2456 | * This function issue a init_vfi mailbox command to initialize the VFI and | ||
2457 | * VPI for the physical port. | ||
2458 | */ | ||
2459 | void | ||
2460 | lpfc_issue_init_vfi(struct lpfc_vport *vport) | ||
2461 | { | ||
2462 | LPFC_MBOXQ_t *mboxq; | ||
2463 | int rc; | ||
2464 | struct lpfc_hba *phba = vport->phba; | ||
2465 | |||
2466 | mboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | ||
2467 | if (!mboxq) { | ||
2468 | lpfc_printf_vlog(vport, KERN_ERR, | ||
2469 | LOG_MBOX, "2892 Failed to allocate " | ||
2470 | "init_vfi mailbox\n"); | ||
2471 | return; | ||
2472 | } | ||
2473 | lpfc_init_vfi(mboxq, vport); | ||
2474 | mboxq->mbox_cmpl = lpfc_init_vfi_cmpl; | ||
2475 | rc = lpfc_sli_issue_mbox(phba, mboxq, MBX_NOWAIT); | ||
2476 | if (rc == MBX_NOT_FINISHED) { | ||
2477 | lpfc_printf_vlog(vport, KERN_ERR, | ||
2478 | LOG_MBOX, "2893 Failed to issue init_vfi mailbox\n"); | ||
2479 | mempool_free(mboxq, vport->phba->mbox_mem_pool); | ||
2480 | } | ||
2481 | } | ||
2482 | |||
2483 | /** | ||
2425 | * lpfc_init_vpi_cmpl - Completion handler for init_vpi mbox command. | 2484 | * lpfc_init_vpi_cmpl - Completion handler for init_vpi mbox command. |
2426 | * @phba: pointer to lpfc hba data structure. | 2485 | * @phba: pointer to lpfc hba data structure. |
2427 | * @mboxq: pointer to mailbox data structure. | 2486 | * @mboxq: pointer to mailbox data structure. |
@@ -2528,7 +2587,7 @@ lpfc_start_fdiscs(struct lpfc_hba *phba) | |||
2528 | FC_VPORT_FAILED); | 2587 | FC_VPORT_FAILED); |
2529 | continue; | 2588 | continue; |
2530 | } | 2589 | } |
2531 | if (phba->fc_topology == TOPOLOGY_LOOP) { | 2590 | if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { |
2532 | lpfc_vport_set_state(vports[i], | 2591 | lpfc_vport_set_state(vports[i], |
2533 | FC_VPORT_LINKDOWN); | 2592 | FC_VPORT_LINKDOWN); |
2534 | continue; | 2593 | continue; |
@@ -2564,7 +2623,7 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
2564 | "2018 REG_VFI mbxStatus error x%x " | 2623 | "2018 REG_VFI mbxStatus error x%x " |
2565 | "HBA state x%x\n", | 2624 | "HBA state x%x\n", |
2566 | mboxq->u.mb.mbxStatus, vport->port_state); | 2625 | mboxq->u.mb.mbxStatus, vport->port_state); |
2567 | if (phba->fc_topology == TOPOLOGY_LOOP) { | 2626 | if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { |
2568 | /* FLOGI failed, use loop map to make discovery list */ | 2627 | /* FLOGI failed, use loop map to make discovery list */ |
2569 | lpfc_disc_list_loopmap(vport); | 2628 | lpfc_disc_list_loopmap(vport); |
2570 | /* Start discovery */ | 2629 | /* Start discovery */ |
@@ -2582,8 +2641,18 @@ lpfc_mbx_cmpl_reg_vfi(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq) | |||
2582 | spin_unlock_irq(shost->host_lock); | 2641 | spin_unlock_irq(shost->host_lock); |
2583 | 2642 | ||
2584 | if (vport->port_state == LPFC_FABRIC_CFG_LINK) { | 2643 | if (vport->port_state == LPFC_FABRIC_CFG_LINK) { |
2585 | lpfc_start_fdiscs(phba); | 2644 | /* For private loop just start discovery and we are done. */ |
2586 | lpfc_do_scr_ns_plogi(phba, vport); | 2645 | if ((phba->fc_topology == LPFC_TOPOLOGY_LOOP) && |
2646 | (phba->alpa_map[0] == 0) && | ||
2647 | !(vport->fc_flag & FC_PUBLIC_LOOP)) { | ||
2648 | /* Use loop map to make discovery list */ | ||
2649 | lpfc_disc_list_loopmap(vport); | ||
2650 | /* Start discovery */ | ||
2651 | lpfc_disc_start(vport); | ||
2652 | } else { | ||
2653 | lpfc_start_fdiscs(phba); | ||
2654 | lpfc_do_scr_ns_plogi(phba, vport); | ||
2655 | } | ||
2587 | } | 2656 | } |
2588 | 2657 | ||
2589 | fail_free_mem: | 2658 | fail_free_mem: |
@@ -2644,7 +2713,7 @@ out: | |||
2644 | } | 2713 | } |
2645 | 2714 | ||
2646 | static void | 2715 | static void |
2647 | lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | 2716 | lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la) |
2648 | { | 2717 | { |
2649 | struct lpfc_vport *vport = phba->pport; | 2718 | struct lpfc_vport *vport = phba->pport; |
2650 | LPFC_MBOXQ_t *sparam_mbox, *cfglink_mbox = NULL; | 2719 | LPFC_MBOXQ_t *sparam_mbox, *cfglink_mbox = NULL; |
@@ -2654,31 +2723,24 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | |||
2654 | struct fcf_record *fcf_record; | 2723 | struct fcf_record *fcf_record; |
2655 | 2724 | ||
2656 | spin_lock_irq(&phba->hbalock); | 2725 | spin_lock_irq(&phba->hbalock); |
2657 | switch (la->UlnkSpeed) { | 2726 | switch (bf_get(lpfc_mbx_read_top_link_spd, la)) { |
2658 | case LA_1GHZ_LINK: | 2727 | case LPFC_LINK_SPEED_1GHZ: |
2659 | phba->fc_linkspeed = LA_1GHZ_LINK; | 2728 | case LPFC_LINK_SPEED_2GHZ: |
2660 | break; | 2729 | case LPFC_LINK_SPEED_4GHZ: |
2661 | case LA_2GHZ_LINK: | 2730 | case LPFC_LINK_SPEED_8GHZ: |
2662 | phba->fc_linkspeed = LA_2GHZ_LINK; | 2731 | case LPFC_LINK_SPEED_10GHZ: |
2663 | break; | 2732 | case LPFC_LINK_SPEED_16GHZ: |
2664 | case LA_4GHZ_LINK: | 2733 | phba->fc_linkspeed = bf_get(lpfc_mbx_read_top_link_spd, la); |
2665 | phba->fc_linkspeed = LA_4GHZ_LINK; | ||
2666 | break; | ||
2667 | case LA_8GHZ_LINK: | ||
2668 | phba->fc_linkspeed = LA_8GHZ_LINK; | ||
2669 | break; | ||
2670 | case LA_10GHZ_LINK: | ||
2671 | phba->fc_linkspeed = LA_10GHZ_LINK; | ||
2672 | break; | 2734 | break; |
2673 | default: | 2735 | default: |
2674 | phba->fc_linkspeed = LA_UNKNW_LINK; | 2736 | phba->fc_linkspeed = LPFC_LINK_SPEED_UNKNOWN; |
2675 | break; | 2737 | break; |
2676 | } | 2738 | } |
2677 | 2739 | ||
2678 | phba->fc_topology = la->topology; | 2740 | phba->fc_topology = bf_get(lpfc_mbx_read_top_topology, la); |
2679 | phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED; | 2741 | phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED; |
2680 | 2742 | ||
2681 | if (phba->fc_topology == TOPOLOGY_LOOP) { | 2743 | if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { |
2682 | phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED; | 2744 | phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED; |
2683 | 2745 | ||
2684 | /* if npiv is enabled and this adapter supports npiv log | 2746 | /* if npiv is enabled and this adapter supports npiv log |
@@ -2689,11 +2751,11 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | |||
2689 | "1309 Link Up Event npiv not supported in loop " | 2751 | "1309 Link Up Event npiv not supported in loop " |
2690 | "topology\n"); | 2752 | "topology\n"); |
2691 | /* Get Loop Map information */ | 2753 | /* Get Loop Map information */ |
2692 | if (la->il) | 2754 | if (bf_get(lpfc_mbx_read_top_il, la)) |
2693 | vport->fc_flag |= FC_LBIT; | 2755 | vport->fc_flag |= FC_LBIT; |
2694 | 2756 | ||
2695 | vport->fc_myDID = la->granted_AL_PA; | 2757 | vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la); |
2696 | i = la->un.lilpBde64.tus.f.bdeSize; | 2758 | i = la->lilpBde64.tus.f.bdeSize; |
2697 | 2759 | ||
2698 | if (i == 0) { | 2760 | if (i == 0) { |
2699 | phba->alpa_map[0] = 0; | 2761 | phba->alpa_map[0] = 0; |
@@ -2764,7 +2826,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, READ_LA_VAR *la) | |||
2764 | goto out; | 2826 | goto out; |
2765 | } | 2827 | } |
2766 | 2828 | ||
2767 | if (!(phba->hba_flag & HBA_FCOE_SUPPORT)) { | 2829 | if (!(phba->hba_flag & HBA_FCOE_MODE)) { |
2768 | cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 2830 | cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
2769 | if (!cfglink_mbox) | 2831 | if (!cfglink_mbox) |
2770 | goto out; | 2832 | goto out; |
@@ -2874,17 +2936,17 @@ lpfc_mbx_issue_link_down(struct lpfc_hba *phba) | |||
2874 | 2936 | ||
2875 | 2937 | ||
2876 | /* | 2938 | /* |
2877 | * This routine handles processing a READ_LA mailbox | 2939 | * This routine handles processing a READ_TOPOLOGY mailbox |
2878 | * command upon completion. It is setup in the LPFC_MBOXQ | 2940 | * command upon completion. It is setup in the LPFC_MBOXQ |
2879 | * as the completion routine when the command is | 2941 | * as the completion routine when the command is |
2880 | * handed off to the SLI layer. | 2942 | * handed off to the SLI layer. |
2881 | */ | 2943 | */ |
2882 | void | 2944 | void |
2883 | lpfc_mbx_cmpl_read_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | 2945 | lpfc_mbx_cmpl_read_topology(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) |
2884 | { | 2946 | { |
2885 | struct lpfc_vport *vport = pmb->vport; | 2947 | struct lpfc_vport *vport = pmb->vport; |
2886 | struct Scsi_Host *shost = lpfc_shost_from_vport(vport); | 2948 | struct Scsi_Host *shost = lpfc_shost_from_vport(vport); |
2887 | READ_LA_VAR *la; | 2949 | struct lpfc_mbx_read_top *la; |
2888 | MAILBOX_t *mb = &pmb->u.mb; | 2950 | MAILBOX_t *mb = &pmb->u.mb; |
2889 | struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *) (pmb->context1); | 2951 | struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *) (pmb->context1); |
2890 | 2952 | ||
@@ -2897,15 +2959,15 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
2897 | mb->mbxStatus, vport->port_state); | 2959 | mb->mbxStatus, vport->port_state); |
2898 | lpfc_mbx_issue_link_down(phba); | 2960 | lpfc_mbx_issue_link_down(phba); |
2899 | phba->link_state = LPFC_HBA_ERROR; | 2961 | phba->link_state = LPFC_HBA_ERROR; |
2900 | goto lpfc_mbx_cmpl_read_la_free_mbuf; | 2962 | goto lpfc_mbx_cmpl_read_topology_free_mbuf; |
2901 | } | 2963 | } |
2902 | 2964 | ||
2903 | la = (READ_LA_VAR *) &pmb->u.mb.un.varReadLA; | 2965 | la = (struct lpfc_mbx_read_top *) &pmb->u.mb.un.varReadTop; |
2904 | 2966 | ||
2905 | memcpy(&phba->alpa_map[0], mp->virt, 128); | 2967 | memcpy(&phba->alpa_map[0], mp->virt, 128); |
2906 | 2968 | ||
2907 | spin_lock_irq(shost->host_lock); | 2969 | spin_lock_irq(shost->host_lock); |
2908 | if (la->pb) | 2970 | if (bf_get(lpfc_mbx_read_top_pb, la)) |
2909 | vport->fc_flag |= FC_BYPASSED_MODE; | 2971 | vport->fc_flag |= FC_BYPASSED_MODE; |
2910 | else | 2972 | else |
2911 | vport->fc_flag &= ~FC_BYPASSED_MODE; | 2973 | vport->fc_flag &= ~FC_BYPASSED_MODE; |
@@ -2914,41 +2976,48 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
2914 | if ((phba->fc_eventTag < la->eventTag) || | 2976 | if ((phba->fc_eventTag < la->eventTag) || |
2915 | (phba->fc_eventTag == la->eventTag)) { | 2977 | (phba->fc_eventTag == la->eventTag)) { |
2916 | phba->fc_stat.LinkMultiEvent++; | 2978 | phba->fc_stat.LinkMultiEvent++; |
2917 | if (la->attType == AT_LINK_UP) | 2979 | if (bf_get(lpfc_mbx_read_top_att_type, la) == LPFC_ATT_LINK_UP) |
2918 | if (phba->fc_eventTag != 0) | 2980 | if (phba->fc_eventTag != 0) |
2919 | lpfc_linkdown(phba); | 2981 | lpfc_linkdown(phba); |
2920 | } | 2982 | } |
2921 | 2983 | ||
2922 | phba->fc_eventTag = la->eventTag; | 2984 | phba->fc_eventTag = la->eventTag; |
2923 | spin_lock_irq(&phba->hbalock); | 2985 | spin_lock_irq(&phba->hbalock); |
2924 | if (la->mm) | 2986 | if (bf_get(lpfc_mbx_read_top_mm, la)) |
2925 | phba->sli.sli_flag |= LPFC_MENLO_MAINT; | 2987 | phba->sli.sli_flag |= LPFC_MENLO_MAINT; |
2926 | else | 2988 | else |
2927 | phba->sli.sli_flag &= ~LPFC_MENLO_MAINT; | 2989 | phba->sli.sli_flag &= ~LPFC_MENLO_MAINT; |
2928 | spin_unlock_irq(&phba->hbalock); | 2990 | spin_unlock_irq(&phba->hbalock); |
2929 | 2991 | ||
2930 | phba->link_events++; | 2992 | phba->link_events++; |
2931 | if (la->attType == AT_LINK_UP && (!la->mm)) { | 2993 | if ((bf_get(lpfc_mbx_read_top_att_type, la) == LPFC_ATT_LINK_UP) && |
2994 | (!bf_get(lpfc_mbx_read_top_mm, la))) { | ||
2932 | phba->fc_stat.LinkUp++; | 2995 | phba->fc_stat.LinkUp++; |
2933 | if (phba->link_flag & LS_LOOPBACK_MODE) { | 2996 | if (phba->link_flag & LS_LOOPBACK_MODE) { |
2934 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, | 2997 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, |
2935 | "1306 Link Up Event in loop back mode " | 2998 | "1306 Link Up Event in loop back mode " |
2936 | "x%x received Data: x%x x%x x%x x%x\n", | 2999 | "x%x received Data: x%x x%x x%x x%x\n", |
2937 | la->eventTag, phba->fc_eventTag, | 3000 | la->eventTag, phba->fc_eventTag, |
2938 | la->granted_AL_PA, la->UlnkSpeed, | 3001 | bf_get(lpfc_mbx_read_top_alpa_granted, |
3002 | la), | ||
3003 | bf_get(lpfc_mbx_read_top_link_spd, la), | ||
2939 | phba->alpa_map[0]); | 3004 | phba->alpa_map[0]); |
2940 | } else { | 3005 | } else { |
2941 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, | 3006 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, |
2942 | "1303 Link Up Event x%x received " | 3007 | "1303 Link Up Event x%x received " |
2943 | "Data: x%x x%x x%x x%x x%x x%x %d\n", | 3008 | "Data: x%x x%x x%x x%x x%x x%x %d\n", |
2944 | la->eventTag, phba->fc_eventTag, | 3009 | la->eventTag, phba->fc_eventTag, |
2945 | la->granted_AL_PA, la->UlnkSpeed, | 3010 | bf_get(lpfc_mbx_read_top_alpa_granted, |
3011 | la), | ||
3012 | bf_get(lpfc_mbx_read_top_link_spd, la), | ||
2946 | phba->alpa_map[0], | 3013 | phba->alpa_map[0], |
2947 | la->mm, la->fa, | 3014 | bf_get(lpfc_mbx_read_top_mm, la), |
3015 | bf_get(lpfc_mbx_read_top_fa, la), | ||
2948 | phba->wait_4_mlo_maint_flg); | 3016 | phba->wait_4_mlo_maint_flg); |
2949 | } | 3017 | } |
2950 | lpfc_mbx_process_link_up(phba, la); | 3018 | lpfc_mbx_process_link_up(phba, la); |
2951 | } else if (la->attType == AT_LINK_DOWN) { | 3019 | } else if (bf_get(lpfc_mbx_read_top_att_type, la) == |
3020 | LPFC_ATT_LINK_DOWN) { | ||
2952 | phba->fc_stat.LinkDown++; | 3021 | phba->fc_stat.LinkDown++; |
2953 | if (phba->link_flag & LS_LOOPBACK_MODE) { | 3022 | if (phba->link_flag & LS_LOOPBACK_MODE) { |
2954 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, | 3023 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, |
@@ -2964,11 +3033,13 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
2964 | "Data: x%x x%x x%x x%x x%x\n", | 3033 | "Data: x%x x%x x%x x%x x%x\n", |
2965 | la->eventTag, phba->fc_eventTag, | 3034 | la->eventTag, phba->fc_eventTag, |
2966 | phba->pport->port_state, vport->fc_flag, | 3035 | phba->pport->port_state, vport->fc_flag, |
2967 | la->mm, la->fa); | 3036 | bf_get(lpfc_mbx_read_top_mm, la), |
3037 | bf_get(lpfc_mbx_read_top_fa, la)); | ||
2968 | } | 3038 | } |
2969 | lpfc_mbx_issue_link_down(phba); | 3039 | lpfc_mbx_issue_link_down(phba); |
2970 | } | 3040 | } |
2971 | if (la->mm && la->attType == AT_LINK_UP) { | 3041 | if ((bf_get(lpfc_mbx_read_top_mm, la)) && |
3042 | (bf_get(lpfc_mbx_read_top_att_type, la) == LPFC_ATT_LINK_UP)) { | ||
2972 | if (phba->link_state != LPFC_LINK_DOWN) { | 3043 | if (phba->link_state != LPFC_LINK_DOWN) { |
2973 | phba->fc_stat.LinkDown++; | 3044 | phba->fc_stat.LinkDown++; |
2974 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, | 3045 | lpfc_printf_log(phba, KERN_ERR, LOG_LINK_EVENT, |
@@ -2996,14 +3067,15 @@ lpfc_mbx_cmpl_read_la(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
2996 | } | 3067 | } |
2997 | } | 3068 | } |
2998 | 3069 | ||
2999 | if (la->fa) { | 3070 | if (bf_get(lpfc_mbx_read_top_fa, la)) { |
3000 | if (la->mm) | 3071 | if (bf_get(lpfc_mbx_read_top_mm, la)) |
3001 | lpfc_issue_clear_la(phba, vport); | 3072 | lpfc_issue_clear_la(phba, vport); |
3002 | lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT, | 3073 | lpfc_printf_log(phba, KERN_INFO, LOG_LINK_EVENT, |
3003 | "1311 fa %d\n", la->fa); | 3074 | "1311 fa %d\n", |
3075 | bf_get(lpfc_mbx_read_top_fa, la)); | ||
3004 | } | 3076 | } |
3005 | 3077 | ||
3006 | lpfc_mbx_cmpl_read_la_free_mbuf: | 3078 | lpfc_mbx_cmpl_read_topology_free_mbuf: |
3007 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | 3079 | lpfc_mbuf_free(phba, mp->virt, mp->phys); |
3008 | kfree(mp); | 3080 | kfree(mp); |
3009 | mempool_free(pmb, phba->mbox_mem_pool); | 3081 | mempool_free(pmb, phba->mbox_mem_pool); |
@@ -3030,8 +3102,8 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
3030 | if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) | 3102 | if (ndlp->nlp_flag & NLP_REG_LOGIN_SEND) |
3031 | ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; | 3103 | ndlp->nlp_flag &= ~NLP_REG_LOGIN_SEND; |
3032 | 3104 | ||
3033 | if (ndlp->nlp_flag & NLP_IGNR_REG_CMPL || | 3105 | if (ndlp->nlp_flag & NLP_IGNR_REG_CMPL || |
3034 | ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { | 3106 | ndlp->nlp_state != NLP_STE_REG_LOGIN_ISSUE) { |
3035 | /* We rcvd a rscn after issuing this | 3107 | /* We rcvd a rscn after issuing this |
3036 | * mbox reg login, we may have cycled | 3108 | * mbox reg login, we may have cycled |
3037 | * back through the state and be | 3109 | * back through the state and be |
@@ -3043,10 +3115,6 @@ lpfc_mbx_cmpl_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
3043 | spin_lock_irq(shost->host_lock); | 3115 | spin_lock_irq(shost->host_lock); |
3044 | ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; | 3116 | ndlp->nlp_flag &= ~NLP_IGNR_REG_CMPL; |
3045 | spin_unlock_irq(shost->host_lock); | 3117 | spin_unlock_irq(shost->host_lock); |
3046 | if (phba->sli_rev == LPFC_SLI_REV4) | ||
3047 | lpfc_sli4_free_rpi(phba, | ||
3048 | pmb->u.mb.un.varRegLogin.rpi); | ||
3049 | |||
3050 | } else | 3118 | } else |
3051 | /* Good status, call state machine */ | 3119 | /* Good status, call state machine */ |
3052 | lpfc_disc_state_machine(vport, ndlp, pmb, | 3120 | lpfc_disc_state_machine(vport, ndlp, pmb, |
@@ -3092,6 +3160,7 @@ lpfc_mbx_cmpl_unreg_vpi(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
3092 | spin_unlock_irq(shost->host_lock); | 3160 | spin_unlock_irq(shost->host_lock); |
3093 | vport->unreg_vpi_cmpl = VPORT_OK; | 3161 | vport->unreg_vpi_cmpl = VPORT_OK; |
3094 | mempool_free(pmb, phba->mbox_mem_pool); | 3162 | mempool_free(pmb, phba->mbox_mem_pool); |
3163 | lpfc_cleanup_vports_rrqs(vport); | ||
3095 | /* | 3164 | /* |
3096 | * This shost reference might have been taken at the beginning of | 3165 | * This shost reference might have been taken at the beginning of |
3097 | * lpfc_vport_delete() | 3166 | * lpfc_vport_delete() |
@@ -3333,7 +3402,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
3333 | kfree(mp); | 3402 | kfree(mp); |
3334 | mempool_free(pmb, phba->mbox_mem_pool); | 3403 | mempool_free(pmb, phba->mbox_mem_pool); |
3335 | 3404 | ||
3336 | if (phba->fc_topology == TOPOLOGY_LOOP) { | 3405 | if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { |
3337 | /* FLOGI failed, use loop map to make discovery list */ | 3406 | /* FLOGI failed, use loop map to make discovery list */ |
3338 | lpfc_disc_list_loopmap(vport); | 3407 | lpfc_disc_list_loopmap(vport); |
3339 | 3408 | ||
@@ -3355,7 +3424,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
3355 | } | 3424 | } |
3356 | 3425 | ||
3357 | ndlp->nlp_rpi = mb->un.varWords[0]; | 3426 | ndlp->nlp_rpi = mb->un.varWords[0]; |
3358 | ndlp->nlp_flag |= NLP_RPI_VALID; | 3427 | ndlp->nlp_flag |= NLP_RPI_REGISTERED; |
3359 | ndlp->nlp_type |= NLP_FABRIC; | 3428 | ndlp->nlp_type |= NLP_FABRIC; |
3360 | lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); | 3429 | lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); |
3361 | 3430 | ||
@@ -3413,7 +3482,7 @@ out: | |||
3413 | /* If no other thread is using the ndlp, free it */ | 3482 | /* If no other thread is using the ndlp, free it */ |
3414 | lpfc_nlp_not_used(ndlp); | 3483 | lpfc_nlp_not_used(ndlp); |
3415 | 3484 | ||
3416 | if (phba->fc_topology == TOPOLOGY_LOOP) { | 3485 | if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) { |
3417 | /* | 3486 | /* |
3418 | * RegLogin failed, use loop map to make discovery | 3487 | * RegLogin failed, use loop map to make discovery |
3419 | * list | 3488 | * list |
@@ -3429,7 +3498,7 @@ out: | |||
3429 | } | 3498 | } |
3430 | 3499 | ||
3431 | ndlp->nlp_rpi = mb->un.varWords[0]; | 3500 | ndlp->nlp_rpi = mb->un.varWords[0]; |
3432 | ndlp->nlp_flag |= NLP_RPI_VALID; | 3501 | ndlp->nlp_flag |= NLP_RPI_REGISTERED; |
3433 | ndlp->nlp_type |= NLP_FABRIC; | 3502 | ndlp->nlp_type |= NLP_FABRIC; |
3434 | lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); | 3503 | lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); |
3435 | 3504 | ||
@@ -3762,6 +3831,8 @@ lpfc_initialize_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
3762 | NLP_INT_NODE_ACT(ndlp); | 3831 | NLP_INT_NODE_ACT(ndlp); |
3763 | atomic_set(&ndlp->cmd_pending, 0); | 3832 | atomic_set(&ndlp->cmd_pending, 0); |
3764 | ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth; | 3833 | ndlp->cmd_qdepth = vport->cfg_tgt_queue_depth; |
3834 | if (vport->phba->sli_rev == LPFC_SLI_REV4) | ||
3835 | ndlp->nlp_rpi = lpfc_sli4_alloc_rpi(vport->phba); | ||
3765 | } | 3836 | } |
3766 | 3837 | ||
3767 | struct lpfc_nodelist * | 3838 | struct lpfc_nodelist * |
@@ -3975,7 +4046,7 @@ lpfc_no_rpi(struct lpfc_hba *phba, struct lpfc_nodelist *ndlp) | |||
3975 | * by firmware with a no rpi error. | 4046 | * by firmware with a no rpi error. |
3976 | */ | 4047 | */ |
3977 | psli = &phba->sli; | 4048 | psli = &phba->sli; |
3978 | if (ndlp->nlp_flag & NLP_RPI_VALID) { | 4049 | if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { |
3979 | /* Now process each ring */ | 4050 | /* Now process each ring */ |
3980 | for (i = 0; i < psli->num_rings; i++) { | 4051 | for (i = 0; i < psli->num_rings; i++) { |
3981 | pring = &psli->ring[i]; | 4052 | pring = &psli->ring[i]; |
@@ -4023,7 +4094,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) | |||
4023 | LPFC_MBOXQ_t *mbox; | 4094 | LPFC_MBOXQ_t *mbox; |
4024 | int rc; | 4095 | int rc; |
4025 | 4096 | ||
4026 | if (ndlp->nlp_flag & NLP_RPI_VALID) { | 4097 | if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { |
4027 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); | 4098 | mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL); |
4028 | if (mbox) { | 4099 | if (mbox) { |
4029 | lpfc_unreg_login(phba, vport->vpi, ndlp->nlp_rpi, mbox); | 4100 | lpfc_unreg_login(phba, vport->vpi, ndlp->nlp_rpi, mbox); |
@@ -4035,8 +4106,9 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) | |||
4035 | } | 4106 | } |
4036 | lpfc_no_rpi(phba, ndlp); | 4107 | lpfc_no_rpi(phba, ndlp); |
4037 | 4108 | ||
4038 | ndlp->nlp_rpi = 0; | 4109 | if (phba->sli_rev != LPFC_SLI_REV4) |
4039 | ndlp->nlp_flag &= ~NLP_RPI_VALID; | 4110 | ndlp->nlp_rpi = 0; |
4111 | ndlp->nlp_flag &= ~NLP_RPI_REGISTERED; | ||
4040 | ndlp->nlp_flag &= ~NLP_NPR_ADISC; | 4112 | ndlp->nlp_flag &= ~NLP_NPR_ADISC; |
4041 | return 1; | 4113 | return 1; |
4042 | } | 4114 | } |
@@ -4059,11 +4131,16 @@ lpfc_unreg_hba_rpis(struct lpfc_hba *phba) | |||
4059 | int i; | 4131 | int i; |
4060 | 4132 | ||
4061 | vports = lpfc_create_vport_work_array(phba); | 4133 | vports = lpfc_create_vport_work_array(phba); |
4134 | if (!vports) { | ||
4135 | lpfc_printf_log(phba, KERN_ERR, LOG_DISCOVERY, | ||
4136 | "2884 Vport array allocation failed \n"); | ||
4137 | return; | ||
4138 | } | ||
4062 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { | 4139 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { |
4063 | shost = lpfc_shost_from_vport(vports[i]); | 4140 | shost = lpfc_shost_from_vport(vports[i]); |
4064 | spin_lock_irq(shost->host_lock); | 4141 | spin_lock_irq(shost->host_lock); |
4065 | list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { | 4142 | list_for_each_entry(ndlp, &vports[i]->fc_nodes, nlp_listp) { |
4066 | if (ndlp->nlp_flag & NLP_RPI_VALID) { | 4143 | if (ndlp->nlp_flag & NLP_RPI_REGISTERED) { |
4067 | /* The mempool_alloc might sleep */ | 4144 | /* The mempool_alloc might sleep */ |
4068 | spin_unlock_irq(shost->host_lock); | 4145 | spin_unlock_irq(shost->host_lock); |
4069 | lpfc_unreg_rpi(vports[i], ndlp); | 4146 | lpfc_unreg_rpi(vports[i], ndlp); |
@@ -4192,9 +4269,6 @@ lpfc_cleanup_node(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) | |||
4192 | kfree(mp); | 4269 | kfree(mp); |
4193 | } | 4270 | } |
4194 | list_del(&mb->list); | 4271 | list_del(&mb->list); |
4195 | if (phba->sli_rev == LPFC_SLI_REV4) | ||
4196 | lpfc_sli4_free_rpi(phba, | ||
4197 | mb->u.mb.un.varRegLogin.rpi); | ||
4198 | mempool_free(mb, phba->mbox_mem_pool); | 4272 | mempool_free(mb, phba->mbox_mem_pool); |
4199 | /* We shall not invoke the lpfc_nlp_put to decrement | 4273 | /* We shall not invoke the lpfc_nlp_put to decrement |
4200 | * the ndlp reference count as we are in the process | 4274 | * the ndlp reference count as we are in the process |
@@ -4236,15 +4310,15 @@ lpfc_nlp_remove(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) | |||
4236 | 4310 | ||
4237 | lpfc_cancel_retry_delay_tmo(vport, ndlp); | 4311 | lpfc_cancel_retry_delay_tmo(vport, ndlp); |
4238 | if ((ndlp->nlp_flag & NLP_DEFER_RM) && | 4312 | if ((ndlp->nlp_flag & NLP_DEFER_RM) && |
4239 | !(ndlp->nlp_flag & NLP_REG_LOGIN_SEND) && | 4313 | !(ndlp->nlp_flag & NLP_REG_LOGIN_SEND) && |
4240 | !(ndlp->nlp_flag & NLP_RPI_VALID)) { | 4314 | !(ndlp->nlp_flag & NLP_RPI_REGISTERED)) { |
4241 | /* For this case we need to cleanup the default rpi | 4315 | /* For this case we need to cleanup the default rpi |
4242 | * allocated by the firmware. | 4316 | * allocated by the firmware. |
4243 | */ | 4317 | */ |
4244 | if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL)) | 4318 | if ((mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL)) |
4245 | != NULL) { | 4319 | != NULL) { |
4246 | rc = lpfc_reg_rpi(phba, vport->vpi, ndlp->nlp_DID, | 4320 | rc = lpfc_reg_rpi(phba, vport->vpi, ndlp->nlp_DID, |
4247 | (uint8_t *) &vport->fc_sparam, mbox, 0); | 4321 | (uint8_t *) &vport->fc_sparam, mbox, ndlp->nlp_rpi); |
4248 | if (rc) { | 4322 | if (rc) { |
4249 | mempool_free(mbox, phba->mbox_mem_pool); | 4323 | mempool_free(mbox, phba->mbox_mem_pool); |
4250 | } | 4324 | } |
@@ -4436,7 +4510,7 @@ lpfc_disc_list_loopmap(struct lpfc_vport *vport) | |||
4436 | if (!lpfc_is_link_up(phba)) | 4510 | if (!lpfc_is_link_up(phba)) |
4437 | return; | 4511 | return; |
4438 | 4512 | ||
4439 | if (phba->fc_topology != TOPOLOGY_LOOP) | 4513 | if (phba->fc_topology != LPFC_TOPOLOGY_LOOP) |
4440 | return; | 4514 | return; |
4441 | 4515 | ||
4442 | /* Check for loop map present or not */ | 4516 | /* Check for loop map present or not */ |
@@ -4788,7 +4862,10 @@ lpfc_disc_timeout_handler(struct lpfc_vport *vport) | |||
4788 | } | 4862 | } |
4789 | } | 4863 | } |
4790 | if (vport->port_state != LPFC_FLOGI) { | 4864 | if (vport->port_state != LPFC_FLOGI) { |
4791 | lpfc_initial_flogi(vport); | 4865 | if (phba->sli_rev <= LPFC_SLI_REV3) |
4866 | lpfc_initial_flogi(vport); | ||
4867 | else | ||
4868 | lpfc_issue_init_vfi(vport); | ||
4792 | return; | 4869 | return; |
4793 | } | 4870 | } |
4794 | break; | 4871 | break; |
@@ -4979,7 +5056,7 @@ lpfc_mbx_cmpl_fdmi_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb) | |||
4979 | pmb->context2 = NULL; | 5056 | pmb->context2 = NULL; |
4980 | 5057 | ||
4981 | ndlp->nlp_rpi = mb->un.varWords[0]; | 5058 | ndlp->nlp_rpi = mb->un.varWords[0]; |
4982 | ndlp->nlp_flag |= NLP_RPI_VALID; | 5059 | ndlp->nlp_flag |= NLP_RPI_REGISTERED; |
4983 | ndlp->nlp_type |= NLP_FABRIC; | 5060 | ndlp->nlp_type |= NLP_FABRIC; |
4984 | lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); | 5061 | lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE); |
4985 | 5062 | ||
@@ -5103,6 +5180,8 @@ lpfc_nlp_release(struct kref *kref) | |||
5103 | spin_lock_irqsave(&phba->ndlp_lock, flags); | 5180 | spin_lock_irqsave(&phba->ndlp_lock, flags); |
5104 | NLP_CLR_NODE_ACT(ndlp); | 5181 | NLP_CLR_NODE_ACT(ndlp); |
5105 | spin_unlock_irqrestore(&phba->ndlp_lock, flags); | 5182 | spin_unlock_irqrestore(&phba->ndlp_lock, flags); |
5183 | if (phba->sli_rev == LPFC_SLI_REV4) | ||
5184 | lpfc_sli4_free_rpi(phba, ndlp->nlp_rpi); | ||
5106 | 5185 | ||
5107 | /* free ndlp memory for final ndlp release */ | 5186 | /* free ndlp memory for final ndlp release */ |
5108 | if (NLP_CHK_FREE_REQ(ndlp)) { | 5187 | if (NLP_CHK_FREE_REQ(ndlp)) { |
@@ -5254,6 +5333,10 @@ lpfc_fcf_inuse(struct lpfc_hba *phba) | |||
5254 | 5333 | ||
5255 | vports = lpfc_create_vport_work_array(phba); | 5334 | vports = lpfc_create_vport_work_array(phba); |
5256 | 5335 | ||
5336 | /* If driver cannot allocate memory, indicate fcf is in use */ | ||
5337 | if (!vports) | ||
5338 | return 1; | ||
5339 | |||
5257 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { | 5340 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { |
5258 | shost = lpfc_shost_from_vport(vports[i]); | 5341 | shost = lpfc_shost_from_vport(vports[i]); |
5259 | spin_lock_irq(shost->host_lock); | 5342 | spin_lock_irq(shost->host_lock); |
@@ -5269,7 +5352,7 @@ lpfc_fcf_inuse(struct lpfc_hba *phba) | |||
5269 | "logged in\n", | 5352 | "logged in\n", |
5270 | ndlp->nlp_rpi, ndlp->nlp_DID, | 5353 | ndlp->nlp_rpi, ndlp->nlp_DID, |
5271 | ndlp->nlp_flag); | 5354 | ndlp->nlp_flag); |
5272 | if (ndlp->nlp_flag & NLP_RPI_VALID) | 5355 | if (ndlp->nlp_flag & NLP_RPI_REGISTERED) |
5273 | ret = 1; | 5356 | ret = 1; |
5274 | } | 5357 | } |
5275 | } | 5358 | } |
@@ -5550,7 +5633,7 @@ lpfc_unregister_unused_fcf(struct lpfc_hba *phba) | |||
5550 | * registered, do nothing. | 5633 | * registered, do nothing. |
5551 | */ | 5634 | */ |
5552 | spin_lock_irq(&phba->hbalock); | 5635 | spin_lock_irq(&phba->hbalock); |
5553 | if (!(phba->hba_flag & HBA_FCOE_SUPPORT) || | 5636 | if (!(phba->hba_flag & HBA_FCOE_MODE) || |
5554 | !(phba->fcf.fcf_flag & FCF_REGISTERED) || | 5637 | !(phba->fcf.fcf_flag & FCF_REGISTERED) || |
5555 | !(phba->hba_flag & HBA_FIP_SUPPORT) || | 5638 | !(phba->hba_flag & HBA_FIP_SUPPORT) || |
5556 | (phba->fcf.fcf_flag & FCF_DISCOVERY) || | 5639 | (phba->fcf.fcf_flag & FCF_DISCOVERY) || |