1*52fa7bf9SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only 27725ccfdSJing Huang /* 3889d0d42SAnil Gurumurthy * Copyright (c) 2005-2014 Brocade Communications Systems, Inc. 4889d0d42SAnil Gurumurthy * Copyright (c) 2014- QLogic Corporation. 57725ccfdSJing Huang * All rights reserved 6889d0d42SAnil Gurumurthy * www.qlogic.com 77725ccfdSJing Huang * 831e1d569SAnil Gurumurthy * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter. 97725ccfdSJing Huang */ 107725ccfdSJing Huang 11f16a1750SMaggie Zhang #include "bfad_drv.h" 12a36c61f9SKrishna Gudipati #include "bfa_modules.h" 1311189208SKrishna Gudipati #include "bfi_reg.h" 14a36c61f9SKrishna Gudipati 15a36c61f9SKrishna Gudipati BFA_TRC_FILE(HAL, CORE); 16a36c61f9SKrishna Gudipati 175fbe25c7SJing Huang /* 18b77ee1fbSMaggie Zhang * Message handlers for various modules. 19b77ee1fbSMaggie Zhang */ 20b77ee1fbSMaggie Zhang static bfa_isr_func_t bfa_isrs[BFI_MC_MAX] = { 21b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* NONE */ 22b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_IOC */ 233d7fc66dSKrishna Gudipati bfa_fcdiag_intr, /* BFI_MC_DIAG */ 24b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_FLASH */ 25b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_CEE */ 26b77ee1fbSMaggie Zhang bfa_fcport_isr, /* BFI_MC_FCPORT */ 27b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_IOCFC */ 28b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_LL */ 29b77ee1fbSMaggie Zhang bfa_uf_isr, /* BFI_MC_UF */ 30b77ee1fbSMaggie Zhang bfa_fcxp_isr, /* BFI_MC_FCXP */ 31b77ee1fbSMaggie Zhang bfa_lps_isr, /* BFI_MC_LPS */ 32b77ee1fbSMaggie Zhang bfa_rport_isr, /* BFI_MC_RPORT */ 33e2187d7fSKrishna Gudipati bfa_itn_isr, /* BFI_MC_ITN */ 34b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_IOIM_READ */ 35b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_IOIM_WRITE */ 36b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_IOIM_IO */ 37b77ee1fbSMaggie Zhang bfa_ioim_isr, /* BFI_MC_IOIM */ 38b77ee1fbSMaggie Zhang bfa_ioim_good_comp_isr, /* BFI_MC_IOIM_IOCOM */ 39b77ee1fbSMaggie Zhang bfa_tskim_isr, /* BFI_MC_TSKIM */ 40b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_SBOOT */ 41b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_IPFC */ 42b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* BFI_MC_PORT */ 43b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 44b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 45b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 46b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 47b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 48b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 49b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 50b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 51b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 52b77ee1fbSMaggie Zhang bfa_isr_unhandled, /* --------- */ 53b77ee1fbSMaggie Zhang }; 54b77ee1fbSMaggie Zhang /* 55b77ee1fbSMaggie Zhang * Message handlers for mailbox command classes 56b77ee1fbSMaggie Zhang */ 57b77ee1fbSMaggie Zhang static bfa_ioc_mbox_mcfunc_t bfa_mbox_isrs[BFI_MC_MAX] = { 58b77ee1fbSMaggie Zhang NULL, 59b77ee1fbSMaggie Zhang NULL, /* BFI_MC_IOC */ 60b77ee1fbSMaggie Zhang NULL, /* BFI_MC_DIAG */ 61b77ee1fbSMaggie Zhang NULL, /* BFI_MC_FLASH */ 62b77ee1fbSMaggie Zhang NULL, /* BFI_MC_CEE */ 63b77ee1fbSMaggie Zhang NULL, /* BFI_MC_PORT */ 64b77ee1fbSMaggie Zhang bfa_iocfc_isr, /* BFI_MC_IOCFC */ 65b77ee1fbSMaggie Zhang NULL, 66b77ee1fbSMaggie Zhang }; 67b77ee1fbSMaggie Zhang 68b77ee1fbSMaggie Zhang 69b77ee1fbSMaggie Zhang 70d04a78f4SDenys Vlasenko void 71d04a78f4SDenys Vlasenko __bfa_trc(struct bfa_trc_mod_s *trcm, int fileno, int line, u64 data) 72d04a78f4SDenys Vlasenko { 73d04a78f4SDenys Vlasenko int tail = trcm->tail; 74d04a78f4SDenys Vlasenko struct bfa_trc_s *trc = &trcm->trc[tail]; 75d04a78f4SDenys Vlasenko 76d04a78f4SDenys Vlasenko if (trcm->stopped) 77d04a78f4SDenys Vlasenko return; 78d04a78f4SDenys Vlasenko 79d04a78f4SDenys Vlasenko trc->fileno = (u16) fileno; 80d04a78f4SDenys Vlasenko trc->line = (u16) line; 81d04a78f4SDenys Vlasenko trc->data.u64 = data; 82d04a78f4SDenys Vlasenko trc->timestamp = BFA_TRC_TS(trcm); 83d04a78f4SDenys Vlasenko 84d04a78f4SDenys Vlasenko trcm->tail = (trcm->tail + 1) & (BFA_TRC_MAX - 1); 85d04a78f4SDenys Vlasenko if (trcm->tail == trcm->head) 86d04a78f4SDenys Vlasenko trcm->head = (trcm->head + 1) & (BFA_TRC_MAX - 1); 87d04a78f4SDenys Vlasenko } 88d04a78f4SDenys Vlasenko 89b77ee1fbSMaggie Zhang static void 904507025dSKrishna Gudipati bfa_com_port_attach(struct bfa_s *bfa) 91b77ee1fbSMaggie Zhang { 92b77ee1fbSMaggie Zhang struct bfa_port_s *port = &bfa->modules.port; 934507025dSKrishna Gudipati struct bfa_mem_dma_s *port_dma = BFA_MEM_PORT_DMA(bfa); 94b77ee1fbSMaggie Zhang 95b77ee1fbSMaggie Zhang bfa_port_attach(port, &bfa->ioc, bfa, bfa->trcmod); 964507025dSKrishna Gudipati bfa_port_mem_claim(port, port_dma->kva_curp, port_dma->dma_curp); 97b77ee1fbSMaggie Zhang } 98b77ee1fbSMaggie Zhang 99b77ee1fbSMaggie Zhang /* 1001a4d8e1bSKrishna Gudipati * ablk module attach 1011a4d8e1bSKrishna Gudipati */ 1021a4d8e1bSKrishna Gudipati static void 1034507025dSKrishna Gudipati bfa_com_ablk_attach(struct bfa_s *bfa) 1041a4d8e1bSKrishna Gudipati { 1051a4d8e1bSKrishna Gudipati struct bfa_ablk_s *ablk = &bfa->modules.ablk; 1064507025dSKrishna Gudipati struct bfa_mem_dma_s *ablk_dma = BFA_MEM_ABLK_DMA(bfa); 1071a4d8e1bSKrishna Gudipati 1081a4d8e1bSKrishna Gudipati bfa_ablk_attach(ablk, &bfa->ioc); 1094507025dSKrishna Gudipati bfa_ablk_memclaim(ablk, ablk_dma->kva_curp, ablk_dma->dma_curp); 1101a4d8e1bSKrishna Gudipati } 1111a4d8e1bSKrishna Gudipati 112148d6103SKrishna Gudipati static void 113148d6103SKrishna Gudipati bfa_com_cee_attach(struct bfa_s *bfa) 114148d6103SKrishna Gudipati { 115148d6103SKrishna Gudipati struct bfa_cee_s *cee = &bfa->modules.cee; 116148d6103SKrishna Gudipati struct bfa_mem_dma_s *cee_dma = BFA_MEM_CEE_DMA(bfa); 117148d6103SKrishna Gudipati 118148d6103SKrishna Gudipati cee->trcmod = bfa->trcmod; 119148d6103SKrishna Gudipati bfa_cee_attach(cee, &bfa->ioc, bfa); 120148d6103SKrishna Gudipati bfa_cee_mem_claim(cee, cee_dma->kva_curp, cee_dma->dma_curp); 121148d6103SKrishna Gudipati } 122148d6103SKrishna Gudipati 12351e569aaSKrishna Gudipati static void 12451e569aaSKrishna Gudipati bfa_com_sfp_attach(struct bfa_s *bfa) 12551e569aaSKrishna Gudipati { 12651e569aaSKrishna Gudipati struct bfa_sfp_s *sfp = BFA_SFP_MOD(bfa); 12751e569aaSKrishna Gudipati struct bfa_mem_dma_s *sfp_dma = BFA_MEM_SFP_DMA(bfa); 12851e569aaSKrishna Gudipati 12951e569aaSKrishna Gudipati bfa_sfp_attach(sfp, &bfa->ioc, bfa, bfa->trcmod); 13051e569aaSKrishna Gudipati bfa_sfp_memclaim(sfp, sfp_dma->kva_curp, sfp_dma->dma_curp); 13151e569aaSKrishna Gudipati } 13251e569aaSKrishna Gudipati 1335a54b1d5SKrishna Gudipati static void 1345a54b1d5SKrishna Gudipati bfa_com_flash_attach(struct bfa_s *bfa, bfa_boolean_t mincfg) 1355a54b1d5SKrishna Gudipati { 1365a54b1d5SKrishna Gudipati struct bfa_flash_s *flash = BFA_FLASH(bfa); 1375a54b1d5SKrishna Gudipati struct bfa_mem_dma_s *flash_dma = BFA_MEM_FLASH_DMA(bfa); 1385a54b1d5SKrishna Gudipati 1395a54b1d5SKrishna Gudipati bfa_flash_attach(flash, &bfa->ioc, bfa, bfa->trcmod, mincfg); 1405a54b1d5SKrishna Gudipati bfa_flash_memclaim(flash, flash_dma->kva_curp, 1415a54b1d5SKrishna Gudipati flash_dma->dma_curp, mincfg); 1425a54b1d5SKrishna Gudipati } 1435a54b1d5SKrishna Gudipati 1443d7fc66dSKrishna Gudipati static void 1453d7fc66dSKrishna Gudipati bfa_com_diag_attach(struct bfa_s *bfa) 1463d7fc66dSKrishna Gudipati { 1473d7fc66dSKrishna Gudipati struct bfa_diag_s *diag = BFA_DIAG_MOD(bfa); 1483d7fc66dSKrishna Gudipati struct bfa_mem_dma_s *diag_dma = BFA_MEM_DIAG_DMA(bfa); 1493d7fc66dSKrishna Gudipati 1503d7fc66dSKrishna Gudipati bfa_diag_attach(diag, &bfa->ioc, bfa, bfa_fcport_beacon, bfa->trcmod); 1513d7fc66dSKrishna Gudipati bfa_diag_memclaim(diag, diag_dma->kva_curp, diag_dma->dma_curp); 1523d7fc66dSKrishna Gudipati } 1533d7fc66dSKrishna Gudipati 1543350d98dSKrishna Gudipati static void 1553350d98dSKrishna Gudipati bfa_com_phy_attach(struct bfa_s *bfa, bfa_boolean_t mincfg) 1563350d98dSKrishna Gudipati { 1573350d98dSKrishna Gudipati struct bfa_phy_s *phy = BFA_PHY(bfa); 1583350d98dSKrishna Gudipati struct bfa_mem_dma_s *phy_dma = BFA_MEM_PHY_DMA(bfa); 1593350d98dSKrishna Gudipati 1603350d98dSKrishna Gudipati bfa_phy_attach(phy, &bfa->ioc, bfa, bfa->trcmod, mincfg); 1613350d98dSKrishna Gudipati bfa_phy_memclaim(phy, phy_dma->kva_curp, phy_dma->dma_curp, mincfg); 1623350d98dSKrishna Gudipati } 1633350d98dSKrishna Gudipati 164e6826c96SKrishna Gudipati static void 165e6826c96SKrishna Gudipati bfa_com_fru_attach(struct bfa_s *bfa, bfa_boolean_t mincfg) 166e6826c96SKrishna Gudipati { 167e6826c96SKrishna Gudipati struct bfa_fru_s *fru = BFA_FRU(bfa); 168e6826c96SKrishna Gudipati struct bfa_mem_dma_s *fru_dma = BFA_MEM_FRU_DMA(bfa); 169e6826c96SKrishna Gudipati 170e6826c96SKrishna Gudipati bfa_fru_attach(fru, &bfa->ioc, bfa, bfa->trcmod, mincfg); 171e6826c96SKrishna Gudipati bfa_fru_memclaim(fru, fru_dma->kva_curp, fru_dma->dma_curp, mincfg); 172e6826c96SKrishna Gudipati } 173e6826c96SKrishna Gudipati 1741a4d8e1bSKrishna Gudipati /* 175a36c61f9SKrishna Gudipati * BFA IOC FC related definitions 176a36c61f9SKrishna Gudipati */ 177a36c61f9SKrishna Gudipati 1785fbe25c7SJing Huang /* 179a36c61f9SKrishna Gudipati * IOC local definitions 180a36c61f9SKrishna Gudipati */ 181a36c61f9SKrishna Gudipati #define BFA_IOCFC_TOV 5000 /* msecs */ 182a36c61f9SKrishna Gudipati 183a36c61f9SKrishna Gudipati enum { 184a36c61f9SKrishna Gudipati BFA_IOCFC_ACT_NONE = 0, 185a36c61f9SKrishna Gudipati BFA_IOCFC_ACT_INIT = 1, 186a36c61f9SKrishna Gudipati BFA_IOCFC_ACT_STOP = 2, 187a36c61f9SKrishna Gudipati BFA_IOCFC_ACT_DISABLE = 3, 18860138066SKrishna Gudipati BFA_IOCFC_ACT_ENABLE = 4, 189a36c61f9SKrishna Gudipati }; 1907725ccfdSJing Huang 1917725ccfdSJing Huang #define DEF_CFG_NUM_FABRICS 1 1927725ccfdSJing Huang #define DEF_CFG_NUM_LPORTS 256 1937725ccfdSJing Huang #define DEF_CFG_NUM_CQS 4 1947725ccfdSJing Huang #define DEF_CFG_NUM_IOIM_REQS (BFA_IOIM_MAX) 1957725ccfdSJing Huang #define DEF_CFG_NUM_TSKIM_REQS 128 1967725ccfdSJing Huang #define DEF_CFG_NUM_FCXP_REQS 64 1977725ccfdSJing Huang #define DEF_CFG_NUM_UF_BUFS 64 1987725ccfdSJing Huang #define DEF_CFG_NUM_RPORTS 1024 1997725ccfdSJing Huang #define DEF_CFG_NUM_ITNIMS (DEF_CFG_NUM_RPORTS) 2007725ccfdSJing Huang #define DEF_CFG_NUM_TINS 256 2017725ccfdSJing Huang 2027725ccfdSJing Huang #define DEF_CFG_NUM_SGPGS 2048 2037725ccfdSJing Huang #define DEF_CFG_NUM_REQQ_ELEMS 256 2047725ccfdSJing Huang #define DEF_CFG_NUM_RSPQ_ELEMS 64 2057725ccfdSJing Huang #define DEF_CFG_NUM_SBOOT_TGTS 16 2067725ccfdSJing Huang #define DEF_CFG_NUM_SBOOT_LUNS 16 2077725ccfdSJing Huang 2085fbe25c7SJing Huang /* 209db9d8a75SKrishna Gudipati * IOCFC state machine definitions/declarations 210db9d8a75SKrishna Gudipati */ 211db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, stopped, struct bfa_iocfc_s, enum iocfc_event); 212db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, initing, struct bfa_iocfc_s, enum iocfc_event); 213db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, dconf_read, struct bfa_iocfc_s, enum iocfc_event); 214db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, init_cfg_wait, 215db9d8a75SKrishna Gudipati struct bfa_iocfc_s, enum iocfc_event); 216db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, init_cfg_done, 217db9d8a75SKrishna Gudipati struct bfa_iocfc_s, enum iocfc_event); 218db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, operational, 219db9d8a75SKrishna Gudipati struct bfa_iocfc_s, enum iocfc_event); 220db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, dconf_write, 221db9d8a75SKrishna Gudipati struct bfa_iocfc_s, enum iocfc_event); 222db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, stopping, struct bfa_iocfc_s, enum iocfc_event); 223db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, enabling, struct bfa_iocfc_s, enum iocfc_event); 224db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, cfg_wait, struct bfa_iocfc_s, enum iocfc_event); 225db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, disabling, struct bfa_iocfc_s, enum iocfc_event); 226db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, disabled, struct bfa_iocfc_s, enum iocfc_event); 227db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, failed, struct bfa_iocfc_s, enum iocfc_event); 228db9d8a75SKrishna Gudipati bfa_fsm_state_decl(bfa_iocfc, init_failed, 229db9d8a75SKrishna Gudipati struct bfa_iocfc_s, enum iocfc_event); 230db9d8a75SKrishna Gudipati 231db9d8a75SKrishna Gudipati /* 232a36c61f9SKrishna Gudipati * forward declaration for IOC FC functions 233a36c61f9SKrishna Gudipati */ 234db9d8a75SKrishna Gudipati static void bfa_iocfc_start_submod(struct bfa_s *bfa); 235db9d8a75SKrishna Gudipati static void bfa_iocfc_disable_submod(struct bfa_s *bfa); 236db9d8a75SKrishna Gudipati static void bfa_iocfc_send_cfg(void *bfa_arg); 237a36c61f9SKrishna Gudipati static void bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status); 238a36c61f9SKrishna Gudipati static void bfa_iocfc_disable_cbfn(void *bfa_arg); 239a36c61f9SKrishna Gudipati static void bfa_iocfc_hbfail_cbfn(void *bfa_arg); 240a36c61f9SKrishna Gudipati static void bfa_iocfc_reset_cbfn(void *bfa_arg); 241a36c61f9SKrishna Gudipati static struct bfa_ioc_cbfn_s bfa_iocfc_cbfn; 242db9d8a75SKrishna Gudipati static void bfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete); 243db9d8a75SKrishna Gudipati static void bfa_iocfc_stop_cb(void *bfa_arg, bfa_boolean_t compl); 244db9d8a75SKrishna Gudipati static void bfa_iocfc_enable_cb(void *bfa_arg, bfa_boolean_t compl); 245db9d8a75SKrishna Gudipati static void bfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl); 246db9d8a75SKrishna Gudipati 247db9d8a75SKrishna Gudipati static void 248db9d8a75SKrishna Gudipati bfa_iocfc_sm_stopped_entry(struct bfa_iocfc_s *iocfc) 249db9d8a75SKrishna Gudipati { 250db9d8a75SKrishna Gudipati } 251db9d8a75SKrishna Gudipati 252db9d8a75SKrishna Gudipati static void 253db9d8a75SKrishna Gudipati bfa_iocfc_sm_stopped(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 254db9d8a75SKrishna Gudipati { 255db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 256db9d8a75SKrishna Gudipati 257db9d8a75SKrishna Gudipati switch (event) { 258db9d8a75SKrishna Gudipati case IOCFC_E_INIT: 259db9d8a75SKrishna Gudipati case IOCFC_E_ENABLE: 260db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_initing); 261db9d8a75SKrishna Gudipati break; 262db9d8a75SKrishna Gudipati default: 263db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 264db9d8a75SKrishna Gudipati break; 265db9d8a75SKrishna Gudipati } 266db9d8a75SKrishna Gudipati } 267db9d8a75SKrishna Gudipati 268db9d8a75SKrishna Gudipati static void 269db9d8a75SKrishna Gudipati bfa_iocfc_sm_initing_entry(struct bfa_iocfc_s *iocfc) 270db9d8a75SKrishna Gudipati { 271db9d8a75SKrishna Gudipati bfa_ioc_enable(&iocfc->bfa->ioc); 272db9d8a75SKrishna Gudipati } 273db9d8a75SKrishna Gudipati 274db9d8a75SKrishna Gudipati static void 275db9d8a75SKrishna Gudipati bfa_iocfc_sm_initing(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 276db9d8a75SKrishna Gudipati { 277db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 278db9d8a75SKrishna Gudipati 279db9d8a75SKrishna Gudipati switch (event) { 280db9d8a75SKrishna Gudipati case IOCFC_E_IOC_ENABLED: 281db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_read); 282db9d8a75SKrishna Gudipati break; 2837ac83b1fSKrishna Gudipati 2847ac83b1fSKrishna Gudipati case IOCFC_E_DISABLE: 2857ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 2867ac83b1fSKrishna Gudipati break; 2877ac83b1fSKrishna Gudipati 2887ac83b1fSKrishna Gudipati case IOCFC_E_STOP: 2897ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); 2907ac83b1fSKrishna Gudipati break; 2917ac83b1fSKrishna Gudipati 292db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 293db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_failed); 294db9d8a75SKrishna Gudipati break; 295db9d8a75SKrishna Gudipati default: 296db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 297db9d8a75SKrishna Gudipati break; 298db9d8a75SKrishna Gudipati } 299db9d8a75SKrishna Gudipati } 300db9d8a75SKrishna Gudipati 301db9d8a75SKrishna Gudipati static void 302db9d8a75SKrishna Gudipati bfa_iocfc_sm_dconf_read_entry(struct bfa_iocfc_s *iocfc) 303db9d8a75SKrishna Gudipati { 304db9d8a75SKrishna Gudipati bfa_dconf_modinit(iocfc->bfa); 305db9d8a75SKrishna Gudipati } 306db9d8a75SKrishna Gudipati 307db9d8a75SKrishna Gudipati static void 308db9d8a75SKrishna Gudipati bfa_iocfc_sm_dconf_read(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 309db9d8a75SKrishna Gudipati { 310db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 311db9d8a75SKrishna Gudipati 312db9d8a75SKrishna Gudipati switch (event) { 313db9d8a75SKrishna Gudipati case IOCFC_E_DCONF_DONE: 314db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_cfg_wait); 315db9d8a75SKrishna Gudipati break; 3167ac83b1fSKrishna Gudipati 3177ac83b1fSKrishna Gudipati case IOCFC_E_DISABLE: 3187ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 3197ac83b1fSKrishna Gudipati break; 3207ac83b1fSKrishna Gudipati 3217ac83b1fSKrishna Gudipati case IOCFC_E_STOP: 3227ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); 3237ac83b1fSKrishna Gudipati break; 3247ac83b1fSKrishna Gudipati 325db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 326db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_failed); 327db9d8a75SKrishna Gudipati break; 328db9d8a75SKrishna Gudipati default: 329db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 330db9d8a75SKrishna Gudipati break; 331db9d8a75SKrishna Gudipati } 332db9d8a75SKrishna Gudipati } 333db9d8a75SKrishna Gudipati 334db9d8a75SKrishna Gudipati static void 335db9d8a75SKrishna Gudipati bfa_iocfc_sm_init_cfg_wait_entry(struct bfa_iocfc_s *iocfc) 336db9d8a75SKrishna Gudipati { 337db9d8a75SKrishna Gudipati bfa_iocfc_send_cfg(iocfc->bfa); 338db9d8a75SKrishna Gudipati } 339db9d8a75SKrishna Gudipati 340db9d8a75SKrishna Gudipati static void 341db9d8a75SKrishna Gudipati bfa_iocfc_sm_init_cfg_wait(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 342db9d8a75SKrishna Gudipati { 343db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 344db9d8a75SKrishna Gudipati 345db9d8a75SKrishna Gudipati switch (event) { 346db9d8a75SKrishna Gudipati case IOCFC_E_CFG_DONE: 347db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_cfg_done); 348db9d8a75SKrishna Gudipati break; 3497ac83b1fSKrishna Gudipati 3507ac83b1fSKrishna Gudipati case IOCFC_E_DISABLE: 3517ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 3527ac83b1fSKrishna Gudipati break; 3537ac83b1fSKrishna Gudipati 3547ac83b1fSKrishna Gudipati case IOCFC_E_STOP: 3557ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); 3567ac83b1fSKrishna Gudipati break; 3577ac83b1fSKrishna Gudipati 358db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 359db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_init_failed); 360db9d8a75SKrishna Gudipati break; 361db9d8a75SKrishna Gudipati default: 362db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 363db9d8a75SKrishna Gudipati break; 364db9d8a75SKrishna Gudipati } 365db9d8a75SKrishna Gudipati } 366db9d8a75SKrishna Gudipati 367db9d8a75SKrishna Gudipati static void 368db9d8a75SKrishna Gudipati bfa_iocfc_sm_init_cfg_done_entry(struct bfa_iocfc_s *iocfc) 369db9d8a75SKrishna Gudipati { 370db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; 371db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.init_hcb_qe, 372db9d8a75SKrishna Gudipati bfa_iocfc_init_cb, iocfc->bfa); 373db9d8a75SKrishna Gudipati } 374db9d8a75SKrishna Gudipati 375db9d8a75SKrishna Gudipati static void 376db9d8a75SKrishna Gudipati bfa_iocfc_sm_init_cfg_done(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 377db9d8a75SKrishna Gudipati { 378db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 379db9d8a75SKrishna Gudipati 380db9d8a75SKrishna Gudipati switch (event) { 381db9d8a75SKrishna Gudipati case IOCFC_E_START: 382db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_operational); 383db9d8a75SKrishna Gudipati break; 384db9d8a75SKrishna Gudipati case IOCFC_E_STOP: 385db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); 386db9d8a75SKrishna Gudipati break; 387db9d8a75SKrishna Gudipati case IOCFC_E_DISABLE: 388db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 389db9d8a75SKrishna Gudipati break; 390db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 391db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); 392db9d8a75SKrishna Gudipati break; 393db9d8a75SKrishna Gudipati default: 394db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 395db9d8a75SKrishna Gudipati break; 396db9d8a75SKrishna Gudipati } 397db9d8a75SKrishna Gudipati } 398db9d8a75SKrishna Gudipati 399db9d8a75SKrishna Gudipati static void 400db9d8a75SKrishna Gudipati bfa_iocfc_sm_operational_entry(struct bfa_iocfc_s *iocfc) 401db9d8a75SKrishna Gudipati { 402db9d8a75SKrishna Gudipati bfa_fcport_init(iocfc->bfa); 403db9d8a75SKrishna Gudipati bfa_iocfc_start_submod(iocfc->bfa); 404db9d8a75SKrishna Gudipati } 405db9d8a75SKrishna Gudipati 406db9d8a75SKrishna Gudipati static void 407db9d8a75SKrishna Gudipati bfa_iocfc_sm_operational(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 408db9d8a75SKrishna Gudipati { 409db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 410db9d8a75SKrishna Gudipati 411db9d8a75SKrishna Gudipati switch (event) { 412db9d8a75SKrishna Gudipati case IOCFC_E_STOP: 413db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); 414db9d8a75SKrishna Gudipati break; 415db9d8a75SKrishna Gudipati case IOCFC_E_DISABLE: 416db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 417db9d8a75SKrishna Gudipati break; 418db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 419db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); 420db9d8a75SKrishna Gudipati break; 421db9d8a75SKrishna Gudipati default: 422db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 423db9d8a75SKrishna Gudipati break; 424db9d8a75SKrishna Gudipati } 425db9d8a75SKrishna Gudipati } 426db9d8a75SKrishna Gudipati 427db9d8a75SKrishna Gudipati static void 428db9d8a75SKrishna Gudipati bfa_iocfc_sm_dconf_write_entry(struct bfa_iocfc_s *iocfc) 429db9d8a75SKrishna Gudipati { 430db9d8a75SKrishna Gudipati bfa_dconf_modexit(iocfc->bfa); 431db9d8a75SKrishna Gudipati } 432db9d8a75SKrishna Gudipati 433db9d8a75SKrishna Gudipati static void 434db9d8a75SKrishna Gudipati bfa_iocfc_sm_dconf_write(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 435db9d8a75SKrishna Gudipati { 436db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 437db9d8a75SKrishna Gudipati 438db9d8a75SKrishna Gudipati switch (event) { 439db9d8a75SKrishna Gudipati case IOCFC_E_DCONF_DONE: 440db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 441db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); 442db9d8a75SKrishna Gudipati break; 443db9d8a75SKrishna Gudipati default: 444db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 445db9d8a75SKrishna Gudipati break; 446db9d8a75SKrishna Gudipati } 447db9d8a75SKrishna Gudipati } 448db9d8a75SKrishna Gudipati 449db9d8a75SKrishna Gudipati static void 450db9d8a75SKrishna Gudipati bfa_iocfc_sm_stopping_entry(struct bfa_iocfc_s *iocfc) 451db9d8a75SKrishna Gudipati { 452db9d8a75SKrishna Gudipati bfa_ioc_disable(&iocfc->bfa->ioc); 453db9d8a75SKrishna Gudipati } 454db9d8a75SKrishna Gudipati 455db9d8a75SKrishna Gudipati static void 456db9d8a75SKrishna Gudipati bfa_iocfc_sm_stopping(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 457db9d8a75SKrishna Gudipati { 458db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 459db9d8a75SKrishna Gudipati 460db9d8a75SKrishna Gudipati switch (event) { 461db9d8a75SKrishna Gudipati case IOCFC_E_IOC_DISABLED: 462db9d8a75SKrishna Gudipati bfa_isr_disable(iocfc->bfa); 463db9d8a75SKrishna Gudipati bfa_iocfc_disable_submod(iocfc->bfa); 464db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopped); 465db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; 466db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.stop_hcb_qe, 467db9d8a75SKrishna Gudipati bfa_iocfc_stop_cb, iocfc->bfa); 468db9d8a75SKrishna Gudipati break; 4697ac83b1fSKrishna Gudipati 4707ac83b1fSKrishna Gudipati case IOCFC_E_IOC_ENABLED: 4717ac83b1fSKrishna Gudipati case IOCFC_E_DCONF_DONE: 4727ac83b1fSKrishna Gudipati case IOCFC_E_CFG_DONE: 4737ac83b1fSKrishna Gudipati break; 4747ac83b1fSKrishna Gudipati 475db9d8a75SKrishna Gudipati default: 476db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 477db9d8a75SKrishna Gudipati break; 478db9d8a75SKrishna Gudipati } 479db9d8a75SKrishna Gudipati } 480db9d8a75SKrishna Gudipati 481db9d8a75SKrishna Gudipati static void 482db9d8a75SKrishna Gudipati bfa_iocfc_sm_enabling_entry(struct bfa_iocfc_s *iocfc) 483db9d8a75SKrishna Gudipati { 484db9d8a75SKrishna Gudipati bfa_ioc_enable(&iocfc->bfa->ioc); 485db9d8a75SKrishna Gudipati } 486db9d8a75SKrishna Gudipati 487db9d8a75SKrishna Gudipati static void 488db9d8a75SKrishna Gudipati bfa_iocfc_sm_enabling(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 489db9d8a75SKrishna Gudipati { 490db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 491db9d8a75SKrishna Gudipati 492db9d8a75SKrishna Gudipati switch (event) { 493db9d8a75SKrishna Gudipati case IOCFC_E_IOC_ENABLED: 494db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_cfg_wait); 495db9d8a75SKrishna Gudipati break; 4967ac83b1fSKrishna Gudipati 4977ac83b1fSKrishna Gudipati case IOCFC_E_DISABLE: 4987ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 4997ac83b1fSKrishna Gudipati break; 5007ac83b1fSKrishna Gudipati 5017ac83b1fSKrishna Gudipati case IOCFC_E_STOP: 5027ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); 5037ac83b1fSKrishna Gudipati break; 5047ac83b1fSKrishna Gudipati 505db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 506db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); 507db9d8a75SKrishna Gudipati 508db9d8a75SKrishna Gudipati if (iocfc->bfa->iocfc.cb_reqd == BFA_FALSE) 509db9d8a75SKrishna Gudipati break; 510db9d8a75SKrishna Gudipati 511db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_FAILED; 512db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.en_hcb_qe, 513db9d8a75SKrishna Gudipati bfa_iocfc_enable_cb, iocfc->bfa); 514db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.cb_reqd = BFA_FALSE; 515db9d8a75SKrishna Gudipati break; 516db9d8a75SKrishna Gudipati default: 517db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 518db9d8a75SKrishna Gudipati break; 519db9d8a75SKrishna Gudipati } 520db9d8a75SKrishna Gudipati } 521db9d8a75SKrishna Gudipati 522db9d8a75SKrishna Gudipati static void 523db9d8a75SKrishna Gudipati bfa_iocfc_sm_cfg_wait_entry(struct bfa_iocfc_s *iocfc) 524db9d8a75SKrishna Gudipati { 525db9d8a75SKrishna Gudipati bfa_iocfc_send_cfg(iocfc->bfa); 526db9d8a75SKrishna Gudipati } 527db9d8a75SKrishna Gudipati 528db9d8a75SKrishna Gudipati static void 529db9d8a75SKrishna Gudipati bfa_iocfc_sm_cfg_wait(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 530db9d8a75SKrishna Gudipati { 531db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 532db9d8a75SKrishna Gudipati 533db9d8a75SKrishna Gudipati switch (event) { 534db9d8a75SKrishna Gudipati case IOCFC_E_CFG_DONE: 535db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_operational); 536db9d8a75SKrishna Gudipati if (iocfc->bfa->iocfc.cb_reqd == BFA_FALSE) 537db9d8a75SKrishna Gudipati break; 538db9d8a75SKrishna Gudipati 539db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; 540db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.en_hcb_qe, 541db9d8a75SKrishna Gudipati bfa_iocfc_enable_cb, iocfc->bfa); 542db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.cb_reqd = BFA_FALSE; 543db9d8a75SKrishna Gudipati break; 5447ac83b1fSKrishna Gudipati case IOCFC_E_DISABLE: 5457ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 5467ac83b1fSKrishna Gudipati break; 5477ac83b1fSKrishna Gudipati 5487ac83b1fSKrishna Gudipati case IOCFC_E_STOP: 5497ac83b1fSKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); 5507ac83b1fSKrishna Gudipati break; 551db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 552db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_failed); 553db9d8a75SKrishna Gudipati if (iocfc->bfa->iocfc.cb_reqd == BFA_FALSE) 554db9d8a75SKrishna Gudipati break; 555db9d8a75SKrishna Gudipati 556db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_FAILED; 557db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.en_hcb_qe, 558db9d8a75SKrishna Gudipati bfa_iocfc_enable_cb, iocfc->bfa); 559db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.cb_reqd = BFA_FALSE; 560db9d8a75SKrishna Gudipati break; 561db9d8a75SKrishna Gudipati default: 562db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 563db9d8a75SKrishna Gudipati break; 564db9d8a75SKrishna Gudipati } 565db9d8a75SKrishna Gudipati } 566db9d8a75SKrishna Gudipati 567db9d8a75SKrishna Gudipati static void 568db9d8a75SKrishna Gudipati bfa_iocfc_sm_disabling_entry(struct bfa_iocfc_s *iocfc) 569db9d8a75SKrishna Gudipati { 570db9d8a75SKrishna Gudipati bfa_ioc_disable(&iocfc->bfa->ioc); 571db9d8a75SKrishna Gudipati } 572db9d8a75SKrishna Gudipati 573db9d8a75SKrishna Gudipati static void 574db9d8a75SKrishna Gudipati bfa_iocfc_sm_disabling(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 575db9d8a75SKrishna Gudipati { 576db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 577db9d8a75SKrishna Gudipati 578db9d8a75SKrishna Gudipati switch (event) { 579db9d8a75SKrishna Gudipati case IOCFC_E_IOC_DISABLED: 580db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabled); 581db9d8a75SKrishna Gudipati break; 5827ac83b1fSKrishna Gudipati case IOCFC_E_IOC_ENABLED: 5837ac83b1fSKrishna Gudipati case IOCFC_E_DCONF_DONE: 5847ac83b1fSKrishna Gudipati case IOCFC_E_CFG_DONE: 5857ac83b1fSKrishna Gudipati break; 586db9d8a75SKrishna Gudipati default: 587db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 588db9d8a75SKrishna Gudipati break; 589db9d8a75SKrishna Gudipati } 590db9d8a75SKrishna Gudipati } 591db9d8a75SKrishna Gudipati 592db9d8a75SKrishna Gudipati static void 593db9d8a75SKrishna Gudipati bfa_iocfc_sm_disabled_entry(struct bfa_iocfc_s *iocfc) 594db9d8a75SKrishna Gudipati { 595db9d8a75SKrishna Gudipati bfa_isr_disable(iocfc->bfa); 596db9d8a75SKrishna Gudipati bfa_iocfc_disable_submod(iocfc->bfa); 597db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; 598db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.dis_hcb_qe, 599db9d8a75SKrishna Gudipati bfa_iocfc_disable_cb, iocfc->bfa); 600db9d8a75SKrishna Gudipati } 601db9d8a75SKrishna Gudipati 602db9d8a75SKrishna Gudipati static void 603db9d8a75SKrishna Gudipati bfa_iocfc_sm_disabled(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 604db9d8a75SKrishna Gudipati { 605db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 606db9d8a75SKrishna Gudipati 607db9d8a75SKrishna Gudipati switch (event) { 608db9d8a75SKrishna Gudipati case IOCFC_E_STOP: 609db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); 610db9d8a75SKrishna Gudipati break; 611db9d8a75SKrishna Gudipati case IOCFC_E_ENABLE: 612db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_enabling); 613db9d8a75SKrishna Gudipati break; 614db9d8a75SKrishna Gudipati default: 615db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 616db9d8a75SKrishna Gudipati break; 617db9d8a75SKrishna Gudipati } 618db9d8a75SKrishna Gudipati } 619db9d8a75SKrishna Gudipati 620db9d8a75SKrishna Gudipati static void 621db9d8a75SKrishna Gudipati bfa_iocfc_sm_failed_entry(struct bfa_iocfc_s *iocfc) 622db9d8a75SKrishna Gudipati { 623db9d8a75SKrishna Gudipati bfa_isr_disable(iocfc->bfa); 624db9d8a75SKrishna Gudipati bfa_iocfc_disable_submod(iocfc->bfa); 625db9d8a75SKrishna Gudipati } 626db9d8a75SKrishna Gudipati 627db9d8a75SKrishna Gudipati static void 628db9d8a75SKrishna Gudipati bfa_iocfc_sm_failed(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 629db9d8a75SKrishna Gudipati { 630db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 631db9d8a75SKrishna Gudipati 632db9d8a75SKrishna Gudipati switch (event) { 633db9d8a75SKrishna Gudipati case IOCFC_E_STOP: 634db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_write); 635db9d8a75SKrishna Gudipati break; 636db9d8a75SKrishna Gudipati case IOCFC_E_DISABLE: 637db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_disabling); 638db9d8a75SKrishna Gudipati break; 639db9d8a75SKrishna Gudipati case IOCFC_E_IOC_ENABLED: 640db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_cfg_wait); 641db9d8a75SKrishna Gudipati break; 642db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 643db9d8a75SKrishna Gudipati break; 644db9d8a75SKrishna Gudipati default: 645db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 646db9d8a75SKrishna Gudipati break; 647db9d8a75SKrishna Gudipati } 648db9d8a75SKrishna Gudipati } 649db9d8a75SKrishna Gudipati 650db9d8a75SKrishna Gudipati static void 651db9d8a75SKrishna Gudipati bfa_iocfc_sm_init_failed_entry(struct bfa_iocfc_s *iocfc) 652db9d8a75SKrishna Gudipati { 653db9d8a75SKrishna Gudipati bfa_isr_disable(iocfc->bfa); 654db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_FAILED; 655db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.init_hcb_qe, 656db9d8a75SKrishna Gudipati bfa_iocfc_init_cb, iocfc->bfa); 657db9d8a75SKrishna Gudipati } 658db9d8a75SKrishna Gudipati 659db9d8a75SKrishna Gudipati static void 660db9d8a75SKrishna Gudipati bfa_iocfc_sm_init_failed(struct bfa_iocfc_s *iocfc, enum iocfc_event event) 661db9d8a75SKrishna Gudipati { 662db9d8a75SKrishna Gudipati bfa_trc(iocfc->bfa, event); 663db9d8a75SKrishna Gudipati 664db9d8a75SKrishna Gudipati switch (event) { 665db9d8a75SKrishna Gudipati case IOCFC_E_STOP: 666db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopping); 667db9d8a75SKrishna Gudipati break; 668db9d8a75SKrishna Gudipati case IOCFC_E_DISABLE: 669db9d8a75SKrishna Gudipati bfa_ioc_disable(&iocfc->bfa->ioc); 670db9d8a75SKrishna Gudipati break; 671db9d8a75SKrishna Gudipati case IOCFC_E_IOC_ENABLED: 672db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_dconf_read); 673db9d8a75SKrishna Gudipati break; 674db9d8a75SKrishna Gudipati case IOCFC_E_IOC_DISABLED: 675db9d8a75SKrishna Gudipati bfa_fsm_set_state(iocfc, bfa_iocfc_sm_stopped); 676db9d8a75SKrishna Gudipati iocfc->bfa->iocfc.op_status = BFA_STATUS_OK; 677db9d8a75SKrishna Gudipati bfa_cb_queue(iocfc->bfa, &iocfc->bfa->iocfc.dis_hcb_qe, 678db9d8a75SKrishna Gudipati bfa_iocfc_disable_cb, iocfc->bfa); 679db9d8a75SKrishna Gudipati break; 680db9d8a75SKrishna Gudipati case IOCFC_E_IOC_FAILED: 681db9d8a75SKrishna Gudipati break; 682db9d8a75SKrishna Gudipati default: 683db9d8a75SKrishna Gudipati bfa_sm_fault(iocfc->bfa, event); 684db9d8a75SKrishna Gudipati break; 685db9d8a75SKrishna Gudipati } 686db9d8a75SKrishna Gudipati } 687a36c61f9SKrishna Gudipati 6885fbe25c7SJing Huang /* 689a36c61f9SKrishna Gudipati * BFA Interrupt handling functions 690a36c61f9SKrishna Gudipati */ 691a36c61f9SKrishna Gudipati static void 692a36c61f9SKrishna Gudipati bfa_reqq_resume(struct bfa_s *bfa, int qid) 693a36c61f9SKrishna Gudipati { 694a36c61f9SKrishna Gudipati struct list_head *waitq, *qe, *qen; 695a36c61f9SKrishna Gudipati struct bfa_reqq_wait_s *wqe; 696a36c61f9SKrishna Gudipati 697a36c61f9SKrishna Gudipati waitq = bfa_reqq(bfa, qid); 698a36c61f9SKrishna Gudipati list_for_each_safe(qe, qen, waitq) { 6995fbe25c7SJing Huang /* 700a36c61f9SKrishna Gudipati * Callback only as long as there is room in request queue 701a36c61f9SKrishna Gudipati */ 702a36c61f9SKrishna Gudipati if (bfa_reqq_full(bfa, qid)) 703a36c61f9SKrishna Gudipati break; 704a36c61f9SKrishna Gudipati 705a36c61f9SKrishna Gudipati list_del(qe); 706a36c61f9SKrishna Gudipati wqe = (struct bfa_reqq_wait_s *) qe; 707a36c61f9SKrishna Gudipati wqe->qresume(wqe->cbarg); 708a36c61f9SKrishna Gudipati } 709a36c61f9SKrishna Gudipati } 710a36c61f9SKrishna Gudipati 7111f67096cSKrishna Gudipati bfa_boolean_t 71211189208SKrishna Gudipati bfa_isr_rspq(struct bfa_s *bfa, int qid) 71311189208SKrishna Gudipati { 71411189208SKrishna Gudipati struct bfi_msg_s *m; 71511189208SKrishna Gudipati u32 pi, ci; 71611189208SKrishna Gudipati struct list_head *waitq; 7171f67096cSKrishna Gudipati bfa_boolean_t ret; 71811189208SKrishna Gudipati 71911189208SKrishna Gudipati ci = bfa_rspq_ci(bfa, qid); 72011189208SKrishna Gudipati pi = bfa_rspq_pi(bfa, qid); 72111189208SKrishna Gudipati 7221f67096cSKrishna Gudipati ret = (ci != pi); 7231f67096cSKrishna Gudipati 72411189208SKrishna Gudipati while (ci != pi) { 72511189208SKrishna Gudipati m = bfa_rspq_elem(bfa, qid, ci); 72611189208SKrishna Gudipati WARN_ON(m->mhdr.msg_class >= BFI_MC_MAX); 72711189208SKrishna Gudipati 72811189208SKrishna Gudipati bfa_isrs[m->mhdr.msg_class] (bfa, m); 72911189208SKrishna Gudipati CQ_INCR(ci, bfa->iocfc.cfg.drvcfg.num_rspq_elems); 73011189208SKrishna Gudipati } 73111189208SKrishna Gudipati 73211189208SKrishna Gudipati /* 733ca6e0ea7SKrishna Gudipati * acknowledge RME completions and update CI 73411189208SKrishna Gudipati */ 735ca6e0ea7SKrishna Gudipati bfa_isr_rspq_ack(bfa, qid, ci); 73611189208SKrishna Gudipati 73711189208SKrishna Gudipati /* 73811189208SKrishna Gudipati * Resume any pending requests in the corresponding reqq. 73911189208SKrishna Gudipati */ 74011189208SKrishna Gudipati waitq = bfa_reqq(bfa, qid); 74111189208SKrishna Gudipati if (!list_empty(waitq)) 74211189208SKrishna Gudipati bfa_reqq_resume(bfa, qid); 7431f67096cSKrishna Gudipati 7441f67096cSKrishna Gudipati return ret; 74511189208SKrishna Gudipati } 74611189208SKrishna Gudipati 74711189208SKrishna Gudipati static inline void 74811189208SKrishna Gudipati bfa_isr_reqq(struct bfa_s *bfa, int qid) 74911189208SKrishna Gudipati { 75011189208SKrishna Gudipati struct list_head *waitq; 75111189208SKrishna Gudipati 7523fd45980SKrishna Gudipati bfa_isr_reqq_ack(bfa, qid); 75311189208SKrishna Gudipati 75411189208SKrishna Gudipati /* 75511189208SKrishna Gudipati * Resume any pending requests in the corresponding reqq. 75611189208SKrishna Gudipati */ 75711189208SKrishna Gudipati waitq = bfa_reqq(bfa, qid); 75811189208SKrishna Gudipati if (!list_empty(waitq)) 75911189208SKrishna Gudipati bfa_reqq_resume(bfa, qid); 76011189208SKrishna Gudipati } 76111189208SKrishna Gudipati 762a36c61f9SKrishna Gudipati void 763a36c61f9SKrishna Gudipati bfa_msix_all(struct bfa_s *bfa, int vec) 764a36c61f9SKrishna Gudipati { 76510a07379SKrishna Gudipati u32 intr, qintr; 76610a07379SKrishna Gudipati int queue; 76710a07379SKrishna Gudipati 76810a07379SKrishna Gudipati intr = readl(bfa->iocfc.bfa_regs.intr_status); 76910a07379SKrishna Gudipati if (!intr) 77010a07379SKrishna Gudipati return; 77110a07379SKrishna Gudipati 77210a07379SKrishna Gudipati /* 77310a07379SKrishna Gudipati * RME completion queue interrupt 77410a07379SKrishna Gudipati */ 77510a07379SKrishna Gudipati qintr = intr & __HFN_INT_RME_MASK; 77610a07379SKrishna Gudipati if (qintr && bfa->queue_process) { 77710a07379SKrishna Gudipati for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++) 77810a07379SKrishna Gudipati bfa_isr_rspq(bfa, queue); 77910a07379SKrishna Gudipati } 78010a07379SKrishna Gudipati 78110a07379SKrishna Gudipati intr &= ~qintr; 78210a07379SKrishna Gudipati if (!intr) 78310a07379SKrishna Gudipati return; 78410a07379SKrishna Gudipati 78510a07379SKrishna Gudipati /* 78610a07379SKrishna Gudipati * CPE completion queue interrupt 78710a07379SKrishna Gudipati */ 78810a07379SKrishna Gudipati qintr = intr & __HFN_INT_CPE_MASK; 78910a07379SKrishna Gudipati if (qintr && bfa->queue_process) { 79010a07379SKrishna Gudipati for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++) 79110a07379SKrishna Gudipati bfa_isr_reqq(bfa, queue); 79210a07379SKrishna Gudipati } 79310a07379SKrishna Gudipati intr &= ~qintr; 79410a07379SKrishna Gudipati if (!intr) 79510a07379SKrishna Gudipati return; 79610a07379SKrishna Gudipati 79710a07379SKrishna Gudipati bfa_msix_lpu_err(bfa, intr); 798a36c61f9SKrishna Gudipati } 799a36c61f9SKrishna Gudipati 800a36c61f9SKrishna Gudipati bfa_boolean_t 801a36c61f9SKrishna Gudipati bfa_intx(struct bfa_s *bfa) 802a36c61f9SKrishna Gudipati { 803a36c61f9SKrishna Gudipati u32 intr, qintr; 804a36c61f9SKrishna Gudipati int queue; 8051f67096cSKrishna Gudipati bfa_boolean_t rspq_comp = BFA_FALSE; 806a36c61f9SKrishna Gudipati 80753440260SJing Huang intr = readl(bfa->iocfc.bfa_regs.intr_status); 808a36c61f9SKrishna Gudipati 8093fd45980SKrishna Gudipati qintr = intr & (__HFN_INT_RME_MASK | __HFN_INT_CPE_MASK); 8103fd45980SKrishna Gudipati if (qintr) 8113fd45980SKrishna Gudipati writel(qintr, bfa->iocfc.bfa_regs.intr_status); 8123fd45980SKrishna Gudipati 8135fbe25c7SJing Huang /* 814ca6e0ea7SKrishna Gudipati * Unconditional RME completion queue interrupt 815a36c61f9SKrishna Gudipati */ 816ca6e0ea7SKrishna Gudipati if (bfa->queue_process) { 8173fd45980SKrishna Gudipati for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++) 8181f67096cSKrishna Gudipati if (bfa_isr_rspq(bfa, queue)) 8191f67096cSKrishna Gudipati rspq_comp = BFA_TRUE; 820a36c61f9SKrishna Gudipati } 8213fd45980SKrishna Gudipati 822a36c61f9SKrishna Gudipati if (!intr) 8231f67096cSKrishna Gudipati return (qintr | rspq_comp) ? BFA_TRUE : BFA_FALSE; 824a36c61f9SKrishna Gudipati 8255fbe25c7SJing Huang /* 826a36c61f9SKrishna Gudipati * CPE completion queue interrupt 827a36c61f9SKrishna Gudipati */ 828a36c61f9SKrishna Gudipati qintr = intr & __HFN_INT_CPE_MASK; 8293fd45980SKrishna Gudipati if (qintr && bfa->queue_process) { 8303fd45980SKrishna Gudipati for (queue = 0; queue < BFI_IOC_MAX_CQS; queue++) 8313fd45980SKrishna Gudipati bfa_isr_reqq(bfa, queue); 832a36c61f9SKrishna Gudipati } 833a36c61f9SKrishna Gudipati intr &= ~qintr; 834a36c61f9SKrishna Gudipati if (!intr) 835a36c61f9SKrishna Gudipati return BFA_TRUE; 836a36c61f9SKrishna Gudipati 8379aec0249SKrishna Gudipati if (bfa->intr_enabled) 838a36c61f9SKrishna Gudipati bfa_msix_lpu_err(bfa, intr); 839a36c61f9SKrishna Gudipati 840a36c61f9SKrishna Gudipati return BFA_TRUE; 841a36c61f9SKrishna Gudipati } 842a36c61f9SKrishna Gudipati 843a36c61f9SKrishna Gudipati void 844a36c61f9SKrishna Gudipati bfa_isr_enable(struct bfa_s *bfa) 845a36c61f9SKrishna Gudipati { 84611189208SKrishna Gudipati u32 umsk; 8471a1297c6SKrishna Gudipati int port_id = bfa_ioc_portid(&bfa->ioc); 848a36c61f9SKrishna Gudipati 8491a1297c6SKrishna Gudipati bfa_trc(bfa, bfa_ioc_pcifn(&bfa->ioc)); 8501a1297c6SKrishna Gudipati bfa_trc(bfa, port_id); 851a36c61f9SKrishna Gudipati 852775c7742SKrishna Gudipati bfa_msix_ctrl_install(bfa); 853a36c61f9SKrishna Gudipati 85411189208SKrishna Gudipati if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) { 85511189208SKrishna Gudipati umsk = __HFN_INT_ERR_MASK_CT2; 8561a1297c6SKrishna Gudipati umsk |= port_id == 0 ? 85711189208SKrishna Gudipati __HFN_INT_FN0_MASK_CT2 : __HFN_INT_FN1_MASK_CT2; 85811189208SKrishna Gudipati } else { 85911189208SKrishna Gudipati umsk = __HFN_INT_ERR_MASK; 8601a1297c6SKrishna Gudipati umsk |= port_id == 0 ? __HFN_INT_FN0_MASK : __HFN_INT_FN1_MASK; 86111189208SKrishna Gudipati } 862a36c61f9SKrishna Gudipati 86311189208SKrishna Gudipati writel(umsk, bfa->iocfc.bfa_regs.intr_status); 86411189208SKrishna Gudipati writel(~umsk, bfa->iocfc.bfa_regs.intr_mask); 86511189208SKrishna Gudipati bfa->iocfc.intr_mask = ~umsk; 866a36c61f9SKrishna Gudipati bfa_isr_mode_set(bfa, bfa->msix.nvecs != 0); 8679aec0249SKrishna Gudipati 8689aec0249SKrishna Gudipati /* 8699aec0249SKrishna Gudipati * Set the flag indicating successful enabling of interrupts 8709aec0249SKrishna Gudipati */ 8719aec0249SKrishna Gudipati bfa->intr_enabled = BFA_TRUE; 872a36c61f9SKrishna Gudipati } 873a36c61f9SKrishna Gudipati 874a36c61f9SKrishna Gudipati void 875a36c61f9SKrishna Gudipati bfa_isr_disable(struct bfa_s *bfa) 876a36c61f9SKrishna Gudipati { 8779aec0249SKrishna Gudipati bfa->intr_enabled = BFA_FALSE; 878a36c61f9SKrishna Gudipati bfa_isr_mode_set(bfa, BFA_FALSE); 87953440260SJing Huang writel(-1L, bfa->iocfc.bfa_regs.intr_mask); 880a36c61f9SKrishna Gudipati bfa_msix_uninstall(bfa); 881a36c61f9SKrishna Gudipati } 882a36c61f9SKrishna Gudipati 883a36c61f9SKrishna Gudipati void 88411189208SKrishna Gudipati bfa_msix_reqq(struct bfa_s *bfa, int vec) 885a36c61f9SKrishna Gudipati { 88611189208SKrishna Gudipati bfa_isr_reqq(bfa, vec - bfa->iocfc.hwif.cpe_vec_q0); 887a36c61f9SKrishna Gudipati } 888a36c61f9SKrishna Gudipati 889a36c61f9SKrishna Gudipati void 890a36c61f9SKrishna Gudipati bfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m) 891a36c61f9SKrishna Gudipati { 892a36c61f9SKrishna Gudipati bfa_trc(bfa, m->mhdr.msg_class); 893a36c61f9SKrishna Gudipati bfa_trc(bfa, m->mhdr.msg_id); 894a36c61f9SKrishna Gudipati bfa_trc(bfa, m->mhdr.mtag.i2htok); 895d4b671c5SJing Huang WARN_ON(1); 896a36c61f9SKrishna Gudipati bfa_trc_stop(bfa->trcmod); 897a36c61f9SKrishna Gudipati } 898a36c61f9SKrishna Gudipati 899a36c61f9SKrishna Gudipati void 90011189208SKrishna Gudipati bfa_msix_rspq(struct bfa_s *bfa, int vec) 901a36c61f9SKrishna Gudipati { 90211189208SKrishna Gudipati bfa_isr_rspq(bfa, vec - bfa->iocfc.hwif.rme_vec_q0); 903a36c61f9SKrishna Gudipati } 904a36c61f9SKrishna Gudipati 905a36c61f9SKrishna Gudipati void 906a36c61f9SKrishna Gudipati bfa_msix_lpu_err(struct bfa_s *bfa, int vec) 907a36c61f9SKrishna Gudipati { 908a36c61f9SKrishna Gudipati u32 intr, curr_value; 90911189208SKrishna Gudipati bfa_boolean_t lpu_isr, halt_isr, pss_isr; 910a36c61f9SKrishna Gudipati 91153440260SJing Huang intr = readl(bfa->iocfc.bfa_regs.intr_status); 912a36c61f9SKrishna Gudipati 91311189208SKrishna Gudipati if (bfa_asic_id_ct2(bfa->ioc.pcidev.device_id)) { 91411189208SKrishna Gudipati halt_isr = intr & __HFN_INT_CPQ_HALT_CT2; 91511189208SKrishna Gudipati pss_isr = intr & __HFN_INT_ERR_PSS_CT2; 91611189208SKrishna Gudipati lpu_isr = intr & (__HFN_INT_MBOX_LPU0_CT2 | 91711189208SKrishna Gudipati __HFN_INT_MBOX_LPU1_CT2); 91811189208SKrishna Gudipati intr &= __HFN_INT_ERR_MASK_CT2; 91911189208SKrishna Gudipati } else { 920ca6e0ea7SKrishna Gudipati halt_isr = bfa_asic_id_ct(bfa->ioc.pcidev.device_id) ? 921ca6e0ea7SKrishna Gudipati (intr & __HFN_INT_LL_HALT) : 0; 92211189208SKrishna Gudipati pss_isr = intr & __HFN_INT_ERR_PSS; 92311189208SKrishna Gudipati lpu_isr = intr & (__HFN_INT_MBOX_LPU0 | __HFN_INT_MBOX_LPU1); 92411189208SKrishna Gudipati intr &= __HFN_INT_ERR_MASK; 92511189208SKrishna Gudipati } 92611189208SKrishna Gudipati 92711189208SKrishna Gudipati if (lpu_isr) 928f7f73812SMaggie Zhang bfa_ioc_mbox_isr(&bfa->ioc); 929a36c61f9SKrishna Gudipati 930a36c61f9SKrishna Gudipati if (intr) { 93111189208SKrishna Gudipati if (halt_isr) { 9325fbe25c7SJing Huang /* 933a36c61f9SKrishna Gudipati * If LL_HALT bit is set then FW Init Halt LL Port 934a36c61f9SKrishna Gudipati * Register needs to be cleared as well so Interrupt 935a36c61f9SKrishna Gudipati * Status Register will be cleared. 936a36c61f9SKrishna Gudipati */ 93753440260SJing Huang curr_value = readl(bfa->ioc.ioc_regs.ll_halt); 938a36c61f9SKrishna Gudipati curr_value &= ~__FW_INIT_HALT_P; 93953440260SJing Huang writel(curr_value, bfa->ioc.ioc_regs.ll_halt); 940a36c61f9SKrishna Gudipati } 941a36c61f9SKrishna Gudipati 94211189208SKrishna Gudipati if (pss_isr) { 9435fbe25c7SJing Huang /* 944a36c61f9SKrishna Gudipati * ERR_PSS bit needs to be cleared as well in case 945a36c61f9SKrishna Gudipati * interrups are shared so driver's interrupt handler is 946a36c61f9SKrishna Gudipati * still called even though it is already masked out. 947a36c61f9SKrishna Gudipati */ 94853440260SJing Huang curr_value = readl( 949a36c61f9SKrishna Gudipati bfa->ioc.ioc_regs.pss_err_status_reg); 95053440260SJing Huang writel(curr_value, 95153440260SJing Huang bfa->ioc.ioc_regs.pss_err_status_reg); 952a36c61f9SKrishna Gudipati } 953a36c61f9SKrishna Gudipati 95453440260SJing Huang writel(intr, bfa->iocfc.bfa_regs.intr_status); 955f7f73812SMaggie Zhang bfa_ioc_error_isr(&bfa->ioc); 956a36c61f9SKrishna Gudipati } 957a36c61f9SKrishna Gudipati } 958a36c61f9SKrishna Gudipati 9595fbe25c7SJing Huang /* 960a36c61f9SKrishna Gudipati * BFA IOC FC related functions 961a36c61f9SKrishna Gudipati */ 962a36c61f9SKrishna Gudipati 9635fbe25c7SJing Huang /* 964df0f1933SMaggie Zhang * BFA IOC private functions 965a36c61f9SKrishna Gudipati */ 966a36c61f9SKrishna Gudipati 9675fbe25c7SJing Huang /* 968a36c61f9SKrishna Gudipati * Use the Mailbox interface to send BFI_IOCFC_H2I_CFG_REQ 969a36c61f9SKrishna Gudipati */ 970a36c61f9SKrishna Gudipati static void 971a36c61f9SKrishna Gudipati bfa_iocfc_send_cfg(void *bfa_arg) 972a36c61f9SKrishna Gudipati { 973a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 974a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 975a36c61f9SKrishna Gudipati struct bfi_iocfc_cfg_req_s cfg_req; 976a36c61f9SKrishna Gudipati struct bfi_iocfc_cfg_s *cfg_info = iocfc->cfginfo; 977a36c61f9SKrishna Gudipati struct bfa_iocfc_cfg_s *cfg = &iocfc->cfg; 978a36c61f9SKrishna Gudipati int i; 979a36c61f9SKrishna Gudipati 980d4b671c5SJing Huang WARN_ON(cfg->fwcfg.num_cqs > BFI_IOC_MAX_CQS); 981a36c61f9SKrishna Gudipati bfa_trc(bfa, cfg->fwcfg.num_cqs); 982a36c61f9SKrishna Gudipati 983a36c61f9SKrishna Gudipati bfa_iocfc_reset_queues(bfa); 984a36c61f9SKrishna Gudipati 9855fbe25c7SJing Huang /* 986a36c61f9SKrishna Gudipati * initialize IOC configuration info 987a36c61f9SKrishna Gudipati */ 98810a07379SKrishna Gudipati cfg_info->single_msix_vec = 0; 98910a07379SKrishna Gudipati if (bfa->msix.nvecs == 1) 99010a07379SKrishna Gudipati cfg_info->single_msix_vec = 1; 991a36c61f9SKrishna Gudipati cfg_info->endian_sig = BFI_IOC_ENDIAN_SIG; 992a36c61f9SKrishna Gudipati cfg_info->num_cqs = cfg->fwcfg.num_cqs; 9937ace27aeSKrishna Gudipati cfg_info->num_ioim_reqs = cpu_to_be16(bfa_fcpim_get_throttle_cfg(bfa, 9947ace27aeSKrishna Gudipati cfg->fwcfg.num_ioim_reqs)); 995e2187d7fSKrishna Gudipati cfg_info->num_fwtio_reqs = cpu_to_be16(cfg->fwcfg.num_fwtio_reqs); 996a36c61f9SKrishna Gudipati 997a36c61f9SKrishna Gudipati bfa_dma_be_addr_set(cfg_info->cfgrsp_addr, iocfc->cfgrsp_dma.pa); 9985fbe25c7SJing Huang /* 999a36c61f9SKrishna Gudipati * dma map REQ and RSP circular queues and shadow pointers 1000a36c61f9SKrishna Gudipati */ 1001a36c61f9SKrishna Gudipati for (i = 0; i < cfg->fwcfg.num_cqs; i++) { 1002a36c61f9SKrishna Gudipati bfa_dma_be_addr_set(cfg_info->req_cq_ba[i], 1003a36c61f9SKrishna Gudipati iocfc->req_cq_ba[i].pa); 1004a36c61f9SKrishna Gudipati bfa_dma_be_addr_set(cfg_info->req_shadow_ci[i], 1005a36c61f9SKrishna Gudipati iocfc->req_cq_shadow_ci[i].pa); 1006a36c61f9SKrishna Gudipati cfg_info->req_cq_elems[i] = 1007ba816ea8SJing Huang cpu_to_be16(cfg->drvcfg.num_reqq_elems); 1008a36c61f9SKrishna Gudipati 1009a36c61f9SKrishna Gudipati bfa_dma_be_addr_set(cfg_info->rsp_cq_ba[i], 1010a36c61f9SKrishna Gudipati iocfc->rsp_cq_ba[i].pa); 1011a36c61f9SKrishna Gudipati bfa_dma_be_addr_set(cfg_info->rsp_shadow_pi[i], 1012a36c61f9SKrishna Gudipati iocfc->rsp_cq_shadow_pi[i].pa); 1013a36c61f9SKrishna Gudipati cfg_info->rsp_cq_elems[i] = 1014ba816ea8SJing Huang cpu_to_be16(cfg->drvcfg.num_rspq_elems); 1015a36c61f9SKrishna Gudipati } 1016a36c61f9SKrishna Gudipati 10175fbe25c7SJing Huang /* 1018a36c61f9SKrishna Gudipati * Enable interrupt coalescing if it is driver init path 1019a36c61f9SKrishna Gudipati * and not ioc disable/enable path. 1020a36c61f9SKrishna Gudipati */ 1021db9d8a75SKrishna Gudipati if (bfa_fsm_cmp_state(iocfc, bfa_iocfc_sm_init_cfg_wait)) 1022a36c61f9SKrishna Gudipati cfg_info->intr_attr.coalesce = BFA_TRUE; 1023a36c61f9SKrishna Gudipati 10245fbe25c7SJing Huang /* 1025a36c61f9SKrishna Gudipati * dma map IOC configuration itself 1026a36c61f9SKrishna Gudipati */ 1027a36c61f9SKrishna Gudipati bfi_h2i_set(cfg_req.mh, BFI_MC_IOCFC, BFI_IOCFC_H2I_CFG_REQ, 10283fd45980SKrishna Gudipati bfa_fn_lpu(bfa)); 1029a36c61f9SKrishna Gudipati bfa_dma_be_addr_set(cfg_req.ioc_cfg_dma_addr, iocfc->cfg_info.pa); 1030a36c61f9SKrishna Gudipati 1031a36c61f9SKrishna Gudipati bfa_ioc_mbox_send(&bfa->ioc, &cfg_req, 1032a36c61f9SKrishna Gudipati sizeof(struct bfi_iocfc_cfg_req_s)); 1033a36c61f9SKrishna Gudipati } 1034a36c61f9SKrishna Gudipati 1035a36c61f9SKrishna Gudipati static void 1036a36c61f9SKrishna Gudipati bfa_iocfc_init_mem(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, 1037a36c61f9SKrishna Gudipati struct bfa_pcidev_s *pcidev) 1038a36c61f9SKrishna Gudipati { 1039a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1040a36c61f9SKrishna Gudipati 1041a36c61f9SKrishna Gudipati bfa->bfad = bfad; 1042a36c61f9SKrishna Gudipati iocfc->bfa = bfa; 10436a18b167SJing Huang iocfc->cfg = *cfg; 1044a36c61f9SKrishna Gudipati 10455fbe25c7SJing Huang /* 1046a36c61f9SKrishna Gudipati * Initialize chip specific handlers. 1047a36c61f9SKrishna Gudipati */ 104811189208SKrishna Gudipati if (bfa_asic_id_ctc(bfa_ioc_devid(&bfa->ioc))) { 1049a36c61f9SKrishna Gudipati iocfc->hwif.hw_reginit = bfa_hwct_reginit; 1050a36c61f9SKrishna Gudipati iocfc->hwif.hw_reqq_ack = bfa_hwct_reqq_ack; 1051a36c61f9SKrishna Gudipati iocfc->hwif.hw_rspq_ack = bfa_hwct_rspq_ack; 1052a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_init = bfa_hwct_msix_init; 1053775c7742SKrishna Gudipati iocfc->hwif.hw_msix_ctrl_install = bfa_hwct_msix_ctrl_install; 1054775c7742SKrishna Gudipati iocfc->hwif.hw_msix_queue_install = bfa_hwct_msix_queue_install; 1055a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_uninstall = bfa_hwct_msix_uninstall; 1056a36c61f9SKrishna Gudipati iocfc->hwif.hw_isr_mode_set = bfa_hwct_isr_mode_set; 1057a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_getvecs = bfa_hwct_msix_getvecs; 1058a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_get_rme_range = bfa_hwct_msix_get_rme_range; 105911189208SKrishna Gudipati iocfc->hwif.rme_vec_q0 = BFI_MSIX_RME_QMIN_CT; 106011189208SKrishna Gudipati iocfc->hwif.cpe_vec_q0 = BFI_MSIX_CPE_QMIN_CT; 1061a36c61f9SKrishna Gudipati } else { 1062a36c61f9SKrishna Gudipati iocfc->hwif.hw_reginit = bfa_hwcb_reginit; 10633fd45980SKrishna Gudipati iocfc->hwif.hw_reqq_ack = NULL; 1064ca6e0ea7SKrishna Gudipati iocfc->hwif.hw_rspq_ack = bfa_hwcb_rspq_ack; 1065a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_init = bfa_hwcb_msix_init; 1066775c7742SKrishna Gudipati iocfc->hwif.hw_msix_ctrl_install = bfa_hwcb_msix_ctrl_install; 1067775c7742SKrishna Gudipati iocfc->hwif.hw_msix_queue_install = bfa_hwcb_msix_queue_install; 1068a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_uninstall = bfa_hwcb_msix_uninstall; 1069a36c61f9SKrishna Gudipati iocfc->hwif.hw_isr_mode_set = bfa_hwcb_isr_mode_set; 1070a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_getvecs = bfa_hwcb_msix_getvecs; 1071a36c61f9SKrishna Gudipati iocfc->hwif.hw_msix_get_rme_range = bfa_hwcb_msix_get_rme_range; 107211189208SKrishna Gudipati iocfc->hwif.rme_vec_q0 = BFI_MSIX_RME_QMIN_CB + 107311189208SKrishna Gudipati bfa_ioc_pcifn(&bfa->ioc) * BFI_IOC_MAX_CQS; 107411189208SKrishna Gudipati iocfc->hwif.cpe_vec_q0 = BFI_MSIX_CPE_QMIN_CB + 107511189208SKrishna Gudipati bfa_ioc_pcifn(&bfa->ioc) * BFI_IOC_MAX_CQS; 107611189208SKrishna Gudipati } 107711189208SKrishna Gudipati 107811189208SKrishna Gudipati if (bfa_asic_id_ct2(bfa_ioc_devid(&bfa->ioc))) { 107911189208SKrishna Gudipati iocfc->hwif.hw_reginit = bfa_hwct2_reginit; 108011189208SKrishna Gudipati iocfc->hwif.hw_isr_mode_set = NULL; 1081ca6e0ea7SKrishna Gudipati iocfc->hwif.hw_rspq_ack = bfa_hwct2_rspq_ack; 1082a36c61f9SKrishna Gudipati } 1083a36c61f9SKrishna Gudipati 1084a36c61f9SKrishna Gudipati iocfc->hwif.hw_reginit(bfa); 1085a36c61f9SKrishna Gudipati bfa->msix.nvecs = 0; 1086a36c61f9SKrishna Gudipati } 1087a36c61f9SKrishna Gudipati 1088a36c61f9SKrishna Gudipati static void 10894507025dSKrishna Gudipati bfa_iocfc_mem_claim(struct bfa_s *bfa, struct bfa_iocfc_cfg_s *cfg) 1090a36c61f9SKrishna Gudipati { 10914507025dSKrishna Gudipati u8 *dm_kva = NULL; 10924507025dSKrishna Gudipati u64 dm_pa = 0; 1093881c1b3cSKrishna Gudipati int i, per_reqq_sz, per_rspq_sz; 1094a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 10954507025dSKrishna Gudipati struct bfa_mem_dma_s *ioc_dma = BFA_MEM_IOC_DMA(bfa); 10964507025dSKrishna Gudipati struct bfa_mem_dma_s *iocfc_dma = BFA_MEM_IOCFC_DMA(bfa); 10974507025dSKrishna Gudipati struct bfa_mem_dma_s *reqq_dma, *rspq_dma; 1098a36c61f9SKrishna Gudipati 10994507025dSKrishna Gudipati /* First allocate dma memory for IOC */ 11004507025dSKrishna Gudipati bfa_ioc_mem_claim(&bfa->ioc, bfa_mem_dma_virt(ioc_dma), 11014507025dSKrishna Gudipati bfa_mem_dma_phys(ioc_dma)); 1102a36c61f9SKrishna Gudipati 11034507025dSKrishna Gudipati /* Claim DMA-able memory for the request/response queues */ 1104a36c61f9SKrishna Gudipati per_reqq_sz = BFA_ROUNDUP((cfg->drvcfg.num_reqq_elems * BFI_LMSG_SZ), 1105a36c61f9SKrishna Gudipati BFA_DMA_ALIGN_SZ); 1106a36c61f9SKrishna Gudipati per_rspq_sz = BFA_ROUNDUP((cfg->drvcfg.num_rspq_elems * BFI_LMSG_SZ), 1107a36c61f9SKrishna Gudipati BFA_DMA_ALIGN_SZ); 1108a36c61f9SKrishna Gudipati 1109a36c61f9SKrishna Gudipati for (i = 0; i < cfg->fwcfg.num_cqs; i++) { 11104507025dSKrishna Gudipati reqq_dma = BFA_MEM_REQQ_DMA(bfa, i); 11114507025dSKrishna Gudipati iocfc->req_cq_ba[i].kva = bfa_mem_dma_virt(reqq_dma); 11124507025dSKrishna Gudipati iocfc->req_cq_ba[i].pa = bfa_mem_dma_phys(reqq_dma); 11134507025dSKrishna Gudipati memset(iocfc->req_cq_ba[i].kva, 0, per_reqq_sz); 1114a36c61f9SKrishna Gudipati 11154507025dSKrishna Gudipati rspq_dma = BFA_MEM_RSPQ_DMA(bfa, i); 11164507025dSKrishna Gudipati iocfc->rsp_cq_ba[i].kva = bfa_mem_dma_virt(rspq_dma); 11174507025dSKrishna Gudipati iocfc->rsp_cq_ba[i].pa = bfa_mem_dma_phys(rspq_dma); 11184507025dSKrishna Gudipati memset(iocfc->rsp_cq_ba[i].kva, 0, per_rspq_sz); 1119a36c61f9SKrishna Gudipati } 1120a36c61f9SKrishna Gudipati 11214507025dSKrishna Gudipati /* Claim IOCFC dma memory - for shadow CI/PI */ 11224507025dSKrishna Gudipati dm_kva = bfa_mem_dma_virt(iocfc_dma); 11234507025dSKrishna Gudipati dm_pa = bfa_mem_dma_phys(iocfc_dma); 11244507025dSKrishna Gudipati 1125a36c61f9SKrishna Gudipati for (i = 0; i < cfg->fwcfg.num_cqs; i++) { 1126a36c61f9SKrishna Gudipati iocfc->req_cq_shadow_ci[i].kva = dm_kva; 1127a36c61f9SKrishna Gudipati iocfc->req_cq_shadow_ci[i].pa = dm_pa; 1128a36c61f9SKrishna Gudipati dm_kva += BFA_CACHELINE_SZ; 1129a36c61f9SKrishna Gudipati dm_pa += BFA_CACHELINE_SZ; 1130a36c61f9SKrishna Gudipati 1131a36c61f9SKrishna Gudipati iocfc->rsp_cq_shadow_pi[i].kva = dm_kva; 1132a36c61f9SKrishna Gudipati iocfc->rsp_cq_shadow_pi[i].pa = dm_pa; 1133a36c61f9SKrishna Gudipati dm_kva += BFA_CACHELINE_SZ; 1134a36c61f9SKrishna Gudipati dm_pa += BFA_CACHELINE_SZ; 1135a36c61f9SKrishna Gudipati } 1136a36c61f9SKrishna Gudipati 11374507025dSKrishna Gudipati /* Claim IOCFC dma memory - for the config info page */ 1138a36c61f9SKrishna Gudipati bfa->iocfc.cfg_info.kva = dm_kva; 1139a36c61f9SKrishna Gudipati bfa->iocfc.cfg_info.pa = dm_pa; 1140a36c61f9SKrishna Gudipati bfa->iocfc.cfginfo = (struct bfi_iocfc_cfg_s *) dm_kva; 1141a36c61f9SKrishna Gudipati dm_kva += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ); 1142a36c61f9SKrishna Gudipati dm_pa += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ); 1143a36c61f9SKrishna Gudipati 11444507025dSKrishna Gudipati /* Claim IOCFC dma memory - for the config response */ 1145a36c61f9SKrishna Gudipati bfa->iocfc.cfgrsp_dma.kva = dm_kva; 1146a36c61f9SKrishna Gudipati bfa->iocfc.cfgrsp_dma.pa = dm_pa; 1147a36c61f9SKrishna Gudipati bfa->iocfc.cfgrsp = (struct bfi_iocfc_cfgrsp_s *) dm_kva; 11484507025dSKrishna Gudipati dm_kva += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s), 1149a36c61f9SKrishna Gudipati BFA_CACHELINE_SZ); 1150a36c61f9SKrishna Gudipati dm_pa += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s), 1151a36c61f9SKrishna Gudipati BFA_CACHELINE_SZ); 1152a36c61f9SKrishna Gudipati 11534507025dSKrishna Gudipati /* Claim IOCFC kva memory */ 11544507025dSKrishna Gudipati bfa_ioc_debug_memclaim(&bfa->ioc, bfa_mem_kva_curp(iocfc)); 1155881c1b3cSKrishna Gudipati bfa_mem_kva_curp(iocfc) += BFA_DBG_FWTRC_LEN; 1156a36c61f9SKrishna Gudipati } 1157a36c61f9SKrishna Gudipati 11585fbe25c7SJing Huang /* 1159a36c61f9SKrishna Gudipati * Start BFA submodules. 1160a36c61f9SKrishna Gudipati */ 1161a36c61f9SKrishna Gudipati static void 1162a36c61f9SKrishna Gudipati bfa_iocfc_start_submod(struct bfa_s *bfa) 1163a36c61f9SKrishna Gudipati { 1164a36c61f9SKrishna Gudipati int i; 1165a36c61f9SKrishna Gudipati 1166775c7742SKrishna Gudipati bfa->queue_process = BFA_TRUE; 116711189208SKrishna Gudipati for (i = 0; i < BFI_IOC_MAX_CQS; i++) 1168ca6e0ea7SKrishna Gudipati bfa_isr_rspq_ack(bfa, i, bfa_rspq_ci(bfa, i)); 1169a36c61f9SKrishna Gudipati 1170c7c3524cSChristoph Hellwig bfa_fcport_start(bfa); 1171c7c3524cSChristoph Hellwig bfa_uf_start(bfa); 1172c7c3524cSChristoph Hellwig /* 1173c7c3524cSChristoph Hellwig * bfa_init() with flash read is complete. now invalidate the stale 1174c7c3524cSChristoph Hellwig * content of lun mask like unit attention, rp tag and lp tag. 1175c7c3524cSChristoph Hellwig */ 1176c7c3524cSChristoph Hellwig bfa_ioim_lm_init(BFA_FCP_MOD(bfa)->bfa); 1177db9d8a75SKrishna Gudipati 1178db9d8a75SKrishna Gudipati bfa->iocfc.submod_enabled = BFA_TRUE; 1179a36c61f9SKrishna Gudipati } 1180a36c61f9SKrishna Gudipati 11815fbe25c7SJing Huang /* 1182a36c61f9SKrishna Gudipati * Disable BFA submodules. 1183a36c61f9SKrishna Gudipati */ 1184a36c61f9SKrishna Gudipati static void 1185a36c61f9SKrishna Gudipati bfa_iocfc_disable_submod(struct bfa_s *bfa) 1186a36c61f9SKrishna Gudipati { 1187db9d8a75SKrishna Gudipati if (bfa->iocfc.submod_enabled == BFA_FALSE) 1188db9d8a75SKrishna Gudipati return; 1189db9d8a75SKrishna Gudipati 1190c7c3524cSChristoph Hellwig bfa_fcdiag_iocdisable(bfa); 1191c7c3524cSChristoph Hellwig bfa_fcport_iocdisable(bfa); 1192c7c3524cSChristoph Hellwig bfa_fcxp_iocdisable(bfa); 1193c7c3524cSChristoph Hellwig bfa_lps_iocdisable(bfa); 1194c7c3524cSChristoph Hellwig bfa_rport_iocdisable(bfa); 1195c7c3524cSChristoph Hellwig bfa_fcp_iocdisable(bfa); 1196c7c3524cSChristoph Hellwig bfa_dconf_iocdisable(bfa); 1197db9d8a75SKrishna Gudipati 1198db9d8a75SKrishna Gudipati bfa->iocfc.submod_enabled = BFA_FALSE; 1199a36c61f9SKrishna Gudipati } 1200a36c61f9SKrishna Gudipati 1201a36c61f9SKrishna Gudipati static void 1202a36c61f9SKrishna Gudipati bfa_iocfc_init_cb(void *bfa_arg, bfa_boolean_t complete) 1203a36c61f9SKrishna Gudipati { 1204a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 1205a36c61f9SKrishna Gudipati 1206db9d8a75SKrishna Gudipati if (complete) 1207db9d8a75SKrishna Gudipati bfa_cb_init(bfa->bfad, bfa->iocfc.op_status); 1208a36c61f9SKrishna Gudipati } 1209a36c61f9SKrishna Gudipati 1210a36c61f9SKrishna Gudipati static void 1211a36c61f9SKrishna Gudipati bfa_iocfc_stop_cb(void *bfa_arg, bfa_boolean_t compl) 1212a36c61f9SKrishna Gudipati { 1213a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 1214a36c61f9SKrishna Gudipati struct bfad_s *bfad = bfa->bfad; 1215a36c61f9SKrishna Gudipati 1216a36c61f9SKrishna Gudipati if (compl) 1217a36c61f9SKrishna Gudipati complete(&bfad->comp); 1218a36c61f9SKrishna Gudipati } 1219a36c61f9SKrishna Gudipati 1220a36c61f9SKrishna Gudipati static void 122160138066SKrishna Gudipati bfa_iocfc_enable_cb(void *bfa_arg, bfa_boolean_t compl) 122260138066SKrishna Gudipati { 122360138066SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 122460138066SKrishna Gudipati struct bfad_s *bfad = bfa->bfad; 122560138066SKrishna Gudipati 122660138066SKrishna Gudipati if (compl) 122760138066SKrishna Gudipati complete(&bfad->enable_comp); 122860138066SKrishna Gudipati } 122960138066SKrishna Gudipati 123060138066SKrishna Gudipati static void 1231a36c61f9SKrishna Gudipati bfa_iocfc_disable_cb(void *bfa_arg, bfa_boolean_t compl) 1232a36c61f9SKrishna Gudipati { 1233a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 1234a36c61f9SKrishna Gudipati struct bfad_s *bfad = bfa->bfad; 1235a36c61f9SKrishna Gudipati 1236a36c61f9SKrishna Gudipati if (compl) 1237a36c61f9SKrishna Gudipati complete(&bfad->disable_comp); 1238a36c61f9SKrishna Gudipati } 1239a36c61f9SKrishna Gudipati 124011189208SKrishna Gudipati /** 124111189208SKrishna Gudipati * configure queue registers from firmware response 124211189208SKrishna Gudipati */ 124311189208SKrishna Gudipati static void 124411189208SKrishna Gudipati bfa_iocfc_qreg(struct bfa_s *bfa, struct bfi_iocfc_qreg_s *qreg) 124511189208SKrishna Gudipati { 124611189208SKrishna Gudipati int i; 124711189208SKrishna Gudipati struct bfa_iocfc_regs_s *r = &bfa->iocfc.bfa_regs; 124811189208SKrishna Gudipati void __iomem *kva = bfa_ioc_bar0(&bfa->ioc); 124911189208SKrishna Gudipati 125011189208SKrishna Gudipati for (i = 0; i < BFI_IOC_MAX_CQS; i++) { 12513fd45980SKrishna Gudipati bfa->iocfc.hw_qid[i] = qreg->hw_qid[i]; 125211189208SKrishna Gudipati r->cpe_q_ci[i] = kva + be32_to_cpu(qreg->cpe_q_ci_off[i]); 125311189208SKrishna Gudipati r->cpe_q_pi[i] = kva + be32_to_cpu(qreg->cpe_q_pi_off[i]); 125411189208SKrishna Gudipati r->cpe_q_ctrl[i] = kva + be32_to_cpu(qreg->cpe_qctl_off[i]); 125511189208SKrishna Gudipati r->rme_q_ci[i] = kva + be32_to_cpu(qreg->rme_q_ci_off[i]); 125611189208SKrishna Gudipati r->rme_q_pi[i] = kva + be32_to_cpu(qreg->rme_q_pi_off[i]); 125711189208SKrishna Gudipati r->rme_q_ctrl[i] = kva + be32_to_cpu(qreg->rme_qctl_off[i]); 125811189208SKrishna Gudipati } 125911189208SKrishna Gudipati } 126011189208SKrishna Gudipati 12613fd45980SKrishna Gudipati static void 12623fd45980SKrishna Gudipati bfa_iocfc_res_recfg(struct bfa_s *bfa, struct bfa_iocfc_fwcfg_s *fwcfg) 12633fd45980SKrishna Gudipati { 12647ace27aeSKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 12657ace27aeSKrishna Gudipati struct bfi_iocfc_cfg_s *cfg_info = iocfc->cfginfo; 12667ace27aeSKrishna Gudipati 12673fd45980SKrishna Gudipati bfa_fcxp_res_recfg(bfa, fwcfg->num_fcxp_reqs); 12683fd45980SKrishna Gudipati bfa_uf_res_recfg(bfa, fwcfg->num_uf_bufs); 12693fd45980SKrishna Gudipati bfa_rport_res_recfg(bfa, fwcfg->num_rports); 12707ace27aeSKrishna Gudipati bfa_fcp_res_recfg(bfa, cpu_to_be16(cfg_info->num_ioim_reqs), 12717ace27aeSKrishna Gudipati fwcfg->num_ioim_reqs); 12723fd45980SKrishna Gudipati bfa_tskim_res_recfg(bfa, fwcfg->num_tskim_reqs); 12733fd45980SKrishna Gudipati } 12743fd45980SKrishna Gudipati 12755fbe25c7SJing Huang /* 1276a36c61f9SKrishna Gudipati * Update BFA configuration from firmware configuration. 1277a36c61f9SKrishna Gudipati */ 1278a36c61f9SKrishna Gudipati static void 1279a36c61f9SKrishna Gudipati bfa_iocfc_cfgrsp(struct bfa_s *bfa) 1280a36c61f9SKrishna Gudipati { 1281a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1282a36c61f9SKrishna Gudipati struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp; 1283a36c61f9SKrishna Gudipati struct bfa_iocfc_fwcfg_s *fwcfg = &cfgrsp->fwcfg; 1284a36c61f9SKrishna Gudipati 1285a36c61f9SKrishna Gudipati fwcfg->num_cqs = fwcfg->num_cqs; 1286ba816ea8SJing Huang fwcfg->num_ioim_reqs = be16_to_cpu(fwcfg->num_ioim_reqs); 1287e2187d7fSKrishna Gudipati fwcfg->num_fwtio_reqs = be16_to_cpu(fwcfg->num_fwtio_reqs); 1288ba816ea8SJing Huang fwcfg->num_tskim_reqs = be16_to_cpu(fwcfg->num_tskim_reqs); 1289ba816ea8SJing Huang fwcfg->num_fcxp_reqs = be16_to_cpu(fwcfg->num_fcxp_reqs); 1290ba816ea8SJing Huang fwcfg->num_uf_bufs = be16_to_cpu(fwcfg->num_uf_bufs); 1291ba816ea8SJing Huang fwcfg->num_rports = be16_to_cpu(fwcfg->num_rports); 1292a36c61f9SKrishna Gudipati 12935fbe25c7SJing Huang /* 129411189208SKrishna Gudipati * configure queue register offsets as learnt from firmware 129511189208SKrishna Gudipati */ 129611189208SKrishna Gudipati bfa_iocfc_qreg(bfa, &cfgrsp->qreg); 129711189208SKrishna Gudipati 129811189208SKrishna Gudipati /* 12993fd45980SKrishna Gudipati * Re-configure resources as learnt from Firmware 13003fd45980SKrishna Gudipati */ 13013fd45980SKrishna Gudipati bfa_iocfc_res_recfg(bfa, fwcfg); 13023fd45980SKrishna Gudipati 13033fd45980SKrishna Gudipati /* 1304775c7742SKrishna Gudipati * Install MSIX queue handlers 1305775c7742SKrishna Gudipati */ 1306775c7742SKrishna Gudipati bfa_msix_queue_install(bfa); 1307775c7742SKrishna Gudipati 1308db9d8a75SKrishna Gudipati if (bfa->iocfc.cfgrsp->pbc_cfg.pbc_pwwn != 0) { 1309db9d8a75SKrishna Gudipati bfa->ioc.attr->pwwn = bfa->iocfc.cfgrsp->pbc_cfg.pbc_pwwn; 1310db9d8a75SKrishna Gudipati bfa->ioc.attr->nwwn = bfa->iocfc.cfgrsp->pbc_cfg.pbc_nwwn; 1311db9d8a75SKrishna Gudipati bfa_fsm_send_event(iocfc, IOCFC_E_CFG_DONE); 1312db9d8a75SKrishna Gudipati } 1313db9d8a75SKrishna Gudipati } 1314a36c61f9SKrishna Gudipati 1315a36c61f9SKrishna Gudipati void 1316a36c61f9SKrishna Gudipati bfa_iocfc_reset_queues(struct bfa_s *bfa) 1317a36c61f9SKrishna Gudipati { 1318a36c61f9SKrishna Gudipati int q; 1319a36c61f9SKrishna Gudipati 1320a36c61f9SKrishna Gudipati for (q = 0; q < BFI_IOC_MAX_CQS; q++) { 1321a36c61f9SKrishna Gudipati bfa_reqq_ci(bfa, q) = 0; 1322a36c61f9SKrishna Gudipati bfa_reqq_pi(bfa, q) = 0; 1323a36c61f9SKrishna Gudipati bfa_rspq_ci(bfa, q) = 0; 1324a36c61f9SKrishna Gudipati bfa_rspq_pi(bfa, q) = 0; 1325a36c61f9SKrishna Gudipati } 1326a36c61f9SKrishna Gudipati } 1327a36c61f9SKrishna Gudipati 1328db9d8a75SKrishna Gudipati /* 1329db9d8a75SKrishna Gudipati * Process FAA pwwn msg from fw. 1330db9d8a75SKrishna Gudipati */ 1331db9d8a75SKrishna Gudipati static void 1332db9d8a75SKrishna Gudipati bfa_iocfc_process_faa_addr(struct bfa_s *bfa, struct bfi_faa_addr_msg_s *msg) 1333db9d8a75SKrishna Gudipati { 1334db9d8a75SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1335db9d8a75SKrishna Gudipati struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp; 1336db9d8a75SKrishna Gudipati 1337db9d8a75SKrishna Gudipati cfgrsp->pbc_cfg.pbc_pwwn = msg->pwwn; 1338db9d8a75SKrishna Gudipati cfgrsp->pbc_cfg.pbc_nwwn = msg->nwwn; 1339db9d8a75SKrishna Gudipati 1340db9d8a75SKrishna Gudipati bfa->ioc.attr->pwwn = msg->pwwn; 1341db9d8a75SKrishna Gudipati bfa->ioc.attr->nwwn = msg->nwwn; 1342db9d8a75SKrishna Gudipati bfa_fsm_send_event(iocfc, IOCFC_E_CFG_DONE); 1343db9d8a75SKrishna Gudipati } 1344db9d8a75SKrishna Gudipati 1345a714134aSKrishna Gudipati /* Fabric Assigned Address specific functions */ 1346a714134aSKrishna Gudipati 1347a714134aSKrishna Gudipati /* 1348a714134aSKrishna Gudipati * Check whether IOC is ready before sending command down 1349a714134aSKrishna Gudipati */ 1350a714134aSKrishna Gudipati static bfa_status_t 1351a714134aSKrishna Gudipati bfa_faa_validate_request(struct bfa_s *bfa) 1352a714134aSKrishna Gudipati { 1353a714134aSKrishna Gudipati enum bfa_ioc_type_e ioc_type = bfa_get_type(bfa); 1354a714134aSKrishna Gudipati u32 card_type = bfa->ioc.attr->card_type; 1355a714134aSKrishna Gudipati 1356a714134aSKrishna Gudipati if (bfa_ioc_is_operational(&bfa->ioc)) { 1357a714134aSKrishna Gudipati if ((ioc_type != BFA_IOC_TYPE_FC) || bfa_mfg_is_mezz(card_type)) 1358a714134aSKrishna Gudipati return BFA_STATUS_FEATURE_NOT_SUPPORTED; 1359a714134aSKrishna Gudipati } else { 1360a714134aSKrishna Gudipati return BFA_STATUS_IOC_NON_OP; 1361a714134aSKrishna Gudipati } 1362a714134aSKrishna Gudipati 1363a714134aSKrishna Gudipati return BFA_STATUS_OK; 1364a714134aSKrishna Gudipati } 1365a714134aSKrishna Gudipati 1366a714134aSKrishna Gudipati bfa_status_t 1367a714134aSKrishna Gudipati bfa_faa_query(struct bfa_s *bfa, struct bfa_faa_attr_s *attr, 1368a714134aSKrishna Gudipati bfa_cb_iocfc_t cbfn, void *cbarg) 1369a714134aSKrishna Gudipati { 1370a714134aSKrishna Gudipati struct bfi_faa_query_s faa_attr_req; 1371a714134aSKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1372a714134aSKrishna Gudipati bfa_status_t status; 1373a714134aSKrishna Gudipati 1374a714134aSKrishna Gudipati status = bfa_faa_validate_request(bfa); 1375a714134aSKrishna Gudipati if (status != BFA_STATUS_OK) 1376a714134aSKrishna Gudipati return status; 1377a714134aSKrishna Gudipati 1378a714134aSKrishna Gudipati if (iocfc->faa_args.busy == BFA_TRUE) 1379a714134aSKrishna Gudipati return BFA_STATUS_DEVBUSY; 1380a714134aSKrishna Gudipati 13817593e524SVijaya Mohan Guvva iocfc->faa_args.faa_attr = attr; 13827593e524SVijaya Mohan Guvva iocfc->faa_args.faa_cb.faa_cbfn = cbfn; 13837593e524SVijaya Mohan Guvva iocfc->faa_args.faa_cb.faa_cbarg = cbarg; 13847593e524SVijaya Mohan Guvva 1385a714134aSKrishna Gudipati iocfc->faa_args.busy = BFA_TRUE; 1386a714134aSKrishna Gudipati memset(&faa_attr_req, 0, sizeof(struct bfi_faa_query_s)); 1387a714134aSKrishna Gudipati bfi_h2i_set(faa_attr_req.mh, BFI_MC_IOCFC, 13883fd45980SKrishna Gudipati BFI_IOCFC_H2I_FAA_QUERY_REQ, bfa_fn_lpu(bfa)); 1389a714134aSKrishna Gudipati 1390a714134aSKrishna Gudipati bfa_ioc_mbox_send(&bfa->ioc, &faa_attr_req, 1391a714134aSKrishna Gudipati sizeof(struct bfi_faa_query_s)); 1392a714134aSKrishna Gudipati 1393a714134aSKrishna Gudipati return BFA_STATUS_OK; 1394a714134aSKrishna Gudipati } 1395a714134aSKrishna Gudipati 1396a714134aSKrishna Gudipati /* 1397a714134aSKrishna Gudipati * FAA query response 1398a714134aSKrishna Gudipati */ 1399a714134aSKrishna Gudipati static void 1400a714134aSKrishna Gudipati bfa_faa_query_reply(struct bfa_iocfc_s *iocfc, 1401a714134aSKrishna Gudipati bfi_faa_query_rsp_t *rsp) 1402a714134aSKrishna Gudipati { 1403a714134aSKrishna Gudipati void *cbarg = iocfc->faa_args.faa_cb.faa_cbarg; 1404a714134aSKrishna Gudipati 1405a714134aSKrishna Gudipati if (iocfc->faa_args.faa_attr) { 1406a714134aSKrishna Gudipati iocfc->faa_args.faa_attr->faa = rsp->faa; 1407a714134aSKrishna Gudipati iocfc->faa_args.faa_attr->faa_state = rsp->faa_status; 1408a714134aSKrishna Gudipati iocfc->faa_args.faa_attr->pwwn_source = rsp->addr_source; 1409a714134aSKrishna Gudipati } 1410a714134aSKrishna Gudipati 1411a714134aSKrishna Gudipati WARN_ON(!iocfc->faa_args.faa_cb.faa_cbfn); 1412a714134aSKrishna Gudipati 1413a714134aSKrishna Gudipati iocfc->faa_args.faa_cb.faa_cbfn(cbarg, BFA_STATUS_OK); 1414a714134aSKrishna Gudipati iocfc->faa_args.busy = BFA_FALSE; 1415a714134aSKrishna Gudipati } 1416a714134aSKrishna Gudipati 14175fbe25c7SJing Huang /* 1418a36c61f9SKrishna Gudipati * IOC enable request is complete 1419a36c61f9SKrishna Gudipati */ 1420a36c61f9SKrishna Gudipati static void 1421a36c61f9SKrishna Gudipati bfa_iocfc_enable_cbfn(void *bfa_arg, enum bfa_status status) 1422a36c61f9SKrishna Gudipati { 1423a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 1424a36c61f9SKrishna Gudipati 1425db9d8a75SKrishna Gudipati if (status == BFA_STATUS_OK) 1426db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_ENABLED); 1427db9d8a75SKrishna Gudipati else 1428db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_FAILED); 1429a36c61f9SKrishna Gudipati } 1430a36c61f9SKrishna Gudipati 14315fbe25c7SJing Huang /* 1432a36c61f9SKrishna Gudipati * IOC disable request is complete 1433a36c61f9SKrishna Gudipati */ 1434a36c61f9SKrishna Gudipati static void 1435a36c61f9SKrishna Gudipati bfa_iocfc_disable_cbfn(void *bfa_arg) 1436a36c61f9SKrishna Gudipati { 1437a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 1438a36c61f9SKrishna Gudipati 1439ea3837a7SVijaya Mohan Guvva bfa->queue_process = BFA_FALSE; 1440db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_DISABLED); 1441a36c61f9SKrishna Gudipati } 1442a36c61f9SKrishna Gudipati 14435fbe25c7SJing Huang /* 1444a36c61f9SKrishna Gudipati * Notify sub-modules of hardware failure. 1445a36c61f9SKrishna Gudipati */ 1446a36c61f9SKrishna Gudipati static void 1447a36c61f9SKrishna Gudipati bfa_iocfc_hbfail_cbfn(void *bfa_arg) 1448a36c61f9SKrishna Gudipati { 1449a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 1450a36c61f9SKrishna Gudipati 1451775c7742SKrishna Gudipati bfa->queue_process = BFA_FALSE; 1452db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_IOC_FAILED); 1453a36c61f9SKrishna Gudipati } 1454a36c61f9SKrishna Gudipati 14555fbe25c7SJing Huang /* 1456a36c61f9SKrishna Gudipati * Actions on chip-reset completion. 1457a36c61f9SKrishna Gudipati */ 1458a36c61f9SKrishna Gudipati static void 1459a36c61f9SKrishna Gudipati bfa_iocfc_reset_cbfn(void *bfa_arg) 1460a36c61f9SKrishna Gudipati { 1461a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfa_arg; 1462a36c61f9SKrishna Gudipati 1463a36c61f9SKrishna Gudipati bfa_iocfc_reset_queues(bfa); 1464a36c61f9SKrishna Gudipati bfa_isr_enable(bfa); 1465a36c61f9SKrishna Gudipati } 1466a36c61f9SKrishna Gudipati 14675fbe25c7SJing Huang /* 1468a36c61f9SKrishna Gudipati * Query IOC memory requirement information. 1469a36c61f9SKrishna Gudipati */ 1470a36c61f9SKrishna Gudipati void 14714507025dSKrishna Gudipati bfa_iocfc_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, 14724507025dSKrishna Gudipati struct bfa_s *bfa) 1473a36c61f9SKrishna Gudipati { 14744507025dSKrishna Gudipati int q, per_reqq_sz, per_rspq_sz; 14754507025dSKrishna Gudipati struct bfa_mem_dma_s *ioc_dma = BFA_MEM_IOC_DMA(bfa); 14764507025dSKrishna Gudipati struct bfa_mem_dma_s *iocfc_dma = BFA_MEM_IOCFC_DMA(bfa); 14774507025dSKrishna Gudipati struct bfa_mem_kva_s *iocfc_kva = BFA_MEM_IOCFC_KVA(bfa); 14784507025dSKrishna Gudipati u32 dm_len = 0; 1479a36c61f9SKrishna Gudipati 14804507025dSKrishna Gudipati /* dma memory setup for IOC */ 14814507025dSKrishna Gudipati bfa_mem_dma_setup(meminfo, ioc_dma, 14824507025dSKrishna Gudipati BFA_ROUNDUP(sizeof(struct bfi_ioc_attr_s), BFA_DMA_ALIGN_SZ)); 14834507025dSKrishna Gudipati 14844507025dSKrishna Gudipati /* dma memory setup for REQ/RSP queues */ 14854507025dSKrishna Gudipati per_reqq_sz = BFA_ROUNDUP((cfg->drvcfg.num_reqq_elems * BFI_LMSG_SZ), 14864507025dSKrishna Gudipati BFA_DMA_ALIGN_SZ); 14874507025dSKrishna Gudipati per_rspq_sz = BFA_ROUNDUP((cfg->drvcfg.num_rspq_elems * BFI_LMSG_SZ), 14884507025dSKrishna Gudipati BFA_DMA_ALIGN_SZ); 14894507025dSKrishna Gudipati 14904507025dSKrishna Gudipati for (q = 0; q < cfg->fwcfg.num_cqs; q++) { 14914507025dSKrishna Gudipati bfa_mem_dma_setup(meminfo, BFA_MEM_REQQ_DMA(bfa, q), 14924507025dSKrishna Gudipati per_reqq_sz); 14934507025dSKrishna Gudipati bfa_mem_dma_setup(meminfo, BFA_MEM_RSPQ_DMA(bfa, q), 14944507025dSKrishna Gudipati per_rspq_sz); 14954507025dSKrishna Gudipati } 14964507025dSKrishna Gudipati 14974507025dSKrishna Gudipati /* IOCFC dma memory - calculate Shadow CI/PI size */ 14984507025dSKrishna Gudipati for (q = 0; q < cfg->fwcfg.num_cqs; q++) 14994507025dSKrishna Gudipati dm_len += (2 * BFA_CACHELINE_SZ); 15004507025dSKrishna Gudipati 15014507025dSKrishna Gudipati /* IOCFC dma memory - calculate config info / rsp size */ 15024507025dSKrishna Gudipati dm_len += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfg_s), BFA_CACHELINE_SZ); 15034507025dSKrishna Gudipati dm_len += BFA_ROUNDUP(sizeof(struct bfi_iocfc_cfgrsp_s), 15044507025dSKrishna Gudipati BFA_CACHELINE_SZ); 15054507025dSKrishna Gudipati 15064507025dSKrishna Gudipati /* dma memory setup for IOCFC */ 15074507025dSKrishna Gudipati bfa_mem_dma_setup(meminfo, iocfc_dma, dm_len); 15084507025dSKrishna Gudipati 15094507025dSKrishna Gudipati /* kva memory setup for IOCFC */ 1510881c1b3cSKrishna Gudipati bfa_mem_kva_setup(meminfo, iocfc_kva, BFA_DBG_FWTRC_LEN); 1511a36c61f9SKrishna Gudipati } 1512a36c61f9SKrishna Gudipati 15135fbe25c7SJing Huang /* 1514a36c61f9SKrishna Gudipati * Query IOC memory requirement information. 1515a36c61f9SKrishna Gudipati */ 1516a36c61f9SKrishna Gudipati void 1517a36c61f9SKrishna Gudipati bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, 15184507025dSKrishna Gudipati struct bfa_pcidev_s *pcidev) 1519a36c61f9SKrishna Gudipati { 1520a36c61f9SKrishna Gudipati int i; 1521a36c61f9SKrishna Gudipati struct bfa_ioc_s *ioc = &bfa->ioc; 1522a36c61f9SKrishna Gudipati 1523a36c61f9SKrishna Gudipati bfa_iocfc_cbfn.enable_cbfn = bfa_iocfc_enable_cbfn; 1524a36c61f9SKrishna Gudipati bfa_iocfc_cbfn.disable_cbfn = bfa_iocfc_disable_cbfn; 1525a36c61f9SKrishna Gudipati bfa_iocfc_cbfn.hbfail_cbfn = bfa_iocfc_hbfail_cbfn; 1526a36c61f9SKrishna Gudipati bfa_iocfc_cbfn.reset_cbfn = bfa_iocfc_reset_cbfn; 1527a36c61f9SKrishna Gudipati 1528a36c61f9SKrishna Gudipati ioc->trcmod = bfa->trcmod; 1529a36c61f9SKrishna Gudipati bfa_ioc_attach(&bfa->ioc, bfa, &bfa_iocfc_cbfn, &bfa->timer_mod); 1530a36c61f9SKrishna Gudipati 1531d37779f8SKrishna Gudipati bfa_ioc_pci_init(&bfa->ioc, pcidev, BFI_PCIFN_CLASS_FC); 1532a36c61f9SKrishna Gudipati bfa_ioc_mbox_register(&bfa->ioc, bfa_mbox_isrs); 1533a36c61f9SKrishna Gudipati 1534a36c61f9SKrishna Gudipati bfa_iocfc_init_mem(bfa, bfad, cfg, pcidev); 15354507025dSKrishna Gudipati bfa_iocfc_mem_claim(bfa, cfg); 1536f7f73812SMaggie Zhang INIT_LIST_HEAD(&bfa->timer_mod.timer_q); 1537a36c61f9SKrishna Gudipati 1538a36c61f9SKrishna Gudipati INIT_LIST_HEAD(&bfa->comp_q); 1539a36c61f9SKrishna Gudipati for (i = 0; i < BFI_IOC_MAX_CQS; i++) 1540a36c61f9SKrishna Gudipati INIT_LIST_HEAD(&bfa->reqq_waitq[i]); 1541db9d8a75SKrishna Gudipati 1542db9d8a75SKrishna Gudipati bfa->iocfc.cb_reqd = BFA_FALSE; 1543db9d8a75SKrishna Gudipati bfa->iocfc.op_status = BFA_STATUS_OK; 1544db9d8a75SKrishna Gudipati bfa->iocfc.submod_enabled = BFA_FALSE; 1545db9d8a75SKrishna Gudipati 1546db9d8a75SKrishna Gudipati bfa_fsm_set_state(&bfa->iocfc, bfa_iocfc_sm_stopped); 1547a36c61f9SKrishna Gudipati } 1548a36c61f9SKrishna Gudipati 15495fbe25c7SJing Huang /* 1550a36c61f9SKrishna Gudipati * Query IOC memory requirement information. 1551a36c61f9SKrishna Gudipati */ 1552a36c61f9SKrishna Gudipati void 1553a36c61f9SKrishna Gudipati bfa_iocfc_init(struct bfa_s *bfa) 1554a36c61f9SKrishna Gudipati { 1555db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_INIT); 1556a36c61f9SKrishna Gudipati } 1557a36c61f9SKrishna Gudipati 15585fbe25c7SJing Huang /* 1559a36c61f9SKrishna Gudipati * IOC start called from bfa_start(). Called to start IOC operations 1560a36c61f9SKrishna Gudipati * at driver instantiation for this instance. 1561a36c61f9SKrishna Gudipati */ 1562a36c61f9SKrishna Gudipati void 1563a36c61f9SKrishna Gudipati bfa_iocfc_start(struct bfa_s *bfa) 1564a36c61f9SKrishna Gudipati { 1565db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_START); 1566a36c61f9SKrishna Gudipati } 1567a36c61f9SKrishna Gudipati 15685fbe25c7SJing Huang /* 1569a36c61f9SKrishna Gudipati * IOC stop called from bfa_stop(). Called only when driver is unloaded 1570a36c61f9SKrishna Gudipati * for this instance. 1571a36c61f9SKrishna Gudipati */ 1572a36c61f9SKrishna Gudipati void 1573a36c61f9SKrishna Gudipati bfa_iocfc_stop(struct bfa_s *bfa) 1574a36c61f9SKrishna Gudipati { 1575db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_STOP); 1576a36c61f9SKrishna Gudipati } 1577a36c61f9SKrishna Gudipati 1578a36c61f9SKrishna Gudipati void 1579a36c61f9SKrishna Gudipati bfa_iocfc_isr(void *bfaarg, struct bfi_mbmsg_s *m) 1580a36c61f9SKrishna Gudipati { 1581a36c61f9SKrishna Gudipati struct bfa_s *bfa = bfaarg; 1582a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1583a36c61f9SKrishna Gudipati union bfi_iocfc_i2h_msg_u *msg; 1584a36c61f9SKrishna Gudipati 1585a36c61f9SKrishna Gudipati msg = (union bfi_iocfc_i2h_msg_u *) m; 1586a36c61f9SKrishna Gudipati bfa_trc(bfa, msg->mh.msg_id); 1587a36c61f9SKrishna Gudipati 1588a36c61f9SKrishna Gudipati switch (msg->mh.msg_id) { 1589a36c61f9SKrishna Gudipati case BFI_IOCFC_I2H_CFG_REPLY: 1590a36c61f9SKrishna Gudipati bfa_iocfc_cfgrsp(bfa); 1591a36c61f9SKrishna Gudipati break; 1592a36c61f9SKrishna Gudipati case BFI_IOCFC_I2H_UPDATEQ_RSP: 1593a36c61f9SKrishna Gudipati iocfc->updateq_cbfn(iocfc->updateq_cbarg, BFA_STATUS_OK); 1594a36c61f9SKrishna Gudipati break; 1595db9d8a75SKrishna Gudipati case BFI_IOCFC_I2H_ADDR_MSG: 1596db9d8a75SKrishna Gudipati bfa_iocfc_process_faa_addr(bfa, 1597db9d8a75SKrishna Gudipati (struct bfi_faa_addr_msg_s *)msg); 1598a714134aSKrishna Gudipati break; 1599a714134aSKrishna Gudipati case BFI_IOCFC_I2H_FAA_QUERY_RSP: 1600a714134aSKrishna Gudipati bfa_faa_query_reply(iocfc, (bfi_faa_query_rsp_t *)msg); 1601a714134aSKrishna Gudipati break; 1602a36c61f9SKrishna Gudipati default: 1603d4b671c5SJing Huang WARN_ON(1); 1604a36c61f9SKrishna Gudipati } 1605a36c61f9SKrishna Gudipati } 1606a36c61f9SKrishna Gudipati 1607a36c61f9SKrishna Gudipati void 1608a36c61f9SKrishna Gudipati bfa_iocfc_get_attr(struct bfa_s *bfa, struct bfa_iocfc_attr_s *attr) 1609a36c61f9SKrishna Gudipati { 1610a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1611a36c61f9SKrishna Gudipati 1612a36c61f9SKrishna Gudipati attr->intr_attr.coalesce = iocfc->cfginfo->intr_attr.coalesce; 1613a36c61f9SKrishna Gudipati 1614a36c61f9SKrishna Gudipati attr->intr_attr.delay = iocfc->cfginfo->intr_attr.delay ? 1615ba816ea8SJing Huang be16_to_cpu(iocfc->cfginfo->intr_attr.delay) : 1616ba816ea8SJing Huang be16_to_cpu(iocfc->cfgrsp->intr_attr.delay); 1617a36c61f9SKrishna Gudipati 1618a36c61f9SKrishna Gudipati attr->intr_attr.latency = iocfc->cfginfo->intr_attr.latency ? 1619ba816ea8SJing Huang be16_to_cpu(iocfc->cfginfo->intr_attr.latency) : 1620ba816ea8SJing Huang be16_to_cpu(iocfc->cfgrsp->intr_attr.latency); 1621a36c61f9SKrishna Gudipati 1622a36c61f9SKrishna Gudipati attr->config = iocfc->cfg; 1623a36c61f9SKrishna Gudipati } 1624a36c61f9SKrishna Gudipati 1625a36c61f9SKrishna Gudipati bfa_status_t 1626a36c61f9SKrishna Gudipati bfa_iocfc_israttr_set(struct bfa_s *bfa, struct bfa_iocfc_intr_attr_s *attr) 1627a36c61f9SKrishna Gudipati { 1628a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1629a36c61f9SKrishna Gudipati struct bfi_iocfc_set_intr_req_s *m; 1630a36c61f9SKrishna Gudipati 1631a36c61f9SKrishna Gudipati iocfc->cfginfo->intr_attr.coalesce = attr->coalesce; 1632ba816ea8SJing Huang iocfc->cfginfo->intr_attr.delay = cpu_to_be16(attr->delay); 1633ba816ea8SJing Huang iocfc->cfginfo->intr_attr.latency = cpu_to_be16(attr->latency); 1634a36c61f9SKrishna Gudipati 1635a36c61f9SKrishna Gudipati if (!bfa_iocfc_is_operational(bfa)) 1636a36c61f9SKrishna Gudipati return BFA_STATUS_OK; 1637a36c61f9SKrishna Gudipati 1638a36c61f9SKrishna Gudipati m = bfa_reqq_next(bfa, BFA_REQQ_IOC); 1639a36c61f9SKrishna Gudipati if (!m) 1640a36c61f9SKrishna Gudipati return BFA_STATUS_DEVBUSY; 1641a36c61f9SKrishna Gudipati 1642a36c61f9SKrishna Gudipati bfi_h2i_set(m->mh, BFI_MC_IOCFC, BFI_IOCFC_H2I_SET_INTR_REQ, 16433fd45980SKrishna Gudipati bfa_fn_lpu(bfa)); 1644a36c61f9SKrishna Gudipati m->coalesce = iocfc->cfginfo->intr_attr.coalesce; 1645a36c61f9SKrishna Gudipati m->delay = iocfc->cfginfo->intr_attr.delay; 1646a36c61f9SKrishna Gudipati m->latency = iocfc->cfginfo->intr_attr.latency; 1647a36c61f9SKrishna Gudipati 1648a36c61f9SKrishna Gudipati bfa_trc(bfa, attr->delay); 1649a36c61f9SKrishna Gudipati bfa_trc(bfa, attr->latency); 1650a36c61f9SKrishna Gudipati 16513fd45980SKrishna Gudipati bfa_reqq_produce(bfa, BFA_REQQ_IOC, m->mh); 1652a36c61f9SKrishna Gudipati return BFA_STATUS_OK; 1653a36c61f9SKrishna Gudipati } 1654a36c61f9SKrishna Gudipati 1655a36c61f9SKrishna Gudipati void 16564507025dSKrishna Gudipati bfa_iocfc_set_snsbase(struct bfa_s *bfa, int seg_no, u64 snsbase_pa) 1657a36c61f9SKrishna Gudipati { 1658a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1659a36c61f9SKrishna Gudipati 1660a36c61f9SKrishna Gudipati iocfc->cfginfo->sense_buf_len = (BFI_IOIM_SNSLEN - 1); 16614507025dSKrishna Gudipati bfa_dma_be_addr_set(iocfc->cfginfo->ioim_snsbase[seg_no], snsbase_pa); 1662a36c61f9SKrishna Gudipati } 16635fbe25c7SJing Huang /* 1664a36c61f9SKrishna Gudipati * Enable IOC after it is disabled. 1665a36c61f9SKrishna Gudipati */ 1666a36c61f9SKrishna Gudipati void 1667a36c61f9SKrishna Gudipati bfa_iocfc_enable(struct bfa_s *bfa) 1668a36c61f9SKrishna Gudipati { 1669a36c61f9SKrishna Gudipati bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0, 1670a36c61f9SKrishna Gudipati "IOC Enable"); 1671db9d8a75SKrishna Gudipati bfa->iocfc.cb_reqd = BFA_TRUE; 1672db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_ENABLE); 1673a36c61f9SKrishna Gudipati } 1674a36c61f9SKrishna Gudipati 1675a36c61f9SKrishna Gudipati void 1676a36c61f9SKrishna Gudipati bfa_iocfc_disable(struct bfa_s *bfa) 1677a36c61f9SKrishna Gudipati { 1678a36c61f9SKrishna Gudipati bfa_plog_str(bfa->plog, BFA_PL_MID_HAL, BFA_PL_EID_MISC, 0, 1679a36c61f9SKrishna Gudipati "IOC Disable"); 1680a36c61f9SKrishna Gudipati 1681db9d8a75SKrishna Gudipati bfa_fsm_send_event(&bfa->iocfc, IOCFC_E_DISABLE); 1682a36c61f9SKrishna Gudipati } 1683a36c61f9SKrishna Gudipati 1684a36c61f9SKrishna Gudipati bfa_boolean_t 1685a36c61f9SKrishna Gudipati bfa_iocfc_is_operational(struct bfa_s *bfa) 1686a36c61f9SKrishna Gudipati { 1687db9d8a75SKrishna Gudipati return bfa_ioc_is_operational(&bfa->ioc) && 1688db9d8a75SKrishna Gudipati bfa_fsm_cmp_state(&bfa->iocfc, bfa_iocfc_sm_operational); 1689a36c61f9SKrishna Gudipati } 1690a36c61f9SKrishna Gudipati 16915fbe25c7SJing Huang /* 1692a36c61f9SKrishna Gudipati * Return boot target port wwns -- read from boot information in flash. 1693a36c61f9SKrishna Gudipati */ 1694a36c61f9SKrishna Gudipati void 1695a36c61f9SKrishna Gudipati bfa_iocfc_get_bootwwns(struct bfa_s *bfa, u8 *nwwns, wwn_t *wwns) 1696a36c61f9SKrishna Gudipati { 1697a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1698a36c61f9SKrishna Gudipati struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp; 1699a36c61f9SKrishna Gudipati int i; 1700a36c61f9SKrishna Gudipati 1701a36c61f9SKrishna Gudipati if (cfgrsp->pbc_cfg.boot_enabled && cfgrsp->pbc_cfg.nbluns) { 1702a36c61f9SKrishna Gudipati bfa_trc(bfa, cfgrsp->pbc_cfg.nbluns); 1703a36c61f9SKrishna Gudipati *nwwns = cfgrsp->pbc_cfg.nbluns; 1704a36c61f9SKrishna Gudipati for (i = 0; i < cfgrsp->pbc_cfg.nbluns; i++) 1705a36c61f9SKrishna Gudipati wwns[i] = cfgrsp->pbc_cfg.blun[i].tgt_pwwn; 1706a36c61f9SKrishna Gudipati 1707a36c61f9SKrishna Gudipati return; 1708a36c61f9SKrishna Gudipati } 1709a36c61f9SKrishna Gudipati 1710a36c61f9SKrishna Gudipati *nwwns = cfgrsp->bootwwns.nwwns; 1711a36c61f9SKrishna Gudipati memcpy(wwns, cfgrsp->bootwwns.wwn, sizeof(cfgrsp->bootwwns.wwn)); 1712a36c61f9SKrishna Gudipati } 1713a36c61f9SKrishna Gudipati 1714a36c61f9SKrishna Gudipati int 1715a36c61f9SKrishna Gudipati bfa_iocfc_get_pbc_vports(struct bfa_s *bfa, struct bfi_pbc_vport_s *pbc_vport) 1716a36c61f9SKrishna Gudipati { 1717a36c61f9SKrishna Gudipati struct bfa_iocfc_s *iocfc = &bfa->iocfc; 1718a36c61f9SKrishna Gudipati struct bfi_iocfc_cfgrsp_s *cfgrsp = iocfc->cfgrsp; 1719a36c61f9SKrishna Gudipati 1720a36c61f9SKrishna Gudipati memcpy(pbc_vport, cfgrsp->pbc_cfg.vport, sizeof(cfgrsp->pbc_cfg.vport)); 1721a36c61f9SKrishna Gudipati return cfgrsp->pbc_cfg.nvports; 1722a36c61f9SKrishna Gudipati } 1723a36c61f9SKrishna Gudipati 1724a36c61f9SKrishna Gudipati 17255fbe25c7SJing Huang /* 17267725ccfdSJing Huang * Use this function query the memory requirement of the BFA library. 17277725ccfdSJing Huang * This function needs to be called before bfa_attach() to get the 17287725ccfdSJing Huang * memory required of the BFA layer for a given driver configuration. 17297725ccfdSJing Huang * 17307725ccfdSJing Huang * This call will fail, if the cap is out of range compared to pre-defined 17317725ccfdSJing Huang * values within the BFA library 17327725ccfdSJing Huang * 17337725ccfdSJing Huang * @param[in] cfg - pointer to bfa_ioc_cfg_t. Driver layer should indicate 17347725ccfdSJing Huang * its configuration in this structure. 17357725ccfdSJing Huang * The default values for struct bfa_iocfc_cfg_s can be 17367725ccfdSJing Huang * fetched using bfa_cfg_get_default() API. 17377725ccfdSJing Huang * 17387725ccfdSJing Huang * If cap's boundary check fails, the library will use 17397725ccfdSJing Huang * the default bfa_cap_t values (and log a warning msg). 17407725ccfdSJing Huang * 17417725ccfdSJing Huang * @param[out] meminfo - pointer to bfa_meminfo_t. This content 17427725ccfdSJing Huang * indicates the memory type (see bfa_mem_type_t) and 17437725ccfdSJing Huang * amount of memory required. 17447725ccfdSJing Huang * 17457725ccfdSJing Huang * Driver should allocate the memory, populate the 17467725ccfdSJing Huang * starting address for each block and provide the same 17477725ccfdSJing Huang * structure as input parameter to bfa_attach() call. 17487725ccfdSJing Huang * 17494507025dSKrishna Gudipati * @param[in] bfa - pointer to the bfa structure, used while fetching the 17504507025dSKrishna Gudipati * dma, kva memory information of the bfa sub-modules. 17514507025dSKrishna Gudipati * 17527725ccfdSJing Huang * @return void 17537725ccfdSJing Huang * 17547725ccfdSJing Huang * Special Considerations: @note 17557725ccfdSJing Huang */ 17567725ccfdSJing Huang void 17574507025dSKrishna Gudipati bfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, 17584507025dSKrishna Gudipati struct bfa_s *bfa) 17597725ccfdSJing Huang { 17604507025dSKrishna Gudipati struct bfa_mem_dma_s *port_dma = BFA_MEM_PORT_DMA(bfa); 17614507025dSKrishna Gudipati struct bfa_mem_dma_s *ablk_dma = BFA_MEM_ABLK_DMA(bfa); 1762148d6103SKrishna Gudipati struct bfa_mem_dma_s *cee_dma = BFA_MEM_CEE_DMA(bfa); 176351e569aaSKrishna Gudipati struct bfa_mem_dma_s *sfp_dma = BFA_MEM_SFP_DMA(bfa); 17645a54b1d5SKrishna Gudipati struct bfa_mem_dma_s *flash_dma = BFA_MEM_FLASH_DMA(bfa); 17653d7fc66dSKrishna Gudipati struct bfa_mem_dma_s *diag_dma = BFA_MEM_DIAG_DMA(bfa); 17663350d98dSKrishna Gudipati struct bfa_mem_dma_s *phy_dma = BFA_MEM_PHY_DMA(bfa); 1767e6826c96SKrishna Gudipati struct bfa_mem_dma_s *fru_dma = BFA_MEM_FRU_DMA(bfa); 17687725ccfdSJing Huang 1769d4b671c5SJing Huang WARN_ON((cfg == NULL) || (meminfo == NULL)); 17707725ccfdSJing Huang 17716a18b167SJing Huang memset((void *)meminfo, 0, sizeof(struct bfa_meminfo_s)); 17727725ccfdSJing Huang 17734507025dSKrishna Gudipati /* Initialize the DMA & KVA meminfo queues */ 17744507025dSKrishna Gudipati INIT_LIST_HEAD(&meminfo->dma_info.qe); 17754507025dSKrishna Gudipati INIT_LIST_HEAD(&meminfo->kva_info.qe); 17764507025dSKrishna Gudipati 17774507025dSKrishna Gudipati bfa_iocfc_meminfo(cfg, meminfo, bfa); 1778c7c3524cSChristoph Hellwig bfa_sgpg_meminfo(cfg, meminfo, bfa); 1779c7c3524cSChristoph Hellwig bfa_fcport_meminfo(cfg, meminfo, bfa); 1780c7c3524cSChristoph Hellwig bfa_fcxp_meminfo(cfg, meminfo, bfa); 1781c7c3524cSChristoph Hellwig bfa_lps_meminfo(cfg, meminfo, bfa); 1782c7c3524cSChristoph Hellwig bfa_uf_meminfo(cfg, meminfo, bfa); 1783c7c3524cSChristoph Hellwig bfa_rport_meminfo(cfg, meminfo, bfa); 1784c7c3524cSChristoph Hellwig bfa_fcp_meminfo(cfg, meminfo, bfa); 1785c7c3524cSChristoph Hellwig bfa_dconf_meminfo(cfg, meminfo, bfa); 17867725ccfdSJing Huang 17874507025dSKrishna Gudipati /* dma info setup */ 17884507025dSKrishna Gudipati bfa_mem_dma_setup(meminfo, port_dma, bfa_port_meminfo()); 17894507025dSKrishna Gudipati bfa_mem_dma_setup(meminfo, ablk_dma, bfa_ablk_meminfo()); 1790148d6103SKrishna Gudipati bfa_mem_dma_setup(meminfo, cee_dma, bfa_cee_meminfo()); 179151e569aaSKrishna Gudipati bfa_mem_dma_setup(meminfo, sfp_dma, bfa_sfp_meminfo()); 17925a54b1d5SKrishna Gudipati bfa_mem_dma_setup(meminfo, flash_dma, 17935a54b1d5SKrishna Gudipati bfa_flash_meminfo(cfg->drvcfg.min_cfg)); 17943d7fc66dSKrishna Gudipati bfa_mem_dma_setup(meminfo, diag_dma, bfa_diag_meminfo()); 17953350d98dSKrishna Gudipati bfa_mem_dma_setup(meminfo, phy_dma, 17963350d98dSKrishna Gudipati bfa_phy_meminfo(cfg->drvcfg.min_cfg)); 1797e6826c96SKrishna Gudipati bfa_mem_dma_setup(meminfo, fru_dma, 1798e6826c96SKrishna Gudipati bfa_fru_meminfo(cfg->drvcfg.min_cfg)); 17997725ccfdSJing Huang } 18007725ccfdSJing Huang 18015fbe25c7SJing Huang /* 18027725ccfdSJing Huang * Use this function to do attach the driver instance with the BFA 18037725ccfdSJing Huang * library. This function will not trigger any HW initialization 18047725ccfdSJing Huang * process (which will be done in bfa_init() call) 18057725ccfdSJing Huang * 18067725ccfdSJing Huang * This call will fail, if the cap is out of range compared to 18077725ccfdSJing Huang * pre-defined values within the BFA library 18087725ccfdSJing Huang * 18097725ccfdSJing Huang * @param[out] bfa Pointer to bfa_t. 18107725ccfdSJing Huang * @param[in] bfad Opaque handle back to the driver's IOC structure 18117725ccfdSJing Huang * @param[in] cfg Pointer to bfa_ioc_cfg_t. Should be same structure 18127725ccfdSJing Huang * that was used in bfa_cfg_get_meminfo(). 18137725ccfdSJing Huang * @param[in] meminfo Pointer to bfa_meminfo_t. The driver should 18147725ccfdSJing Huang * use the bfa_cfg_get_meminfo() call to 18157725ccfdSJing Huang * find the memory blocks required, allocate the 18167725ccfdSJing Huang * required memory and provide the starting addresses. 18177725ccfdSJing Huang * @param[in] pcidev pointer to struct bfa_pcidev_s 18187725ccfdSJing Huang * 18197725ccfdSJing Huang * @return 18207725ccfdSJing Huang * void 18217725ccfdSJing Huang * 18227725ccfdSJing Huang * Special Considerations: 18237725ccfdSJing Huang * 18247725ccfdSJing Huang * @note 18257725ccfdSJing Huang * 18267725ccfdSJing Huang */ 18277725ccfdSJing Huang void 18287725ccfdSJing Huang bfa_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, 18297725ccfdSJing Huang struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev) 18307725ccfdSJing Huang { 18314507025dSKrishna Gudipati struct bfa_mem_dma_s *dma_info, *dma_elem; 18324507025dSKrishna Gudipati struct bfa_mem_kva_s *kva_info, *kva_elem; 18334507025dSKrishna Gudipati struct list_head *dm_qe, *km_qe; 18347725ccfdSJing Huang 18357725ccfdSJing Huang bfa->fcs = BFA_FALSE; 18367725ccfdSJing Huang 1837d4b671c5SJing Huang WARN_ON((cfg == NULL) || (meminfo == NULL)); 18387725ccfdSJing Huang 18394507025dSKrishna Gudipati /* Initialize memory pointers for iterative allocation */ 18404507025dSKrishna Gudipati dma_info = &meminfo->dma_info; 18414507025dSKrishna Gudipati dma_info->kva_curp = dma_info->kva; 18424507025dSKrishna Gudipati dma_info->dma_curp = dma_info->dma; 18434507025dSKrishna Gudipati 18444507025dSKrishna Gudipati kva_info = &meminfo->kva_info; 18454507025dSKrishna Gudipati kva_info->kva_curp = kva_info->kva; 18464507025dSKrishna Gudipati 18474507025dSKrishna Gudipati list_for_each(dm_qe, &dma_info->qe) { 18484507025dSKrishna Gudipati dma_elem = (struct bfa_mem_dma_s *) dm_qe; 18494507025dSKrishna Gudipati dma_elem->kva_curp = dma_elem->kva; 18504507025dSKrishna Gudipati dma_elem->dma_curp = dma_elem->dma; 18517725ccfdSJing Huang } 18527725ccfdSJing Huang 18534507025dSKrishna Gudipati list_for_each(km_qe, &kva_info->qe) { 18544507025dSKrishna Gudipati kva_elem = (struct bfa_mem_kva_s *) km_qe; 18554507025dSKrishna Gudipati kva_elem->kva_curp = kva_elem->kva; 18564507025dSKrishna Gudipati } 18574507025dSKrishna Gudipati 18584507025dSKrishna Gudipati bfa_iocfc_attach(bfa, bfad, cfg, pcidev); 1859c7c3524cSChristoph Hellwig bfa_fcdiag_attach(bfa, bfad, cfg, pcidev); 1860c7c3524cSChristoph Hellwig bfa_sgpg_attach(bfa, bfad, cfg, pcidev); 1861c7c3524cSChristoph Hellwig bfa_fcport_attach(bfa, bfad, cfg, pcidev); 1862c7c3524cSChristoph Hellwig bfa_fcxp_attach(bfa, bfad, cfg, pcidev); 1863c7c3524cSChristoph Hellwig bfa_lps_attach(bfa, bfad, cfg, pcidev); 1864c7c3524cSChristoph Hellwig bfa_uf_attach(bfa, bfad, cfg, pcidev); 1865c7c3524cSChristoph Hellwig bfa_rport_attach(bfa, bfad, cfg, pcidev); 1866c7c3524cSChristoph Hellwig bfa_fcp_attach(bfa, bfad, cfg, pcidev); 1867c7c3524cSChristoph Hellwig bfa_dconf_attach(bfa, bfad, cfg); 18684507025dSKrishna Gudipati bfa_com_port_attach(bfa); 18694507025dSKrishna Gudipati bfa_com_ablk_attach(bfa); 1870148d6103SKrishna Gudipati bfa_com_cee_attach(bfa); 187151e569aaSKrishna Gudipati bfa_com_sfp_attach(bfa); 18725a54b1d5SKrishna Gudipati bfa_com_flash_attach(bfa, cfg->drvcfg.min_cfg); 18733d7fc66dSKrishna Gudipati bfa_com_diag_attach(bfa); 18743350d98dSKrishna Gudipati bfa_com_phy_attach(bfa, cfg->drvcfg.min_cfg); 1875e6826c96SKrishna Gudipati bfa_com_fru_attach(bfa, cfg->drvcfg.min_cfg); 18767725ccfdSJing Huang } 18777725ccfdSJing Huang 18785fbe25c7SJing Huang /* 18797725ccfdSJing Huang * Use this function to delete a BFA IOC. IOC should be stopped (by 18807725ccfdSJing Huang * calling bfa_stop()) before this function call. 18817725ccfdSJing Huang * 18827725ccfdSJing Huang * @param[in] bfa - pointer to bfa_t. 18837725ccfdSJing Huang * 18847725ccfdSJing Huang * @return 18857725ccfdSJing Huang * void 18867725ccfdSJing Huang * 18877725ccfdSJing Huang * Special Considerations: 18887725ccfdSJing Huang * 18897725ccfdSJing Huang * @note 18907725ccfdSJing Huang */ 18917725ccfdSJing Huang void 18927725ccfdSJing Huang bfa_detach(struct bfa_s *bfa) 18937725ccfdSJing Huang { 1894f7f73812SMaggie Zhang bfa_ioc_detach(&bfa->ioc); 18957725ccfdSJing Huang } 18967725ccfdSJing Huang 18977725ccfdSJing Huang void 18987725ccfdSJing Huang bfa_comp_deq(struct bfa_s *bfa, struct list_head *comp_q) 18997725ccfdSJing Huang { 19007725ccfdSJing Huang INIT_LIST_HEAD(comp_q); 19017725ccfdSJing Huang list_splice_tail_init(&bfa->comp_q, comp_q); 19027725ccfdSJing Huang } 19037725ccfdSJing Huang 19047725ccfdSJing Huang void 19057725ccfdSJing Huang bfa_comp_process(struct bfa_s *bfa, struct list_head *comp_q) 19067725ccfdSJing Huang { 19077725ccfdSJing Huang struct list_head *qe; 19087725ccfdSJing Huang struct list_head *qen; 19097725ccfdSJing Huang struct bfa_cb_qe_s *hcb_qe; 191037ea0558SKrishna Gudipati bfa_cb_cbfn_status_t cbfn; 19117725ccfdSJing Huang 19127725ccfdSJing Huang list_for_each_safe(qe, qen, comp_q) { 19137725ccfdSJing Huang hcb_qe = (struct bfa_cb_qe_s *) qe; 191437ea0558SKrishna Gudipati if (hcb_qe->pre_rmv) { 191537ea0558SKrishna Gudipati /* qe is invalid after return, dequeue before cbfn() */ 191637ea0558SKrishna Gudipati list_del(qe); 191737ea0558SKrishna Gudipati cbfn = (bfa_cb_cbfn_status_t)(hcb_qe->cbfn); 191837ea0558SKrishna Gudipati cbfn(hcb_qe->cbarg, hcb_qe->fw_status); 191937ea0558SKrishna Gudipati } else 19207725ccfdSJing Huang hcb_qe->cbfn(hcb_qe->cbarg, BFA_TRUE); 19217725ccfdSJing Huang } 19227725ccfdSJing Huang } 19237725ccfdSJing Huang 19247725ccfdSJing Huang void 19257725ccfdSJing Huang bfa_comp_free(struct bfa_s *bfa, struct list_head *comp_q) 19267725ccfdSJing Huang { 19277725ccfdSJing Huang struct list_head *qe; 19287725ccfdSJing Huang struct bfa_cb_qe_s *hcb_qe; 19297725ccfdSJing Huang 19307725ccfdSJing Huang while (!list_empty(comp_q)) { 19317725ccfdSJing Huang bfa_q_deq(comp_q, &qe); 19327725ccfdSJing Huang hcb_qe = (struct bfa_cb_qe_s *) qe; 193337ea0558SKrishna Gudipati WARN_ON(hcb_qe->pre_rmv); 19347725ccfdSJing Huang hcb_qe->cbfn(hcb_qe->cbarg, BFA_FALSE); 19357725ccfdSJing Huang } 19367725ccfdSJing Huang } 19377725ccfdSJing Huang 19385fbe25c7SJing Huang /* 19397725ccfdSJing Huang * Return the list of PCI vendor/device id lists supported by this 19407725ccfdSJing Huang * BFA instance. 19417725ccfdSJing Huang */ 19427725ccfdSJing Huang void 19437725ccfdSJing Huang bfa_get_pciids(struct bfa_pciid_s **pciids, int *npciids) 19447725ccfdSJing Huang { 19457725ccfdSJing Huang static struct bfa_pciid_s __pciids[] = { 19467725ccfdSJing Huang {BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_FC_8G2P}, 19477725ccfdSJing Huang {BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_FC_8G1P}, 19487725ccfdSJing Huang {BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_CT}, 1949293f82d5SJing Huang {BFA_PCI_VENDOR_ID_BROCADE, BFA_PCI_DEVICE_ID_CT_FC}, 19507725ccfdSJing Huang }; 19517725ccfdSJing Huang 1952bcb87240SColin Ian King *npciids = ARRAY_SIZE(__pciids); 19537725ccfdSJing Huang *pciids = __pciids; 19547725ccfdSJing Huang } 19557725ccfdSJing Huang 19565fbe25c7SJing Huang /* 19577725ccfdSJing Huang * Use this function query the default struct bfa_iocfc_cfg_s value (compiled 19587725ccfdSJing Huang * into BFA layer). The OS driver can then turn back and overwrite entries that 19597725ccfdSJing Huang * have been configured by the user. 19607725ccfdSJing Huang * 19617725ccfdSJing Huang * @param[in] cfg - pointer to bfa_ioc_cfg_t 19627725ccfdSJing Huang * 19637725ccfdSJing Huang * @return 19647725ccfdSJing Huang * void 19657725ccfdSJing Huang * 19667725ccfdSJing Huang * Special Considerations: 19677725ccfdSJing Huang * note 19687725ccfdSJing Huang */ 19697725ccfdSJing Huang void 19707725ccfdSJing Huang bfa_cfg_get_default(struct bfa_iocfc_cfg_s *cfg) 19717725ccfdSJing Huang { 19727725ccfdSJing Huang cfg->fwcfg.num_fabrics = DEF_CFG_NUM_FABRICS; 19737725ccfdSJing Huang cfg->fwcfg.num_lports = DEF_CFG_NUM_LPORTS; 19747725ccfdSJing Huang cfg->fwcfg.num_rports = DEF_CFG_NUM_RPORTS; 19757725ccfdSJing Huang cfg->fwcfg.num_ioim_reqs = DEF_CFG_NUM_IOIM_REQS; 19767725ccfdSJing Huang cfg->fwcfg.num_tskim_reqs = DEF_CFG_NUM_TSKIM_REQS; 19777725ccfdSJing Huang cfg->fwcfg.num_fcxp_reqs = DEF_CFG_NUM_FCXP_REQS; 19787725ccfdSJing Huang cfg->fwcfg.num_uf_bufs = DEF_CFG_NUM_UF_BUFS; 19797725ccfdSJing Huang cfg->fwcfg.num_cqs = DEF_CFG_NUM_CQS; 1980e2187d7fSKrishna Gudipati cfg->fwcfg.num_fwtio_reqs = 0; 19817725ccfdSJing Huang 19827725ccfdSJing Huang cfg->drvcfg.num_reqq_elems = DEF_CFG_NUM_REQQ_ELEMS; 19837725ccfdSJing Huang cfg->drvcfg.num_rspq_elems = DEF_CFG_NUM_RSPQ_ELEMS; 19847725ccfdSJing Huang cfg->drvcfg.num_sgpgs = DEF_CFG_NUM_SGPGS; 19857725ccfdSJing Huang cfg->drvcfg.num_sboot_tgts = DEF_CFG_NUM_SBOOT_TGTS; 19867725ccfdSJing Huang cfg->drvcfg.num_sboot_luns = DEF_CFG_NUM_SBOOT_LUNS; 19877725ccfdSJing Huang cfg->drvcfg.path_tov = BFA_FCPIM_PATHTOV_DEF; 19887725ccfdSJing Huang cfg->drvcfg.ioc_recover = BFA_FALSE; 19897725ccfdSJing Huang cfg->drvcfg.delay_comp = BFA_FALSE; 19907725ccfdSJing Huang 19917725ccfdSJing Huang } 19927725ccfdSJing Huang 19937725ccfdSJing Huang void 19947725ccfdSJing Huang bfa_cfg_get_min(struct bfa_iocfc_cfg_s *cfg) 19957725ccfdSJing Huang { 19967725ccfdSJing Huang bfa_cfg_get_default(cfg); 19977725ccfdSJing Huang cfg->fwcfg.num_ioim_reqs = BFA_IOIM_MIN; 19987725ccfdSJing Huang cfg->fwcfg.num_tskim_reqs = BFA_TSKIM_MIN; 19997725ccfdSJing Huang cfg->fwcfg.num_fcxp_reqs = BFA_FCXP_MIN; 20007725ccfdSJing Huang cfg->fwcfg.num_uf_bufs = BFA_UF_MIN; 20017725ccfdSJing Huang cfg->fwcfg.num_rports = BFA_RPORT_MIN; 2002e2187d7fSKrishna Gudipati cfg->fwcfg.num_fwtio_reqs = 0; 20037725ccfdSJing Huang 20047725ccfdSJing Huang cfg->drvcfg.num_sgpgs = BFA_SGPG_MIN; 20057725ccfdSJing Huang cfg->drvcfg.num_reqq_elems = BFA_REQQ_NELEMS_MIN; 20067725ccfdSJing Huang cfg->drvcfg.num_rspq_elems = BFA_RSPQ_NELEMS_MIN; 20077725ccfdSJing Huang cfg->drvcfg.min_cfg = BFA_TRUE; 20087725ccfdSJing Huang } 2009