diff options
Diffstat (limited to 'drivers/scsi/bfa/bfa_ioc.c')
-rw-r--r-- | drivers/scsi/bfa/bfa_ioc.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/scsi/bfa/bfa_ioc.c b/drivers/scsi/bfa/bfa_ioc.c index 21ad2902e5ce..75ca8752b9f4 100644 --- a/drivers/scsi/bfa/bfa_ioc.c +++ b/drivers/scsi/bfa/bfa_ioc.c | |||
@@ -92,7 +92,6 @@ static void bfa_ioc_event_notify(struct bfa_ioc_s *ioc , | |||
92 | enum bfa_ioc_event_e event); | 92 | enum bfa_ioc_event_e event); |
93 | static void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); | 93 | static void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc); |
94 | static void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); | 94 | static void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc); |
95 | static void bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc); | ||
96 | static void bfa_ioc_fail_notify(struct bfa_ioc_s *ioc); | 95 | static void bfa_ioc_fail_notify(struct bfa_ioc_s *ioc); |
97 | static void bfa_ioc_pf_fwmismatch(struct bfa_ioc_s *ioc); | 96 | static void bfa_ioc_pf_fwmismatch(struct bfa_ioc_s *ioc); |
98 | 97 | ||
@@ -599,8 +598,9 @@ bfa_ioc_sm_fail(struct bfa_ioc_s *ioc, enum ioc_event event) | |||
599 | break; | 598 | break; |
600 | 599 | ||
601 | case IOC_E_HWERROR: | 600 | case IOC_E_HWERROR: |
601 | case IOC_E_HWFAILED: | ||
602 | /* | 602 | /* |
603 | * HB failure notification, ignore. | 603 | * HB failure / HW error notification, ignore. |
604 | */ | 604 | */ |
605 | break; | 605 | break; |
606 | default: | 606 | default: |
@@ -632,6 +632,10 @@ bfa_ioc_sm_hwfail(struct bfa_ioc_s *ioc, enum ioc_event event) | |||
632 | bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); | 632 | bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit); |
633 | break; | 633 | break; |
634 | 634 | ||
635 | case IOC_E_HWERROR: | ||
636 | /* Ignore - already in hwfail state */ | ||
637 | break; | ||
638 | |||
635 | default: | 639 | default: |
636 | bfa_sm_fault(ioc, event); | 640 | bfa_sm_fault(ioc, event); |
637 | } | 641 | } |
@@ -1455,7 +1459,7 @@ bfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr) | |||
1455 | bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0); | 1459 | bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0); |
1456 | 1460 | ||
1457 | for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) { | 1461 | for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) { |
1458 | if (fwhdr->md5sum[i] != drv_fwhdr->md5sum[i]) { | 1462 | if (fwhdr->md5sum[i] != cpu_to_le32(drv_fwhdr->md5sum[i])) { |
1459 | bfa_trc(ioc, i); | 1463 | bfa_trc(ioc, i); |
1460 | bfa_trc(ioc, fwhdr->md5sum[i]); | 1464 | bfa_trc(ioc, fwhdr->md5sum[i]); |
1461 | bfa_trc(ioc, drv_fwhdr->md5sum[i]); | 1465 | bfa_trc(ioc, drv_fwhdr->md5sum[i]); |
@@ -1480,7 +1484,7 @@ bfa_ioc_fwver_valid(struct bfa_ioc_s *ioc, u32 boot_env) | |||
1480 | drv_fwhdr = (struct bfi_ioc_image_hdr_s *) | 1484 | drv_fwhdr = (struct bfi_ioc_image_hdr_s *) |
1481 | bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0); | 1485 | bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0); |
1482 | 1486 | ||
1483 | if (fwhdr.signature != drv_fwhdr->signature) { | 1487 | if (fwhdr.signature != cpu_to_le32(drv_fwhdr->signature)) { |
1484 | bfa_trc(ioc, fwhdr.signature); | 1488 | bfa_trc(ioc, fwhdr.signature); |
1485 | bfa_trc(ioc, drv_fwhdr->signature); | 1489 | bfa_trc(ioc, drv_fwhdr->signature); |
1486 | return BFA_FALSE; | 1490 | return BFA_FALSE; |
@@ -1704,7 +1708,7 @@ bfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type, | |||
1704 | * write smem | 1708 | * write smem |
1705 | */ | 1709 | */ |
1706 | bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, | 1710 | bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, |
1707 | fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)]); | 1711 | cpu_to_le32(fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)])); |
1708 | 1712 | ||
1709 | loff += sizeof(u32); | 1713 | loff += sizeof(u32); |
1710 | 1714 | ||
@@ -2260,6 +2264,12 @@ bfa_ioc_disable(struct bfa_ioc_s *ioc) | |||
2260 | bfa_fsm_send_event(ioc, IOC_E_DISABLE); | 2264 | bfa_fsm_send_event(ioc, IOC_E_DISABLE); |
2261 | } | 2265 | } |
2262 | 2266 | ||
2267 | void | ||
2268 | bfa_ioc_suspend(struct bfa_ioc_s *ioc) | ||
2269 | { | ||
2270 | ioc->dbg_fwsave_once = BFA_TRUE; | ||
2271 | bfa_fsm_send_event(ioc, IOC_E_HWERROR); | ||
2272 | } | ||
2263 | 2273 | ||
2264 | /* | 2274 | /* |
2265 | * Initialize memory for saving firmware trace. Driver must initialize | 2275 | * Initialize memory for saving firmware trace. Driver must initialize |
@@ -2269,7 +2279,7 @@ void | |||
2269 | bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave) | 2279 | bfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave) |
2270 | { | 2280 | { |
2271 | ioc->dbg_fwsave = dbg_fwsave; | 2281 | ioc->dbg_fwsave = dbg_fwsave; |
2272 | ioc->dbg_fwsave_len = (ioc->iocpf.auto_recover) ? BFA_DBG_FWTRC_LEN : 0; | 2282 | ioc->dbg_fwsave_len = BFA_DBG_FWTRC_LEN; |
2273 | } | 2283 | } |
2274 | 2284 | ||
2275 | /* | 2285 | /* |
@@ -2856,7 +2866,7 @@ bfa_ioc_fw_stats_clear(struct bfa_ioc_s *ioc) | |||
2856 | /* | 2866 | /* |
2857 | * Save firmware trace if configured. | 2867 | * Save firmware trace if configured. |
2858 | */ | 2868 | */ |
2859 | static void | 2869 | void |
2860 | bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc) | 2870 | bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc) |
2861 | { | 2871 | { |
2862 | int tlen; | 2872 | int tlen; |