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"
20111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati#include "bfi_reg.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[] = {
283d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	&hal_mod_fcdiag,
29b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_sgpg,
30b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_fcport,
31b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_fcxp,
32b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_lps,
33b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_uf,
34b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	&hal_mod_rport,
35e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	&hal_mod_fcp,
3645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	&hal_mod_dconf,
37b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL
38b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang};
39b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
40b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang/*
41b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang * Message handlers for various modules.
42b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang */
43b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangstatic bfa_isr_func_t  bfa_isrs[BFI_MC_MAX] = {
44b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* NONE */
45b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOC */
463d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_fcdiag_intr,	/* BFI_MC_DIAG */
47b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_FLASH */
48b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_CEE */
49b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_fcport_isr,		/* BFI_MC_FCPORT */
50b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOCFC */
51b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_LL */
52b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_uf_isr,		/* BFI_MC_UF */
53b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_fcxp_isr,		/* BFI_MC_FCXP */
54b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_lps_isr,		/* BFI_MC_LPS */
55b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_rport_isr,		/* BFI_MC_RPORT */
56e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	bfa_itn_isr,		/* BFI_MC_ITN */
57b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOIM_READ */
58b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOIM_WRITE */
59b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IOIM_IO */
60b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_ioim_isr,		/* BFI_MC_IOIM */
61b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_ioim_good_comp_isr,	/* BFI_MC_IOIM_IOCOM */
62b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_tskim_isr,		/* BFI_MC_TSKIM */
63b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_SBOOT */
64b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_IPFC */
65b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* BFI_MC_PORT */
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	bfa_isr_unhandled,	/* --------- */
75b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_isr_unhandled,	/* --------- */
76b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang};
77b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang/*
78b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang * Message handlers for mailbox command classes
79b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang */
80b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangstatic bfa_ioc_mbox_mcfunc_t  bfa_mbox_isrs[BFI_MC_MAX] = {
81b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,
82b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_IOC   */
83b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_DIAG  */
84b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_FLASH */
85b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_CEE   */
86b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,		/* BFI_MC_PORT  */
87b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_iocfc_isr,	/* BFI_MC_IOCFC */
88b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	NULL,
89b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang};
90b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
91b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
92b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
93b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhangstatic void
944507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_com_port_attach(struct bfa_s *bfa)
95b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang{
96b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	struct bfa_port_s	*port = &bfa->modules.port;
974507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s	*port_dma = BFA_MEM_PORT_DMA(bfa);
98b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
99b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang	bfa_port_attach(port, &bfa->ioc, bfa, bfa->trcmod);
1004507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_port_mem_claim(port, port_dma->kva_curp, port_dma->dma_curp);
101b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang}
102b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang
103b77ee1fb10e4b76dc61094b3678d805be0e4f7baMaggie Zhang/*
1041a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati * ablk module attach
1051a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati */
1061a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipatistatic void
1074507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_com_ablk_attach(struct bfa_s *bfa)
1081a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati{
1091a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	struct bfa_ablk_s	*ablk = &bfa->modules.ablk;
1104507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s	*ablk_dma = BFA_MEM_ABLK_DMA(bfa);
1111a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
1121a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati	bfa_ablk_attach(ablk, &bfa->ioc);
1134507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_ablk_memclaim(ablk, ablk_dma->kva_curp, ablk_dma->dma_curp);
1141a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati}
1151a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati
116148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatistatic void
117148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipatibfa_com_cee_attach(struct bfa_s *bfa)
118148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati{
119148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_cee_s	*cee = &bfa->modules.cee;
120148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_mem_dma_s	*cee_dma = BFA_MEM_CEE_DMA(bfa);
121148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
122148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	cee->trcmod = bfa->trcmod;
123148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_cee_attach(cee, &bfa->ioc, bfa);
124148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_cee_mem_claim(cee, cee_dma->kva_curp, cee_dma->dma_curp);
125148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati}
126148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati
12751e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatistatic void
12851e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipatibfa_com_sfp_attach(struct bfa_s *bfa)
12951e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati{
13051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_sfp_s	*sfp = BFA_SFP_MOD(bfa);
13151e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_mem_dma_s	*sfp_dma = BFA_MEM_SFP_DMA(bfa);
13251e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
13351e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_sfp_attach(sfp, &bfa->ioc, bfa, bfa->trcmod);
13451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_sfp_memclaim(sfp, sfp_dma->kva_curp, sfp_dma->dma_curp);
13551e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati}
13651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati
1375a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatistatic void
1385a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipatibfa_com_flash_attach(struct bfa_s *bfa, bfa_boolean_t mincfg)
1395a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati{
1405a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_flash_s	*flash = BFA_FLASH(bfa);
1415a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_mem_dma_s	*flash_dma = BFA_MEM_FLASH_DMA(bfa);
1425a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
1435a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_flash_attach(flash, &bfa->ioc, bfa, bfa->trcmod, mincfg);
1445a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_flash_memclaim(flash, flash_dma->kva_curp,
1455a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			   flash_dma->dma_curp, mincfg);
1465a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati}
1475a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati
1483d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatistatic void
1493d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipatibfa_com_diag_attach(struct bfa_s *bfa)
1503d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati{
1513d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_diag_s	*diag = BFA_DIAG_MOD(bfa);
1523d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_mem_dma_s	*diag_dma = BFA_MEM_DIAG_DMA(bfa);
1533d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
1543d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_diag_attach(diag, &bfa->ioc, bfa, bfa_fcport_beacon, bfa->trcmod);
1553d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_diag_memclaim(diag, diag_dma->kva_curp, diag_dma->dma_curp);
1563d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati}
1573d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati
1583350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatistatic void
1593350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipatibfa_com_phy_attach(struct bfa_s *bfa, bfa_boolean_t mincfg)
1603350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati{
1613350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_phy_s	*phy = BFA_PHY(bfa);
1623350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_mem_dma_s	*phy_dma = BFA_MEM_PHY_DMA(bfa);
1633350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
1643350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_phy_attach(phy, &bfa->ioc, bfa, bfa->trcmod, mincfg);
1653350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_phy_memclaim(phy, phy_dma->kva_curp, phy_dma->dma_curp, mincfg);
1663350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati}
1673350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati
1681a4d8e1bd81c018f7b8c7622066d5cfead59b38aKrishna Gudipati/*
169a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA IOC FC related definitions
170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC local definitions
174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define BFA_IOCFC_TOV		5000	/* msecs */
176a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatienum {
178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_NONE	= 0,
179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_INIT	= 1,
180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_STOP	= 2,
181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	BFA_IOCFC_ACT_DISABLE	= 3,
182601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	BFA_IOCFC_ACT_ENABLE	= 4,
183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati};
184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_FABRICS		1
186a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_LPORTS		256
187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_CQS			4
188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_IOIM_REQS		(BFA_IOIM_MAX)
189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_TSKIM_REQS		128
190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_FCXP_REQS		64
191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_UF_BUFS		64
192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_RPORTS		1024
193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_ITNIMS		(DEF_CFG_NUM_RPORTS)
194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_TINS		256
195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_SGPGS		2048
197a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_REQQ_ELEMS		256
198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_RSPQ_ELEMS		64
199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_SBOOT_TGTS		16
200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati#define DEF_CFG_NUM_SBOOT_LUNS		16
201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2025fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * forward declaration for IOC FC functions
204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status);
206a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_disable_cbfn(void *bfa_arg);
207a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_hbfail_cbfn(void *bfa_arg);
208a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void bfa_iocfc_reset_cbfn(void *bfa_arg);
209a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic struct bfa_ioc_cbfn_s bfa_iocfc_cbfn;
210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
2115fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
212a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA Interrupt handling functions
213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_reqq_resume(struct bfa_s *bfa, int qid)
216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head *waitq, *qe, *qen;
218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_reqq_wait_s *wqe;
219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	waitq = bfa_reqq(bfa, qid);
221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	list_for_each_safe(qe, qen, waitq) {
2225fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang		/*
223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 * Callback only as long as there is room in request queue
224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		 */
225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa_reqq_full(bfa, qid))
226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			break;
227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		list_del(qe);
229a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wqe = (struct bfa_reqq_wait_s *) qe;
230a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		wqe->qresume(wqe->cbarg);
231a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
232a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
233a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
234111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic inline void
235111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_isr_rspq(struct bfa_s *bfa, int qid)
236111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{
237111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	struct bfi_msg_s *m;
238111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	u32	pi, ci;
239111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	struct list_head *waitq;
240111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
241111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	ci = bfa_rspq_ci(bfa, qid);
242111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	pi = bfa_rspq_pi(bfa, qid);
243111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
244111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	while (ci != pi) {
245111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		m = bfa_rspq_elem(bfa, qid, ci);
246111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		WARN_ON(m->mhdr.msg_class >= BFI_MC_MAX);
247111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
248111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_isrs[m->mhdr.msg_class] (bfa, m);
249111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		CQ_INCR(ci, bfa->iocfc.cfg.drvcfg.num_rspq_elems);
250111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	}
251111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
252111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	/*
253ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati	 * acknowledge RME completions and update CI
254111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 */
255ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati	bfa_isr_rspq_ack(bfa, qid, ci);
256111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
257111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	/*
258111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 * Resume any pending requests in the corresponding reqq.
259111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 */
260111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	waitq = bfa_reqq(bfa, qid);
261111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (!list_empty(waitq))
262111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_reqq_resume(bfa, qid);
263111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati}
264111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
265111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic inline void
266111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_isr_reqq(struct bfa_s *bfa, int qid)
267111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{
268111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	struct list_head *waitq;
269111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
2703fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_isr_reqq_ack(bfa, qid);
271111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
272111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	/*
273111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 * Resume any pending requests in the corresponding reqq.
274111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 */
275111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	waitq = bfa_reqq(bfa, qid);
276111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (!list_empty(waitq))
277111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_reqq_resume(bfa, qid);
278111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati}
279111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
281a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_msix_all(struct bfa_s *bfa, int vec)
282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
28310a07379247078448c076690657a076076bf89aaKrishna Gudipati	u32	intr, qintr;
28410a07379247078448c076690657a076076bf89aaKrishna Gudipati	int	queue;
28510a07379247078448c076690657a076076bf89aaKrishna Gudipati
28610a07379247078448c076690657a076076bf89aaKrishna Gudipati	intr = readl(bfa->iocfc.bfa_regs.intr_status);
28710a07379247078448c076690657a076076bf89aaKrishna Gudipati	if (!intr)
28810a07379247078448c076690657a076076bf89aaKrishna Gudipati		return;
28910a07379247078448c076690657a076076bf89aaKrishna Gudipati
29010a07379247078448c076690657a076076bf89aaKrishna Gudipati	/*
29110a07379247078448c076690657a076076bf89aaKrishna Gudipati	 * RME completion queue interrupt
29210a07379247078448c076690657a076076bf89aaKrishna Gudipati	 */
29310a07379247078448c076690657a076076bf89aaKrishna Gudipati	qintr = intr & __HFN_INT_RME_MASK;
29410a07379247078448c076690657a076076bf89aaKrishna Gudipati	if (qintr && bfa->queue_process) {
29510a07379247078448c076690657a076076bf89aaKrishna Gudipati		for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++)
29610a07379247078448c076690657a076076bf89aaKrishna Gudipati			bfa_isr_rspq(bfa, queue);
29710a07379247078448c076690657a076076bf89aaKrishna Gudipati	}
29810a07379247078448c076690657a076076bf89aaKrishna Gudipati
29910a07379247078448c076690657a076076bf89aaKrishna Gudipati	intr &= ~qintr;
30010a07379247078448c076690657a076076bf89aaKrishna Gudipati	if (!intr)
30110a07379247078448c076690657a076076bf89aaKrishna Gudipati		return;
30210a07379247078448c076690657a076076bf89aaKrishna Gudipati
30310a07379247078448c076690657a076076bf89aaKrishna Gudipati	/*
30410a07379247078448c076690657a076076bf89aaKrishna Gudipati	 * CPE completion queue interrupt
30510a07379247078448c076690657a076076bf89aaKrishna Gudipati	 */
30610a07379247078448c076690657a076076bf89aaKrishna Gudipati	qintr = intr & __HFN_INT_CPE_MASK;
30710a07379247078448c076690657a076076bf89aaKrishna Gudipati	if (qintr && bfa->queue_process) {
30810a07379247078448c076690657a076076bf89aaKrishna Gudipati		for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++)
30910a07379247078448c076690657a076076bf89aaKrishna Gudipati			bfa_isr_reqq(bfa, queue);
31010a07379247078448c076690657a076076bf89aaKrishna Gudipati	}
31110a07379247078448c076690657a076076bf89aaKrishna Gudipati	intr &= ~qintr;
31210a07379247078448c076690657a076076bf89aaKrishna Gudipati	if (!intr)
31310a07379247078448c076690657a076076bf89aaKrishna Gudipati		return;
31410a07379247078448c076690657a076076bf89aaKrishna Gudipati
31510a07379247078448c076690657a076076bf89aaKrishna Gudipati	bfa_msix_lpu_err(bfa, intr);
316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
317a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t
319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_intx(struct bfa_s *bfa)
320a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 intr, qintr;
322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int queue;
323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3245344026065f79b102fcc44bc6332f856a111962aJing Huang	intr = readl(bfa->iocfc.bfa_regs.intr_status);
325a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3263fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	qintr = intr & (__HFN_INT_RME_MASK | __HFN_INT_CPE_MASK);
3273fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	if (qintr)
3283fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		writel(qintr, bfa->iocfc.bfa_regs.intr_status);
3293fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
3305fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
331ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati	 * Unconditional RME completion queue interrupt
332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
333ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati	if (bfa->queue_process) {
3343fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++)
3353fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati			bfa_isr_rspq(bfa, queue);
336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
3373fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!intr)
339a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_TRUE;
340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
3415fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * CPE completion queue interrupt
343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
344a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	qintr = intr & __HFN_INT_CPE_MASK;
3453fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	if (qintr && bfa->queue_process) {
3463fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++)
3473fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati			bfa_isr_reqq(bfa, queue);
348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	intr &= ~qintr;
350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!intr)
351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_TRUE;
352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_msix_lpu_err(bfa, intr);
354a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
355a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_TRUE;
356a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
357a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
358a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
359a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_isr_enable(struct bfa_s *bfa)
360a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
361111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	u32 umsk;
362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int pci_func = bfa_ioc_pcifn(&bfa->ioc);
363a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
364a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, pci_func);
365a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
366775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa_msix_ctrl_install(bfa);
367111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
368111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) {
369111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		umsk = __HFN_INT_ERR_MASK_CT2;
370111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		umsk |= pci_func == 0 ?
371111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati			__HFN_INT_FN0_MASK_CT2 : __HFN_INT_FN1_MASK_CT2;
372111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	} else {
373111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		umsk = __HFN_INT_ERR_MASK;
374111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		umsk |= pci_func == 0 ? __HFN_INT_FN0_MASK : __HFN_INT_FN1_MASK;
375111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	}
376111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
377111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	writel(umsk, bfa->iocfc.bfa_regs.intr_status);
378111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	writel(~umsk, bfa->iocfc.bfa_regs.intr_mask);
379111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa->iocfc.intr_mask = ~umsk;
380a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0);
381a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
382a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
383a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
384a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_isr_disable(struct bfa_s *bfa)
385a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
386a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_mode_set(bfa, BFA_FALSE);
3875344026065f79b102fcc44bc6332f856a111962aJing Huang	writel(-1L, bfa->iocfc.bfa_regs.intr_mask);
388a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_msix_uninstall(bfa);
389a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
390a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
391a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
392111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_msix_reqq(struct bfa_s *bfa, int vec)
393a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
394111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_isr_reqq(bfa, vec - bfa->iocfc.hwif.cpe_vec_q0);
395a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
396a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
397a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
398a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m)
399a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, m->mhdr.msg_class);
401a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, m->mhdr.msg_id);
402a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, m->mhdr.mtag.i2htok);
403d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(1);
404a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc_stop(bfa->trcmod);
405a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
406a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
407a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
408111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_msix_rspq(struct bfa_s *bfa, int vec)
409a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
410111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_isr_rspq(bfa, vec - bfa->iocfc.hwif.rme_vec_q0);
411a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
412a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
413a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
414a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_msix_lpu_err(struct bfa_s *bfa, int vec)
415a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
416a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	u32 intr, curr_value;
417111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_boolean_t lpu_isr, halt_isr, pss_isr;
418a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4195344026065f79b102fcc44bc6332f856a111962aJing Huang	intr = readl(bfa->iocfc.bfa_regs.intr_status);
420a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
421111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) {
422111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		halt_isr = intr & __HFN_INT_CPQ_HALT_CT2;
423111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		pss_isr  = intr & __HFN_INT_ERR_PSS_CT2;
424111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		lpu_isr  = intr & (__HFN_INT_MBOX_LPU0_CT2 |
425111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati				   __HFN_INT_MBOX_LPU1_CT2);
426111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		intr    &= __HFN_INT_ERR_MASK_CT2;
427111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	} else {
428ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati		halt_isr = bfa_asic_id_ct(bfa->ioc.pcidev.device_id) ?
429ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati					  (intr & __HFN_INT_LL_HALT) : 0;
430111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		pss_isr  = intr & __HFN_INT_ERR_PSS;
431111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		lpu_isr  = intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1);
432111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		intr    &= __HFN_INT_ERR_MASK;
433111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	}
434a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
435111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (lpu_isr)
436111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		bfa_ioc_mbox_isr(&bfa->ioc);
437a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
438a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (intr) {
439111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		if (halt_isr) {
4405fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang			/*
441a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * If LL_HALT bit is set then FW Init Halt LL Port
442a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * Register needs to be cleared as well so Interrupt
443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * Status Register will be cleared.
444a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 */
4455344026065f79b102fcc44bc6332f856a111962aJing Huang			curr_value = readl(bfa->ioc.ioc_regs.ll_halt);
446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			curr_value &= ~__FW_INIT_HALT_P;
4475344026065f79b102fcc44bc6332f856a111962aJing Huang			writel(curr_value, bfa->ioc.ioc_regs.ll_halt);
448a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
450111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		if (pss_isr) {
4515fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang			/*
452a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * ERR_PSS bit needs to be cleared as well in case
453a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 * interrups are shared so driver's interrupt handler is
45425985edcedea6396277003854657b5f3cb31a628Lucas De Marchi			 * still called even though it is already masked out.
455a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			 */
4565344026065f79b102fcc44bc6332f856a111962aJing Huang			curr_value = readl(
457a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati					bfa->ioc.ioc_regs.pss_err_status_reg);
4585344026065f79b102fcc44bc6332f856a111962aJing Huang			writel(curr_value,
4595344026065f79b102fcc44bc6332f856a111962aJing Huang				bfa->ioc.ioc_regs.pss_err_status_reg);
460a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		}
461a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4625344026065f79b102fcc44bc6332f856a111962aJing Huang		writel(intr, bfa->iocfc.bfa_regs.intr_status);
463f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang		bfa_ioc_error_isr(&bfa->ioc);
464a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
465a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
466a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4675fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
468a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * BFA IOC FC related functions
469a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
470a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4715fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
472df0f1933eb5454a5c481311837076056557467adMaggie Zhang *  BFA IOC private functions
473a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
474a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4755fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
476a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Use the Mailbox interface to send BFI_IOCFC_H2I_CFG_REQ
477a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
478a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
479a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_send_cfg(void *bfa_arg)
480a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
481a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s *bfa = bfa_arg;
482a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s *iocfc = &bfa->iocfc;
483a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfg_req_s cfg_req;
484a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfg_s *cfg_info = iocfc->cfginfo;
485a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_cfg_s	*cfg = &iocfc->cfg;
486a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
487a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
488d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON(cfg->fwcfg.num_cqs > BFI_IOC_MAX_CQS);
489a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, cfg->fwcfg.num_cqs);
490a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
491a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_reset_queues(bfa);
492a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
4935fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
494a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * initialize IOC configuration info
495a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
49610a07379247078448c076690657a076076bf89aaKrishna Gudipati	cfg_info->single_msix_vec = 0;
49710a07379247078448c076690657a076076bf89aaKrishna Gudipati	if (bfa->msix.nvecs == 1)
49810a07379247078448c076690657a076076bf89aaKrishna Gudipati		cfg_info->single_msix_vec = 1;
499a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	cfg_info->endian_sig = BFI_IOC_ENDIAN_SIG;
500a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	cfg_info->num_cqs = cfg->fwcfg.num_cqs;
501e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	cfg_info->num_ioim_reqs = cpu_to_be16(cfg->fwcfg.num_ioim_reqs);
502e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	cfg_info->num_fwtio_reqs = cpu_to_be16(cfg->fwcfg.num_fwtio_reqs);
503a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
504a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_dma_be_addr_set(cfg_info->cfgrsp_addr, iocfc->cfgrsp_dma.pa);
5055fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
506a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * dma map REQ and RSP circular queues and shadow pointers
507a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
508a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++) {
509a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->req_cq_ba[i],
510a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->req_cq_ba[i].pa);
511a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->req_shadow_ci[i],
512a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->req_cq_shadow_ci[i].pa);
513a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		cfg_info->req_cq_elems[i] =
514ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			cpu_to_be16(cfg->drvcfg.num_reqq_elems);
515a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
516a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->rsp_cq_ba[i],
517a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->rsp_cq_ba[i].pa);
518a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_dma_be_addr_set(cfg_info->rsp_shadow_pi[i],
519a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				    iocfc->rsp_cq_shadow_pi[i].pa);
520a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		cfg_info->rsp_cq_elems[i] =
521ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			cpu_to_be16(cfg->drvcfg.num_rspq_elems);
522a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
523a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5245fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
525a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Enable interrupt coalescing if it is driver init path
526a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * and not ioc disable/enable path.
527a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
528a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!iocfc->cfgdone)
529a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		cfg_info->intr_attr.coalesce = BFA_TRUE;
530a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
531a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfgdone = BFA_FALSE;
532a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5335fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
534a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * dma map IOC configuration itself
535a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
536a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfi_h2i_set(cfg_req.mh, BFI_MC_IOCFC, BFI_IOCFC_H2I_CFG_REQ,
5373fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		    bfa_fn_lpu(bfa));
538a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_dma_be_addr_set(cfg_req.ioc_cfg_dma_addr, iocfc->cfg_info.pa);
539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_mbox_send(&bfa->ioc, &cfg_req,
541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			  sizeof(struct bfi_iocfc_cfg_req_s));
542a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
543a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
544a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
545a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
546a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		   struct bfa_pcidev_s *pcidev)
547a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
548a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
549a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
550a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->bfad = bfad;
551a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->bfa = bfa;
552a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->action = BFA_IOCFC_ACT_NONE;
553a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5546a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	iocfc->cfg = *cfg;
555a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
5565fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
557a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Initialize chip specific handlers.
558a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
559111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (bfa_asic_id_ctc(bfa_ioc_devid(&bfa->ioc))) {
560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_reginit = bfa_hwct_reginit;
561a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_reqq_ack = bfa_hwct_reqq_ack;
562a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack;
563a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_init = bfa_hwct_msix_init;
564775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		iocfc->hwif.hw_msix_ctrl_install = bfa_hwct_msix_ctrl_install;
565775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		iocfc->hwif.hw_msix_queue_install = bfa_hwct_msix_queue_install;
566a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_uninstall = bfa_hwct_msix_uninstall;
567a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_isr_mode_set = bfa_hwct_isr_mode_set;
568a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs;
569a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_get_rme_range = bfa_hwct_msix_get_rme_range;
570111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		iocfc->hwif.rme_vec_q0 = BFI_MSIX_RME_QMIN_CT;
571111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		iocfc->hwif.cpe_vec_q0 = BFI_MSIX_CPE_QMIN_CT;
572a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	} else {
573a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_reginit = bfa_hwcb_reginit;
5743fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		iocfc->hwif.hw_reqq_ack = NULL;
575ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati		iocfc->hwif.hw_rspq_ack = bfa_hwcb_rspq_ack;
576a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_init = bfa_hwcb_msix_init;
577775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		iocfc->hwif.hw_msix_ctrl_install = bfa_hwcb_msix_ctrl_install;
578775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati		iocfc->hwif.hw_msix_queue_install = bfa_hwcb_msix_queue_install;
579a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_uninstall = bfa_hwcb_msix_uninstall;
580a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_isr_mode_set = bfa_hwcb_isr_mode_set;
581a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_getvecs = bfa_hwcb_msix_getvecs;
582a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->hwif.hw_msix_get_rme_range = bfa_hwcb_msix_get_rme_range;
583111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		iocfc->hwif.rme_vec_q0 = BFI_MSIX_RME_QMIN_CB +
584111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati			bfa_ioc_pcifn(&bfa->ioc) * BFI_IOC_MAX_CQS;
585111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		iocfc->hwif.cpe_vec_q0 = BFI_MSIX_CPE_QMIN_CB +
586111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati			bfa_ioc_pcifn(&bfa->ioc) * BFI_IOC_MAX_CQS;
587111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	}
588111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
589111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	if (bfa_asic_id_ct2(bfa_ioc_devid(&bfa->ioc))) {
590111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		iocfc->hwif.hw_reginit = bfa_hwct2_reginit;
591111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		iocfc->hwif.hw_isr_mode_set = NULL;
592ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati		iocfc->hwif.hw_rspq_ack = bfa_hwct2_rspq_ack;
593a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
595a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->hwif.hw_reginit(bfa);
596a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->msix.nvecs = 0;
597a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
598a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
599a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
6004507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_iocfc_mem_claim(struct bfa_s *bfa, struct bfa_iocfc_cfg_s *cfg)
601a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
6024507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	u8	*dm_kva = NULL;
6034507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	u64	dm_pa = 0;
6044507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	int	i, per_reqq_sz, per_rspq_sz, dbgsz;
605a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s  *iocfc = &bfa->iocfc;
6064507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *ioc_dma = BFA_MEM_IOC_DMA(bfa);
6074507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *iocfc_dma = BFA_MEM_IOCFC_DMA(bfa);
6084507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *reqq_dma, *rspq_dma;
609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6104507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* First allocate dma memory for IOC */
6114507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_ioc_mem_claim(&bfa->ioc, bfa_mem_dma_virt(ioc_dma),
6124507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			bfa_mem_dma_phys(ioc_dma));
613a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* Claim DMA-able memory for the request/response queues */
615a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	per_reqq_sz = BFA_ROUNDUP((cfg->drvcfg.num_reqq_elems * BFI_LMSG_SZ),
6164507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				BFA_DMA_ALIGN_SZ);
617a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	per_rspq_sz = BFA_ROUNDUP((cfg->drvcfg.num_rspq_elems * BFI_LMSG_SZ),
6184507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				BFA_DMA_ALIGN_SZ);
619a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
620a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++) {
6214507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		reqq_dma = BFA_MEM_REQQ_DMA(bfa, i);
6224507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		iocfc->req_cq_ba[i].kva = bfa_mem_dma_virt(reqq_dma);
6234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		iocfc->req_cq_ba[i].pa = bfa_mem_dma_phys(reqq_dma);
6244507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		memset(iocfc->req_cq_ba[i].kva, 0, per_reqq_sz);
6254507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
6264507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		rspq_dma = BFA_MEM_RSPQ_DMA(bfa, i);
6274507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		iocfc->rsp_cq_ba[i].kva = bfa_mem_dma_virt(rspq_dma);
6284507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		iocfc->rsp_cq_ba[i].pa = bfa_mem_dma_phys(rspq_dma);
6294507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		memset(iocfc->rsp_cq_ba[i].kva, 0, per_rspq_sz);
630a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
631a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6324507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* Claim IOCFC dma memory - for shadow CI/PI */
6334507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dm_kva = bfa_mem_dma_virt(iocfc_dma);
6344507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dm_pa  = bfa_mem_dma_phys(iocfc_dma);
6354507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
636a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < cfg->fwcfg.num_cqs; i++) {
637a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->req_cq_shadow_ci[i].kva = dm_kva;
638a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->req_cq_shadow_ci[i].pa = dm_pa;
639a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_kva += BFA_CACHELINE_SZ;
640a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_pa += BFA_CACHELINE_SZ;
641a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
642a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->rsp_cq_shadow_pi[i].kva = dm_kva;
643a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->rsp_cq_shadow_pi[i].pa = dm_pa;
644a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_kva += BFA_CACHELINE_SZ;
645a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		dm_pa += BFA_CACHELINE_SZ;
646a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
647a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6484507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* Claim IOCFC dma memory - for the config info page */
649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfg_info.kva = dm_kva;
650a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfg_info.pa = dm_pa;
651a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfginfo = (struct bfi_iocfc_cfg_s *) dm_kva;
652a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_kva += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ);
653a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_pa += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ);
654a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6554507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* Claim IOCFC dma memory - for the config response */
656a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfgrsp_dma.kva = dm_kva;
657a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfgrsp_dma.pa = dm_pa;
658a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.cfgrsp = (struct bfi_iocfc_cfgrsp_s *) dm_kva;
6594507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dm_kva += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s),
6604507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			BFA_CACHELINE_SZ);
661a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	dm_pa += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s),
6624507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			BFA_CACHELINE_SZ);
663a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6644507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* Claim IOCFC kva memory */
665f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	dbgsz = (bfa_auto_recover) ? BFA_DBG_FWTRC_LEN : 0;
666a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (dbgsz > 0) {
6674507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		bfa_ioc_debug_memclaim(&bfa->ioc, bfa_mem_kva_curp(iocfc));
6684507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		bfa_mem_kva_curp(iocfc) += dbgsz;
669a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
670a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
671a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6725fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
673a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Start BFA submodules.
674a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
675a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
676a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_start_submod(struct bfa_s *bfa)
677a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
678a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
679a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
680775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa->queue_process = BFA_TRUE;
681111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	for (i = 0; i < BFI_IOC_MAX_CQS; i++)
682ca6e0ea71cd0f442875b05357dd51774bd84b418Krishna Gudipati		bfa_isr_rspq_ack(bfa, i, bfa_rspq_ci(bfa, i));
683a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
684a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; hal_mods[i]; i++)
685a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		hal_mods[i]->start(bfa);
686a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
687a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
6885fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
689a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Disable BFA submodules.
690a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
691a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
692a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable_submod(struct bfa_s *bfa)
693a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
694a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
695a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
696a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; hal_mods[i]; i++)
697a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		hal_mods[i]->iocdisable(bfa);
698a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
699a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
700a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
701a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete)
702a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
703a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
704a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
705a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (complete) {
70645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		if (bfa->iocfc.cfgdone && BFA_DCONF_MOD(bfa)->flashdone)
707a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_init(bfa->bfad, BFA_STATUS_OK);
708a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		else
709a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_init(bfa->bfad, BFA_STATUS_FAILED);
710a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	} else {
711a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa->iocfc.cfgdone)
712a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa->iocfc.action = BFA_IOCFC_ACT_NONE;
713a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
714a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
715a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
716a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
717a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_stop_cb(void *bfa_arg, bfa_boolean_t compl)
718a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
719a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s  *bfa = bfa_arg;
720a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = bfa->bfad;
721a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
722a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (compl)
723a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		complete(&bfad->comp);
724a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else
725a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa->iocfc.action = BFA_IOCFC_ACT_NONE;
726a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
727a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
728a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
729601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatibfa_iocfc_enable_cb(void *bfa_arg, bfa_boolean_t compl)
730601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati{
731601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfa_s	*bfa = bfa_arg;
732601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	struct bfad_s *bfad = bfa->bfad;
733601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
734601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	if (compl)
735601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		complete(&bfad->enable_comp);
736601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati}
737601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati
738601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipatistatic void
739a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl)
740a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
741a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s  *bfa = bfa_arg;
742a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfad_s *bfad = bfa->bfad;
743a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
744a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (compl)
745a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		complete(&bfad->disable_comp);
746a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
747a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
748111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati/**
749111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati * configure queue registers from firmware response
750111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati */
751111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatistatic void
752111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipatibfa_iocfc_qreg(struct bfa_s *bfa, struct bfi_iocfc_qreg_s *qreg)
753111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati{
754111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	int     i;
755111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	struct bfa_iocfc_regs_s *r = &bfa->iocfc.bfa_regs;
756111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	void __iomem *kva = bfa_ioc_bar0(&bfa->ioc);
757111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
758111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	for (i = 0; i < BFI_IOC_MAX_CQS; i++) {
7593fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		bfa->iocfc.hw_qid[i] = qreg->hw_qid[i];
760111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		r->cpe_q_ci[i] = kva + be32_to_cpu(qreg->cpe_q_ci_off[i]);
761111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		r->cpe_q_pi[i] = kva + be32_to_cpu(qreg->cpe_q_pi_off[i]);
762111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		r->cpe_q_ctrl[i] = kva + be32_to_cpu(qreg->cpe_qctl_off[i]);
763111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		r->rme_q_ci[i] = kva + be32_to_cpu(qreg->rme_q_ci_off[i]);
764111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		r->rme_q_pi[i] = kva + be32_to_cpu(qreg->rme_q_pi_off[i]);
765111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati		r->rme_q_ctrl[i] = kva + be32_to_cpu(qreg->rme_qctl_off[i]);
766111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	}
767111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati}
768111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
7693fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipatistatic void
7703fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipatibfa_iocfc_res_recfg(struct bfa_s *bfa, struct bfa_iocfc_fwcfg_s *fwcfg)
7713fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati{
7723fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_fcxp_res_recfg(bfa, fwcfg->num_fcxp_reqs);
7733fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_uf_res_recfg(bfa, fwcfg->num_uf_bufs);
7743fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_rport_res_recfg(bfa, fwcfg->num_rports);
7753fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_fcp_res_recfg(bfa, fwcfg->num_ioim_reqs);
7763fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_tskim_res_recfg(bfa, fwcfg->num_tskim_reqs);
7773fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati}
7783fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
7795fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
780a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Update BFA configuration from firmware configuration.
781a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
782a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
783a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_cfgrsp(struct bfa_s *bfa)
784a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
785a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s		*iocfc	 = &bfa->iocfc;
786a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfgrsp_s	*cfgrsp	 = iocfc->cfgrsp;
787a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_fwcfg_s	*fwcfg	 = &cfgrsp->fwcfg;
788a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
789a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	fwcfg->num_cqs	      = fwcfg->num_cqs;
790ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_ioim_reqs  = be16_to_cpu(fwcfg->num_ioim_reqs);
791e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	fwcfg->num_fwtio_reqs = be16_to_cpu(fwcfg->num_fwtio_reqs);
792ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_tskim_reqs = be16_to_cpu(fwcfg->num_tskim_reqs);
793ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_fcxp_reqs  = be16_to_cpu(fwcfg->num_fcxp_reqs);
794ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_uf_bufs    = be16_to_cpu(fwcfg->num_uf_bufs);
795ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	fwcfg->num_rports     = be16_to_cpu(fwcfg->num_rports);
796a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
797a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfgdone = BFA_TRUE;
798a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
7995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang	/*
800111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 * configure queue register offsets as learnt from firmware
801111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	 */
802111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	bfa_iocfc_qreg(bfa, &cfgrsp->qreg);
803111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati
804111892082ed7a3214bc7a7ec6b8b20e8f847501aKrishna Gudipati	/*
8053fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	 * Re-configure resources as learnt from Firmware
8063fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	 */
8073fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_iocfc_res_recfg(bfa, fwcfg);
8083fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati
8093fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	/*
810775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	 * Install MSIX queue handlers
811775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	 */
812775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa_msix_queue_install(bfa);
813775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati
814775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	/*
815a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 * Configuration is complete - initialize/start submodules
816a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	 */
817a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_fcport_init(bfa);
818a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
81945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (iocfc->action == BFA_IOCFC_ACT_INIT) {
82045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		if (BFA_DCONF_MOD(bfa)->flashdone == BFA_TRUE)
82145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_cb_queue(bfa, &iocfc->init_hcb_qe,
82245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				bfa_iocfc_init_cb, bfa);
82345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	} else {
824601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE)
825601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe,
826601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati					bfa_iocfc_enable_cb, bfa);
827a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocfc_start_submod(bfa);
828601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	}
829a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
830a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
831a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_reset_queues(struct bfa_s *bfa)
832a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
833a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		q;
834a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
835a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (q = 0; q < BFI_IOC_MAX_CQS; q++) {
836a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_ci(bfa, q) = 0;
837a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_reqq_pi(bfa, q) = 0;
838a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_rspq_ci(bfa, q) = 0;
839a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_rspq_pi(bfa, q) = 0;
840a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
841a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
842a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
843a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati/* Fabric Assigned Address specific functions */
844a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
845a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati/*
846a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati *	Check whether IOC is ready before sending command down
847a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati */
848a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatistatic bfa_status_t
849a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_faa_validate_request(struct bfa_s *bfa)
850a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
851a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	enum bfa_ioc_type_e	ioc_type = bfa_get_type(bfa);
852a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	u32	card_type = bfa->ioc.attr->card_type;
853a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
854a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (bfa_ioc_is_operational(&bfa->ioc)) {
855a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		if ((ioc_type != BFA_IOC_TYPE_FC) || bfa_mfg_is_mezz(card_type))
856a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati			return BFA_STATUS_FEATURE_NOT_SUPPORTED;
857a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	} else {
858a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		if (!bfa_ioc_is_acq_addr(&bfa->ioc))
859a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati			return BFA_STATUS_IOC_NON_OP;
860a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	}
861a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
862a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return BFA_STATUS_OK;
863a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
864a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
865a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_status_t
866a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_faa_enable(struct bfa_s *bfa, bfa_cb_iocfc_t cbfn, void *cbarg)
867a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
868a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfi_faa_en_dis_s faa_enable_req;
869a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
870a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_status_t		status;
871a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
872a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbfn = cbfn;
873a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbarg = cbarg;
874a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
875a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	status = bfa_faa_validate_request(bfa);
876a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (status != BFA_STATUS_OK)
877a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return status;
878a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
879a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocfc->faa_args.busy == BFA_TRUE)
880a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return BFA_STATUS_DEVBUSY;
881a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
882a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocfc->faa_args.faa_state == BFA_FAA_ENABLED)
883a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return BFA_STATUS_FAA_ENABLED;
884a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
885a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (bfa_fcport_is_trunk_enabled(bfa))
886a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return BFA_STATUS_ERROR_TRUNK_ENABLED;
887a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
888a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_fcport_cfg_faa(bfa, BFA_FAA_ENABLED);
889a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.busy = BFA_TRUE;
890a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
891a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	memset(&faa_enable_req, 0, sizeof(struct bfi_faa_en_dis_s));
892a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfi_h2i_set(faa_enable_req.mh, BFI_MC_IOCFC,
8933fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		BFI_IOCFC_H2I_FAA_ENABLE_REQ, bfa_fn_lpu(bfa));
894a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
895a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_ioc_mbox_send(&bfa->ioc, &faa_enable_req,
896a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati			sizeof(struct bfi_faa_en_dis_s));
897a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
898a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return BFA_STATUS_OK;
899a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
900a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
901a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_status_t
902a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_faa_disable(struct bfa_s *bfa, bfa_cb_iocfc_t cbfn,
903a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		void *cbarg)
904a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
905a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfi_faa_en_dis_s faa_disable_req;
906a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
907a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_status_t		status;
908a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
909a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbfn = cbfn;
910a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbarg = cbarg;
911a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
912a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	status = bfa_faa_validate_request(bfa);
913a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (status != BFA_STATUS_OK)
914a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return status;
915a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
916a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocfc->faa_args.busy == BFA_TRUE)
917a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return BFA_STATUS_DEVBUSY;
918a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
919a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocfc->faa_args.faa_state == BFA_FAA_DISABLED)
920a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return BFA_STATUS_FAA_DISABLED;
921a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
922a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_fcport_cfg_faa(bfa, BFA_FAA_DISABLED);
923a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.busy = BFA_TRUE;
924a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
925a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	memset(&faa_disable_req, 0, sizeof(struct bfi_faa_en_dis_s));
926a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfi_h2i_set(faa_disable_req.mh, BFI_MC_IOCFC,
9273fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		BFI_IOCFC_H2I_FAA_DISABLE_REQ, bfa_fn_lpu(bfa));
928a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
929a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_ioc_mbox_send(&bfa->ioc, &faa_disable_req,
930a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		sizeof(struct bfi_faa_en_dis_s));
931a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
932a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return BFA_STATUS_OK;
933a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
934a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
935a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_status_t
936a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr,
937a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		bfa_cb_iocfc_t cbfn, void *cbarg)
938a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
939a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfi_faa_query_s  faa_attr_req;
940a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	struct bfa_iocfc_s      *iocfc = &bfa->iocfc;
941a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_status_t            status;
942a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
943a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_attr = attr;
944a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbfn = cbfn;
945a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbarg = cbarg;
946a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
947a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	status = bfa_faa_validate_request(bfa);
948a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (status != BFA_STATUS_OK)
949a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return status;
950a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
951a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocfc->faa_args.busy == BFA_TRUE)
952a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return BFA_STATUS_DEVBUSY;
953a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
954a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.busy = BFA_TRUE;
955a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	memset(&faa_attr_req, 0, sizeof(struct bfi_faa_query_s));
956a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfi_h2i_set(faa_attr_req.mh, BFI_MC_IOCFC,
9573fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		BFI_IOCFC_H2I_FAA_QUERY_REQ, bfa_fn_lpu(bfa));
958a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
959a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_ioc_mbox_send(&bfa->ioc, &faa_attr_req,
960a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		sizeof(struct bfi_faa_query_s));
961a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
962a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	return BFA_STATUS_OK;
963a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
964a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
965a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati/*
966a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati *	FAA enable response
967a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati */
968a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatistatic void
969a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_faa_enable_reply(struct bfa_iocfc_s *iocfc,
970a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		struct bfi_faa_en_dis_rsp_s *rsp)
971a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
972a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	void	*cbarg = iocfc->faa_args.faa_cb.faa_cbarg;
973a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_status_t	status = rsp->status;
974a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
975a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	WARN_ON(!iocfc->faa_args.faa_cb.faa_cbfn);
976a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
977a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbfn(cbarg, status);
978a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.busy = BFA_FALSE;
979a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
980a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
981a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati/*
982a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati *	FAA disable response
983a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati */
984a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatistatic void
985a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_faa_disable_reply(struct bfa_iocfc_s *iocfc,
986a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		struct bfi_faa_en_dis_rsp_s *rsp)
987a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
988a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	void	*cbarg = iocfc->faa_args.faa_cb.faa_cbarg;
989a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	bfa_status_t	status = rsp->status;
990a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
991a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	WARN_ON(!iocfc->faa_args.faa_cb.faa_cbfn);
992a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
993a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbfn(cbarg, status);
994a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.busy = BFA_FALSE;
995a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
996a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
997a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati/*
998a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati *	FAA query response
999a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati */
1000a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatistatic void
1001a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipatibfa_faa_query_reply(struct bfa_iocfc_s *iocfc,
1002a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		bfi_faa_query_rsp_t *rsp)
1003a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati{
1004a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	void	*cbarg = iocfc->faa_args.faa_cb.faa_cbarg;
1005a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1006a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (iocfc->faa_args.faa_attr) {
1007a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		iocfc->faa_args.faa_attr->faa = rsp->faa;
1008a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		iocfc->faa_args.faa_attr->faa_state = rsp->faa_status;
1009a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		iocfc->faa_args.faa_attr->pwwn_source = rsp->addr_source;
1010a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	}
1011a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1012a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	WARN_ON(!iocfc->faa_args.faa_cb.faa_cbfn);
1013a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1014a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.faa_cb.faa_cbfn(cbarg, BFA_STATUS_OK);
1015a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	iocfc->faa_args.busy = BFA_FALSE;
1016a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati}
1017a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
10185fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1019a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC enable request is complete
1020a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1021a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1022a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status)
1023a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1024a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
1025a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1026a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	if (status == BFA_STATUS_FAA_ACQ_ADDR) {
1027a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe,
1028a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati				bfa_iocfc_init_cb, bfa);
1029a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		return;
1030a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	}
1031a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati
1032a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (status != BFA_STATUS_OK) {
1033a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_isr_disable(bfa);
1034a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT)
1035a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe,
1036a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati				     bfa_iocfc_init_cb, bfa);
1037601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati		else if (bfa->iocfc.action == BFA_IOCFC_ACT_ENABLE)
1038601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati			bfa_cb_queue(bfa, &bfa->iocfc.en_hcb_qe,
1039601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati					bfa_iocfc_enable_cb, bfa);
1040a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
1041a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1042a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1043a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_send_cfg(bfa);
104445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_dconf_modinit(bfa);
1045a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1046a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10475fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1048a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC disable request is complete
1049a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1050a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1051a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable_cbfn(void *bfa_arg)
1052a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1053a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
1054a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1055a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_disable(bfa);
1056a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_disable_submod(bfa);
1057a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1058a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa->iocfc.action == BFA_IOCFC_ACT_STOP)
1059a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(bfa, &bfa->iocfc.stop_hcb_qe, bfa_iocfc_stop_cb,
1060a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			     bfa);
1061a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	else {
1062d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(bfa->iocfc.action != BFA_IOCFC_ACT_DISABLE);
1063a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(bfa, &bfa->iocfc.dis_hcb_qe, bfa_iocfc_disable_cb,
1064a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			     bfa);
1065a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1066a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1067a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10685fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1069a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Notify sub-modules of hardware failure.
1070a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1071a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1072a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_hbfail_cbfn(void *bfa_arg)
1073a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1074a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
1075a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1076775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa->queue_process = BFA_FALSE;
1077a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1078a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_disable(bfa);
1079a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_disable_submod(bfa);
1080a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1081a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT)
1082a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe, bfa_iocfc_init_cb,
1083a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			     bfa);
1084a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1085a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10865fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1087a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Actions on chip-reset completion.
1088a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1089a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatistatic void
1090a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_reset_cbfn(void *bfa_arg)
1091a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1092a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s	*bfa = bfa_arg;
1093a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1094a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_reset_queues(bfa);
1095a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_isr_enable(bfa);
1096a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1097a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1098a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
10995fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1100a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Query IOC memory requirement information.
1101a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1102a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
11034507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_iocfc_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo,
11044507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		  struct bfa_s *bfa)
1105a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
11064507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	int q, per_reqq_sz, per_rspq_sz;
11074507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *ioc_dma = BFA_MEM_IOC_DMA(bfa);
11084507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *iocfc_dma = BFA_MEM_IOCFC_DMA(bfa);
11094507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_kva_s *iocfc_kva = BFA_MEM_IOCFC_KVA(bfa);
11104507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	u32	dm_len = 0;
1111a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11124507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* dma memory setup for IOC */
11134507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_dma_setup(meminfo, ioc_dma,
11144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		BFA_ROUNDUP(sizeof(struct bfi_ioc_attr_s), BFA_DMA_ALIGN_SZ));
11154507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
11164507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* dma memory setup for REQ/RSP queues */
11174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	per_reqq_sz = BFA_ROUNDUP((cfg->drvcfg.num_reqq_elems * BFI_LMSG_SZ),
11184507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				BFA_DMA_ALIGN_SZ);
11194507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	per_rspq_sz = BFA_ROUNDUP((cfg->drvcfg.num_rspq_elems * BFI_LMSG_SZ),
11204507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				BFA_DMA_ALIGN_SZ);
11214507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
11224507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	for (q = 0; q < cfg->fwcfg.num_cqs; q++) {
11234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		bfa_mem_dma_setup(meminfo, BFA_MEM_REQQ_DMA(bfa, q),
11244507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				per_reqq_sz);
11254507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		bfa_mem_dma_setup(meminfo, BFA_MEM_RSPQ_DMA(bfa, q),
11264507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati				per_rspq_sz);
11274507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	}
11284507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
11294507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* IOCFC dma memory - calculate Shadow CI/PI size */
11304507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	for (q = 0; q < cfg->fwcfg.num_cqs; q++)
11314507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		dm_len += (2 * BFA_CACHELINE_SZ);
11324507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
11334507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* IOCFC dma memory - calculate config info / rsp size */
11344507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dm_len += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ);
11354507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dm_len += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s),
11364507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			BFA_CACHELINE_SZ);
11374507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
11384507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* dma memory setup for IOCFC */
11394507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_dma_setup(meminfo, iocfc_dma, dm_len);
11404507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
11414507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* kva memory setup for IOCFC */
11424507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_kva_setup(meminfo, iocfc_kva,
11434507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati			((bfa_auto_recover) ? BFA_DBG_FWTRC_LEN : 0));
1144a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1145a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11465fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1147a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Query IOC memory requirement information.
1148a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1149a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1150a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
11514507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		 struct bfa_pcidev_s *pcidev)
1152a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1153a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
1154a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_ioc_s *ioc = &bfa->ioc;
1155a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1156a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.enable_cbfn = bfa_iocfc_enable_cbfn;
1157a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.disable_cbfn = bfa_iocfc_disable_cbfn;
1158a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.hbfail_cbfn = bfa_iocfc_hbfail_cbfn;
1159a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_cbfn.reset_cbfn = bfa_iocfc_reset_cbfn;
1160a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1161a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	ioc->trcmod = bfa->trcmod;
1162a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_attach(&bfa->ioc, bfa, &bfa_iocfc_cbfn, &bfa->timer_mod);
1163a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1164d37779f8d98a1d7c5ba904982958167d988f01ddKrishna Gudipati	bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_PCIFN_CLASS_FC);
1165a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs);
1166a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1167a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev);
11684507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_iocfc_mem_claim(bfa, cfg);
1169f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	INIT_LIST_HEAD(&bfa->timer_mod.timer_q);
1170a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1171a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	INIT_LIST_HEAD(&bfa->comp_q);
1172a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	for (i = 0; i < BFI_IOC_MAX_CQS; i++)
1173a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		INIT_LIST_HEAD(&bfa->reqq_waitq[i]);
1174a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1175a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11765fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1177a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Query IOC memory requirement information.
1178a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1179a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1180a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_init(struct bfa_s *bfa)
1181a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1182a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.action = BFA_IOCFC_ACT_INIT;
1183a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_enable(&bfa->ioc);
1184a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1185a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11865fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1187a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC start called from bfa_start(). Called to start IOC operations
1188a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * at driver instantiation for this instance.
1189a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1190a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1191a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_start(struct bfa_s *bfa)
1192a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1193a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (bfa->iocfc.cfgdone)
1194a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocfc_start_submod(bfa);
1195a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1196a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
11975fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1198a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * IOC stop called from bfa_stop(). Called only when driver is unloaded
1199a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * for this instance.
1200a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1201a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1202a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_stop(struct bfa_s *bfa)
1203a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1204a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.action = BFA_IOCFC_ACT_STOP;
1205a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1206775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa->queue_process = BFA_FALSE;
120745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	bfa_dconf_modexit(bfa);
120845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (BFA_DCONF_MOD(bfa)->flashdone == BFA_TRUE)
120945c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		bfa_ioc_disable(&bfa->ioc);
1210a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1211a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1212a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1213a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_isr(void *bfaarg, struct bfi_mbmsg_s *m)
1214a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1215a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_s		*bfa = bfaarg;
1216a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
1217a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	union bfi_iocfc_i2h_msg_u	*msg;
1218a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1219a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	msg = (union bfi_iocfc_i2h_msg_u *) m;
1220a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, msg->mh.msg_id);
1221a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1222a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	switch (msg->mh.msg_id) {
1223a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOCFC_I2H_CFG_REPLY:
1224a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_iocfc_cfgrsp(bfa);
1225a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1226a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	case BFI_IOCFC_I2H_UPDATEQ_RSP:
1227a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		iocfc->updateq_cbfn(iocfc->updateq_cbarg, BFA_STATUS_OK);
1228a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		break;
1229a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case BFI_IOCFC_I2H_FAA_ENABLE_RSP:
1230a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		bfa_faa_enable_reply(iocfc,
1231a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati			(struct bfi_faa_en_dis_rsp_s *)msg);
1232a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1233a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case BFI_IOCFC_I2H_FAA_DISABLE_RSP:
1234a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		bfa_faa_disable_reply(iocfc,
1235a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati			(struct bfi_faa_en_dis_rsp_s *)msg);
1236a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1237a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati	case BFI_IOCFC_I2H_FAA_QUERY_RSP:
1238a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		bfa_faa_query_reply(iocfc, (bfi_faa_query_rsp_t *)msg);
1239a714134a857d3984250ee52fda7850b61bf8a94eKrishna Gudipati		break;
1240a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	default:
1241d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang		WARN_ON(1);
1242a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1243a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1244a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1245a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1246a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_get_attr(struct bfa_s *bfa, struct bfa_iocfc_attr_s *attr)
1247a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1248a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
1249a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1250a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->intr_attr.coalesce = iocfc->cfginfo->intr_attr.coalesce;
1251a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1252a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->intr_attr.delay = iocfc->cfginfo->intr_attr.delay ?
1253ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang				be16_to_cpu(iocfc->cfginfo->intr_attr.delay) :
1254ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang				be16_to_cpu(iocfc->cfgrsp->intr_attr.delay);
1255a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1256a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->intr_attr.latency = iocfc->cfginfo->intr_attr.latency ?
1257ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			be16_to_cpu(iocfc->cfginfo->intr_attr.latency) :
1258ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang			be16_to_cpu(iocfc->cfgrsp->intr_attr.latency);
1259a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1260a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	attr->config	= iocfc->cfg;
1261a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1262a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1263a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_status_t
1264a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_israttr_set(struct bfa_s *bfa, struct bfa_iocfc_intr_attr_s *attr)
1265a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1266a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s		*iocfc = &bfa->iocfc;
1267a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_set_intr_req_s *m;
1268a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1269a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfginfo->intr_attr.coalesce = attr->coalesce;
1270ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	iocfc->cfginfo->intr_attr.delay = cpu_to_be16(attr->delay);
1271ba816ea8e2eacbf3d198ad1859f413c2d6213434Jing Huang	iocfc->cfginfo->intr_attr.latency = cpu_to_be16(attr->latency);
1272a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1273a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!bfa_iocfc_is_operational(bfa))
1274a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_OK;
1275a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1276a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m = bfa_reqq_next(bfa, BFA_REQQ_IOC);
1277a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (!m)
1278a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return BFA_STATUS_DEVBUSY;
1279a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1280a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfi_h2i_set(m->mh, BFI_MC_IOCFC, BFI_IOCFC_H2I_SET_INTR_REQ,
12813fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati		    bfa_fn_lpu(bfa));
1282a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->coalesce = iocfc->cfginfo->intr_attr.coalesce;
1283a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->delay    = iocfc->cfginfo->intr_attr.delay;
1284a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	m->latency  = iocfc->cfginfo->intr_attr.latency;
1285a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1286a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, attr->delay);
1287a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_trc(bfa, attr->latency);
1288a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
12893fd459804ff8e002db2671900debd0fc6dc6c443Krishna Gudipati	bfa_reqq_produce(bfa, BFA_REQQ_IOC, m->mh);
1290a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return BFA_STATUS_OK;
1291a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1292a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1293a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
12944507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_iocfc_set_snsbase(struct bfa_s *bfa, int seg_no, u64 snsbase_pa)
1295a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1296a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s	*iocfc = &bfa->iocfc;
1297a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1298a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	iocfc->cfginfo->sense_buf_len = (BFI_IOIM_SNSLEN - 1);
12994507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_dma_be_addr_set(iocfc->cfginfo->ioim_snsbase[seg_no], snsbase_pa);
1300a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
13015fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1302a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Enable IOC after it is disabled.
1303a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1304a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1305a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_enable(struct bfa_s *bfa)
1306a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1307a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0,
1308a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		     "IOC Enable");
1309601380669baa2ba6427b821a14e5c91afb580dfcKrishna Gudipati	bfa->iocfc.action = BFA_IOCFC_ACT_ENABLE;
1310a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_enable(&bfa->ioc);
1311a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1312a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1313a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1314a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_disable(struct bfa_s *bfa)
1315a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1316a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0,
1317a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		     "IOC Disable");
1318a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa->iocfc.action = BFA_IOCFC_ACT_DISABLE;
1319a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1320775c7742adfd7726f05914198bf33eaa3b9f64bbKrishna Gudipati	bfa->queue_process = BFA_FALSE;
1321a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	bfa_ioc_disable(&bfa->ioc);
1322a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1323a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1324a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1325a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_boolean_t
1326a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_is_operational(struct bfa_s *bfa)
1327a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1328a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return bfa_ioc_is_operational(&bfa->ioc) && bfa->iocfc.cfgdone;
1329a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1330a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
13315fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
1332a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * Return boot target port wwns -- read from boot information in flash.
1333a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati */
1334a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipativoid
1335a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_get_bootwwns(struct bfa_s *bfa, u8 *nwwns, wwn_t *wwns)
1336a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1337a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s *iocfc = &bfa->iocfc;
1338a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp;
1339a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int i;
1340a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1341a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	if (cfgrsp->pbc_cfg.boot_enabled && cfgrsp->pbc_cfg.nbluns) {
1342a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		bfa_trc(bfa, cfgrsp->pbc_cfg.nbluns);
1343a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		*nwwns = cfgrsp->pbc_cfg.nbluns;
1344a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		for (i = 0; i < cfgrsp->pbc_cfg.nbluns; i++)
1345a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati			wwns[i] = cfgrsp->pbc_cfg.blun[i].tgt_pwwn;
1346a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1347a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati		return;
1348a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	}
1349a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1350a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*nwwns = cfgrsp->bootwwns.nwwns;
1351a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	memcpy(wwns, cfgrsp->bootwwns.wwn, sizeof(cfgrsp->bootwwns.wwn));
1352a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1353a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1354a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatiint
1355a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipatibfa_iocfc_get_pbc_vports(struct bfa_s *bfa, struct bfi_pbc_vport_s *pbc_vport)
1356a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati{
1357a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_iocfc_s *iocfc = &bfa->iocfc;
1358a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp;
1359a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
1360a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	memcpy(pbc_vport, cfgrsp->pbc_cfg.vport, sizeof(cfgrsp->pbc_cfg.vport));
1361a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	return cfgrsp->pbc_cfg.nvports;
1362a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati}
1363a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati
13647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
13655fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
13667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function query the memory requirement of the BFA library.
13677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This function needs to be called before bfa_attach() to get the
13687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * memory required of the BFA layer for a given driver configuration.
13697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
13707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This call will fail, if the cap is out of range compared to pre-defined
13717725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * values within the BFA library
13727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1373a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in] cfg -	pointer to bfa_ioc_cfg_t. Driver layer should indicate
1374a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			its configuration in this structure.
13757725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			The default values for struct bfa_iocfc_cfg_s can be
13767725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			fetched using bfa_cfg_get_default() API.
13777725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
1378a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			If cap's boundary check fails, the library will use
13797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			the default bfa_cap_t values (and log a warning msg).
13807725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
13817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[out] meminfo - pointer to bfa_meminfo_t. This content
1382a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			indicates the memory type (see bfa_mem_type_t) and
13837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			amount of memory required.
13847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
13857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			Driver should allocate the memory, populate the
13867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			starting address for each block and provide the same
13877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *			structure as input parameter to bfa_attach() call.
13887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
13894507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati * @param[in] bfa -	pointer to the bfa structure, used while fetching the
13904507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati *			dma, kva memory information of the bfa sub-modules.
13914507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati *
13927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return void
13937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
13947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations: @note
13957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
13967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
13974507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipatibfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo,
13984507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		struct bfa_s *bfa)
13997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1400a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	int		i;
14014507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *port_dma = BFA_MEM_PORT_DMA(bfa);
14024507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *ablk_dma = BFA_MEM_ABLK_DMA(bfa);
1403148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	struct bfa_mem_dma_s *cee_dma = BFA_MEM_CEE_DMA(bfa);
140451e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	struct bfa_mem_dma_s *sfp_dma = BFA_MEM_SFP_DMA(bfa);
14055a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	struct bfa_mem_dma_s *flash_dma = BFA_MEM_FLASH_DMA(bfa);
14063d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	struct bfa_mem_dma_s *diag_dma = BFA_MEM_DIAG_DMA(bfa);
14073350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	struct bfa_mem_dma_s *phy_dma = BFA_MEM_PHY_DMA(bfa);
14087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1409d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON((cfg == NULL) || (meminfo == NULL));
14107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14116a18b1675fdf08a6dc861e39c3f94309a03e7f16Jing Huang	memset((void *)meminfo, 0, sizeof(struct bfa_meminfo_s));
14127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14134507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* Initialize the DMA & KVA meminfo queues */
14144507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	INIT_LIST_HEAD(&meminfo->dma_info.qe);
14154507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	INIT_LIST_HEAD(&meminfo->kva_info.qe);
14167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14174507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_iocfc_meminfo(cfg, meminfo, bfa);
14187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14194507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	for (i = 0; hal_mods[i]; i++)
14204507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		hal_mods[i]->meminfo(cfg, meminfo, bfa);
14217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14224507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* dma info setup */
14234507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_dma_setup(meminfo, port_dma, bfa_port_meminfo());
14244507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_mem_dma_setup(meminfo, ablk_dma, bfa_ablk_meminfo());
1425148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_mem_dma_setup(meminfo, cee_dma, bfa_cee_meminfo());
142651e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_mem_dma_setup(meminfo, sfp_dma, bfa_sfp_meminfo());
14275a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_mem_dma_setup(meminfo, flash_dma,
14285a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati			  bfa_flash_meminfo(cfg->drvcfg.min_cfg));
14293d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_mem_dma_setup(meminfo, diag_dma, bfa_diag_meminfo());
14303350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_mem_dma_setup(meminfo, phy_dma,
14313350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati			  bfa_phy_meminfo(cfg->drvcfg.min_cfg));
14327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
14337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14345fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
14357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function to do attach the driver instance with the BFA
14367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * library. This function will not trigger any HW initialization
14377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * process (which will be done in bfa_init() call)
14387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * This call will fail, if the cap is out of range compared to
14407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * pre-defined values within the BFA library
14417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[out]	bfa	Pointer to bfa_t.
1443a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	bfad	Opaque handle back to the driver's IOC structure
14447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in]	cfg	Pointer to bfa_ioc_cfg_t. Should be same structure
1445a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			that was used in bfa_cfg_get_meminfo().
1446a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	meminfo	Pointer to bfa_meminfo_t. The driver should
1447a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			use the bfa_cfg_get_meminfo() call to
1448a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			find the memory blocks required, allocate the
1449a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati *			required memory and provide the starting addresses.
1450a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * @param[in]	pcidev	pointer to struct bfa_pcidev_s
14517725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14527725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return
14537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * void
14547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations:
14567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @note
14587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
14597725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
14607725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
14617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
14627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	       struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev)
14637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
14644507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	int	i;
14654507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_dma_s *dma_info, *dma_elem;
14664507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct bfa_mem_kva_s *kva_info, *kva_elem;
14674507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	struct list_head *dm_qe, *km_qe;
14687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa->fcs = BFA_FALSE;
14707725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1471d4b671c58ebeb56dfc8fe8bcca25e0a06bc9359aJing Huang	WARN_ON((cfg == NULL) || (meminfo == NULL));
14727725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14734507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	/* Initialize memory pointers for iterative allocation */
14744507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dma_info = &meminfo->dma_info;
14754507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dma_info->kva_curp = dma_info->kva;
14764507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	dma_info->dma_curp = dma_info->dma;
14774507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
14784507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	kva_info = &meminfo->kva_info;
14794507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	kva_info->kva_curp = kva_info->kva;
14804507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
14814507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	list_for_each(dm_qe, &dma_info->qe) {
14824507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		dma_elem = (struct bfa_mem_dma_s *) dm_qe;
14834507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		dma_elem->kva_curp = dma_elem->kva;
14844507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		dma_elem->dma_curp = dma_elem->dma;
14854507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	}
14864507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati
14874507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	list_for_each(km_qe, &kva_info->qe) {
14884507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		kva_elem = (struct bfa_mem_kva_s *) km_qe;
14894507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		kva_elem->kva_curp = kva_elem->kva;
14907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
14917725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14924507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_iocfc_attach(bfa, bfad, cfg, pcidev);
14937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14947725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; hal_mods[i]; i++)
14954507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati		hal_mods[i]->attach(bfa, bfad, cfg, pcidev);
14967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
14974507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_com_port_attach(bfa);
14984507025d01149aea8705e43508d0ef11e7010cfdKrishna Gudipati	bfa_com_ablk_attach(bfa);
1499148d61039c625f3f7e2d0a6ad1efe17f83153e65Krishna Gudipati	bfa_com_cee_attach(bfa);
150051e569aa1f0c10bd71af05e76e4ba0e42c51e4abKrishna Gudipati	bfa_com_sfp_attach(bfa);
15015a54b1d576d1880eb249e906e0c8e2ffe64506d3Krishna Gudipati	bfa_com_flash_attach(bfa, cfg->drvcfg.min_cfg);
15023d7fc66dcd8d510aaa46ab9b914b632bc149b05cKrishna Gudipati	bfa_com_diag_attach(bfa);
15033350d98d6d072fc4ac3622e61dc3dc351ef01dc5Krishna Gudipati	bfa_com_phy_attach(bfa, cfg->drvcfg.min_cfg);
15047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15065fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
15077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function to delete a BFA IOC. IOC should be stopped (by
15087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * calling bfa_stop()) before this function call.
15097725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
15107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] bfa - pointer to bfa_t.
15117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
15127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return
15137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * void
15147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
15157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations:
15167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
15177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @note
15187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
15197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_detach(struct bfa_s *bfa)
15217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15227725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	int	i;
15237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	for (i = 0; hal_mods[i]; i++)
15257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hal_mods[i]->detach(bfa);
1526f7f73812e95077c19a2801bbf4f483fcdab5232fMaggie Zhang	bfa_ioc_detach(&bfa->ioc);
15277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_comp_deq(struct bfa_s *bfa, struct list_head *comp_q)
15317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	INIT_LIST_HEAD(comp_q);
15337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_splice_tail_init(&bfa->comp_q, comp_q);
15347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_comp_process(struct bfa_s *bfa, struct list_head *comp_q)
15387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1539a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head		*qe;
1540a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head		*qen;
1541a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_cb_qe_s	*hcb_qe;
154237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati	bfa_cb_cbfn_status_t	cbfn;
15437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15447725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	list_for_each_safe(qe, qen, comp_q) {
15457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hcb_qe = (struct bfa_cb_qe_s *) qe;
154637ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		if (hcb_qe->pre_rmv) {
154737ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati			/* qe is invalid after return, dequeue before cbfn() */
154837ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati			list_del(qe);
154937ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati			cbfn = (bfa_cb_cbfn_status_t)(hcb_qe->cbfn);
155037ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati			cbfn(hcb_qe->cbarg, hcb_qe->fw_status);
155137ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		} else
155237ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati			hcb_qe->cbfn(hcb_qe->cbarg, BFA_TRUE);
15537725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15547725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15557725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15567725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15577725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_comp_free(struct bfa_s *bfa, struct list_head *comp_q)
15587725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
1559a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct list_head		*qe;
1560a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	struct bfa_cb_qe_s	*hcb_qe;
15617725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15627725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	while (!list_empty(comp_q)) {
15637725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		bfa_q_deq(comp_q, &qe);
15647725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hcb_qe = (struct bfa_cb_qe_s *) qe;
156537ea0558b87abb151245bc750070a4dcda490acaKrishna Gudipati		WARN_ON(hcb_qe->pre_rmv);
15667725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		hcb_qe->cbfn(hcb_qe->cbarg, BFA_FALSE);
15677725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	}
15687725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15697725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
157045c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipativoid
157145c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipatibfa_iocfc_cb_dconf_modinit(struct bfa_s *bfa, bfa_status_t status)
157245c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati{
157345c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	if (bfa->iocfc.action == BFA_IOCFC_ACT_INIT) {
157445c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati		if (bfa->iocfc.cfgdone == BFA_TRUE)
157545c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati			bfa_cb_queue(bfa, &bfa->iocfc.init_hcb_qe,
157645c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati				bfa_iocfc_init_cb, bfa);
157745c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati	}
157845c5dc1d3f42d4f54a5ab5f45ee55f0ffe1099f1Krishna Gudipati}
15797725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15805fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
15817725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Return the list of PCI vendor/device id lists supported by this
15827725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * BFA instance.
15837725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
15847725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
15857725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_get_pciids(struct bfa_pciid_s **pciids, int *npciids)
15867725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
15877725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	static struct bfa_pciid_s __pciids[] = {
15887725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_FC_8G2P},
15897725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_FC_8G1P},
15907725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_CT},
1591293f82d59ed8b6d61d242e40ee7a6a146fae5eaaJing Huang		{BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_CT_FC},
15927725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	};
15937725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
1594a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	*npciids = sizeof(__pciids) / sizeof(__pciids[0]);
15957725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	*pciids = __pciids;
15967725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
15977725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
15985fbe25c7a664601666895e8f95eaa59bd9741392Jing Huang/*
15997725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Use this function query the default struct bfa_iocfc_cfg_s value (compiled
16007725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * into BFA layer). The OS driver can then turn back and overwrite entries that
16017725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * have been configured by the user.
16027725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
16037725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @param[in] cfg - pointer to bfa_ioc_cfg_t
16047725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
16057725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * @return
16067725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *	void
16077725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang *
16087725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang * Special Considerations:
1609a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati * note
16107725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang */
16117725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
16127725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cfg_get_default(struct bfa_iocfc_cfg_s *cfg)
16137725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16147725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_fabrics = DEF_CFG_NUM_FABRICS;
16157725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_lports = DEF_CFG_NUM_LPORTS;
16167725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_rports = DEF_CFG_NUM_RPORTS;
16177725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_ioim_reqs = DEF_CFG_NUM_IOIM_REQS;
16187725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_tskim_reqs = DEF_CFG_NUM_TSKIM_REQS;
16197725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_fcxp_reqs = DEF_CFG_NUM_FCXP_REQS;
16207725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_uf_bufs = DEF_CFG_NUM_UF_BUFS;
16217725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_cqs = DEF_CFG_NUM_CQS;
1622e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	cfg->fwcfg.num_fwtio_reqs = 0;
16237725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16247725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_reqq_elems = DEF_CFG_NUM_REQQ_ELEMS;
16257725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_rspq_elems = DEF_CFG_NUM_RSPQ_ELEMS;
16267725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sgpgs = DEF_CFG_NUM_SGPGS;
16277725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sboot_tgts = DEF_CFG_NUM_SBOOT_TGTS;
16287725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sboot_luns = DEF_CFG_NUM_SBOOT_LUNS;
16297725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.path_tov = BFA_FCPIM_PATHTOV_DEF;
16307725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.ioc_recover = BFA_FALSE;
16317725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.delay_comp = BFA_FALSE;
16327725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16337725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
16347725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16357725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangvoid
16367725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huangbfa_cfg_get_min(struct bfa_iocfc_cfg_s *cfg)
16377725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang{
16387725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	bfa_cfg_get_default(cfg);
16397725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_ioim_reqs   = BFA_IOIM_MIN;
16407725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_tskim_reqs  = BFA_TSKIM_MIN;
16417725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_fcxp_reqs   = BFA_FCXP_MIN;
16427725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_uf_bufs     = BFA_UF_MIN;
16437725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->fwcfg.num_rports      = BFA_RPORT_MIN;
1644e2187d7f38967aeaf4148cdbe3498f76f4f71bcaKrishna Gudipati	cfg->fwcfg.num_fwtio_reqs = 0;
16457725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang
16467725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_sgpgs      = BFA_SGPG_MIN;
16477725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_reqq_elems = BFA_REQQ_NELEMS_MIN;
16487725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang	cfg->drvcfg.num_rspq_elems = BFA_RSPQ_NELEMS_MIN;
1649a36c61f9025b8924f99f54d518763bee7aa84085Krishna Gudipati	cfg->drvcfg.min_cfg	   = BFA_TRUE;
16507725ccfda59715ecf8f99e3b520a0b84cc2ea79eJing Huang}
1651