Lines Matching refs:ioc

59 static void bfa_ioc_hw_sem_init(struct bfa_ioc *ioc);
60 static void bfa_ioc_hw_sem_get(struct bfa_ioc *ioc);
61 static void bfa_ioc_hw_sem_get_cancel(struct bfa_ioc *ioc);
62 static void bfa_ioc_hwinit(struct bfa_ioc *ioc, bool force);
63 static void bfa_ioc_poll_fwinit(struct bfa_ioc *ioc);
64 static void bfa_ioc_send_enable(struct bfa_ioc *ioc);
65 static void bfa_ioc_send_disable(struct bfa_ioc *ioc);
66 static void bfa_ioc_send_getattr(struct bfa_ioc *ioc);
67 static void bfa_ioc_hb_monitor(struct bfa_ioc *ioc);
68 static void bfa_ioc_hb_stop(struct bfa_ioc *ioc);
69 static void bfa_ioc_reset(struct bfa_ioc *ioc, bool force);
70 static void bfa_ioc_mbox_poll(struct bfa_ioc *ioc);
71 static void bfa_ioc_mbox_flush(struct bfa_ioc *ioc);
72 static void bfa_ioc_recover(struct bfa_ioc *ioc);
73 static void bfa_ioc_check_attr_wwns(struct bfa_ioc *ioc);
75 static void bfa_ioc_disable_comp(struct bfa_ioc *ioc);
76 static void bfa_ioc_lpu_stop(struct bfa_ioc *ioc);
77 static void bfa_nw_ioc_debug_save_ftrc(struct bfa_ioc *ioc);
78 static void bfa_ioc_fail_notify(struct bfa_ioc *ioc);
79 static void bfa_ioc_pf_enabled(struct bfa_ioc *ioc);
80 static void bfa_ioc_pf_disabled(struct bfa_ioc *ioc);
81 static void bfa_ioc_pf_failed(struct bfa_ioc *ioc);
82 static void bfa_ioc_pf_hwfailed(struct bfa_ioc *ioc);
83 static void bfa_ioc_pf_fwmismatch(struct bfa_ioc *ioc);
84 static void bfa_ioc_boot(struct bfa_ioc *ioc, u32 boot_type,
86 static u32 bfa_ioc_smem_pgnum(struct bfa_ioc *ioc, u32 fmaddr);
87 static void bfa_ioc_get_adapter_serial_num(struct bfa_ioc *ioc,
89 static void bfa_ioc_get_adapter_fw_ver(struct bfa_ioc *ioc,
91 static void bfa_ioc_get_pci_chip_rev(struct bfa_ioc *ioc,
93 static void bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc,
95 static void bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc,
97 static void bfa_ioc_get_adapter_model(struct bfa_ioc *ioc, char *model);
98 static u64 bfa_ioc_get_pwwn(struct bfa_ioc *ioc);
145 static void bfa_iocpf_enable(struct bfa_ioc *ioc);
146 static void bfa_iocpf_disable(struct bfa_ioc *ioc);
147 static void bfa_iocpf_fail(struct bfa_ioc *ioc);
148 static void bfa_iocpf_initfail(struct bfa_ioc *ioc);
149 static void bfa_iocpf_getattrfail(struct bfa_ioc *ioc);
150 static void bfa_iocpf_stop(struct bfa_ioc *ioc);
162 IOCPF_E_FAIL = 7, /*!< failure notice by ioc sm */
163 IOCPF_E_INITFAIL = 8, /*!< init fail notice by ioc sm */
164 IOCPF_E_GETATTRFAIL = 9, /*!< init fail notice by ioc sm */
227 bfa_ioc_sm_uninit_entry(struct bfa_ioc *ioc)
235 bfa_ioc_sm_uninit(struct bfa_ioc *ioc, enum ioc_event event)
239 bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
251 bfa_ioc_sm_reset_entry(struct bfa_ioc *ioc)
253 bfa_fsm_set_state(&ioc->iocpf, bfa_iocpf_sm_reset);
260 bfa_ioc_sm_reset(struct bfa_ioc *ioc, enum ioc_event event)
264 bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling);
268 bfa_ioc_disable_comp(ioc);
272 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
281 bfa_ioc_sm_enabling_entry(struct bfa_ioc *ioc)
283 bfa_iocpf_enable(ioc);
291 bfa_ioc_sm_enabling(struct bfa_ioc *ioc, enum ioc_event event)
295 bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr);
301 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
302 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
304 bfa_iocpf_initfail(ioc);
308 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
309 bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
313 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
317 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
318 bfa_iocpf_stop(ioc);
333 bfa_ioc_sm_getattr_entry(struct bfa_ioc *ioc)
335 mod_timer(&ioc->ioc_timer, jiffies +
337 bfa_ioc_send_getattr(ioc);
344 bfa_ioc_sm_getattr(struct bfa_ioc *ioc, enum ioc_event event)
348 del_timer(&ioc->ioc_timer);
349 bfa_ioc_check_attr_wwns(ioc);
350 bfa_ioc_hb_monitor(ioc);
351 bfa_fsm_set_state(ioc, bfa_ioc_sm_op);
356 del_timer(&ioc->ioc_timer);
359 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
360 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
362 bfa_iocpf_getattrfail(ioc);
366 del_timer(&ioc->ioc_timer);
367 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
379 bfa_ioc_sm_op_entry(struct bfa_ioc *ioc)
381 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK);
382 bfa_ioc_event_notify(ioc, BFA_IOC_E_ENABLED);
386 bfa_ioc_sm_op(struct bfa_ioc *ioc, enum ioc_event event)
393 bfa_ioc_hb_stop(ioc);
394 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
399 bfa_ioc_hb_stop(ioc);
402 if (ioc->iocpf.auto_recover)
403 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail_retry);
405 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
407 bfa_ioc_fail_notify(ioc);
410 bfa_iocpf_fail(ioc);
419 bfa_ioc_sm_disabling_entry(struct bfa_ioc *ioc)
421 bfa_iocpf_disable(ioc);
428 bfa_ioc_sm_disabling(struct bfa_ioc *ioc, enum ioc_event event)
432 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
441 bfa_iocpf_fail(ioc);
445 bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
446 bfa_ioc_disable_comp(ioc);
458 bfa_ioc_sm_disabled_entry(struct bfa_ioc *ioc)
460 bfa_ioc_disable_comp(ioc);
464 bfa_ioc_sm_disabled(struct bfa_ioc *ioc, enum ioc_event event)
468 bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling);
472 ioc->cbfn->disable_cbfn(ioc->bfa);
476 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
477 bfa_iocpf_stop(ioc);
486 bfa_ioc_sm_fail_retry_entry(struct bfa_ioc *ioc)
494 bfa_ioc_sm_fail_retry(struct bfa_ioc *ioc, enum ioc_event event)
498 bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr);
506 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
507 bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
509 bfa_iocpf_initfail(ioc);
513 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
514 bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
521 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
525 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
526 bfa_iocpf_stop(ioc);
535 bfa_ioc_sm_fail_entry(struct bfa_ioc *ioc)
543 bfa_ioc_sm_fail(struct bfa_ioc *ioc, enum ioc_event event)
547 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
551 bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
555 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
556 bfa_iocpf_stop(ioc);
569 bfa_ioc_sm_hwfail_entry(struct bfa_ioc *ioc)
577 bfa_ioc_sm_hwfail(struct bfa_ioc *ioc, enum ioc_event event)
582 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
586 ioc->cbfn->disable_cbfn(ioc->bfa);
590 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
637 bfa_ioc_hw_sem_init(iocpf->ioc);
638 bfa_ioc_hw_sem_get(iocpf->ioc);
647 struct bfa_ioc *ioc = iocpf->ioc;
651 if (bfa_ioc_firmware_lock(ioc)) {
652 if (bfa_ioc_sync_start(ioc)) {
653 bfa_ioc_sync_join(ioc);
656 bfa_ioc_firmware_unlock(ioc);
657 bfa_nw_ioc_hw_sem_release(ioc);
658 mod_timer(&ioc->sem_timer, jiffies +
662 bfa_nw_ioc_hw_sem_release(ioc);
669 bfa_ioc_pf_hwfailed(ioc);
673 bfa_ioc_hw_sem_get_cancel(ioc);
675 bfa_ioc_pf_disabled(ioc);
679 bfa_ioc_hw_sem_get_cancel(ioc);
696 bfa_ioc_pf_fwmismatch(iocpf->ioc);
699 mod_timer(&(iocpf->ioc)->iocpf_timer, jiffies +
709 struct bfa_ioc *ioc = iocpf->ioc;
717 del_timer(&ioc->iocpf_timer);
719 bfa_ioc_pf_disabled(ioc);
723 del_timer(&ioc->iocpf_timer);
738 bfa_ioc_hw_sem_get(iocpf->ioc);
747 struct bfa_ioc *ioc = iocpf->ioc;
751 if (bfa_ioc_sync_complete(ioc)) {
752 bfa_ioc_sync_join(ioc);
755 bfa_nw_ioc_hw_sem_release(ioc);
756 mod_timer(&ioc->sem_timer, jiffies +
763 bfa_ioc_pf_hwfailed(ioc);
767 bfa_ioc_hw_sem_get_cancel(ioc);
780 bfa_ioc_reset(iocpf->ioc, false);
790 struct bfa_ioc *ioc = iocpf->ioc;
798 bfa_nw_ioc_hw_sem_release(ioc);
799 bfa_ioc_pf_failed(ioc);
804 del_timer(&ioc->iocpf_timer);
805 bfa_ioc_sync_leave(ioc);
806 bfa_nw_ioc_hw_sem_release(ioc);
818 mod_timer(&(iocpf->ioc)->iocpf_timer, jiffies +
823 iocpf->ioc->cbfn->reset_cbfn(iocpf->ioc->bfa);
824 bfa_ioc_send_enable(iocpf->ioc);
834 struct bfa_ioc *ioc = iocpf->ioc;
838 del_timer(&ioc->iocpf_timer);
839 bfa_nw_ioc_hw_sem_release(ioc);
844 del_timer(&ioc->iocpf_timer);
849 bfa_nw_ioc_hw_sem_release(ioc);
851 bfa_ioc_pf_failed(ioc);
856 del_timer(&ioc->iocpf_timer);
857 bfa_nw_ioc_hw_sem_release(ioc);
869 bfa_ioc_pf_enabled(iocpf->ioc);
896 mod_timer(&(iocpf->ioc)->iocpf_timer, jiffies +
898 bfa_ioc_send_disable(iocpf->ioc);
907 struct bfa_ioc *ioc = iocpf->ioc;
911 del_timer(&ioc->iocpf_timer);
916 del_timer(&ioc->iocpf_timer);
922 writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate);
937 bfa_ioc_hw_sem_get(iocpf->ioc);
946 struct bfa_ioc *ioc = iocpf->ioc;
950 bfa_ioc_sync_leave(ioc);
951 bfa_nw_ioc_hw_sem_release(ioc);
957 bfa_ioc_pf_hwfailed(ioc);
974 bfa_ioc_mbox_flush(iocpf->ioc);
975 bfa_ioc_pf_disabled(iocpf->ioc);
981 struct bfa_ioc *ioc = iocpf->ioc;
989 bfa_ioc_firmware_unlock(ioc);
1001 bfa_nw_ioc_debug_save_ftrc(iocpf->ioc);
1002 bfa_ioc_hw_sem_get(iocpf->ioc);
1011 struct bfa_ioc *ioc = iocpf->ioc;
1015 bfa_ioc_notify_fail(ioc);
1016 bfa_ioc_sync_leave(ioc);
1017 writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate);
1018 bfa_nw_ioc_hw_sem_release(ioc);
1024 bfa_ioc_pf_hwfailed(ioc);
1028 bfa_ioc_hw_sem_get_cancel(ioc);
1033 bfa_ioc_hw_sem_get_cancel(ioc);
1034 bfa_ioc_firmware_unlock(ioc);
1057 struct bfa_ioc *ioc = iocpf->ioc;
1065 bfa_ioc_firmware_unlock(ioc);
1080 bfa_ioc_lpu_stop(iocpf->ioc);
1085 bfa_ioc_mbox_flush(iocpf->ioc);
1086 bfa_ioc_hw_sem_get(iocpf->ioc);
1095 struct bfa_ioc *ioc = iocpf->ioc;
1099 bfa_ioc_sync_ack(ioc);
1100 bfa_ioc_notify_fail(ioc);
1102 bfa_ioc_sync_leave(ioc);
1103 writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate);
1104 bfa_nw_ioc_hw_sem_release(ioc);
1107 if (bfa_ioc_sync_complete(ioc))
1110 bfa_nw_ioc_hw_sem_release(ioc);
1118 bfa_ioc_pf_hwfailed(ioc);
1122 bfa_ioc_hw_sem_get_cancel(ioc);
1164 bfa_ioc_event_notify(struct bfa_ioc *ioc, enum bfa_ioc_event event)
1169 list_for_each(qe, &ioc->notify_q) {
1176 bfa_ioc_disable_comp(struct bfa_ioc *ioc)
1178 ioc->cbfn->disable_cbfn(ioc->bfa);
1179 bfa_ioc_event_notify(ioc, BFA_IOC_E_DISABLED);
1211 bfa_ioc_hw_sem_init(struct bfa_ioc *ioc)
1214 u32 fwstate = readl(ioc->ioc_regs.ioc_fwstate);
1219 bfa_nw_ioc_fwver_get(ioc, &fwhdr);
1224 writel(BFI_IOC_UNINIT, ioc->ioc_regs.ioc_fwstate);
1229 readl(ioc->ioc_regs.ioc_sem_reg);
1230 writel(1, ioc->ioc_regs.ioc_sem_reg);
1234 bfa_ioc_hw_sem_get(struct bfa_ioc *ioc)
1242 r32 = readl(ioc->ioc_regs.ioc_sem_reg);
1244 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEM_ERROR);
1248 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEMLOCKED);
1252 mod_timer(&ioc->sem_timer, jiffies +
1257 bfa_nw_ioc_hw_sem_release(struct bfa_ioc *ioc)
1259 writel(1, ioc->ioc_regs.ioc_sem_reg);
1263 bfa_ioc_hw_sem_get_cancel(struct bfa_ioc *ioc)
1265 del_timer(&ioc->sem_timer);
1273 bfa_ioc_lmem_init(struct bfa_ioc *ioc)
1279 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1287 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1294 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1305 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1309 bfa_ioc_lpu_start(struct bfa_ioc *ioc)
1316 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1319 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1323 bfa_ioc_lpu_stop(struct bfa_ioc *ioc)
1330 pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
1333 writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
1340 bfa_nw_ioc_fwver_get(struct bfa_ioc *ioc, struct bfi_ioc_image_hdr *fwhdr)
1347 pgnum = bfa_ioc_smem_pgnum(ioc, loff);
1348 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1353 swab32(readl((loff) + (ioc->ioc_regs.smem_page_start)));
1362 bfa_nw_ioc_fwver_cmp(struct bfa_ioc *ioc, struct bfi_ioc_image_hdr *fwhdr)
1368 bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
1383 bfa_ioc_fwver_valid(struct bfa_ioc *ioc, u32 boot_env)
1387 bfa_nw_ioc_fwver_get(ioc, &fwhdr);
1389 bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
1397 return bfa_nw_ioc_fwver_cmp(ioc, &fwhdr);
1404 bfa_ioc_msgflush(struct bfa_ioc *ioc)
1408 r32 = readl(ioc->ioc_regs.lpu_mbox_cmd);
1410 writel(1, ioc->ioc_regs.lpu_mbox_cmd);
1417 bfa_ioc_hwinit(struct bfa_ioc *ioc, bool force)
1423 ioc_fwstate = readl(ioc->ioc_regs.ioc_fwstate);
1434 false : bfa_ioc_fwver_valid(ioc, boot_env);
1437 bfa_ioc_boot(ioc, BFI_FWBOOT_TYPE_NORMAL, boot_env);
1438 bfa_ioc_poll_fwinit(ioc);
1447 bfa_ioc_poll_fwinit(ioc);
1460 bfa_ioc_msgflush(ioc);
1461 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY);
1468 bfa_ioc_boot(ioc, BFI_FWBOOT_TYPE_NORMAL, boot_env);
1469 bfa_ioc_poll_fwinit(ioc);
1475 struct bfa_ioc *ioc = (struct bfa_ioc *) ioc_arg;
1477 bfa_fsm_send_event(ioc, IOC_E_TIMEOUT);
1481 bfa_ioc_mbox_send(struct bfa_ioc *ioc, void *ioc_msg, int len)
1493 ioc->ioc_regs.hfn_mbox + i * sizeof(u32));
1496 writel(0, ioc->ioc_regs.hfn_mbox + i * sizeof(u32));
1501 writel(1, ioc->ioc_regs.hfn_mbox_cmd);
1502 (void) readl(ioc->ioc_regs.hfn_mbox_cmd);
1506 bfa_ioc_send_enable(struct bfa_ioc *ioc)
1512 bfa_ioc_portid(ioc));
1513 enable_req.clscode = htons(ioc->clscode);
1516 bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req));
1520 bfa_ioc_send_disable(struct bfa_ioc *ioc)
1525 bfa_ioc_portid(ioc));
1526 bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req));
1530 bfa_ioc_send_getattr(struct bfa_ioc *ioc)
1535 bfa_ioc_portid(ioc));
1536 bfa_dma_be_addr_set(attr_req.attr_addr, ioc->attr_dma.pa);
1537 bfa_ioc_mbox_send(ioc, &attr_req, sizeof(attr_req));
1543 struct bfa_ioc *ioc = cbarg;
1546 hb_count = readl(ioc->ioc_regs.heartbeat);
1547 if (ioc->hb_count == hb_count) {
1548 bfa_ioc_recover(ioc);
1551 ioc->hb_count = hb_count;
1554 bfa_ioc_mbox_poll(ioc);
1555 mod_timer(&ioc->hb_timer, jiffies +
1560 bfa_ioc_hb_monitor(struct bfa_ioc *ioc)
1562 ioc->hb_count = readl(ioc->ioc_regs.heartbeat);
1563 mod_timer(&ioc->hb_timer, jiffies +
1568 bfa_ioc_hb_stop(struct bfa_ioc *ioc)
1570 del_timer(&ioc->hb_timer);
1578 bfa_ioc_download_fw(struct bfa_ioc *ioc, u32 boot_type,
1591 bfa_ioc_lmem_init(ioc);
1593 fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), chunkno);
1595 pgnum = bfa_ioc_smem_pgnum(ioc, loff);
1597 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1599 for (i = 0; i < bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)); i++) {
1602 fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc),
1610 ((ioc->ioc_regs.smem_page_start) + (loff)));
1621 ioc->ioc_regs.host_page_num_fn);
1625 writel(bfa_ioc_smem_pgnum(ioc, 0),
1626 ioc->ioc_regs.host_page_num_fn);
1631 asicmode = BFI_FWBOOT_DEVMODE(ioc->asic_gen, ioc->asic_mode,
1632 ioc->port0_mode, ioc->port1_mode);
1633 writel(asicmode, ((ioc->ioc_regs.smem_page_start)
1635 writel(boot_type, ((ioc->ioc_regs.smem_page_start)
1637 writel(boot_env, ((ioc->ioc_regs.smem_page_start)
1642 bfa_ioc_reset(struct bfa_ioc *ioc, bool force)
1644 bfa_ioc_hwinit(ioc, force);
1648 * BFA ioc enable reply by firmware
1651 bfa_ioc_enable_reply(struct bfa_ioc *ioc, enum bfa_mode port_mode,
1654 struct bfa_iocpf *iocpf = &ioc->iocpf;
1656 ioc->port_mode = ioc->port_mode_cfg = port_mode;
1657 ioc->ad_cap_bm = cap_bm;
1666 bfa_ioc_getattr_reply(struct bfa_ioc *ioc)
1668 struct bfi_ioc_attr *attr = ioc->attr;
1674 bfa_fsm_send_event(ioc, IOC_E_FWRSP_GETATTR);
1681 bfa_ioc_mbox_attach(struct bfa_ioc *ioc)
1683 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
1689 mod->mbhdlr[mc].cbarg = ioc->bfa;
1697 bfa_ioc_mbox_poll(struct bfa_ioc *ioc)
1699 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
1714 stat = readl(ioc->ioc_regs.hfn_mbox_cmd);
1722 bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
1739 bfa_ioc_mbox_flush(struct bfa_ioc *ioc)
1741 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
1751 * @param[in] ioc memory for IOC
1757 bfa_nw_ioc_smem_read(struct bfa_ioc *ioc, void *tbuf, u32 soff, u32 sz)
1763 pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, soff);
1769 if (bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg) == 0)
1772 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1776 r32 = swab32(readl((loff) + (ioc->ioc_regs.smem_page_start)));
1786 writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1790 writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0),
1791 ioc->ioc_regs.host_page_num_fn);
1796 readl(ioc->ioc_regs.ioc_init_sem_reg);
1797 writel(1, ioc->ioc_regs.ioc_init_sem_reg);
1805 bfa_nw_ioc_debug_fwtrc(struct bfa_ioc *ioc, void *trcdata, int *trclen)
1807 u32 loff = BFI_IOC_TRC_OFF + BNA_DBG_FWTRC_LEN * ioc->port_id;
1814 status = bfa_nw_ioc_smem_read(ioc, trcdata, loff, tlen);
1823 bfa_nw_ioc_debug_save_ftrc(struct bfa_ioc *ioc)
1827 if (ioc->dbg_fwsave_once) {
1828 ioc->dbg_fwsave_once = 0;
1829 if (ioc->dbg_fwsave_len) {
1830 tlen = ioc->dbg_fwsave_len;
1831 bfa_nw_ioc_debug_fwtrc(ioc, ioc->dbg_fwsave, &tlen);
1840 bfa_nw_ioc_debug_fwsave(struct bfa_ioc *ioc, void *trcdata, int *trclen)
1844 if (ioc->dbg_fwsave_len == 0)
1848 if (tlen > ioc->dbg_fwsave_len)
1849 tlen = ioc->dbg_fwsave_len;
1851 memcpy(trcdata, ioc->dbg_fwsave, tlen);
1857 bfa_ioc_fail_notify(struct bfa_ioc *ioc)
1862 ioc->cbfn->hbfail_cbfn(ioc->bfa);
1863 bfa_ioc_event_notify(ioc, BFA_IOC_E_FAILED);
1864 bfa_nw_ioc_debug_save_ftrc(ioc);
1871 bfa_ioc_pf_enabled(struct bfa_ioc *ioc)
1873 bfa_fsm_send_event(ioc, IOC_E_ENABLED);
1877 bfa_ioc_pf_disabled(struct bfa_ioc *ioc)
1879 bfa_fsm_send_event(ioc, IOC_E_DISABLED);
1883 bfa_ioc_pf_failed(struct bfa_ioc *ioc)
1885 bfa_fsm_send_event(ioc, IOC_E_PFFAILED);
1889 bfa_ioc_pf_hwfailed(struct bfa_ioc *ioc)
1891 bfa_fsm_send_event(ioc, IOC_E_HWFAILED);
1895 bfa_ioc_pf_fwmismatch(struct bfa_ioc *ioc)
1900 ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
1907 bfa_ioc_pll_init(struct bfa_ioc *ioc)
1912 bfa_nw_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg);
1914 bfa_ioc_pll_init_asic(ioc);
1916 ioc->pllinit = true;
1920 bfa_nw_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg);
1930 bfa_ioc_boot(struct bfa_ioc *ioc, enum bfi_fwboot_type boot_type,
1933 bfa_ioc_stats(ioc, ioc_boots);
1935 if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK)
1942 writel(BFI_IOC_MEMTEST, ioc->ioc_regs.ioc_fwstate);
1943 writel(BFI_IOC_MEMTEST, ioc->ioc_regs.alt_ioc_fwstate);
1945 writel(BFI_IOC_INITING, ioc->ioc_regs.ioc_fwstate);
1946 writel(BFI_IOC_INITING, ioc->ioc_regs.alt_ioc_fwstate);
1949 bfa_ioc_msgflush(ioc);
1950 bfa_ioc_download_fw(ioc, boot_type, boot_env);
1951 bfa_ioc_lpu_start(ioc);
1964 bfa_ioc_msgget(struct bfa_ioc *ioc, void *mbmsg)
1970 r32 = readl(ioc->ioc_regs.lpu_mbox_cmd);
1979 r32 = readl(ioc->ioc_regs.lpu_mbox +
1987 writel(1, ioc->ioc_regs.lpu_mbox_cmd);
1988 readl(ioc->ioc_regs.lpu_mbox_cmd);
1994 bfa_ioc_isr(struct bfa_ioc *ioc, struct bfi_mbmsg *m)
1997 struct bfa_iocpf *iocpf = &ioc->iocpf;
2001 bfa_ioc_stats(ioc, ioc_isrs);
2008 bfa_ioc_enable_reply(ioc,
2018 bfa_ioc_getattr_reply(ioc);
2029 * @param[in] ioc memory for IOC
2033 bfa_nw_ioc_attach(struct bfa_ioc *ioc, void *bfa, struct bfa_ioc_cbfn *cbfn)
2035 ioc->bfa = bfa;
2036 ioc->cbfn = cbfn;
2037 ioc->fcmode = false;
2038 ioc->pllinit = false;
2039 ioc->dbg_fwsave_once = true;
2040 ioc->iocpf.ioc = ioc;
2042 bfa_ioc_mbox_attach(ioc);
2043 INIT_LIST_HEAD(&ioc->notify_q);
2045 bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
2046 bfa_fsm_send_event(ioc, IOC_E_RESET);
2053 bfa_nw_ioc_detach(struct bfa_ioc *ioc)
2055 bfa_fsm_send_event(ioc, IOC_E_DETACH);
2058 INIT_LIST_HEAD(&ioc->notify_q);
2067 bfa_nw_ioc_pci_init(struct bfa_ioc *ioc, struct bfa_pcidev *pcidev,
2070 ioc->clscode = clscode;
2071 ioc->pcidev = *pcidev;
2076 ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_FC;
2077 ioc->asic_mode = BFI_ASIC_MODE_FC;
2081 ioc->asic_gen = BFI_ASIC_GEN_CT;
2082 ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
2083 ioc->asic_mode = BFI_ASIC_MODE_ETH;
2084 ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_CNA;
2085 ioc->ad_cap_bm = BFA_CM_CNA;
2089 ioc->asic_gen = BFI_ASIC_GEN_CT2;
2092 ioc->asic_mode = BFI_ASIC_MODE_FC16;
2093 ioc->fcmode = true;
2094 ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA;
2095 ioc->ad_cap_bm = BFA_CM_HBA;
2097 ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
2098 ioc->asic_mode = BFI_ASIC_MODE_ETH;
2100 ioc->port_mode =
2101 ioc->port_mode_cfg = BFA_MODE_CNA;
2102 ioc->ad_cap_bm = BFA_CM_CNA;
2104 ioc->port_mode =
2105 ioc->port_mode_cfg = BFA_MODE_NIC;
2106 ioc->ad_cap_bm = BFA_CM_NIC;
2118 if (ioc->asic_gen == BFI_ASIC_GEN_CT)
2119 bfa_nw_ioc_set_ct_hwif(ioc);
2121 WARN_ON(ioc->asic_gen != BFI_ASIC_GEN_CT2);
2122 bfa_nw_ioc_set_ct2_hwif(ioc);
2123 bfa_nw_ioc_ct2_poweron(ioc);
2126 bfa_ioc_map_port(ioc);
2127 bfa_ioc_reg_init(ioc);
2137 bfa_nw_ioc_mem_claim(struct bfa_ioc *ioc, u8 *dm_kva, u64 dm_pa)
2142 ioc->attr_dma.kva = dm_kva;
2143 ioc->attr_dma.pa = dm_pa;
2144 ioc->attr = (struct bfi_ioc_attr *) dm_kva;
2157 bfa_nw_ioc_enable(struct bfa_ioc *ioc)
2159 bfa_ioc_stats(ioc, ioc_enables);
2160 ioc->dbg_fwsave_once = true;
2162 bfa_fsm_send_event(ioc, IOC_E_ENABLE);
2166 bfa_nw_ioc_disable(struct bfa_ioc *ioc)
2168 bfa_ioc_stats(ioc, ioc_disables);
2169 bfa_fsm_send_event(ioc, IOC_E_DISABLE);
2176 bfa_nw_ioc_debug_memclaim(struct bfa_ioc *ioc, void *dbg_fwsave)
2178 ioc->dbg_fwsave = dbg_fwsave;
2179 ioc->dbg_fwsave_len = ioc->iocpf.auto_recover ? BNA_DBG_FWTRC_LEN : 0;
2183 bfa_ioc_smem_pgnum(struct bfa_ioc *ioc, u32 fmaddr)
2185 return PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, fmaddr);
2192 bfa_nw_ioc_mbox_regisr(struct bfa_ioc *ioc, enum bfi_mclass mc,
2195 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2205 * @param[in] ioc IOC instance
2209 bfa_nw_ioc_mbox_queue(struct bfa_ioc *ioc, struct bfa_mbox_cmd *cmd,
2212 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2229 stat = readl(ioc->ioc_regs.hfn_mbox_cmd);
2238 bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
2247 bfa_nw_ioc_mbox_isr(struct bfa_ioc *ioc)
2249 struct bfa_ioc_mbox_mod *mod = &ioc->mbox_mod;
2253 if (bfa_ioc_msgget(ioc, &m)) {
2259 bfa_ioc_isr(ioc, &m);
2269 bfa_ioc_lpu_read_stat(ioc);
2274 bfa_ioc_mbox_poll(ioc);
2278 bfa_nw_ioc_error_isr(struct bfa_ioc *ioc)
2280 bfa_ioc_stats(ioc, ioc_hbfails);
2281 bfa_ioc_stats_hb_count(ioc, ioc->hb_count);
2282 bfa_fsm_send_event(ioc, IOC_E_HWERROR);
2289 bfa_nw_ioc_is_disabled(struct bfa_ioc *ioc)
2291 return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabling) ||
2292 bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled);
2299 bfa_nw_ioc_is_operational(struct bfa_ioc *ioc)
2301 return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_op);
2309 bfa_nw_ioc_notify_register(struct bfa_ioc *ioc,
2312 list_add_tail(&notify->qe, &ioc->notify_q);
2317 bfa_ioc_get_adapter_attr(struct bfa_ioc *ioc,
2322 ioc_attr = ioc->attr;
2324 bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num);
2325 bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver);
2326 bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver);
2327 bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer);
2331 ad_attr->nports = bfa_ioc_get_nports(ioc);
2332 ad_attr->max_speed = bfa_ioc_speed_sup(ioc);
2334 bfa_ioc_get_adapter_model(ioc, ad_attr->model);
2336 bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr);
2346 ad_attr->pwwn = bfa_ioc_get_pwwn(ioc);
2347 ad_attr->mac = bfa_nw_ioc_get_mac(ioc);
2354 bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver);
2358 bfa_ioc_get_type(struct bfa_ioc *ioc)
2360 if (ioc->clscode == BFI_PCIFN_CLASS_ETH)
2363 BUG_ON(!(ioc->clscode == BFI_PCIFN_CLASS_FC));
2365 return (ioc->attr->port_mode == BFI_PORT_MODE_FC)
2370 bfa_ioc_get_adapter_serial_num(struct bfa_ioc *ioc, char *serial_num)
2374 (void *)ioc->attr->brcd_serialnum,
2379 bfa_ioc_get_adapter_fw_ver(struct bfa_ioc *ioc, char *fw_ver)
2382 memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN);
2386 bfa_ioc_get_pci_chip_rev(struct bfa_ioc *ioc, char *chip_rev)
2396 chip_rev[4] = ioc->attr->asic_rev;
2401 bfa_ioc_get_adapter_optrom_ver(struct bfa_ioc *ioc, char *optrom_ver)
2404 memcpy(optrom_ver, ioc->attr->optrom_version,
2409 bfa_ioc_get_adapter_manufacturer(struct bfa_ioc *ioc, char *manufacturer)
2416 bfa_ioc_get_adapter_model(struct bfa_ioc *ioc, char *model)
2423 ioc_attr = ioc->attr;
2430 bfa_ioc_get_state(struct bfa_ioc *ioc)
2433 enum bfa_ioc_state ioc_st = bfa_sm_to_state(ioc_sm_table, ioc->fsm);
2438 iocpf_st = bfa_sm_to_state(iocpf_sm_table, ioc->iocpf.fsm);
2469 bfa_nw_ioc_get_attr(struct bfa_ioc *ioc, struct bfa_ioc_attr *ioc_attr)
2473 ioc_attr->state = bfa_ioc_get_state(ioc);
2474 ioc_attr->port_id = ioc->port_id;
2475 ioc_attr->port_mode = ioc->port_mode;
2477 ioc_attr->port_mode_cfg = ioc->port_mode_cfg;
2478 ioc_attr->cap_bm = ioc->ad_cap_bm;
2480 ioc_attr->ioc_type = bfa_ioc_get_type(ioc);
2482 bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr);
2484 ioc_attr->pci_attr.device_id = ioc->pcidev.device_id;
2485 ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func;
2486 bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev);
2493 bfa_ioc_get_pwwn(struct bfa_ioc *ioc)
2495 return ioc->attr->pwwn;
2499 bfa_nw_ioc_get_mac(struct bfa_ioc *ioc)
2501 return ioc->attr->mac;
2508 bfa_ioc_recover(struct bfa_ioc *ioc)
2511 bfa_ioc_stats(ioc, ioc_hbfails);
2512 bfa_ioc_stats_hb_count(ioc, ioc->hb_count);
2513 bfa_fsm_send_event(ioc, IOC_E_HBFAIL);
2517 bfa_ioc_check_attr_wwns(struct bfa_ioc *ioc)
2519 if (bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_LL)
2529 bfa_iocpf_enable(struct bfa_ioc *ioc)
2531 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_ENABLE);
2535 bfa_iocpf_disable(struct bfa_ioc *ioc)
2537 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_DISABLE);
2541 bfa_iocpf_fail(struct bfa_ioc *ioc)
2543 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FAIL);
2547 bfa_iocpf_initfail(struct bfa_ioc *ioc)
2549 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_INITFAIL);
2553 bfa_iocpf_getattrfail(struct bfa_ioc *ioc)
2555 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_GETATTRFAIL);
2559 bfa_iocpf_stop(struct bfa_ioc *ioc)
2561 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP);
2567 struct bfa_ioc *ioc = (struct bfa_ioc *) ioc_arg;
2570 iocpf_st = bfa_sm_to_state(iocpf_sm_table, ioc->iocpf.fsm);
2573 bfa_ioc_poll_fwinit(ioc);
2575 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_TIMEOUT);
2581 struct bfa_ioc *ioc = (struct bfa_ioc *) ioc_arg;
2583 bfa_ioc_hw_sem_get(ioc);
2587 bfa_ioc_poll_fwinit(struct bfa_ioc *ioc)
2589 u32 fwstate = readl(ioc->ioc_regs.ioc_fwstate);
2592 bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY);
2596 if (ioc->iocpf.poll_time >= BFA_IOC_TOV) {
2597 bfa_nw_iocpf_timeout(ioc);
2599 ioc->iocpf.poll_time += BFA_IOC_POLL_TOV;
2600 mod_timer(&ioc->iocpf_timer, jiffies +
2668 bfa_ioc_portid(flash->ioc));
2671 bfa_nw_ioc_mbox_queue(flash->ioc, &flash->mb, NULL, NULL);
2697 bfa_ioc_portid(flash->ioc));
2699 bfa_nw_ioc_mbox_queue(flash->ioc, &flash->mb, NULL, NULL);
2723 /* receiving response after ioc failure */
2803 * @param[in] ioc - ioc structure
2807 bfa_nw_flash_attach(struct bfa_flash *flash, struct bfa_ioc *ioc, void *dev)
2809 flash->ioc = ioc;
2814 bfa_nw_ioc_mbox_regisr(flash->ioc, BFI_MC_FLASH, bfa_flash_intr, flash);
2817 list_add_tail(&flash->ioc_notify.qe, &flash->ioc->notify_q);
2854 if (!bfa_nw_ioc_is_operational(flash->ioc))
2866 bfa_ioc_portid(flash->ioc));
2868 bfa_nw_ioc_mbox_queue(flash->ioc, &flash->mb, NULL, NULL);
2892 if (!bfa_nw_ioc_is_operational(flash->ioc))
2941 if (!bfa_nw_ioc_is_operational(flash->ioc))