| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 1 | /* | 
 | 2 |  * Copyright (c) 2005-2009 Brocade Communications Systems, Inc. | 
 | 3 |  * All rights reserved | 
 | 4 |  * www.brocade.com | 
 | 5 |  * | 
 | 6 |  * Linux driver for Brocade Fibre Channel Host Bus Adapter. | 
 | 7 |  * | 
 | 8 |  * This program is free software; you can redistribute it and/or modify it | 
 | 9 |  * under the terms of the GNU General Public License (GPL) Version 2 as | 
 | 10 |  * published by the Free Software Foundation | 
 | 11 |  * | 
 | 12 |  * This program is distributed in the hope that it will be useful, but | 
 | 13 |  * WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | 14 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 | 15 |  * General Public License for more details. | 
 | 16 |  */ | 
 | 17 |  | 
 | 18 | #ifndef __BFA_IOCFC_H__ | 
 | 19 | #define __BFA_IOCFC_H__ | 
 | 20 |  | 
 | 21 | #include <bfa_ioc.h> | 
 | 22 | #include <bfa.h> | 
 | 23 | #include <bfi/bfi_iocfc.h> | 
 | 24 | #include <bfa_callback_priv.h> | 
 | 25 |  | 
 | 26 | #define BFA_REQQ_NELEMS_MIN	(4) | 
 | 27 | #define BFA_RSPQ_NELEMS_MIN	(4) | 
 | 28 |  | 
 | 29 | struct bfa_iocfc_regs_s { | 
 | 30 | 	bfa_os_addr_t   intr_status; | 
 | 31 | 	bfa_os_addr_t   intr_mask; | 
 | 32 | 	bfa_os_addr_t   cpe_q_pi[BFI_IOC_MAX_CQS]; | 
 | 33 | 	bfa_os_addr_t   cpe_q_ci[BFI_IOC_MAX_CQS]; | 
 | 34 | 	bfa_os_addr_t   cpe_q_depth[BFI_IOC_MAX_CQS]; | 
 | 35 | 	bfa_os_addr_t   cpe_q_ctrl[BFI_IOC_MAX_CQS]; | 
 | 36 | 	bfa_os_addr_t   rme_q_ci[BFI_IOC_MAX_CQS]; | 
 | 37 | 	bfa_os_addr_t   rme_q_pi[BFI_IOC_MAX_CQS]; | 
 | 38 | 	bfa_os_addr_t   rme_q_depth[BFI_IOC_MAX_CQS]; | 
 | 39 | 	bfa_os_addr_t   rme_q_ctrl[BFI_IOC_MAX_CQS]; | 
 | 40 | }; | 
 | 41 |  | 
 | 42 | /** | 
 | 43 |  * MSIX vector handlers | 
 | 44 |  */ | 
 | 45 | #define BFA_MSIX_MAX_VECTORS	22 | 
 | 46 | typedef void (*bfa_msix_handler_t)(struct bfa_s *bfa, int vec); | 
 | 47 | struct bfa_msix_s { | 
 | 48 | 	int	nvecs; | 
 | 49 | 	bfa_msix_handler_t handler[BFA_MSIX_MAX_VECTORS]; | 
 | 50 | }; | 
 | 51 |  | 
 | 52 | /** | 
 | 53 |  * Chip specific interfaces | 
 | 54 |  */ | 
 | 55 | struct bfa_hwif_s { | 
 | 56 | 	void (*hw_reginit)(struct bfa_s *bfa); | 
| Krishna Gudipati | f5713c5 | 2010-03-05 19:37:09 -0800 | [diff] [blame] | 57 | 	void (*hw_reqq_ack)(struct bfa_s *bfa, int reqq); | 
| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 58 | 	void (*hw_rspq_ack)(struct bfa_s *bfa, int rspq); | 
 | 59 | 	void (*hw_msix_init)(struct bfa_s *bfa, int nvecs); | 
 | 60 | 	void (*hw_msix_install)(struct bfa_s *bfa); | 
 | 61 | 	void (*hw_msix_uninstall)(struct bfa_s *bfa); | 
 | 62 | 	void (*hw_isr_mode_set)(struct bfa_s *bfa, bfa_boolean_t msix); | 
 | 63 | 	void (*hw_msix_getvecs)(struct bfa_s *bfa, u32 *vecmap, | 
 | 64 | 			u32 *nvecs, u32 *maxvec); | 
 | 65 | }; | 
 | 66 | typedef void (*bfa_cb_iocfc_t) (void *cbarg, enum bfa_status status); | 
 | 67 |  | 
 | 68 | struct bfa_iocfc_s { | 
 | 69 | 	struct bfa_s 		*bfa; | 
 | 70 | 	struct bfa_iocfc_cfg_s 	cfg; | 
 | 71 | 	int			action; | 
 | 72 |  | 
 | 73 | 	u32        	req_cq_pi[BFI_IOC_MAX_CQS]; | 
 | 74 | 	u32        	rsp_cq_ci[BFI_IOC_MAX_CQS]; | 
 | 75 |  | 
 | 76 | 	struct bfa_cb_qe_s	init_hcb_qe; | 
 | 77 | 	struct bfa_cb_qe_s	stop_hcb_qe; | 
 | 78 | 	struct bfa_cb_qe_s	dis_hcb_qe; | 
 | 79 | 	struct bfa_cb_qe_s	stats_hcb_qe; | 
 | 80 | 	bfa_boolean_t		cfgdone; | 
 | 81 |  | 
 | 82 | 	struct bfa_dma_s	cfg_info; | 
 | 83 | 	struct bfi_iocfc_cfg_s *cfginfo; | 
 | 84 | 	struct bfa_dma_s	cfgrsp_dma; | 
 | 85 | 	struct bfi_iocfc_cfgrsp_s *cfgrsp; | 
 | 86 | 	struct bfi_iocfc_cfg_reply_s *cfg_reply; | 
 | 87 |  | 
 | 88 | 	u8			*stats_kva; | 
 | 89 | 	u64		stats_pa; | 
 | 90 | 	struct bfa_fw_stats_s 	*fw_stats; | 
 | 91 | 	struct bfa_timer_s 	stats_timer;	/*  timer */ | 
 | 92 | 	struct bfa_iocfc_stats_s *stats_ret;	/*  driver stats location */ | 
 | 93 | 	bfa_status_t		stats_status;	/*  stats/statsclr status */ | 
 | 94 | 	bfa_boolean_t   	stats_busy;	/*  outstanding stats */ | 
 | 95 | 	bfa_cb_ioc_t		stats_cbfn;	/*  driver callback function */ | 
 | 96 | 	void           		*stats_cbarg;	/*  user callback arg */ | 
 | 97 |  | 
 | 98 | 	struct bfa_dma_s   	req_cq_ba[BFI_IOC_MAX_CQS]; | 
 | 99 | 	struct bfa_dma_s   	req_cq_shadow_ci[BFI_IOC_MAX_CQS]; | 
 | 100 | 	struct bfa_dma_s   	rsp_cq_ba[BFI_IOC_MAX_CQS]; | 
 | 101 | 	struct bfa_dma_s   	rsp_cq_shadow_pi[BFI_IOC_MAX_CQS]; | 
 | 102 | 	struct bfa_iocfc_regs_s	bfa_regs;	/*  BFA device registers */ | 
 | 103 | 	struct bfa_hwif_s	hwif; | 
 | 104 |  | 
 | 105 | 	bfa_cb_iocfc_t		updateq_cbfn; /*  bios callback function */ | 
 | 106 | 	void				*updateq_cbarg;	/*  bios callback arg */ | 
 | 107 | }; | 
 | 108 |  | 
 | 109 | #define bfa_lpuid(__bfa)		bfa_ioc_portid(&(__bfa)->ioc) | 
 | 110 | #define bfa_msix_init(__bfa, __nvecs)	\ | 
