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