aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/bfa
diff options
context:
space:
mode:
authorVijaya Mohan Guvva <vmohan@brocade.com>2013-11-21 04:37:33 -0500
committerJames Bottomley <JBottomley@Parallels.com>2013-12-19 10:39:05 -0500
commitda3e0bee18f7f36a63537219e18a03557a21a41b (patch)
tree87bda011f67d238682c07fe4af69877c6d897d5a /drivers/scsi/bfa
parent28d358d01e1d27c17b6448935693b28cb5624bbe (diff)
[SCSI] bfa: Register port with SCSI even on port init failure
This patch addresses the issue of port not being registered with SCSI layer on bfa or firmware initialization failure and subsequently failure in collecting driver traces for debugging port init failures. Also it has minor changes related to bfad state machine clean up. Signed-off-by: Vijaya Mohan Guvva <vmohan@brocade.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi/bfa')
-rw-r--r--drivers/scsi/bfa/bfad.c85
-rw-r--r--drivers/scsi/bfa/bfad_drv.h4
2 files changed, 43 insertions, 46 deletions
diff --git a/drivers/scsi/bfa/bfad.c b/drivers/scsi/bfa/bfad.c
index fc80a325a1e6..6cf9d440cc9c 100644
--- a/drivers/scsi/bfa/bfad.c
+++ b/drivers/scsi/bfa/bfad.c
@@ -204,6 +204,7 @@ static void
204bfad_sm_created(struct bfad_s *bfad, enum bfad_sm_event event) 204bfad_sm_created(struct bfad_s *bfad, enum bfad_sm_event event)
205{ 205{
206 unsigned long flags; 206 unsigned long flags;
207 bfa_status_t ret;
207 208
208 bfa_trc(bfad, event); 209 bfa_trc(bfad, event);
209 210
@@ -217,7 +218,7 @@ bfad_sm_created(struct bfad_s *bfad, enum bfad_sm_event event)
217 if (bfad_setup_intr(bfad)) { 218 if (bfad_setup_intr(bfad)) {
218 printk(KERN_WARNING "bfad%d: bfad_setup_intr failed\n", 219 printk(KERN_WARNING "bfad%d: bfad_setup_intr failed\n",
219 bfad->inst_no); 220 bfad->inst_no);
220 bfa_sm_send_event(bfad, BFAD_E_INTR_INIT_FAILED); 221 bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED);
221 break; 222 break;
222 } 223 }
223 224
@@ -242,8 +243,26 @@ bfad_sm_created(struct bfad_s *bfad, enum bfad_sm_event event)
242 printk(KERN_WARNING 243 printk(KERN_WARNING
243 "bfa %s: bfa init failed\n", 244 "bfa %s: bfa init failed\n",
244 bfad->pci_name); 245 bfad->pci_name);
246 spin_lock_irqsave(&bfad->bfad_lock, flags);
247 bfa_fcs_init(&bfad->bfa_fcs);
248 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
249
250 ret = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
251 if (ret != BFA_STATUS_OK) {
252 init_completion(&bfad->comp);
253
254 spin_lock_irqsave(&bfad->bfad_lock, flags);
255 bfad->pport.flags |= BFAD_PORT_DELETE;
256 bfa_fcs_exit(&bfad->bfa_fcs);
257 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
258
259 wait_for_completion(&bfad->comp);
260
261 bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED);
262 break;
263 }
245 bfad->bfad_flags |= BFAD_HAL_INIT_FAIL; 264 bfad->bfad_flags |= BFAD_HAL_INIT_FAIL;
246 bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED); 265 bfa_sm_send_event(bfad, BFAD_E_HAL_INIT_FAILED);
247 } 266 }
248 267
249 break; 268 break;
@@ -273,12 +292,14 @@ bfad_sm_initializing(struct bfad_s *bfad, enum bfad_sm_event event)
273 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 292 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
274 293
275 retval = bfad_start_ops(bfad); 294 retval = bfad_start_ops(bfad);
276 if (retval != BFA_STATUS_OK) 295 if (retval != BFA_STATUS_OK) {
296 bfa_sm_set_state(bfad, bfad_sm_failed);
277 break; 297 break;
298 }
278 bfa_sm_set_state(bfad, bfad_sm_operational); 299 bfa_sm_set_state(bfad, bfad_sm_operational);
279 break; 300 break;
280 301
281 case BFAD_E_INTR_INIT_FAILED: 302 case BFAD_E_INIT_FAILED:
282 bfa_sm_set_state(bfad, bfad_sm_uninit); 303 bfa_sm_set_state(bfad, bfad_sm_uninit);
283 kthread_stop(bfad->bfad_tsk); 304 kthread_stop(bfad->bfad_tsk);
284 spin_lock_irqsave(&bfad->bfad_lock, flags); 305 spin_lock_irqsave(&bfad->bfad_lock, flags);
@@ -286,7 +307,7 @@ bfad_sm_initializing(struct bfad_s *bfad, enum bfad_sm_event event)
286 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 307 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
287 break; 308 break;
288 309
289 case BFAD_E_INIT_FAILED: 310 case BFAD_E_HAL_INIT_FAILED:
290 bfa_sm_set_state(bfad, bfad_sm_failed); 311 bfa_sm_set_state(bfad, bfad_sm_failed);
291 break; 312 break;
292 default: 313 default:
@@ -310,13 +331,8 @@ bfad_sm_failed(struct bfad_s *bfad, enum bfad_sm_event event)
310 break; 331 break;
311 332
312 case BFAD_E_STOP: 333 case BFAD_E_STOP:
313 if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE) 334 bfa_sm_set_state(bfad, bfad_sm_fcs_exit);
314 bfad_uncfg_pport(bfad); 335 bfa_sm_send_event(bfad, BFAD_E_FCS_EXIT_COMP);
315 if (bfad->bfad_flags & BFAD_FC4_PROBE_DONE) {
316 bfad_im_probe_undo(bfad);
317 bfad->bfad_flags &= ~BFAD_FC4_PROBE_DONE;
318 }
319 bfad_stop(bfad);
320 break; 336 break;
321 337
322 case BFAD_E_EXIT_COMP: 338 case BFAD_E_EXIT_COMP:
@@ -824,7 +840,7 @@ bfad_drv_init(struct bfad_s *bfad)
824 printk(KERN_WARNING 840 printk(KERN_WARNING
825 "Not enough memory to attach all Brocade HBA ports, %s", 841 "Not enough memory to attach all Brocade HBA ports, %s",
826 "System may need more memory.\n"); 842 "System may need more memory.\n");
827 goto out_hal_mem_alloc_failure; 843 return BFA_STATUS_FAILED;
828 } 844 }
829 845
830 bfad->bfa.trcmod = bfad->trcmod; 846 bfad->bfa.trcmod = bfad->trcmod;
@@ -841,31 +857,11 @@ bfad_drv_init(struct bfad_s *bfad)
841 bfad->bfa_fcs.trcmod = bfad->trcmod; 857 bfad->bfa_fcs.trcmod = bfad->trcmod;
842 bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE); 858 bfa_fcs_attach(&bfad->bfa_fcs, &bfad->bfa, bfad, BFA_FALSE);
843 bfad->bfa_fcs.fdmi_enabled = fdmi_enable; 859 bfad->bfa_fcs.fdmi_enabled = fdmi_enable;
844 bfa_fcs_init(&bfad->bfa_fcs);
845 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 860 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
846 861
847 bfad->bfad_flags |= BFAD_DRV_INIT_DONE; 862 bfad->bfad_flags |= BFAD_DRV_INIT_DONE;
848 863
849 /* configure base port */
850 rc = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
851 if (rc != BFA_STATUS_OK)
852 goto out_cfg_pport_fail;
853
854 return BFA_STATUS_OK; 864 return BFA_STATUS_OK;
855
856out_cfg_pport_fail:
857 /* fcs exit - on cfg pport failure */
858 spin_lock_irqsave(&bfad->bfad_lock, flags);
859 init_completion(&bfad->comp);
860 bfad->pport.flags |= BFAD_PORT_DELETE;
861 bfa_fcs_exit(&bfad->bfa_fcs);
862 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
863 wait_for_completion(&bfad->comp);
864 /* bfa detach - free hal memory */
865 bfa_detach(&bfad->bfa);
866 bfad_hal_mem_release(bfad);
867out_hal_mem_alloc_failure:
868 return BFA_STATUS_FAILED;
869} 865}
870 866
871void 867void
@@ -1009,13 +1005,19 @@ bfad_start_ops(struct bfad_s *bfad) {
1009 /* FCS driver info init */ 1005 /* FCS driver info init */
1010 spin_lock_irqsave(&bfad->bfad_lock, flags); 1006 spin_lock_irqsave(&bfad->bfad_lock, flags);
1011 bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info); 1007 bfa_fcs_driver_info_init(&bfad->bfa_fcs, &driver_info);
1008
1009 if (bfad->bfad_flags & BFAD_CFG_PPORT_DONE)
1010 bfa_fcs_update_cfg(&bfad->bfa_fcs);
1011 else
1012 bfa_fcs_init(&bfad->bfa_fcs);
1013
1012 spin_unlock_irqrestore(&bfad->bfad_lock, flags); 1014 spin_unlock_irqrestore(&bfad->bfad_lock, flags);
1013 1015
1014 /* 1016 if (!(bfad->bfad_flags & BFAD_CFG_PPORT_DONE)) {
1015 * FCS update cfg - reset the pwwn/nwwn of fabric base logical port 1017 retval = bfad_cfg_pport(bfad, BFA_LPORT_ROLE_FCP_IM);
1016 * with values learned during bfa_init firmware GETATTR REQ. 1018 if (retval != BFA_STATUS_OK)
1017 */ 1019 return BFA_STATUS_FAILED;
1018 bfa_fcs_update_cfg(&bfad->bfa_fcs); 1020 }
1019 1021
1020 /* Setup fc host fixed attribute if the lk supports */ 1022 /* Setup fc host fixed attribute if the lk supports */
1021 bfad_fc_host_init(bfad->pport.im_port); 1023 bfad_fc_host_init(bfad->pport.im_port);
@@ -1026,10 +1028,6 @@ bfad_start_ops(struct bfad_s *bfad) {
1026 printk(KERN_WARNING "bfad_im_probe failed\n"); 1028 printk(KERN_WARNING "bfad_im_probe failed\n");
1027 if (bfa_sm_cmp_state(bfad, bfad_sm_initializing)) 1029 if (bfa_sm_cmp_state(bfad, bfad_sm_initializing))
1028 bfa_sm_set_state(bfad, bfad_sm_failed); 1030 bfa_sm_set_state(bfad, bfad_sm_failed);
1029 bfad_im_probe_undo(bfad);
1030 bfad->bfad_flags &= ~BFAD_FC4_PROBE_DONE;
1031 bfad_uncfg_pport(bfad);
1032 bfad_stop(bfad);
1033 return BFA_STATUS_FAILED; 1031 return BFA_STATUS_FAILED;
1034 } else 1032 } else
1035 bfad->bfad_flags |= BFAD_FC4_PROBE_DONE; 1033 bfad->bfad_flags |= BFAD_FC4_PROBE_DONE;
@@ -1399,7 +1397,6 @@ bfad_pci_probe(struct pci_dev *pdev, const struct pci_device_id *pid)
1399 return 0; 1397 return 0;
1400 1398
1401out_bfad_sm_failure: 1399out_bfad_sm_failure:
1402 bfa_detach(&bfad->bfa);
1403 bfad_hal_mem_release(bfad); 1400 bfad_hal_mem_release(bfad);
1404out_drv_init_failure: 1401out_drv_init_failure:
1405 /* Remove the debugfs node for this bfad */ 1402 /* Remove the debugfs node for this bfad */
@@ -1534,7 +1531,7 @@ restart_bfa(struct bfad_s *bfad)
1534 if (bfad_setup_intr(bfad)) { 1531 if (bfad_setup_intr(bfad)) {
1535 dev_printk(KERN_WARNING, &pdev->dev, 1532 dev_printk(KERN_WARNING, &pdev->dev,
1536 "%s: bfad_setup_intr failed\n", bfad->pci_name); 1533 "%s: bfad_setup_intr failed\n", bfad->pci_name);
1537 bfa_sm_send_event(bfad, BFAD_E_INTR_INIT_FAILED); 1534 bfa_sm_send_event(bfad, BFAD_E_INIT_FAILED);
1538 return -1; 1535 return -1;
1539 } 1536 }
1540 1537
diff --git a/drivers/scsi/bfa/bfad_drv.h b/drivers/scsi/bfa/bfad_drv.h
index 78d3401bc16b..cf56d3d1dc8a 100644
--- a/drivers/scsi/bfa/bfad_drv.h
+++ b/drivers/scsi/bfa/bfad_drv.h
@@ -240,8 +240,8 @@ enum bfad_sm_event {
240 BFAD_E_KTHREAD_CREATE_FAILED = 2, 240 BFAD_E_KTHREAD_CREATE_FAILED = 2,
241 BFAD_E_INIT = 3, 241 BFAD_E_INIT = 3,
242 BFAD_E_INIT_SUCCESS = 4, 242 BFAD_E_INIT_SUCCESS = 4,
243 BFAD_E_INIT_FAILED = 5, 243 BFAD_E_HAL_INIT_FAILED = 5,
244 BFAD_E_INTR_INIT_FAILED = 6, 244 BFAD_E_INIT_FAILED = 6,
245 BFAD_E_FCS_EXIT_COMP = 7, 245 BFAD_E_FCS_EXIT_COMP = 7,
246 BFAD_E_EXIT_COMP = 8, 246 BFAD_E_EXIT_COMP = 8,
247 BFAD_E_STOP = 9 247 BFAD_E_STOP = 9