bfa_core.c revision d37779f8d98a1d7c5ba904982958167d988f01dd
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"
19a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfa_modules.h"
20a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#include "bfi_ctreg.h"
217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
22a36c61f9025b8924f99f54d518763bee7aa84085Krishna GudipatiBFA_TRC_FILE(HAL, CORE);
237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
245fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
25b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang * BFA module list terminated by NULL
26b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang */
27b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangstatic struct bfa_module_s *hal_mods[] = {
28b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_sgpg,
29b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_fcport,
30b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_fcxp,
31b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_lps,
32b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_uf,
33b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_rport,
34b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_fcpim,
35b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL
36b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang};
37b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
38b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang/*
39b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang * Message handlers for various modules.
40b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang */
41b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangstatic bfa_isr_func_t  bfa_isrs[BFI_MC_MAX] = {
42b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* NONE */
43b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOC */
44b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_DIAG */
45b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_FLASH */
46b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_CEE */
47b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_fcport_isr,		/* BFI_MC_FCPORT */
48b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOCFC */
49b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_LL */
50b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_uf_isr,		/* BFI_MC_UF */
51b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_fcxp_isr,		/* BFI_MC_FCXP */
52b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_lps_isr,		/* BFI_MC_LPS */
53b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_rport_isr,		/* BFI_MC_RPORT */
54b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_itnim_isr,		/* BFI_MC_ITNIM */
55b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOIM_READ */
56b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOIM_WRITE */
57b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOIM_IO */
58b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_ioim_isr,		/* BFI_MC_IOIM */
59b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_ioim_good_comp_isr,	/* BFI_MC_IOIM_IOCOM */
60b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_tskim_isr,		/* BFI_MC_TSKIM */
61b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_SBOOT */
62b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IPFC */
63b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_PORT */
64b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
65b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
66b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
67b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
68b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
69b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
70b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
71b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
72b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
73b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
74b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang};
75b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang/*
76b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang * Message handlers for mailbox command classes
77b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang */
78b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangstatic bfa_ioc_mbox_mcfunc_t  bfa_mbox_isrs[BFI_MC_MAX] = {
79b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,
80b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_IOC   */
81b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_DIAG  */
82b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_FLASH */
83b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_CEE   */
84b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_PORT  */
85b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_iocfc_isr,	/* BFI_MC_IOCFC */
86b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,
87b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang};
88b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
89b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
90b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
91b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangstatic void
92b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangbfa_com_port_attach(struct bfa_s *bfa, struct bfa_meminfo_s *mi)
93b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang{
94b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	struct bfa_port_s	*port = &bfa->modules.port;
95b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	u32			dm_len;
96b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	u8			*dm_kva;
97b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	u64			dm_pa;
98b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
99b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	dm_len = bfa_port_meminfo();
100b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	dm_kva = bfa_meminfo_dma_virt(mi);
101b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	dm_pa  = bfa_meminfo_dma_phys(mi);
102b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
103b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	memset(port, 0, sizeof(struct bfa_port_s));
104b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_port_attach(port, &bfa->ioc, bfa, bfa->trcmod);
105b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_port_mem_claim(port, dm_kva, dm_pa);
106b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
107b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_meminfo_dma_virt(mi) = dm_kva + dm_len;
108b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_meminfo_dma_phys(mi) = dm_pa + dm_len;
109b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang}
110b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
111b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang/*
112a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA IOC FC related definitions
113a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
114a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1155fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
116a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC local definitions
117a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
118a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOCFC_TOV		5000	/* msecs */
119a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
120a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum {
121a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_NONE	= 0,
122a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_INIT	= 1,
123a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_STOP	= 2,
124a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_DISABLE	= 3,
125a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
126a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
127a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_FABRICS		1
128a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_LPORTS		256
129a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_CQS			4
130a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_IOIM_REQS		(BFA_IOIM_MAX)
131a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_TSKIM_REQS		128
132a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_FCXP_REQS		64
133a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_UF_BUFS		64
134a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_RPORTS		1024
135a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_ITNIMS		(DEF_CFG_NUM_RPORTS)
136a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_TINS		256
137a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
138a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_SGPGS		2048
139a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_REQQ_ELEMS		256
140a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_RSPQ_ELEMS		64
141a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_SBOOT_TGTS		16
142a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_SBOOT_LUNS		16
143a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1445fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for IOC FC functions
146a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status);
148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_disable_cbfn(void *bfa_arg);
149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_hbfail_cbfn(void *bfa_arg);
150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_reset_cbfn(void *bfa_arg);
151a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct bfa_ioc_cbfn_s bfa_iocfc_cbfn;
152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1535fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA Interrupt handling functions
155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_reqq_resume(struct bfa_s *bfa, int qid)
158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *waitq, *qe, *qen;
160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_reqq_wait_s *wqe;
161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	waitq = bfa_reqq(bfa, qid);
163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, waitq) {
1645fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Callback only as long as there is room in request queue
166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_reqq_full(bfa, qid))
168a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_del(qe);
171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wqe = (struct bfa_reqq_wait_s *) qe;
172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wqe->qresume(wqe->cbarg);
173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_msix_all(struct bfa_s *bfa, int vec)
178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_intx(bfa);
180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
182a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t
183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_intx(struct bfa_s *bfa)
184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 intr, qintr;
186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int queue;
187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1885344026065f79b102fcc44bc6332f856a111962aJing Huang	intr = readl(bfa->iocfc.bfa_regs.intr_status);
189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!intr)
190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_FALSE;
191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1925fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * RME completion queue interrupt
194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	qintr = intr & __HFN_INT_RME_MASK;
1965344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(qintr, bfa->iocfc.bfa_regs.intr_status);
197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (queue = 0; queue < BFI_IOC_MAX_CQS_ASIC; queue++) {
199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (intr & (__HFN_INT_RME_Q0 << queue))
200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_msix_rspq(bfa, queue & (BFI_IOC_MAX_CQS - 1));
201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	intr &= ~qintr;
203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!intr)
204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_TRUE;
205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * CPE completion queue interrupt
208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	qintr = intr & __HFN_INT_CPE_MASK;
2105344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(qintr, bfa->iocfc.bfa_regs.intr_status);
211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
212a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (queue = 0; queue < BFI_IOC_MAX_CQS_ASIC; queue++) {
213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (intr & (__HFN_INT_CPE_Q0 << queue))
214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_msix_reqq(bfa, queue & (BFI_IOC_MAX_CQS - 1));
215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	intr &= ~qintr;
217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!intr)
218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_TRUE;
219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_msix_lpu_err(bfa, intr);
221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_isr_enable(struct bfa_s *bfa)
227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 intr_unmask;
229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int pci_func = bfa_ioc_pcifn(&bfa->ioc);
230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, pci_func);
232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_msix_install(bfa);
234a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	intr_unmask = (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 |
235a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		       __HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS |
236a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		       __HFN_INT_LL_HALT);
237a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
238a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (pci_func == 0)
239a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		intr_unmask |= (__HFN_INT_CPE_Q0 | __HFN_INT_CPE_Q1 |
240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_CPE_Q2 | __HFN_INT_CPE_Q3 |
241a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_RME_Q0 | __HFN_INT_RME_Q1 |
242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_RME_Q2 | __HFN_INT_RME_Q3 |
243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_MBOX_LPU0);
244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else
245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		intr_unmask |= (__HFN_INT_CPE_Q4 | __HFN_INT_CPE_Q5 |
246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_CPE_Q6 | __HFN_INT_CPE_Q7 |
247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_RME_Q4 | __HFN_INT_RME_Q5 |
248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_RME_Q6 | __HFN_INT_RME_Q7 |
249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				__HFN_INT_MBOX_LPU1);
250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2515344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(intr_unmask, bfa->iocfc.bfa_regs.intr_status);
2525344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(~intr_unmask, bfa->iocfc.bfa_regs.intr_mask);
253a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.intr_mask = ~intr_unmask;
254a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0);
255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
257a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
258a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_isr_disable(struct bfa_s *bfa)
259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_mode_set(bfa, BFA_FALSE);
2615344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(-1L, bfa->iocfc.bfa_regs.intr_mask);
262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_msix_uninstall(bfa);
263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_msix_reqq(struct bfa_s *bfa, int qid)
267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *waitq;
269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
270a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	qid &= (BFI_IOC_MAX_CQS - 1);
271a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.hwif.hw_reqq_ack(bfa, qid);
273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2745fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Resume any pending requests in the corresponding reqq.
276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	waitq = bfa_reqq(bfa, qid);
278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!list_empty(waitq))
279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_resume(bfa, qid);
280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m)
284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, m->mhdr.msg_class);
286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, m->mhdr.msg_id);
287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, m->mhdr.mtag.i2htok);
288d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(1);
289a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc_stop(bfa->trcmod);
290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
292a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
293a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_msix_rspq(struct bfa_s *bfa, int qid)
294a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_msg_s *m;
296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 pi, ci;
297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *waitq;
298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
299a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	qid &= (BFI_IOC_MAX_CQS - 1);
300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
301a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.hwif.hw_rspq_ack(bfa, qid);
302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ci = bfa_rspq_ci(bfa, qid);
304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	pi = bfa_rspq_pi(bfa, qid);
305a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa->rme_process) {
307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		while (ci != pi) {
308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			m = bfa_rspq_elem(bfa, qid, ci);
309a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_isrs[m->mhdr.msg_class] (bfa, m);
310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			CQ_INCR(ci, bfa->iocfc.cfg.drvcfg.num_rspq_elems);
311a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
312a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
313a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * update CI
316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
317a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_rspq_ci(bfa, qid) = pi;
3185344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(pi, bfa->iocfc.bfa_regs.rme_q_ci[qid]);
319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	mmiowb();
320a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3215fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Resume any pending requests in the corresponding reqq.
323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	waitq = bfa_reqq(bfa, qid);
325a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!list_empty(waitq))
326a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_resume(bfa, qid);
327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
330a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_msix_lpu_err(struct bfa_s *bfa, int vec)
331a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 intr, curr_value;
333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3345344026065f79b102fcc44bc6332f856a111962aJing Huang	intr = readl(bfa->iocfc.bfa_regs.intr_status);
335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1))
337da99dcc98dd66a2de4864645bcafffd93cf5a62fMaggie Zhang		bfa_ioc_mbox_isr(&bfa->ioc);
338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
339a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	intr &= (__HFN_INT_ERR_EMC | __HFN_INT_ERR_LPU0 |
340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		__HFN_INT_ERR_LPU1 | __HFN_INT_ERR_PSS | __HFN_INT_LL_HALT);
341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (intr) {
343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (intr & __HFN_INT_LL_HALT) {
3445fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang			/*
345a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * If LL_HALT bit is set then FW Init Halt LL Port
346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * Register needs to be cleared as well so Interrupt
347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * Status Register will be cleared.
348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 */
3495344026065f79b102fcc44bc6332f856a111962aJing Huang			curr_value = readl(bfa->ioc.ioc_regs.ll_halt);
350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			curr_value &= ~__FW_INIT_HALT_P;
3515344026065f79b102fcc44bc6332f856a111962aJing Huang			writel(curr_value, bfa->ioc.ioc_regs.ll_halt);
352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
354a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (intr & __HFN_INT_ERR_PSS) {
3555fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang			/*
356a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * ERR_PSS bit needs to be cleared as well in case
357a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * interrups are shared so driver's interrupt handler is
35825985edcedea6396277003854657b5f3cb31a628Lucas De Marchi			 * still called even though it is already masked out.
359a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 */
3605344026065f79b102fcc44bc6332f856a111962aJing Huang			curr_value = readl(
361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					bfa->ioc.ioc_regs.pss_err_status_reg);
362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			curr_value &= __PSS_ERR_STATUS_SET;
3635344026065f79b102fcc44bc6332f856a111962aJing Huang			writel(curr_value,
3645344026065f79b102fcc44bc6332f856a111962aJing Huang				bfa->ioc.ioc_regs.pss_err_status_reg);
365a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
366a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3675344026065f79b102fcc44bc6332f856a111962aJing Huang		writel(intr, bfa->iocfc.bfa_regs.intr_status);
368f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_ioc_error_isr(&bfa->ioc);
369a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
370a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
371a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA IOC FC related functions
374a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
375a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3765fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
377df0f1933eb5454a5c481311837076056557467adMaggie Zhang *  BFA IOC private functions
378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
379a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
380a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
381a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_cqs_sz(struct bfa_iocfc_cfg_s *cfg, u32 *dm_len)
382a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
383a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i, per_reqq_sz, per_rspq_sz;
384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	per_reqq_sz = BFA_ROUNDUP((cfg->drvcfg.num_reqq_elems * BFI_LMSG_SZ),
386a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				  BFA_DMA_ALIGN_SZ);
387a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	per_rspq_sz = BFA_ROUNDUP((cfg->drvcfg.num_rspq_elems * BFI_LMSG_SZ),
388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				  BFA_DMA_ALIGN_SZ);
389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
390a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Calculate CQ size
392a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++) {
394a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*dm_len = *dm_len + per_reqq_sz;
395a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*dm_len = *dm_len + per_rspq_sz;
396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Calculate Shadow CI/PI size
400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++)
402a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*dm_len += (2 * BFA_CACHELINE_SZ);
403a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_fw_cfg_sz(struct bfa_iocfc_cfg_s *cfg, u32 *dm_len)
407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
408a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*dm_len +=
409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ);
410a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*dm_len +=
411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s),
412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			    BFA_CACHELINE_SZ);
413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
414a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4155fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Use the Mailbox interface to send BFI_IOCFC_H2I_CFG_REQ
417a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
419a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_send_cfg(void *bfa_arg)
420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
421a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s *bfa = bfa_arg;
422a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s *iocfc = &bfa->iocfc;
423a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfg_req_s cfg_req;
424a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfg_s *cfg_info = iocfc->cfginfo;
425a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_cfg_s	*cfg = &iocfc->cfg;
426a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
427a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
428d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(cfg->fwcfg.num_cqs > BFI_IOC_MAX_CQS);
429a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, cfg->fwcfg.num_cqs);
430a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
431a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_reset_queues(bfa);
432a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * initialize IOC configuration info
435a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
436a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	cfg_info->endian_sig = BFI_IOC_ENDIAN_SIG;
437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	cfg_info->num_cqs = cfg->fwcfg.num_cqs;
438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
439a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_dma_be_addr_set(cfg_info->cfgrsp_addr, iocfc->cfgrsp_dma.pa);
4405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * dma map REQ and RSP circular queues and shadow pointers
442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++) {
444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->req_cq_ba[i],
445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->req_cq_ba[i].pa);
446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->req_shadow_ci[i],
447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->req_cq_shadow_ci[i].pa);
448a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		cfg_info->req_cq_elems[i] =
449ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			cpu_to_be16(cfg->drvcfg.num_reqq_elems);
450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
451a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->rsp_cq_ba[i],
452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->rsp_cq_ba[i].pa);
453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->rsp_shadow_pi[i],
454a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->rsp_cq_shadow_pi[i].pa);
455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		cfg_info->rsp_cq_elems[i] =
456ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			cpu_to_be16(cfg->drvcfg.num_rspq_elems);
457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
458a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4595fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Enable interrupt coalescing if it is driver init path
461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * and not ioc disable/enable path.
462a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
463a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!iocfc->cfgdone)
464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		cfg_info->intr_attr.coalesce = BFA_TRUE;
465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
466a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfgdone = BFA_FALSE;
467a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4685fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * dma map IOC configuration itself
470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
471a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfi_h2i_set(cfg_req.mh, BFI_MC_IOCFC, BFI_IOCFC_H2I_CFG_REQ,
472a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		    bfa_lpuid(bfa));
473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_dma_be_addr_set(cfg_req.ioc_cfg_dma_addr, iocfc->cfg_info.pa);
474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
475a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_mbox_send(&bfa->ioc, &cfg_req,
476a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			  sizeof(struct bfi_iocfc_cfg_req_s));
477a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
479a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		   struct bfa_pcidev_s *pcidev)
482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
485a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->bfad = bfad;
486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->bfa = bfa;
487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->action = BFA_IOCFC_ACT_NONE;
488a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4896a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	iocfc->cfg = *cfg;
490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4915fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Initialize chip specific handlers.
493a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
494a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa_asic_id_ct(bfa_ioc_devid(&bfa->ioc))) {
495a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_reginit = bfa_hwct_reginit;
496a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_reqq_ack = bfa_hwct_reqq_ack;
497a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack;
498a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_init = bfa_hwct_msix_init;
499a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_install = bfa_hwct_msix_install;
500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_uninstall = bfa_hwct_msix_uninstall;
501a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_isr_mode_set = bfa_hwct_isr_mode_set;
502a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs;
503a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_get_rme_range = bfa_hwct_msix_get_rme_range;
504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	} else {
505a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_reginit = bfa_hwcb_reginit;
506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_reqq_ack = bfa_hwcb_reqq_ack;
507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_rspq_ack = bfa_hwcb_rspq_ack;
508a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_init = bfa_hwcb_msix_init;
509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_install = bfa_hwcb_msix_install;
510a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_uninstall = bfa_hwcb_msix_uninstall;
511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_isr_mode_set = bfa_hwcb_isr_mode_set;
512a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_getvecs = bfa_hwcb_msix_getvecs;
513a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_get_rme_range = bfa_hwcb_msix_get_rme_range;
514a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->hwif.hw_reginit(bfa);
517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->msix.nvecs = 0;
518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
521a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_mem_claim(struct bfa_s *bfa, struct bfa_iocfc_cfg_s *cfg,
522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		    struct bfa_meminfo_s *meminfo)
523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
524a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u8	       *dm_kva;
525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u64	dm_pa;
526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i, per_reqq_sz, per_rspq_sz;
527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s  *iocfc = &bfa->iocfc;
528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		dbgsz;
529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
530a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_kva = bfa_meminfo_dma_virt(meminfo);
531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_pa = bfa_meminfo_dma_phys(meminfo);
532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
533a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * First allocate dma memory for IOC.
535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_mem_claim(&bfa->ioc, dm_kva, dm_pa);
537f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	dm_kva += BFA_ROUNDUP(sizeof(struct bfi_ioc_attr_s), BFA_DMA_ALIGN_SZ);
538f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	dm_pa  += BFA_ROUNDUP(sizeof(struct bfi_ioc_attr_s), BFA_DMA_ALIGN_SZ);
539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Claim DMA-able memory for the request/response queues and for shadow
542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * ci/pi registers
543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	per_reqq_sz = BFA_ROUNDUP((cfg->drvcfg.num_reqq_elems * BFI_LMSG_SZ),
545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				  BFA_DMA_ALIGN_SZ);
546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	per_rspq_sz = BFA_ROUNDUP((cfg->drvcfg.num_rspq_elems * BFI_LMSG_SZ),
547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				  BFA_DMA_ALIGN_SZ);
548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++) {
550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->req_cq_ba[i].kva = dm_kva;
551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->req_cq_ba[i].pa = dm_pa;
5526a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang		memset(dm_kva, 0, per_reqq_sz);
553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_kva += per_reqq_sz;
554a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_pa += per_reqq_sz;
555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
556a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->rsp_cq_ba[i].kva = dm_kva;
557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->rsp_cq_ba[i].pa = dm_pa;
5586a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang		memset(dm_kva, 0, per_rspq_sz);
559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_kva += per_rspq_sz;
560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_pa += per_rspq_sz;
561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
563a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++) {
564a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->req_cq_shadow_ci[i].kva = dm_kva;
565a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->req_cq_shadow_ci[i].pa = dm_pa;
566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_kva += BFA_CACHELINE_SZ;
567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_pa += BFA_CACHELINE_SZ;
568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->rsp_cq_shadow_pi[i].kva = dm_kva;
570a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->rsp_cq_shadow_pi[i].pa = dm_pa;
571a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_kva += BFA_CACHELINE_SZ;
572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_pa += BFA_CACHELINE_SZ;
573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
574a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
575a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Claim DMA-able memory for the config info page
577a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
578a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfg_info.kva = dm_kva;
579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfg_info.pa = dm_pa;
580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfginfo = (struct bfi_iocfc_cfg_s *) dm_kva;
581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_kva += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ);
582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_pa += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ);
583a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
584a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/*
585a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Claim DMA-able memory for the config response
586a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
587a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfgrsp_dma.kva = dm_kva;
588a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfgrsp_dma.pa = dm_pa;
589a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfgrsp = (struct bfi_iocfc_cfgrsp_s *) dm_kva;
590a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
591a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_kva +=
592a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s),
593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			    BFA_CACHELINE_SZ);
594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_pa += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s),
595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			     BFA_CACHELINE_SZ);
596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_meminfo_dma_virt(meminfo) = dm_kva;
599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_meminfo_dma_phys(meminfo) = dm_pa;
600a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
601f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	dbgsz = (bfa_auto_recover) ? BFA_DBG_FWTRC_LEN : 0;
602a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (dbgsz > 0) {
603a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_debug_memclaim(&bfa->ioc, bfa_meminfo_kva(meminfo));
604a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_meminfo_kva(meminfo) += dbgsz;
605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
606a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
607a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6085fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Start BFA submodules.
610a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
611a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
612a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_start_submod(struct bfa_s *bfa)
613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
614a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
616a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->rme_process = BFA_TRUE;
617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
618a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; hal_mods[i]; i++)
619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		hal_mods[i]->start(bfa);
620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
621a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6225fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
623a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Disable BFA submodules.
624a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
625a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
626a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable_submod(struct bfa_s *bfa)
627a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
628a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
629a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; hal_mods[i]; i++)
631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		hal_mods[i]->iocdisable(bfa);
632a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
633a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
634a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
635a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete)
636a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
637a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (complete) {
640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa->iocfc.cfgdone)
641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_init(bfa->bfad, BFA_STATUS_OK);
642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED);
644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	} else {
645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa->iocfc.cfgdone)
646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa->iocfc.action = BFA_IOCFC_ACT_NONE;
647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
648a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_stop_cb(void *bfa_arg, bfa_boolean_t compl)
652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s  *bfa = bfa_arg;
654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = bfa->bfad;
655a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (compl)
657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		complete(&bfad->comp);
658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else
659a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa->iocfc.action = BFA_IOCFC_ACT_NONE;
660a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
662a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl)
664a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
665a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s  *bfa = bfa_arg;
666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = bfa->bfad;
667a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
668a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (compl)
669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		complete(&bfad->disable_comp);
670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Update BFA configuration from firmware configuration.
674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_cfgrsp(struct bfa_s *bfa)
677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s		*iocfc	 = &bfa->iocfc;
679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfgrsp_s	*cfgrsp	 = iocfc->cfgrsp;
680a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_fwcfg_s	*fwcfg	 = &cfgrsp->fwcfg;
681a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
682a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fwcfg->num_cqs	      = fwcfg->num_cqs;
683ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_ioim_reqs  = be16_to_cpu(fwcfg->num_ioim_reqs);
684ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_tskim_reqs = be16_to_cpu(fwcfg->num_tskim_reqs);
685ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_fcxp_reqs  = be16_to_cpu(fwcfg->num_fcxp_reqs);
686ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_uf_bufs    = be16_to_cpu(fwcfg->num_uf_bufs);
687ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_rports     = be16_to_cpu(fwcfg->num_rports);
688a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfgdone = BFA_TRUE;
690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6915fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Configuration is complete - initialize/start submodules
693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_fcport_init(bfa);
695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (iocfc->action == BFA_IOCFC_ACT_INIT)
697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(bfa, &iocfc->init_hcb_qe, bfa_iocfc_init_cb, bfa);
698a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else
699a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocfc_start_submod(bfa);
700a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_reset_queues(struct bfa_s *bfa)
703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		q;
705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
706a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (q = 0; q < BFI_IOC_MAX_CQS; q++) {
707a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_ci(bfa, q) = 0;
708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_pi(bfa, q) = 0;
709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_rspq_ci(bfa, q) = 0;
710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_rspq_pi(bfa, q) = 0;
711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7145fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC enable request is complete
716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status)
719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (status != BFA_STATUS_OK) {
723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_isr_disable(bfa);
724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT)
725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe,
726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				     bfa_iocfc_init_cb, bfa);
727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
729a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
730a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_send_cfg(bfa);
731a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
732a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
734a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC disable request is complete
735a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
736a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
737a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable_cbfn(void *bfa_arg)
738a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_disable(bfa);
742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_disable_submod(bfa);
743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa->iocfc.action == BFA_IOCFC_ACT_STOP)
745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(bfa, &bfa->iocfc.stop_hcb_qe, bfa_iocfc_stop_cb,
746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			     bfa);
747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else {
748d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(bfa->iocfc.action != BFA_IOCFC_ACT_DISABLE);
749a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(bfa, &bfa->iocfc.dis_hcb_qe, bfa_iocfc_disable_cb,
750a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			     bfa);
751a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
752a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
753a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7545fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
755a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Notify sub-modules of hardware failure.
756a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
757a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
758a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_hbfail_cbfn(void *bfa_arg)
759a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
760a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
761a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
762a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->rme_process = BFA_FALSE;
763a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
764a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_disable(bfa);
765a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_disable_submod(bfa);
766a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
767a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT)
768a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe, bfa_iocfc_init_cb,
769a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			     bfa);
770a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
771a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
773a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Actions on chip-reset completion.
774a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
775a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
776a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_reset_cbfn(void *bfa_arg)
777a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
778a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
779a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_reset_queues(bfa);
781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_enable(bfa);
782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7855fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Query IOC memory requirement information.
787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len,
790a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		  u32 *dm_len)
791a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
792a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	/* dma memory for IOC */
793f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	*dm_len += BFA_ROUNDUP(sizeof(struct bfi_ioc_attr_s), BFA_DMA_ALIGN_SZ);
794a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
795a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_fw_cfg_sz(cfg, dm_len);
796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cqs_sz(cfg, dm_len);
797f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	*km_len += (bfa_auto_recover) ? BFA_DBG_FWTRC_LEN : 0;
798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
799a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8005fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
801a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Query IOC memory requirement information.
802a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
803a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
804a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
805a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev)
806a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
807a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
808a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = &bfa->ioc;
809a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
810a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.enable_cbfn = bfa_iocfc_enable_cbfn;
811a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.disable_cbfn = bfa_iocfc_disable_cbfn;
812a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.hbfail_cbfn = bfa_iocfc_hbfail_cbfn;
813a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.reset_cbfn = bfa_iocfc_reset_cbfn;
814a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->trcmod = bfa->trcmod;
816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_attach(&bfa->ioc, bfa, &bfa_iocfc_cbfn, &bfa->timer_mod);
817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
819a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Set FC mode for BFA_PCI_DEVICE_ID_CT_FC.
820a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
821a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (pcidev->device_id == BFA_PCI_DEVICE_ID_CT_FC)
822a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_ioc_set_fcmode(&bfa->ioc);
823a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
824d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_PCIFN_CLASS_FC);
825a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs);
826a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev);
828a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_mem_claim(bfa, cfg, meminfo);
829f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	INIT_LIST_HEAD(&bfa->timer_mod.timer_q);
830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&bfa->comp_q);
832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < BFI_IOC_MAX_CQS; i++)
833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&bfa->reqq_waitq[i]);
834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8365fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Query IOC memory requirement information.
838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_init(struct bfa_s *bfa)
841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.action = BFA_IOCFC_ACT_INIT;
843a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_enable(&bfa->ioc);
844a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
845a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8465fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
847a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC start called from bfa_start(). Called to start IOC operations
848a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * at driver instantiation for this instance.
849a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
850a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
851a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_start(struct bfa_s *bfa)
852a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
853a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa->iocfc.cfgdone)
854a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocfc_start_submod(bfa);
855a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
856a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
8575fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
858a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC stop called from bfa_stop(). Called only when driver is unloaded
859a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * for this instance.
860a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
861a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
862a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_stop(struct bfa_s *bfa)
863a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
864a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.action = BFA_IOCFC_ACT_STOP;
865a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
866a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->rme_process = BFA_FALSE;
867a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_disable(&bfa->ioc);
868a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
869a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
870a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
871a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_isr(void *bfaarg, struct bfi_mbmsg_s *m)
872a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
873a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s		*bfa = bfaarg;
874a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
875a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	union bfi_iocfc_i2h_msg_u	*msg;
876a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
877a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	msg = (union bfi_iocfc_i2h_msg_u *) m;
878a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, msg->mh.msg_id);
879a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
880a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (msg->mh.msg_id) {
881a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOCFC_I2H_CFG_REPLY:
882a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->cfg_reply = &msg->cfg_reply;
883a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocfc_cfgrsp(bfa);
884a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
885a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOCFC_I2H_UPDATEQ_RSP:
886a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->updateq_cbfn(iocfc->updateq_cbarg, BFA_STATUS_OK);
887a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
888a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
889d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
890a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
891a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
892a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
893a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
894a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_get_attr(struct bfa_s *bfa, struct bfa_iocfc_attr_s *attr)
895a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
896a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
897a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
898a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->intr_attr.coalesce = iocfc->cfginfo->intr_attr.coalesce;
899a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
900a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->intr_attr.delay = iocfc->cfginfo->intr_attr.delay ?
901ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang				be16_to_cpu(iocfc->cfginfo->intr_attr.delay) :
902ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang				be16_to_cpu(iocfc->cfgrsp->intr_attr.delay);
903a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
904a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->intr_attr.latency = iocfc->cfginfo->intr_attr.latency ?
905ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			be16_to_cpu(iocfc->cfginfo->intr_attr.latency) :
906ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			be16_to_cpu(iocfc->cfgrsp->intr_attr.latency);
907a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
908a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->config	= iocfc->cfg;
909a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
910a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
911a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t
912a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_israttr_set(struct bfa_s *bfa, struct bfa_iocfc_intr_attr_s *attr)
913a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
914a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s		*iocfc = &bfa->iocfc;
915a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_set_intr_req_s *m;
916a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
917a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfginfo->intr_attr.coalesce = attr->coalesce;
918ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	iocfc->cfginfo->intr_attr.delay = cpu_to_be16(attr->delay);
919ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	iocfc->cfginfo->intr_attr.latency = cpu_to_be16(attr->latency);
920a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
921a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!bfa_iocfc_is_operational(bfa))
922a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_OK;
923a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
924a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(bfa, BFA_REQQ_IOC);
925a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m)
926a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_DEVBUSY;
927a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
928a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_IOCFC, BFI_IOCFC_H2I_SET_INTR_REQ,
929a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		    bfa_lpuid(bfa));
930a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->coalesce = iocfc->cfginfo->intr_attr.coalesce;
931a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->delay    = iocfc->cfginfo->intr_attr.delay;
932a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->latency  = iocfc->cfginfo->intr_attr.latency;
933a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
934a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, attr->delay);
935a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, attr->latency);
936a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
937a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_reqq_produce(bfa, BFA_REQQ_IOC);
938a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_STATUS_OK;
939a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
940a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
941a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
942a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_set_snsbase(struct bfa_s *bfa, u64 snsbase_pa)
943a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
944a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
945a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
946a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfginfo->sense_buf_len = (BFI_IOIM_SNSLEN - 1);
947a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_dma_be_addr_set(iocfc->cfginfo->ioim_snsbase, snsbase_pa);
948a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
9495fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
950a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Enable IOC after it is disabled.
951a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
952a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
953a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_enable(struct bfa_s *bfa)
954a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
955a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0,
956a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		     "IOC Enable");
957a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_enable(&bfa->ioc);
958a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
959a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
960a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
961a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable(struct bfa_s *bfa)
962a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
963a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0,
964a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		     "IOC Disable");
965a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.action = BFA_IOCFC_ACT_DISABLE;
966a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
967a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->rme_process = BFA_FALSE;
968a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_disable(&bfa->ioc);
969a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
970a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
971a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
972a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t
973a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_is_operational(struct bfa_s *bfa)
974a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
975a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return bfa_ioc_is_operational(&bfa->ioc) && bfa->iocfc.cfgdone;
976a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
977a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
9785fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
979a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Return boot target port wwns -- read from boot information in flash.
980a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
981a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
982a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_get_bootwwns(struct bfa_s *bfa, u8 *nwwns, wwn_t *wwns)
983a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
984a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s *iocfc = &bfa->iocfc;
985a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp;
986a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int i;
987a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
988a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (cfgrsp->pbc_cfg.boot_enabled && cfgrsp->pbc_cfg.nbluns) {
989a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(bfa, cfgrsp->pbc_cfg.nbluns);
990a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*nwwns = cfgrsp->pbc_cfg.nbluns;
991a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		for (i = 0; i < cfgrsp->pbc_cfg.nbluns; i++)
992a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			wwns[i] = cfgrsp->pbc_cfg.blun[i].tgt_pwwn;
993a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
994a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
995a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
996a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
997a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*nwwns = cfgrsp->bootwwns.nwwns;
998a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	memcpy(wwns, cfgrsp->bootwwns.wwn, sizeof(cfgrsp->bootwwns.wwn));
999a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1000a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1001a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatiint
1002a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_get_pbc_vports(struct bfa_s *bfa, struct bfi_pbc_vport_s *pbc_vport)
1003a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1004a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s *iocfc = &bfa->iocfc;
1005a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp;
1006a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1007a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	memcpy(pbc_vport, cfgrsp->pbc_cfg.vport, sizeof(cfgrsp->pbc_cfg.vport));
1008a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return cfgrsp->pbc_cfg.nvports;
1009a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1010a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10125fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
10137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function query the memory requirement of the BFA library.
10147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This function needs to be called before bfa_attach() to get the
10157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * memory required of the BFA layer for a given driver configuration.
10167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This call will fail, if the cap is out of range compared to pre-defined
10187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * values within the BFA library
10197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] cfg -	pointer to bfa_ioc_cfg_t. Driver layer should indicate
1021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			its configuration in this structure.
10227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			The default values for struct bfa_iocfc_cfg_s can be
10237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			fetched using bfa_cfg_get_default() API.
10247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			If cap's boundary check fails, the library will use
10267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			the default bfa_cap_t values (and log a warning msg).
10277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[out] meminfo - pointer to bfa_meminfo_t. This content
1029a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			indicates the memory type (see bfa_mem_type_t) and
10307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			amount of memory required.
10317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			Driver should allocate the memory, populate the
10337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			starting address for each block and provide the same
10347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			structure as input parameter to bfa_attach() call.
10357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
10377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations: @note
10397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
10407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
10417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo)
10427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
1044a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32	km_len = 0, dm_len = 0;
10457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1046d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON((cfg == NULL) || (meminfo == NULL));
10477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10486a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)meminfo, 0, sizeof(struct bfa_meminfo_s));
10497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	meminfo->meminfo[BFA_MEM_TYPE_KVA - 1].mem_type =
10507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		BFA_MEM_TYPE_KVA;
10517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	meminfo->meminfo[BFA_MEM_TYPE_DMA - 1].mem_type =
10527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		BFA_MEM_TYPE_DMA;
10537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_iocfc_meminfo(cfg, &km_len, &dm_len);
10557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; hal_mods[i]; i++)
10577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hal_mods[i]->meminfo(cfg, &km_len, &dm_len);
10587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10597873ca4e4401f0ecd8868bf1543113467e6bae61Krishna Gudipati	dm_len += bfa_port_meminfo();
10607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	meminfo->meminfo[BFA_MEM_TYPE_KVA - 1].mem_len = km_len;
10627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	meminfo->meminfo[BFA_MEM_TYPE_DMA - 1].mem_len = dm_len;
10637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
10647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
10667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function to do attach the driver instance with the BFA
10677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * library. This function will not trigger any HW initialization
10687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * process (which will be done in bfa_init() call)
10697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This call will fail, if the cap is out of range compared to
10717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * pre-defined values within the BFA library
10727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[out]	bfa	Pointer to bfa_t.
1074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	bfad	Opaque handle back to the driver's IOC structure
10757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	cfg	Pointer to bfa_ioc_cfg_t. Should be same structure
1076a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			that was used in bfa_cfg_get_meminfo().
1077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	meminfo	Pointer to bfa_meminfo_t. The driver should
1078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			use the bfa_cfg_get_meminfo() call to
1079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			find the memory blocks required, allocate the
1080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			required memory and provide the starting addresses.
1081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	pcidev	pointer to struct bfa_pcidev_s
10827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return
10847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * void
10857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations:
10877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @note
10897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
10907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
10917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
10927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
10937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	       struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev)
10947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int			i;
1096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_mem_elem_s	*melem;
10977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
10987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa->fcs = BFA_FALSE;
10997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1100d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON((cfg == NULL) || (meminfo == NULL));
11017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
11037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 * initialize all memory pointers for iterative allocation
11047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	 */
11057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; i < BFA_MEM_TYPE_MAX; i++) {
11067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		melem = meminfo->meminfo + i;
11077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		melem->kva_curp = melem->kva;
11087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		melem->dma_curp = melem->dma;
11097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
11107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_iocfc_attach(bfa, bfad, cfg, meminfo, pcidev);
11127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; hal_mods[i]; i++)
11147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hal_mods[i]->attach(bfa, bfad, cfg, meminfo, pcidev);
11157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11167873ca4e4401f0ecd8868bf1543113467e6bae61Krishna Gudipati	bfa_com_port_attach(bfa, meminfo);
11177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11195fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
11207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function to delete a BFA IOC. IOC should be stopped (by
11217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * calling bfa_stop()) before this function call.
11227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
11237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] bfa - pointer to bfa_t.
11247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
11257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return
11267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * void
11277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
11287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations:
11297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
11307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @note
11317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
11327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
11337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_detach(struct bfa_s *bfa)
11347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int	i;
11367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; hal_mods[i]; i++)
11387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hal_mods[i]->detach(bfa);
1139f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_ioc_detach(&bfa->ioc);
11407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
11437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_comp_deq(struct bfa_s *bfa, struct list_head *comp_q)
11447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	INIT_LIST_HEAD(comp_q);
11467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_splice_tail_init(&bfa->comp_q, comp_q);
11477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11497725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
11507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_comp_process(struct bfa_s *bfa, struct list_head *comp_q)
11517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head		*qe;
1153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head		*qen;
1154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_cb_qe_s	*hcb_qe;
11557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_for_each_safe(qe, qen, comp_q) {
11577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hcb_qe = (struct bfa_cb_qe_s *) qe;
11587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hcb_qe->cbfn(hcb_qe->cbarg, BFA_TRUE);
11597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
11607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
11637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_comp_free(struct bfa_s *bfa, struct list_head *comp_q)
11647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head		*qe;
1166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_cb_qe_s	*hcb_qe;
11677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	while (!list_empty(comp_q)) {
11697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_q_deq(comp_q, &qe);
11707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hcb_qe = (struct bfa_cb_qe_s *) qe;
11717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hcb_qe->cbfn(hcb_qe->cbarg, BFA_FALSE);
11727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
11737725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11747725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11765fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
11777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return the list of PCI vendor/device id lists supported by this
11787725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA instance.
11797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
11807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
11817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_get_pciids(struct bfa_pciid_s **pciids, int *npciids)
11827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
11837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	static struct bfa_pciid_s __pciids[] = {
11847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_FC_8G2P},
11857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_FC_8G1P},
11867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_CT},
1187293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_CT_FC},
11887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	};
11897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*npciids = sizeof(__pciids) / sizeof(__pciids[0]);
11917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	*pciids = __pciids;
11927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
11937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
11945fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
11957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function query the default struct bfa_iocfc_cfg_s value (compiled
11967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * into BFA layer). The OS driver can then turn back and overwrite entries that
11977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * have been configured by the user.
11987725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
11997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] cfg - pointer to bfa_ioc_cfg_t
12007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
12017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return
12027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *	void
12037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
12047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations:
1205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * note
12067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
12077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
12087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cfg_get_default(struct bfa_iocfc_cfg_s *cfg)
12097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
12107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_fabrics = DEF_CFG_NUM_FABRICS;
12117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_lports = DEF_CFG_NUM_LPORTS;
12127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_rports = DEF_CFG_NUM_RPORTS;
12137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_ioim_reqs = DEF_CFG_NUM_IOIM_REQS;
12147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_tskim_reqs = DEF_CFG_NUM_TSKIM_REQS;
12157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_fcxp_reqs = DEF_CFG_NUM_FCXP_REQS;
12167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_uf_bufs = DEF_CFG_NUM_UF_BUFS;
12177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_cqs = DEF_CFG_NUM_CQS;
12187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_reqq_elems = DEF_CFG_NUM_REQQ_ELEMS;
12207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_rspq_elems = DEF_CFG_NUM_RSPQ_ELEMS;
12217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sgpgs = DEF_CFG_NUM_SGPGS;
12227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sboot_tgts = DEF_CFG_NUM_SBOOT_TGTS;
12237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sboot_luns = DEF_CFG_NUM_SBOOT_LUNS;
12247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.path_tov = BFA_FCPIM_PATHTOV_DEF;
12257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.ioc_recover = BFA_FALSE;
12267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.delay_comp = BFA_FALSE;
12277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
12297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
12317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cfg_get_min(struct bfa_iocfc_cfg_s *cfg)
12327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
12337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_cfg_get_default(cfg);
12347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_ioim_reqs   = BFA_IOIM_MIN;
12357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_tskim_reqs  = BFA_TSKIM_MIN;
12367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_fcxp_reqs   = BFA_FCXP_MIN;
12377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_uf_bufs     = BFA_UF_MIN;
12387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_rports      = BFA_RPORT_MIN;
12397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
12407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sgpgs      = BFA_SGPG_MIN;
12417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_reqq_elems = BFA_REQQ_NELEMS_MIN;
12427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_rspq_elems = BFA_RSPQ_NELEMS_MIN;
1243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	cfg->drvcfg.min_cfg	   = BFA_TRUE;
12447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1245