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