| Jing Huang | f8ceafd | 2009-09-25 12:29:54 -0700 | [diff] [blame] | 111 | 	((__bfa)->iocfc.hwif.hw_msix_init(__bfa, __nvecs)) | 
| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 112 | #define bfa_msix_install(__bfa)	\ | 
| Jing Huang | f8ceafd | 2009-09-25 12:29:54 -0700 | [diff] [blame] | 113 | 	((__bfa)->iocfc.hwif.hw_msix_install(__bfa)) | 
| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 114 | #define bfa_msix_uninstall(__bfa)	\ | 
| Jing Huang | f8ceafd | 2009-09-25 12:29:54 -0700 | [diff] [blame] | 115 | 	((__bfa)->iocfc.hwif.hw_msix_uninstall(__bfa)) | 
| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 116 | #define bfa_isr_mode_set(__bfa, __msix)	\ | 
| Jing Huang | f8ceafd | 2009-09-25 12:29:54 -0700 | [diff] [blame] | 117 | 	((__bfa)->iocfc.hwif.hw_isr_mode_set(__bfa, __msix)) | 
| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 118 | #define bfa_msix_getvecs(__bfa, __vecmap, __nvecs, __maxvec)	\ | 
 | 119 | 	(__bfa)->iocfc.hwif.hw_msix_getvecs(__bfa, __vecmap, __nvecs, __maxvec) | 
 | 120 |  | 
 | 121 | /* | 
 | 122 |  * FC specific IOC functions. | 
 | 123 |  */ | 
 | 124 | void bfa_iocfc_meminfo(struct bfa_iocfc_cfg_s *cfg, u32 *km_len, | 
 | 125 | 		u32 *dm_len); | 
 | 126 | void bfa_iocfc_attach(struct bfa_s *bfa, void *bfad, | 
 | 127 | 		struct bfa_iocfc_cfg_s *cfg, struct bfa_meminfo_s *meminfo, | 
 | 128 | 		struct bfa_pcidev_s *pcidev); | 
 | 129 | void bfa_iocfc_detach(struct bfa_s *bfa); | 
 | 130 | void bfa_iocfc_init(struct bfa_s *bfa); | 
 | 131 | void bfa_iocfc_start(struct bfa_s *bfa); | 
 | 132 | void bfa_iocfc_stop(struct bfa_s *bfa); | 
 | 133 | void bfa_iocfc_isr(void *bfa, struct bfi_mbmsg_s *msg); | 
 | 134 | void bfa_iocfc_set_snsbase(struct bfa_s *bfa, u64 snsbase_pa); | 
 | 135 | bfa_boolean_t bfa_iocfc_is_operational(struct bfa_s *bfa); | 
 | 136 | void bfa_iocfc_reset_queues(struct bfa_s *bfa); | 
 | 137 | void bfa_iocfc_updateq(struct bfa_s *bfa, u32 reqq_ba, u32 rspq_ba, | 
 | 138 | 			u32 reqq_sci, u32 rspq_spi, | 
 | 139 | 			bfa_cb_iocfc_t cbfn, void *cbarg); | 
 | 140 |  | 
 | 141 | void bfa_msix_all(struct bfa_s *bfa, int vec); | 
 | 142 | void bfa_msix_reqq(struct bfa_s *bfa, int vec); | 
 | 143 | void bfa_msix_rspq(struct bfa_s *bfa, int vec); | 
 | 144 | void bfa_msix_lpu_err(struct bfa_s *bfa, int vec); | 
 | 145 |  | 
 | 146 | void bfa_hwcb_reginit(struct bfa_s *bfa); | 
