aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa/bfad.c
diff options
context:
space:
mode:
authorKrishna Gudipati <kgudipat@brocade.com>2011-06-13 18:54:31 -0400
committerJames Bottomley <JBottomley@Parallels.com>2011-06-29 16:56:05 -0400
commit75332a70a84908810ab5f525b03f230be9e31753 (patch)
treef15001807ccaf2b9857e6de82640faff160c7bb1 /drivers/scsi/bfa/bfad.c
parente2187d7f38967aeaf4148cdbe3498f76f4f71bca (diff)
[SCSI] bfa: Driver initialization and model description fix
- Moved FCS initialization, which internally does the im_port creation as well as the scsi_host creation before bfa_init. Once the bfa_init is complete & successful: - Reset the FCS base port cfg params such as pwwn/nwwn and setup fc host params - based on the values learned during the ioc getattr request. - Change needed to support BSG commands even on bfa init failure. - Model description fixes for Brocade adapters. Signed-off-by: Krishna Gudipati <kgudipat@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bfa/bfad.c')
-rw-r--r--drivers/scsi/bfa/bfad.c36
1 files changed, 27 insertions, 9 deletions
diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c
index cdf84f67f0c..0db583c50ba 100644
--- a/drivers/scsi/bfa/bfad.c
+++ b/drivers/scsi/bfa/bfad.c
@@ -915,12 +915,29 @@ bfad_drv_init(struct bfad_s *bfad)
915 bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); 915 bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE);
916 bfad->bfa_fcs.fdmi_enabled = fdmi_enable; 916 bfad->bfa_fcs.fdmi_enabled = fdmi_enable;
917 bfad->bfa_fcs.bbscn_enabled = fc_credit_recovery; 917 bfad->bfa_fcs.bbscn_enabled = fc_credit_recovery;
918 bfa_fcs_init(&bfad->bfa_fcs);
918 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 919 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
919 920
920 bfad->bfad_flags |= BFAD_DRV_INIT_DONE; 921 bfad->bfad_flags |= BFAD_DRV_INIT_DONE;
921 922
923 /* configure base port */
924 rc = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
925 if (rc != BFA_STATUS_OK)
926 goto out_cfg_pport_fail;
927
922 return BFA_STATUS_OK; 928 return BFA_STATUS_OK;
923 929
930out_cfg_pport_fail:
931 /* fcs exit - on cfg pport failure */
932 spin_lock_irqsave(&bfad->bfad_lock, flags);
933 init_completion(&bfad->comp);
934 bfad->pport.flags |= BFAD_PORT_DELETE;
935 bfa_fcs_exit(&bfad->bfa_fcs);
936 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
937 wait_for_completion(&bfad->comp);
938 /* bfa detach - free hal memory */
939 bfa_detach(&bfad->bfa);
940 bfad_hal_mem_release(bfad);
924out_hal_mem_alloc_failure: 941out_hal_mem_alloc_failure:
925 return BFA_STATUS_FAILED; 942 return BFA_STATUS_FAILED;
926} 943}
@@ -952,6 +969,7 @@ bfad_drv_start(struct bfad_s *bfad)
952 969
953 spin_lock_irqsave(&bfad->bfad_lock, flags); 970 spin_lock_irqsave(&bfad->bfad_lock, flags);
954 bfa_iocfc_start(&bfad->bfa); 971 bfa_iocfc_start(&bfad->bfa);
972 bfa_fcs_pbc_vport_init(&bfad->bfa_fcs);
955 bfa_fcs_fabric_modstart(&bfad->bfa_fcs); 973 bfa_fcs_fabric_modstart(&bfad->bfa_fcs);
956 bfad->bfad_flags |= BFAD_HAL_START_DONE; 974 bfad->bfad_flags |= BFAD_HAL_START_DONE;
957 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 975 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
@@ -1056,19 +1074,19 @@ bfad_start_ops(struct bfad_s *bfad) {
1056 strncpy(driver_info.os_device_name, bfad->pci_name, 1074 strncpy(driver_info.os_device_name, bfad->pci_name,
1057 sizeof(driver_info.os_device_name - 1)); 1075 sizeof(driver_info.os_device_name - 1));
1058 1076
1059 /* FCS INIT */ 1077 /* FCS driver info init */
1060 spin_lock_irqsave(&bfad->bfad_lock, flags); 1078 spin_lock_irqsave(&bfad->bfad_lock, flags);
1061 bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info); 1079 bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info);
1062 bfa_fcs_init(&bfad->bfa_fcs);
1063 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1080 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1064 1081
1065 retval = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM); 1082 /*
1066 if (retval != BFA_STATUS_OK) { 1083 * FCS update cfg - reset the pwwn/nwwn of fabric base logical port
1067 if (bfa_sm_cmp_state(bfad, bfad_sm_initializing)) 1084 * with values learned during bfa_init firmware GETATTR REQ.
1068 bfa_sm_set_state(bfad, bfad_sm_failed); 1085 */
1069 bfad_stop(bfad); 1086 bfa_fcs_update_cfg(&bfad->bfa_fcs);
1070 return BFA_STATUS_FAILED; 1087
1071 } 1088 /* Setup fc host fixed attribute if the lk supports */
1089 bfad_fc_host_init(bfad->pport.im_port);
1072 1090
1073 /* BFAD level FC4 IM specific resource allocation */ 1091 /* BFAD level FC4 IM specific resource allocation */
1074 retval = bfad_im_probe(bfad); 1092 retval = bfad_im_probe(bfad);