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