Lines Matching refs:ioc

50 static void bfa_ioc_hw_sem_init(struct bfa_ioc *ioc);
51 static void bfa_ioc_hw_sem_get(struct bfa_ioc *ioc);
52 static void bfa_ioc_hw_sem_get_cancel(struct bfa_ioc *ioc);
53 static void bfa_ioc_hwinit(struct bfa_ioc *ioc, bool force);
54 static void bfa_ioc_poll_fwinit(struct bfa_ioc *ioc);
55 static void bfa_ioc_send_enable(struct bfa_ioc *ioc);
56 static void bfa_ioc_send_disable(struct bfa_ioc *ioc);
57 static void bfa_ioc_send_getattr(struct bfa_ioc *ioc);
58 static void bfa_ioc_hb_monitor(struct bfa_ioc *ioc);
59 static void bfa_ioc_hb_stop(struct bfa_ioc *ioc);
60 static void bfa_ioc_reset(struct bfa_ioc *ioc, bool force);
61 static void bfa_ioc_mbox_poll(struct bfa_ioc *ioc);
62 static void bfa_ioc_mbox_flush(struct bfa_ioc *ioc);
63 static void bfa_ioc_recover(struct bfa_ioc *ioc);
65 static void bfa_ioc_disable_comp(struct bfa_ioc *ioc);
66 static void bfa_ioc_lpu_stop(struct bfa_ioc *ioc);
67 static void bfa_nw_ioc_debug_save_ftrc(struct bfa_ioc *ioc);
68 static void bfa_ioc_fail_notify(struct bfa_ioc *ioc);
69 static void bfa_ioc_pf_enabled(struct bfa_ioc *ioc);
70 static void bfa_ioc_pf_disabled(struct bfa_ioc *ioc);
71 static void bfa_ioc_pf_failed(struct bfa_ioc *ioc);
72 static void bfa_ioc_pf_hwfailed(struct bfa_ioc *ioc);
73 static void bfa_ioc_pf_fwmismatch(struct bfa_ioc *ioc);
74 static enum bfa_status bfa_ioc_boot(struct bfa_ioc *ioc,
76 static u32 bfa_ioc_smem_pgnum(struct bfa_ioc *ioc, u32 fmaddr);
77 static void bfa_ioc_get_adapter_serial_num(struct bfa_ioc *ioc,
79 static void bfa_ioc_get_adapter_fw_ver(struct bfa_ioc *ioc,
81 static void bfa_ioc_get_pci_chip_rev(struct bfa_ioc *ioc,
83 static void bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc,
85 static void bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc,
87 static void bfa_ioc_get_adapter_model(struct bfa_ioc *ioc, char *model);
88 static u64 bfa_ioc_get_pwwn(struct bfa_ioc *ioc);
133 static void bfa_iocpf_enable(struct bfa_ioc *ioc);
134 static void bfa_iocpf_disable(struct bfa_ioc *ioc);
135 static void bfa_iocpf_fail(struct bfa_ioc *ioc);
136 static void bfa_iocpf_initfail(struct bfa_ioc *ioc);
137 static void bfa_iocpf_getattrfail(struct bfa_ioc *ioc);
138 static void bfa_iocpf_stop(struct bfa_ioc *ioc);
148 IOCPF_E_FAIL = 7, /*!< failure notice by ioc sm */
149 IOCPF_E_INITFAIL = 8, /*!< init fail notice by ioc sm */
150 IOCPF_E_GETATTRFAIL = 9, /*!< init fail notice by ioc sm */
207 bfa_ioc_sm_uninit_entry(struct bfa_ioc *ioc)
213 bfa_ioc_sm_uninit(struct bfa_ioc *ioc, enum ioc_event event)
217 bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
227 bfa_ioc_sm_reset_entry(struct bfa_ioc *ioc)
229 bfa_fsm_set_state(&ioc->iocpf, bfa_iocpf_sm_reset);
234 bfa_ioc_sm_reset(struct bfa_ioc *ioc, enum ioc_event event)
238 bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling);
242 bfa_ioc_disable_comp(ioc);
246 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
255 bfa_ioc_sm_enabling_entry(struct bfa_ioc *ioc)
257 bfa_iocpf_enable(ioc);
264 bfa_ioc_sm_enabling(struct bfa_ioc *ioc, enum ioc_event event)
268 bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr);
274 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
275 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
277 bfa_iocpf_initfail(ioc);
281 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
282 bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
286 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
290 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
291 bfa_iocpf_stop(ioc);
304 bfa_ioc_sm_getattr_entry(struct bfa_ioc *ioc)
306 mod_timer(&ioc->ioc_timer, jiffies +
308 bfa_ioc_send_getattr(ioc);
313 bfa_ioc_sm_getattr(struct bfa_ioc *ioc, enum ioc_event event)
317 del_timer(&ioc->ioc_timer);
318 bfa_fsm_set_state(ioc, bfa_ioc_sm_op);
323 del_timer(&ioc->ioc_timer);
326 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
327 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
329 bfa_iocpf_getattrfail(ioc);
333 del_timer(&ioc->ioc_timer);
334 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
346 bfa_ioc_sm_op_entry(struct bfa_ioc *ioc)
348 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK);
349 bfa_ioc_event_notify(ioc, BFA_IOC_E_ENABLED);
350 bfa_ioc_hb_monitor(ioc);
354 bfa_ioc_sm_op(struct bfa_ioc *ioc, enum ioc_event event)
361 bfa_ioc_hb_stop(ioc);
362 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
367 bfa_ioc_hb_stop(ioc);
371 if (ioc->iocpf.auto_recover)
372 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail_retry);
374 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
376 bfa_ioc_fail_notify(ioc);
379 bfa_iocpf_fail(ioc);
388 bfa_ioc_sm_disabling_entry(struct bfa_ioc *ioc)
390 bfa_iocpf_disable(ioc);
395 bfa_ioc_sm_disabling(struct bfa_ioc *ioc, enum ioc_event event)
399 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
408 bfa_iocpf_fail(ioc);
412 bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
413 bfa_ioc_disable_comp(ioc);
423 bfa_ioc_sm_disabled_entry(struct bfa_ioc *ioc)
425 bfa_ioc_disable_comp(ioc);
429 bfa_ioc_sm_disabled(struct bfa_ioc *ioc, enum ioc_event event)
433 bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling);
437 ioc->cbfn->disable_cbfn(ioc->bfa);
441 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
442 bfa_iocpf_stop(ioc);
451 bfa_ioc_sm_fail_retry_entry(struct bfa_ioc *ioc)
457 bfa_ioc_sm_fail_retry(struct bfa_ioc *ioc, enum ioc_event event)
461 bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr);
469 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
470 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
472 bfa_iocpf_initfail(ioc);
476 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
477 bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
484 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
488 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
489 bfa_iocpf_stop(ioc);
498 bfa_ioc_sm_fail_entry(struct bfa_ioc *ioc)
504 bfa_ioc_sm_fail(struct bfa_ioc *ioc, enum ioc_event event)
508 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
512 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
516 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
517 bfa_iocpf_stop(ioc);
530 bfa_ioc_sm_hwfail_entry(struct bfa_ioc *ioc)
536 bfa_ioc_sm_hwfail(struct bfa_ioc *ioc, enum ioc_event event)
541 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
545 ioc->cbfn->disable_cbfn(ioc->bfa);
549 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
588 bfa_ioc_hw_sem_init(iocpf->ioc);
589 bfa_ioc_hw_sem_get(iocpf->ioc);
596 struct bfa_ioc *ioc = iocpf->ioc;
600 if (bfa_ioc_firmware_lock(ioc)) {
601 if (bfa_ioc_sync_start(ioc)) {
602 bfa_ioc_sync_join(ioc);
605 bfa_ioc_firmware_unlock(ioc);
606 bfa_nw_ioc_hw_sem_release(ioc);
607 mod_timer(&ioc->sem_timer, jiffies +
611 bfa_nw_ioc_hw_sem_release(ioc);
618 bfa_ioc_pf_hwfailed(ioc);
622 bfa_ioc_hw_sem_get_cancel(ioc);
624 bfa_ioc_pf_disabled(ioc);
628 bfa_ioc_hw_sem_get_cancel(ioc);
643 bfa_ioc_pf_fwmismatch(iocpf->ioc);
646 mod_timer(&(iocpf->ioc)->iocpf_timer, jiffies +
654 struct bfa_ioc *ioc = iocpf->ioc;
662 del_timer(&ioc->iocpf_timer);
664 bfa_ioc_pf_disabled(ioc);
668 del_timer(&ioc->iocpf_timer);
681 bfa_ioc_hw_sem_get(iocpf->ioc);
688 struct bfa_ioc *ioc = iocpf->ioc;
692 if (bfa_ioc_sync_complete(ioc)) {
693 bfa_ioc_sync_join(ioc);
696 bfa_nw_ioc_hw_sem_release(ioc);
697 mod_timer(&ioc->sem_timer, jiffies +
704 bfa_ioc_pf_hwfailed(ioc);
708 bfa_ioc_hw_sem_get_cancel(ioc);
721 bfa_ioc_reset(iocpf->ioc, false);
730 struct bfa_ioc *ioc = iocpf->ioc;
738 bfa_nw_ioc_hw_sem_release(ioc);
739 bfa_ioc_pf_failed(ioc);
744 del_timer(&ioc->iocpf_timer);
745 bfa_ioc_sync_leave(ioc);
746 bfa_nw_ioc_hw_sem_release(ioc);
758 mod_timer(&(iocpf->ioc)->iocpf_timer, jiffies +
763 iocpf->ioc->cbfn->reset_cbfn(iocpf->ioc->bfa);
764 bfa_ioc_send_enable(iocpf->ioc);
773 struct bfa_ioc *ioc = iocpf->ioc;
777 del_timer(&ioc->iocpf_timer);
778 bfa_nw_ioc_hw_sem_release(ioc);
783 del_timer(&ioc->iocpf_timer);
787 bfa_nw_ioc_hw_sem_release(ioc);
789 bfa_ioc_pf_failed(ioc);
794 del_timer(&ioc->iocpf_timer);
795 bfa_nw_ioc_hw_sem_release(ioc);
807 bfa_ioc_pf_enabled(iocpf->ioc);
834 mod_timer(&(iocpf->ioc)->iocpf_timer, jiffies +
836 bfa_ioc_send_disable(iocpf->ioc);
843 struct bfa_ioc *ioc = iocpf->ioc;
847 del_timer(&ioc->iocpf_timer);
852 del_timer(&ioc->iocpf_timer);
856 bfa_ioc_set_cur_ioc_fwstate(ioc, BFI_IOC_FAIL);
871 bfa_ioc_hw_sem_get(iocpf->ioc);
878 struct bfa_ioc *ioc = iocpf->ioc;
882 bfa_ioc_sync_leave(ioc);
883 bfa_nw_ioc_hw_sem_release(ioc);
889 bfa_ioc_pf_hwfailed(ioc);
904 bfa_ioc_mbox_flush(iocpf->ioc);
905 bfa_ioc_pf_disabled(iocpf->ioc);
911 struct bfa_ioc *ioc = iocpf->ioc;
919 bfa_ioc_firmware_unlock(ioc);
931 bfa_nw_ioc_debug_save_ftrc(iocpf->ioc);
932 bfa_ioc_hw_sem_get(iocpf->ioc);
939 struct bfa_ioc *ioc = iocpf->ioc;
943 bfa_ioc_notify_fail(ioc);
944 bfa_ioc_sync_leave(ioc);
945 bfa_ioc_set_cur_ioc_fwstate(ioc, BFI_IOC_FAIL);
946 bfa_nw_ioc_hw_sem_release(ioc);
952 bfa_ioc_pf_hwfailed(ioc);
956 bfa_ioc_hw_sem_get_cancel(ioc);
961 bfa_ioc_hw_sem_get_cancel(ioc);
962 bfa_ioc_firmware_unlock(ioc);
983 struct bfa_ioc *ioc = iocpf->ioc;
991 bfa_ioc_firmware_unlock(ioc);
1006 bfa_ioc_lpu_stop(iocpf->ioc);
1011 bfa_ioc_mbox_flush(iocpf->ioc);
1012 bfa_ioc_hw_sem_get(iocpf->ioc);
1019 struct bfa_ioc *ioc = iocpf->ioc;
1023 bfa_ioc_sync_ack(ioc);
1024 bfa_ioc_notify_fail(ioc);
1026 bfa_ioc_sync_leave(ioc);
1027 bfa_ioc_set_cur_ioc_fwstate(ioc, BFI_IOC_FAIL);
1028 bfa_nw_ioc_hw_sem_release(ioc);
1031 if (bfa_ioc_sync_complete(ioc))
1034 bfa_nw_ioc_hw_sem_release(ioc);
1042 bfa_ioc_pf_hwfailed(ioc);
1046 bfa_ioc_hw_sem_get_cancel(ioc);
1081 bfa_ioc_event_notify(struct bfa_ioc *ioc, enum bfa_ioc_event event)
1085 list_for_each_entry(notify, &ioc->notify_q, qe)
1090 bfa_ioc_disable_comp(struct bfa_ioc *ioc)
1092 ioc->cbfn->disable_cbfn(ioc->bfa);
1093 bfa_ioc_event_notify(ioc, BFA_IOC_E_DISABLED);
1126 bfa_ioc_fwver_clear(struct bfa_ioc *ioc)
1131 pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
1132 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1135 writel(0, ioc->ioc_regs.smem_page_start + loff);
1142 bfa_ioc_hw_sem_init(struct bfa_ioc *ioc)
1148 r32 = readl(ioc->ioc_regs.ioc_init_sem_reg);
1151 r32 = readl(ioc->ioc_regs.ioc_init_sem_reg);
1154 fwstate = bfa_ioc_get_cur_ioc_fwstate(ioc);
1156 writel(1, ioc->ioc_regs.ioc_init_sem_reg);
1160 bfa_nw_ioc_fwver_get(ioc, &fwhdr);
1163 writel(1, ioc->ioc_regs.ioc_init_sem_reg);
1167 bfa_ioc_fwver_clear(ioc);
1168 bfa_ioc_set_cur_ioc_fwstate(ioc, BFI_IOC_UNINIT);
1169 bfa_ioc_set_alt_ioc_fwstate(ioc, BFI_IOC_UNINIT);
1174 readl(ioc->ioc_regs.ioc_sem_reg);
1175 writel(1, ioc->ioc_regs.ioc_sem_reg);
1178 writel(1, ioc->ioc_regs.ioc_init_sem_reg);
1182 bfa_ioc_hw_sem_get(struct bfa_ioc *ioc)
1190 r32 = readl(ioc->ioc_regs.ioc_sem_reg);
1192 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEM_ERROR);
1196 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEMLOCKED);
1200 mod_timer(&ioc->sem_timer, jiffies +
1205 bfa_nw_ioc_hw_sem_release(struct bfa_ioc *ioc)
1207 writel(1, ioc->ioc_regs.ioc_sem_reg);
1211 bfa_ioc_hw_sem_get_cancel(struct bfa_ioc *ioc)
1213 del_timer(&ioc->sem_timer);
1218 bfa_ioc_lmem_init(struct bfa_ioc *ioc)
1224 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1232 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1239 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1250 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1254 bfa_ioc_lpu_start(struct bfa_ioc *ioc)
1261 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1264 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1268 bfa_ioc_lpu_stop(struct bfa_ioc *ioc)
1275 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1278 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1283 bfa_nw_ioc_fwver_get(struct bfa_ioc *ioc, struct bfi_ioc_image_hdr *fwhdr)
1290 pgnum = bfa_ioc_smem_pgnum(ioc, loff);
1291 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1296 swab32(readl(loff + ioc->ioc_regs.smem_page_start));
1740 bfa_nw_ioc_flash_img_get_chnk(struct bfa_ioc *ioc, u32 off,
1743 return bfa_flash_raw_read(ioc->pcidev.pci_bar_kva,
1749 bfa_ioc_flash_fwver_cmp(struct bfa_ioc *ioc,
1756 status = bfa_nw_ioc_flash_img_get_chnk(ioc, 0, fwimg);
1771 bfa_nw_ioc_fwver_cmp(struct bfa_ioc *ioc, struct bfi_ioc_image_hdr *fwhdr)
1777 bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
1790 smem_flash_cmp = bfa_ioc_flash_fwver_cmp(ioc, fwhdr);
1805 bfa_ioc_fwver_valid(struct bfa_ioc *ioc, u32 boot_env)
1809 bfa_nw_ioc_fwver_get(ioc, &fwhdr);
1813 return bfa_nw_ioc_fwver_cmp(ioc, &fwhdr);
1818 bfa_ioc_msgflush(struct bfa_ioc *ioc)
1822 r32 = readl(ioc->ioc_regs.lpu_mbox_cmd);
1824 writel(1, ioc->ioc_regs.lpu_mbox_cmd);
1828 bfa_ioc_hwinit(struct bfa_ioc *ioc, bool force)
1834 ioc_fwstate = bfa_ioc_get_cur_ioc_fwstate(ioc);
1845 false : bfa_ioc_fwver_valid(ioc, boot_env);
1848 if (bfa_ioc_boot(ioc, BFI_FWBOOT_TYPE_NORMAL, boot_env) ==
1850 bfa_ioc_poll_fwinit(ioc);
1860 bfa_ioc_poll_fwinit(ioc);
1873 bfa_ioc_msgflush(ioc);
1874 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY);
1881 if (bfa_ioc_boot(ioc, BFI_FWBOOT_TYPE_NORMAL, boot_env) ==
1883 bfa_ioc_poll_fwinit(ioc);
1887 bfa_nw_ioc_timeout(struct bfa_ioc *ioc)
1889 bfa_fsm_send_event(ioc, IOC_E_TIMEOUT);
1893 bfa_ioc_mbox_send(struct bfa_ioc *ioc, void *ioc_msg, int len)
1905 ioc->ioc_regs.hfn_mbox + i * sizeof(u32));
1908 writel(0, ioc->ioc_regs.hfn_mbox + i * sizeof(u32));
1913 writel(1, ioc->ioc_regs.hfn_mbox_cmd);
1914 (void) readl(ioc->ioc_regs.hfn_mbox_cmd);
1918 bfa_ioc_send_enable(struct bfa_ioc *ioc)
1923 bfa_ioc_portid(ioc));
1924 enable_req.clscode = htons(ioc->clscode);
1928 bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req));
1932 bfa_ioc_send_disable(struct bfa_ioc *ioc)
1937 bfa_ioc_portid(ioc));
1938 disable_req.clscode = htons(ioc->clscode);
1942 bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req));
1946 bfa_ioc_send_getattr(struct bfa_ioc *ioc)
1951 bfa_ioc_portid(ioc));
1952 bfa_dma_be_addr_set(attr_req.attr_addr, ioc->attr_dma.pa);
1953 bfa_ioc_mbox_send(ioc, &attr_req, sizeof(attr_req));
1957 bfa_nw_ioc_hb_check(struct bfa_ioc *ioc)
1961 hb_count = readl(ioc->ioc_regs.heartbeat);
1962 if (ioc->hb_count == hb_count) {
1963 bfa_ioc_recover(ioc);
1966 ioc->hb_count = hb_count;
1969 bfa_ioc_mbox_poll(ioc);
1970 mod_timer(&ioc->hb_timer, jiffies +
1975 bfa_ioc_hb_monitor(struct bfa_ioc *ioc)
1977 ioc->hb_count = readl(ioc->ioc_regs.heartbeat);
1978 mod_timer(&ioc->hb_timer, jiffies +
1983 bfa_ioc_hb_stop(struct bfa_ioc *ioc)
1985 del_timer(&ioc->hb_timer);
1990 bfa_ioc_download_fw(struct bfa_ioc *ioc, u32 boot_type,
2007 status = bfa_nw_ioc_flash_img_get_chnk(ioc,
2014 fwimg_size = bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc));
2015 fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc),
2019 pgnum = bfa_ioc_smem_pgnum(ioc, loff);
2021 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
2028 status = bfa_nw_ioc_flash_img_get_chnk(ioc,
2037 bfa_ioc_asic_gen(ioc),
2046 ioc->ioc_regs.smem_page_start + loff);
2057 ioc->ioc_regs.host_page_num_fn);
2061 writel(bfa_ioc_smem_pgnum(ioc, 0),
2062 ioc->ioc_regs.host_page_num_fn);
2071 asicmode = BFI_FWBOOT_DEVMODE(ioc->asic_gen, ioc->asic_mode,
2072 ioc->port0_mode, ioc->port1_mode);
2073 writel(asicmode, ((ioc->ioc_regs.smem_page_start)
2075 writel(boot_type, ((ioc->ioc_regs.smem_page_start)
2077 writel(boot_env, ((ioc->ioc_regs.smem_page_start)
2083 bfa_ioc_reset(struct bfa_ioc *ioc, bool force)
2085 bfa_ioc_hwinit(ioc, force);
2088 /* BFA ioc enable reply by firmware */
2090 bfa_ioc_enable_reply(struct bfa_ioc *ioc, enum bfa_mode port_mode,
2093 struct bfa_iocpf *iocpf = &ioc->iocpf;
2095 ioc->port_mode = ioc->port_mode_cfg = port_mode;
2096 ioc->ad_cap_bm = cap_bm;
2102 bfa_ioc_getattr_reply(struct bfa_ioc *ioc)
2104 struct bfi_ioc_attr *attr = ioc->attr;
2110 bfa_fsm_send_event(ioc, IOC_E_FWRSP_GETATTR);
2115 bfa_ioc_mbox_attach(struct bfa_ioc *ioc)
2117 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2123 mod->mbhdlr[mc].cbarg = ioc->bfa;
2129 bfa_ioc_mbox_poll(struct bfa_ioc *ioc)
2131 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2146 stat = readl(ioc->ioc_regs.hfn_mbox_cmd);
2155 bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
2170 bfa_ioc_mbox_flush(struct bfa_ioc *ioc)
2172 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2184 * @ioc: memory for IOC
2190 bfa_nw_ioc_smem_read(struct bfa_ioc *ioc, void *tbuf, u32 soff, u32 sz)
2196 pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, soff);
2202 if (!bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg))
2205 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
2209 r32 = swab32(readl(loff + ioc->ioc_regs.smem_page_start));
2219 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
2223 writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0),
2224 ioc->ioc_regs.host_page_num_fn);
2229 readl(ioc->ioc_regs.ioc_init_sem_reg);
2230 writel(1, ioc->ioc_regs.ioc_init_sem_reg);
2236 bfa_nw_ioc_debug_fwtrc(struct bfa_ioc *ioc, void *trcdata, int *trclen)
2238 u32 loff = BFI_IOC_TRC_OFF + BNA_DBG_FWTRC_LEN * ioc->port_id;
2245 status = bfa_nw_ioc_smem_read(ioc, trcdata, loff, tlen);
2252 bfa_nw_ioc_debug_save_ftrc(struct bfa_ioc *ioc)
2256 if (ioc->dbg_fwsave_once) {
2257 ioc->dbg_fwsave_once = false;
2258 if (ioc->dbg_fwsave_len) {
2259 tlen = ioc->dbg_fwsave_len;
2260 bfa_nw_ioc_debug_fwtrc(ioc, ioc->dbg_fwsave, &tlen);
2267 bfa_nw_ioc_debug_fwsave(struct bfa_ioc *ioc, void *trcdata, int *trclen)
2271 if (ioc->dbg_fwsave_len == 0)
2275 if (tlen > ioc->dbg_fwsave_len)
2276 tlen = ioc->dbg_fwsave_len;
2278 memcpy(trcdata, ioc->dbg_fwsave, tlen);
2284 bfa_ioc_fail_notify(struct bfa_ioc *ioc)
2289 ioc->cbfn->hbfail_cbfn(ioc->bfa);
2290 bfa_ioc_event_notify(ioc, BFA_IOC_E_FAILED);
2291 bfa_nw_ioc_debug_save_ftrc(ioc);
2296 bfa_ioc_pf_enabled(struct bfa_ioc *ioc)
2298 bfa_fsm_send_event(ioc, IOC_E_ENABLED);
2302 bfa_ioc_pf_disabled(struct bfa_ioc *ioc)
2304 bfa_fsm_send_event(ioc, IOC_E_DISABLED);
2308 bfa_ioc_pf_failed(struct bfa_ioc *ioc)
2310 bfa_fsm_send_event(ioc, IOC_E_PFFAILED);
2314 bfa_ioc_pf_hwfailed(struct bfa_ioc *ioc)
2316 bfa_fsm_send_event(ioc, IOC_E_HWFAILED);
2320 bfa_ioc_pf_fwmismatch(struct bfa_ioc *ioc)
2325 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
2330 bfa_ioc_pll_init(struct bfa_ioc *ioc)
2335 bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg);
2337 bfa_ioc_pll_init_asic(ioc);
2339 ioc->pllinit = true;
2342 bfa_ioc_lmem_init(ioc);
2347 bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg);
2356 bfa_ioc_boot(struct bfa_ioc *ioc, enum bfi_fwboot_type boot_type,
2361 bfa_ioc_stats(ioc, ioc_boots);
2363 if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK)
2368 bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
2372 if (bfa_ioc_flash_fwver_cmp(ioc, drv_fwhdr) ==
2381 bfa_ioc_set_cur_ioc_fwstate(ioc, BFI_IOC_MEMTEST);
2382 bfa_ioc_set_alt_ioc_fwstate(ioc, BFI_IOC_MEMTEST);
2384 bfa_ioc_set_cur_ioc_fwstate(ioc, BFI_IOC_INITING);
2385 bfa_ioc_set_alt_ioc_fwstate(ioc, BFI_IOC_INITING);
2388 bfa_ioc_msgflush(ioc);
2389 status = bfa_ioc_download_fw(ioc, boot_type, boot_env);
2391 bfa_ioc_lpu_start(ioc);
2393 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_TIMEOUT);
2406 bfa_ioc_msgget(struct bfa_ioc *ioc, void *mbmsg)
2412 r32 = readl(ioc->ioc_regs.lpu_mbox_cmd);
2421 r32 = readl(ioc->ioc_regs.lpu_mbox +
2429 writel(1, ioc->ioc_regs.lpu_mbox_cmd);
2430 readl(ioc->ioc_regs.lpu_mbox_cmd);
2436 bfa_ioc_isr(struct bfa_ioc *ioc, struct bfi_mbmsg *m)
2439 struct bfa_iocpf *iocpf = &ioc->iocpf;
2443 bfa_ioc_stats(ioc, ioc_isrs);
2450 bfa_ioc_enable_reply(ioc,
2460 bfa_ioc_getattr_reply(ioc);
2471 * @ioc: memory for IOC
2476 bfa_nw_ioc_attach(struct bfa_ioc *ioc, void *bfa, struct bfa_ioc_cbfn *cbfn)
2478 ioc->bfa = bfa;
2479 ioc->cbfn = cbfn;
2480 ioc->fcmode = false;
2481 ioc->pllinit = false;
2482 ioc->dbg_fwsave_once = true;
2483 ioc->iocpf.ioc = ioc;
2485 bfa_ioc_mbox_attach(ioc);
2486 INIT_LIST_HEAD(&ioc->notify_q);
2488 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
2489 bfa_fsm_send_event(ioc, IOC_E_RESET);
2494 bfa_nw_ioc_detach(struct bfa_ioc *ioc)
2496 bfa_fsm_send_event(ioc, IOC_E_DETACH);
2499 INIT_LIST_HEAD(&ioc->notify_q);
2505 * @ioc: memory for IOC
2510 bfa_nw_ioc_pci_init(struct bfa_ioc *ioc, struct bfa_pcidev *pcidev,
2513 ioc->clscode = clscode;
2514 ioc->pcidev = *pcidev;
2519 ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_FC;
2520 ioc->asic_mode = BFI_ASIC_MODE_FC;
2524 ioc->asic_gen = BFI_ASIC_GEN_CT;
2525 ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
2526 ioc->asic_mode = BFI_ASIC_MODE_ETH;
2527 ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_CNA;
2528 ioc->ad_cap_bm = BFA_CM_CNA;
2532 ioc->asic_gen = BFI_ASIC_GEN_CT2;
2535 ioc->asic_mode = BFI_ASIC_MODE_FC16;
2536 ioc->fcmode = true;
2537 ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA;
2538 ioc->ad_cap_bm = BFA_CM_HBA;
2540 ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
2541 ioc->asic_mode = BFI_ASIC_MODE_ETH;
2543 ioc->port_mode =
2544 ioc->port_mode_cfg = BFA_MODE_CNA;
2545 ioc->ad_cap_bm = BFA_CM_CNA;
2547 ioc->port_mode =
2548 ioc->port_mode_cfg = BFA_MODE_NIC;
2549 ioc->ad_cap_bm = BFA_CM_NIC;
2561 if (ioc->asic_gen == BFI_ASIC_GEN_CT)
2562 bfa_nw_ioc_set_ct_hwif(ioc);
2564 WARN_ON(ioc->asic_gen != BFI_ASIC_GEN_CT2);
2565 bfa_nw_ioc_set_ct2_hwif(ioc);
2566 bfa_nw_ioc_ct2_poweron(ioc);
2569 bfa_ioc_map_port(ioc);
2570 bfa_ioc_reg_init(ioc);
2576 * @ioc: memory for IOC
2581 bfa_nw_ioc_mem_claim(struct bfa_ioc *ioc, u8 *dm_kva, u64 dm_pa)
2586 ioc->attr_dma.kva = dm_kva;
2587 ioc->attr_dma.pa = dm_pa;
2588 ioc->attr = (struct bfi_ioc_attr *) dm_kva;
2599 bfa_nw_ioc_enable(struct bfa_ioc *ioc)
2601 bfa_ioc_stats(ioc, ioc_enables);
2602 ioc->dbg_fwsave_once = true;
2604 bfa_fsm_send_event(ioc, IOC_E_ENABLE);
2608 bfa_nw_ioc_disable(struct bfa_ioc *ioc)
2610 bfa_ioc_stats(ioc, ioc_disables);
2611 bfa_fsm_send_event(ioc, IOC_E_DISABLE);
2616 bfa_nw_ioc_debug_memclaim(struct bfa_ioc *ioc, void *dbg_fwsave)
2618 ioc->dbg_fwsave = dbg_fwsave;
2619 ioc->dbg_fwsave_len = ioc->iocpf.auto_recover ? BNA_DBG_FWTRC_LEN : 0;
2623 bfa_ioc_smem_pgnum(struct bfa_ioc *ioc, u32 fmaddr)
2625 return PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, fmaddr);
2630 bfa_nw_ioc_mbox_regisr(struct bfa_ioc *ioc, enum bfi_mclass mc,
2633 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2642 * @ioc: IOC instance
2650 bfa_nw_ioc_mbox_queue(struct bfa_ioc *ioc, struct bfa_mbox_cmd *cmd,
2653 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2670 stat = readl(ioc->ioc_regs.hfn_mbox_cmd);
2679 bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
2686 bfa_nw_ioc_mbox_isr(struct bfa_ioc *ioc)
2688 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2692 if (bfa_ioc_msgget(ioc, &m)) {
2698 bfa_ioc_isr(ioc, &m);
2708 bfa_ioc_lpu_read_stat(ioc);
2713 bfa_ioc_mbox_poll(ioc);
2717 bfa_nw_ioc_error_isr(struct bfa_ioc *ioc)
2719 bfa_ioc_stats(ioc, ioc_hbfails);
2720 bfa_ioc_stats_hb_count(ioc, ioc->hb_count);
2721 bfa_fsm_send_event(ioc, IOC_E_HWERROR);
2726 bfa_nw_ioc_is_disabled(struct bfa_ioc *ioc)
2728 return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabling) ||
2729 bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled);
2734 bfa_nw_ioc_is_operational(struct bfa_ioc *ioc)
2736 return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_op);
2743 bfa_nw_ioc_notify_register(struct bfa_ioc *ioc,
2746 list_add_tail(&notify->qe, &ioc->notify_q);
2751 bfa_ioc_get_adapter_attr(struct bfa_ioc *ioc,
2756 ioc_attr = ioc->attr;
2758 bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num);
2759 bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver);
2760 bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver);
2761 bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer);
2765 ad_attr->nports = bfa_ioc_get_nports(ioc);
2766 ad_attr->max_speed = bfa_ioc_speed_sup(ioc);
2768 bfa_ioc_get_adapter_model(ioc, ad_attr->model);
2770 bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr);
2780 ad_attr->pwwn = bfa_ioc_get_pwwn(ioc);
2781 bfa_nw_ioc_get_mac(ioc, ad_attr->mac);
2788 bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver);
2792 bfa_ioc_get_type(struct bfa_ioc *ioc)
2794 if (ioc->clscode == BFI_PCIFN_CLASS_ETH)
2797 BUG_ON(!(ioc->clscode == BFI_PCIFN_CLASS_FC));
2799 return (ioc->attr->port_mode == BFI_PORT_MODE_FC)
2804 bfa_ioc_get_adapter_serial_num(struct bfa_ioc *ioc, char *serial_num)
2807 (void *)ioc->attr->brcd_serialnum,
2812 bfa_ioc_get_adapter_fw_ver(struct bfa_ioc *ioc, char *fw_ver)
2814 memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN);
2818 bfa_ioc_get_pci_chip_rev(struct bfa_ioc *ioc, char *chip_rev)
2828 chip_rev[4] = ioc->attr->asic_rev;
2833 bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc, char *optrom_ver)
2835 memcpy(optrom_ver, ioc->attr->optrom_version,
2840 bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer)
2846 bfa_ioc_get_adapter_model(struct bfa_ioc *ioc, char *model)
2853 ioc_attr = ioc->attr;
2860 bfa_ioc_get_state(struct bfa_ioc *ioc)
2863 enum bfa_ioc_state ioc_st = ioc_sm_to_state(ioc_sm_table, ioc->fsm);
2868 iocpf_st = iocpf_sm_to_state(iocpf_sm_table, ioc->iocpf.fsm);
2899 bfa_nw_ioc_get_attr(struct bfa_ioc *ioc, struct bfa_ioc_attr *ioc_attr)
2903 ioc_attr->state = bfa_ioc_get_state(ioc);
2904 ioc_attr->port_id = bfa_ioc_portid(ioc);
2905 ioc_attr->port_mode = ioc->port_mode;
2907 ioc_attr->port_mode_cfg = ioc->port_mode_cfg;
2908 ioc_attr->cap_bm = ioc->ad_cap_bm;
2910 ioc_attr->ioc_type = bfa_ioc_get_type(ioc);
2912 bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr);
2914 ioc_attr->pci_attr.device_id = bfa_ioc_devid(ioc);
2915 ioc_attr->pci_attr.pcifn = bfa_ioc_pcifn(ioc);
2916 ioc_attr->def_fn = bfa_ioc_is_default(ioc);
2917 bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev);
2922 bfa_ioc_get_pwwn(struct bfa_ioc *ioc)
2924 return ioc->attr->pwwn;
2928 bfa_nw_ioc_get_mac(struct bfa_ioc *ioc, u8 *mac)
2930 ether_addr_copy(mac, ioc->attr->mac);
2935 bfa_ioc_recover(struct bfa_ioc *ioc)
2938 bfa_ioc_stats(ioc, ioc_hbfails);
2939 bfa_ioc_stats_hb_count(ioc, ioc->hb_count);
2940 bfa_fsm_send_event(ioc, IOC_E_HBFAIL);
2946 bfa_iocpf_enable(struct bfa_ioc *ioc)
2948 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_ENABLE);
2952 bfa_iocpf_disable(struct bfa_ioc *ioc)
2954 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_DISABLE);
2958 bfa_iocpf_fail(struct bfa_ioc *ioc)
2960 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FAIL);
2964 bfa_iocpf_initfail(struct bfa_ioc *ioc)
2966 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_INITFAIL);
2970 bfa_iocpf_getattrfail(struct bfa_ioc *ioc)
2972 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_GETATTRFAIL);
2976 bfa_iocpf_stop(struct bfa_ioc *ioc)
2978 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP);
2982 bfa_nw_iocpf_timeout(struct bfa_ioc *ioc)
2986 iocpf_st = iocpf_sm_to_state(iocpf_sm_table, ioc->iocpf.fsm);
2989 bfa_ioc_poll_fwinit(ioc);
2991 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_TIMEOUT);
2995 bfa_nw_iocpf_sem_timeout(struct bfa_ioc *ioc)
2997 bfa_ioc_hw_sem_get(ioc);
3001 bfa_ioc_poll_fwinit(struct bfa_ioc *ioc)
3003 u32 fwstate = bfa_ioc_get_cur_ioc_fwstate(ioc);
3006 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY);
3010 if (ioc->iocpf.poll_time >= BFA_IOC_TOV) {
3011 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_TIMEOUT);
3013 ioc->iocpf.poll_time += BFA_IOC_POLL_TOV;
3014 mod_timer(&ioc->iocpf_timer, jiffies +
3080 bfa_ioc_portid(flash->ioc));
3083 bfa_nw_ioc_mbox_queue(flash->ioc, &flash->mb, NULL, NULL);
3109 bfa_ioc_portid(flash->ioc));
3111 bfa_nw_ioc_mbox_queue(flash->ioc, &flash->mb, NULL, NULL);
3135 /* receiving response after ioc failure */
3215 * @ioc: ioc structure
3219 bfa_nw_flash_attach(struct bfa_flash *flash, struct bfa_ioc *ioc, void *dev)
3221 flash->ioc = ioc;
3226 bfa_nw_ioc_mbox_regisr(flash->ioc, BFI_MC_FLASH, bfa_flash_intr, flash);
3228 list_add_tail(&flash->ioc_notify.qe, &flash->ioc->notify_q);
3265 if (!bfa_nw_ioc_is_operational(flash->ioc))
3277 bfa_ioc_portid(flash->ioc));
3279 bfa_nw_ioc_mbox_queue(flash->ioc, &flash->mb, NULL, NULL);
3303 if (!bfa_nw_ioc_is_operational(flash->ioc))
3352 if (!bfa_nw_ioc_is_operational(flash->ioc))