bfa_ioc.c revision 0a4b1fc0b24fc7adbaf8413f2992ce1395991a78
17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
27725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
37725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * All rights reserved
47725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * www.brocade.com
57725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
67725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Linux driver for Brocade Fibre Channel Host Bus Adapter.
77725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
87725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is free software; you can redistribute it and/or modify it
97725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * under the terms of the GNU General Public License (GPL) Version 2 as
107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * published by the Free Software Foundation
117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This program is distributed in the hope that it will be useful, but
137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * WITHOUT ANY WARRANTY; without even the implied warranty of
147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * General Public License for more details.
167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa.h>
197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa_ioc.h>
207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfa_fwimg_priv.h>
217af074dc9d343f69bab4bfd699e6d7ba09915fd9Krishna Gudipati#include <cna/bfa_cna_trcmod.h>
227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <cs/bfa_debug.h>
237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfi/bfi_ioc.h>
247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <bfi/bfi_ctreg.h>
257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <aen/bfa_aen_ioc.h>
267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <aen/bfa_aen.h>
277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <log/bfa_log_hal.h>
287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#include <defs/bfa_defs_pci.h>
297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
307af074dc9d343f69bab4bfd699e6d7ba09915fd9Krishna GudipatiBFA_TRC_FILE(CNA, IOC);
317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC local definitions
347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_IOC_TOV		2000	/* msecs */
360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_HWSEM_TOV       500     /* msecs */
370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_HB_TOV          500     /* msecs */
380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_HWINIT_MAX      2
397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_IOC_FWIMG_MINSZ     (16 * 1024)
400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_IOC_TOV_RECOVER      BFA_IOC_HB_TOV
417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_start(__ioc)					\
437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer,	\
447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_ioc_timeout, (__ioc), BFA_IOC_TOV)
457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_stop(__ioc)   bfa_timer_stop(&(__ioc)->ioc_timer)
467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_ENTS	(BFI_IOC_TRC_ENTS)
487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_LEN					\
497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	(BFA_DBG_FWTRC_ENTS * sizeof(struct bfa_trc_s) +	\
507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 (sizeof(struct bfa_trc_mod_s) -			\
517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	  BFA_TRC_MAX * sizeof(struct bfa_trc_s)))
527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_OFF(_fn)	(BFI_IOC_TRC_OFF + BFA_DBG_FWTRC_LEN * (_fn))
537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati/**
550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Asic specific macros : see bfa_hw_cb.c and bfa_hw_ct.c for details.
560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */
570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_firmware_lock(__ioc)                    \
590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			((__ioc)->ioc_hwif->ioc_firmware_lock(__ioc))
600a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_firmware_unlock(__ioc)                  \
610a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			((__ioc)->ioc_hwif->ioc_firmware_unlock(__ioc))
620a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_fwimg_get_chunk(__ioc, __off)           \
630a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			((__ioc)->ioc_hwif->ioc_fwimg_get_chunk(__ioc, __off))
640a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_fwimg_get_size(__ioc)                   \
650a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			((__ioc)->ioc_hwif->ioc_fwimg_get_size(__ioc))
660a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_reg_init(__ioc) ((__ioc)->ioc_hwif->ioc_reg_init(__ioc))
670a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_map_port(__ioc) ((__ioc)->ioc_hwif->ioc_map_port(__ioc))
680a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_notify_hbfail(__ioc)                    \
690a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			((__ioc)->ioc_hwif->ioc_notify_hbfail(__ioc))
700a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
712f9b8857a914b71ba1b84fb23a0a20a87de41c91Krishna Gudipatibfa_boolean_t   bfa_auto_recover = BFA_TRUE;
727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations
757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_aen_post(struct bfa_ioc_s *bfa,
777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				 enum bfa_ioc_aen_event event);
787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc);
797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_hw_sem_get_cancel(struct bfa_ioc_s *ioc);
807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force);
817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_timeout(void *ioc);
827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_send_enable(struct bfa_ioc_s *ioc);
837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_send_disable(struct bfa_ioc_s *ioc);
847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_send_getattr(struct bfa_ioc_s *ioc);
857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_hb_monitor(struct bfa_ioc_s *ioc);
867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_hb_stop(struct bfa_ioc_s *ioc);
877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_reset(struct bfa_ioc_s *ioc, bfa_boolean_t force);
887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc);
897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc);
907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_recover(struct bfa_ioc_s *ioc);
917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_disable_comp(struct bfa_ioc_s *ioc);
927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void     bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc);
937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  bfa_ioc_sm
967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC state machine events
1007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum ioc_event {
1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_ENABLE = 1,	/*  IOC enable request */
1037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_DISABLE = 2,	/*  IOC disable request */
1047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_TIMEOUT = 3,	/*  f/w response timeout */
1057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_FWREADY = 4,	/*  f/w initialization done */
1067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_FWRSP_GETATTR = 5,	/*  IOC get attribute response */
1077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_FWRSP_ENABLE = 6,	/*  enable f/w response */
1087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_FWRSP_DISABLE = 7,	/*  disable f/w response */
1097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_HBFAIL = 8,	/*  heartbeat failure */
1107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_HWERROR = 9,	/*  hardware error interrupt */
1117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_SEMLOCKED = 10,	/*  h/w semaphore is locked */
1127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	IOC_E_DETACH = 11,	/*  driver detach cleanup */
1137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
1147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, reset, struct bfa_ioc_s, enum ioc_event);
1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, fwcheck, struct bfa_ioc_s, enum ioc_event);
1177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, mismatch, struct bfa_ioc_s, enum ioc_event);
1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, semwait, struct bfa_ioc_s, enum ioc_event);
1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, hwinit, struct bfa_ioc_s, enum ioc_event);
1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, enabling, struct bfa_ioc_s, enum ioc_event);
1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, getattr, struct bfa_ioc_s, enum ioc_event);
1227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, op, struct bfa_ioc_s, enum ioc_event);
1237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, initfail, struct bfa_ioc_s, enum ioc_event);
1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, hbfail, struct bfa_ioc_s, enum ioc_event);
1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabling, struct bfa_ioc_s, enum ioc_event);
1267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabled, struct bfa_ioc_s, enum ioc_event);
1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s ioc_sm_table[] = {
1297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_reset), BFA_IOC_RESET},
1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_fwcheck), BFA_IOC_FWMISMATCH},
1317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_mismatch), BFA_IOC_FWMISMATCH},
1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_semwait), BFA_IOC_SEMWAIT},
1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_hwinit), BFA_IOC_HWINIT},
1347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_enabling), BFA_IOC_HWINIT},
1357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_getattr), BFA_IOC_GETATTR},
1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_op), BFA_IOC_OPERATIONAL},
1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_initfail), BFA_IOC_INITFAIL},
1387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_hbfail), BFA_IOC_HBFAIL},
1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_disabling), BFA_IOC_DISABLING},
1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_disabled), BFA_IOC_DISABLED},
1417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
1427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
1447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Reset entry actions -- initialize state machine
1457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset_entry(struct bfa_ioc_s *ioc)
1487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->retry_count = 0;
1507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->auto_recover = bfa_auto_recover;
1517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
1547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Beginning state. IOC is in reset state.
1557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset(struct bfa_ioc_s *ioc, enum ioc_event event)
1587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
1607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_ENABLE:
1637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_fwcheck);
1647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
1677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_disable_comp(ioc);
1687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DETACH:
1717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
1727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
1747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
1757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
1767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
1797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Semaphore should be acquired for version check.
1807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_fwcheck_entry(struct bfa_ioc_s *ioc)
1837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_hw_sem_get(ioc);
1857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
1887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Awaiting h/w semaphore to continue with version check.
1897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_fwcheck(struct bfa_ioc_s *ioc, enum ioc_event event)
1927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
1947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_SEMLOCKED:
1977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (bfa_ioc_firmware_lock(ioc)) {
1987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			ioc->retry_count = 0;
1997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_fsm_set_state(ioc, bfa_ioc_sm_hwinit);
2007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		} else {
2017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_ioc_hw_sem_release(ioc);
2027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_fsm_set_state(ioc, bfa_ioc_sm_mismatch);
2037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
2047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
2077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_disable_comp(ioc);
2087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
2097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * fall through
2107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
2117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DETACH:
2137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hw_sem_get_cancel(ioc);
2147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
2157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWREADY:
2187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
2217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
2227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
2267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Notify enable completion callback and generate mismatch AEN.
2277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_mismatch_entry(struct bfa_ioc_s *ioc)
2307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
2327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Provide enable completion callback and AEN notification only once.
2337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
2347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->retry_count == 0) {
2357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
2367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_aen_post(ioc, BFA_IOC_AEN_FWMISMATCH);
2377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->retry_count++;
2397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_timer_start(ioc);
2407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
2437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Awaiting firmware version match.
2447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_mismatch(struct bfa_ioc_s *ioc, enum ioc_event event)
2477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
2497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_TIMEOUT:
2527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_fwcheck);
2537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
2567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_disable_comp(ioc);
2577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
2587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * fall through
2597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
2607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DETACH:
2627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
2637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWREADY:
2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Request for semaphore.
2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_semwait_entry(struct bfa_ioc_s *ioc)
2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_hw_sem_get(ioc);
2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Awaiting semaphore for h/w initialzation.
2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_semwait(struct bfa_ioc_s *ioc, enum ioc_event event)
2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
2907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_SEMLOCKED:
2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->retry_count = 0;
2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_hwinit);
2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
2987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hw_sem_get_cancel(ioc);
2997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
3007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
3037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
3047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hwinit_entry(struct bfa_ioc_s *ioc)
3107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_timer_start(ioc);
3127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_reset(ioc, BFA_FALSE);
3137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
3167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Hardware is being initialized. Interrupts are enabled.
3177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Holding hardware semaphore lock.
3187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hwinit(struct bfa_ioc_s *ioc, enum ioc_event event)
3217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
3237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWREADY:
3267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
3277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling);
3287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_HWERROR:
3317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
3327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
3337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * fall through
3347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
3357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_TIMEOUT:
3377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->retry_count++;
3387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (ioc->retry_count < BFA_IOC_HWINIT_MAX) {
3397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_ioc_timer_start(ioc);
3407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_ioc_reset(ioc, BFA_TRUE);
3417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			break;
3427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
3437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hw_sem_release(ioc);
3457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_initfail);
3467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
3497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hw_sem_release(ioc);
3507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
3517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
3527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
3557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_enabling_entry(struct bfa_ioc_s *ioc)
3627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_timer_start(ioc);
3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_send_enable(ioc);
3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
3687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Host IOC function is being enabled, awaiting response from firmware.
3697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Semaphore is acquired.
3707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
3727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_enabling(struct bfa_ioc_s *ioc, enum ioc_event event)
3737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
3757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
3777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWRSP_ENABLE:
3787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
3797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hw_sem_release(ioc);
3807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr);
3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_HWERROR:
3847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
3857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
3867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * fall through
3877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
3887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_TIMEOUT:
3907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->retry_count++;
3917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (ioc->retry_count < BFA_IOC_HWINIT_MAX) {
3927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_reg_write(ioc->ioc_regs.ioc_fwstate,
3937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				      BFI_IOC_UNINIT);
3947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_fsm_set_state(ioc, bfa_ioc_sm_hwinit);
3957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			break;
3967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
3977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hw_sem_release(ioc);
3997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_initfail);
4007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
4037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
4047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hw_sem_release(ioc);
4057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
4067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWREADY:
4097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_send_enable(ioc);
4107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
4137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
4147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_getattr_entry(struct bfa_ioc_s *ioc)
4207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_timer_start(ioc);
4227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_send_getattr(ioc);
4237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
4267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC configuration in progress. Timer is active.
4277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
4287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_getattr(struct bfa_ioc_s *ioc, enum ioc_event event)
4307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
4327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
4347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWRSP_GETATTR:
4357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
4367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_op);
4377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_HWERROR:
4407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
4417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
4427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * fall through
4437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
4447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_TIMEOUT:
4467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_initfail);
4477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
4507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
4517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
4527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
4557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
4567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
4577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_op_entry(struct bfa_ioc_s *ioc)
4627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK);
4647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_hb_monitor(ioc);
4657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_aen_post(ioc, BFA_IOC_AEN_ENABLE);
4667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
4697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_op(struct bfa_ioc_s *ioc, enum ioc_event event)
4707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
4727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_ENABLE:
4757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
4787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hb_stop(ioc);
4797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
4807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_HWERROR:
4837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWREADY:
4847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/**
4857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * Hard error or IOC recovery by other function.
4867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * Treat it same as heartbeat failure.
4877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
4887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_hb_stop(ioc);
4897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
4907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * !!! fall through !!!
4917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
4927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_HBFAIL:
4947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_hbfail);
4957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
4967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
4987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
4997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabling_entry(struct bfa_ioc_s *ioc)
5057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_aen_post(ioc, BFA_IOC_AEN_DISABLE);
5077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_timer_start(ioc);
5087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_send_disable(ioc);
5097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC is being disabled
5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabling(struct bfa_ioc_s *ioc, enum ioc_event event)
5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
5187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
5207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWRSP_DISABLE:
5217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
5220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
5230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		break;
5240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
5250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	case IOC_E_HWERROR:
5260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_ioc_timer_stop(ioc);
5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * !!! fall through !!!
5297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_TIMEOUT:
5320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL);
5337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
5347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
5377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
5387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
5427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC disable completion entry.
5437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabled_entry(struct bfa_ioc_s *ioc)
5467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_disable_comp(ioc);
5487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_disabled(struct bfa_ioc_s *ioc, enum ioc_event event)
5527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
5547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
5567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_ENABLE:
5577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_semwait);
5587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
5617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->cbfn->disable_cbfn(ioc->bfa);
5627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWREADY:
5657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DETACH:
5687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_firmware_unlock(ioc);
5697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
5707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
5737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
5747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_initfail_entry(struct bfa_ioc_s *ioc)
5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
5827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_timer_start(ioc);
5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Hardware initialization failed.
5877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_initfail(struct bfa_ioc_s *ioc, enum ioc_event event)
5907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
5947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
5957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
5967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
5977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DETACH:
6007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_timer_stop(ioc);
6017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_firmware_unlock(ioc);
6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
6037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_TIMEOUT:
6067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_semwait);
6077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
6117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
6167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hbfail_entry(struct bfa_ioc_s *ioc)
6177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct list_head *qe;
6197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_hbfail_notify_s *notify;
6207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
6227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Mark IOC as failed in hardware and stop firmware.
6237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
6247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_lpu_stop(ioc);
6250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	bfa_reg_write(ioc->ioc_regs.ioc_fwstate, BFI_IOC_FAIL);
6267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	/**
6280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 * Notify other functions on HB failure.
6290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 */
6300a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	bfa_ioc_notify_hbfail(ioc);
6317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
6337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Notify driver and common modules registered for notification.
6347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
6357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->cbfn->hbfail_cbfn(ioc->bfa);
6367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_for_each(qe, &ioc->hb_notify_q) {
6377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		notify = (struct bfa_ioc_hbfail_notify_s *)qe;
6387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		notify->cbfn(notify->cbarg);
6397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
6427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Flush any queued up mailbox requests.
6437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
6447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_hbfail(ioc);
6457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_aen_post(ioc, BFA_IOC_AEN_HBFAIL);
6467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
6487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Trigger auto-recovery after a delay.
6497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
6507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->auto_recover) {
6517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer,
6527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				bfa_ioc_timeout, ioc, BFA_IOC_TOV_RECOVER);
6537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
6577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC heartbeat failure.
6587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
6607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_hbfail(struct bfa_ioc_s *ioc, enum ioc_event event)
6617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
6637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
6657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_ENABLE:
6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (ioc->auto_recover)
6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_ioc_timer_stop(ioc);
6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_TIMEOUT:
6777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_set_state(ioc, bfa_ioc_sm_semwait);
6787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_FWREADY:
6817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/**
6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * Recovery is already initiated by other function.
6837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
6847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6860a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	case IOC_E_HWERROR:
6870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		/*
6880a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		 * HB failure notification, ignore.
6890a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		 */
6900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		break;
6910a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
6927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
6937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
6947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
7007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  bfa_ioc_pvt BFA IOC private functions
7017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
7027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
7047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_disable_comp(struct bfa_ioc_s *ioc)
7057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct list_head *qe;
7077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_hbfail_notify_s *notify;
7087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->cbfn->disable_cbfn(ioc->bfa);
7107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
7127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Notify common modules registered for notification.
7137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
7147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_for_each(qe, &ioc->hb_notify_q) {
7157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		notify = (struct bfa_ioc_hbfail_notify_s *)qe;
7167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		notify->cbfn(notify->cbarg);
7177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
7187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7200a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid
7217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sem_timeout(void *ioc_arg)
7227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_s *ioc = (struct bfa_ioc_s *)ioc_arg;
7247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_hw_sem_get(ioc);
7267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t
7290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_sem_get(bfa_os_addr_t sem_reg)
7307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7310a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	u32 r32;
7320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	int cnt = 0;
7330a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define BFA_SEM_SPINCNT 3000
7347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	r32 = bfa_reg_read(sem_reg);
7360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
7370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	while (r32 && (cnt < BFA_SEM_SPINCNT)) {
7387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		cnt++;
7390a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_os_udelay(2);
7400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		r32 = bfa_reg_read(sem_reg);
7410a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	}
7420a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
7430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	if (r32 == 0)
7440a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		return BFA_TRUE;
7450a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
7467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_assert(cnt < BFA_SEM_SPINCNT);
7470a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	return BFA_FALSE;
7487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid
7510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_ioc_sem_release(bfa_os_addr_t sem_reg)
7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	bfa_reg_write(sem_reg, 1);
7547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
7577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc)
7587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        r32;
7607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
7627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * First read to the semaphore register will return 0, subsequent reads
7630a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 * will return 1. Semaphore is released by writing 1 to the register
7647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
7657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	r32 = bfa_reg_read(ioc->ioc_regs.ioc_sem_reg);
7667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (r32 == 0) {
7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_send_event(ioc, IOC_E_SEMLOCKED);
7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
7697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
7707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_timer_begin(ioc->timer_mod, &ioc->sem_timer, bfa_ioc_sem_timeout,
7720a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			ioc, BFA_IOC_HWSEM_TOV);
7737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid
7767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_release(struct bfa_ioc_s *ioc)
7777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.ioc_sem_reg, 1);
7797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
7827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_get_cancel(struct bfa_ioc_s *ioc)
7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_timer_stop(&ioc->sem_timer);
7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
7887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize LPU local memory (aka secondary memory / SRAM)
7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
7907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
7917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lmem_init(struct bfa_ioc_s *ioc)
7927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        pss_ctl;
7947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             i;
7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define PSS_LMEM_INIT_TIME  10000
7967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg);
7987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl &= ~__PSS_LMEM_RESET;
7997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl |= __PSS_LMEM_INIT_EN;
8007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl |= __PSS_I2C_CLK_DIV(3UL); /* i2c workaround 12.5khz clock */
8017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl);
8027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * wait for memory initialization to be complete
8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
8067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	i = 0;
8077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	do {
8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg);
8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		i++;
8107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} while (!(pss_ctl & __PSS_LMEM_INIT_DONE) && (i < PSS_LMEM_INIT_TIME));
8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
8137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If memory initialization is not successful, IOC timeout will catch
8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * such failures.
8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_assert(pss_ctl & __PSS_LMEM_INIT_DONE);
8177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, pss_ctl);
8187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl &= ~(__PSS_LMEM_INIT_DONE | __PSS_LMEM_INIT_EN);
8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl);
8217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
8247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_start(struct bfa_ioc_s *ioc)
8257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        pss_ctl;
8277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
8297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Take processor out of reset.
8307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg);
8327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl &= ~__PSS_LPU0_RESET;
8337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl);
8357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
8387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_stop(struct bfa_ioc_s *ioc)
8397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        pss_ctl;
8417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
8437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Put processors in reset.
8447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
8457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl = bfa_reg_read(ioc->ioc_regs.pss_ctl_reg);
8467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl |= (__PSS_LPU0_RESET | __PSS_LPU1_RESET);
8477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.pss_ctl_reg, pss_ctl);
8497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
8527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Get driver and firmware versions.
8537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
8540a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid
8557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr)
8567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        pgnum, pgoff;
8587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        loff = 0;
8597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             i;
8607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32       *fwsig = (u32 *) fwhdr;
8617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pgnum = bfa_ioc_smem_pgnum(ioc, loff);
8637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pgoff = bfa_ioc_smem_pgoff(ioc, loff);
8647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum);
8657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < (sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32));
8677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	     i++) {
8687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		fwsig[i] = bfa_mem_read(ioc->ioc_regs.smem_page_start, loff);
8697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff += sizeof(u32);
8707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
8717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
8747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Returns TRUE if same.
8757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
8760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t
8777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr)
8787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
8797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_image_hdr_s *drv_fwhdr;
8807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             i;
8817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	drv_fwhdr =
8837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		(struct bfi_ioc_image_hdr_s *)bfa_ioc_fwimg_get_chunk(ioc, 0);
8847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) {
8867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (fwhdr->md5sum[i] != drv_fwhdr->md5sum[i]) {
8877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(ioc, i);
8887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(ioc, fwhdr->md5sum[i]);
8897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(ioc, drv_fwhdr->md5sum[i]);
8907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			return BFA_FALSE;
8917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
8927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
8937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, fwhdr->md5sum[0]);
8957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_TRUE;
8967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
8997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return true if current running version is valid. Firmware signature and
9007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * execution context (driver/bios) must match.
9017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
9027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic          bfa_boolean_t
9037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_valid(struct bfa_ioc_s *ioc)
9047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
9057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_image_hdr_s fwhdr, *drv_fwhdr;
9067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
9087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If bios/efi boot (flash based) -- return true
9097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
9107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ)
9117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_TRUE;
9127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_fwver_get(ioc, &fwhdr);
9147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	drv_fwhdr =
9157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		(struct bfi_ioc_image_hdr_s *)bfa_ioc_fwimg_get_chunk(ioc, 0);
9167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (fwhdr.signature != drv_fwhdr->signature) {
9187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, fwhdr.signature);
9197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, drv_fwhdr->signature);
9207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
9217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
9227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (fwhdr.exec != drv_fwhdr->exec) {
9247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, fwhdr.exec);
9257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, drv_fwhdr->exec);
9267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
9277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
9287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return bfa_ioc_fwver_cmp(ioc, &fwhdr);
9307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
9317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
9337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Conditionally flush any pending message from firmware at start.
9347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
9357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
9367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgflush(struct bfa_ioc_s *ioc)
9377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
9387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        r32;
9397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	r32 = bfa_reg_read(ioc->ioc_regs.lpu_mbox_cmd);
9417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (r32)
9427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_reg_write(ioc->ioc_regs.lpu_mbox_cmd, 1);
9437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
9447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
9477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force)
9487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
9497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	enum bfi_ioc_state ioc_fwstate;
9507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_boolean_t   fwvalid;
9517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_fwstate = bfa_reg_read(ioc->ioc_regs.ioc_fwstate);
9537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (force)
9557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc_fwstate = BFI_IOC_UNINIT;
9567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, ioc_fwstate);
9587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
9607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * check if firmware is valid
9617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
9627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	fwvalid = (ioc_fwstate == BFI_IOC_UNINIT) ?
9637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			BFA_FALSE : bfa_ioc_fwver_valid(ioc);
9647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!fwvalid) {
9667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_boot(ioc, BFI_BOOT_TYPE_NORMAL, ioc->pcidev.device_id);
9677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
9687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
9697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
9717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If hardware initialization is in progress (initialized by other IOC),
9727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * just wait for an initialization completion interrupt.
9737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
9747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc_fwstate == BFI_IOC_INITING) {
9757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, ioc_fwstate);
9767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->cbfn->reset_cbfn(ioc->bfa);
9777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
9787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
9797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
9817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If IOC function is disabled and firmware version is same,
9827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * just re-enable IOC.
9837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
9847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc_fwstate == BFI_IOC_DISABLED || ioc_fwstate == BFI_IOC_OP) {
9857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, ioc_fwstate);
9867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/**
9887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * When using MSI-X any pending firmware ready event should
9897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * be flushed. Otherwise MSI-X interrupts are not delivered.
9907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
9917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_msgflush(ioc);
9927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->cbfn->reset_cbfn(ioc->bfa);
9937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_send_event(ioc, IOC_E_FWREADY);
9947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
9957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
9967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
9987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize the h/w for any other states.
9997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
10007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_boot(ioc, BFI_BOOT_TYPE_NORMAL, ioc->pcidev.device_id);
10017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
10047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_timeout(void *ioc_arg)
10057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_s *ioc = (struct bfa_ioc_s *)ioc_arg;
10077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, 0);
10097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_TIMEOUT);
10107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len)
10147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32       *msgp = (u32 *) ioc_msg;
10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        i;
10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, msgp[0]);
10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, len);
10207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_assert(len <= BFI_IOC_MSGLEN_MAX);
10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
10247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * first write msg to mailbox registers
10257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
10267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < len / sizeof(u32); i++)
10277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_reg_write(ioc->ioc_regs.hfn_mbox + i * sizeof(u32),
10287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			      bfa_os_wtole(msgp[i]));
10297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (; i < BFI_IOC_MSGLEN_MAX / sizeof(u32); i++)
10317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_reg_write(ioc->ioc_regs.hfn_mbox + i * sizeof(u32), 0);
10327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * write 1 to mailbox CMD to trigger LPU event
10357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
10367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.hfn_mbox_cmd, 1);
10377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	(void)bfa_reg_read(ioc->ioc_regs.hfn_mbox_cmd);
10387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
10417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_enable(struct bfa_ioc_s *ioc)
10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_ctrl_req_s enable_req;
10447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ,
10467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(ioc));
10477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	enable_req.ioc_class = ioc->ioc_mc;
10487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req_s));
10497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
10527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_disable(struct bfa_ioc_s *ioc)
10537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_ctrl_req_s disable_req;
10557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(disable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_DISABLE_REQ,
10577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(ioc));
10587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req_s));
10597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
10627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_getattr(struct bfa_ioc_s *ioc)
10637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_getattr_req_s attr_req;
10657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(attr_req.mh, BFI_MC_IOC, BFI_IOC_H2I_GETATTR_REQ,
10677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(ioc));
10687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_dma_be_addr_set(attr_req.attr_addr, ioc->attr_dma.pa);
10697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, &attr_req, sizeof(attr_req));
10707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
10737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_check(void *cbarg)
10747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10750a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	struct bfa_ioc_s  *ioc = cbarg;
10760a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	u32     hb_count;
10777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat);
10797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->hb_count == hb_count) {
10800a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_log(ioc->logm, BFA_LOG_HAL_HEARTBEAT_FAILURE,
10810a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			hb_count);
10827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_recover(ioc);
10837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
10840a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	} else {
10850a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		ioc->hb_count = hb_count;
10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
10877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_poll(ioc);
10890a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check,
10900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			ioc, BFA_IOC_HB_TOV);
10917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_monitor(struct bfa_ioc_s *ioc)
10957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->hb_count = bfa_reg_read(ioc->ioc_regs.heartbeat);
10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_timer_begin(ioc->timer_mod, &ioc->ioc_timer, bfa_ioc_hb_check, ioc,
10987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			BFA_IOC_HB_TOV);
10997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
11027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_stop(struct bfa_ioc_s *ioc)
11037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_timer_stop(&ioc->ioc_timer);
11057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
11087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *      Initiate a full firmware download.
11097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
11117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type,
11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    u32 boot_param)
11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32       *fwimg;
11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        pgnum, pgoff;
11167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        loff = 0;
11177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        chunkno = 0;
11187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        i;
11197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
11217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize LMEM first before code download
11227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
11237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_lmem_init(ioc);
11247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
11267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Flash based firmware boot
11277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
11287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, bfa_ioc_fwimg_get_size(ioc));
11297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_ioc_fwimg_get_size(ioc) < BFA_IOC_FWIMG_MINSZ)
11307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		boot_type = BFI_BOOT_TYPE_FLASH;
11317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	fwimg = bfa_ioc_fwimg_get_chunk(ioc, chunkno);
11327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pgnum = bfa_ioc_smem_pgnum(ioc, loff);
11347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pgoff = bfa_ioc_smem_pgoff(ioc, loff);
11357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum);
11377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < bfa_ioc_fwimg_get_size(ioc); i++) {
11397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11400a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) {
11410a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			chunkno = BFA_IOC_FLASH_CHUNK_NO(i);
11427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			fwimg = bfa_ioc_fwimg_get_chunk(ioc,
11430a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati					BFA_IOC_FLASH_CHUNK_ADDR(chunkno));
11447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
11457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/**
11477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * write smem
11487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
11497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_mem_write(ioc->ioc_regs.smem_page_start, loff,
11500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			      fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)]);
11517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff += sizeof(u32);
11537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/**
11557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * handle page offset wrap around
11567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
11577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff = PSS_SMEM_PGOFF(loff);
11587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (loff == 0) {
11597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			pgnum++;
11607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum);
11617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
11627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
11637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.host_page_num_fn,
11657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      bfa_ioc_smem_pgnum(ioc, 0));
116613cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati
116713cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati	/*
116813cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati	 * Set boot type and boot param at the end.
116913cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati	 */
117013cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati	bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_TYPE_OFF,
117113cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati			bfa_os_swap32(boot_type));
117213cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati	bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_BOOT_PARAM_OFF,
117313cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati			bfa_os_swap32(boot_param));
11747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
11777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_reset(struct bfa_ioc_s *ioc, bfa_boolean_t force)
11787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_hwinit(ioc, force);
11807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Update BFA configuration from firmware configuration.
11847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
11857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
11867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_getattr_reply(struct bfa_ioc_s *ioc)
11877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_attr_s *attr = ioc->attr;
11897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->adapter_prop = bfa_os_ntohl(attr->adapter_prop);
11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	attr->maxfrsize = bfa_os_ntohs(attr->maxfrsize);
11927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_FWRSP_GETATTR);
11947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
11977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Attach time initialization of mbox logic.
11987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
11997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_attach(struct bfa_ioc_s *ioc)
12017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod;
12037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             mc;
12047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	INIT_LIST_HEAD(&mod->cmd_q);
12067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (mc = 0; mc < BFI_MC_MAX; mc++) {
12077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		mod->mbhdlr[mc].cbfn = NULL;
12087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		mod->mbhdlr[mc].cbarg = ioc->bfa;
12097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
12117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
12137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Mbox poll timer -- restarts any pending mailbox requests.
12147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
12167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_poll(struct bfa_ioc_s *ioc)
12177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
12187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod;
12197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_mbox_cmd_s *cmd;
12207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        stat;
12217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
12237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If no command pending, do nothing
12247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
12257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (list_empty(&mod->cmd_q))
12267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
12277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
12297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If previous command is not yet fetched by firmware, do nothing
12307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
12317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	stat = bfa_reg_read(ioc->ioc_regs.hfn_mbox_cmd);
12327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (stat)
12337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
12347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
12367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Enqueue command to firmware.
12377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
12387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_q_deq(&mod->cmd_q, &cmd);
12397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
12407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
12417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
12437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Cleanup any pending requests.
12447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
12467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_hbfail(struct bfa_ioc_s *ioc)
12477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
12487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod;
12497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_mbox_cmd_s *cmd;
12507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	while (!list_empty(&mod->cmd_q))
12527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_q_deq(&mod->cmd_q, &cmd);
12537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
12547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
12567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  bfa_ioc_public
12577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
12607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Interface used by diag module to do firmware boot with memory test
12617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * as the entry vector.
12627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
12647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_param)
12657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
12667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_os_addr_t   rb;
12677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_boots);
12697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK)
12717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
12727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
12747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize IOC state of all functions on a chip reset.
12757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
12767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	rb = ioc->pcidev.pci_bar_kva;
12777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (boot_param == BFI_BOOT_TYPE_MEMTEST) {
12787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_MEMTEST);
12797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_MEMTEST);
12807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} else {
12817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_reg_write((rb + BFA_IOC0_STATE_REG), BFI_IOC_INITING);
12827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_reg_write((rb + BFA_IOC1_STATE_REG), BFI_IOC_INITING);
12837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
12847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_download_fw(ioc, boot_type, boot_param);
12867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
12887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Enable interrupts just before starting LPU
12897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
12907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->cbfn->reset_cbfn(ioc->bfa);
12917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_lpu_start(ioc);
12927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
12937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
12957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Enable/disable IOC failure auto recovery.
12967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
12987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_auto_recover(bfa_boolean_t auto_recover)
12997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
13002f9b8857a914b71ba1b84fb23a0a20a87de41c91Krishna Gudipati	bfa_auto_recover = auto_recover;
13017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
13057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_operational(struct bfa_ioc_s *ioc)
13067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
13077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_op);
13087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
13117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg)
13127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
13137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32       *msgp = mbmsg;
13147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        r32;
13157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             i;
13167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
13187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * read the MBOX msg
13197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
13207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < (sizeof(union bfi_ioc_i2h_msg_u) / sizeof(u32));
13217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	     i++) {
13227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		r32 = bfa_reg_read(ioc->ioc_regs.lpu_mbox +
13237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				   i * sizeof(u32));
13247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		msgp[i] = bfa_os_htonl(r32);
13257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
13267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
13287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * turn off mailbox interrupt by clearing mailbox status
13297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
13307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.lpu_mbox_cmd, 1);
13317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_read(ioc->ioc_regs.lpu_mbox_cmd);
13327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
13357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *m)
13367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
13377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	union bfi_ioc_i2h_msg_u *msg;
13387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	msg = (union bfi_ioc_i2h_msg_u *)m;
13407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_isrs);
13427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (msg->mh.msg_id) {
13447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_HBEAT:
13457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
13467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_READY_EVENT:
13487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_send_event(ioc, IOC_E_FWREADY);
13497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
13507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_ENABLE_REPLY:
13527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_send_event(ioc, IOC_E_FWRSP_ENABLE);
13537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
13547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_DISABLE_REPLY:
13567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_fsm_send_event(ioc, IOC_E_FWRSP_DISABLE);
13577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
13587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_GETATTR_REPLY:
13607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_getattr_reply(ioc);
13617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
13627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
13647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, msg->mh.msg_id);
13657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_assert(0);
13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
13677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
13707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC attach time initialization and setup.
13717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
13727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	ioc	memory for IOC
13737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	bfa	driver instance structure
13747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	trcmod	kernel trace module
13757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	aen	kernel aen event module
13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	logm	kernel logging module
13777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
13787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
13797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, struct bfa_ioc_cbfn_s *cbfn,
13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	       struct bfa_timer_mod_s *timer_mod, struct bfa_trc_mod_s *trcmod,
13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	       struct bfa_aen_s *aen, struct bfa_log_mod_s *logm)
13827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
13837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->bfa = bfa;
13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->cbfn = cbfn;
13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->timer_mod = timer_mod;
13867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->trcmod = trcmod;
13877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->aen = aen;
13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->logm = logm;
13897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->fcmode = BFA_FALSE;
13907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->pllinit = BFA_FALSE;
13917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->dbg_fwsave_once = BFA_TRUE;
13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_attach(ioc);
13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	INIT_LIST_HEAD(&ioc->hb_notify_q);
13957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
13977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
14007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Driver detach time IOC cleanup.
14017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
14037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_detach(struct bfa_ioc_s *ioc)
14047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_DETACH);
14067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
14097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Setup IOC PCI properties.
14107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	pcidev	PCI device information for this IOC
14127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
14147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev,
14157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 enum bfi_mclass mc)
14167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->ioc_mc = mc;
14187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->pcidev = *pcidev;
14197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->ctdev = (ioc->pcidev.device_id == BFA_PCI_DEVICE_ID_CT);
14207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->cna = ioc->ctdev && !ioc->fcmode;
14217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14220a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	/**
14230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 * Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c
14240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 */
14250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	if (ioc->ctdev)
14260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_ioc_set_ct_hwif(ioc);
14270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	else
14280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_ioc_set_cb_hwif(ioc);
14290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
14307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_map_port(ioc);
14317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_reg_init(ioc);
14327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
14357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize IOC dma memory
14367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	dm_kva	kernel virtual address of IOC dma memory
14387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	dm_pa	physical address of IOC dma memory
14397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
14417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mem_claim(struct bfa_ioc_s *ioc, u8 *dm_kva, u64 dm_pa)
14427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
14447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * dma memory for firmware attribute
14457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
14467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->attr_dma.kva = dm_kva;
14477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->attr_dma.pa = dm_pa;
14487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->attr = (struct bfi_ioc_attr_s *)dm_kva;
14497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
14527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return size of dma memory required.
14537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu32
14557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_meminfo(void)
14567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_ROUNDUP(sizeof(struct bfi_ioc_attr_s), BFA_DMA_ALIGN_SZ);
14587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
14617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_enable(struct bfa_ioc_s *ioc)
14627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_enables);
14647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->dbg_fwsave_once = BFA_TRUE;
14657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_ENABLE);
14677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
14707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_disable(struct bfa_ioc_s *ioc)
14717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_disables);
14737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_DISABLE);
14747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
14777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Returns memory required for saving firmware trace in case of crash.
14787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Driver must call this interface to allocate memory required for
14797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * automatic saving of firmware trace. Driver should call
14807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * bfa_ioc_debug_memclaim() right after bfa_ioc_attach() to setup this
14817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * trace memory.
14827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangint
14847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_trcsz(bfa_boolean_t auto_recover)
14857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangreturn (auto_recover) ? BFA_DBG_FWTRC_LEN : 0;
14877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
14907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize memory for saving firmware trace. Driver must initialize
14917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * trace memory before call bfa_ioc_enable().
14927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
14947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave)
14957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->dbg_fwsave = dbg_fwsave;
14977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->dbg_fwsave_len = bfa_ioc_debug_trcsz(ioc->auto_recover);
14987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu32
15017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_smem_pgnum(struct bfa_ioc_s *ioc, u32 fmaddr)
15027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, fmaddr);
15047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu32
15077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_smem_pgoff(struct bfa_ioc_s *ioc, u32 fmaddr)
15087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return PSS_SMEM_PGOFF(fmaddr);
15107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
15137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler functions
15147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
15157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	ioc		IOC instance
15167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	mcfuncs		message class handler functions
15177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
15187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_register(struct bfa_ioc_s *ioc, bfa_ioc_mbox_mcfunc_t *mcfuncs)
15207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod;
15227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             mc;
15237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (mc = 0; mc < BFI_MC_MAX; mc++)
15257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		mod->mbhdlr[mc].cbfn = mcfuncs[mc];
15267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
15297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler function, to be called by common modules
15307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
15317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc,
15337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg)
15347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod;
15367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	mod->mbhdlr[mc].cbfn = cbfn;
15387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	mod->mbhdlr[mc].cbarg = cbarg;
15397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
15427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Queue a mailbox command request to firmware. Waits if mailbox is busy.
15437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Responsibility of caller to serialize
15447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
15457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	ioc	IOC instance
15467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[i]	cmd	Mailbox command
15477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
15487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_queue(struct bfa_ioc_s *ioc, struct bfa_mbox_cmd_s *cmd)
15507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod;
15527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        stat;
15537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
15557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If a previous command is pending, queue new command
15567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!list_empty(&mod->cmd_q)) {
15587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		list_add_tail(&cmd->qe, &mod->cmd_q);
15597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
15607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
15637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If mailbox is busy, queue command for poll timer
15647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	stat = bfa_reg_read(ioc->ioc_regs.hfn_mbox_cmd);
15667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (stat) {
15677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		list_add_tail(&cmd->qe, &mod->cmd_q);
15687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
15697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
15727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * mailbox is free -- queue command to firmware
15737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
15757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
15787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Handle mailbox interrupts
15797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
15807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_isr(struct bfa_ioc_s *ioc)
15827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_ioc_mbox_mod_s *mod = &ioc->mbox_mod;
15847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_mbmsg_s m;
15857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             mc;
15867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_msgget(ioc, &m);
15887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/**
15907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Treat IOC message class as special.
15917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	mc = m.mh.msg_class;
15937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (mc == BFI_MC_IOC) {
15947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_isr(ioc, &m);
15957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
15967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if ((mc > BFI_MC_MAX) || (mod->mbhdlr[mc].cbfn == NULL))
15997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
16007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	mod->mbhdlr[mc].cbfn(mod->mbhdlr[mc].cbarg, &m);
16027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
16057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_error_isr(struct bfa_ioc_s *ioc)
16067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_HWERROR);
16087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#ifndef BFA_BIOS_BUILD
16117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
16137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC is disabled
16147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
16157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
16167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_disabled(struct bfa_ioc_s *ioc)
16177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1618f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang	return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabling)
1619f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang		|| bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled);
16207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
16237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC firmware is different.
16247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
16257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
16267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc)
16277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1628f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang	return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_reset)
16297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		|| bfa_fsm_cmp_state(ioc, bfa_ioc_sm_fwcheck)
1630f8ceafde6f5bf6b4b7087c7f5e9da1b2a5284a2eJing Huang		|| bfa_fsm_cmp_state(ioc, bfa_ioc_sm_mismatch);
16317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_state_disabled(__sm)		\
16347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	(((__sm) == BFI_IOC_UNINIT) ||		\
16357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_INITING) ||		\
16367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_HWINIT) ||		\
16377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_DISABLED) ||	\
16380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 ((__sm) == BFI_IOC_FAIL) ||		\
16397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_CFG_DISABLED))
16407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
16427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Check if adapter is disabled -- both IOCs should be in a disabled
16437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * state.
16447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
16457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
16467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc)
16477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        ioc_state;
16497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_os_addr_t   rb = ioc->pcidev.pci_bar_kva;
16507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled))
16527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
16537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_state = bfa_reg_read(rb + BFA_IOC0_STATE_REG);
16557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_ioc_state_disabled(ioc_state))
16567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
16577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_state = bfa_reg_read(rb + BFA_IOC1_STATE_REG);
16597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_ioc_state_disabled(ioc_state))
16607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
16617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_TRUE;
16637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
16667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Add to IOC heartbeat failure notification queue. To be used by common
16677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * modules such as
16687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
16697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
16707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hbfail_register(struct bfa_ioc_s *ioc,
16717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			struct bfa_ioc_hbfail_notify_s *notify)
16727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_add_tail(&notify->qe, &ioc->hb_notify_q);
16747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_MFG_NAME "Brocade"
16777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
16787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc,
16797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 struct bfa_adapter_attr_s *ad_attr)
16807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_attr_s *ioc_attr;
16827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr = ioc->attr;
16840a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
16850a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num);
16860a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver);
16870a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver);
16880a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer);
16897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_os_memcpy(&ad_attr->vpd, &ioc_attr->vpd,
16907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      sizeof(struct bfa_mfg_vpd_s));
16917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16920a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ad_attr->nports = bfa_ioc_get_nports(ioc);
16930a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ad_attr->max_speed = bfa_ioc_speed_sup(ioc);
16947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16950a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_model(ioc, ad_attr->model);
16960a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	/* For now, model descr uses same model string */
16970a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr);
16987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (BFI_ADAPTER_IS_SPECIAL(ioc_attr->adapter_prop))
17007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ad_attr->prototype = 1;
17017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	else
17027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ad_attr->prototype = 0;
17037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
17047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->pwwn = bfa_ioc_get_pwwn(ioc);
17057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->mac = bfa_ioc_get_mac(ioc);
17067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
17077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->pcie_gen = ioc_attr->pcie_gen;
17087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->pcie_lanes = ioc_attr->pcie_lanes;
17097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->pcie_lanes_orig = ioc_attr->pcie_lanes_orig;
17107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->asic_rev = ioc_attr->asic_rev;
17110a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17120a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver);
17137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
17147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->cna_capable = ioc->cna;
17157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
17167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
17172993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatienum bfa_ioc_type_e
17182993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatibfa_ioc_get_type(struct bfa_ioc_s *ioc)
17192993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati{
17202993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	if (!ioc->ctdev || ioc->fcmode)
17212993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati		return BFA_IOC_TYPE_FC;
17222993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	else if (ioc->ioc_mc == BFI_MC_IOCFC)
17232993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati		return BFA_IOC_TYPE_FCoE;
17242993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	else if (ioc->ioc_mc == BFI_MC_LL)
17252993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati		return BFA_IOC_TYPE_LL;
17262993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	else {
17272993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati		bfa_assert(ioc->ioc_mc == BFI_MC_LL);
17282993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati		return BFA_IOC_TYPE_LL;
17292993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	}
17302993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati}
17312993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati
17327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
17330a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num)
17340a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
17350a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memset((void *)serial_num, 0, BFA_ADAPTER_SERIAL_NUM_LEN);
17360a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memcpy((void *)serial_num,
17370a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati			(void *)ioc->attr->brcd_serialnum,
17380a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati			BFA_ADAPTER_SERIAL_NUM_LEN);
17390a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
17400a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17410a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
17420a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver)
17430a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
17440a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memset((void *)fw_ver, 0, BFA_VERSION_LEN);
17450a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN);
17460a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
17470a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17480a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
17490a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev)
17500a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
17510a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_assert(chip_rev);
17520a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17530a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memset((void *)chip_rev, 0, BFA_IOC_CHIP_REV_LEN);
17540a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17550a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[0] = 'R';
17560a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[1] = 'e';
17570a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[2] = 'v';
17580a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[3] = '-';
17590a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[4] = ioc->attr->asic_rev;
17600a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[5] = '\0';
17610a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
17620a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17630a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
17640a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver)
17650a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
17660a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memset((void *)optrom_ver, 0, BFA_VERSION_LEN);
17670a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memcpy(optrom_ver, ioc->attr->optrom_version,
17680a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati		BFA_VERSION_LEN);
17690a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
17700a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17710a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
17720a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, char *manufacturer)
17730a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
17740a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN);
17750a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
17760a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
17770a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17780a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
17790a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model)
17800a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
17810a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	struct bfi_ioc_attr_s   *ioc_attr;
17820a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	u8              nports;
17830a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	u8              max_speed;
17840a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17850a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_assert(model);
17860a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_os_memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN);
17870a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17880a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ioc_attr = ioc->attr;
17890a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17900a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	nports = bfa_ioc_get_nports(ioc);
17910a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	max_speed = bfa_ioc_speed_sup(ioc);
17920a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
17930a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	/**
17940a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	 * model name
17950a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	 */
17960a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	if (max_speed == 10) {
17970a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati		strcpy(model, "BR-10?0");
17980a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati		model[5] = '0' + nports;
17990a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	} else {
18000a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati		strcpy(model, "Brocade-??5");
18010a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati		model[8] = '0' + max_speed;
18020a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati		model[9] = '0' + nports;
18030a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	}
18040a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
18050a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
18060a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatienum bfa_ioc_state
18070a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_state(struct bfa_ioc_s *ioc)
18080a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
18090a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	return bfa_sm_to_state(ioc_sm_table, ioc->fsm);
18100a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
18110a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
18120a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
18137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr)
18147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
18157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_os_memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s));
18167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18170a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ioc_attr->state = bfa_ioc_get_state(ioc);
18187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr->port_id = ioc->port_id;
18197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18202993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	ioc_attr->ioc_type = bfa_ioc_get_type(ioc);
18217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr);
18237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr->pci_attr.device_id = ioc->pcidev.device_id;
18257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func;
18260a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev);
18277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
18287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
18307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *  hal_wwn_public
18317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
18327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangwwn_t
18337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_pwwn(struct bfa_ioc_s *ioc)
18347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
18357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	union {
18367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		wwn_t           wwn;
18377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		u8         byte[sizeof(wwn_t)];
18387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
18397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w;
18407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w.wwn = ioc->attr->mfg_wwn;
18427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_ioc_portid(ioc) == 1)
18447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		w.byte[7]++;
18457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return w.wwn;
18477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
18487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangwwn_t
18507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_nwwn(struct bfa_ioc_s *ioc)
18517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
18527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	union {
18537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		wwn_t           wwn;
18547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		u8         byte[sizeof(wwn_t)];
18557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
18567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w;
18577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w.wwn = ioc->attr->mfg_wwn;
18597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_ioc_portid(ioc) == 1)
18617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		w.byte[7]++;
18627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w.byte[0] = 0x20;
18647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return w.wwn;
18667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
18677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangwwn_t
18697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_wwn_naa5(struct bfa_ioc_s *ioc, u16 inst)
18707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
18717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	union {
18727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		wwn_t           wwn;
18737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		u8         byte[sizeof(wwn_t)];
18747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
18757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w              , w5;
18767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, inst);
18787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w.wwn = ioc->attr->mfg_wwn;
18807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[0] = 0x50 | w.byte[2] >> 4;
18817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[1] = w.byte[2] << 4 | w.byte[3] >> 4;
18827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[2] = w.byte[3] << 4 | w.byte[4] >> 4;
18837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[3] = w.byte[4] << 4 | w.byte[5] >> 4;
18847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[4] = w.byte[5] << 4 | w.byte[6] >> 4;
18857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[5] = w.byte[6] << 4 | w.byte[7] >> 4;
18867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[6] = w.byte[7] << 4 | (inst & 0x0f00) >> 8;
18877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	w5.byte[7] = (inst & 0xff);
18887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return w5.wwn;
18907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
18917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangu64
18937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_adid(struct bfa_ioc_s *ioc)
18947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
18957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return ioc->attr->mfg_wwn;
18967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
18977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
18987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangmac_t
18997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_mac(struct bfa_ioc_s *ioc)
19007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	mac_t           mac;
19027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	mac = ioc->attr->mfg_mac;
19047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	mac.mac[MAC_ADDRLEN - 1] += bfa_ioc_pcifn(ioc);
19057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return mac;
19077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
19087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
19107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_set_fcmode(struct bfa_ioc_s *ioc)
19117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->fcmode = BFA_TRUE;
19137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->port_id = bfa_ioc_pcifn(ioc);
19147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
19157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
19177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_fcmode(struct bfa_ioc_s *ioc)
19187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return ioc->fcmode || (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_CT);
19207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
19217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
19237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Send AEN notification
19247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
19257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
19267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event)
19277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	union bfa_aen_data_u aen_data;
19297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfa_log_mod_s *logmod = ioc->logm;
19307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	s32         inst_num = 0;
19312993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	enum bfa_ioc_type_e ioc_type;
19327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19330a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_log(logmod, BFA_LOG_CREATE_ID(BFA_AEN_CAT_IOC, event), inst_num);
19347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	memset(&aen_data.ioc.pwwn, 0, sizeof(aen_data.ioc.pwwn));
19367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	memset(&aen_data.ioc.mac, 0, sizeof(aen_data.ioc.mac));
19372993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	ioc_type = bfa_ioc_get_type(ioc);
19382993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	switch (ioc_type) {
19397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_IOC_TYPE_FC:
19407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		aen_data.ioc.pwwn = bfa_ioc_get_pwwn(ioc);
19417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
19427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_IOC_TYPE_FCoE:
19437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		aen_data.ioc.pwwn = bfa_ioc_get_pwwn(ioc);
19447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		aen_data.ioc.mac = bfa_ioc_get_mac(ioc);
19457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
19467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFA_IOC_TYPE_LL:
19477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		aen_data.ioc.mac = bfa_ioc_get_mac(ioc);
19487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
19497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
19502993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati		bfa_assert(ioc_type == BFA_IOC_TYPE_FC);
19517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
19527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
19532993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	aen_data.ioc.ioc_type = ioc_type;
19547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
19557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
19577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure.
19587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
19597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
19607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, int *trclen)
19617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             tlen;
19637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->dbg_fwsave_len == 0)
19657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_ENOFSAVE;
19667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	tlen = *trclen;
19687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (tlen > ioc->dbg_fwsave_len)
19697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		tlen = ioc->dbg_fwsave_len;
19707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_os_memcpy(trcdata, ioc->dbg_fwsave, tlen);
19727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	*trclen = tlen;
19737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
19747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
19757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
1977738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati * Clear saved firmware trace
1978738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati */
1979738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipativoid
1980738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipatibfa_ioc_debug_fwsave_clear(struct bfa_ioc_s *ioc)
1981738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati{
1982738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati	ioc->dbg_fwsave_once = BFA_TRUE;
1983738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati}
1984738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati
1985738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati/**
19867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure.
19877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
19887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
19897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen)
19907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        pgnum;
19927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32        loff = BFA_DBG_FWTRC_OFF(bfa_ioc_portid(ioc));
19937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             i, tlen;
19947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	u32       *tbuf = trcdata, r32;
19957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, *trclen);
19977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pgnum = bfa_ioc_smem_pgnum(ioc, loff);
19997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	loff = bfa_ioc_smem_pgoff(ioc, loff);
20000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
20010a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	/*
20020a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 *  Hold semaphore to serialize pll init and fwtrc.
20030a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 */
20040a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg))
20050a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		return BFA_STATUS_FAILED;
20060a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
20077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum);
20087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	tlen = *trclen;
20107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (tlen > BFA_DBG_FWTRC_LEN)
20117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		tlen = BFA_DBG_FWTRC_LEN;
20127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	tlen /= sizeof(u32);
20137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, tlen);
20157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < tlen; i++) {
20177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		r32 = bfa_mem_read(ioc->ioc_regs.smem_page_start, loff);
20187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		tbuf[i] = bfa_os_ntohl(r32);
20197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff += sizeof(u32);
20207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/**
20227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * handle page offset wrap around
20237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
20247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff = PSS_SMEM_PGOFF(loff);
20257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (loff == 0) {
20267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			pgnum++;
20277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_reg_write(ioc->ioc_regs.host_page_num_fn, pgnum);
20287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
20297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
20307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_reg_write(ioc->ioc_regs.host_page_num_fn,
20317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      bfa_ioc_smem_pgnum(ioc, 0));
20320a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
20330a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	/*
20340a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 *  release semaphore.
20350a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 */
20360a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	bfa_ioc_sem_release(ioc->ioc_regs.ioc_init_sem_reg);
20370a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
20387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, pgnum);
20397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	*trclen = tlen * sizeof(u32);
20417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
20427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
20457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Save firmware trace if configured.
20467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
20477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
20487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_save(struct bfa_ioc_s *ioc)
20497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
20507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int             tlen;
20517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->dbg_fwsave_len) {
20537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		tlen = ioc->dbg_fwsave_len;
20547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_debug_fwtrc(ioc, ioc->dbg_fwsave, &tlen);
20557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
20567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/**
20597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Firmware failure detected. Start recovery actions.
20607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
20617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
20627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_recover(struct bfa_ioc_s *ioc)
20637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
20647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->dbg_fwsave_once) {
20657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc->dbg_fwsave_once = BFA_FALSE;
20667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_debug_save(ioc);
20677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
20687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_hbfails);
20707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_HBFAIL);
20717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#else
20747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
20767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event)
20777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
20787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
20817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_recover(struct bfa_ioc_s *ioc)
20827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
20837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_assert(0);
20847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#endif
20877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2089