17725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
2a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Copyright (c) 2005-2010 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
18f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang#include "bfad_drv.h"
197826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati#include "bfad_im.h"
20a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_ioc.h"
21111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#include "bfi_reg.h"
22a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_defs.h"
23a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_defs_svc.h"
247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
257af074dc9d343f69bab4bfd699e6d7ba09915fd9Krishna GudipatiBFA_TRC_FILE(CNA, IOC);
267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
275fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC local definitions
297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
30a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_TOV		3000	/* msecs */
31a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_HWSEM_TOV	500	/* msecs */
32a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_HB_TOV		500	/* msecs */
33a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOC_TOV_RECOVER	 BFA_IOC_HB_TOV
34775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati#define BFA_IOC_POLL_TOV	BFA_TIMER_FREQ
357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_start(__ioc)					\
377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer,	\
387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_ioc_timeout, (__ioc), BFA_IOC_TOV)
397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_timer_stop(__ioc)   bfa_timer_stop(&(__ioc)->ioc_timer)
407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
41a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_hb_timer_start(__ioc)					\
42a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->hb_timer,		\
43a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_ioc_hb_check, (__ioc), BFA_IOC_HB_TOV)
44a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_hb_timer_stop(__ioc)	bfa_timer_stop(&(__ioc)->hb_timer)
45a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_DBG_FWTRC_OFF(_fn)	(BFI_IOC_TRC_OFF + BFA_DBG_FWTRC_LEN * (_fn))
477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
485fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
490a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati * Asic specific macros : see bfa_hw_cb.c and bfa_hw_ct.c for details.
500a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati */
510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
52a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioc_firmware_lock(__ioc)			\
530a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			((__ioc)->ioc_hwif->ioc_firmware_lock(__ioc))
54a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioc_firmware_unlock(__ioc)			\
550a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			((__ioc)->ioc_hwif->ioc_firmware_unlock(__ioc))
560a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_reg_init(__ioc) ((__ioc)->ioc_hwif->ioc_reg_init(__ioc))
570a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati#define bfa_ioc_map_port(__ioc) ((__ioc)->ioc_hwif->ioc_map_port(__ioc))
58f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_notify_fail(__ioc)              \
59f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			((__ioc)->ioc_hwif->ioc_notify_fail(__ioc))
6045d7f0cc58183062adea0a1de3d8cba768134138Jing Huang#define bfa_ioc_sync_start(__ioc)               \
6145d7f0cc58183062adea0a1de3d8cba768134138Jing Huang			((__ioc)->ioc_hwif->ioc_sync_start(__ioc))
62f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_join(__ioc)                \
63f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			((__ioc)->ioc_hwif->ioc_sync_join(__ioc))
64f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_leave(__ioc)               \
65f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			((__ioc)->ioc_hwif->ioc_sync_leave(__ioc))
66f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_ack(__ioc)                 \
67f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			((__ioc)->ioc_hwif->ioc_sync_ack(__ioc))
68f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati#define bfa_ioc_sync_complete(__ioc)            \
69f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			((__ioc)->ioc_hwif->ioc_sync_complete(__ioc))
70a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
71a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_ioc_mbox_cmd_pending(__ioc)		\
72a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			(!list_empty(&((__ioc)->mbox_mod.cmd_q)) || \
735344026065f79b102fcc44bc6332f856a111962aJing Huang			readl((__ioc)->ioc_regs.hfn_mbox_cmd))
74a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
75a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t bfa_auto_recover = BFA_TRUE;
767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang/*
787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * forward declarations
797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
80a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc);
81a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force);
82a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_timeout(void *ioc);
83775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void bfa_ioc_poll_fwinit(struct bfa_ioc_s *ioc);
84a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_send_enable(struct bfa_ioc_s *ioc);
85a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_send_disable(struct bfa_ioc_s *ioc);
86a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_send_getattr(struct bfa_ioc_s *ioc);
87a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_hb_monitor(struct bfa_ioc_s *ioc);
88a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_mbox_poll(struct bfa_ioc_s *ioc);
898b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipatistatic void bfa_ioc_mbox_flush(struct bfa_ioc_s *ioc);
90a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_recover(struct bfa_ioc_s *ioc);
91d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatistatic void bfa_ioc_event_notify(struct bfa_ioc_s *ioc ,
92d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati				enum bfa_ioc_event_e event);
93a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_disable_comp(struct bfa_ioc_s *ioc);
94a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_lpu_stop(struct bfa_ioc_s *ioc);
954e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatistatic void bfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc);
964e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatistatic void bfa_ioc_fail_notify(struct bfa_ioc_s *ioc);
97a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_ioc_pf_fwmismatch(struct bfa_ioc_s *ioc);
987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC state machine definitions/declarations
1017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangenum ioc_event {
103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOC_E_RESET		= 1,	/*  IOC reset request		*/
104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOC_E_ENABLE		= 2,	/*  IOC enable request		*/
105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOC_E_DISABLE		= 3,	/*  IOC disable request	*/
106a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOC_E_DETACH		= 4,	/*  driver detach cleanup	*/
107a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOC_E_ENABLED		= 5,	/*  f/w enabled		*/
108a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOC_E_FWRSP_GETATTR	= 6,	/*  IOC get attribute response	*/
109a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOC_E_DISABLED		= 7,	/*  f/w disabled		*/
110775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	IOC_E_PFFAILED		= 8,	/*  failure notice by iocpf sm	*/
111775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	IOC_E_HBFAIL		= 9,	/*  heartbeat failure		*/
112775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	IOC_E_HWERROR		= 10,	/*  hardware error interrupt	*/
113775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	IOC_E_TIMEOUT		= 11,	/*  timeout			*/
1145a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	IOC_E_HWFAILED		= 12,	/*  PCI mapping failure notice	*/
1157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
1167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, uninit, struct bfa_ioc_s, enum ioc_event);
1187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, reset, struct bfa_ioc_s, enum ioc_event);
1197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, enabling, struct bfa_ioc_s, enum ioc_event);
1207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, getattr, struct bfa_ioc_s, enum ioc_event);
1217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, op, struct bfa_ioc_s, enum ioc_event);
1224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, fail_retry, struct bfa_ioc_s, enum ioc_event);
123a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, fail, struct bfa_ioc_s, enum ioc_event);
1247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabling, struct bfa_ioc_s, enum ioc_event);
1257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_fsm_state_decl(bfa_ioc, disabled, struct bfa_ioc_s, enum ioc_event);
1265a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatibfa_fsm_state_decl(bfa_ioc, hwfail, struct bfa_ioc_s, enum ioc_event);
1277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic struct bfa_sm_table_s ioc_sm_table[] = {
129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_ioc_sm_uninit), BFA_IOC_UNINIT},
1307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_reset), BFA_IOC_RESET},
131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_ioc_sm_enabling), BFA_IOC_ENABLING},
1327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_getattr), BFA_IOC_GETATTR},
1337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_op), BFA_IOC_OPERATIONAL},
1344e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	{BFA_SM(bfa_ioc_sm_fail_retry), BFA_IOC_INITFAIL},
135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_ioc_sm_fail), BFA_IOC_FAIL},
1367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_disabling), BFA_IOC_DISABLING},
1377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	{BFA_SM(bfa_ioc_sm_disabled), BFA_IOC_DISABLED},
1385a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	{BFA_SM(bfa_ioc_sm_hwfail), BFA_IOC_HWFAIL},
1397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang};
1407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF state machine definitions/declarations
143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_iocpf_timer_start(__ioc)					\
146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer,	\
147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_iocpf_timeout, (__ioc), BFA_IOC_TOV)
148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_iocpf_timer_stop(__ioc)	bfa_timer_stop(&(__ioc)->ioc_timer)
149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
150775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati#define bfa_iocpf_poll_timer_start(__ioc)				\
151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->ioc_timer,	\
152775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati			bfa_iocpf_poll_timeout, (__ioc), BFA_IOC_POLL_TOV)
153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_sem_timer_start(__ioc)					\
155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_timer_begin((__ioc)->timer_mod, &(__ioc)->sem_timer,	\
156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_iocpf_sem_timeout, (__ioc), BFA_IOC_HWSEM_TOV)
157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define bfa_sem_timer_stop(__ioc)	bfa_timer_stop(&(__ioc)->sem_timer)
158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati/*
160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Forward declareations for iocpf state machine
161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocpf_timeout(void *ioc_arg);
163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocpf_sem_timeout(void *ioc_arg);
164775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void bfa_iocpf_poll_timeout(void *ioc_arg);
165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1665fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF state machine events
168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum iocpf_event {
170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_ENABLE		= 1,	/*  IOCPF enable request	*/
171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_DISABLE		= 2,	/*  IOCPF disable request	*/
172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_STOP		= 3,	/*  stop on driver detach	*/
173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_FWREADY		= 4,	/*  f/w initialization done	*/
174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_FWRSP_ENABLE	= 5,	/*  enable f/w response	*/
175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_FWRSP_DISABLE	= 6,	/*  disable f/w response	*/
176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_FAIL		= 7,	/*  failure notice by ioc sm	*/
177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_INITFAIL	= 8,	/*  init fail notice by ioc sm	*/
178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_GETATTRFAIL	= 9,	/*  init fail notice by ioc sm	*/
179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_SEMLOCKED	= 10,	/*  h/w semaphore is locked	*/
180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	IOCPF_E_TIMEOUT		= 11,	/*  f/w response timeout	*/
1815a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	IOCPF_E_SEM_ERROR	= 12,	/*  h/w sem mapping error	*/
182a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF states
186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum bfa_iocpf_state {
188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_RESET		= 1,	/*  IOC is in reset state */
189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_SEMWAIT	= 2,	/*  Waiting for IOC h/w semaphore */
190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_HWINIT	= 3,	/*  IOC h/w is being initialized */
191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_READY		= 4,	/*  IOCPF is initialized */
192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_INITFAIL	= 5,	/*  IOCPF failed */
193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_FAIL		= 6,	/*  IOCPF failed */
194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_DISABLING	= 7,	/*  IOCPF is being disabled */
195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_DISABLED	= 8,	/*  IOCPF is disabled */
196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCPF_FWMISMATCH	= 9,	/*  IOC f/w different from drivers */
197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, reset, struct bfa_iocpf_s, enum iocpf_event);
200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, fwcheck, struct bfa_iocpf_s, enum iocpf_event);
201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, mismatch, struct bfa_iocpf_s, enum iocpf_event);
202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, semwait, struct bfa_iocpf_s, enum iocpf_event);
203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, hwinit, struct bfa_iocpf_s, enum iocpf_event);
204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, enabling, struct bfa_iocpf_s, enum iocpf_event);
205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, ready, struct bfa_iocpf_s, enum iocpf_event);
206f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_fsm_state_decl(bfa_iocpf, initfail_sync, struct bfa_iocpf_s,
207f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati						enum iocpf_event);
208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, initfail, struct bfa_iocpf_s, enum iocpf_event);
209f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_fsm_state_decl(bfa_iocpf, fail_sync, struct bfa_iocpf_s, enum iocpf_event);
210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, fail, struct bfa_iocpf_s, enum iocpf_event);
211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, disabling, struct bfa_iocpf_s, enum iocpf_event);
212f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_fsm_state_decl(bfa_iocpf, disabling_sync, struct bfa_iocpf_s,
213f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati						enum iocpf_event);
214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_fsm_state_decl(bfa_iocpf, disabled, struct bfa_iocpf_s, enum iocpf_event);
215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct bfa_sm_table_s iocpf_sm_table[] = {
217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_reset), BFA_IOCPF_RESET},
218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_fwcheck), BFA_IOCPF_FWMISMATCH},
219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_mismatch), BFA_IOCPF_FWMISMATCH},
220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_semwait), BFA_IOCPF_SEMWAIT},
221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_hwinit), BFA_IOCPF_HWINIT},
222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_enabling), BFA_IOCPF_HWINIT},
223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_ready), BFA_IOCPF_READY},
224f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	{BFA_SM(bfa_iocpf_sm_initfail_sync), BFA_IOCPF_INITFAIL},
225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_initfail), BFA_IOCPF_INITFAIL},
226f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	{BFA_SM(bfa_iocpf_sm_fail_sync), BFA_IOCPF_FAIL},
227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_fail), BFA_IOCPF_FAIL},
228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_disabling), BFA_IOCPF_DISABLING},
229f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	{BFA_SM(bfa_iocpf_sm_disabling_sync), BFA_IOCPF_DISABLING},
230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	{BFA_SM(bfa_iocpf_sm_disabled), BFA_IOCPF_DISABLED},
231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC State Machine
235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
238a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Beginning state. IOC uninit state.
239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_uninit_entry(struct bfa_ioc_s *ioc)
243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2465fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is in uninit state.
248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_uninit(struct bfa_ioc_s *ioc, enum ioc_event event)
251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_RESET:
256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_reset);
257a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2635fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Reset entry actions -- initialize state machine
2657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset_entry(struct bfa_ioc_s *ioc)
2687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_fsm_set_state(&ioc->iocpf, bfa_iocpf_sm_reset);
2707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is in reset state.
2747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
2757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
2767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_sm_reset(struct bfa_ioc_s *ioc, enum ioc_event event)
2777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
2797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
2817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_ENABLE:
282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling);
2837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
2867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_disable_comp(ioc);
2877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DETACH:
290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
2917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
2927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
2947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
2957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
2967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
2977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
299a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_enabling_entry(struct bfa_ioc_s *ioc)
301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
302f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_ENABLE);
303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Host IOC function is being enabled, awaiting response from firmware.
307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Semaphore is acquired.
3087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_enabling(struct bfa_ioc_s *ioc, enum ioc_event event)
3117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
312a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
313a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_ENABLED:
316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr);
317a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3194e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	case IOC_E_PFFAILED:
3204e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		/* !!! fall through !!! */
321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_HWERROR:
3224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
323775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
3244e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		if (event != IOC_E_PFFAILED)
3254e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_INITFAIL);
326a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3285a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOC_E_HWFAILED:
3295a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
3305a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
3315a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
3325a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DISABLE:
334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DETACH:
338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
339f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP);
340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_ENABLE:
343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
344a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
345a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_getattr_entry(struct bfa_ioc_s *ioc)
353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
354a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_timer_start(ioc);
355a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_send_getattr(ioc);
3567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
3577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3585fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
359a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC configuration in progress. Timer is active.
3607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
3617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_getattr(struct bfa_ioc_s *ioc, enum ioc_event event)
3637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
3647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
3657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
367a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_FWRSP_GETATTR:
368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_timer_stop(ioc);
369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_op);
370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3724e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	case IOC_E_PFFAILED:
373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_HWERROR:
374a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_timer_stop(ioc);
3754e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		/* !!! fall through !!! */
376a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_TIMEOUT:
3774e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
378775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
3794e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		if (event != IOC_E_PFFAILED)
3804e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_GETATTRFAIL);
3817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
3827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
3837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_timer_stop(ioc);
385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
386a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
387a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_ENABLE:
389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
390a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
392a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
395a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_op_entry(struct bfa_ioc_s *ioc)
398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_OK);
402d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	bfa_ioc_event_notify(ioc, BFA_IOC_E_ENABLED);
403db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati	bfa_ioc_hb_monitor(ioc);
4048816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang	BFA_LOG(KERN_INFO, bfad, bfa_log_level, "IOC enabled\n");
4057826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfa_ioc_aen_post(ioc, BFA_IOC_AEN_ENABLE);
406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_op(struct bfa_ioc_s *ioc, enum ioc_event event)
410a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
414a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_ENABLE:
415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DISABLE:
418f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_hb_timer_stop(ioc);
419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
421a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	case IOC_E_PFFAILED:
423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_HWERROR:
424f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_hb_timer_stop(ioc);
425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		/* !!! fall through !!! */
426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_HBFAIL:
4274e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		if (ioc->iocpf.auto_recover)
4284e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_fsm_set_state(ioc, bfa_ioc_sm_fail_retry);
4294e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		else
4304e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
4314e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati
432775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_ioc_fail_notify(ioc);
433775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
4344e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		if (event != IOC_E_PFFAILED)
4354e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FAIL);
436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabling_entry(struct bfa_ioc_s *ioc)
446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
448f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_DISABLE);
4498816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang	BFA_LOG(KERN_INFO, bfad, bfa_log_level, "IOC disabled\n");
4507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfa_ioc_aen_post(ioc, BFA_IOC_AEN_DISABLE);
451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4535fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is being disabled
455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
456a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabling(struct bfa_ioc_s *ioc, enum ioc_event event)
458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
459a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DISABLED:
463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabled);
464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
466a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_HWERROR:
4677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
468a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * No state change.  Will move to disabled state
469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * after iocpf sm completes failure processing and
470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * moves to disabled state.
4717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
472f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FAIL);
473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
4747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
4755a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOC_E_HWFAILED:
4765a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
4775a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_ioc_disable_comp(ioc);
4785a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
4795a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4855fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC disable completion entry.
487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
488a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabled_entry(struct bfa_ioc_s *ioc)
490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_disable_comp(ioc);
492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
493a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
494a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
495a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_disabled(struct bfa_ioc_s *ioc, enum ioc_event event)
496a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
497a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
498a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
499a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_ENABLE:
501a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_enabling);
5027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DISABLE:
505a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioc->cbfn->disable_cbfn(ioc->bfa);
506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
508a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DETACH:
509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
510f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP);
5117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
5127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
5147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
5157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
5167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
5204e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_sm_fail_retry_entry(struct bfa_ioc_s *ioc)
521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
5224e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	bfa_trc(ioc, 0);
523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5255fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
526f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Hardware initialization retry.
5277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
5294e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_sm_fail_retry(struct bfa_ioc_s *ioc, enum ioc_event event)
5307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_ENABLED:
535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_getattr);
536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
537a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5384e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	case IOC_E_PFFAILED:
5394e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	case IOC_E_HWERROR:
5405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
5414e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		 * Initialization retry failed.
542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
544775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_fail);
5454e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		if (event != IOC_E_PFFAILED)
5464e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_INITFAIL);
5474e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		break;
5484e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati
5495a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOC_E_HWFAILED:
5505a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
5515a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_hwfail);
5525a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
5535a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
5544e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	case IOC_E_ENABLE:
555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DISABLE:
558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_DETACH:
562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
563f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP);
564a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_fail_entry(struct bfa_ioc_s *ioc)
574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
5754e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	bfa_trc(ioc, 0);
5767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
5777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5785fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC failure.
5807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
5817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_sm_fail(struct bfa_ioc_s *ioc, enum ioc_event event)
5837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
5847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
5857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
5867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_ENABLE:
589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case IOC_E_DISABLE:
593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_disabling);
594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
596f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOC_E_DETACH:
597f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
598f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_STOP);
599f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
600f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOC_E_HWERROR:
6027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * HB failure notification, ignore.
6047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
608a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
6107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6115a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatistatic void
6125a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatibfa_ioc_sm_hwfail_entry(struct bfa_ioc_s *ioc)
6135a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati{
6145a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_trc(ioc, 0);
6155a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati}
6165a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
6175a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatistatic void
6185a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatibfa_ioc_sm_hwfail(struct bfa_ioc_s *ioc, enum ioc_event event)
6195a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati{
6205a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_trc(ioc, event);
6215a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
6225a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	switch (event) {
6235a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOC_E_ENABLE:
6245a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
6255a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
6265a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
6275a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOC_E_DISABLE:
6285a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		ioc->cbfn->disable_cbfn(ioc->bfa);
6295a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
6305a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
6315a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOC_E_DETACH:
6325a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
6335a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
6345a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
6355a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	default:
6365a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_sm_fault(ioc, event);
6375a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	}
6385a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati}
6395a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
6405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOCPF State Machine
642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6445fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Reset entry actions -- initialize state machine
646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_reset_entry(struct bfa_iocpf_s *iocpf)
649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
650775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	iocpf->fw_mismatch_notified = BFA_FALSE;
651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocpf->auto_recover = bfa_auto_recover;
652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Beginning state. IOC is in reset state.
656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_reset(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
660a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
664a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
665a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_ENABLE:
666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fwcheck);
6677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_STOP:
6707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
6717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
6737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
6747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
6757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
6767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
6775fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Semaphore should be acquired for version check.
6797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
6807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_fwcheck_entry(struct bfa_iocpf_s *iocpf)
6827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
6835a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	struct bfi_ioc_image_hdr_s	fwhdr;
6848919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	u32	r32, fwstate, pgnum, pgoff, loff = 0;
6858919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	int	i;
6868919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati
6878919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	/*
6888919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 * Spin on init semaphore to serialize.
6898919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 */
6908919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	r32 = readl(iocpf->ioc->ioc_regs.ioc_init_sem_reg);
6918919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	while (r32 & 0x1) {
6928919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati		udelay(20);
6938919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati		r32 = readl(iocpf->ioc->ioc_regs.ioc_init_sem_reg);
6948919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	}
6955a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
6965a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	/* h/w sem init */
6978919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	fwstate = readl(iocpf->ioc->ioc_regs.ioc_fwstate);
6988919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	if (fwstate == BFI_IOC_UNINIT) {
6998919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati		writel(1, iocpf->ioc->ioc_regs.ioc_init_sem_reg);
7005a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		goto sem_get;
7018919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	}
7025a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
7035a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_ioc_fwver_get(iocpf->ioc, &fwhdr);
7045a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
7058919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	if (swab32(fwhdr.exec) == BFI_FWBOOT_TYPE_NORMAL) {
7068919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati		writel(1, iocpf->ioc->ioc_regs.ioc_init_sem_reg);
7075a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		goto sem_get;
7088919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	}
7098919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati
7108919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	/*
7118919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 * Clear fwver hdr
7128919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 */
7138919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	pgnum = PSS_SMEM_PGNUM(iocpf->ioc->ioc_regs.smem_pg0, loff);
7148919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	pgoff = PSS_SMEM_PGOFF(loff);
7158919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	writel(pgnum, iocpf->ioc->ioc_regs.host_page_num_fn);
7168919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati
7178919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	for (i = 0; i < sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32); i++) {
7188919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati		bfa_mem_write(iocpf->ioc->ioc_regs.smem_page_start, loff, 0);
7198919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati		loff += sizeof(u32);
7208919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	}
7215a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
7225a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_trc(iocpf->ioc, fwstate);
7238919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	bfa_trc(iocpf->ioc, swab32(fwhdr.exec));
7245a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	writel(BFI_IOC_UNINIT, iocpf->ioc->ioc_regs.ioc_fwstate);
7258919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	writel(BFI_IOC_UNINIT, iocpf->ioc->ioc_regs.alt_ioc_fwstate);
7265a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
7275a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	/*
7288919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 * Unlock the hw semaphore. Should be here only once per boot.
7295a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	 */
7305a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	readl(iocpf->ioc->ioc_regs.ioc_sem_reg);
7315a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	writel(1, iocpf->ioc->ioc_regs.ioc_sem_reg);
7328919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati
7338919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	/*
7348919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 * unlock init semaphore.
7358919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 */
7368919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	writel(1, iocpf->ioc->ioc_regs.ioc_init_sem_reg);
7378919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati
7385a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipatisem_get:
739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_hw_sem_get(iocpf->ioc);
7407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7425fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Awaiting h/w semaphore to continue with version check.
7447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
7457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_fwcheck(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
7477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
7517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_SEMLOCKED:
754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_ioc_firmware_lock(ioc)) {
75545d7f0cc58183062adea0a1de3d8cba768134138Jing Huang			if (bfa_ioc_sync_start(ioc)) {
756f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				bfa_ioc_sync_join(ioc);
757f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				bfa_fsm_set_state(iocpf, bfa_iocpf_sm_hwinit);
758f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			} else {
759f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				bfa_ioc_firmware_unlock(ioc);
760f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				writel(1, ioc->ioc_regs.ioc_sem_reg);
761f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				bfa_sem_timer_start(ioc);
762f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			}
763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		} else {
764f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang			writel(1, ioc->ioc_regs.ioc_sem_reg);
765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_fsm_set_state(iocpf, bfa_iocpf_sm_mismatch);
766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
7677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
7687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7695a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOCPF_E_SEM_ERROR:
7705a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail);
7715a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_send_event(ioc, IOC_E_HWFAILED);
7725a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
7735a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
775f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sem_timer_stop(ioc);
776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset);
777f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_fsm_send_event(ioc, IOC_E_DISABLED);
778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_STOP:
781f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sem_timer_stop(ioc);
782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset);
7837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
7847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
7867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
7877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
7887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
7897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
7905fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Notify enable completion callback.
792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
7937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_mismatch_entry(struct bfa_iocpf_s *iocpf)
7957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Call only the first time sm enters fwmismatch state.
798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
799775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	if (iocpf->fw_mismatch_notified == BFA_FALSE)
800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_pf_fwmismatch(iocpf->ioc);
801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
802775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	iocpf->fw_mismatch_notified = BFA_TRUE;
803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocpf_timer_start(iocpf->ioc);
8047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Awaiting firmware version match.
8087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
8097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_mismatch(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
8117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
8157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_TIMEOUT:
818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fwcheck);
8197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
8207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset);
824f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_fsm_send_event(ioc, IOC_E_DISABLED);
825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
8267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_STOP:
828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset);
830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
8317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_sm_fault(ioc, event);
834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8375fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Request for semaphore.
839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_semwait_entry(struct bfa_iocpf_s *iocpf)
842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_hw_sem_get(iocpf->ioc);
844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8465fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Awaiting semaphore for h/w initialzation.
848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_semwait(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, event);
855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (event) {
857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_SEMLOCKED:
858f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		if (bfa_ioc_sync_complete(ioc)) {
859f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			bfa_ioc_sync_join(ioc);
860f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			bfa_fsm_set_state(iocpf, bfa_iocpf_sm_hwinit);
861f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		} else {
862f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			writel(1, ioc->ioc_regs.ioc_sem_reg);
863f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			bfa_sem_timer_start(ioc);
864f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		}
8657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
8667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8675a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOCPF_E_SEM_ERROR:
8685a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail);
8695a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_send_event(ioc, IOC_E_HWFAILED);
8705a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
8715a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
873f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_sem_timer_stop(ioc);
874f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync);
8757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
8767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
8787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
8797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
8807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_hwinit_entry(struct bfa_iocpf_s *iocpf)
8847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
885775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	iocpf->poll_time = 0;
886f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_ioc_hwinit(iocpf->ioc, BFA_FALSE);
8877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
8887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
8895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Hardware is being initialized. Interrupts are enabled.
891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Holding hardware semaphore lock.
8927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
8937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_hwinit(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
8957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
8997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_FWREADY:
902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_enabling);
9037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
9047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_TIMEOUT:
906f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		writel(1, ioc->ioc_regs.ioc_sem_reg);
907775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_fsm_send_event(ioc, IOC_E_PFFAILED);
908f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail_sync);
9097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
9107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
913f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_ioc_sync_leave(ioc);
914f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		writel(1, ioc->ioc_regs.ioc_sem_reg);
915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled);
9167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
9177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
9197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
9207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
9217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
9227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_enabling_entry(struct bfa_iocpf_s *iocpf)
9257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocpf_timer_start(iocpf->ioc);
927775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	/*
928775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	 * Enable Interrupts before sending fw IOC ENABLE cmd.
929775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	 */
930775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	iocpf->ioc->cbfn->reset_cbfn(iocpf->ioc->bfa);
931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_send_enable(iocpf->ioc);
9327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
9337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Host IOC function is being enabled, awaiting response from firmware.
936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Semaphore is acquired.
9377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
9387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_enabling(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
9407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
9437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
9447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_FWRSP_ENABLE:
947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
948f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		writel(1, ioc->ioc_regs.ioc_sem_reg);
949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_ready);
9507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
9517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_INITFAIL:
953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
9547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * !!! fall through !!!
9567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
9577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_TIMEOUT:
959f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		writel(1, ioc->ioc_regs.ioc_sem_reg);
960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (event == IOCPF_E_TIMEOUT)
9614e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_fsm_send_event(ioc, IOC_E_PFFAILED);
962f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail_sync);
9637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
9647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
967f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		writel(1, ioc->ioc_regs.ioc_sem_reg);
968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling);
969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
9717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
9727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
9737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
9747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
9757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_ready_entry(struct bfa_iocpf_s *iocpf)
9787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
979f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_fsm_send_event(iocpf->ioc, IOC_E_ENABLED);
9807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
9817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_ready(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
9847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
9877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
9887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
9897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling);
992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_GETATTRFAIL:
995f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail_sync);
9967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
9977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_FAIL:
999f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail_sync);
10007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
10017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
10037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
10047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
10057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabling_entry(struct bfa_iocpf_s *iocpf)
10097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocpf_timer_start(iocpf->ioc);
1011a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_send_disable(iocpf->ioc);
10127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
10157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC is being disabled
10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1018a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabling(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
1021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_FWRSP_DISABLE:
1026a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
1027f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync);
10280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		break;
10290a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
1030a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_FAIL:
1031a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocpf_timer_stop(ioc);
10327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		/*
10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * !!! fall through !!!
10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
10357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_TIMEOUT:
10375344026065f79b102fcc44bc6332f856a111962aJing Huang		writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate);
1038f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync);
1039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_FWRSP_ENABLE:
10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
10437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
10457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
10467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
10477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1049f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void
1050f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_disabling_sync_entry(struct bfa_iocpf_s *iocpf)
1051f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{
1052f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	bfa_ioc_hw_sem_get(iocpf->ioc);
1053f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati}
1054f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
10558f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/*
1056f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * IOC hb ack request is being removed.
1057f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */
1058f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void
1059f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_disabling_sync(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
1060f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{
1061f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
1062f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1063f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	bfa_trc(ioc, event);
1064f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1065f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	switch (event) {
1066f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_SEMLOCKED:
1067f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_ioc_sync_leave(ioc);
1068f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		writel(1, ioc->ioc_regs.ioc_sem_reg);
1069f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled);
1070f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1071f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
10725a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOCPF_E_SEM_ERROR:
10735a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail);
10745a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_send_event(ioc, IOC_E_HWFAILED);
10755a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
10765a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
1077f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_FAIL:
1078f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1079f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1080f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	default:
1081f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_sm_fault(ioc, event);
1082f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	}
1083f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati}
1084f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
10855fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC disable completion entry.
10877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabled_entry(struct bfa_iocpf_s *iocpf)
10907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
10918b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	bfa_ioc_mbox_flush(iocpf->ioc);
1092f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_fsm_send_event(iocpf->ioc, IOC_E_DISABLED);
10937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_disabled(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
1099a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
11017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1103a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_ENABLE:
1104a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_semwait);
11057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
11067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1107a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_STOP:
11087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_firmware_unlock(ioc);
1109a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset);
11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
11117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
11147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1118f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_initfail_sync_entry(struct bfa_iocpf_s *iocpf)
1119f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{
11205a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_ioc_debug_save_ftrc(iocpf->ioc);
1121f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	bfa_ioc_hw_sem_get(iocpf->ioc);
1122f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati}
1123f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
11248f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/*
1125f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Hardware initialization failed.
1126f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */
1127f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void
1128f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_initfail_sync(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
1129f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{
1130f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
1131f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1132f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	bfa_trc(ioc, event);
1133f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1134f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	switch (event) {
1135f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_SEMLOCKED:
1136f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_ioc_notify_fail(ioc);
1137775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_ioc_sync_leave(ioc);
1138775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate);
1139775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		writel(1, ioc->ioc_regs.ioc_sem_reg);
1140775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_initfail);
1141f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1142f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
11435a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOCPF_E_SEM_ERROR:
11445a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail);
11455a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_send_event(ioc, IOC_E_HWFAILED);
11465a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
11475a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
1148f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_DISABLE:
1149f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_sem_timer_stop(ioc);
1150f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync);
1151f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1152f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1153f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_STOP:
1154f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_sem_timer_stop(ioc);
1155f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_ioc_firmware_unlock(ioc);
1156f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset);
1157f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1158f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1159f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_FAIL:
1160f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1161f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1162f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	default:
1163f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_sm_fault(ioc, event);
1164f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	}
1165f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati}
1166f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1167f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void
1168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_initfail_entry(struct bfa_iocpf_s *iocpf)
11697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11705a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_trc(iocpf->ioc, 0);
11717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
11747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Hardware initialization failed.
11757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
11767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_initfail(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
11787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
1180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
1185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled);
11867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
11877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_STOP:
11897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_firmware_unlock(ioc);
1190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_reset);
11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
11927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
11947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
11957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
11967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1199f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_fail_sync_entry(struct bfa_iocpf_s *iocpf)
12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
12018f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang	/*
12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Mark IOC as failed in hardware and stop firmware.
12037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
1204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_lpu_stop(iocpf->ioc);
12057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12068f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang	/*
12077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Flush any queued up mailbox requests.
12087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
12098b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	bfa_ioc_mbox_flush(iocpf->ioc);
12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1211f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	bfa_ioc_hw_sem_get(iocpf->ioc);
1212f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati}
1213f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1214f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void
1215f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_fail_sync(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
1216f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{
1217f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
1218f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1219f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	bfa_trc(ioc, event);
1220f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1221f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	switch (event) {
1222f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_SEMLOCKED:
1223f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_ioc_sync_ack(ioc);
1224f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_ioc_notify_fail(ioc);
1225f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		if (!iocpf->auto_recover) {
1226f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			bfa_ioc_sync_leave(ioc);
1227775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati			writel(BFI_IOC_FAIL, ioc->ioc_regs.ioc_fwstate);
1228f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			writel(1, ioc->ioc_regs.ioc_sem_reg);
1229f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail);
1230f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		} else {
1231f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			if (bfa_ioc_sync_complete(ioc))
1232f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				bfa_fsm_set_state(iocpf, bfa_iocpf_sm_hwinit);
1233f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			else {
1234f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				writel(1, ioc->ioc_regs.ioc_sem_reg);
1235f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati				bfa_fsm_set_state(iocpf, bfa_iocpf_sm_semwait);
1236f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati			}
1237f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		}
1238f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1239f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
12405a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	case IOCPF_E_SEM_ERROR:
12415a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_fail);
12425a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_send_event(ioc, IOC_E_HWFAILED);
12435a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		break;
12445a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati
1245f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_DISABLE:
1246f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_sem_timer_stop(ioc);
1247f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabling_sync);
1248f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1249f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1250f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	case IOCPF_E_FAIL:
1251f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		break;
1252f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1253f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	default:
1254f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati		bfa_sm_fault(ioc, event);
1255f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	}
1256f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati}
1257f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
1258f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatistatic void
1259f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_iocpf_sm_fail_entry(struct bfa_iocpf_s *iocpf)
1260f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{
12615a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_trc(iocpf->ioc, 0);
12627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
12637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC is in failed state.
12667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sm_fail(struct bfa_iocpf_s *iocpf, enum iocpf_event event)
12697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = iocpf->ioc;
1271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, event);
12737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (event) {
1275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case IOCPF_E_DISABLE:
1276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_set_state(iocpf, bfa_iocpf_sm_disabled);
12777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
12787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
12807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_sm_fault(ioc, event);
12817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
12827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
12837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1285df0f1933eb5454a5c481311837076056557467adMaggie Zhang *  BFA IOC private functions
12867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1288d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati/*
1289d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati * Notify common modules registered for notification.
1290d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati */
12917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
1292d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatibfa_ioc_event_notify(struct bfa_ioc_s *ioc, enum bfa_ioc_event_e event)
12937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1294d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	struct bfa_ioc_notify_s	*notify;
1295d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	struct list_head	*qe;
12967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1297d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	list_for_each(qe, &ioc->notify_q) {
1298d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		notify = (struct bfa_ioc_notify_s *)qe;
1299d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		notify->cbfn(notify->cbarg, event);
13007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
13017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1303d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatistatic void
1304d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipatibfa_ioc_disable_comp(struct bfa_ioc_s *ioc)
1305d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati{
1306d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	ioc->cbfn->disable_cbfn(ioc->bfa);
1307d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	bfa_ioc_event_notify(ioc, BFA_IOC_E_DISABLED);
1308d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati}
1309d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati
13100a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t
13115344026065f79b102fcc44bc6332f856a111962aJing Huangbfa_ioc_sem_get(void __iomem *sem_reg)
13127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
13130a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	u32 r32;
13140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	int cnt = 0;
1315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_SEM_SPINCNT	3000
13167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13175344026065f79b102fcc44bc6332f856a111962aJing Huang	r32 = readl(sem_reg);
13180a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
1319111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	while ((r32 & 1) && (cnt < BFA_SEM_SPINCNT)) {
13207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		cnt++;
13216a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang		udelay(2);
13225344026065f79b102fcc44bc6332f856a111962aJing Huang		r32 = readl(sem_reg);
13230a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	}
13240a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
1325111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (!(r32 & 1))
13260a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		return BFA_TRUE;
13270a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
13280a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	return BFA_FALSE;
13297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
13327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hw_sem_get(struct bfa_ioc_s *ioc)
13337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	r32;
13357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13365fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
13377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * First read to the semaphore register will return 0, subsequent reads
13380a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 * will return 1. Semaphore is released by writing 1 to the register
13397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
13405344026065f79b102fcc44bc6332f856a111962aJing Huang	r32 = readl(ioc->ioc_regs.ioc_sem_reg);
13415a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	if (r32 == ~0) {
13425a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		WARN_ON(r32 == ~0);
13435a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEM_ERROR);
13445a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati		return;
13455a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	}
1346111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (!(r32 & 1)) {
1347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_SEMLOCKED);
13487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
13497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
13507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_sem_timer_start(ioc);
13527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
13557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize LPU local memory (aka secondary memory / SRAM)
13567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
13577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
13587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lmem_init(struct bfa_ioc_s *ioc)
13597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1360a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	pss_ctl;
1361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
13627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define PSS_LMEM_INIT_TIME  10000
13637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13645344026065f79b102fcc44bc6332f856a111962aJing Huang	pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
13657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl &= ~__PSS_LMEM_RESET;
13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl |= __PSS_LMEM_INIT_EN;
1367a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1368a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
1369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * i2c workaround 12.5khz clock
1370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	pss_ctl |= __PSS_I2C_CLK_DIV(3UL);
13725344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
13737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13745fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
13757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * wait for memory initialization to be complete
13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
13777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	i = 0;
13787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	do {
13795344026065f79b102fcc44bc6332f856a111962aJing Huang		pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		i++;
13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} while (!(pss_ctl & __PSS_LMEM_INIT_DONE) && (i < PSS_LMEM_INIT_TIME));
13827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13835fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If memory initialization is not successful, IOC timeout will catch
13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * such failures.
13867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
1387d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!(pss_ctl & __PSS_LMEM_INIT_DONE));
13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, pss_ctl);
13897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl &= ~(__PSS_LMEM_INIT_DONE | __PSS_LMEM_INIT_EN);
13915344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
13957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_start(struct bfa_ioc_s *ioc)
13967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	pss_ctl;
13987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
14007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Take processor out of reset.
14017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
14025344026065f79b102fcc44bc6332f856a111962aJing Huang	pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
14037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl &= ~__PSS_LPU0_RESET;
14047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14055344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
14067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
14097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_lpu_stop(struct bfa_ioc_s *ioc)
14107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	pss_ctl;
14127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
14147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Put processors in reset.
14157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
14165344026065f79b102fcc44bc6332f856a111962aJing Huang	pss_ctl = readl(ioc->ioc_regs.pss_ctl_reg);
14177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	pss_ctl |= (__PSS_LPU0_RESET | __PSS_LPU1_RESET);
14187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14195344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pss_ctl, ioc->ioc_regs.pss_ctl_reg);
14207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14225fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
14237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Get driver and firmware versions.
14247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipativoid
14267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_get(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr)
14277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1428a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	pgnum, pgoff;
1429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	loff = 0;
1430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
1431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	*fwsig = (u32 *) fwhdr;
14327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1433f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
1434f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	pgoff = PSS_SMEM_PGOFF(loff);
14355344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pgnum, ioc->ioc_regs.host_page_num_fn);
14367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < (sizeof(struct bfi_ioc_image_hdr_s) / sizeof(u32));
14387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	     i++) {
1439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		fwsig[i] =
1440a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_mem_read(ioc->ioc_regs.smem_page_start, loff);
14417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff += sizeof(u32);
14427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
14437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14455fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
14467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Returns TRUE if same.
14477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14480a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipatibfa_boolean_t
14497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fwver_cmp(struct bfa_ioc_s *ioc, struct bfi_ioc_image_hdr_s *fwhdr)
14507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_image_hdr_s *drv_fwhdr;
1452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int i;
14537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1454293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang	drv_fwhdr = (struct bfi_ioc_image_hdr_s *)
1455111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
14567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < BFI_IOC_MD5SUM_SZ; i++) {
14587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (fwhdr->md5sum[i] != drv_fwhdr->md5sum[i]) {
14597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(ioc, i);
14607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(ioc, fwhdr->md5sum[i]);
14617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			bfa_trc(ioc, drv_fwhdr->md5sum[i]);
14627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			return BFA_FALSE;
14637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
14647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
14657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, fwhdr->md5sum[0]);
14677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_TRUE;
14687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
14717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return true if current running version is valid. Firmware signature and
14727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * execution context (driver/bios) must match.
14737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
1474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_boolean_t
1475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fwver_valid(struct bfa_ioc_s *ioc, u32 boot_env)
14767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_image_hdr_s fwhdr, *drv_fwhdr;
14787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_fwver_get(ioc, &fwhdr);
1480293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang	drv_fwhdr = (struct bfi_ioc_image_hdr_s *)
1481111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), 0);
14827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (fwhdr.signature != drv_fwhdr->signature) {
14847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, fwhdr.signature);
14857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, drv_fwhdr->signature);
14867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
14877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
14887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1489111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (swab32(fwhdr.bootenv) != boot_env) {
1490111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_trc(ioc, fwhdr.bootenv);
1491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(ioc, boot_env);
14927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
14937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
14947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return bfa_ioc_fwver_cmp(ioc, &fwhdr);
14967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14985fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
14997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Conditionally flush any pending message from firmware at start.
15007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
15017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
15027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgflush(struct bfa_ioc_s *ioc)
15037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	r32;
15057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15065344026065f79b102fcc44bc6332f856a111962aJing Huang	r32 = readl(ioc->ioc_regs.lpu_mbox_cmd);
15077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (r32)
15085344026065f79b102fcc44bc6332f856a111962aJing Huang		writel(1, ioc->ioc_regs.lpu_mbox_cmd);
15097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
15127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hwinit(struct bfa_ioc_s *ioc, bfa_boolean_t force)
15137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	enum bfi_ioc_state ioc_fwstate;
1515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_boolean_t fwvalid;
1516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 boot_type;
1517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 boot_env;
15187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15195344026065f79b102fcc44bc6332f856a111962aJing Huang	ioc_fwstate = readl(ioc->ioc_regs.ioc_fwstate);
15207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (force)
15227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ioc_fwstate = BFI_IOC_UNINIT;
15237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, ioc_fwstate);
15257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1526111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	boot_type = BFI_FWBOOT_TYPE_NORMAL;
1527111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	boot_env = BFI_FWBOOT_ENV_OS;
1528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
15295fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
15307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * check if firmware is valid
15317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	fwvalid = (ioc_fwstate == BFI_IOC_UNINIT) ?
1533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		BFA_FALSE : bfa_ioc_fwver_valid(ioc, boot_env);
15347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!fwvalid) {
1536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_boot(ioc, boot_type, boot_env);
15378b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		bfa_ioc_poll_fwinit(ioc);
15387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
15397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
15427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If hardware initialization is in progress (initialized by other IOC),
15437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * just wait for an initialization completion interrupt.
15447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc_fwstate == BFI_IOC_INITING) {
1546775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_ioc_poll_fwinit(ioc);
15477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
15487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15505fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
15517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If IOC function is disabled and firmware version is same,
15527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * just re-enable IOC.
155307b2838669dc7704e02e079b1a96602656893d78Jing Huang	 *
155407b2838669dc7704e02e079b1a96602656893d78Jing Huang	 * If option rom, IOC must not be in operational state. With
155507b2838669dc7704e02e079b1a96602656893d78Jing Huang	 * convergence, IOC will be in operational state when 2nd driver
155607b2838669dc7704e02e079b1a96602656893d78Jing Huang	 * is loaded.
15577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15588f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang	if (ioc_fwstate == BFI_IOC_DISABLED || ioc_fwstate == BFI_IOC_OP) {
15597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15605fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
15617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * When using MSI-X any pending firmware ready event should
15627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * be flushed. Otherwise MSI-X interrupts are not delivered.
15637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
15647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_msgflush(ioc);
1565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY);
15667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
15677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15695fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
15707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize the h/w for any other states.
15717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
1572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_boot(ioc, boot_type, boot_env);
15738b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	bfa_ioc_poll_fwinit(ioc);
15747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
15777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_timeout(void *ioc_arg)
15787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s  *ioc = (struct bfa_ioc_s *) ioc_arg;
15807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, 0);
15827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_TIMEOUT);
15837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_send(struct bfa_ioc_s *ioc, void *ioc_msg, int len)
15877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 *msgp = (u32 *) ioc_msg;
1589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 i;
15907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, msgp[0]);
15927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, len);
15937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1594d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(len > BFI_IOC_MSGLEN_MAX);
15957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
15977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * first write msg to mailbox registers
15987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
15997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < len / sizeof(u32); i++)
16005344026065f79b102fcc44bc6332f856a111962aJing Huang		writel(cpu_to_le32(msgp[i]),
16015344026065f79b102fcc44bc6332f856a111962aJing Huang			ioc->ioc_regs.hfn_mbox + i * sizeof(u32));
16027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (; i < BFI_IOC_MSGLEN_MAX / sizeof(u32); i++)
16045344026065f79b102fcc44bc6332f856a111962aJing Huang		writel(0, ioc->ioc_regs.hfn_mbox + i * sizeof(u32));
16057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	/*
16077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * write 1 to mailbox CMD to trigger LPU event
16087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
16095344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(1, ioc->ioc_regs.hfn_mbox_cmd);
16105344026065f79b102fcc44bc6332f856a111962aJing Huang	(void) readl(ioc->ioc_regs.hfn_mbox_cmd);
16117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
16147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_enable(struct bfa_ioc_s *ioc)
16157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_ctrl_req_s enable_req;
1617f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang	struct timeval tv;
16187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ,
16207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(ioc));
1621d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	enable_req.clscode = cpu_to_be16(ioc->clscode);
1622f16a17507b09e10e0cccc4d675ccbfe030d51ef1Maggie Zhang	do_gettimeofday(&tv);
1623ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	enable_req.tv_sec = be32_to_cpu(tv.tv_sec);
16247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req_s));
16257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
16287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_disable(struct bfa_ioc_s *ioc)
16297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	struct bfi_ioc_ctrl_req_s disable_req;
16317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(disable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_DISABLE_REQ,
16337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(ioc));
16347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req_s));
16357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
16387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_send_getattr(struct bfa_ioc_s *ioc)
16397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioc_getattr_req_s	attr_req;
16417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfi_h2i_set(attr_req.mh, BFI_MC_IOC, BFI_IOC_H2I_GETATTR_REQ,
16437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_portid(ioc));
16447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_dma_be_addr_set(attr_req.attr_addr, ioc->attr_dma.pa);
16457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, &attr_req, sizeof(attr_req));
16467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
16497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_check(void *cbarg)
16507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16510a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	struct bfa_ioc_s  *ioc = cbarg;
1652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	hb_count;
16537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16545344026065f79b102fcc44bc6332f856a111962aJing Huang	hb_count = readl(ioc->ioc_regs.heartbeat);
16557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->hb_count == hb_count) {
16567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_recover(ioc);
16577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
16580a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	} else {
16590a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		ioc->hb_count = hb_count;
16607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
16617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_poll(ioc);
1663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_hb_timer_start(ioc);
16647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
16677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_hb_monitor(struct bfa_ioc_s *ioc)
16687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16695344026065f79b102fcc44bc6332f856a111962aJing Huang	ioc->hb_count = readl(ioc->ioc_regs.heartbeat);
1670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_hb_timer_start(ioc);
16717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *	Initiate a full firmware download.
16757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
16767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
16777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_download_fw(struct bfa_ioc_s *ioc, u32 boot_type,
1678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		    u32 boot_env)
16797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 *fwimg;
1681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 pgnum, pgoff;
1682a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 loff = 0;
1683a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 chunkno = 0;
1684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 i;
1685111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	u32 asicmode;
16867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1687111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_trc(ioc, bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)));
1688111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc), chunkno);
16897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1690f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
1691f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	pgoff = PSS_SMEM_PGOFF(loff);
16927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16935344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pgnum, ioc->ioc_regs.host_page_num_fn);
16947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1695111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	for (i = 0; i < bfa_cb_image_get_size(bfa_ioc_asic_gen(ioc)); i++) {
16967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16970a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		if (BFA_IOC_FLASH_CHUNK_NO(i) != chunkno) {
16980a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			chunkno = BFA_IOC_FLASH_CHUNK_NO(i);
1699111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati			fwimg = bfa_cb_image_get_chunk(bfa_ioc_asic_gen(ioc),
17000a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati					BFA_IOC_FLASH_CHUNK_ADDR(chunkno));
17017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
17027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
17035fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
17047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * write smem
17057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
17067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_mem_write(ioc->ioc_regs.smem_page_start, loff,
17070a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati			      fwimg[BFA_IOC_FLASH_OFFSET_IN_CHUNK(i)]);
17087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
17097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff += sizeof(u32);
17107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
17115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
17127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 * handle page offset wrap around
17137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		 */
17147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		loff = PSS_SMEM_PGOFF(loff);
17157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		if (loff == 0) {
17167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			pgnum++;
17175344026065f79b102fcc44bc6332f856a111962aJing Huang			writel(pgnum, ioc->ioc_regs.host_page_num_fn);
17187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		}
17197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
17207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1721f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0),
1722f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang			ioc->ioc_regs.host_page_num_fn);
172313cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati
172413cc20c5e764e6ef8d57f33980ab8c386c25fb4dKrishna Gudipati	/*
1725111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 * Set boot type and device mode at the end.
1726111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 */
1727111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	asicmode = BFI_FWBOOT_DEVMODE(ioc->asic_gen, ioc->asic_mode,
1728111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati				ioc->port0_mode, ioc->port1_mode);
1729111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_DEVMODE_OFF,
1730111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati			swab32(asicmode));
1731111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_TYPE_OFF,
17325344026065f79b102fcc44bc6332f856a111962aJing Huang			swab32(boot_type));
1733111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_mem_write(ioc->ioc_regs.smem_page_start, BFI_FWBOOT_ENV_OFF,
17345344026065f79b102fcc44bc6332f856a111962aJing Huang			swab32(boot_env));
1735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1737a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
17385fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Update BFA configuration from firmware configuration.
1740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_getattr_reply(struct bfa_ioc_s *ioc)
1743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioc_attr_s	*attr = ioc->attr;
1745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1746ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	attr->adapter_prop  = be32_to_cpu(attr->adapter_prop);
1747ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	attr->card_type     = be32_to_cpu(attr->card_type);
1748ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	attr->maxfrsize	    = be16_to_cpu(attr->maxfrsize);
17495a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	ioc->fcmode	= (attr->port_mode == BFI_PORT_MODE_FC);
1750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_fsm_send_event(ioc, IOC_E_FWRSP_GETATTR);
1752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
17545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Attach time initialization of mbox logic.
1756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_mbox_attach(struct bfa_ioc_s *ioc)
1759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_mbox_mod_s	*mod = &ioc->mbox_mod;
1761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int	mc;
1762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&mod->cmd_q);
1764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (mc = 0; mc < BFI_MC_MAX; mc++) {
1765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		mod->mbhdlr[mc].cbfn = NULL;
1766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		mod->mbhdlr[mc].cbarg = ioc->bfa;
1767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
17705fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Mbox poll timer -- restarts any pending mailbox requests.
1772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_mbox_poll(struct bfa_ioc_s *ioc)
1775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_mbox_mod_s	*mod = &ioc->mbox_mod;
1777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_mbox_cmd_s		*cmd;
1778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32			stat;
1779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
17805fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * If no command pending, do nothing
1782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (list_empty(&mod->cmd_q))
1784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
1785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
17865fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * If previous command is not yet fetched by firmware, do nothing
1788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
17895344026065f79b102fcc44bc6332f856a111962aJing Huang	stat = readl(ioc->ioc_regs.hfn_mbox_cmd);
1790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (stat)
1791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
1792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
17935fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Enqueue command to firmware.
1795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_q_deq(&mod->cmd_q, &cmd);
1797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
1798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
18005fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Cleanup any pending requests.
1802a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
18048b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipatibfa_ioc_mbox_flush(struct bfa_ioc_s *ioc)
1805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_mbox_mod_s	*mod = &ioc->mbox_mod;
1807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_mbox_cmd_s		*cmd;
1808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	while (!list_empty(&mod->cmd_q))
1810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_q_deq(&mod->cmd_q, &cmd);
1811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
18135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Read data from SMEM to host through PCI memmap
1815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *
1816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	ioc	memory for IOC
1817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	tbuf	app memory to store data from smem
1818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	soff	smem offset
1819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	sz	size of smem in bytes
1820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_status_t
1822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_smem_read(struct bfa_ioc_s *ioc, void *tbuf, u32 soff, u32 sz)
1823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
182450444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie	u32 pgnum, loff;
182550444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie	__be32 r32;
1826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int i, len;
1827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 *buf = tbuf;
1828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1829f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, soff);
1830f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	loff = PSS_SMEM_PGOFF(soff);
1831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, pgnum);
1832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, loff);
1833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, sz);
1834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
1836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *  Hold semaphore to serialize pll init and fwtrc.
1837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg)) {
1839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(ioc, 0);
1840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_FAILED;
1841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
18435344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	len = sz/sizeof(u32);
1846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, len);
1847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < len; i++) {
1848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		r32 = bfa_mem_read(ioc->ioc_regs.smem_page_start, loff);
1849ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang		buf[i] = be32_to_cpu(r32);
1850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		loff += sizeof(u32);
1851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
18525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
1853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * handle page offset wrap around
1854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		loff = PSS_SMEM_PGOFF(loff);
1856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (loff == 0) {
1857a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			pgnum++;
18585344026065f79b102fcc44bc6332f856a111962aJing Huang			writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1859a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1860a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1861f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0),
1862f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang			ioc->ioc_regs.host_page_num_fn);
1863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
1864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *  release semaphore.
1865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
18665a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	readl(ioc->ioc_regs.ioc_init_sem_reg);
1867f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	writel(1, ioc->ioc_regs.ioc_init_sem_reg);
1868a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, pgnum);
1870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_STATUS_OK;
1871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
18735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1874a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Clear SMEM data from host through PCI memmap
1875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *
1876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	ioc	memory for IOC
1877a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	soff	smem offset
1878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	sz	size of smem in bytes
1879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic bfa_status_t
1881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_smem_clr(struct bfa_ioc_s *ioc, u32 soff, u32 sz)
1882a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int i, len;
1884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 pgnum, loff;
1885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1886f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, soff);
1887f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	loff = PSS_SMEM_PGOFF(soff);
1888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, pgnum);
1889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, loff);
1890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, sz);
1891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
1893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *  Hold semaphore to serialize pll init and fwtrc.
1894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (BFA_FALSE == bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg)) {
1896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(ioc, 0);
1897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_FAILED;
1898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
19005344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	len = sz/sizeof(u32); /* len in words */
1903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, len);
1904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < len; i++) {
1905a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_mem_write(ioc->ioc_regs.smem_page_start, loff, 0);
1906a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		loff += sizeof(u32);
1907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
19085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
1909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * handle page offset wrap around
1910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
1911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		loff = PSS_SMEM_PGOFF(loff);
1912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (loff == 0) {
1913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			pgnum++;
19145344026065f79b102fcc44bc6332f856a111962aJing Huang			writel(pgnum, ioc->ioc_regs.host_page_num_fn);
1915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
1916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1917f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	writel(PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, 0),
1918f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang			ioc->ioc_regs.host_page_num_fn);
1919a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
1921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *  release semaphore.
1922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
19235a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	readl(ioc->ioc_regs.ioc_init_sem_reg);
1924f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	writel(1, ioc->ioc_regs.ioc_init_sem_reg);
1925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, pgnum);
1926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_STATUS_OK;
19277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
19287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
19304e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_fail_notify(struct bfa_ioc_s *ioc)
19314e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati{
19324e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
19334e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati
19348f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang	/*
19354e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	 * Notify driver and common modules registered for notification.
19364e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	 */
19374e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	ioc->cbfn->hbfail_cbfn(ioc->bfa);
1938d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	bfa_ioc_event_notify(ioc, BFA_IOC_E_FAILED);
19394e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati
19404e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	bfa_ioc_debug_save_ftrc(ioc);
19414e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati
19424e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	BFA_LOG(KERN_CRIT, bfad, bfa_log_level,
19434e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		"Heart Beat of IOC has failed\n");
19447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfa_ioc_aen_post(ioc, BFA_IOC_AEN_HBFAIL);
19454e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati
19464e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati}
19474e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati
19484e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatistatic void
1949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_pf_fwmismatch(struct bfa_ioc_s *ioc)
19507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
19525fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
1953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Provide enable completion callback.
19547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
1955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->cbfn->enable_cbfn(ioc->bfa, BFA_STATUS_IOC_FAILURE);
19568816624222b12e5d7e291e9d1973fc42b994eb6bJing Huang	BFA_LOG(KERN_WARNING, bfad, bfa_log_level,
1957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		"Running firmware version is incompatible "
1958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		"with the driver version\n");
19597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfa_ioc_aen_post(ioc, BFA_IOC_AEN_FWMISMATCH);
1960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
19617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t
1963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_pll_init(struct bfa_ioc_s *ioc)
19647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
1967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *  Hold semaphore so that nobody can access the chip during init.
1968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
1969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_sem_get(ioc->ioc_regs.ioc_init_sem_reg);
19707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_pll_init_asic(ioc);
1972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->pllinit = BFA_TRUE;
19748919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati
19758919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	/*
19768919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 * Initialize LMEM
19778919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	 */
19788919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati	bfa_ioc_lmem_init(ioc);
19798919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipati
1980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
1981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *  release semaphore.
1982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
19835a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	readl(ioc->ioc_regs.ioc_init_sem_reg);
1984f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	writel(1, ioc->ioc_regs.ioc_init_sem_reg);
1985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_STATUS_OK;
1987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
19887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
19907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Interface used by diag module to do firmware boot with memory test
19917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * as the entry vector.
19927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
19937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
1994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_boot(struct bfa_ioc_s *ioc, u32 boot_type, u32 boot_env)
19957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
19967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_boots);
19977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
19987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (bfa_ioc_pll_init(ioc) != BFA_STATUS_OK)
19997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
20007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20015fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
20027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * Initialize IOC state of all functions on a chip reset.
20037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
2004111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (boot_type == BFI_FWBOOT_TYPE_MEMTEST) {
2005111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		writel(BFI_IOC_MEMTEST, ioc->ioc_regs.ioc_fwstate);
2006111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		writel(BFI_IOC_MEMTEST, ioc->ioc_regs.alt_ioc_fwstate);
20077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	} else {
2008111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		writel(BFI_IOC_INITING, ioc->ioc_regs.ioc_fwstate);
2009111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		writel(BFI_IOC_INITING, ioc->ioc_regs.alt_ioc_fwstate);
20107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
20117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
201207b2838669dc7704e02e079b1a96602656893d78Jing Huang	bfa_ioc_msgflush(ioc);
2013a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_download_fw(ioc, boot_type, boot_env);
20147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_lpu_start(ioc);
20157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
20187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Enable/disable IOC failure auto recovery.
20197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
20207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
20217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_auto_recover(bfa_boolean_t auto_recover)
20227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
20232f9b8857a914b71ba1b84fb23a0a20a87de41c91Krishna Gudipati	bfa_auto_recover = auto_recover;
20247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2027a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
20287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
20297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_operational(struct bfa_ioc_s *ioc)
20307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
20317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_op);
20327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2034a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t
2035a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_is_initialized(struct bfa_ioc_s *ioc)
2036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
20375344026065f79b102fcc44bc6332f856a111962aJing Huang	u32 r32 = readl(ioc->ioc_regs.ioc_fwstate);
2038a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2039a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return ((r32 != BFI_IOC_UNINIT) &&
2040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		(r32 != BFI_IOC_INITING) &&
2041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		(r32 != BFI_IOC_MEMTEST));
2042a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2044111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_boolean_t
20457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_msgget(struct bfa_ioc_s *ioc, void *mbmsg)
20467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
204750444a340028119ce5ba45d60b4cf44e3e6e1b32Maggie	__be32	*msgp = mbmsg;
2048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	r32;
2049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
20507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2051111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	r32 = readl(ioc->ioc_regs.lpu_mbox_cmd);
2052111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if ((r32 & 1) == 0)
2053111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		return BFA_FALSE;
2054111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
20555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
20567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * read the MBOX msg
20577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
20587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < (sizeof(union bfi_ioc_i2h_msg_u) / sizeof(u32));
20597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	     i++) {
20605344026065f79b102fcc44bc6332f856a111962aJing Huang		r32 = readl(ioc->ioc_regs.lpu_mbox +
20617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang				   i * sizeof(u32));
2062ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang		msgp[i] = cpu_to_be32(r32);
20637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
20647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
20667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * turn off mailbox interrupt by clearing mailbox status
20677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
20685344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(1, ioc->ioc_regs.lpu_mbox_cmd);
20695344026065f79b102fcc44bc6332f856a111962aJing Huang	readl(ioc->ioc_regs.lpu_mbox_cmd);
2070111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2071111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	return BFA_TRUE;
20727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
20737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
20757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_isr(struct bfa_ioc_s *ioc, struct bfi_mbmsg_s *m)
20767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	union bfi_ioc_i2h_msg_u	*msg;
2078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocpf_s *iocpf = &ioc->iocpf;
20797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	msg = (union bfi_ioc_i2h_msg_u *) m;
20817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_isrs);
20837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	switch (msg->mh.msg_id) {
20857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_HBEAT:
20867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
20877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_ENABLE_REPLY:
20891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->port_mode = ioc->port_mode_cfg =
20901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				(enum bfa_mode_s)msg->fw_event.port_mode;
20911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->ad_cap_bm = msg->fw_event.cap_bm;
2092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_send_event(iocpf, IOCPF_E_FWRSP_ENABLE);
20937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
20947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_DISABLE_REPLY:
2096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_send_event(iocpf, IOCPF_E_FWRSP_DISABLE);
20977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
20987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
20997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	case BFI_IOC_I2H_GETATTR_REPLY:
21007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_ioc_getattr_reply(ioc);
21017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		break;
21027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
21037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	default:
21047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_trc(ioc, msg->mh.msg_id);
2105d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
21067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
21077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
21087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
21095fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
21107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * IOC attach time initialization and setup.
21117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
21127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	ioc	memory for IOC
21137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	bfa	driver instance structure
21147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
21157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
21167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_attach(struct bfa_ioc_s *ioc, void *bfa, struct bfa_ioc_cbfn_s *cbfn,
2117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	       struct bfa_timer_mod_s *timer_mod)
2118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->bfa	= bfa;
2120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->cbfn	= cbfn;
2121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->timer_mod	= timer_mod;
2122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->fcmode	= BFA_FALSE;
2123a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->pllinit	= BFA_FALSE;
21247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->dbg_fwsave_once = BFA_TRUE;
2125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->iocpf.ioc	= ioc;
21267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
21277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_attach(ioc);
2128d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	INIT_LIST_HEAD(&ioc->notify_q);
21297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_fsm_set_state(ioc, bfa_ioc_sm_uninit);
2131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_fsm_send_event(ioc, IOC_E_RESET);
21327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
21337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
21345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
21357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Driver detach time IOC cleanup.
21367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
21377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
21387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_detach(struct bfa_ioc_s *ioc)
21397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
21407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_DETACH);
21413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	INIT_LIST_HEAD(&ioc->notify_q);
21427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
21437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
21445fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
21457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Setup IOC PCI properties.
21467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
21477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	pcidev	PCI device information for this IOC
21487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
21497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
21507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_pci_init(struct bfa_ioc_s *ioc, struct bfa_pcidev_s *pcidev,
2151d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati		enum bfi_pcifn_class clscode)
21527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2153d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	ioc->clscode	= clscode;
2154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->pcidev	= *pcidev;
2155111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2156111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	/*
2157111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 * Initialize IOC and device personality
2158111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 */
2159111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_FC;
2160111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	ioc->asic_mode  = BFI_ASIC_MODE_FC;
2161111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2162111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	switch (pcidev->device_id) {
2163111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	case BFA_PCI_DEVICE_ID_FC_8G1P:
2164111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	case BFA_PCI_DEVICE_ID_FC_8G2P:
2165111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		ioc->asic_gen = BFI_ASIC_GEN_CB;
21661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->fcmode = BFA_TRUE;
21671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA;
21681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->ad_cap_bm = BFA_CM_HBA;
2169111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		break;
2170111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2171111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	case BFA_PCI_DEVICE_ID_CT:
2172111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		ioc->asic_gen = BFI_ASIC_GEN_CT;
2173111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
2174111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		ioc->asic_mode  = BFI_ASIC_MODE_ETH;
21751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_CNA;
21761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->ad_cap_bm = BFA_CM_CNA;
2177111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		break;
2178111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2179111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	case BFA_PCI_DEVICE_ID_CT_FC:
2180111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		ioc->asic_gen = BFI_ASIC_GEN_CT;
21811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->fcmode = BFA_TRUE;
21821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA;
21831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ioc->ad_cap_bm = BFA_CM_HBA;
2184111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		break;
2185111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2186111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	case BFA_PCI_DEVICE_ID_CT2:
2187111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		ioc->asic_gen = BFI_ASIC_GEN_CT2;
21881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		if (clscode == BFI_PCIFN_CLASS_FC &&
21891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		    pcidev->ssid == BFA_PCI_CT2_SSID_FC) {
2190111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati			ioc->asic_mode  = BFI_ASIC_MODE_FC16;
21911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			ioc->fcmode = BFA_TRUE;
21921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			ioc->port_mode = ioc->port_mode_cfg = BFA_MODE_HBA;
21931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			ioc->ad_cap_bm = BFA_CM_HBA;
21941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		} else {
2195111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati			ioc->port0_mode = ioc->port1_mode = BFI_PORT_MODE_ETH;
21961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			ioc->asic_mode  = BFI_ASIC_MODE_ETH;
21971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			if (pcidev->ssid == BFA_PCI_CT2_SSID_FCoE) {
21981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				ioc->port_mode =
21991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				ioc->port_mode_cfg = BFA_MODE_CNA;
22001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				ioc->ad_cap_bm = BFA_CM_CNA;
22011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			} else {
22021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				ioc->port_mode =
22031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				ioc->port_mode_cfg = BFA_MODE_NIC;
22041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				ioc->ad_cap_bm = BFA_CM_NIC;
22051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			}
2206111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		}
2207111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		break;
2208111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2209111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	default:
2210111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		WARN_ON(1);
2211111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	}
22127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22135fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
22140a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 * Set asic specific interfaces. See bfa_ioc_cb.c and bfa_ioc_ct.c
22150a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 */
2216111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (ioc->asic_gen == BFI_ASIC_GEN_CB)
22170a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati		bfa_ioc_set_cb_hwif(ioc);
2218111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	else if (ioc->asic_gen == BFI_ASIC_GEN_CT)
2219111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_ioc_set_ct_hwif(ioc);
2220111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	else {
2221111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		WARN_ON(ioc->asic_gen != BFI_ASIC_GEN_CT2);
2222111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_ioc_set_ct2_hwif(ioc);
2223111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_ioc_ct2_poweron(ioc);
2224111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	}
22250a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
22267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_map_port(ioc);
22277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_reg_init(ioc);
22287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
22297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
22317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize IOC dma memory
22327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
22337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	dm_kva	kernel virtual address of IOC dma memory
22347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	dm_pa	physical address of IOC dma memory
22357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
22367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
2237a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_mem_claim(struct bfa_ioc_s *ioc,  u8 *dm_kva, u64 dm_pa)
22387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
22395fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
22407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * dma memory for firmware attribute
22417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
22427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->attr_dma.kva = dm_kva;
22437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->attr_dma.pa = dm_pa;
2244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->attr = (struct bfi_ioc_attr_s *) dm_kva;
22457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
22467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
22487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_enable(struct bfa_ioc_s *ioc)
22497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
22507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_enables);
22517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc->dbg_fwsave_once = BFA_TRUE;
22527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_ENABLE);
22547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
22557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
22577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_disable(struct bfa_ioc_s *ioc)
22587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
22597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_disables);
22607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_DISABLE);
22617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
22627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
22657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Initialize memory for saving firmware trace. Driver must initialize
22667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * trace memory before call bfa_ioc_enable().
22677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
22687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
22697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_memclaim(struct bfa_ioc_s *ioc, void *dbg_fwsave)
22707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->dbg_fwsave	    = dbg_fwsave;
2272f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	ioc->dbg_fwsave_len = (ioc->iocpf.auto_recover) ? BFA_DBG_FWTRC_LEN : 0;
22737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
22747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
22767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler functions
22777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
22787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	ioc		IOC instance
22797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	mcfuncs		message class handler functions
22807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
22817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
22827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_register(struct bfa_ioc_s *ioc, bfa_ioc_mbox_mcfunc_t *mcfuncs)
22837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_mbox_mod_s	*mod = &ioc->mbox_mod;
2285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int				mc;
22867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (mc = 0; mc < BFI_MC_MAX; mc++)
22887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		mod->mbhdlr[mc].cbfn = mcfuncs[mc];
22897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
22907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22915fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
22927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Register mailbox message handler function, to be called by common modules
22937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
22947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
22957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_regisr(struct bfa_ioc_s *ioc, enum bfi_mclass mc,
22967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		    bfa_ioc_mbox_mcfunc_t cbfn, void *cbarg)
22977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_mbox_mod_s	*mod = &ioc->mbox_mod;
22997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	mod->mbhdlr[mc].cbfn	= cbfn;
2301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	mod->mbhdlr[mc].cbarg	= cbarg;
23027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
23037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23045fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
23057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Queue a mailbox command request to firmware. Waits if mailbox is busy.
23067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Responsibility of caller to serialize
23077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
23087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	ioc	IOC instance
23097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[i]	cmd	Mailbox command
23107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
23117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
23127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_queue(struct bfa_ioc_s *ioc, struct bfa_mbox_cmd_s *cmd)
23137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_mbox_mod_s	*mod = &ioc->mbox_mod;
2315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32			stat;
23167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23175fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
23187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If a previous command is pending, queue new command
23197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
23207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!list_empty(&mod->cmd_q)) {
23217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		list_add_tail(&cmd->qe, &mod->cmd_q);
23227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
23237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
23247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23255fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
23267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * If mailbox is busy, queue command for poll timer
23277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
23285344026065f79b102fcc44bc6332f856a111962aJing Huang	stat = readl(ioc->ioc_regs.hfn_mbox_cmd);
23297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (stat) {
23307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		list_add_tail(&cmd->qe, &mod->cmd_q);
23317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return;
23327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
23337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
23357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * mailbox is free -- queue command to firmware
23367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
23377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_mbox_send(ioc, cmd->msg, sizeof(cmd->msg));
23387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
23397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
23417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Handle mailbox interrupts
23427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
23437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
23447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_mbox_isr(struct bfa_ioc_s *ioc)
23457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_mbox_mod_s	*mod = &ioc->mbox_mod;
2347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_mbmsg_s		m;
2348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int				mc;
23497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23508b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	if (bfa_ioc_msgget(ioc, &m)) {
23518b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		/*
23528b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		 * Treat IOC message class as special.
23538b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		 */
23548b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		mc = m.mh.msg_class;
23558b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		if (mc == BFI_MC_IOC) {
23568b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati			bfa_ioc_isr(ioc, &m);
23578b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati			return;
23588b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		}
23597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23608b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		if ((mc > BFI_MC_MAX) || (mod->mbhdlr[mc].cbfn == NULL))
23618b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati			return;
23628b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati
23638b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati		mod->mbhdlr[mc].cbfn(mod->mbhdlr[mc].cbarg, &m);
23647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
23657725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23668b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	bfa_ioc_lpu_read_stat(ioc);
23677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23688b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	/*
23698b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	 * Try to send pending mailbox commands
23708b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	 */
23718b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati	bfa_ioc_mbox_poll(ioc);
23727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
23737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
23757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_error_isr(struct bfa_ioc_s *ioc)
23767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
23775a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	bfa_ioc_stats(ioc, ioc_hbfails);
23785a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	ioc->stats.hb_count = ioc->hb_count;
23797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_HWERROR);
23807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
23817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23825fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
23837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC is disabled
23847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
23857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
23867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_is_disabled(struct bfa_ioc_s *ioc)
23877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabling) ||
2389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled);
23907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
23917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
23925fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
23937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * return true if IOC firmware is different.
23947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
23957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
23967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_fw_mismatch(struct bfa_ioc_s *ioc)
23977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return bfa_fsm_cmp_state(ioc, bfa_ioc_sm_reset) ||
2399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_cmp_state(&ioc->iocpf, bfa_iocpf_sm_fwcheck) ||
2400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_fsm_cmp_state(&ioc->iocpf, bfa_iocpf_sm_mismatch);
24017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
24027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define bfa_ioc_state_disabled(__sm)		\
24047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	(((__sm) == BFI_IOC_UNINIT) ||		\
24057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_INITING) ||		\
24067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_HWINIT) ||		\
24077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_DISABLED) ||	\
24080a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 ((__sm) == BFI_IOC_FAIL) ||		\
24097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 ((__sm) == BFI_IOC_CFG_DISABLED))
24107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
24127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Check if adapter is disabled -- both IOCs should be in a disabled
24137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * state.
24147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
24157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_boolean_t
24167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_adapter_is_disabled(struct bfa_ioc_s *ioc)
24177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	ioc_state;
24197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_fsm_cmp_state(ioc, bfa_ioc_sm_disabled))
24217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
24227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2423111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	ioc_state = readl(ioc->ioc_regs.ioc_fwstate);
24247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (!bfa_ioc_state_disabled(ioc_state))
24257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_FALSE;
24267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (ioc->pcidev.device_id != BFA_PCI_DEVICE_ID_FC_8G1P) {
2428111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		ioc_state = readl(ioc->ioc_regs.alt_ioc_fwstate);
2429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (!bfa_ioc_state_disabled(ioc_state))
2430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			return BFA_FALSE;
2431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
24327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_TRUE;
24347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
24357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24368f4bfadd200477acb6dcf41a45919dd37d01a6dbJing Huang/*
2437f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati * Reset IOC fwstate registers.
2438f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati */
2439f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipativoid
2440f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipatibfa_ioc_reset_fwstate(struct bfa_ioc_s *ioc)
2441f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati{
2442f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	writel(BFI_IOC_UNINIT, ioc->ioc_regs.ioc_fwstate);
2443f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati	writel(BFI_IOC_UNINIT, ioc->ioc_regs.alt_ioc_fwstate);
2444f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati}
2445f1d584d70f31f54e0a559049906f42db89e2746dKrishna Gudipati
24467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang#define BFA_MFG_NAME "Brocade"
24477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
24487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_adapter_attr(struct bfa_ioc_s *ioc,
24497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang			 struct bfa_adapter_attr_s *ad_attr)
24507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioc_attr_s	*ioc_attr;
24527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr = ioc->attr;
24540a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
24550a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_serial_num(ioc, ad_attr->serial_num);
24560a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_fw_ver(ioc, ad_attr->fw_ver);
24570a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_optrom_ver(ioc, ad_attr->optrom_ver);
24580a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_manufacturer(ioc, ad_attr->manufacturer);
24596a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy(&ad_attr->vpd, &ioc_attr->vpd,
24607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		      sizeof(struct bfa_mfg_vpd_s));
24617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24620a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ad_attr->nports = bfa_ioc_get_nports(ioc);
24630a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ad_attr->max_speed = bfa_ioc_speed_sup(ioc);
24647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24650a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_model(ioc, ad_attr->model);
24660a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	/* For now, model descr uses same model string */
24670a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_adapter_model(ioc, ad_attr->model_descr);
24687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2469ed96932470e4ca3aab29518a748dc1162853b456Jing Huang	ad_attr->card_type = ioc_attr->card_type;
2470ed96932470e4ca3aab29518a748dc1162853b456Jing Huang	ad_attr->is_mezz = bfa_mfg_is_mezz(ioc_attr->card_type);
2471ed96932470e4ca3aab29518a748dc1162853b456Jing Huang
24727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (BFI_ADAPTER_IS_SPECIAL(ioc_attr->adapter_prop))
24737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ad_attr->prototype = 1;
24747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	else
24757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		ad_attr->prototype = 0;
24767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2477f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	ad_attr->pwwn = ioc->attr->pwwn;
2478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ad_attr->mac  = bfa_ioc_get_mac(ioc);
24797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->pcie_gen = ioc_attr->pcie_gen;
24817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->pcie_lanes = ioc_attr->pcie_lanes;
24827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->pcie_lanes_orig = ioc_attr->pcie_lanes_orig;
24837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ad_attr->asic_rev = ioc_attr->asic_rev;
24840a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
24850a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_pci_chip_rev(ioc, ad_attr->hw_ver);
24867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2487111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	ad_attr->cna_capable = bfa_ioc_is_cna(ioc);
2488111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	ad_attr->trunk_capable = (ad_attr->nports > 1) &&
2489111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati				  !bfa_ioc_is_cna(ioc) && !ad_attr->is_mezz;
24907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
24917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
24922993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatienum bfa_ioc_type_e
24932993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipatibfa_ioc_get_type(struct bfa_ioc_s *ioc)
24942993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati{
2495111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (ioc->clscode == BFI_PCIFN_CLASS_ETH)
24962993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati		return BFA_IOC_TYPE_LL;
2497111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2498111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	WARN_ON(ioc->clscode != BFI_PCIFN_CLASS_FC);
2499111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
25005a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	return (ioc->attr->port_mode == BFI_PORT_MODE_FC)
2501111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		? BFA_IOC_TYPE_FC : BFA_IOC_TYPE_FCoE;
25022993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati}
25032993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati
25047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
25050a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_serial_num(struct bfa_ioc_s *ioc, char *serial_num)
25060a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
25076a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)serial_num, 0, BFA_ADAPTER_SERIAL_NUM_LEN);
25086a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy((void *)serial_num,
25090a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati			(void *)ioc->attr->brcd_serialnum,
25100a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati			BFA_ADAPTER_SERIAL_NUM_LEN);
25110a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
25120a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25130a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
25140a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_fw_ver(struct bfa_ioc_s *ioc, char *fw_ver)
25150a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
25166a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)fw_ver, 0, BFA_VERSION_LEN);
25176a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy(fw_ver, ioc->attr->fw_version, BFA_VERSION_LEN);
25180a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
25190a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25200a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
25210a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_pci_chip_rev(struct bfa_ioc_s *ioc, char *chip_rev)
25220a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
2523d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!chip_rev);
25240a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25256a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)chip_rev, 0, BFA_IOC_CHIP_REV_LEN);
25260a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25270a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[0] = 'R';
25280a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[1] = 'e';
25290a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[2] = 'v';
25300a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[3] = '-';
25310a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[4] = ioc->attr->asic_rev;
25320a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	chip_rev[5] = '\0';
25330a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
25340a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25350a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
25360a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_optrom_ver(struct bfa_ioc_s *ioc, char *optrom_ver)
25370a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
25386a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)optrom_ver, 0, BFA_VERSION_LEN);
25396a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy(optrom_ver, ioc->attr->optrom_version,
2540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		      BFA_VERSION_LEN);
25410a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
25420a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25430a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
25440a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_manufacturer(struct bfa_ioc_s *ioc, char *manufacturer)
25450a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
25466a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)manufacturer, 0, BFA_ADAPTER_MFG_NAME_LEN);
25476a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy(manufacturer, BFA_MFG_NAME, BFA_ADAPTER_MFG_NAME_LEN);
25480a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
25490a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25500a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
25510a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_adapter_model(struct bfa_ioc_s *ioc, char *model)
25520a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
2553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioc_attr_s	*ioc_attr;
25540a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
2555d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(!model);
25566a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)model, 0, BFA_ADAPTER_MODEL_NAME_LEN);
25570a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25580a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ioc_attr = ioc->attr;
25590a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
256010a07379247078448c076690657a076076bf89aaKrishna Gudipati	snprintf(model, BFA_ADAPTER_MODEL_NAME_LEN, "%s-%u",
25618b070b4a022f86dd5098308e36426ce29b6b8960Krishna Gudipati			BFA_MFG_NAME, ioc_attr->card_type);
25620a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
25630a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
25640a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatienum bfa_ioc_state
25650a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipatibfa_ioc_get_state(struct bfa_ioc_s *ioc)
25660a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati{
2567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	enum bfa_iocpf_state iocpf_st;
2568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	enum bfa_ioc_state ioc_st = bfa_sm_to_state(ioc_sm_table, ioc->fsm);
2569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (ioc_st == BFA_IOC_ENABLING ||
2571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		ioc_st == BFA_IOC_FAIL || ioc_st == BFA_IOC_INITFAIL) {
2572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocpf_st = bfa_sm_to_state(iocpf_sm_table, ioc->iocpf.fsm);
2574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		switch (iocpf_st) {
2576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		case BFA_IOCPF_SEMWAIT:
2577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			ioc_st = BFA_IOC_SEMWAIT;
2578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
2579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		case BFA_IOCPF_HWINIT:
2581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			ioc_st = BFA_IOC_HWINIT;
2582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
2583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		case BFA_IOCPF_FWMISMATCH:
2585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			ioc_st = BFA_IOC_FWMISMATCH;
2586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
2587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		case BFA_IOCPF_FAIL:
2589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			ioc_st = BFA_IOC_FAIL;
2590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
2591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		case BFA_IOCPF_INITFAIL:
2593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			ioc_st = BFA_IOC_INITFAIL;
2594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
2595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		default:
2597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
2598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
2599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return ioc_st;
26020a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati}
26030a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati
26040a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipativoid
26057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_attr(struct bfa_ioc_s *ioc, struct bfa_ioc_attr_s *ioc_attr)
26067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
26076a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)ioc_attr, 0, sizeof(struct bfa_ioc_attr_s));
26087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26090a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	ioc_attr->state = bfa_ioc_get_state(ioc);
26107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr->port_id = ioc->port_id;
26111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ioc_attr->port_mode = ioc->port_mode;
26121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ioc_attr->port_mode_cfg = ioc->port_mode_cfg;
26131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ioc_attr->cap_bm = ioc->ad_cap_bm;
26147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26152993cc71d1bff61999ade7f2b6b3ea2dd1e2c8d9Krishna Gudipati	ioc_attr->ioc_type = bfa_ioc_get_type(ioc);
26167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_get_adapter_attr(ioc, &ioc_attr->adapter_attr);
26187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr->pci_attr.device_id = ioc->pcidev.device_id;
26207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	ioc_attr->pci_attr.pcifn = ioc->pcidev.pci_func;
26210a4b1fc0b24fc7adbaf8413f2992ce1395991a78Krishna Gudipati	bfa_ioc_get_pci_chip_rev(ioc, ioc_attr->pci_attr.chip_rev);
26227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
26237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangmac_t
26257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_get_mac(struct bfa_ioc_s *ioc)
26267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
262715b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang	/*
2628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Check the IOC type and return the appropriate MAC
262915b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang	 */
263015b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang	if (bfa_ioc_get_type(ioc) == BFA_IOC_TYPE_FCoE)
2631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return ioc->attr->fcoe_mac;
263215b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang	else
263315b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang		return ioc->attr->mac;
263415b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang}
263515b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang
263615b64a835def4c784c6e62ad762677f5cb56eba2Jing Huangmac_t
263715b64a835def4c784c6e62ad762677f5cb56eba2Jing Huangbfa_ioc_get_mfg_mac(struct bfa_ioc_s *ioc)
263815b64a835def4c784c6e62ad762677f5cb56eba2Jing Huang{
2639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	mac_t	m;
26407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = ioc->attr->mfg_mac;
2642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa_mfg_is_old_wwn_mac_model(ioc->attr->card_type))
2643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		m.mac[MAC_ADDRLEN - 1] += bfa_ioc_pcifn(ioc);
2644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else
2645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_mfg_increment_wwn_mac(&(m.mac[MAC_ADDRLEN-3]),
2646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_ioc_pcifn(ioc));
26477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return m;
26497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
26507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26515fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
26527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati * Send AEN notification
26537826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati */
26547826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipativoid
26557826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_ioc_aen_post(struct bfa_ioc_s *ioc, enum bfa_ioc_aen_event event)
26567826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{
26577826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
26587826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfa_aen_entry_s	*aen_entry;
26597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	enum bfa_ioc_type_e ioc_type;
26607826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
26617826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_get_aen_entry(bfad, aen_entry);
26627826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	if (!aen_entry)
26637826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		return;
26647826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
26657826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	ioc_type = bfa_ioc_get_type(ioc);
26667826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	switch (ioc_type) {
26677826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_IOC_TYPE_FC:
26687826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_entry->aen_data.ioc.pwwn = ioc->attr->pwwn;
26697826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
26707826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_IOC_TYPE_FCoE:
26717826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_entry->aen_data.ioc.pwwn = ioc->attr->pwwn;
26727826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_entry->aen_data.ioc.mac = bfa_ioc_get_mac(ioc);
26737826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
26747826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_IOC_TYPE_LL:
26757826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_entry->aen_data.ioc.mac = bfa_ioc_get_mac(ioc);
26767826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
26777826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	default:
26787826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		WARN_ON(ioc_type != BFA_IOC_TYPE_FC);
26797826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
26807826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	}
26817826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
26827826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	/* Send the AEN notification */
26837826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.ioc.ioc_type = ioc_type;
26847826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_im_post_vendor_event(aen_entry, bfad, ++ioc->ioc_aen_seq,
26857826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati				  BFA_AEN_CAT_IOC, event);
26867826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati}
26877826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
26887826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati/*
26897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure.
26907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
26917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
26927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwsave(struct bfa_ioc_s *ioc, void *trcdata, int *trclen)
26937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int	tlen;
26957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (ioc->dbg_fwsave_len == 0)
26977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		return BFA_STATUS_ENOFSAVE;
26987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
26997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	tlen = *trclen;
27007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (tlen > ioc->dbg_fwsave_len)
27017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		tlen = ioc->dbg_fwsave_len;
27027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
27036a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memcpy(trcdata, ioc->dbg_fwsave, tlen);
27047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	*trclen = tlen;
27057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	return BFA_STATUS_OK;
27067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
27077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2708738c9e66dcb7e17a962a7d65c976386b970d10caKrishna Gudipati
27095fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
27107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Retrieve saved firmware trace from a prior IOC failure.
27117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
27127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_status_t
27137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_debug_fwtrc(struct bfa_ioc_s *ioc, void *trcdata, int *trclen)
27147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 loff = BFA_DBG_FWTRC_OFF(bfa_ioc_portid(ioc));
2716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int tlen;
2717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_status_t status;
27187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
27197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_trc(ioc, *trclen);
27207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
27217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	tlen = *trclen;
27227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	if (tlen > BFA_DBG_FWTRC_LEN)
27237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		tlen = BFA_DBG_FWTRC_LEN;
27247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	status = bfa_ioc_smem_read(ioc, trcdata, loff, tlen);
2726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*trclen = tlen;
2727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return status;
2728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
27297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_send_fwsync(struct bfa_ioc_s *ioc)
2732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2733a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_mbox_cmd_s cmd;
2734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_ioc_ctrl_req_s *req = (struct bfi_ioc_ctrl_req_s *) cmd.msg;
27357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfi_h2i_set(req->mh, BFI_MC_IOC, BFI_IOC_H2I_DBG_SYNC,
2737a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		    bfa_ioc_portid(ioc));
2738d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	req->clscode = cpu_to_be16(ioc->clscode);
2739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_mbox_queue(ioc, &cmd);
2740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fwsync(struct bfa_ioc_s *ioc)
2744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 fwsync_iter = 1000;
2746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_send_fwsync(ioc);
2748a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27495fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * After sending a fw sync mbox command wait for it to
2751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * take effect.  We will not wait for a response because
2752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *    1. fw_sync mbox cmd doesn't have a response.
2753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *    2. Even if we implement that,  interrupts might not
2754a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 *	 be enabled when we call this function.
2755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * So, just keep checking if any mbox cmd is pending, and
2756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * after waiting for a reasonable amount of time, go ahead.
2757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * It is possible that fw has crashed and the mbox command
2758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * is never acknowledged.
2759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	while (bfa_ioc_mbox_cmd_pending(ioc) && fwsync_iter > 0)
2761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		fwsync_iter--;
2762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Dump firmware smem
2766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t
2768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_debug_fwcore(struct bfa_ioc_s *ioc, void *buf,
2769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				u32 *offset, int *buflen)
2770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 loff;
2772a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int dlen;
2773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_status_t status;
2774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 smem_len = BFA_IOC_FW_SMEM_SIZE(ioc);
2775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (*offset >= smem_len) {
2777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*offset = *buflen = 0;
2778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_EINVAL;
27797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
27800a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
2781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	loff = *offset;
2782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dlen = *buflen;
2783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
27845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
2785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * First smem read, sync smem before proceeding
2786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * No need to sync before reading every chunk.
27870a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati	 */
2788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (loff == 0)
2789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_fwsync(ioc);
27900a20de446c76529028cb239bf2a13cb0f05b263aKrishna Gudipati
2791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if ((loff + dlen) >= smem_len)
2792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dlen = smem_len - loff;
27937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
2794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	status = bfa_ioc_smem_read(ioc, buf, loff, dlen);
2795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (status != BFA_STATUS_OK) {
2797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*offset = *buflen = 0;
2798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return status;
2799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2800a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*offset += dlen;
2802a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (*offset >= smem_len)
2804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*offset = 0;
2805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*buflen = dlen;
2807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return status;
2809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
28115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Firmware statistics
2813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t
2815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fw_stats_get(struct bfa_ioc_s *ioc, void *stats)
2816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 loff = BFI_IOC_FWSTATS_OFF + \
2818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		BFI_IOC_FWSTATS_SZ * (bfa_ioc_portid(ioc));
2819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int tlen;
2820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_status_t status;
2821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (ioc->stats_busy) {
2823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(ioc, ioc->stats_busy);
2824a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_DEVBUSY;
2825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->stats_busy = BFA_TRUE;
2827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tlen = sizeof(struct bfa_fw_stats_s);
2829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	status = bfa_ioc_smem_read(ioc, stats, loff, tlen);
2830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->stats_busy = BFA_FALSE;
2832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return status;
2833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t
2836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_ioc_fw_stats_clear(struct bfa_ioc_s *ioc)
2837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 loff = BFI_IOC_FWSTATS_OFF + \
2839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		BFI_IOC_FWSTATS_SZ * (bfa_ioc_portid(ioc));
2840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int tlen;
2841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_status_t status;
2842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (ioc->stats_busy) {
2844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(ioc, ioc->stats_busy);
2845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_DEVBUSY;
2846a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->stats_busy = BFA_TRUE;
2848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	tlen = sizeof(struct bfa_fw_stats_s);
2850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	status = bfa_ioc_smem_clr(ioc, loff, tlen);
2851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->stats_busy = BFA_FALSE;
2853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return status;
28547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
28557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
28565fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
28577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Save firmware trace if configured.
28587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
28597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
28604e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipatibfa_ioc_debug_save_ftrc(struct bfa_ioc_s *ioc)
28617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
2862a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		tlen;
28637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
28644e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati	if (ioc->dbg_fwsave_once) {
28654e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		ioc->dbg_fwsave_once = BFA_FALSE;
28664e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		if (ioc->dbg_fwsave_len) {
28674e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			tlen = ioc->dbg_fwsave_len;
28684e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati			bfa_ioc_debug_fwtrc(ioc, ioc->dbg_fwsave, &tlen);
28694e78efefa3c083240bd47153ffa99642bfdc7811Krishna Gudipati		}
28707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
28717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
28727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
28735fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
28747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Firmware failure detected. Start recovery actions.
28757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
28767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangstatic void
28777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_ioc_recover(struct bfa_ioc_s *ioc)
28787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
28797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_ioc_stats(ioc, ioc_hbfails);
28805a0adaedffce91100d03fc1036dde024c8589295Krishna Gudipati	ioc->stats.hb_count = ioc->hb_count;
28817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_fsm_send_event(ioc, IOC_E_HBFAIL);
28827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
28837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
28845fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2885df0f1933eb5454a5c481311837076056557467adMaggie Zhang *  BFA IOC PF private functions
2886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_timeout(void *ioc_arg)
2889a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s  *ioc = (struct bfa_ioc_s *) ioc_arg;
2891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(ioc, 0);
2893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_TIMEOUT);
2894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
2897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocpf_sem_timeout(void *ioc_arg)
2898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s  *ioc = (struct bfa_ioc_s *) ioc_arg;
2900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2901a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_hw_sem_get(ioc);
2902a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2904775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void
2905775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatibfa_ioc_poll_fwinit(struct bfa_ioc_s *ioc)
2906775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati{
2907775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	u32 fwstate = readl(ioc->ioc_regs.ioc_fwstate);
2908775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
2909775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa_trc(ioc, fwstate);
2910775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
2911775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	if (fwstate == BFI_IOC_DISABLED) {
2912775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_fsm_send_event(&ioc->iocpf, IOCPF_E_FWREADY);
2913775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		return;
2914775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	}
2915775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
2916775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	if (ioc->iocpf.poll_time >= BFA_IOC_TOV)
2917775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_iocpf_timeout(ioc);
2918775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	else {
2919775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		ioc->iocpf.poll_time += BFA_IOC_POLL_TOV;
2920775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		bfa_iocpf_poll_timer_start(ioc);
2921775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	}
2922775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati}
2923775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
2924775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatistatic void
2925775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipatibfa_iocpf_poll_timeout(void *ioc_arg)
2926775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati{
2927775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	struct bfa_ioc_s *ioc = (struct bfa_ioc_s *) ioc_arg;
2928775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
2929775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa_ioc_poll_fwinit(ioc);
2930775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati}
2931775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
29325fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2933a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *  bfa timer function
2934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_timer_beat(struct bfa_timer_mod_s *mod)
2937a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *qh = &mod->timer_q;
2939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *qe, *qe_next;
2940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_timer_s *elem;
2941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head timedout_q;
2942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&timedout_q);
2944a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	qe = bfa_q_next(qh);
2946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	while (qe != qh) {
2948a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		qe_next = bfa_q_next(qe);
2949a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		elem = (struct bfa_timer_s *) qe;
2951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (elem->timeout <= BFA_TIMER_FREQ) {
2952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			elem->timeout = 0;
2953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_del(&elem->qe);
2954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			list_add_tail(&elem->qe, &timedout_q);
2955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		} else {
2956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			elem->timeout -= BFA_TIMER_FREQ;
2957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
2958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		qe = qe_next;	/* go to next elem */
2960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
2963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Pop all the timeout entries
2964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
2965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	while (!list_empty(&timedout_q)) {
2966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_q_deq(&timedout_q, &elem);
2967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		elem->timercb(elem->arg);
2968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
2969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
29715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Should be called with lock protection
2973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2975a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_timer_begin(struct bfa_timer_mod_s *mod, struct bfa_timer_s *timer,
2976a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		    void (*timercb) (void *), void *arg, unsigned int timeout)
2977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2978a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2979d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(timercb == NULL);
2980d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(bfa_q_is_on_q(&mod->timer_q, timer));
2981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	timer->timeout = timeout;
2983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	timer->timercb = timercb;
2984a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	timer->arg = arg;
2985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_add_tail(&timer->qe, &mod->timer_q);
2987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
2988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
29895fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
2990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Should be called with lock protection
2991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
2992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
2993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_timer_stop(struct bfa_timer_s *timer)
2994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
2995d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(list_empty(&timer->qe));
2996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_del(&timer->qe);
2998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
29991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati/*
30011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati *	ASIC block related
30021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati */
30031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatistatic void
30041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_config_swap(struct bfa_ablk_cfg_s *cfg)
30051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
30061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_ablk_cfg_inst_s *cfg_inst;
30071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	int i, j;
30081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	u16	be16;
30091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	u32	be32;
30101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	for (i = 0; i < BFA_ABLK_MAX; i++) {
30121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		cfg_inst = &cfg->inst[i];
30131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		for (j = 0; j < BFA_ABLK_MAX_PFS; j++) {
30141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			be16 = cfg_inst->pf_cfg[j].pers;
30151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			cfg_inst->pf_cfg[j].pers = be16_to_cpu(be16);
30161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			be16 = cfg_inst->pf_cfg[j].num_qpairs;
30171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			cfg_inst->pf_cfg[j].num_qpairs = be16_to_cpu(be16);
30181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			be16 = cfg_inst->pf_cfg[j].num_vectors;
30191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			cfg_inst->pf_cfg[j].num_vectors = be16_to_cpu(be16);
30201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			be32 = cfg_inst->pf_cfg[j].bw;
30211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			cfg_inst->pf_cfg[j].bw = be16_to_cpu(be32);
30221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		}
30231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
30241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
30251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatistatic void
30271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_isr(void *cbarg, struct bfi_mbmsg_s *msg)
30281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
30291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_ablk_s *ablk = (struct bfa_ablk_s *)cbarg;
30301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_i2h_rsp_s *rsp = (struct bfi_ablk_i2h_rsp_s *)msg;
30311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ablk_cbfn_t cbfn;
30321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	WARN_ON(msg->mh.msg_class != BFI_MC_ABLK);
30341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_trc(ablk->ioc, msg->mh.msg_id);
30351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	switch (msg->mh.msg_id) {
30371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_QUERY:
30381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		if (rsp->status == BFA_STATUS_OK) {
30391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			memcpy(ablk->cfg, ablk->dma_addr.kva,
30401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				sizeof(struct bfa_ablk_cfg_s));
30411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			bfa_ablk_config_swap(ablk->cfg);
30421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			ablk->cfg = NULL;
30431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		}
30441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
30451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_ADPT_CONFIG:
30471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_PORT_CONFIG:
30481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		/* update config port mode */
30491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ablk->ioc->port_mode_cfg = rsp->port_mode;
30501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_PF_DELETE:
30521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_PF_UPDATE:
30531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_OPTROM_ENABLE:
30541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_OPTROM_DISABLE:
30551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		/* No-op */
30561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
30571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFI_ABLK_I2H_PF_CREATE:
30591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		*(ablk->pcifn) = rsp->pcifn;
30601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ablk->pcifn = NULL;
30611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
30621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	default:
30641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		WARN_ON(1);
30651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
30661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy = BFA_FALSE;
30681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->cbfn) {
30691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		cbfn = ablk->cbfn;
30701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ablk->cbfn = NULL;
30711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		cbfn(ablk->cbarg, rsp->status);
30721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
30731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
30741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatistatic void
30761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_notify(void *cbarg, enum bfa_ioc_event_e event)
30771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
30781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_ablk_s *ablk = (struct bfa_ablk_s *)cbarg;
30791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_trc(ablk->ioc, event);
30811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	switch (event) {
30831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFA_IOC_E_ENABLED:
30841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		WARN_ON(ablk->busy != BFA_FALSE);
30851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
30861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFA_IOC_E_DISABLED:
30881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	case BFA_IOC_E_FAILED:
30891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		/* Fail any pending requests */
30901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		ablk->pcifn = NULL;
30911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		if (ablk->busy) {
30921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			if (ablk->cbfn)
30931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati				ablk->cbfn(ablk->cbarg, BFA_STATUS_FAILED);
30941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			ablk->cbfn = NULL;
30951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati			ablk->busy = BFA_FALSE;
30961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		}
30971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
30981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
30991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	default:
31001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		WARN_ON(1);
31011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		break;
31021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
31031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
31041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatiu32
31061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_meminfo(void)
31071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
31081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_ROUNDUP(sizeof(struct bfa_ablk_cfg_s), BFA_DMA_ALIGN_SZ);
31091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
31101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipativoid
31121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_memclaim(struct bfa_ablk_s *ablk, u8 *dma_kva, u64 dma_pa)
31131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
31141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->dma_addr.kva = dma_kva;
31151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->dma_addr.pa  = dma_pa;
31161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
31171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipativoid
31191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_attach(struct bfa_ablk_s *ablk, struct bfa_ioc_s *ioc)
31201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
31211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->ioc = ioc;
31221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_regisr(ablk->ioc, BFI_MC_ABLK, bfa_ablk_isr, ablk);
31243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_q_qe_init(&ablk->ioc_notify);
31251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_notify_init(&ablk->ioc_notify, bfa_ablk_notify, ablk);
31261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	list_add_tail(&ablk->ioc_notify.qe, &ablk->ioc->notify_q);
31271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
31281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
31301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_query(struct bfa_ablk_s *ablk, struct bfa_ablk_cfg_s *ablk_cfg,
31311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ablk_cbfn_t cbfn, void *cbarg)
31321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
31331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_query_s *m;
31341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	WARN_ON(!ablk_cfg);
31361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
31381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
31391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
31401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
31411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
31431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
31441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
31451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
31461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cfg = ablk_cfg;
31481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn  = cbfn;
31491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
31501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
31511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_query_s *)ablk->mb.msg;
31531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_QUERY,
31541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		    bfa_ioc_portid(ablk->ioc));
31551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_dma_be_addr_set(m->addr, ablk->dma_addr.pa);
31561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
31571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
31591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
31601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
31621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_pf_create(struct bfa_ablk_s *ablk, u16 *pcifn,
31631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		u8 port, enum bfi_pcifn_class personality, int bw,
31641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ablk_cbfn_t cbfn, void *cbarg)
31651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
31661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_pf_req_s *m;
31671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
31691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
31701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
31711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
31721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
31741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
31751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
31761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
31771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->pcifn = pcifn;
31791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn = cbfn;
31801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
31811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
31821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_pf_req_s *)ablk->mb.msg;
31841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_CREATE,
31851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		    bfa_ioc_portid(ablk->ioc));
31861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->pers = cpu_to_be16((u16)personality);
31871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->bw = cpu_to_be32(bw);
31881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->port = port;
31891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
31901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
31921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
31931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
31941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
31951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_pf_delete(struct bfa_ablk_s *ablk, int pcifn,
31961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ablk_cbfn_t cbfn, void *cbarg)
31971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
31981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_pf_req_s *m;
31991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
32011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
32021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
32031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
32041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
32061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
32071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
32081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
32091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn  = cbfn;
32111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
32121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
32131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_pf_req_s *)ablk->mb.msg;
32151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_DELETE,
32161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		    bfa_ioc_portid(ablk->ioc));
32171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->pcifn = (u8)pcifn;
32181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
32191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
32211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
32221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
32241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_adapter_config(struct bfa_ablk_s *ablk, enum bfa_mode_s mode,
32251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		int max_pf, int max_vf, bfa_ablk_cbfn_t cbfn, void *cbarg)
32261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
32271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_cfg_req_s *m;
32281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
32301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
32311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
32321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
32331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
32351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
32361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
32371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
32381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn  = cbfn;
32401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
32411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
32421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_cfg_req_s *)ablk->mb.msg;
32441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_ADPT_CONFIG,
32451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		    bfa_ioc_portid(ablk->ioc));
32461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->mode = (u8)mode;
32471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->max_pf = (u8)max_pf;
32481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->max_vf = (u8)max_vf;
32491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
32501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
32521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
32531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
32551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_port_config(struct bfa_ablk_s *ablk, int port, enum bfa_mode_s mode,
32561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		int max_pf, int max_vf, bfa_ablk_cbfn_t cbfn, void *cbarg)
32571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
32581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_cfg_req_s *m;
32591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
32611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
32621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
32631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
32641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
32661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
32671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
32681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
32691a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32701a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn  = cbfn;
32711a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
32721a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
32731a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32741a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_cfg_req_s *)ablk->mb.msg;
32751a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PORT_CONFIG,
32761a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ioc_portid(ablk->ioc));
32771a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->port = (u8)port;
32781a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->mode = (u8)mode;
32791a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->max_pf = (u8)max_pf;
32801a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->max_vf = (u8)max_vf;
32811a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
32821a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32831a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
32841a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
32851a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32861a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
32871a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_pf_update(struct bfa_ablk_s *ablk, int pcifn, int bw,
32881a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ablk_cbfn_t cbfn, void *cbarg)
32891a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
32901a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_pf_req_s *m;
32911a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32921a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
32931a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
32941a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
32951a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
32961a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
32971a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
32981a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
32991a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
33001a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
33011a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33021a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn  = cbfn;
33031a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
33041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
33051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_pf_req_s *)ablk->mb.msg;
33071a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_PF_UPDATE,
33081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ioc_portid(ablk->ioc));
33091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->pcifn = (u8)pcifn;
33101a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m->bw = cpu_to_be32(bw);
33111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
33121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33131a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
33141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
33151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33161a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
33171a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_optrom_en(struct bfa_ablk_s *ablk, bfa_ablk_cbfn_t cbfn, void *cbarg)
33181a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
33191a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_optrom_s *m;
33201a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33211a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
33221a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
33231a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
33241a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
33251a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33261a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
33271a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
33281a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
33291a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
33301a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33311a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn  = cbfn;
33321a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
33331a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
33341a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33351a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_optrom_s *)ablk->mb.msg;
33361a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_OPTROM_ENABLE,
33371a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ioc_portid(ablk->ioc));
33381a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
33391a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33401a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
33411a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
33421a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33431a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_status_t
33441a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatibfa_ablk_optrom_dis(struct bfa_ablk_s *ablk, bfa_ablk_cbfn_t cbfn, void *cbarg)
33451a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
33461a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfi_ablk_h2i_optrom_s *m;
33471a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33481a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (!bfa_ioc_is_operational(ablk->ioc)) {
33491a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_IOC_FAILURE);
33501a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return BFA_STATUS_IOC_FAILURE;
33511a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
33521a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33531a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	if (ablk->busy) {
33541a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_trc(ablk->ioc, BFA_STATUS_DEVBUSY);
33551a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		return  BFA_STATUS_DEVBUSY;
33561a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	}
33571a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33581a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbfn  = cbfn;
33591a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->cbarg = cbarg;
33601a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	ablk->busy  = BFA_TRUE;
33611a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33621a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	m = (struct bfi_ablk_h2i_optrom_s *)ablk->mb.msg;
33631a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_ABLK, BFI_ABLK_H2I_OPTROM_DISABLE,
33641a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati		bfa_ioc_portid(ablk->ioc));
33651a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ioc_mbox_queue(ablk->ioc, &ablk->mb);
33661a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
33671a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	return BFA_STATUS_OK;
33681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
336951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
337051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
337151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	SFP module specific
337251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
337351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
337451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/* forward declarations */
337551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void bfa_sfp_getdata_send(struct bfa_sfp_s *sfp);
337651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void bfa_sfp_media_get(struct bfa_sfp_s *sfp);
337751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic bfa_status_t bfa_sfp_speed_valid(struct bfa_sfp_s *sfp,
337851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				enum bfa_port_speed portspeed);
337951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
338051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
338151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_cb_sfp_show(struct bfa_sfp_s *sfp)
338251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
338351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->lock);
338451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->cbfn)
338551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->cbfn(sfp->cbarg, sfp->status);
338651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->lock = 0;
338751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->cbfn = NULL;
338851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
338951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
339051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
339151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_cb_sfp_state_query(struct bfa_sfp_s *sfp)
339251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
339351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->portspeed);
339451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->media) {
339551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_sfp_media_get(sfp);
339651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->state_query_cbfn)
339751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->state_query_cbfn(sfp->state_query_cbarg,
339851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati					sfp->status);
339951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->media = NULL;
340051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
340151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
340251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->portspeed) {
340351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->status = bfa_sfp_speed_valid(sfp, sfp->portspeed);
340451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			if (sfp->state_query_cbfn)
340551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				sfp->state_query_cbfn(sfp->state_query_cbarg,
340651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati						sfp->status);
340751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				sfp->portspeed = BFA_PORT_SPEED_UNKNOWN;
340851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
340951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
341051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->state_query_lock = 0;
341151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->state_query_cbfn = NULL;
341251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
341351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
341451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
341551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	IOC event handler.
341651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
341751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
341851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_notify(void *sfp_arg, enum bfa_ioc_event_e event)
341951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
342051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_sfp_s *sfp = sfp_arg;
342151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
342251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, event);
342351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->lock);
342451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->state_query_lock);
342551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
342651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	switch (event) {
342751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case BFA_IOC_E_DISABLED:
342851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case BFA_IOC_E_FAILED:
342951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->lock) {
343051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->status = BFA_STATUS_IOC_FAILURE;
343151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_cb_sfp_show(sfp);
343251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
343351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
343451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->state_query_lock) {
343551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->status = BFA_STATUS_IOC_FAILURE;
343651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_cb_sfp_state_query(sfp);
343751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
343851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		break;
343951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
344051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	default:
344151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		break;
344251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
344351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
344451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
344551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
34467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati * SFP's State Change Notification post to AEN
34477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati */
34487826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void
34497826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_sfp_scn_aen_post(struct bfa_sfp_s *sfp, struct bfi_sfp_scn_s *rsp)
34507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{
34517826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)sfp->ioc->bfa->bfad;
34527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfa_aen_entry_s  *aen_entry;
34537826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	enum bfa_port_aen_event aen_evt = 0;
34547826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
34557826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfa_trc(sfp, (((u64)rsp->pomlvl) << 16) | (((u64)rsp->sfpid) << 8) |
34567826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		      ((u64)rsp->event));
34577826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
34587826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_get_aen_entry(bfad, aen_entry);
34597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	if (!aen_entry)
34607826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		return;
34617826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
34627826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.port.ioc_type = bfa_ioc_get_type(sfp->ioc);
34637826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.port.pwwn = sfp->ioc->attr->pwwn;
34647826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.port.mac = bfa_ioc_get_mac(sfp->ioc);
34657826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
34667826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	switch (rsp->event) {
34677826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_INSERTED:
34687826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_evt = BFA_PORT_AEN_SFP_INSERT;
34697826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
34707826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_REMOVED:
34717826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_evt = BFA_PORT_AEN_SFP_REMOVE;
34727826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
34737826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_FAILED:
34747826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_evt = BFA_PORT_AEN_SFP_ACCESS_ERROR;
34757826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
34767826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_UNSUPPORT:
34777826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_evt = BFA_PORT_AEN_SFP_UNSUPPORT;
34787826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
34797826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_POM:
34807826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_evt = BFA_PORT_AEN_SFP_POM;
34817826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		aen_entry->aen_data.port.level = rsp->pomlvl;
34827826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
34837826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	default:
34847826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_trc(sfp, rsp->event);
34857826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		WARN_ON(1);
34867826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	}
34877826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
34887826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	/* Send the AEN notification */
34897826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_im_post_vendor_event(aen_entry, bfad, ++sfp->ioc->ioc_aen_seq,
34907826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati				  BFA_AEN_CAT_PORT, aen_evt);
34917826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati}
34927826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
34937826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati/*
349451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	SFP get data send
349551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
349651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
349751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_getdata_send(struct bfa_sfp_s *sfp)
349851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
349951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg;
350051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
350151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, req->memtype);
350251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
350351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	/* build host command */
350451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfi_h2i_set(req->mh, BFI_MC_SFP, BFI_SFP_H2I_SHOW,
350551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_ioc_portid(sfp->ioc));
350651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
350751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	/* send mbox cmd */
350851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_ioc_mbox_queue(sfp->ioc, &sfp->mbcmd);
350951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
351051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
351151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
351251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	SFP is valid, read sfp data
351351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
351451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
351551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_getdata(struct bfa_sfp_s *sfp, enum bfi_sfp_mem_e memtype)
351651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
351751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg;
351851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
351951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	WARN_ON(sfp->lock != 0);
352051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->state);
352151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
352251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->lock = 1;
352351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->memtype = memtype;
352451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	req->memtype = memtype;
352551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
352651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	/* Setup SG list */
352751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_alen_set(&req->alen, sizeof(struct sfp_mem_s), sfp->dbuf_pa);
352851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
352951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_sfp_getdata_send(sfp);
353051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
353151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
353251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
35337826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati *	SFP scn handler
35347826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati */
35357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void
35367826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_sfp_scn(struct bfa_sfp_s *sfp, struct bfi_mbmsg_s *msg)
35377826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{
35387826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfi_sfp_scn_s *rsp = (struct bfi_sfp_scn_s *) msg;
35397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
35407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	switch (rsp->event) {
35417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_INSERTED:
35427826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->state = BFA_SFP_STATE_INSERTED;
35437826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->data_valid = 0;
35447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_sfp_scn_aen_post(sfp, rsp);
35457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
35467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_REMOVED:
35477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->state = BFA_SFP_STATE_REMOVED;
35487826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->data_valid = 0;
35497826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_sfp_scn_aen_post(sfp, rsp);
35507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		 break;
35517826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_FAILED:
35527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->state = BFA_SFP_STATE_FAILED;
35537826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->data_valid = 0;
35547826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_sfp_scn_aen_post(sfp, rsp);
35557826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
35567826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_UNSUPPORT:
35577826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->state = BFA_SFP_STATE_UNSUPPORT;
35587826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_sfp_scn_aen_post(sfp, rsp);
35597826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		if (!sfp->lock)
35607826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL);
35617826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
35627826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_POM:
35637826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_sfp_scn_aen_post(sfp, rsp);
35647826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
35657826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	case BFA_SFP_SCN_VALID:
35667826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		sfp->state = BFA_SFP_STATE_VALID;
35677826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		if (!sfp->lock)
35687826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL);
35697826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
35707826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	default:
35717826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_trc(sfp, rsp->event);
35727826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		WARN_ON(1);
35737826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	}
35747826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati}
35757826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
35767826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati/*
357751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * SFP show complete
357851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
357951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
358051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_show_comp(struct bfa_sfp_s *sfp, struct bfi_mbmsg_s *msg)
358151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
358251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfi_sfp_rsp_s *rsp = (struct bfi_sfp_rsp_s *) msg;
358351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
358451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (!sfp->lock) {
358551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		/*
358651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		 * receiving response after ioc failure
358751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		 */
358851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, sfp->lock);
358951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return;
359051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
359151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
359251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, rsp->status);
359351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (rsp->status == BFA_STATUS_OK) {
359451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->data_valid = 1;
359551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->state == BFA_SFP_STATE_VALID)
359651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->status = BFA_STATUS_OK;
359751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		else if (sfp->state == BFA_SFP_STATE_UNSUPPORT)
359851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->status = BFA_STATUS_SFP_UNSUPP;
359951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		else
360051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_trc(sfp, sfp->state);
360151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	} else {
360251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->data_valid = 0;
360351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->status = rsp->status;
360451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		/* sfpshow shouldn't change sfp state */
360551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
360651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
360751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->memtype);
360851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->memtype == BFI_SFP_MEM_DIAGEXT) {
360951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, sfp->data_valid);
361051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->data_valid) {
361151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			u32	size = sizeof(struct sfp_mem_s);
361251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			u8 *des = (u8 *) &(sfp->sfpmem->srlid_base);
361351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			memcpy(des, sfp->dbuf_kva, size);
361451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
361551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		/*
361651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		 * Queue completion callback.
361751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		 */
361851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_cb_sfp_show(sfp);
361951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	} else
362051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->lock = 0;
362151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
362251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->state_query_lock);
362351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->state_query_lock) {
362451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		sfp->state = rsp->state;
362551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		/* Complete callback */
362651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_cb_sfp_state_query(sfp);
362751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
362851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
362951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
363051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
363151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	SFP query fw sfp state
363251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
363351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
363451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_state_query(struct bfa_sfp_s *sfp)
363551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
363651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfi_sfp_req_s *req = (struct bfi_sfp_req_s *)sfp->mbcmd.msg;
363751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
363851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	/* Should not be doing query if not in _INIT state */
363951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	WARN_ON(sfp->state != BFA_SFP_STATE_INIT);
364051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	WARN_ON(sfp->state_query_lock != 0);
364151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_trc(sfp, sfp->state);
364251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
364351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->state_query_lock = 1;
364451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	req->memtype = 0;
364551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
364651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (!sfp->lock)
364751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_sfp_getdata(sfp, BFI_SFP_MEM_ALL);
364851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
364951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
365051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
365151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_media_get(struct bfa_sfp_s *sfp)
365251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
365351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	enum bfa_defs_sfp_media_e *media = sfp->media;
365451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
365551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	*media = BFA_SFP_MEDIA_UNKNOWN;
365651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
365751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->state == BFA_SFP_STATE_UNSUPPORT)
365851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		*media = BFA_SFP_MEDIA_UNSUPPORT;
365951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	else if (sfp->state == BFA_SFP_STATE_VALID) {
366051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		union sfp_xcvr_e10g_code_u e10g;
366151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		struct sfp_mem_s *sfpmem = (struct sfp_mem_s *)sfp->dbuf_kva;
366251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		u16 xmtr_tech = (sfpmem->srlid_base.xcvr[4] & 0x3) << 7 |
366351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati				(sfpmem->srlid_base.xcvr[5] >> 1);
366451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
366551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		e10g.b = sfpmem->srlid_base.xcvr[0];
366651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, e10g.b);
366751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, xmtr_tech);
366851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		/* check fc transmitter tech */
366951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if ((xmtr_tech & SFP_XMTR_TECH_CU) ||
367051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		    (xmtr_tech & SFP_XMTR_TECH_CP) ||
367151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		    (xmtr_tech & SFP_XMTR_TECH_CA))
367251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			*media = BFA_SFP_MEDIA_CU;
367351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		else if ((xmtr_tech & SFP_XMTR_TECH_EL_INTRA) ||
367451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			 (xmtr_tech & SFP_XMTR_TECH_EL_INTER))
367551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			*media = BFA_SFP_MEDIA_EL;
367651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		else if ((xmtr_tech & SFP_XMTR_TECH_LL) ||
367751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			 (xmtr_tech & SFP_XMTR_TECH_LC))
367851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			*media = BFA_SFP_MEDIA_LW;
367951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		else if ((xmtr_tech & SFP_XMTR_TECH_SL) ||
368051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			 (xmtr_tech & SFP_XMTR_TECH_SN) ||
368151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			 (xmtr_tech & SFP_XMTR_TECH_SA))
368251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			*media = BFA_SFP_MEDIA_SW;
368351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		/* Check 10G Ethernet Compilance code */
368498cdfb4347f5d38b97de2045d688e44e2a26ea42Jing Huang		else if (e10g.r.e10g_sr)
368551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			*media = BFA_SFP_MEDIA_SW;
368698cdfb4347f5d38b97de2045d688e44e2a26ea42Jing Huang		else if (e10g.r.e10g_lrm && e10g.r.e10g_lr)
368751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			*media = BFA_SFP_MEDIA_LW;
368898cdfb4347f5d38b97de2045d688e44e2a26ea42Jing Huang		else if (e10g.r.e10g_unall)
368951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			*media = BFA_SFP_MEDIA_UNKNOWN;
369051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		else
369151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_trc(sfp, 0);
369251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	} else
369351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, sfp->state);
369451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
369551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
369651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic bfa_status_t
369751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_speed_valid(struct bfa_sfp_s *sfp, enum bfa_port_speed portspeed)
369851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
369951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct sfp_mem_s *sfpmem = (struct sfp_mem_s *)sfp->dbuf_kva;
370051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct sfp_xcvr_s *xcvr = (struct sfp_xcvr_s *) sfpmem->srlid_base.xcvr;
370151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	union sfp_xcvr_fc3_code_u fc3 = xcvr->fc3;
370251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	union sfp_xcvr_e10g_code_u e10g = xcvr->e10g;
370351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
370451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (portspeed == BFA_PORT_SPEED_10GBPS) {
370551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (e10g.r.e10g_sr || e10g.r.e10g_lr)
370651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			return BFA_STATUS_OK;
370751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		else {
370851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_trc(sfp, e10g.b);
370951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			return BFA_STATUS_UNSUPP_SPEED;
371051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
371151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
371251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (((portspeed & BFA_PORT_SPEED_16GBPS) && fc3.r.mb1600) ||
371351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	    ((portspeed & BFA_PORT_SPEED_8GBPS) && fc3.r.mb800) ||
371451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	    ((portspeed & BFA_PORT_SPEED_4GBPS) && fc3.r.mb400) ||
371551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	    ((portspeed & BFA_PORT_SPEED_2GBPS) && fc3.r.mb200) ||
371651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	    ((portspeed & BFA_PORT_SPEED_1GBPS) && fc3.r.mb100))
371751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_OK;
371851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	else {
371951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, portspeed);
372051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, fc3.b);
372151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, e10g.b);
372251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_UNSUPP_SPEED;
372351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
372451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
372551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
372651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
372751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	SFP hmbox handler
372851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
372951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipativoid
373051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_intr(void *sfparg, struct bfi_mbmsg_s *msg)
373151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
373251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_sfp_s *sfp = sfparg;
373351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
373451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	switch (msg->mh.msg_id) {
373551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case BFI_SFP_I2H_SHOW:
373651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_sfp_show_comp(sfp, msg);
373751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		break;
373851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
373951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	case BFI_SFP_I2H_SCN:
37407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_sfp_scn(sfp, msg);
374151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		break;
374251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
374351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	default:
374451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, msg->mh.msg_id);
374551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		WARN_ON(1);
374651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
374751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
374851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
374951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
375051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	Return DMA memory needed by sfp module.
375151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
375251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatiu32
375351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_meminfo(void)
375451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
375551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return BFA_ROUNDUP(sizeof(struct sfp_mem_s), BFA_DMA_ALIGN_SZ);
375651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
375751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
375851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
375951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	Attach virtual and physical memory for SFP.
376051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
376151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipativoid
376251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_attach(struct bfa_sfp_s *sfp, struct bfa_ioc_s *ioc, void *dev,
376351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		struct bfa_trc_mod_s *trcmod)
376451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
376551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->dev = dev;
376651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->ioc = ioc;
376751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->trcmod = trcmod;
376851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
376951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->cbfn = NULL;
377051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->cbarg = NULL;
377151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->sfpmem = NULL;
377251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->lock = 0;
377351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->data_valid = 0;
377451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->state = BFA_SFP_STATE_INIT;
377551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->state_query_lock = 0;
377651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->state_query_cbfn = NULL;
377751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->state_query_cbarg = NULL;
377851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->media = NULL;
377951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->portspeed = BFA_PORT_SPEED_UNKNOWN;
378051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->is_elb = BFA_FALSE;
378151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
378251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_ioc_mbox_regisr(sfp->ioc, BFI_MC_SFP, bfa_sfp_intr, sfp);
378351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_q_qe_init(&sfp->ioc_notify);
378451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_ioc_notify_init(&sfp->ioc_notify, bfa_sfp_notify, sfp);
378551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	list_add_tail(&sfp->ioc_notify.qe, &sfp->ioc->notify_q);
378651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
378751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
378851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
378951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *	Claim Memory for SFP
379051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
379151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipativoid
379251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_memclaim(struct bfa_sfp_s *sfp, u8 *dm_kva, u64 dm_pa)
379351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
379451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->dbuf_kva   = dm_kva;
379551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->dbuf_pa    = dm_pa;
379651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	memset(sfp->dbuf_kva, 0, sizeof(struct sfp_mem_s));
379751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
379851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	dm_kva += BFA_ROUNDUP(sizeof(struct sfp_mem_s), BFA_DMA_ALIGN_SZ);
379951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	dm_pa += BFA_ROUNDUP(sizeof(struct sfp_mem_s), BFA_DMA_ALIGN_SZ);
380051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
380151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
380251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
380351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Show SFP eeprom content
380451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
380551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] sfp   - bfa sfp module
380651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
380751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[out] sfpmem - sfp eeprom data
380851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
380951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
381051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_status_t
381151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_show(struct bfa_sfp_s *sfp, struct sfp_mem_s *sfpmem,
381251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_cb_sfp_t cbfn, void *cbarg)
381351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
381451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
381551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (!bfa_ioc_is_operational(sfp->ioc)) {
381651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, 0);
381751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_IOC_NON_OP;
381851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
381951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
382051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->lock) {
382151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, 0);
382251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_DEVBUSY;
382351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
382451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
382551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->cbfn = cbfn;
382651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->cbarg = cbarg;
382751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->sfpmem = sfpmem;
382851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
382951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_sfp_getdata(sfp, BFI_SFP_MEM_DIAGEXT);
383051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return BFA_STATUS_OK;
383151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
383251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
383351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
383451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Return SFP Media type
383551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
383651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] sfp   - bfa sfp module
383751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
383851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[out] media - port speed from user
383951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
384051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
384151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_status_t
384251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_media(struct bfa_sfp_s *sfp, enum bfa_defs_sfp_media_e *media,
384351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_cb_sfp_t cbfn, void *cbarg)
384451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
384551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (!bfa_ioc_is_operational(sfp->ioc)) {
384651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, 0);
384751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_IOC_NON_OP;
384851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
384951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
385051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->media = media;
385151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->state == BFA_SFP_STATE_INIT) {
385251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->state_query_lock) {
385351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_trc(sfp, 0);
385451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			return BFA_STATUS_DEVBUSY;
385551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		} else {
385651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->state_query_cbfn = cbfn;
385751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->state_query_cbarg = cbarg;
385851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_sfp_state_query(sfp);
385951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			return BFA_STATUS_SFP_NOT_READY;
386051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
386151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
386251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
386351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_sfp_media_get(sfp);
386451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return BFA_STATUS_OK;
386551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
386651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
386751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati/*
386851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * Check if user set port speed is allowed by the SFP
386951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
387051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] sfp   - bfa sfp module
387151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati * @param[in] portspeed - port speed from user
387251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati *
387351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati */
387451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_status_t
387551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_sfp_speed(struct bfa_sfp_s *sfp, enum bfa_port_speed portspeed,
387651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_cb_sfp_t cbfn, void *cbarg)
387751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
387851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	WARN_ON(portspeed == BFA_PORT_SPEED_UNKNOWN);
387951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
388051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (!bfa_ioc_is_operational(sfp->ioc))
388151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_IOC_NON_OP;
388251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
388351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	/* For Mezz card, all speed is allowed */
388451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (bfa_mfg_is_mezz(sfp->ioc->attr->card_type))
388551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_OK;
388651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
388751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	/* Check SFP state */
388851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	sfp->portspeed = portspeed;
388951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->state == BFA_SFP_STATE_INIT) {
389051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		if (sfp->state_query_lock) {
389151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_trc(sfp, 0);
389251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			return BFA_STATUS_DEVBUSY;
389351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		} else {
389451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->state_query_cbfn = cbfn;
389551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			sfp->state_query_cbarg = cbarg;
389651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			bfa_sfp_state_query(sfp);
389751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati			return BFA_STATUS_SFP_NOT_READY;
389851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		}
389951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
390051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
390151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->state == BFA_SFP_STATE_REMOVED ||
390251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	    sfp->state == BFA_SFP_STATE_FAILED) {
390351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, sfp->state);
390451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_NO_SFP_DEV;
390551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
390651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
390751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->state == BFA_SFP_STATE_INSERTED) {
390851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		bfa_trc(sfp, sfp->state);
390951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_DEVBUSY;  /* sfp is reading data */
391051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	}
391151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
391251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	/* For eloopback, all speed is allowed */
391351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	if (sfp->is_elb)
391451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati		return BFA_STATUS_OK;
391551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
391651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	return bfa_sfp_speed_valid(sfp, portspeed);
391751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
39185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
39205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *	Flash module specific
39215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
39225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
39245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * FLASH DMA buffer should be big enough to hold both MFG block and
39255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * asic block(64k) at the same time and also should be 2k aligned to
39265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * avoid write segement to cross sector boundary.
39275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
39285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati#define BFA_FLASH_SEG_SZ	2048
39295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati#define BFA_FLASH_DMA_BUF_SZ	\
39305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	BFA_ROUNDUP(0x010000 + sizeof(struct bfa_mfg_block_s), BFA_FLASH_SEG_SZ)
39315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
39337826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatibfa_flash_aen_audit_post(struct bfa_ioc_s *ioc, enum bfa_audit_aen_event event,
39347826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			int inst, int type)
39357826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati{
39367826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfad_s *bfad = (struct bfad_s *)ioc->bfa->bfad;
39377826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	struct bfa_aen_entry_s  *aen_entry;
39387826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
39397826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_get_aen_entry(bfad, aen_entry);
39407826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	if (!aen_entry)
39417826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		return;
39427826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
39437826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.audit.pwwn = ioc->attr->pwwn;
39447826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.audit.partition_inst = inst;
39457826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	aen_entry->aen_data.audit.partition_type = type;
39467826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
39477826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	/* Send the AEN notification */
39487826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfad_im_post_vendor_event(aen_entry, bfad, ++ioc->ioc_aen_seq,
39497826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati				  BFA_AEN_CAT_AUDIT, event);
39507826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati}
39517826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati
39527826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipatistatic void
39535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_cb(struct bfa_flash_s *flash)
39545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
39555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->op_busy = 0;
39565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (flash->cbfn)
39575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		flash->cbfn(flash->cbarg, flash->status);
39585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
39595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
39615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_notify(void *cbarg, enum bfa_ioc_event_e event)
39625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
39635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_flash_s	*flash = cbarg;
39645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, event);
39665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	switch (event) {
39675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFA_IOC_E_DISABLED:
39685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFA_IOC_E_FAILED:
39695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		if (flash->op_busy) {
39705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->status = BFA_STATUS_IOC_FAILURE;
39715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->cbfn(flash->cbarg, flash->status);
39725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->op_busy = 0;
39735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		}
39745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
39755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	default:
39775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
39785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
39795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
39805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
39825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash attribute query request.
39835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
39845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
39855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
39865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
39875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_query_send(void *cbarg)
39885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
39895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_flash_s *flash = cbarg;
39905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfi_flash_query_req_s *msg =
39915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			(struct bfi_flash_query_req_s *) flash->mb.msg;
39925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
39935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_QUERY_REQ,
39945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_ioc_portid(flash->ioc));
39955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_alen_set(&msg->alen, sizeof(struct bfa_flash_attr_s),
39965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		flash->dbuf_pa);
39975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_ioc_mbox_queue(flash->ioc, &flash->mb);
39985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
39995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
40015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash write request.
40025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
40035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
40045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
40055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
40065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_write_send(struct bfa_flash_s *flash)
40075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
40085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfi_flash_write_req_s *msg =
40095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			(struct bfi_flash_write_req_s *) flash->mb.msg;
40105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	u32	len;
40115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->type = be32_to_cpu(flash->type);
40135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->instance = flash->instance;
40145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->offset = be32_to_cpu(flash->addr_off + flash->offset);
40155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	len = (flash->residue < BFA_FLASH_DMA_BUF_SZ) ?
40165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		flash->residue : BFA_FLASH_DMA_BUF_SZ;
40175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->length = be32_to_cpu(len);
40185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	/* indicate if it's the last msg of the whole write operation */
40205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->last = (len == flash->residue) ? 1 : 0;
40215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_WRITE_REQ,
40235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_ioc_portid(flash->ioc));
40245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_alen_set(&msg->alen, len, flash->dbuf_pa);
40255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	memcpy(flash->dbuf_kva, flash->ubuf + flash->offset, len);
40265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_ioc_mbox_queue(flash->ioc, &flash->mb);
40275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->residue -= len;
40295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->offset += len;
40305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
40315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
40335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash read request.
40345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
40355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
40365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
40375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
40385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_read_send(void *cbarg)
40395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
40405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_flash_s *flash = cbarg;
40415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfi_flash_read_req_s *msg =
40425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			(struct bfi_flash_read_req_s *) flash->mb.msg;
40435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	u32	len;
40445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->type = be32_to_cpu(flash->type);
40465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->instance = flash->instance;
40475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->offset = be32_to_cpu(flash->addr_off + flash->offset);
40485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	len = (flash->residue < BFA_FLASH_DMA_BUF_SZ) ?
40495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->residue : BFA_FLASH_DMA_BUF_SZ;
40505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->length = be32_to_cpu(len);
40515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_READ_REQ,
40525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_ioc_portid(flash->ioc));
40535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_alen_set(&msg->alen, len, flash->dbuf_pa);
40545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_ioc_mbox_queue(flash->ioc, &flash->mb);
40555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
40565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
40585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Send flash erase request.
40595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
40605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
40615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
40625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
40635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_erase_send(void *cbarg)
40645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
40655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_flash_s *flash = cbarg;
40665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfi_flash_erase_req_s *msg =
40675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			(struct bfi_flash_erase_req_s *) flash->mb.msg;
40685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->type = be32_to_cpu(flash->type);
40705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	msg->instance = flash->instance;
40715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_FLASH, BFI_FLASH_H2I_ERASE_REQ,
40725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_ioc_portid(flash->ioc));
40735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_ioc_mbox_queue(flash->ioc, &flash->mb);
40745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
40755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
40775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Process flash response messages upon receiving interrupts.
40785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
40795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flasharg - flash structure
40805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] msg - message structure
40815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
40825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
40835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_intr(void *flasharg, struct bfi_mbmsg_s *msg)
40845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
40855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_flash_s *flash = flasharg;
40865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	u32	status;
40875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	union {
40895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		struct bfi_flash_query_rsp_s *query;
40905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		struct bfi_flash_erase_rsp_s *erase;
40915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		struct bfi_flash_write_rsp_s *write;
40925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		struct bfi_flash_read_rsp_s *read;
40937826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		struct bfi_flash_event_s *event;
40945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		struct bfi_mbmsg_s   *msg;
40955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	} m;
40965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
40975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	m.msg = msg;
40985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, msg->mh.msg_id);
40995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
41005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (!flash->op_busy && msg->mh.msg_id != BFI_FLASH_I2H_EVENT) {
41015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		/* receiving response after ioc failure */
41025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, 0x9999);
41035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return;
41045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
41055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
41065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	switch (msg->mh.msg_id) {
41075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFI_FLASH_I2H_QUERY_RSP:
41085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		status = be32_to_cpu(m.query->status);
41095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, status);
41105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		if (status == BFA_STATUS_OK) {
41115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			u32	i;
41125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			struct bfa_flash_attr_s *attr, *f;
41135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
41145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			attr = (struct bfa_flash_attr_s *) flash->ubuf;
41155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			f = (struct bfa_flash_attr_s *) flash->dbuf_kva;
41165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			attr->status = be32_to_cpu(f->status);
41175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			attr->npart = be32_to_cpu(f->npart);
41185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_trc(flash, attr->status);
41195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_trc(flash, attr->npart);
41205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			for (i = 0; i < attr->npart; i++) {
41215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				attr->part[i].part_type =
41225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati					be32_to_cpu(f->part[i].part_type);
41235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				attr->part[i].part_instance =
41245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati					be32_to_cpu(f->part[i].part_instance);
41255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				attr->part[i].part_off =
41265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati					be32_to_cpu(f->part[i].part_off);
41275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				attr->part[i].part_size =
41285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati					be32_to_cpu(f->part[i].part_size);
41295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				attr->part[i].part_len =
41305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati					be32_to_cpu(f->part[i].part_len);
41315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				attr->part[i].part_status =
41325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati					be32_to_cpu(f->part[i].part_status);
41335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			}
41345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		}
41355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		flash->status = status;
41365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_flash_cb(flash);
41375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
41385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFI_FLASH_I2H_ERASE_RSP:
41395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		status = be32_to_cpu(m.erase->status);
41405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, status);
41415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		flash->status = status;
41425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_flash_cb(flash);
41435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
41445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFI_FLASH_I2H_WRITE_RSP:
41455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		status = be32_to_cpu(m.write->status);
41465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, status);
41475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		if (status != BFA_STATUS_OK || flash->residue == 0) {
41485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->status = status;
41495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_flash_cb(flash);
41505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		} else {
41515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_trc(flash, flash->offset);
41525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_flash_write_send(flash);
41535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		}
41545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
41555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFI_FLASH_I2H_READ_RSP:
41565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		status = be32_to_cpu(m.read->status);
41575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, status);
41585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		if (status != BFA_STATUS_OK) {
41595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->status = status;
41605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_flash_cb(flash);
41615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		} else {
41625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			u32 len = be32_to_cpu(m.read->length);
41635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_trc(flash, flash->offset);
41645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			bfa_trc(flash, len);
41655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			memcpy(flash->ubuf + flash->offset,
41665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				flash->dbuf_kva, len);
41675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->residue -= len;
41685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			flash->offset += len;
41695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			if (flash->residue == 0) {
41705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				flash->status = status;
41715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				bfa_flash_cb(flash);
41725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			} else
41735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati				bfa_flash_read_send(flash);
41745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		}
41755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
41765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFI_FLASH_I2H_BOOT_VER_RSP:
41777826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		break;
41785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	case BFI_FLASH_I2H_EVENT:
41797826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		status = be32_to_cpu(m.event->status);
41807826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		bfa_trc(flash, status);
41817826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		if (status == BFA_STATUS_BAD_FWCFG)
41827826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			bfa_ioc_aen_post(flash->ioc, BFA_IOC_AEN_FWCFG_ERROR);
41837826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		else if (status == BFA_STATUS_INVALID_VENDOR) {
41847826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			u32 param;
41857826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			param = be32_to_cpu(m.event->param);
41867826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			bfa_trc(flash, param);
41877826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati			bfa_ioc_aen_post(flash->ioc,
41887826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati				BFA_IOC_AEN_INVALID_VENDOR);
41897826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati		}
41905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		break;
41915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
41925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	default:
41935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		WARN_ON(1);
41945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
41955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
41965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
41975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
41985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Flash memory info API.
41995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
42005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] mincfg - minimal cfg variable
42015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
42025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatiu32
42035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_meminfo(bfa_boolean_t mincfg)
42045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
42055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	/* min driver doesn't need flash */
42065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (mincfg)
42075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return 0;
42085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return BFA_ROUNDUP(BFA_FLASH_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
42095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
42105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
42125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Flash attach API.
42135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
42145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure
42155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] ioc  - ioc structure
42165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] dev  - device structure
42175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] trcmod - trace module
42185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] logmod - log module
42195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
42205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipativoid
42215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_attach(struct bfa_flash_s *flash, struct bfa_ioc_s *ioc, void *dev,
42225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg)
42235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
42245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->ioc = ioc;
42255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->trcmod = trcmod;
42265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbfn = NULL;
42275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbarg = NULL;
42285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->op_busy = 0;
42295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_ioc_mbox_regisr(flash->ioc, BFI_MC_FLASH, bfa_flash_intr, flash);
42315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_q_qe_init(&flash->ioc_notify);
42325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_ioc_notify_init(&flash->ioc_notify, bfa_flash_notify, flash);
42335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	list_add_tail(&flash->ioc_notify.qe, &flash->ioc->notify_q);
42345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	/* min driver doesn't need flash */
42365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (mincfg) {
42375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		flash->dbuf_kva = NULL;
42385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		flash->dbuf_pa = 0;
42395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
42405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
42415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
42435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Claim memory for flash
42445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
42455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure
42465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] dm_kva - pointer to virtual memory address
42475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] dm_pa - physical memory address
42485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] mincfg - minimal cfg variable
42495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
42505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipativoid
42515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_memclaim(struct bfa_flash_s *flash, u8 *dm_kva, u64 dm_pa,
42525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_boolean_t mincfg)
42535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
42545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (mincfg)
42555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return;
42565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->dbuf_kva = dm_kva;
42585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->dbuf_pa = dm_pa;
42595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	memset(flash->dbuf_kva, 0, BFA_FLASH_DMA_BUF_SZ);
42605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	dm_kva += BFA_ROUNDUP(BFA_FLASH_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
42615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	dm_pa += BFA_ROUNDUP(BFA_FLASH_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
42625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
42635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
42655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Get flash attribute.
42665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
42675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure
42685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] attr - flash attribute structure
42695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function
42705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
42715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
42725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status.
42735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
42745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t
42755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_get_attr(struct bfa_flash_s *flash, struct bfa_flash_attr_s *attr,
42765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_cb_flash_t cbfn, void *cbarg)
42775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
42785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, BFI_FLASH_H2I_QUERY_REQ);
42795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (!bfa_ioc_is_operational(flash->ioc))
42815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
42825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (flash->op_busy) {
42845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, flash->op_busy);
42855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_DEVBUSY;
42865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
42875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->op_busy = 1;
42895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbfn = cbfn;
42905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbarg = cbarg;
42915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->ubuf = (u8 *) attr;
42925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_flash_query_send(flash);
42935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return BFA_STATUS_OK;
42955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
42965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
42975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
42985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Erase flash partition.
42995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
43005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure
43015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] type - flash partition type
43025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] instance - flash partition instance
43035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function
43045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
43055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
43065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status.
43075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
43085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t
43095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_erase_part(struct bfa_flash_s *flash, enum bfa_flash_part_type type,
43105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		u8 instance, bfa_cb_flash_t cbfn, void *cbarg)
43115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
43125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, BFI_FLASH_H2I_ERASE_REQ);
43135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, type);
43145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, instance);
43155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (!bfa_ioc_is_operational(flash->ioc))
43175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
43185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (flash->op_busy) {
43205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, flash->op_busy);
43215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_DEVBUSY;
43225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
43235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->op_busy = 1;
43255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbfn = cbfn;
43265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbarg = cbarg;
43275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->type = type;
43285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->instance = instance;
43295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_flash_erase_send(flash);
43317826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati	bfa_flash_aen_audit_post(flash->ioc, BFA_AUDIT_AEN_FLASH_ERASE,
43327826f304b1efa5ab839cf029742290f51c4fa009Krishna Gudipati				instance, type);
43335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return BFA_STATUS_OK;
43345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
43355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
43375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Update flash partition.
43385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
43395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure
43405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] type - flash partition type
43415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] instance - flash partition instance
43425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] buf - update data buffer
43435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] len - data buffer length
43445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] offset - offset relative to the partition starting address
43455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function
43465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
43475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
43485a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status.
43495a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
43505a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t
43515a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_update_part(struct bfa_flash_s *flash, enum bfa_flash_part_type type,
43525a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		u8 instance, void *buf, u32 len, u32 offset,
43535a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_cb_flash_t cbfn, void *cbarg)
43545a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
43555a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, BFI_FLASH_H2I_WRITE_REQ);
43565a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, type);
43575a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, instance);
43585a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, len);
43595a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, offset);
43605a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43615a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (!bfa_ioc_is_operational(flash->ioc))
43625a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
43635a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43645a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	/*
43655a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	 * 'len' must be in word (4-byte) boundary
43665a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	 * 'offset' must be in sector (16kb) boundary
43675a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	 */
43685a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (!len || (len & 0x03) || (offset & 0x00003FFF))
43695a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_FLASH_BAD_LEN;
43705a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43715a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (type == BFA_FLASH_PART_MFG)
43725a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_EINVAL;
43735a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43745a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (flash->op_busy) {
43755a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, flash->op_busy);
43765a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_DEVBUSY;
43775a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
43785a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43795a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->op_busy = 1;
43805a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbfn = cbfn;
43815a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbarg = cbarg;
43825a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->type = type;
43835a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->instance = instance;
43845a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->residue = len;
43855a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->offset = 0;
43865a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->addr_off = offset;
43875a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->ubuf = buf;
43885a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43895a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_flash_write_send(flash);
43905a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return BFA_STATUS_OK;
43915a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
43925a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
43935a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati/*
43945a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Read flash partition.
43955a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
43965a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] flash - flash structure
43975a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] type - flash partition type
43985a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] instance - flash partition instance
43995a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] buf - read data buffer
44005a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] len - data buffer length
44015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] offset - offset relative to the partition starting address
44025a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbfn - callback function
44035a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * @param[in] cbarg - callback argument
44045a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati *
44055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati * Return status.
44065a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati */
44075a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_status_t
44085a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_flash_read_part(struct bfa_flash_s *flash, enum bfa_flash_part_type type,
44095a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		u8 instance, void *buf, u32 len, u32 offset,
44105a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_cb_flash_t cbfn, void *cbarg)
44115a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
44125a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, BFI_FLASH_H2I_READ_REQ);
44135a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, type);
44145a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, instance);
44155a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, len);
44165a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_trc(flash, offset);
44175a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
44185a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (!bfa_ioc_is_operational(flash->ioc))
44195a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
44205a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
44215a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	/*
44225a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	 * 'len' must be in word (4-byte) boundary
44235a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	 * 'offset' must be in sector (16kb) boundary
44245a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	 */
44255a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (!len || (len & 0x03) || (offset & 0x00003FFF))
44265a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_FLASH_BAD_LEN;
44275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
44285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	if (flash->op_busy) {
44295a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		bfa_trc(flash, flash->op_busy);
44305a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati		return BFA_STATUS_DEVBUSY;
44315a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	}
44325a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
44335a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->op_busy = 1;
44345a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbfn = cbfn;
44355a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->cbarg = cbarg;
44365a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->type = type;
44375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->instance = instance;
44385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->residue = len;
44395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->offset = 0;
44405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->addr_off = offset;
44415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	flash->ubuf = buf;
44425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_flash_read_send(flash);
44435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
44445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	return BFA_STATUS_OK;
44455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
44463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
44483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *	DIAG module specific
44493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
44503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati#define BFA_DIAG_MEMTEST_TOV	50000	/* memtest timeout in msec */
4452bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati#define CT2_BFA_DIAG_MEMTEST_TOV	(9*30*1000)  /* 4.5 min */
44533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/* IOC event handler */
44553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
44563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_notify(void *diag_arg, enum bfa_ioc_event_e event)
44573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
44583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_diag_s *diag = diag_arg;
44593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, event);
44613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, diag->block);
44623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, diag->fwping.lock);
44633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, diag->tsensor.lock);
44643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	switch (event) {
44663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case BFA_IOC_E_DISABLED:
44673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case BFA_IOC_E_FAILED:
44683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		if (diag->fwping.lock) {
44693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.status = BFA_STATUS_IOC_FAILURE;
44703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.cbfn(diag->fwping.cbarg,
44713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati					diag->fwping.status);
44723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.lock = 0;
44733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		}
44743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		if (diag->tsensor.lock) {
44763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->tsensor.status = BFA_STATUS_IOC_FAILURE;
44773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->tsensor.cbfn(diag->tsensor.cbarg,
44783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati					   diag->tsensor.status);
44793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->tsensor.lock = 0;
44803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		}
44813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		if (diag->block) {
44833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			if (diag->timer_active) {
44843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfa_timer_stop(&diag->timer);
44853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				diag->timer_active = 0;
44863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			}
44873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->status = BFA_STATUS_IOC_FAILURE;
44893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->cbfn(diag->cbarg, diag->status);
44903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->block = 0;
44913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		}
44923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
44933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	default:
44953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
44963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
44973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
44983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
44993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
45003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_memtest_done(void *cbarg)
45013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
45023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_diag_s *diag = cbarg;
45033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_ioc_s  *ioc = diag->ioc;
45043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_diag_memtest_result *res = diag->result;
45053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	u32	loff = BFI_BOOT_MEMTEST_RES_ADDR;
45063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	u32	pgnum, pgoff, i;
45073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	pgnum = PSS_SMEM_PGNUM(ioc->ioc_regs.smem_pg0, loff);
45093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	pgoff = PSS_SMEM_PGOFF(loff);
45103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	writel(pgnum, ioc->ioc_regs.host_page_num_fn);
45123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	for (i = 0; i < (sizeof(struct bfa_diag_memtest_result) /
45143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			 sizeof(u32)); i++) {
45153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		/* read test result from smem */
45163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		*((u32 *) res + i) =
45173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			bfa_mem_read(ioc->ioc_regs.smem_page_start, loff);
45183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		loff += sizeof(u32);
45193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
45203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Reset IOC fwstates to BFI_IOC_UNINIT */
45223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_reset_fwstate(ioc);
45233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	res->status = swab32(res->status);
45253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, res->status);
45263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (res->status == BFI_BOOT_MEMTEST_RES_SIG)
45283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->status = BFA_STATUS_OK;
45293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	else {
45303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->status = BFA_STATUS_MEMTEST_FAILED;
45313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		res->addr = swab32(res->addr);
45323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		res->exp = swab32(res->exp);
45333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		res->act = swab32(res->act);
45343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		res->err_status = swab32(res->err_status);
45353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		res->err_status1 = swab32(res->err_status1);
45363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		res->err_addr = swab32(res->err_addr);
45373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, res->addr);
45383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, res->exp);
45393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, res->act);
45403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, res->err_status);
45413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, res->err_status1);
45423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, res->err_addr);
45433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
45443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->timer_active = 0;
45453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->cbfn(diag->cbarg, diag->status);
45463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->block = 0;
45473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
45483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
45503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Firmware ping
45513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
45523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
45543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Perform DMA test directly
45553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
45563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
45573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_fwping_send(struct bfa_diag_s *diag)
45583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
45593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfi_diag_fwping_req_s *fwping_req;
45603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	u32	i;
45613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, diag->fwping.dbuf_pa);
45633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* fill DMA area with pattern */
45653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	for (i = 0; i < (BFI_DIAG_DMA_BUF_SZ >> 2); i++)
45663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		*((u32 *)diag->fwping.dbuf_kva + i) = diag->fwping.data;
45673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Fill mbox msg */
45693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	fwping_req = (struct bfi_diag_fwping_req_s *)diag->fwping.mbcmd.msg;
45703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Setup SG list */
45723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_alen_set(&fwping_req->alen, BFI_DIAG_DMA_BUF_SZ,
45733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.dbuf_pa);
45743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Set up dma count */
45753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	fwping_req->count = cpu_to_be32(diag->fwping.count);
45763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Set up data pattern */
45773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	fwping_req->data = diag->fwping.data;
45783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* build host command */
45803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfi_h2i_set(fwping_req->mh, BFI_MC_DIAG, BFI_DIAG_H2I_FWPING,
45813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_ioc_portid(diag->ioc));
45823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* send mbox cmd */
45843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_mbox_queue(diag->ioc, &diag->fwping.mbcmd);
45853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
45863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
45883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_fwping_comp(struct bfa_diag_s *diag,
45893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		 struct bfi_diag_fwping_rsp_s *diag_rsp)
45903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
45913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	u32	rsp_data = diag_rsp->data;
45923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	u8	rsp_dma_status = diag_rsp->dma_status;
45933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, rsp_data);
45953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, rsp_dma_status);
45963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
45973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (rsp_dma_status == BFA_STATUS_OK) {
45983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		u32	i, pat;
45993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		pat = (diag->fwping.count & 0x1) ? ~(diag->fwping.data) :
46003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.data;
46013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		/* Check mbox data */
46023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		if (diag->fwping.data != rsp_data) {
46033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			bfa_trc(diag, rsp_data);
46043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.result->dmastatus =
46053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati					BFA_STATUS_DATACORRUPTED;
46063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.status = BFA_STATUS_DATACORRUPTED;
46073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.cbfn(diag->fwping.cbarg,
46083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati					diag->fwping.status);
46093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->fwping.lock = 0;
46103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			return;
46113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		}
46123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		/* Check dma pattern */
46133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		for (i = 0; i < (BFI_DIAG_DMA_BUF_SZ >> 2); i++) {
46143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			if (*((u32 *)diag->fwping.dbuf_kva + i) != pat) {
46153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfa_trc(diag, i);
46163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfa_trc(diag, pat);
46173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				bfa_trc(diag,
46183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati					*((u32 *)diag->fwping.dbuf_kva + i));
46193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				diag->fwping.result->dmastatus =
46203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati						BFA_STATUS_DATACORRUPTED;
46213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				diag->fwping.status = BFA_STATUS_DATACORRUPTED;
46223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				diag->fwping.cbfn(diag->fwping.cbarg,
46233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati						diag->fwping.status);
46243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				diag->fwping.lock = 0;
46253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				return;
46263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			}
46273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		}
46283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->fwping.result->dmastatus = BFA_STATUS_OK;
46293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->fwping.status = BFA_STATUS_OK;
46303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->fwping.cbfn(diag->fwping.cbarg, diag->fwping.status);
46313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->fwping.lock = 0;
46323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	} else {
46333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->fwping.status = BFA_STATUS_HDMA_FAILED;
46343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->fwping.cbfn(diag->fwping.cbarg, diag->fwping.status);
46353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->fwping.lock = 0;
46363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
46373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
46383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
46393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
46403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Temperature Sensor
46413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
46423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
46433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
46443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_tempsensor_send(struct bfa_diag_s *diag)
46453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
46463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfi_diag_ts_req_s *msg;
46473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
46483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg = (struct bfi_diag_ts_req_s *)diag->tsensor.mbcmd.msg;
46493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, msg->temp);
46503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* build host command */
46513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_DIAG, BFI_DIAG_H2I_TEMPSENSOR,
46523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_ioc_portid(diag->ioc));
46533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* send mbox cmd */
46543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_mbox_queue(diag->ioc, &diag->tsensor.mbcmd);
46553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
46563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
46573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
46583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_tempsensor_comp(struct bfa_diag_s *diag, bfi_diag_ts_rsp_t *rsp)
46593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
46603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (!diag->tsensor.lock) {
46613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		/* receiving response after ioc failure */
46623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, diag->tsensor.lock);
46633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return;
46643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
46653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
46663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/*
46673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	 * ASIC junction tempsensor is a reg read operation
46683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	 * it will always return OK
46693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	 */
46703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.temp->temp = be16_to_cpu(rsp->temp);
46713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.temp->ts_junc = rsp->ts_junc;
46723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.temp->ts_brd = rsp->ts_brd;
46733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.temp->status = BFA_STATUS_OK;
46743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
46753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (rsp->ts_brd) {
46763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		if (rsp->status == BFA_STATUS_OK) {
46773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->tsensor.temp->brd_temp =
46783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati				be16_to_cpu(rsp->brd_temp);
46793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		} else {
46803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			bfa_trc(diag, rsp->status);
46813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->tsensor.temp->brd_temp = 0;
46823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			diag->tsensor.temp->status = BFA_STATUS_DEVBUSY;
46833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		}
46843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
46853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, rsp->ts_junc);
46863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, rsp->temp);
46873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, rsp->ts_brd);
46883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, rsp->brd_temp);
46893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.cbfn(diag->tsensor.cbarg, diag->tsensor.status);
46903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.lock = 0;
46913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
46923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
46933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
46943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *	LED Test command
46953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
46963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
46973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_ledtest_send(struct bfa_diag_s *diag, struct bfa_diag_ledtest_s *ledtest)
46983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
46993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfi_diag_ledtest_req_s  *msg;
47003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg = (struct bfi_diag_ledtest_req_s *)diag->ledtest.mbcmd.msg;
47023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* build host command */
47033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_DIAG, BFI_DIAG_H2I_LEDTEST,
47043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati			bfa_ioc_portid(diag->ioc));
47053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/*
47073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	 * convert the freq from N blinks per 10 sec to
47083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	 * crossbow ontime value. We do it here because division is need
47093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	 */
47103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (ledtest->freq)
47113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		ledtest->freq = 500 / ledtest->freq;
47123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (ledtest->freq == 0)
47143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		ledtest->freq = 1;
47153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, ledtest->freq);
47173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* mcpy(&ledtest_req->req, ledtest, sizeof(bfa_diag_ledtest_t)); */
47183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg->cmd = (u8) ledtest->cmd;
47193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg->color = (u8) ledtest->color;
47203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg->portid = bfa_ioc_portid(diag->ioc);
47213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg->led = ledtest->led;
47223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg->freq = cpu_to_be16(ledtest->freq);
47233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* send mbox cmd */
47253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_mbox_queue(diag->ioc, &diag->ledtest.mbcmd);
47263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
47273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
47298919678eaaa2988000ff79341e42b656d5ca009bKrishna Gudipatidiag_ledtest_comp(struct bfa_diag_s *diag, struct bfi_diag_ledtest_rsp_s *msg)
47303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
47313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, diag->ledtest.lock);
47323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->ledtest.lock = BFA_FALSE;
47333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* no bfa_cb_queue is needed because driver is not waiting */
47343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
47353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
47373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Port beaconing
47383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
47393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
47403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_portbeacon_send(struct bfa_diag_s *diag, bfa_boolean_t beacon, u32 sec)
47413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
47423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfi_diag_portbeacon_req_s *msg;
47433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg = (struct bfi_diag_portbeacon_req_s *)diag->beacon.mbcmd.msg;
47453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* build host command */
47463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_DIAG, BFI_DIAG_H2I_PORTBEACON,
47473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_ioc_portid(diag->ioc));
47483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg->beacon = beacon;
47493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	msg->period = cpu_to_be32(sec);
47503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* send mbox cmd */
47513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_mbox_queue(diag->ioc, &diag->beacon.mbcmd);
47523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
47533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
47553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatidiag_portbeacon_comp(struct bfa_diag_s *diag)
47563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
47573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, diag->beacon.state);
47583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->beacon.state = BFA_FALSE;
47593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->cbfn_beacon)
47603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->cbfn_beacon(diag->dev, BFA_FALSE, diag->beacon.link_e2e);
47613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
47623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
47643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *	Diag hmbox handler
47653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
47663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipativoid
47673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_intr(void *diagarg, struct bfi_mbmsg_s *msg)
47683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
47693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_diag_s *diag = diagarg;
47703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	switch (msg->mh.msg_id) {
47723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case BFI_DIAG_I2H_PORTBEACON:
47733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag_portbeacon_comp(diag);
47743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
47753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case BFI_DIAG_I2H_FWPING:
47763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag_fwping_comp(diag, (struct bfi_diag_fwping_rsp_s *) msg);
47773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
47783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case BFI_DIAG_I2H_TEMPSENSOR:
47793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag_tempsensor_comp(diag, (bfi_diag_ts_rsp_t *) msg);
47803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
47813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	case BFI_DIAG_I2H_LEDTEST:
47823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag_ledtest_comp(diag, (struct bfi_diag_ledtest_rsp_s *) msg);
47833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		break;
47843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	default:
47853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, msg->mh.msg_id);
47863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		WARN_ON(1);
47873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
47883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
47893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
47903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
47913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Gen RAM Test
47923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
47933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *diag           - diag data struct
47943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *memtest        - mem test params input from upper layer,
47953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] pattern         - mem test pattern
47963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *result         - mem test result
47973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] cbfn            - mem test callback functioin
47983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] cbarg           - callback functioin arg
47993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
48003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[out]
48013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
48023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t
48033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_memtest(struct bfa_diag_s *diag, struct bfa_diag_memtest_s *memtest,
48043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		u32 pattern, struct bfa_diag_memtest_result *result,
48053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_cb_diag_t cbfn, void *cbarg)
48063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
4807bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	u32	memtest_tov;
4808bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati
48093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, pattern);
48103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (!bfa_ioc_adapter_is_disabled(diag->ioc))
48123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_ADAPTER_ENABLED;
48133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* check to see if there is another destructive diag cmd running */
48153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->block) {
48163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, diag->block);
48173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_DEVBUSY;
48183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	} else
48193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->block = 1;
48203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->result = result;
48223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->cbfn = cbfn;
48233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->cbarg = cbarg;
48243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* download memtest code and take LPU0 out of reset */
48263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_boot(diag->ioc, BFI_FWBOOT_TYPE_MEMTEST, BFI_FWBOOT_ENV_OS);
48273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
4828bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati	memtest_tov = (bfa_ioc_asic_gen(diag->ioc) == BFI_ASIC_GEN_CT2) ?
4829bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati		       CT2_BFA_DIAG_MEMTEST_TOV : BFA_DIAG_MEMTEST_TOV;
48303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_timer_begin(diag->ioc->timer_mod, &diag->timer,
4831bd5a026019bc1f799065b0a39230d1f81bb4ff76Krishna Gudipati			bfa_diag_memtest_done, diag, memtest_tov);
48323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->timer_active = 1;
48333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return BFA_STATUS_OK;
48343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
48353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
48373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * DIAG firmware ping command
48383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
48393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *diag           - diag data struct
48403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] cnt             - dma loop count for testing PCIE
48413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] data            - data pattern to pass in fw
48423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *result         - pt to bfa_diag_fwping_result_t data struct
48433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] cbfn            - callback function
48443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *cbarg          - callback functioin arg
48453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
48463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[out]
48473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
48483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t
48493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_fwping(struct bfa_diag_s *diag, u32 cnt, u32 data,
48503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		struct bfa_diag_results_fwping *result, bfa_cb_diag_t cbfn,
48513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		void *cbarg)
48523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
48533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, cnt);
48543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, data);
48553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (!bfa_ioc_is_operational(diag->ioc))
48573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_IOC_NON_OP;
48583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (bfa_asic_id_ct2(bfa_ioc_devid((diag->ioc))) &&
48603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	    ((diag->ioc)->clscode == BFI_PCIFN_CLASS_ETH))
48613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_CMD_NOTSUPP;
48623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* check to see if there is another destructive diag cmd running */
48643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->block || diag->fwping.lock) {
48653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, diag->block);
48663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, diag->fwping.lock);
48673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_DEVBUSY;
48683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
48693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Initialization */
48713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.lock = 1;
48723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.cbfn = cbfn;
48733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.cbarg = cbarg;
48743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.result = result;
48753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.data = data;
48763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.count = cnt;
48773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Init test results */
48793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.result->data = 0;
48803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.result->status = BFA_STATUS_OK;
48813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* kick off the first ping */
48833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag_fwping_send(diag);
48843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return BFA_STATUS_OK;
48853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
48863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
48873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
48883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Read Temperature Sensor
48893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
48903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *diag           - diag data struct
48913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *result         - pt to bfa_diag_temp_t data struct
48923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] cbfn            - callback function
48933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *cbarg          - callback functioin arg
48943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
48953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[out]
48963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
48973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t
48983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_tsensor_query(struct bfa_diag_s *diag,
48993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		struct bfa_diag_results_tempsensor_s *result,
49003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_cb_diag_t cbfn, void *cbarg)
49013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
49023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* check to see if there is a destructive diag cmd running */
49033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->block || diag->tsensor.lock) {
49043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, diag->block);
49053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_trc(diag, diag->tsensor.lock);
49063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_DEVBUSY;
49073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	}
49083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (!bfa_ioc_is_operational(diag->ioc))
49103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_IOC_NON_OP;
49113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Init diag mod params */
49133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.lock = 1;
49143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.temp = result;
49153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.cbfn = cbfn;
49163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->tsensor.cbarg = cbarg;
49173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Send msg to fw */
49193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag_tempsensor_send(diag);
49203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return BFA_STATUS_OK;
49223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
49233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
49253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * LED Test command
49263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
49273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *diag           - diag data struct
49283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *ledtest        - pt to ledtest data structure
49293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
49303d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[out]
49313d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
49323d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t
49333d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_ledtest(struct bfa_diag_s *diag, struct bfa_diag_ledtest_s *ledtest)
49343d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
49353d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, ledtest->cmd);
49363d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49373d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (!bfa_ioc_is_operational(diag->ioc))
49383d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_IOC_NON_OP;
49393d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49403d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->beacon.state)
49413d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_BEACON_ON;
49423d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49433d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->ledtest.lock)
49443d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_LEDTEST_OP;
49453d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Send msg to fw */
49473d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->ledtest.lock = BFA_TRUE;
49483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag_ledtest_send(diag, ledtest);
49493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return BFA_STATUS_OK;
49513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
49523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
49543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Port beaconing command
49553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
49563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] *diag           - diag data struct
49573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] beacon          - port beaconing 1:ON   0:OFF
49583d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] link_e2e_beacon - link beaconing 1:ON   0:OFF
49593d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[in] sec             - beaconing duration in seconds
49603d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *
49613d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *   @param[out]
49623d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
49633d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_status_t
49643d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_beacon_port(struct bfa_diag_s *diag, bfa_boolean_t beacon,
49653d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		bfa_boolean_t link_e2e_beacon, uint32_t sec)
49663d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
49673d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, beacon);
49683d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, link_e2e_beacon);
49693d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_trc(diag, sec);
49703d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49713d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (!bfa_ioc_is_operational(diag->ioc))
49723d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_IOC_NON_OP;
49733d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49743d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->ledtest.lock)
49753d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_LEDTEST_OP;
49763d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49773d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->beacon.state && beacon)       /* beacon alread on */
49783d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		return BFA_STATUS_BEACON_ON;
49793d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49803d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->beacon.state	= beacon;
49813d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->beacon.link_e2e	= link_e2e_beacon;
49823d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	if (diag->cbfn_beacon)
49833d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati		diag->cbfn_beacon(diag->dev, beacon, link_e2e_beacon);
49843d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49853d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	/* Send msg to fw */
49863d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag_portbeacon_send(diag, beacon, sec);
49873d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49883d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return BFA_STATUS_OK;
49893d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
49903d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
49913d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
49923d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati * Return DMA memory needed by diag module.
49933d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
49943d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatiu32
49953d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_meminfo(void)
49963d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
49973d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	return BFA_ROUNDUP(BFI_DIAG_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
49983d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
49993d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
50003d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati/*
50013d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati *	Attach virtual and physical memory for Diag.
50023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati */
50033d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipativoid
50043d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_attach(struct bfa_diag_s *diag, struct bfa_ioc_s *ioc, void *dev,
50053d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_cb_diag_beacon_t cbfn_beacon, struct bfa_trc_mod_s *trcmod)
50063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
50073d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->dev = dev;
50083d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->ioc = ioc;
50093d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->trcmod = trcmod;
50103d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
50113d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->block = 0;
50123d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->cbfn = NULL;
50133d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->cbarg = NULL;
50143d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->result = NULL;
50153d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->cbfn_beacon = cbfn_beacon;
50163d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
50173d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_mbox_regisr(diag->ioc, BFI_MC_DIAG, bfa_diag_intr, diag);
50183d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_q_qe_init(&diag->ioc_notify);
50193d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_ioc_notify_init(&diag->ioc_notify, bfa_diag_notify, diag);
50203d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	list_add_tail(&diag->ioc_notify.qe, &diag->ioc->notify_q);
50213d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
50223d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
50233d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipativoid
50243d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_diag_memclaim(struct bfa_diag_s *diag, u8 *dm_kva, u64 dm_pa)
50253d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
50263d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.dbuf_kva = dm_kva;
50273d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	diag->fwping.dbuf_pa = dm_pa;
50283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	memset(diag->fwping.dbuf_kva, 0, BFI_DIAG_DMA_BUF_SZ);
50293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
50303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
50323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *	PHY module specific
50333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
50343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati#define BFA_PHY_DMA_BUF_SZ	0x02000         /* 8k dma buffer */
50353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati#define BFA_PHY_LOCK_STATUS	0x018878        /* phy semaphore status reg */
50363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void
50383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_ntoh32(u32 *obuf, u32 *ibuf, int sz)
50393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
50403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	int i, m = sz >> 2;
50413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	for (i = 0; i < m; i++)
50433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		obuf[i] = be32_to_cpu(ibuf[i]);
50443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
50453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic bfa_boolean_t
50473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_present(struct bfa_phy_s *phy)
50483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
50493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return (phy->ioc->attr->card_type == BFA_MFG_TYPE_LIGHTNING);
50503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
50513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void
50533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_notify(void *cbarg, enum bfa_ioc_event_e event)
50543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
50553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_phy_s *phy = cbarg;
50563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, event);
50583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	switch (event) {
50603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case BFA_IOC_E_DISABLED:
50613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case BFA_IOC_E_FAILED:
50623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		if (phy->op_busy) {
50633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->status = BFA_STATUS_IOC_FAILURE;
50643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->cbfn(phy->cbarg, phy->status);
50653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->op_busy = 0;
50663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		}
50673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
50683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	default:
50703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
50713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
50723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
50733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
50753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy attribute query request.
50763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
50773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
50783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
50793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void
50803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_query_send(void *cbarg)
50813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
50823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_phy_s *phy = cbarg;
50833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfi_phy_query_req_s *msg =
50843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfi_phy_query_req_s *) phy->mb.msg;
50853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->instance = phy->instance;
50873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_QUERY_REQ,
50883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_ioc_portid(phy->ioc));
50893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_alen_set(&msg->alen, sizeof(struct bfa_phy_attr_s), phy->dbuf_pa);
50903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_ioc_mbox_queue(phy->ioc, &phy->mb);
50913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
50923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
50933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
50943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy write request.
50953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
50963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
50973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
50983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void
50993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_write_send(void *cbarg)
51003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
51013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_phy_s *phy = cbarg;
51023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfi_phy_write_req_s *msg =
51033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfi_phy_write_req_s *) phy->mb.msg;
51043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	u32	len;
51053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	u16	*buf, *dbuf;
51063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	int	i, sz;
51073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->instance = phy->instance;
51093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->offset = cpu_to_be32(phy->addr_off + phy->offset);
51103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	len = (phy->residue < BFA_PHY_DMA_BUF_SZ) ?
51113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->residue : BFA_PHY_DMA_BUF_SZ;
51123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->length = cpu_to_be32(len);
51133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	/* indicate if it's the last msg of the whole write operation */
51153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->last = (len == phy->residue) ? 1 : 0;
51163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_WRITE_REQ,
51183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_ioc_portid(phy->ioc));
51193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_alen_set(&msg->alen, len, phy->dbuf_pa);
51203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	buf = (u16 *) (phy->ubuf + phy->offset);
51223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	dbuf = (u16 *)phy->dbuf_kva;
51233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	sz = len >> 1;
51243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	for (i = 0; i < sz; i++)
51253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		buf[i] = cpu_to_be16(dbuf[i]);
51263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_ioc_mbox_queue(phy->ioc, &phy->mb);
51283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->residue -= len;
51303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->offset += len;
51313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
51323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
51343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy read request.
51353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
51363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
51373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
51383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void
51393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_read_send(void *cbarg)
51403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
51413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_phy_s *phy = cbarg;
51423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfi_phy_read_req_s *msg =
51433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfi_phy_read_req_s *) phy->mb.msg;
51443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	u32	len;
51453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->instance = phy->instance;
51473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->offset = cpu_to_be32(phy->addr_off + phy->offset);
51483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	len = (phy->residue < BFA_PHY_DMA_BUF_SZ) ?
51493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->residue : BFA_PHY_DMA_BUF_SZ;
51503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->length = cpu_to_be32(len);
51513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_READ_REQ,
51523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_ioc_portid(phy->ioc));
51533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_alen_set(&msg->alen, len, phy->dbuf_pa);
51543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_ioc_mbox_queue(phy->ioc, &phy->mb);
51553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
51563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
51583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Send phy stats request.
51593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
51603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
51613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
51623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void
51633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_stats_send(void *cbarg)
51643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
51653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_phy_s *phy = cbarg;
51663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfi_phy_stats_req_s *msg =
51673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			(struct bfi_phy_stats_req_s *) phy->mb.msg;
51683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	msg->instance = phy->instance;
51703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfi_h2i_set(msg->mh, BFI_MC_PHY, BFI_PHY_H2I_STATS_REQ,
51713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_ioc_portid(phy->ioc));
51723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_alen_set(&msg->alen, sizeof(struct bfa_phy_stats_s), phy->dbuf_pa);
51733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_ioc_mbox_queue(phy->ioc, &phy->mb);
51743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
51753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
51773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Flash memory info API.
51783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
51793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] mincfg - minimal cfg variable
51803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
51813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatiu32
51823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_meminfo(bfa_boolean_t mincfg)
51833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
51843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	/* min driver doesn't need phy */
51853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (mincfg)
51863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return 0;
51873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return BFA_ROUNDUP(BFA_PHY_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
51893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
51903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
51913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
51923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Flash attach API.
51933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
51943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure
51953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] ioc  - ioc structure
51963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] dev  - device structure
51973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] trcmod - trace module
51983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] logmod - log module
51993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
52003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipativoid
52013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_attach(struct bfa_phy_s *phy, struct bfa_ioc_s *ioc, void *dev,
52023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfa_trc_mod_s *trcmod, bfa_boolean_t mincfg)
52033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
52043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->ioc = ioc;
52053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->trcmod = trcmod;
52063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbfn = NULL;
52073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbarg = NULL;
52083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->op_busy = 0;
52093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_ioc_mbox_regisr(phy->ioc, BFI_MC_PHY, bfa_phy_intr, phy);
52113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_q_qe_init(&phy->ioc_notify);
52123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_ioc_notify_init(&phy->ioc_notify, bfa_phy_notify, phy);
52133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	list_add_tail(&phy->ioc_notify.qe, &phy->ioc->notify_q);
52143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	/* min driver doesn't need phy */
52163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (mincfg) {
52173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		phy->dbuf_kva = NULL;
52183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		phy->dbuf_pa = 0;
52193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
52203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
52213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
52233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Claim memory for phy
52243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
52253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure
52263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] dm_kva - pointer to virtual memory address
52273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] dm_pa - physical memory address
52283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] mincfg - minimal cfg variable
52293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
52303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipativoid
52313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_memclaim(struct bfa_phy_s *phy, u8 *dm_kva, u64 dm_pa,
52323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_boolean_t mincfg)
52333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
52343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (mincfg)
52353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return;
52363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->dbuf_kva = dm_kva;
52383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->dbuf_pa = dm_pa;
52393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	memset(phy->dbuf_kva, 0, BFA_PHY_DMA_BUF_SZ);
52403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	dm_kva += BFA_ROUNDUP(BFA_PHY_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
52413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	dm_pa += BFA_ROUNDUP(BFA_PHY_DMA_BUF_SZ, BFA_DMA_ALIGN_SZ);
52423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
52433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_boolean_t
52453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_busy(struct bfa_ioc_s *ioc)
52463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
52473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	void __iomem	*rb;
52483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	rb = bfa_ioc_bar0(ioc);
52503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return readl(rb + BFA_PHY_LOCK_STATUS);
52513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
52523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
52543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Get phy attribute.
52553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
52563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure
52573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] attr - phy attribute structure
52583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function
52593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
52603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
52613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status.
52623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
52633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t
52643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_get_attr(struct bfa_phy_s *phy, u8 instance,
52653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfa_phy_attr_s *attr, bfa_cb_phy_t cbfn, void *cbarg)
52663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
52673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, BFI_PHY_H2I_QUERY_REQ);
52683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, instance);
52693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_phy_present(phy))
52713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_PHY_NOT_PRESENT;
52723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_ioc_is_operational(phy->ioc))
52743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
52753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (phy->op_busy || bfa_phy_busy(phy->ioc)) {
52773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, phy->op_busy);
52783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_DEVBUSY;
52793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
52803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->op_busy = 1;
52823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbfn = cbfn;
52833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbarg = cbarg;
52843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->instance = instance;
52853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->ubuf = (uint8_t *) attr;
52863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_phy_query_send(phy);
52873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return BFA_STATUS_OK;
52893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
52903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
52913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
52923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Get phy stats.
52933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
52943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure
52953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] instance - phy image instance
52963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] stats - pointer to phy stats
52973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function
52983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
52993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
53003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status.
53013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
53023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t
53033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_get_stats(struct bfa_phy_s *phy, u8 instance,
53043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfa_phy_stats_s *stats,
53053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_cb_phy_t cbfn, void *cbarg)
53063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
53073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, BFI_PHY_H2I_STATS_REQ);
53083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, instance);
53093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_phy_present(phy))
53113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_PHY_NOT_PRESENT;
53123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_ioc_is_operational(phy->ioc))
53143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
53153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (phy->op_busy || bfa_phy_busy(phy->ioc)) {
53173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, phy->op_busy);
53183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_DEVBUSY;
53193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
53203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->op_busy = 1;
53223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbfn = cbfn;
53233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbarg = cbarg;
53243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->instance = instance;
53253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->ubuf = (u8 *) stats;
53263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_phy_stats_send(phy);
53273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return BFA_STATUS_OK;
53293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
53303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
53323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Update phy image.
53333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
53343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure
53353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] instance - phy image instance
53363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] buf - update data buffer
53373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] len - data buffer length
53383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] offset - offset relative to starting address
53393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function
53403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
53413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
53423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status.
53433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
53443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t
53453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_update(struct bfa_phy_s *phy, u8 instance,
53463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		void *buf, u32 len, u32 offset,
53473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_cb_phy_t cbfn, void *cbarg)
53483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
53493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, BFI_PHY_H2I_WRITE_REQ);
53503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, instance);
53513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, len);
53523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, offset);
53533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_phy_present(phy))
53553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_PHY_NOT_PRESENT;
53563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_ioc_is_operational(phy->ioc))
53583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
53593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	/* 'len' must be in word (4-byte) boundary */
53613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!len || (len & 0x03))
53623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_FAILED;
53633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (phy->op_busy || bfa_phy_busy(phy->ioc)) {
53653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, phy->op_busy);
53663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_DEVBUSY;
53673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
53683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->op_busy = 1;
53703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbfn = cbfn;
53713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbarg = cbarg;
53723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->instance = instance;
53733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->residue = len;
53743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->offset = 0;
53753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->addr_off = offset;
53763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->ubuf = buf;
53773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_phy_write_send(phy);
53793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return BFA_STATUS_OK;
53803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
53813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
53823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
53833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Read phy image.
53843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
53853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phy - phy structure
53863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] instance - phy image instance
53873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] buf - read data buffer
53883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] len - data buffer length
53893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] offset - offset relative to starting address
53903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbfn - callback function
53913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] cbarg - callback argument
53923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
53933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Return status.
53943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
53953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_status_t
53963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_read(struct bfa_phy_s *phy, u8 instance,
53973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		void *buf, u32 len, u32 offset,
53983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_cb_phy_t cbfn, void *cbarg)
53993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
54003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, BFI_PHY_H2I_READ_REQ);
54013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, instance);
54023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, len);
54033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, offset);
54043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_phy_present(phy))
54063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_PHY_NOT_PRESENT;
54073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!bfa_ioc_is_operational(phy->ioc))
54093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_IOC_NON_OP;
54103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	/* 'len' must be in word (4-byte) boundary */
54123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!len || (len & 0x03))
54133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_FAILED;
54143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (phy->op_busy || bfa_phy_busy(phy->ioc)) {
54163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, phy->op_busy);
54173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return BFA_STATUS_DEVBUSY;
54183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
54193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->op_busy = 1;
54213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbfn = cbfn;
54223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->cbarg = cbarg;
54233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->instance = instance;
54243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->residue = len;
54253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->offset = 0;
54263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->addr_off = offset;
54273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	phy->ubuf = buf;
54283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_phy_read_send(phy);
54293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	return BFA_STATUS_OK;
54313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
54323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati/*
54343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * Process phy response messages upon receiving interrupts.
54353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati *
54363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] phyarg - phy structure
54373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati * @param[in] msg - message structure
54383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati */
54393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipativoid
54403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_phy_intr(void *phyarg, struct bfi_mbmsg_s *msg)
54413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
54423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_phy_s *phy = phyarg;
54433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	u32	status;
54443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	union {
54463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfi_phy_query_rsp_s *query;
54473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfi_phy_stats_rsp_s *stats;
54483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfi_phy_write_rsp_s *write;
54493350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfi_phy_read_rsp_s *read;
54503350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		struct bfi_mbmsg_s   *msg;
54513350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	} m;
54523350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54533350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	m.msg = msg;
54543350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_trc(phy, msg->mh.msg_id);
54553350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54563350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	if (!phy->op_busy) {
54573350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		/* receiving response after ioc failure */
54583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, 0x9999);
54593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		return;
54603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
54613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	switch (msg->mh.msg_id) {
54633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case BFI_PHY_I2H_QUERY_RSP:
54643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		status = be32_to_cpu(m.query->status);
54653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, status);
54663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		if (status == BFA_STATUS_OK) {
54683350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			struct bfa_phy_attr_s *attr =
54693350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				(struct bfa_phy_attr_s *) phy->ubuf;
54703350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_phy_ntoh32((u32 *)attr, (u32 *)phy->dbuf_kva,
54713350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati					sizeof(struct bfa_phy_attr_s));
54723350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_trc(phy, attr->status);
54733350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_trc(phy, attr->length);
54743350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		}
54753350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54763350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		phy->status = status;
54773350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		phy->op_busy = 0;
54783350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		if (phy->cbfn)
54793350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->cbfn(phy->cbarg, phy->status);
54803350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
54813350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case BFI_PHY_I2H_STATS_RSP:
54823350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		status = be32_to_cpu(m.stats->status);
54833350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, status);
54843350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54853350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		if (status == BFA_STATUS_OK) {
54863350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			struct bfa_phy_stats_s *stats =
54873350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				(struct bfa_phy_stats_s *) phy->ubuf;
54883350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_phy_ntoh32((u32 *)stats, (u32 *)phy->dbuf_kva,
54893350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				sizeof(struct bfa_phy_stats_s));
54903350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				bfa_trc(phy, stats->status);
54913350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		}
54923350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
54933350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		phy->status = status;
54943350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		phy->op_busy = 0;
54953350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		if (phy->cbfn)
54963350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->cbfn(phy->cbarg, phy->status);
54973350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
54983350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case BFI_PHY_I2H_WRITE_RSP:
54993350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		status = be32_to_cpu(m.write->status);
55003350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, status);
55013350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
55023350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		if (status != BFA_STATUS_OK || phy->residue == 0) {
55033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->status = status;
55043350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->op_busy = 0;
55053350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			if (phy->cbfn)
55063350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				phy->cbfn(phy->cbarg, phy->status);
55073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		} else {
55083350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_trc(phy, phy->offset);
55093350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_phy_write_send(phy);
55103350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		}
55113350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
55123350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	case BFI_PHY_I2H_READ_RSP:
55133350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		status = be32_to_cpu(m.read->status);
55143350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		bfa_trc(phy, status);
55153350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
55163350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		if (status != BFA_STATUS_OK) {
55173350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->status = status;
55183350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->op_busy = 0;
55193350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			if (phy->cbfn)
55203350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				phy->cbfn(phy->cbarg, phy->status);
55213350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		} else {
55223350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			u32 len = be32_to_cpu(m.read->length);
55233350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			u16 *buf = (u16 *)(phy->ubuf + phy->offset);
55243350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			u16 *dbuf = (u16 *)phy->dbuf_kva;
55253350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			int i, sz = len >> 1;
55263350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
55273350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_trc(phy, phy->offset);
55283350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			bfa_trc(phy, len);
55293350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
55303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			for (i = 0; i < sz; i++)
55313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				buf[i] = be16_to_cpu(dbuf[i]);
55323350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
55333350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->residue -= len;
55343350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			phy->offset += len;
55353350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
55363350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			if (phy->residue == 0) {
55373350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				phy->status = status;
55383350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				phy->op_busy = 0;
55393350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				if (phy->cbfn)
55403350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati					phy->cbfn(phy->cbarg, phy->status);
55413350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			} else
55423350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati				bfa_phy_read_send(phy);
55433350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		}
55443350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		break;
55453350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	default:
55463350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati		WARN_ON(1);
55473350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	}
55483350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
554945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
555045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
555145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati *	DCONF module specific
555245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
555345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
555445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna GudipatiBFA_MODULE(dconf);
555545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
555645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
555745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * DCONF state machine events
555845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
555945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatienum bfa_dconf_event {
556045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	BFA_DCONF_SM_INIT		= 1,	/* dconf Init */
556145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	BFA_DCONF_SM_FLASH_COMP		= 2,	/* read/write to flash */
556245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	BFA_DCONF_SM_WR			= 3,	/* binding change, map */
556345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	BFA_DCONF_SM_TIMEOUT		= 4,	/* Start timer */
556445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	BFA_DCONF_SM_EXIT		= 5,	/* exit dconf module */
556545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	BFA_DCONF_SM_IOCDISABLE		= 6,	/* IOC disable event */
556645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati};
556745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
556845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/* forward declaration of DCONF state machine */
556945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_uninit(struct bfa_dconf_mod_s *dconf,
557045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				enum bfa_dconf_event event);
557145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_flash_read(struct bfa_dconf_mod_s *dconf,
557245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				enum bfa_dconf_event event);
557345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_ready(struct bfa_dconf_mod_s *dconf,
557445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				enum bfa_dconf_event event);
557545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_dirty(struct bfa_dconf_mod_s *dconf,
557645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				enum bfa_dconf_event event);
557745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_sync(struct bfa_dconf_mod_s *dconf,
557845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				enum bfa_dconf_event event);
557945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_final_sync(struct bfa_dconf_mod_s *dconf,
558045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				enum bfa_dconf_event event);
558145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_sm_iocdown_dirty(struct bfa_dconf_mod_s *dconf,
558245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				enum bfa_dconf_event event);
558345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
558445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_cbfn(void *dconf, bfa_status_t status);
558545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_timer(void *cbarg);
558645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic bfa_status_t bfa_dconf_flash_write(struct bfa_dconf_mod_s *dconf);
558745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_init_cb(void *arg, bfa_status_t status);
558845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
558945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
559045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Begining state of dconf module. Waiting for an event to start.
559145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
559245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
559345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_uninit(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event)
559445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
559545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_status_t bfa_status;
559645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, event);
559745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
559845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	switch (event) {
559945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_INIT:
560045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		if (dconf->min_cfg) {
560145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_trc(dconf->bfa, dconf->min_cfg);
5602db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati			bfa_fsm_send_event(&dconf->bfa->iocfc,
5603db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati					IOCFC_E_DCONF_DONE);
560445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			return;
560545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		}
560645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_flash_read);
5607db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_timer_start(dconf->bfa, &dconf->timer,
5608db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati			bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV);
560945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_status = bfa_flash_read_part(BFA_FLASH(dconf->bfa),
561045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati					BFA_FLASH_PART_DRV, dconf->instance,
561145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati					dconf->dconf,
561245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati					sizeof(struct bfa_dconf_s), 0,
561345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati					bfa_dconf_init_cb, dconf->bfa);
561445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		if (bfa_status != BFA_STATUS_OK) {
5615db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati			bfa_timer_stop(&dconf->timer);
561645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_dconf_init_cb(dconf->bfa, BFA_STATUS_FAILED);
561745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_sm_set_state(dconf, bfa_dconf_sm_uninit);
561845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			return;
561945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		}
562045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
562145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_EXIT:
5622db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE);
562345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_IOCDISABLE:
562445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_WR:
562545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_FLASH_COMP:
562645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
562745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	default:
562845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_fault(dconf->bfa, event);
562945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
563045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
563145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
563245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
563345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Read flash for dconf entries and make a call back to the driver once done.
563445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
563545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
563645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_flash_read(struct bfa_dconf_mod_s *dconf,
563745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			enum bfa_dconf_event event)
563845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
563945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, event);
564045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
564145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	switch (event) {
564245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_FLASH_COMP:
5643db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_timer_stop(&dconf->timer);
564445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_ready);
564545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
564645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_TIMEOUT:
564745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_ready);
5648db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_IOC_FAILED);
564945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
565045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_EXIT:
5651db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_timer_stop(&dconf->timer);
5652db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_uninit);
5653db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE);
5654db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		break;
565545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_IOCDISABLE:
5656db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_timer_stop(&dconf->timer);
565745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_uninit);
565845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
565945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	default:
566045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_fault(dconf->bfa, event);
566145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
566245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
566345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
566445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
566545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * DCONF Module is in ready state. Has completed the initialization.
566645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
566745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
566845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_ready(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event)
566945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
567045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, event);
567145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
567245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	switch (event) {
567345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_WR:
567445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_start(dconf->bfa, &dconf->timer,
567545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV);
567645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_dirty);
567745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
567845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_EXIT:
567945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_uninit);
5680db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE);
568145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
568245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_INIT:
568345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_IOCDISABLE:
568445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
568545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	default:
568645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_fault(dconf->bfa, event);
568745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
568845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
568945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
569045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
569145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * entries are dirty, write back to the flash.
569245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
569345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
569445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
569545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_dirty(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event)
569645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
569745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, event);
569845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
569945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	switch (event) {
570045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_TIMEOUT:
570145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_sync);
570245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_dconf_flash_write(dconf);
570345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
570445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_WR:
570545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_stop(&dconf->timer);
570645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_start(dconf->bfa, &dconf->timer,
570745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV);
570845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
570945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_EXIT:
571045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_stop(&dconf->timer);
571145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_start(dconf->bfa, &dconf->timer,
571245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV);
571345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_final_sync);
571445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_dconf_flash_write(dconf);
571545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
571645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_FLASH_COMP:
571745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
571845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_IOCDISABLE:
571945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_stop(&dconf->timer);
572045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_iocdown_dirty);
572145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
572245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	default:
572345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_fault(dconf->bfa, event);
572445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
572545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
572645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
572745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
572845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Sync the dconf entries to the flash.
572945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
573045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
573145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_final_sync(struct bfa_dconf_mod_s *dconf,
573245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			enum bfa_dconf_event event)
573345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
573445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, event);
573545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
573645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	switch (event) {
573745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_IOCDISABLE:
573845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_FLASH_COMP:
573945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_stop(&dconf->timer);
574045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_TIMEOUT:
574145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_uninit);
5742db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE);
574345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
574445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	default:
574545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_fault(dconf->bfa, event);
574645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
574745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
574845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
574945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
575045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_sync(struct bfa_dconf_mod_s *dconf, enum bfa_dconf_event event)
575145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
575245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, event);
575345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
575445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	switch (event) {
575545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_FLASH_COMP:
575645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_ready);
575745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
575845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_WR:
575945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_start(dconf->bfa, &dconf->timer,
576045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV);
576145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_dirty);
576245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
576345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_EXIT:
576445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_start(dconf->bfa, &dconf->timer,
576545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV);
576645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_final_sync);
576745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
576845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_IOCDISABLE:
576945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_iocdown_dirty);
577045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
577145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	default:
577245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_fault(dconf->bfa, event);
577345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
577445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
577545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
577645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
577745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_sm_iocdown_dirty(struct bfa_dconf_mod_s *dconf,
577845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			enum bfa_dconf_event event)
577945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
578045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, event);
578145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
578245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	switch (event) {
578345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_INIT:
578445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_timer_start(dconf->bfa, &dconf->timer,
578545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_dconf_timer, dconf, BFA_DCONF_UPDATE_TOV);
578645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_dirty);
578745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
578845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_EXIT:
578945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_set_state(dconf, bfa_dconf_sm_uninit);
5790db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati		bfa_fsm_send_event(&dconf->bfa->iocfc, IOCFC_E_DCONF_DONE);
579145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
579245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	case BFA_DCONF_SM_IOCDISABLE:
579345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		break;
579445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	default:
579545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_sm_fault(dconf->bfa, event);
579645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
579745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
579845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
579945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati/*
580045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati * Compute and return memory needed by DRV_CFG module.
580145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati */
580245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
580345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo,
580445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		  struct bfa_s *bfa)
580545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
580645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_mem_kva_s *dconf_kva = BFA_MEM_DCONF_KVA(bfa);
580745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
580845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (cfg->drvcfg.min_cfg)
580945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_mem_kva_setup(meminfo, dconf_kva,
581045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				sizeof(struct bfa_dconf_hdr_s));
581145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	else
581245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_mem_kva_setup(meminfo, dconf_kva,
581345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				sizeof(struct bfa_dconf_s));
581445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
581545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
581645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
581745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
581845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		struct bfa_pcidev_s *pcidev)
581945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
582045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa);
582145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
582245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	dconf->bfad = bfad;
582345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	dconf->bfa = bfa;
582445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	dconf->instance = bfa->ioc.port_id;
582545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(bfa, dconf->instance);
582645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
582745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	dconf->dconf = (struct bfa_dconf_s *) bfa_mem_kva_curp(dconf);
582845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (cfg->drvcfg.min_cfg) {
582945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_mem_kva_curp(dconf) += sizeof(struct bfa_dconf_hdr_s);
583045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		dconf->min_cfg = BFA_TRUE;
583145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	} else {
583245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		dconf->min_cfg = BFA_FALSE;
583345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_mem_kva_curp(dconf) += sizeof(struct bfa_dconf_s);
583445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
583545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
583645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_dconf_read_data_valid(bfa) = BFA_FALSE;
583745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_sm_set_state(dconf, bfa_dconf_sm_uninit);
583845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
583945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
584045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
584145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_init_cb(void *arg, bfa_status_t status)
584245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
584345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_s *bfa = arg;
584445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa);
584545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
5846db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati	bfa_sm_send_event(dconf, BFA_DCONF_SM_FLASH_COMP);
584745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (status == BFA_STATUS_OK) {
584845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_dconf_read_data_valid(bfa) = BFA_TRUE;
584945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		if (dconf->dconf->hdr.signature != BFI_DCONF_SIGNATURE)
585045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			dconf->dconf->hdr.signature = BFI_DCONF_SIGNATURE;
585145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		if (dconf->dconf->hdr.version != BFI_DCONF_VERSION)
585245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			dconf->dconf->hdr.version = BFI_DCONF_VERSION;
585345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
5854db9d8a75afd9dbd32c80d12d6033eca3336ef4f2Krishna Gudipati	bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_DCONF_DONE);
585545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
585645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
585745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipativoid
585845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_modinit(struct bfa_s *bfa)
585945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
586045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa);
586145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_sm_send_event(dconf, BFA_DCONF_SM_INIT);
586245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
586345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
586445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_start(struct bfa_s *bfa)
586545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
586645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
586745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
586845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
586945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_stop(struct bfa_s *bfa)
587045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
587145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
587245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
587345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void bfa_dconf_timer(void *cbarg)
587445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
587545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = cbarg;
587645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_sm_send_event(dconf, BFA_DCONF_SM_TIMEOUT);
587745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
587845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
587945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_iocdisable(struct bfa_s *bfa)
588045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
588145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa);
588245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_sm_send_event(dconf, BFA_DCONF_SM_IOCDISABLE);
588345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
588445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
588545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
588645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_detach(struct bfa_s *bfa)
588745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
588845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
588945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
589045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic bfa_status_t
589145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_flash_write(struct bfa_dconf_mod_s *dconf)
589245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
589345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_status_t bfa_status;
589445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, 0);
589545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
589645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_status = bfa_flash_update_part(BFA_FLASH(dconf->bfa),
589745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				BFA_FLASH_PART_DRV, dconf->instance,
589845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				dconf->dconf,  sizeof(struct bfa_dconf_s), 0,
589945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				bfa_dconf_cbfn, dconf);
590045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (bfa_status != BFA_STATUS_OK)
590145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		WARN_ON(bfa_status);
590245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, bfa_status);
590345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
590445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	return bfa_status;
590545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
590645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
590745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_status_t
590845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_update(struct bfa_s *bfa)
590945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
591045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa);
591145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_trc(dconf->bfa, 0);
591245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (bfa_sm_cmp_state(dconf, bfa_dconf_sm_iocdown_dirty))
591345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		return BFA_STATUS_FAILED;
591445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
591545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (dconf->min_cfg) {
591645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_trc(dconf->bfa, dconf->min_cfg);
591745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		return BFA_STATUS_FAILED;
591845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
591945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
592045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_sm_send_event(dconf, BFA_DCONF_SM_WR);
592145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	return BFA_STATUS_OK;
592245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
592345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
592445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatistatic void
592545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_cbfn(void *arg, bfa_status_t status)
592645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
592745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = arg;
592845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	WARN_ON(status);
592945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_sm_send_event(dconf, BFA_DCONF_SM_FLASH_COMP);
593045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
593145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati
593245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipativoid
593345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_dconf_modexit(struct bfa_s *bfa)
593445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
593545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	struct bfa_dconf_mod_s *dconf = BFA_DCONF_MOD(bfa);
593645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_sm_send_event(dconf, BFA_DCONF_SM_EXIT);
593745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
5938