1/*
2 * Linux network driver for QLogic BR-series Converged Network Adapter.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License (GPL) Version 2 as
6 * published by the Free Software Foundation
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 * General Public License for more details.
12 */
13/*
14 * Copyright (c) 2005-2014 Brocade Communications Systems, Inc.
15 * Copyright (c) 2014-2015 QLogic Corporation
16 * All rights reserved
17 * www.qlogic.com
18 */
19#ifndef __BNA_H__
20#define __BNA_H__
21
22#include "bfa_defs.h"
23#include "bfa_ioc.h"
24#include "bfi_enet.h"
25#include "bna_types.h"
26
27extern const u32 bna_napi_dim_vector[][BNA_BIAS_T_MAX];
28
29/*  Macros and constants  */
30
31#define bna_is_small_rxq(_id) ((_id) & 0x1)
32
33/*
34 * input : _addr-> os dma addr in host endian format,
35 * output : _bna_dma_addr-> pointer to hw dma addr
36 */
37#define BNA_SET_DMA_ADDR(_addr, _bna_dma_addr)				\
38do {									\
39	u64 tmp_addr =						\
40	cpu_to_be64((u64)(_addr));				\
41	(_bna_dma_addr)->msb = ((struct bna_dma_addr *)&tmp_addr)->msb; \
42	(_bna_dma_addr)->lsb = ((struct bna_dma_addr *)&tmp_addr)->lsb; \
43} while (0)
44
45/*
46 * input : _bna_dma_addr-> pointer to hw dma addr
47 * output : _addr-> os dma addr in host endian format
48 */
49#define BNA_GET_DMA_ADDR(_bna_dma_addr, _addr)			\
50do {								\
51	(_addr) = ((((u64)ntohl((_bna_dma_addr)->msb))) << 32)		\
52	| ((ntohl((_bna_dma_addr)->lsb) & 0xffffffff));	\
53} while (0)
54
55#define BNA_TXQ_WI_NEEDED(_vectors)	(((_vectors) + 3) >> 2)
56
57#define BNA_QE_INDX_ADD(_qe_idx, _qe_num, _q_depth)			\
58	((_qe_idx) = ((_qe_idx) + (_qe_num)) & ((_q_depth) - 1))
59
60#define BNA_QE_INDX_INC(_idx, _q_depth) BNA_QE_INDX_ADD(_idx, 1, _q_depth)
61
62#define BNA_Q_INDEX_CHANGE(_old_idx, _updated_idx, _q_depth)		\
63	(((_updated_idx) - (_old_idx)) & ((_q_depth) - 1))
64
65#define BNA_QE_FREE_CNT(_q_ptr, _q_depth)				\
66	(((_q_ptr)->consumer_index - (_q_ptr)->producer_index - 1) &	\
67	 ((_q_depth) - 1))
68#define BNA_QE_IN_USE_CNT(_q_ptr, _q_depth)				\
69	((((_q_ptr)->producer_index - (_q_ptr)->consumer_index)) &	\
70	 (_q_depth - 1))
71
72#define BNA_LARGE_PKT_SIZE		1000
73
74#define BNA_UPDATE_PKT_CNT(_pkt, _len)					\
75do {									\
76	if ((_len) > BNA_LARGE_PKT_SIZE) {				\
77		(_pkt)->large_pkt_cnt++;				\
78	} else {							\
79		(_pkt)->small_pkt_cnt++;				\
80	}								\
81} while (0)
82
83#define	call_rxf_stop_cbfn(rxf)						\
84do {									\
85	if ((rxf)->stop_cbfn) {						\
86		void (*cbfn)(struct bna_rx *);			\
87		struct bna_rx *cbarg;					\
88		cbfn = (rxf)->stop_cbfn;				\
89		cbarg = (rxf)->stop_cbarg;				\
90		(rxf)->stop_cbfn = NULL;				\
91		(rxf)->stop_cbarg = NULL;				\
92		cbfn(cbarg);						\
93	}								\
94} while (0)
95
96#define	call_rxf_start_cbfn(rxf)					\
97do {									\
98	if ((rxf)->start_cbfn) {					\
99		void (*cbfn)(struct bna_rx *);			\
100		struct bna_rx *cbarg;					\
101		cbfn = (rxf)->start_cbfn;				\
102		cbarg = (rxf)->start_cbarg;				\
103		(rxf)->start_cbfn = NULL;				\
104		(rxf)->start_cbarg = NULL;				\
105		cbfn(cbarg);						\
106	}								\
107} while (0)
108
109#define	call_rxf_cam_fltr_cbfn(rxf)					\
110do {									\
111	if ((rxf)->cam_fltr_cbfn) {					\
112		void (*cbfn)(struct bnad *, struct bna_rx *);	\
113		struct bnad *cbarg;					\
114		cbfn = (rxf)->cam_fltr_cbfn;				\
115		cbarg = (rxf)->cam_fltr_cbarg;				\
116		(rxf)->cam_fltr_cbfn = NULL;				\
117		(rxf)->cam_fltr_cbarg = NULL;				\
118		cbfn(cbarg, rxf->rx);					\
119	}								\
120} while (0)
121
122#define is_xxx_enable(mode, bitmask, xxx) ((bitmask & xxx) && (mode & xxx))
123
124#define is_xxx_disable(mode, bitmask, xxx) ((bitmask & xxx) && !(mode & xxx))
125
126#define xxx_enable(mode, bitmask, xxx)					\
127do {									\
128	bitmask |= xxx;							\
129	mode |= xxx;							\
130} while (0)
131
132#define xxx_disable(mode, bitmask, xxx)					\
133do {									\
134	bitmask |= xxx;							\
135	mode &= ~xxx;							\
136} while (0)
137
138#define xxx_inactive(mode, bitmask, xxx)				\
139do {									\
140	bitmask &= ~xxx;						\
141	mode &= ~xxx;							\
142} while (0)
143
144#define is_promisc_enable(mode, bitmask)				\
145	is_xxx_enable(mode, bitmask, BNA_RXMODE_PROMISC)
146
147#define is_promisc_disable(mode, bitmask)				\
148	is_xxx_disable(mode, bitmask, BNA_RXMODE_PROMISC)
149
150#define promisc_enable(mode, bitmask)					\
151	xxx_enable(mode, bitmask, BNA_RXMODE_PROMISC)
152
153#define promisc_disable(mode, bitmask)					\
154	xxx_disable(mode, bitmask, BNA_RXMODE_PROMISC)
155
156#define promisc_inactive(mode, bitmask)					\
157	xxx_inactive(mode, bitmask, BNA_RXMODE_PROMISC)
158
159#define is_default_enable(mode, bitmask)				\
160	is_xxx_enable(mode, bitmask, BNA_RXMODE_DEFAULT)
161
162#define is_default_disable(mode, bitmask)				\
163	is_xxx_disable(mode, bitmask, BNA_RXMODE_DEFAULT)
164
165#define default_enable(mode, bitmask)					\
166	xxx_enable(mode, bitmask, BNA_RXMODE_DEFAULT)
167
168#define default_disable(mode, bitmask)					\
169	xxx_disable(mode, bitmask, BNA_RXMODE_DEFAULT)
170
171#define default_inactive(mode, bitmask)					\
172	xxx_inactive(mode, bitmask, BNA_RXMODE_DEFAULT)
173
174#define is_allmulti_enable(mode, bitmask)				\
175	is_xxx_enable(mode, bitmask, BNA_RXMODE_ALLMULTI)
176
177#define is_allmulti_disable(mode, bitmask)				\
178	is_xxx_disable(mode, bitmask, BNA_RXMODE_ALLMULTI)
179
180#define allmulti_enable(mode, bitmask)					\
181	xxx_enable(mode, bitmask, BNA_RXMODE_ALLMULTI)
182
183#define allmulti_disable(mode, bitmask)					\
184	xxx_disable(mode, bitmask, BNA_RXMODE_ALLMULTI)
185
186#define allmulti_inactive(mode, bitmask)				\
187	xxx_inactive(mode, bitmask, BNA_RXMODE_ALLMULTI)
188
189#define	GET_RXQS(rxp, q0, q1)	do {					\
190	switch ((rxp)->type) {						\
191	case BNA_RXP_SINGLE:						\
192		(q0) = rxp->rxq.single.only;				\
193		(q1) = NULL;						\
194		break;							\
195	case BNA_RXP_SLR:						\
196		(q0) = rxp->rxq.slr.large;				\
197		(q1) = rxp->rxq.slr.small;				\
198		break;							\
199	case BNA_RXP_HDS:						\
200		(q0) = rxp->rxq.hds.data;				\
201		(q1) = rxp->rxq.hds.hdr;				\
202		break;							\
203	}								\
204} while (0)
205
206#define bna_tx_rid_mask(_bna) ((_bna)->tx_mod.rid_mask)
207
208#define bna_rx_rid_mask(_bna) ((_bna)->rx_mod.rid_mask)
209
210#define bna_tx_from_rid(_bna, _rid, _tx)				\
211do {									\
212	struct bna_tx_mod *__tx_mod = &(_bna)->tx_mod;			\
213	struct bna_tx *__tx;						\
214	_tx = NULL;							\
215	list_for_each_entry(__tx, &__tx_mod->tx_active_q, qe) {		\
216		if (__tx->rid == (_rid)) {				\
217			(_tx) = __tx;					\
218			break;						\
219		}							\
220	}								\
221} while (0)
222
223#define bna_rx_from_rid(_bna, _rid, _rx)				\
224do {									\
225	struct bna_rx_mod *__rx_mod = &(_bna)->rx_mod;			\
226	struct bna_rx *__rx;						\
227	_rx = NULL;							\
228	list_for_each_entry(__rx, &__rx_mod->rx_active_q, qe) {		\
229		if (__rx->rid == (_rid)) {				\
230			(_rx) = __rx;					\
231			break;						\
232		}							\
233	}								\
234} while (0)
235
236#define bna_mcam_mod_free_q(_bna) (&(_bna)->mcam_mod.free_q)
237
238#define bna_mcam_mod_del_q(_bna) (&(_bna)->mcam_mod.del_q)
239
240#define bna_ucam_mod_free_q(_bna) (&(_bna)->ucam_mod.free_q)
241
242#define bna_ucam_mod_del_q(_bna) (&(_bna)->ucam_mod.del_q)
243
244/*  Inline functions  */
245
246static inline struct bna_mac *bna_mac_find(struct list_head *q, const u8 *addr)
247{
248	struct bna_mac *mac;
249
250	list_for_each_entry(mac, q, qe)
251		if (ether_addr_equal(mac->addr, addr))
252			return mac;
253	return NULL;
254}
255
256#define bna_attr(_bna) (&(_bna)->ioceth.attr)
257
258/* Function prototypes */
259
260/* BNA */
261
262/* FW response handlers */
263void bna_bfi_stats_clr_rsp(struct bna *bna, struct bfi_msgq_mhdr *msghdr);
264
265/* APIs for BNAD */
266void bna_res_req(struct bna_res_info *res_info);
267void bna_mod_res_req(struct bna *bna, struct bna_res_info *res_info);
268void bna_init(struct bna *bna, struct bnad *bnad,
269			struct bfa_pcidev *pcidev,
270			struct bna_res_info *res_info);
271void bna_mod_init(struct bna *bna, struct bna_res_info *res_info);
272void bna_uninit(struct bna *bna);
273int bna_num_txq_set(struct bna *bna, int num_txq);
274int bna_num_rxp_set(struct bna *bna, int num_rxp);
275void bna_hw_stats_get(struct bna *bna);
276
277/* APIs for RxF */
278struct bna_mac *bna_cam_mod_mac_get(struct list_head *head);
279struct bna_mcam_handle *bna_mcam_mod_handle_get(struct bna_mcam_mod *mod);
280void bna_mcam_mod_handle_put(struct bna_mcam_mod *mcam_mod,
281			  struct bna_mcam_handle *handle);
282
283/* MBOX */
284
285/* API for BNAD */
286void bna_mbox_handler(struct bna *bna, u32 intr_status);
287
288/* ETHPORT */
289
290/* Callbacks for RX */
291void bna_ethport_cb_rx_started(struct bna_ethport *ethport);
292void bna_ethport_cb_rx_stopped(struct bna_ethport *ethport);
293
294/* TX MODULE AND TX */
295
296/* FW response handelrs */
297void bna_bfi_tx_enet_start_rsp(struct bna_tx *tx,
298			       struct bfi_msgq_mhdr *msghdr);
299void bna_bfi_tx_enet_stop_rsp(struct bna_tx *tx,
300			      struct bfi_msgq_mhdr *msghdr);
301void bna_bfi_bw_update_aen(struct bna_tx_mod *tx_mod);
302
303/* APIs for BNA */
304void bna_tx_mod_init(struct bna_tx_mod *tx_mod, struct bna *bna,
305		     struct bna_res_info *res_info);
306void bna_tx_mod_uninit(struct bna_tx_mod *tx_mod);
307
308/* APIs for ENET */
309void bna_tx_mod_start(struct bna_tx_mod *tx_mod, enum bna_tx_type type);
310void bna_tx_mod_stop(struct bna_tx_mod *tx_mod, enum bna_tx_type type);
311void bna_tx_mod_fail(struct bna_tx_mod *tx_mod);
312
313/* APIs for BNAD */
314void bna_tx_res_req(int num_txq, int txq_depth,
315		    struct bna_res_info *res_info);
316struct bna_tx *bna_tx_create(struct bna *bna, struct bnad *bnad,
317			       struct bna_tx_config *tx_cfg,
318			       const struct bna_tx_event_cbfn *tx_cbfn,
319			       struct bna_res_info *res_info, void *priv);
320void bna_tx_destroy(struct bna_tx *tx);
321void bna_tx_enable(struct bna_tx *tx);
322void bna_tx_disable(struct bna_tx *tx, enum bna_cleanup_type type,
323		    void (*cbfn)(void *, struct bna_tx *));
324void bna_tx_cleanup_complete(struct bna_tx *tx);
325void bna_tx_coalescing_timeo_set(struct bna_tx *tx, int coalescing_timeo);
326
327/* RX MODULE, RX, RXF */
328
329/* FW response handlers */
330void bna_bfi_rx_enet_start_rsp(struct bna_rx *rx,
331			       struct bfi_msgq_mhdr *msghdr);
332void bna_bfi_rx_enet_stop_rsp(struct bna_rx *rx,
333			      struct bfi_msgq_mhdr *msghdr);
334void bna_bfi_rxf_cfg_rsp(struct bna_rxf *rxf, struct bfi_msgq_mhdr *msghdr);
335void bna_bfi_rxf_mcast_add_rsp(struct bna_rxf *rxf,
336			       struct bfi_msgq_mhdr *msghdr);
337void bna_bfi_rxf_ucast_set_rsp(struct bna_rxf *rxf,
338			       struct bfi_msgq_mhdr *msghdr);
339
340/* APIs for BNA */
341void bna_rx_mod_init(struct bna_rx_mod *rx_mod, struct bna *bna,
342		     struct bna_res_info *res_info);
343void bna_rx_mod_uninit(struct bna_rx_mod *rx_mod);
344
345/* APIs for ENET */
346void bna_rx_mod_start(struct bna_rx_mod *rx_mod, enum bna_rx_type type);
347void bna_rx_mod_stop(struct bna_rx_mod *rx_mod, enum bna_rx_type type);
348void bna_rx_mod_fail(struct bna_rx_mod *rx_mod);
349
350/* APIs for BNAD */
351void bna_rx_res_req(struct bna_rx_config *rx_config,
352		    struct bna_res_info *res_info);
353struct bna_rx *bna_rx_create(struct bna *bna, struct bnad *bnad,
354			       struct bna_rx_config *rx_cfg,
355			       const struct bna_rx_event_cbfn *rx_cbfn,
356			       struct bna_res_info *res_info, void *priv);
357void bna_rx_destroy(struct bna_rx *rx);
358void bna_rx_enable(struct bna_rx *rx);
359void bna_rx_disable(struct bna_rx *rx, enum bna_cleanup_type type,
360		    void (*cbfn)(void *, struct bna_rx *));
361void bna_rx_cleanup_complete(struct bna_rx *rx);
362void bna_rx_coalescing_timeo_set(struct bna_rx *rx, int coalescing_timeo);
363void bna_rx_dim_reconfig(struct bna *bna, const u32 vector[][BNA_BIAS_T_MAX]);
364void bna_rx_dim_update(struct bna_ccb *ccb);
365enum bna_cb_status bna_rx_ucast_set(struct bna_rx *rx, const u8 *ucmac);
366enum bna_cb_status bna_rx_ucast_listset(struct bna_rx *rx, int count,
367					const u8 *uclist);
368enum bna_cb_status bna_rx_mcast_add(struct bna_rx *rx, const u8 *mcmac,
369				    void (*cbfn)(struct bnad *,
370						 struct bna_rx *));
371enum bna_cb_status bna_rx_mcast_listset(struct bna_rx *rx, int count,
372					const u8 *mcmac);
373void
374bna_rx_mcast_delall(struct bna_rx *rx);
375enum bna_cb_status
376bna_rx_mode_set(struct bna_rx *rx, enum bna_rxmode rxmode,
377		enum bna_rxmode bitmask);
378void bna_rx_vlan_add(struct bna_rx *rx, int vlan_id);
379void bna_rx_vlan_del(struct bna_rx *rx, int vlan_id);
380void bna_rx_vlanfilter_enable(struct bna_rx *rx);
381void bna_rx_vlan_strip_enable(struct bna_rx *rx);
382void bna_rx_vlan_strip_disable(struct bna_rx *rx);
383/* ENET */
384
385/* API for RX */
386int bna_enet_mtu_get(struct bna_enet *enet);
387
388/* Callbacks for TX, RX */
389void bna_enet_cb_tx_stopped(struct bna_enet *enet);
390void bna_enet_cb_rx_stopped(struct bna_enet *enet);
391
392/* API for BNAD */
393void bna_enet_enable(struct bna_enet *enet);
394void bna_enet_disable(struct bna_enet *enet, enum bna_cleanup_type type,
395		      void (*cbfn)(void *));
396void bna_enet_pause_config(struct bna_enet *enet,
397			   struct bna_pause_config *pause_config);
398void bna_enet_mtu_set(struct bna_enet *enet, int mtu,
399		      void (*cbfn)(struct bnad *));
400void bna_enet_perm_mac_get(struct bna_enet *enet, u8 *mac);
401
402/* IOCETH */
403
404/* APIs for BNAD */
405void bna_ioceth_enable(struct bna_ioceth *ioceth);
406void bna_ioceth_disable(struct bna_ioceth *ioceth,
407			enum bna_cleanup_type type);
408
409/* BNAD */
410
411/* Callbacks for ENET */
412void bnad_cb_ethport_link_status(struct bnad *bnad,
413			      enum bna_link_status status);
414
415/* Callbacks for IOCETH */
416void bnad_cb_ioceth_ready(struct bnad *bnad);
417void bnad_cb_ioceth_failed(struct bnad *bnad);
418void bnad_cb_ioceth_disabled(struct bnad *bnad);
419void bnad_cb_mbox_intr_enable(struct bnad *bnad);
420void bnad_cb_mbox_intr_disable(struct bnad *bnad);
421
422/* Callbacks for BNA */
423void bnad_cb_stats_get(struct bnad *bnad, enum bna_cb_status status,
424		       struct bna_stats *stats);
425
426#endif  /* __BNA_H__ */
427