/* * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. * All rights reserved * www.brocade.com * * Linux driver for Brocade Fibre Channel Host Bus Adapter. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License (GPL) Version 2 as * published by the Free Software Foundation * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. */ #ifndef __BFA_H__ #define __BFA_H__ #include #include #include #include #include #include #include #include #include #include #include struct bfa_s; #include struct bfa_pcidev_s; /** * PCI devices supported by the current BFA */ struct bfa_pciid_s { u16 device_id; u16 vendor_id; }; extern char bfa_version[]; /** * BFA Power Mgmt Commands */ enum bfa_pm_cmd { BFA_PM_CTL_D0 = 0, BFA_PM_CTL_D1 = 1, BFA_PM_CTL_D2 = 2, BFA_PM_CTL_D3 = 3, }; /** * BFA memory resources */ enum bfa_mem_type { BFA_MEM_TYPE_KVA = 1, /*! Kernel Virtual Memory *(non-dma-able) */ BFA_MEM_TYPE_DMA = 2, /*! DMA-able memory */ BFA_MEM_TYPE_MAX = BFA_MEM_TYPE_DMA, }; struct bfa_mem_elem_s { enum bfa_mem_type mem_type; /* see enum bfa_mem_type */ u32 mem_len; /* Total Length in Bytes */ u8 *kva; /* kernel virtual address */ u64 dma; /* dma address if DMA memory */ u8 *kva_curp; /* kva allocation cursor */ u64 dma_curp; /* dma allocation cursor */ }; struct bfa_meminfo_s { struct bfa_mem_elem_s meminfo[BFA_MEM_TYPE_MAX]; }; #define bfa_meminfo_kva(_m) \ (_m)->meminfo[BFA_MEM_TYPE_KVA - 1].kva_curp #define bfa_meminfo_dma_virt(_m) \ (_m)->meminfo[BFA_MEM_TYPE_DMA - 1].kva_curp #define bfa_meminfo_dma_phys(_m) \ (_m)->meminfo[BFA_MEM_TYPE_DMA - 1].dma_curp /** * Generic Scatter Gather Element used by driver */ struct bfa_sge_s { u32 sg_len; void *sg_addr; }; #define bfa_sge_to_be(__sge) do { \ ((u32 *)(__sge))[0] = bfa_os_htonl(((u32 *)(__sge))[0]); \ ((u32 *)(__sge))[1] = bfa_os_htonl(((u32 *)(__sge))[1]); \ ((u32 *)(__sge))[2] = bfa_os_htonl(((u32 *)(__sge))[2]); \ } while (0) /* * bfa stats interfaces */ #define bfa_stats(_mod, _stats) (_mod)->stats._stats ++ #define bfa_ioc_get_stats(__bfa, __ioc_stats) \ bfa_ioc_fetch_stats(&(__bfa)->ioc, __ioc_stats) #define bfa_ioc_clear_stats(__bfa) \ bfa_ioc_clr_stats(&(__bfa)->ioc) /* * bfa API functions */ void bfa_get_pciids(struct bfa_pciid_s **pciids, int *npciids); void bfa_cfg_get_default(struct bfa_iocfc_cfg_s *cfg); void bfa_cfg_get_min(struct bfa_iocfc_cfg_s *cfg); void bfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo); void bfa_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, struct bfa_pcidev_s *pcidev); void bfa_init_trc(struct bfa_s *bfa, struct bfa_trc_mod_s *trcmod); void bfa_init_log(struct bfa_s *bfa, struct bfa_log_mod_s *logmod); void bfa_init_aen(struct bfa_s *bfa, struct bfa_aen_s *aen); void bfa_init_plog(struct bfa_s *bfa, struct bfa_plog_s *plog); void bfa_detach(struct bfa_s *bfa); void bfa_init(struct bfa_s *bfa); void bfa_start(struct bfa_s *bfa); void bfa_stop(struct bfa_s *bfa); void bfa_attach_fcs(struct bfa_s *bfa); void bfa_cb_init(void *bfad, bfa_status_t status); void bfa_cb_stop(void *bfad, bfa_status_t status); void bfa_cb_updateq(void *bfad, bfa_status_t status); bfa_boolean_t bfa_intx(struct bfa_s *bfa); void bfa_isr_enable(struct bfa_s *bfa); void bfa_isr_disable(struct bfa_s *bfa); void bfa_msix_getvecs(struct bfa_s *bfa, u32 *msix_vecs_bmap, u32 *num_vecs, u32 *max_vec_bit); #define bfa_msix(__bfa, __vec) (__bfa)->msix.handler[__vec](__bfa, __vec) void bfa_comp_deq(struct bfa_s *bfa, struct list_head *comp_q); void bfa_comp_process(struct bfa_s *bfa, struct list_head *comp_q); void bfa_comp_free(struct bfa_s *bfa, struct list_head *comp_q); typedef void (*bfa_cb_ioc_t) (void *cbarg, enum bfa_status status); void bfa_iocfc_get_attr(struct bfa_s *bfa, struct bfa_iocfc_attr_s *attr); bfa_status_t bfa_iocfc_get_stats(struct bfa_s *bfa, struct bfa_iocfc_stats_s *stats, bfa_cb_ioc_t cbfn, void *cbarg); bfa_status_t bfa_iocfc_clear_stats(struct bfa_s *bfa, bfa_cb_ioc_t cbfn, void *cbarg); void bfa_get_attr(struct bfa_s *bfa, struct bfa_ioc_attr_s *ioc_attr); void bfa_adapter_get_attr(struct bfa_s *bfa, struct bfa_adapter_attr_s *ad_attr); u64 bfa_adapter_get_id(struct bfa_s *bfa); bfa_status_t bfa_iocfc_israttr_set(struct bfa_s *bfa, struct bfa_iocfc_intr_attr_s *attr); void bfa_iocfc_enable(struct bfa_s *bfa); void bfa_iocfc_disable(struct bfa_s *bfa); void bfa_ioc_auto_recover(bfa_boolean_t auto_recover); void bfa_cb_ioc_disable(void *bfad); void bfa_timer_tick(struct bfa_s *bfa); #define bfa_timer_start(_bfa, _timer, _timercb, _arg, _timeout) \ bfa_timer_begin(&(_bfa)->timer_mod, _timer, _timercb, _arg, _timeout) /* * BFA debug API functions */ bfa_status_t bfa_debug_fwtrc(struct bfa_s *bfa, void *trcdata, int *trclen); bfa_status_t bfa_debug_fwsave(struct bfa_s *bfa, void *trcdata, int *trclen); #include "bfa_priv.h" #endif /* __BFA_H__ */