xref: /openbmc/linux/drivers/scsi/bfa/bfa.h (revision 5ee9cd065836e5934710ca35653bce7905add20b)
152fa7bf9SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2a36c61f9SKrishna Gudipati /*
3889d0d42SAnil Gurumurthy  * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
4889d0d42SAnil Gurumurthy  * Copyright (c) 2014- QLogic Corporation.
5a36c61f9SKrishna Gudipati  * All rights reserved
6889d0d42SAnil Gurumurthy  * www.qlogic.com
7a36c61f9SKrishna Gudipati  *
831e1d569SAnil Gurumurthy  * Linux driver for QLogic BR-series Fibre Channel Host Bus Adapter.
9a36c61f9SKrishna Gudipati  */
10a36c61f9SKrishna Gudipati #ifndef __BFA_H__
11a36c61f9SKrishna Gudipati #define __BFA_H__
12a36c61f9SKrishna Gudipati 
13f16a1750SMaggie Zhang #include "bfad_drv.h"
14a36c61f9SKrishna Gudipati #include "bfa_cs.h"
15a36c61f9SKrishna Gudipati #include "bfa_plog.h"
16a36c61f9SKrishna Gudipati #include "bfa_defs_svc.h"
17a36c61f9SKrishna Gudipati #include "bfi.h"
18a36c61f9SKrishna Gudipati #include "bfa_ioc.h"
19a36c61f9SKrishna Gudipati 
20a36c61f9SKrishna Gudipati struct bfa_s;
21a36c61f9SKrishna Gudipati 
22a36c61f9SKrishna Gudipati typedef void (*bfa_isr_func_t) (struct bfa_s *bfa, struct bfi_msg_s *m);
23a36c61f9SKrishna Gudipati 
24acdc79a6SJing Huang /*
25a36c61f9SKrishna Gudipati  * Interrupt message handlers
26a36c61f9SKrishna Gudipati  */
27a36c61f9SKrishna Gudipati void bfa_isr_unhandled(struct bfa_s *bfa, struct bfi_msg_s *m);
28a36c61f9SKrishna Gudipati 
29acdc79a6SJing Huang /*
30a36c61f9SKrishna Gudipati  * Request and response queue related defines
31a36c61f9SKrishna Gudipati  */
32a36c61f9SKrishna Gudipati #define BFA_REQQ_NELEMS_MIN	(4)
33a36c61f9SKrishna Gudipati #define BFA_RSPQ_NELEMS_MIN	(4)
34a36c61f9SKrishna Gudipati 
35a36c61f9SKrishna Gudipati #define bfa_reqq_pi(__bfa, __reqq)	((__bfa)->iocfc.req_cq_pi[__reqq])
36a36c61f9SKrishna Gudipati #define bfa_reqq_ci(__bfa, __reqq)					\
37a36c61f9SKrishna Gudipati 	(*(u32 *)((__bfa)->iocfc.req_cq_shadow_ci[__reqq].kva))
38a36c61f9SKrishna Gudipati 
39a36c61f9SKrishna Gudipati #define bfa_reqq_full(__bfa, __reqq)				\
40a36c61f9SKrishna Gudipati 	(((bfa_reqq_pi(__bfa, __reqq) + 1) &			\
41a36c61f9SKrishna Gudipati 	  ((__bfa)->iocfc.cfg.drvcfg.num_reqq_elems - 1)) ==	\
42a36c61f9SKrishna Gudipati 	 bfa_reqq_ci(__bfa, __reqq))
43a36c61f9SKrishna Gudipati 
44a36c61f9SKrishna Gudipati #define bfa_reqq_next(__bfa, __reqq)					\
45a36c61f9SKrishna Gudipati 	(bfa_reqq_full(__bfa, __reqq) ? NULL :				\
46a36c61f9SKrishna Gudipati 	 ((void *)((struct bfi_msg_s *)((__bfa)->iocfc.req_cq_ba[__reqq].kva) \
47a36c61f9SKrishna Gudipati 		   + bfa_reqq_pi((__bfa), (__reqq)))))
48a36c61f9SKrishna Gudipati 
493fd45980SKrishna Gudipati #define bfa_reqq_produce(__bfa, __reqq, __mh)  do {			\
503fd45980SKrishna Gudipati 		(__mh).mtag.h2i.qid     = (__bfa)->iocfc.hw_qid[__reqq];\
51a36c61f9SKrishna Gudipati 		(__bfa)->iocfc.req_cq_pi[__reqq]++;			\
52a36c61f9SKrishna Gudipati 		(__bfa)->iocfc.req_cq_pi[__reqq] &=			\
53a36c61f9SKrishna Gudipati 			((__bfa)->iocfc.cfg.drvcfg.num_reqq_elems - 1); \
5453440260SJing Huang 		writel((__bfa)->iocfc.req_cq_pi[__reqq],		\
5553440260SJing Huang 			(__bfa)->iocfc.bfa_regs.cpe_q_pi[__reqq]);	\
56a36c61f9SKrishna Gudipati 		} while (0)
57a36c61f9SKrishna Gudipati 
58a36c61f9SKrishna Gudipati #define bfa_rspq_pi(__bfa, __rspq)					\
59a36c61f9SKrishna Gudipati 	(*(u32 *)((__bfa)->iocfc.rsp_cq_shadow_pi[__rspq].kva))
60a36c61f9SKrishna Gudipati 
61a36c61f9SKrishna Gudipati #define bfa_rspq_ci(__bfa, __rspq)	((__bfa)->iocfc.rsp_cq_ci[__rspq])
62a36c61f9SKrishna Gudipati #define bfa_rspq_elem(__bfa, __rspq, __ci)				\
63a36c61f9SKrishna Gudipati 	(&((struct bfi_msg_s *)((__bfa)->iocfc.rsp_cq_ba[__rspq].kva))[__ci])
64a36c61f9SKrishna Gudipati 
65a36c61f9SKrishna Gudipati #define CQ_INCR(__index, __size) do {			\
66a36c61f9SKrishna Gudipati 	(__index)++;					\
67a36c61f9SKrishna Gudipati 	(__index) &= ((__size) - 1);			\
68a36c61f9SKrishna Gudipati } while (0)
69a36c61f9SKrishna Gudipati 
70acdc79a6SJing Huang /*
71a36c61f9SKrishna Gudipati  * Circular queue usage assignments
72a36c61f9SKrishna Gudipati  */
73a36c61f9SKrishna Gudipati enum {
74a36c61f9SKrishna Gudipati 	BFA_REQQ_IOC	= 0,	/*  all low-priority IOC msgs	*/
75a36c61f9SKrishna Gudipati 	BFA_REQQ_FCXP	= 0,	/*  all FCXP messages		*/
76a36c61f9SKrishna Gudipati 	BFA_REQQ_LPS	= 0,	/*  all lport service msgs	*/
77a36c61f9SKrishna Gudipati 	BFA_REQQ_PORT	= 0,	/*  all port messages		*/
78a36c61f9SKrishna Gudipati 	BFA_REQQ_FLASH	= 0,	/*  for flash module		*/
79a36c61f9SKrishna Gudipati 	BFA_REQQ_DIAG	= 0,	/*  for diag module		*/
80a36c61f9SKrishna Gudipati 	BFA_REQQ_RPORT	= 0,	/*  all port messages		*/
81a36c61f9SKrishna Gudipati 	BFA_REQQ_SBOOT	= 0,	/*  all san boot messages	*/
82a36c61f9SKrishna Gudipati 	BFA_REQQ_QOS_LO	= 1,	/*  all low priority IO	*/
83a36c61f9SKrishna Gudipati 	BFA_REQQ_QOS_MD	= 2,	/*  all medium priority IO	*/
84a36c61f9SKrishna Gudipati 	BFA_REQQ_QOS_HI	= 3,	/*  all high priority IO	*/
85a36c61f9SKrishna Gudipati };
86a36c61f9SKrishna Gudipati 
87a36c61f9SKrishna Gudipati static inline void
bfa_reqq_winit(struct bfa_reqq_wait_s * wqe,void (* qresume)(void * cbarg),void * cbarg)88a36c61f9SKrishna Gudipati bfa_reqq_winit(struct bfa_reqq_wait_s *wqe, void (*qresume) (void *cbarg),
89a36c61f9SKrishna Gudipati 	       void *cbarg)
90a36c61f9SKrishna Gudipati {
91a36c61f9SKrishna Gudipati 	wqe->qresume = qresume;
92a36c61f9SKrishna Gudipati 	wqe->cbarg = cbarg;
93a36c61f9SKrishna Gudipati }
94a36c61f9SKrishna Gudipati 
95a36c61f9SKrishna Gudipati #define bfa_reqq(__bfa, __reqq)	(&(__bfa)->reqq_waitq[__reqq])
96a36c61f9SKrishna Gudipati 
97acdc79a6SJing Huang /*
98a36c61f9SKrishna Gudipati  * static inline void
99a36c61f9SKrishna Gudipati  * bfa_reqq_wait(struct bfa_s *bfa, int reqq, struct bfa_reqq_wait_s *wqe)
100a36c61f9SKrishna Gudipati  */
101a36c61f9SKrishna Gudipati #define bfa_reqq_wait(__bfa, __reqq, __wqe) do {			\
102a36c61f9SKrishna Gudipati 									\
103a36c61f9SKrishna Gudipati 		struct list_head *waitq = bfa_reqq(__bfa, __reqq);      \
104a36c61f9SKrishna Gudipati 									\
105d4b671c5SJing Huang 		WARN_ON(((__reqq) >= BFI_IOC_MAX_CQS));			\
106d4b671c5SJing Huang 		WARN_ON(!((__wqe)->qresume && (__wqe)->cbarg));		\
107a36c61f9SKrishna Gudipati 									\
108a36c61f9SKrishna Gudipati 		list_add_tail(&(__wqe)->qe, waitq);      \
109a36c61f9SKrishna Gudipati 	} while (0)
110a36c61f9SKrishna Gudipati 
111a36c61f9SKrishna Gudipati #define bfa_reqq_wcancel(__wqe)	list_del(&(__wqe)->qe)
112a36c61f9SKrishna Gudipati 
113a36c61f9SKrishna Gudipati #define bfa_cb_queue(__bfa, __hcb_qe, __cbfn, __cbarg) do {	\
114a36c61f9SKrishna Gudipati 		(__hcb_qe)->cbfn  = (__cbfn);      \
115a36c61f9SKrishna Gudipati 		(__hcb_qe)->cbarg = (__cbarg);      \
11637ea0558SKrishna Gudipati 		(__hcb_qe)->pre_rmv = BFA_FALSE;		\
117a36c61f9SKrishna Gudipati 		list_add_tail(&(__hcb_qe)->qe, &(__bfa)->comp_q);      \
118a36c61f9SKrishna Gudipati 	} while (0)
119a36c61f9SKrishna Gudipati 
120a36c61f9SKrishna Gudipati #define bfa_cb_dequeue(__hcb_qe)	list_del(&(__hcb_qe)->qe)
121a36c61f9SKrishna Gudipati 
122a36c61f9SKrishna Gudipati #define bfa_cb_queue_once(__bfa, __hcb_qe, __cbfn, __cbarg) do {	\
123a36c61f9SKrishna Gudipati 		(__hcb_qe)->cbfn  = (__cbfn);      \
124a36c61f9SKrishna Gudipati 		(__hcb_qe)->cbarg = (__cbarg);      \
125a36c61f9SKrishna Gudipati 		if (!(__hcb_qe)->once) {      \
126a36c61f9SKrishna Gudipati 			list_add_tail(&(__hcb_qe)->qe, &(__bfa)->comp_q);      \
127a36c61f9SKrishna Gudipati 			(__hcb_qe)->once = BFA_TRUE;			\
128a36c61f9SKrishna Gudipati 		}							\
129a36c61f9SKrishna Gudipati 	} while (0)
130a36c61f9SKrishna Gudipati 
13137ea0558SKrishna Gudipati #define bfa_cb_queue_status(__bfa, __hcb_qe, __status) do {		\
13237ea0558SKrishna Gudipati 		(__hcb_qe)->fw_status = (__status);			\
13337ea0558SKrishna Gudipati 		list_add_tail(&(__hcb_qe)->qe, &(__bfa)->comp_q);	\
13437ea0558SKrishna Gudipati } while (0)
13537ea0558SKrishna Gudipati 
136a36c61f9SKrishna Gudipati #define bfa_cb_queue_done(__hcb_qe) do {	\
137a36c61f9SKrishna Gudipati 		(__hcb_qe)->once = BFA_FALSE;	\
138a36c61f9SKrishna Gudipati 	} while (0)
139a36c61f9SKrishna Gudipati 
140a36c61f9SKrishna Gudipati 
141acdc79a6SJing Huang /*
142a36c61f9SKrishna Gudipati  * PCI devices supported by the current BFA
143a36c61f9SKrishna Gudipati  */
144a36c61f9SKrishna Gudipati struct bfa_pciid_s {
145a36c61f9SKrishna Gudipati 	u16	device_id;
146a36c61f9SKrishna Gudipati 	u16	vendor_id;
147a36c61f9SKrishna Gudipati };
148a36c61f9SKrishna Gudipati 
149a36c61f9SKrishna Gudipati extern char     bfa_version[];
150a36c61f9SKrishna Gudipati 
151a36c61f9SKrishna Gudipati struct bfa_iocfc_regs_s {
15253440260SJing Huang 	void __iomem	*intr_status;
15353440260SJing Huang 	void __iomem	*intr_mask;
15453440260SJing Huang 	void __iomem	*cpe_q_pi[BFI_IOC_MAX_CQS];
15553440260SJing Huang 	void __iomem	*cpe_q_ci[BFI_IOC_MAX_CQS];
15653440260SJing Huang 	void __iomem	*cpe_q_ctrl[BFI_IOC_MAX_CQS];
15753440260SJing Huang 	void __iomem	*rme_q_ci[BFI_IOC_MAX_CQS];
15853440260SJing Huang 	void __iomem	*rme_q_pi[BFI_IOC_MAX_CQS];
15953440260SJing Huang 	void __iomem	*rme_q_ctrl[BFI_IOC_MAX_CQS];
160a36c61f9SKrishna Gudipati };
161a36c61f9SKrishna Gudipati 
162acdc79a6SJing Huang /*
163a36c61f9SKrishna Gudipati  * MSIX vector handlers
164a36c61f9SKrishna Gudipati  */
165a36c61f9SKrishna Gudipati #define BFA_MSIX_MAX_VECTORS	22
166a36c61f9SKrishna Gudipati typedef void (*bfa_msix_handler_t)(struct bfa_s *bfa, int vec);
167a36c61f9SKrishna Gudipati struct bfa_msix_s {
168a36c61f9SKrishna Gudipati 	int	nvecs;
169a36c61f9SKrishna Gudipati 	bfa_msix_handler_t handler[BFA_MSIX_MAX_VECTORS];
170a36c61f9SKrishna Gudipati };
171a36c61f9SKrishna Gudipati 
172acdc79a6SJing Huang /*
173a36c61f9SKrishna Gudipati  * Chip specific interfaces
174a36c61f9SKrishna Gudipati  */
175a36c61f9SKrishna Gudipati struct bfa_hwif_s {
176a36c61f9SKrishna Gudipati 	void (*hw_reginit)(struct bfa_s *bfa);
177a36c61f9SKrishna Gudipati 	void (*hw_reqq_ack)(struct bfa_s *bfa, int reqq);
178ca6e0ea7SKrishna Gudipati 	void (*hw_rspq_ack)(struct bfa_s *bfa, int rspq, u32 ci);
179a36c61f9SKrishna Gudipati 	void (*hw_msix_init)(struct bfa_s *bfa, int nvecs);
180775c7742SKrishna Gudipati 	void (*hw_msix_ctrl_install)(struct bfa_s *bfa);
181775c7742SKrishna Gudipati 	void (*hw_msix_queue_install)(struct bfa_s *bfa);
182a36c61f9SKrishna Gudipati 	void (*hw_msix_uninstall)(struct bfa_s *bfa);
183a36c61f9SKrishna Gudipati 	void (*hw_isr_mode_set)(struct bfa_s *bfa, bfa_boolean_t msix);
184a36c61f9SKrishna Gudipati 	void (*hw_msix_getvecs)(struct bfa_s *bfa, u32 *vecmap,
185a36c61f9SKrishna Gudipati 				u32 *nvecs, u32 *maxvec);
186a36c61f9SKrishna Gudipati 	void (*hw_msix_get_rme_range) (struct bfa_s *bfa, u32 *start,
187a36c61f9SKrishna Gudipati 				       u32 *end);
18811189208SKrishna Gudipati 	int	cpe_vec_q0;
18911189208SKrishna Gudipati 	int	rme_vec_q0;
190a36c61f9SKrishna Gudipati };
191a36c61f9SKrishna Gudipati typedef void (*bfa_cb_iocfc_t) (void *cbarg, enum bfa_status status);
192a36c61f9SKrishna Gudipati 
193a714134aSKrishna Gudipati struct bfa_faa_cbfn_s {
194a714134aSKrishna Gudipati 	bfa_cb_iocfc_t	faa_cbfn;
195a714134aSKrishna Gudipati 	void		*faa_cbarg;
196a714134aSKrishna Gudipati };
197a714134aSKrishna Gudipati 
198a714134aSKrishna Gudipati #define BFA_FAA_ENABLED		1
199a714134aSKrishna Gudipati #define BFA_FAA_DISABLED	2
200a714134aSKrishna Gudipati 
201a714134aSKrishna Gudipati /*
202a714134aSKrishna Gudipati  *	FAA attributes
203a714134aSKrishna Gudipati  */
204a714134aSKrishna Gudipati struct bfa_faa_attr_s {
205a714134aSKrishna Gudipati 	wwn_t	faa;
206a714134aSKrishna Gudipati 	u8	faa_state;
207a714134aSKrishna Gudipati 	u8	pwwn_source;
208a714134aSKrishna Gudipati 	u8	rsvd[6];
209a714134aSKrishna Gudipati };
210a714134aSKrishna Gudipati 
211a714134aSKrishna Gudipati struct bfa_faa_args_s {
212a714134aSKrishna Gudipati 	struct bfa_faa_attr_s	*faa_attr;
213a714134aSKrishna Gudipati 	struct bfa_faa_cbfn_s	faa_cb;
214a714134aSKrishna Gudipati 	u8			faa_state;
215a714134aSKrishna Gudipati 	bfa_boolean_t		busy;
216a714134aSKrishna Gudipati };
217a714134aSKrishna Gudipati 
218a36c61f9SKrishna Gudipati struct bfa_iocfc_s {
219db9d8a75SKrishna Gudipati 	bfa_fsm_t		fsm;
220a36c61f9SKrishna Gudipati 	struct bfa_s		*bfa;
221a36c61f9SKrishna Gudipati 	struct bfa_iocfc_cfg_s	cfg;
222a36c61f9SKrishna Gudipati 	u32		req_cq_pi[BFI_IOC_MAX_CQS];
223a36c61f9SKrishna Gudipati 	u32		rsp_cq_ci[BFI_IOC_MAX_CQS];
2243fd45980SKrishna Gudipati 	u8		hw_qid[BFI_IOC_MAX_CQS];
225a36c61f9SKrishna Gudipati 	struct bfa_cb_qe_s	init_hcb_qe;
226a36c61f9SKrishna Gudipati 	struct bfa_cb_qe_s	stop_hcb_qe;
227a36c61f9SKrishna Gudipati 	struct bfa_cb_qe_s	dis_hcb_qe;
22860138066SKrishna Gudipati 	struct bfa_cb_qe_s	en_hcb_qe;
229a36c61f9SKrishna Gudipati 	struct bfa_cb_qe_s	stats_hcb_qe;
230db9d8a75SKrishna Gudipati 	bfa_boolean_t		submod_enabled;
231db9d8a75SKrishna Gudipati 	bfa_boolean_t		cb_reqd;	/* Driver call back reqd */
232db9d8a75SKrishna Gudipati 	bfa_status_t		op_status;	/* Status of bfa iocfc op */
233a36c61f9SKrishna Gudipati 
234a36c61f9SKrishna Gudipati 	struct bfa_dma_s	cfg_info;
235a36c61f9SKrishna Gudipati 	struct bfi_iocfc_cfg_s *cfginfo;
236a36c61f9SKrishna Gudipati 	struct bfa_dma_s	cfgrsp_dma;
237a36c61f9SKrishna Gudipati 	struct bfi_iocfc_cfgrsp_s *cfgrsp;
238a36c61f9SKrishna Gudipati 	struct bfa_dma_s	req_cq_ba[BFI_IOC_MAX_CQS];
239a36c61f9SKrishna Gudipati 	struct bfa_dma_s	req_cq_shadow_ci[BFI_IOC_MAX_CQS];
240a36c61f9SKrishna Gudipati 	struct bfa_dma_s	rsp_cq_ba[BFI_IOC_MAX_CQS];
241a36c61f9SKrishna Gudipati 	struct bfa_dma_s	rsp_cq_shadow_pi[BFI_IOC_MAX_CQS];
242a36c61f9SKrishna Gudipati 	struct bfa_iocfc_regs_s	bfa_regs;	/*  BFA device registers */
243a36c61f9SKrishna Gudipati 	struct bfa_hwif_s	hwif;
244a36c61f9SKrishna Gudipati 	bfa_cb_iocfc_t		updateq_cbfn; /*  bios callback function */
245a36c61f9SKrishna Gudipati 	void			*updateq_cbarg;	/*  bios callback arg */
246a36c61f9SKrishna Gudipati 	u32	intr_mask;
247a714134aSKrishna Gudipati 	struct bfa_faa_args_s	faa_args;
2484507025dSKrishna Gudipati 	struct bfa_mem_dma_s	ioc_dma;
2494507025dSKrishna Gudipati 	struct bfa_mem_dma_s	iocfc_dma;
2504507025dSKrishna Gudipati 	struct bfa_mem_dma_s	reqq_dma[BFI_IOC_MAX_CQS];
2514507025dSKrishna Gudipati 	struct bfa_mem_dma_s	rspq_dma[BFI_IOC_MAX_CQS];
2524507025dSKrishna Gudipati 	struct bfa_mem_kva_s	kva_seg;
253a36c61f9SKrishna Gudipati };
254a36c61f9SKrishna Gudipati 
2554507025dSKrishna Gudipati #define BFA_MEM_IOC_DMA(_bfa)		(&((_bfa)->iocfc.ioc_dma))
2564507025dSKrishna Gudipati #define BFA_MEM_IOCFC_DMA(_bfa)		(&((_bfa)->iocfc.iocfc_dma))
2574507025dSKrishna Gudipati #define BFA_MEM_REQQ_DMA(_bfa, _qno)	(&((_bfa)->iocfc.reqq_dma[(_qno)]))
2584507025dSKrishna Gudipati #define BFA_MEM_RSPQ_DMA(_bfa, _qno)	(&((_bfa)->iocfc.rspq_dma[(_qno)]))
2594507025dSKrishna Gudipati #define BFA_MEM_IOCFC_KVA(_bfa)		(&((_bfa)->iocfc.kva_seg))
2604507025dSKrishna Gudipati 
2613fd45980SKrishna Gudipati #define bfa_fn_lpu(__bfa)	\
2623fd45980SKrishna Gudipati 	bfi_fn_lpu(bfa_ioc_pcifn(&(__bfa)->ioc), bfa_ioc_portid(&(__bfa)->ioc))
263a36c61f9SKrishna Gudipati #define bfa_msix_init(__bfa, __nvecs)					\
264a36c61f9SKrishna Gudipati 	((__bfa)->iocfc.hwif.hw_msix_init(__bfa, __nvecs))
265775c7742SKrishna Gudipati #define bfa_msix_ctrl_install(__bfa)					\
266775c7742SKrishna Gudipati 	((__bfa)->iocfc.hwif.hw_msix_ctrl_install(__bfa))
267775c7742SKrishna Gudipati #define bfa_msix_queue_install(__bfa)					\
268775c7742SKrishna Gudipati 	((__bfa)->iocfc.hwif.hw_msix_queue_install(__bfa))
269a36c61f9SKrishna Gudipati #define bfa_msix_uninstall(__bfa)					\
270a36c61f9SKrishna Gudipati 	((__bfa)->iocfc.hwif.hw_msix_uninstall(__bfa))
271ca6e0ea7SKrishna Gudipati #define bfa_isr_rspq_ack(__bfa, __queue, __ci)				\
272ca6e0ea7SKrishna Gudipati 	((__bfa)->iocfc.hwif.hw_rspq_ack(__bfa, __queue, __ci))
2733fd45980SKrishna Gudipati #define bfa_isr_reqq_ack(__bfa, __queue) do {				\
2743fd45980SKrishna Gudipati 	if ((__bfa)->iocfc.hwif.hw_reqq_ack)				\
2753fd45980SKrishna Gudipati 		(__bfa)->iocfc.hwif.hw_reqq_ack(__bfa, __queue);	\
2763fd45980SKrishna Gudipati } while (0)
27711189208SKrishna Gudipati #define bfa_isr_mode_set(__bfa, __msix) do {				\
27811189208SKrishna Gudipati 	if ((__bfa)->iocfc.hwif.hw_isr_mode_set)			\
27911189208SKrishna Gudipati 		(__bfa)->iocfc.hwif.hw_isr_mode_set(__bfa, __msix);	\
28011189208SKrishna Gudipati } while (0)
281a36c61f9SKrishna Gudipati #define bfa_msix_getvecs(__bfa, __vecmap, __nvecs, __maxvec)		\
282a36c61f9SKrishna Gudipati 	((__bfa)->iocfc.hwif.hw_msix_getvecs(__bfa, __vecmap,		\
283a36c61f9SKrishna Gudipati 					__nvecs, __maxvec))
284a36c61f9SKrishna Gudipati #define bfa_msix_get_rme_range(__bfa, __start, __end)			\
285a36c61f9SKrishna Gudipati 	((__bfa)->iocfc.hwif.hw_msix_get_rme_range(__bfa, __start, __end))
286a36c61f9SKrishna Gudipati #define bfa_msix(__bfa, __vec)						\
287a36c61f9SKrishna Gudipati 	((__bfa)->msix.handler[__vec](__bfa, __vec))
288a36c61f9SKrishna Gudipati 
289a36c61f9SKrishna Gudipati /*
290a36c61f9SKrishna Gudipati  * FC specific IOC functions.
291a36c61f9SKrishna Gudipati  */
2924507025dSKrishna Gudipati void bfa_iocfc_meminfo(struct bfa_iocfc_cfg_s *cfg,
2934507025dSKrishna Gudipati 			struct bfa_meminfo_s *meminfo,
2944507025dSKrishna Gudipati 			struct bfa_s *bfa);
295a36c61f9SKrishna Gudipati void bfa_iocfc_attach(struct bfa_s *bfa, void *bfad,
296a36c61f9SKrishna Gudipati 		      struct bfa_iocfc_cfg_s *cfg,
297a36c61f9SKrishna Gudipati 		      struct bfa_pcidev_s *pcidev);
298a36c61f9SKrishna Gudipati void bfa_iocfc_init(struct bfa_s *bfa);
299a36c61f9SKrishna Gudipati void bfa_iocfc_start(struct bfa_s *bfa);
300a36c61f9SKrishna Gudipati void bfa_iocfc_stop(struct bfa_s *bfa);
301a36c61f9SKrishna Gudipati void bfa_iocfc_isr(void *bfa, struct bfi_mbmsg_s *msg);
3024507025dSKrishna Gudipati void bfa_iocfc_set_snsbase(struct bfa_s *bfa, int seg_no, u64 snsbase_pa);
303a36c61f9SKrishna Gudipati bfa_boolean_t bfa_iocfc_is_operational(struct bfa_s *bfa);
304a36c61f9SKrishna Gudipati void bfa_iocfc_reset_queues(struct bfa_s *bfa);
305a36c61f9SKrishna Gudipati 
306a36c61f9SKrishna Gudipati void bfa_msix_all(struct bfa_s *bfa, int vec);
307a36c61f9SKrishna Gudipati void bfa_msix_reqq(struct bfa_s *bfa, int vec);
308a36c61f9SKrishna Gudipati void bfa_msix_rspq(struct bfa_s *bfa, int vec);
309a36c61f9SKrishna Gudipati void bfa_msix_lpu_err(struct bfa_s *bfa, int vec);
310a36c61f9SKrishna Gudipati 
311a36c61f9SKrishna Gudipati void bfa_hwcb_reginit(struct bfa_s *bfa);
312ca6e0ea7SKrishna Gudipati void bfa_hwcb_rspq_ack(struct bfa_s *bfa, int rspq, u32 ci);
313a36c61f9SKrishna Gudipati void bfa_hwcb_msix_init(struct bfa_s *bfa, int nvecs);
314775c7742SKrishna Gudipati void bfa_hwcb_msix_ctrl_install(struct bfa_s *bfa);
315775c7742SKrishna Gudipati void bfa_hwcb_msix_queue_install(struct bfa_s *bfa);
316a36c61f9SKrishna Gudipati void bfa_hwcb_msix_uninstall(struct bfa_s *bfa);
317a36c61f9SKrishna Gudipati void bfa_hwcb_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix);
318a36c61f9SKrishna Gudipati void bfa_hwcb_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, u32 *nvecs,
319a36c61f9SKrishna Gudipati 			   u32 *maxvec);
320a36c61f9SKrishna Gudipati void bfa_hwcb_msix_get_rme_range(struct bfa_s *bfa, u32 *start,
321a36c61f9SKrishna Gudipati 				 u32 *end);
322a36c61f9SKrishna Gudipati void bfa_hwct_reginit(struct bfa_s *bfa);
32311189208SKrishna Gudipati void bfa_hwct2_reginit(struct bfa_s *bfa);
324a36c61f9SKrishna Gudipati void bfa_hwct_reqq_ack(struct bfa_s *bfa, int rspq);
325ca6e0ea7SKrishna Gudipati void bfa_hwct_rspq_ack(struct bfa_s *bfa, int rspq, u32 ci);
326ca6e0ea7SKrishna Gudipati void bfa_hwct2_rspq_ack(struct bfa_s *bfa, int rspq, u32 ci);
327a36c61f9SKrishna Gudipati void bfa_hwct_msix_init(struct bfa_s *bfa, int nvecs);
328775c7742SKrishna Gudipati void bfa_hwct_msix_ctrl_install(struct bfa_s *bfa);
329775c7742SKrishna Gudipati void bfa_hwct_msix_queue_install(struct bfa_s *bfa);
330a36c61f9SKrishna Gudipati void bfa_hwct_msix_uninstall(struct bfa_s *bfa);
331a36c61f9SKrishna Gudipati void bfa_hwct_isr_mode_set(struct bfa_s *bfa, bfa_boolean_t msix);
332a36c61f9SKrishna Gudipati void bfa_hwct_msix_getvecs(struct bfa_s *bfa, u32 *vecmap, u32 *nvecs,
333a36c61f9SKrishna Gudipati 			   u32 *maxvec);
334a36c61f9SKrishna Gudipati void bfa_hwct_msix_get_rme_range(struct bfa_s *bfa, u32 *start,
335a36c61f9SKrishna Gudipati 				 u32 *end);
336a36c61f9SKrishna Gudipati void bfa_iocfc_get_bootwwns(struct bfa_s *bfa, u8 *nwwns, wwn_t *wwns);
337a36c61f9SKrishna Gudipati int bfa_iocfc_get_pbc_vports(struct bfa_s *bfa,
338a36c61f9SKrishna Gudipati 				struct bfi_pbc_vport_s *pbc_vport);
339a36c61f9SKrishna Gudipati 
340a36c61f9SKrishna Gudipati 
341acdc79a6SJing Huang /*
342a36c61f9SKrishna Gudipati  *----------------------------------------------------------------------
343a36c61f9SKrishna Gudipati  *		BFA public interfaces
344a36c61f9SKrishna Gudipati  *----------------------------------------------------------------------
345a36c61f9SKrishna Gudipati  */
346a36c61f9SKrishna Gudipati #define bfa_stats(_mod, _stats)	((_mod)->stats._stats++)
347a36c61f9SKrishna Gudipati #define bfa_ioc_get_stats(__bfa, __ioc_stats)		\
348a36c61f9SKrishna Gudipati 	bfa_ioc_fetch_stats(&(__bfa)->ioc, __ioc_stats)
349a36c61f9SKrishna Gudipati #define bfa_ioc_clear_stats(__bfa)		\
350a36c61f9SKrishna Gudipati 	bfa_ioc_clr_stats(&(__bfa)->ioc)
351a36c61f9SKrishna Gudipati #define bfa_get_nports(__bfa)			\
352a36c61f9SKrishna Gudipati 	bfa_ioc_get_nports(&(__bfa)->ioc)
353a36c61f9SKrishna Gudipati #define bfa_get_adapter_manufacturer(__bfa, __manufacturer)		\
354a36c61f9SKrishna Gudipati 	bfa_ioc_get_adapter_manufacturer(&(__bfa)->ioc, __manufacturer)
355a36c61f9SKrishna Gudipati #define bfa_get_adapter_model(__bfa, __model)			\
356a36c61f9SKrishna Gudipati 	bfa_ioc_get_adapter_model(&(__bfa)->ioc, __model)
357a36c61f9SKrishna Gudipati #define bfa_get_adapter_serial_num(__bfa, __serial_num)			\
358a36c61f9SKrishna Gudipati 	bfa_ioc_get_adapter_serial_num(&(__bfa)->ioc, __serial_num)
359a36c61f9SKrishna Gudipati #define bfa_get_adapter_fw_ver(__bfa, __fw_ver)			\
360a36c61f9SKrishna Gudipati 	bfa_ioc_get_adapter_fw_ver(&(__bfa)->ioc, __fw_ver)
361a36c61f9SKrishna Gudipati #define bfa_get_adapter_optrom_ver(__bfa, __optrom_ver)			\
362a36c61f9SKrishna Gudipati 	bfa_ioc_get_adapter_optrom_ver(&(__bfa)->ioc, __optrom_ver)
363a36c61f9SKrishna Gudipati #define bfa_get_pci_chip_rev(__bfa, __chip_rev)			\
364a36c61f9SKrishna Gudipati 	bfa_ioc_get_pci_chip_rev(&(__bfa)->ioc, __chip_rev)
365a36c61f9SKrishna Gudipati #define bfa_get_ioc_state(__bfa)		\
366a36c61f9SKrishna Gudipati 	bfa_ioc_get_state(&(__bfa)->ioc)
367a36c61f9SKrishna Gudipati #define bfa_get_type(__bfa)			\
368a36c61f9SKrishna Gudipati 	bfa_ioc_get_type(&(__bfa)->ioc)
369a36c61f9SKrishna Gudipati #define bfa_get_mac(__bfa)			\
370a36c61f9SKrishna Gudipati 	bfa_ioc_get_mac(&(__bfa)->ioc)
371a36c61f9SKrishna Gudipati #define bfa_get_mfg_mac(__bfa)			\
372a36c61f9SKrishna Gudipati 	bfa_ioc_get_mfg_mac(&(__bfa)->ioc)
373a36c61f9SKrishna Gudipati #define bfa_get_fw_clock_res(__bfa)		\
374a36c61f9SKrishna Gudipati 	((__bfa)->iocfc.cfgrsp->fwcfg.fw_tick_res)
375a36c61f9SKrishna Gudipati 
37683763d59SKrishna Gudipati /*
37783763d59SKrishna Gudipati  * lun mask macros return NULL when min cfg is enabled and there is
37883763d59SKrishna Gudipati  * no memory allocated for lunmask.
37983763d59SKrishna Gudipati  */
38083763d59SKrishna Gudipati #define bfa_get_lun_mask(__bfa)					\
38183763d59SKrishna Gudipati 	((&(__bfa)->modules.dconf_mod)->min_cfg) ? NULL :	\
38283763d59SKrishna Gudipati 	 (&(BFA_DCONF_MOD(__bfa)->dconf->lun_mask))
38383763d59SKrishna Gudipati 
38483763d59SKrishna Gudipati #define bfa_get_lun_mask_list(_bfa)				\
38583763d59SKrishna Gudipati 	((&(_bfa)->modules.dconf_mod)->min_cfg) ? NULL :	\
38683763d59SKrishna Gudipati 	 (bfa_get_lun_mask(_bfa)->lun_list)
38783763d59SKrishna Gudipati 
38883763d59SKrishna Gudipati #define bfa_get_lun_mask_status(_bfa)				\
38983763d59SKrishna Gudipati 	(((&(_bfa)->modules.dconf_mod)->min_cfg)		\
39083763d59SKrishna Gudipati 	 ? BFA_LUNMASK_MINCFG : ((bfa_get_lun_mask(_bfa))->status))
39183763d59SKrishna Gudipati 
392a36c61f9SKrishna Gudipati void bfa_get_pciids(struct bfa_pciid_s **pciids, int *npciids);
393a36c61f9SKrishna Gudipati void bfa_cfg_get_default(struct bfa_iocfc_cfg_s *cfg);
394a36c61f9SKrishna Gudipati void bfa_cfg_get_min(struct bfa_iocfc_cfg_s *cfg);
395a36c61f9SKrishna Gudipati void bfa_cfg_get_meminfo(struct bfa_iocfc_cfg_s *cfg,
3964507025dSKrishna Gudipati 			struct bfa_meminfo_s *meminfo,
3974507025dSKrishna Gudipati 			struct bfa_s *bfa);
398a36c61f9SKrishna Gudipati void bfa_attach(struct bfa_s *bfa, void *bfad, struct bfa_iocfc_cfg_s *cfg,
399a36c61f9SKrishna Gudipati 		struct bfa_meminfo_s *meminfo,
400a36c61f9SKrishna Gudipati 		struct bfa_pcidev_s *pcidev);
401a36c61f9SKrishna Gudipati void bfa_detach(struct bfa_s *bfa);
402a36c61f9SKrishna Gudipati void bfa_cb_init(void *bfad, bfa_status_t status);
403a36c61f9SKrishna Gudipati void bfa_cb_updateq(void *bfad, bfa_status_t status);
404a36c61f9SKrishna Gudipati 
405a36c61f9SKrishna Gudipati bfa_boolean_t bfa_intx(struct bfa_s *bfa);
406a36c61f9SKrishna Gudipati void bfa_isr_enable(struct bfa_s *bfa);
407a36c61f9SKrishna Gudipati void bfa_isr_disable(struct bfa_s *bfa);
408a36c61f9SKrishna Gudipati 
409a36c61f9SKrishna Gudipati void bfa_comp_deq(struct bfa_s *bfa, struct list_head *comp_q);
410a36c61f9SKrishna Gudipati void bfa_comp_process(struct bfa_s *bfa, struct list_head *comp_q);
411a36c61f9SKrishna Gudipati void bfa_comp_free(struct bfa_s *bfa, struct list_head *comp_q);
412a36c61f9SKrishna Gudipati 
413a36c61f9SKrishna Gudipati typedef void (*bfa_cb_ioc_t) (void *cbarg, enum bfa_status status);
414a36c61f9SKrishna Gudipati void bfa_iocfc_get_attr(struct bfa_s *bfa, struct bfa_iocfc_attr_s *attr);
415a36c61f9SKrishna Gudipati 
416a36c61f9SKrishna Gudipati 
417a36c61f9SKrishna Gudipati bfa_status_t bfa_iocfc_israttr_set(struct bfa_s *bfa,
418a36c61f9SKrishna Gudipati 				   struct bfa_iocfc_intr_attr_s *attr);
419a36c61f9SKrishna Gudipati 
420a36c61f9SKrishna Gudipati void bfa_iocfc_enable(struct bfa_s *bfa);
421a36c61f9SKrishna Gudipati void bfa_iocfc_disable(struct bfa_s *bfa);
422a36c61f9SKrishna Gudipati #define bfa_timer_start(_bfa, _timer, _timercb, _arg, _timeout)		\
423a36c61f9SKrishna Gudipati 	bfa_timer_begin(&(_bfa)->timer_mod, _timer, _timercb, _arg, _timeout)
424a36c61f9SKrishna Gudipati 
42537ea0558SKrishna Gudipati struct bfa_cb_pending_q_s {
42637ea0558SKrishna Gudipati 	struct bfa_cb_qe_s	hcb_qe;
42737ea0558SKrishna Gudipati 	void			*data;  /* Driver buffer */
42837ea0558SKrishna Gudipati };
42937ea0558SKrishna Gudipati 
43037ea0558SKrishna Gudipati /* Common macros to operate on pending stats/attr apis */
43137ea0558SKrishna Gudipati #define bfa_pending_q_init(__qe, __cbfn, __cbarg, __data) do {	\
43237ea0558SKrishna Gudipati 	bfa_q_qe_init(&((__qe)->hcb_qe.qe));			\
43337ea0558SKrishna Gudipati 	(__qe)->hcb_qe.cbfn = (__cbfn);				\
43437ea0558SKrishna Gudipati 	(__qe)->hcb_qe.cbarg = (__cbarg);			\
43537ea0558SKrishna Gudipati 	(__qe)->hcb_qe.pre_rmv = BFA_TRUE;			\
43637ea0558SKrishna Gudipati 	(__qe)->data = (__data);				\
43737ea0558SKrishna Gudipati } while (0)
43837ea0558SKrishna Gudipati 
439*a2b6d564SArnd Bergmann #define bfa_pending_q_init_status(__qe, __cbfn, __cbarg, __data) do {	\
440*a2b6d564SArnd Bergmann 	bfa_q_qe_init(&((__qe)->hcb_qe.qe));			\
441*a2b6d564SArnd Bergmann 	(__qe)->hcb_qe.cbfn_status = (__cbfn);			\
442*a2b6d564SArnd Bergmann 	(__qe)->hcb_qe.cbarg = (__cbarg);			\
443*a2b6d564SArnd Bergmann 	(__qe)->hcb_qe.pre_rmv = BFA_TRUE;			\
444*a2b6d564SArnd Bergmann 	(__qe)->data = (__data);				\
445*a2b6d564SArnd Bergmann } while (0)
446*a2b6d564SArnd Bergmann 
447a36c61f9SKrishna Gudipati #endif /* __BFA_H__ */
448