| Krishna Gudipati | f5713c5 | 2010-03-05 19:37:09 -0800 | [diff] [blame] | 147 | void bfa_hwcb_reqq_ack(struct bfa_s *bfa, int rspq); | 
| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 148 | void bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq); | 
 | 149 | void bfa_hwcb_msix_init(struct bfa_s *bfa, int nvecs); | 
 | 150 | void bfa_hwcb_msix_install(struct bfa_s *bfa); | 
 | 151 | void bfa_hwcb_msix_uninstall(struct bfa_s *bfa); | 
 | 152 | void bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix); | 
 | 153 | void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, | 
 | 154 | 			u32 *nvecs, u32 *maxvec); | 
 | 155 | void bfa_hwct_reginit(struct bfa_s *bfa); | 
| Krishna Gudipati | f5713c5 | 2010-03-05 19:37:09 -0800 | [diff] [blame] | 156 | void bfa_hwct_reqq_ack(struct bfa_s *bfa, int rspq); | 
| Jing Huang | 7725ccf | 2009-09-23 17:46:15 -0700 | [diff] [blame] | 157 | void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq); | 
 | 158 | void bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs); | 
 | 159 | void bfa_hwct_msix_install(struct bfa_s *bfa); | 
 | 160 | void bfa_hwct_msix_uninstall(struct bfa_s *bfa); | 
 | 161 | void bfa_hwct_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix); | 
 | 162 | void bfa_hwct_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, | 
 | 163 | 			u32 *nvecs, u32 *maxvec); | 
 | 164 |  | 
 | 165 | void bfa_com_meminfo(bfa_boolean_t mincfg, u32 *dm_len); | 
 | 166 | void bfa_com_attach(struct bfa_s *bfa, struct bfa_meminfo_s *mi, | 
 | 167 | 		bfa_boolean_t mincfg); | 
 | 168 | void bfa_iocfc_get_bootwwns(struct bfa_s *bfa, u8 *nwwns, wwn_t **wwns); | 
 | 169 |  | 
 | 170 | #endif /* __BFA_IOCFC_H__ */ | 
 | 171 |  |