[go: nahoru, domu]

1/*
2 * Linux network driver for Brocade 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-2010 Brocade Communications Systems, Inc.
15 * All rights reserved
16 * www.brocade.com
17 */
18#ifndef __BNA_TYPES_H__
19#define __BNA_TYPES_H__
20
21#include "cna.h"
22#include "bna_hw_defs.h"
23#include "bfa_cee.h"
24#include "bfa_msgq.h"
25
26/* Forward declarations */
27
28struct bna_mcam_handle;
29struct bna_txq;
30struct bna_tx;
31struct bna_rxq;
32struct bna_cq;
33struct bna_rx;
34struct bna_rxf;
35struct bna_enet;
36struct bna;
37struct bnad;
38
39/* Enums, primitive data types */
40
41enum bna_status {
42	BNA_STATUS_T_DISABLED	= 0,
43	BNA_STATUS_T_ENABLED	= 1
44};
45
46enum bna_cleanup_type {
47	BNA_HARD_CLEANUP	= 0,
48	BNA_SOFT_CLEANUP	= 1
49};
50
51enum bna_cb_status {
52	BNA_CB_SUCCESS		= 0,
53	BNA_CB_FAIL		= 1,
54	BNA_CB_INTERRUPT	= 2,
55	BNA_CB_BUSY		= 3,
56	BNA_CB_INVALID_MAC	= 4,
57	BNA_CB_MCAST_LIST_FULL	= 5,
58	BNA_CB_UCAST_CAM_FULL	= 6,
59	BNA_CB_WAITING		= 7,
60	BNA_CB_NOT_EXEC		= 8
61};
62
63enum bna_res_type {
64	BNA_RES_T_MEM		= 1,
65	BNA_RES_T_INTR		= 2
66};
67
68enum bna_mem_type {
69	BNA_MEM_T_KVA		= 1,
70	BNA_MEM_T_DMA		= 2
71};
72
73enum bna_intr_type {
74	BNA_INTR_T_INTX		= 1,
75	BNA_INTR_T_MSIX		= 2
76};
77
78enum bna_res_req_type {
79	BNA_RES_MEM_T_COM		= 0,
80	BNA_RES_MEM_T_ATTR		= 1,
81	BNA_RES_MEM_T_FWTRC		= 2,
82	BNA_RES_MEM_T_STATS		= 3,
83	BNA_RES_T_MAX
84};
85
86enum bna_mod_res_req_type {
87	BNA_MOD_RES_MEM_T_TX_ARRAY	= 0,
88	BNA_MOD_RES_MEM_T_TXQ_ARRAY	= 1,
89	BNA_MOD_RES_MEM_T_RX_ARRAY	= 2,
90	BNA_MOD_RES_MEM_T_RXP_ARRAY	= 3,
91	BNA_MOD_RES_MEM_T_RXQ_ARRAY	= 4,
92	BNA_MOD_RES_MEM_T_UCMAC_ARRAY	= 5,
93	BNA_MOD_RES_MEM_T_MCMAC_ARRAY	= 6,
94	BNA_MOD_RES_MEM_T_MCHANDLE_ARRAY = 7,
95	BNA_MOD_RES_T_MAX
96};
97
98enum bna_tx_res_req_type {
99	BNA_TX_RES_MEM_T_TCB	= 0,
100	BNA_TX_RES_MEM_T_UNMAPQ	= 1,
101	BNA_TX_RES_MEM_T_QPT	= 2,
102	BNA_TX_RES_MEM_T_SWQPT	= 3,
103	BNA_TX_RES_MEM_T_PAGE	= 4,
104	BNA_TX_RES_MEM_T_IBIDX	= 5,
105	BNA_TX_RES_INTR_T_TXCMPL = 6,
106	BNA_TX_RES_T_MAX,
107};
108
109enum bna_rx_mem_type {
110	BNA_RX_RES_MEM_T_CCB		= 0,	/* CQ context */
111	BNA_RX_RES_MEM_T_RCB		= 1,	/* CQ context */
112	BNA_RX_RES_MEM_T_UNMAPHQ	= 2,
113	BNA_RX_RES_MEM_T_UNMAPDQ	= 3,
114	BNA_RX_RES_MEM_T_CQPT		= 4,
115	BNA_RX_RES_MEM_T_CSWQPT		= 5,
116	BNA_RX_RES_MEM_T_CQPT_PAGE	= 6,
117	BNA_RX_RES_MEM_T_HQPT		= 7,
118	BNA_RX_RES_MEM_T_DQPT		= 8,
119	BNA_RX_RES_MEM_T_HSWQPT		= 9,
120	BNA_RX_RES_MEM_T_DSWQPT		= 10,
121	BNA_RX_RES_MEM_T_DPAGE		= 11,
122	BNA_RX_RES_MEM_T_HPAGE		= 12,
123	BNA_RX_RES_MEM_T_IBIDX		= 13,
124	BNA_RX_RES_MEM_T_RIT		= 14,
125	BNA_RX_RES_T_INTR		= 15,
126	BNA_RX_RES_T_MAX		= 16
127};
128
129enum bna_tx_type {
130	BNA_TX_T_REGULAR	= 0,
131	BNA_TX_T_LOOPBACK	= 1,
132};
133
134enum bna_tx_flags {
135	BNA_TX_F_ENET_STARTED	= 1,
136	BNA_TX_F_ENABLED	= 2,
137	BNA_TX_F_PRIO_CHANGED	= 4,
138	BNA_TX_F_BW_UPDATED	= 8,
139};
140
141enum bna_tx_mod_flags {
142	BNA_TX_MOD_F_ENET_STARTED	= 1,
143	BNA_TX_MOD_F_ENET_LOOPBACK	= 2,
144};
145
146enum bna_rx_type {
147	BNA_RX_T_REGULAR	= 0,
148	BNA_RX_T_LOOPBACK	= 1,
149};
150
151enum bna_rxp_type {
152	BNA_RXP_SINGLE		= 1,
153	BNA_RXP_SLR		= 2,
154	BNA_RXP_HDS		= 3
155};
156
157enum bna_rxmode {
158	BNA_RXMODE_PROMISC	= 1,
159	BNA_RXMODE_DEFAULT	= 2,
160	BNA_RXMODE_ALLMULTI	= 4
161};
162
163enum bna_rx_event {
164	RX_E_START			= 1,
165	RX_E_STOP			= 2,
166	RX_E_FAIL			= 3,
167	RX_E_STARTED			= 4,
168	RX_E_STOPPED			= 5,
169	RX_E_RXF_STARTED		= 6,
170	RX_E_RXF_STOPPED		= 7,
171	RX_E_CLEANUP_DONE		= 8,
172};
173
174enum bna_rx_flags {
175	BNA_RX_F_ENET_STARTED	= 1,
176	BNA_RX_F_ENABLED	= 2,
177};
178
179enum bna_rx_mod_flags {
180	BNA_RX_MOD_F_ENET_STARTED	= 1,
181	BNA_RX_MOD_F_ENET_LOOPBACK	= 2,
182};
183
184enum bna_rxf_flags {
185	BNA_RXF_F_PAUSED		= 1,
186};
187
188enum bna_rxf_event {
189	RXF_E_START			= 1,
190	RXF_E_STOP			= 2,
191	RXF_E_FAIL			= 3,
192	RXF_E_CONFIG			= 4,
193	RXF_E_PAUSE			= 5,
194	RXF_E_RESUME			= 6,
195	RXF_E_FW_RESP			= 7,
196};
197
198enum bna_enet_type {
199	BNA_ENET_T_REGULAR		= 0,
200	BNA_ENET_T_LOOPBACK_INTERNAL	= 1,
201	BNA_ENET_T_LOOPBACK_EXTERNAL	= 2,
202};
203
204enum bna_link_status {
205	BNA_LINK_DOWN		= 0,
206	BNA_LINK_UP		= 1,
207	BNA_CEE_UP		= 2
208};
209
210enum bna_ethport_flags {
211	BNA_ETHPORT_F_ADMIN_UP		= 1,
212	BNA_ETHPORT_F_PORT_ENABLED	= 2,
213	BNA_ETHPORT_F_RX_STARTED	= 4,
214};
215
216enum bna_enet_flags {
217	BNA_ENET_F_IOCETH_READY		= 1,
218	BNA_ENET_F_ENABLED		= 2,
219	BNA_ENET_F_PAUSE_CHANGED	= 4,
220	BNA_ENET_F_MTU_CHANGED		= 8
221};
222
223enum bna_rss_flags {
224	BNA_RSS_F_RIT_PENDING		= 1,
225	BNA_RSS_F_CFG_PENDING		= 2,
226	BNA_RSS_F_STATUS_PENDING	= 4,
227};
228
229enum bna_mod_flags {
230	BNA_MOD_F_INIT_DONE		= 1,
231};
232
233enum bna_pkt_rates {
234	BNA_PKT_RATE_10K		= 10000,
235	BNA_PKT_RATE_20K		= 20000,
236	BNA_PKT_RATE_30K		= 30000,
237	BNA_PKT_RATE_40K		= 40000,
238	BNA_PKT_RATE_50K		= 50000,
239	BNA_PKT_RATE_60K		= 60000,
240	BNA_PKT_RATE_70K		= 70000,
241	BNA_PKT_RATE_80K		= 80000,
242};
243
244enum bna_dim_load_types {
245	BNA_LOAD_T_HIGH_4		= 0, /* 80K <= r */
246	BNA_LOAD_T_HIGH_3		= 1, /* 60K <= r < 80K */
247	BNA_LOAD_T_HIGH_2		= 2, /* 50K <= r < 60K */
248	BNA_LOAD_T_HIGH_1		= 3, /* 40K <= r < 50K */
249	BNA_LOAD_T_LOW_1		= 4, /* 30K <= r < 40K */
250	BNA_LOAD_T_LOW_2		= 5, /* 20K <= r < 30K */
251	BNA_LOAD_T_LOW_3		= 6, /* 10K <= r < 20K */
252	BNA_LOAD_T_LOW_4		= 7, /* r < 10K */
253	BNA_LOAD_T_MAX			= 8
254};
255
256enum bna_dim_bias_types {
257	BNA_BIAS_T_SMALL		= 0, /* small pkts > (large pkts * 2) */
258	BNA_BIAS_T_LARGE		= 1, /* Not BNA_BIAS_T_SMALL */
259	BNA_BIAS_T_MAX			= 2
260};
261
262#define BNA_MAX_NAME_SIZE	64
263struct bna_ident {
264	int			id;
265	char			name[BNA_MAX_NAME_SIZE];
266};
267
268struct bna_mac {
269	/* This should be the first one */
270	struct list_head			qe;
271	u8			addr[ETH_ALEN];
272	struct bna_mcam_handle *handle;
273};
274
275struct bna_mem_descr {
276	u32		len;
277	void		*kva;
278	struct bna_dma_addr dma;
279};
280
281struct bna_mem_info {
282	enum bna_mem_type mem_type;
283	u32		len;
284	u32		num;
285	u32		align_sz; /* 0/1 = no alignment */
286	struct bna_mem_descr *mdl;
287	void			*cookie; /* For bnad to unmap dma later */
288};
289
290struct bna_intr_descr {
291	int			vector;
292};
293
294struct bna_intr_info {
295	enum bna_intr_type intr_type;
296	int			num;
297	struct bna_intr_descr *idl;
298};
299
300union bna_res_u {
301	struct bna_mem_info mem_info;
302	struct bna_intr_info intr_info;
303};
304
305struct bna_res_info {
306	enum bna_res_type res_type;
307	union bna_res_u		res_u;
308};
309
310/* HW QPT */
311struct bna_qpt {
312	struct bna_dma_addr hw_qpt_ptr;
313	void		*kv_qpt_ptr;
314	u32		page_count;
315	u32		page_size;
316};
317
318struct bna_attr {
319	bool			fw_query_complete;
320	int			num_txq;
321	int			num_rxp;
322	int			num_ucmac;
323	int			num_mcmac;
324	int			max_rit_size;
325};
326
327/* IOCEth */
328
329struct bna_ioceth {
330	bfa_fsm_t		fsm;
331	struct bfa_ioc ioc;
332
333	struct bna_attr attr;
334	struct bfa_msgq_cmd_entry msgq_cmd;
335	struct bfi_enet_attr_req attr_req;
336
337	void (*stop_cbfn)(struct bnad *bnad);
338	struct bnad *stop_cbarg;
339
340	struct bna *bna;
341};
342
343/* Enet */
344
345/* Pause configuration */
346struct bna_pause_config {
347	enum bna_status tx_pause;
348	enum bna_status rx_pause;
349};
350
351struct bna_enet {
352	bfa_fsm_t		fsm;
353	enum bna_enet_flags flags;
354
355	enum bna_enet_type type;
356
357	struct bna_pause_config pause_config;
358	int			mtu;
359
360	/* Callback for bna_enet_disable(), enet_stop() */
361	void (*stop_cbfn)(void *);
362	void			*stop_cbarg;
363
364	/* Callback for bna_enet_pause_config() */
365	void (*pause_cbfn)(struct bnad *);
366
367	/* Callback for bna_enet_mtu_set() */
368	void (*mtu_cbfn)(struct bnad *);
369
370	struct bfa_wc		chld_stop_wc;
371
372	struct bfa_msgq_cmd_entry msgq_cmd;
373	struct bfi_enet_set_pause_req pause_req;
374
375	struct bna *bna;
376};
377
378/* Ethport */
379
380struct bna_ethport {
381	bfa_fsm_t		fsm;
382	enum bna_ethport_flags flags;
383
384	enum bna_link_status link_status;
385
386	int			rx_started_count;
387
388	void (*stop_cbfn)(struct bna_enet *);
389
390	void (*adminup_cbfn)(struct bnad *, enum bna_cb_status);
391
392	void (*link_cbfn)(struct bnad *, enum bna_link_status);
393
394	struct bfa_msgq_cmd_entry msgq_cmd;
395	union {
396		struct bfi_enet_enable_req admin_req;
397		struct bfi_enet_diag_lb_req lpbk_req;
398	} bfi_enet_cmd;
399
400	struct bna *bna;
401};
402
403/* Interrupt Block */
404
405/* Doorbell structure */
406struct bna_ib_dbell {
407	void __iomem   *doorbell_addr;
408	u32		doorbell_ack;
409};
410
411/* IB structure */
412struct bna_ib {
413	struct bna_dma_addr ib_seg_host_addr;
414	void		*ib_seg_host_addr_kva;
415
416	struct bna_ib_dbell door_bell;
417
418	enum bna_intr_type	intr_type;
419	int			intr_vector;
420
421	u8			coalescing_timeo;    /* Unit is 5usec. */
422
423	int			interpkt_count;
424	int			interpkt_timeo;
425};
426
427/* Tx object */
428
429/* Tx datapath control structure */
430#define BNA_Q_NAME_SIZE		16
431struct bna_tcb {
432	/* Fast path */
433	void			**sw_qpt;
434	void			*sw_q;
435	void			*unmap_q;
436	u32		producer_index;
437	u32		consumer_index;
438	volatile u32	*hw_consumer_index;
439	u32		q_depth;
440	void __iomem   *q_dbell;
441	struct bna_ib_dbell *i_dbell;
442	/* Control path */
443	struct bna_txq *txq;
444	struct bnad *bnad;
445	void			*priv; /* BNAD's cookie */
446	enum bna_intr_type intr_type;
447	int			intr_vector;
448	u8			priority; /* Current priority */
449	unsigned long		flags; /* Used by bnad as required */
450	int			id;
451	char			name[BNA_Q_NAME_SIZE];
452};
453
454/* TxQ QPT and configuration */
455struct bna_txq {
456	/* This should be the first one */
457	struct list_head			qe;
458
459	u8			priority;
460
461	struct bna_qpt qpt;
462	struct bna_tcb *tcb;
463	struct bna_ib ib;
464
465	struct bna_tx *tx;
466
467	int			hw_id;
468
469	u64		tx_packets;
470	u64		tx_bytes;
471};
472
473/* Tx object */
474struct bna_tx {
475	/* This should be the first one */
476	struct list_head			qe;
477	int			rid;
478	int			hw_id;
479
480	bfa_fsm_t		fsm;
481	enum bna_tx_flags flags;
482
483	enum bna_tx_type type;
484	int			num_txq;
485
486	struct list_head			txq_q;
487	u16			txf_vlan_id;
488
489	/* Tx event handlers */
490	void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
491	void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
492	void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
493	void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
494	void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
495
496	/* callback for bna_tx_disable(), bna_tx_stop() */
497	void (*stop_cbfn)(void *arg, struct bna_tx *tx);
498	void			*stop_cbarg;
499
500	/* callback for bna_tx_prio_set() */
501	void (*prio_change_cbfn)(struct bnad *bnad, struct bna_tx *tx);
502
503	struct bfa_msgq_cmd_entry msgq_cmd;
504	union {
505		struct bfi_enet_tx_cfg_req	cfg_req;
506		struct bfi_enet_req		req;
507		struct bfi_enet_tx_cfg_rsp	cfg_rsp;
508	} bfi_enet_cmd;
509
510	struct bna *bna;
511	void			*priv;	/* bnad's cookie */
512};
513
514/* Tx object configuration used during creation */
515struct bna_tx_config {
516	int			num_txq;
517	int			txq_depth;
518	int			coalescing_timeo;
519	enum bna_tx_type tx_type;
520};
521
522struct bna_tx_event_cbfn {
523	/* Optional */
524	void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
525	void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
526	/* Mandatory */
527	void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
528	void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
529	void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
530};
531
532/* Tx module - keeps track of free, active tx objects */
533struct bna_tx_mod {
534	struct bna_tx *tx;		/* BFI_MAX_TXQ entries */
535	struct bna_txq *txq;		/* BFI_MAX_TXQ entries */
536
537	struct list_head			tx_free_q;
538	struct list_head			tx_active_q;
539
540	struct list_head			txq_free_q;
541
542	/* callback for bna_tx_mod_stop() */
543	void (*stop_cbfn)(struct bna_enet *enet);
544
545	struct bfa_wc		tx_stop_wc;
546
547	enum bna_tx_mod_flags flags;
548
549	u8			prio_map;
550	int			default_prio;
551	int			iscsi_over_cee;
552	int			iscsi_prio;
553	int			prio_reconfigured;
554
555	u32			rid_mask;
556
557	struct bna *bna;
558};
559
560/* Rx object */
561
562/* Rx datapath control structure */
563struct bna_rcb {
564	/* Fast path */
565	void			**sw_qpt;
566	void			*sw_q;
567	void			*unmap_q;
568	u32		producer_index;
569	u32		consumer_index;
570	u32		q_depth;
571	void __iomem   *q_dbell;
572	/* Control path */
573	struct bna_rxq *rxq;
574	struct bna_ccb *ccb;
575	struct bnad *bnad;
576	void			*priv; /* BNAD's cookie */
577	unsigned long		flags;
578	int			id;
579};
580
581/* RxQ structure - QPT, configuration */
582struct bna_rxq {
583	struct list_head			qe;
584
585	int			buffer_size;
586	int			q_depth;
587	u32			num_vecs;
588	enum bna_status		multi_buffer;
589
590	struct bna_qpt qpt;
591	struct bna_rcb *rcb;
592
593	struct bna_rxp *rxp;
594	struct bna_rx *rx;
595
596	int			hw_id;
597
598	u64		rx_packets;
599	u64		rx_bytes;
600	u64		rx_packets_with_error;
601	u64		rxbuf_alloc_failed;
602};
603
604/* RxQ pair */
605union bna_rxq_u {
606	struct {
607		struct bna_rxq *hdr;
608		struct bna_rxq *data;
609	} hds;
610	struct {
611		struct bna_rxq *small;
612		struct bna_rxq *large;
613	} slr;
614	struct {
615		struct bna_rxq *only;
616		struct bna_rxq *reserved;
617	} single;
618};
619
620/* Packet rate for Dynamic Interrupt Moderation */
621struct bna_pkt_rate {
622	u32		small_pkt_cnt;
623	u32		large_pkt_cnt;
624};
625
626/* Completion control structure */
627struct bna_ccb {
628	/* Fast path */
629	void			**sw_qpt;
630	void			*sw_q;
631	u32		producer_index;
632	volatile u32	*hw_producer_index;
633	u32		q_depth;
634	struct bna_ib_dbell *i_dbell;
635	struct bna_rcb *rcb[2];
636	void			*ctrl; /* For bnad */
637	struct bna_pkt_rate pkt_rate;
638	u32			pkts_una;
639	u32			bytes_per_intr;
640
641	/* Control path */
642	struct bna_cq *cq;
643	struct bnad *bnad;
644	void			*priv; /* BNAD's cookie */
645	enum bna_intr_type intr_type;
646	int			intr_vector;
647	u8			rx_coalescing_timeo; /* For NAPI */
648	int			id;
649	char			name[BNA_Q_NAME_SIZE];
650};
651
652/* CQ QPT, configuration  */
653struct bna_cq {
654	struct bna_qpt qpt;
655	struct bna_ccb *ccb;
656
657	struct bna_ib ib;
658
659	struct bna_rx *rx;
660};
661
662struct bna_rss_config {
663	enum bfi_enet_rss_type	hash_type;
664	u8			hash_mask;
665	u32		toeplitz_hash_key[BFI_ENET_RSS_KEY_LEN];
666};
667
668struct bna_hds_config {
669	enum bfi_enet_hds_type	hdr_type;
670	int			forced_offset;
671};
672
673/* Rx object configuration used during creation */
674struct bna_rx_config {
675	enum bna_rx_type rx_type;
676	int			num_paths;
677	enum bna_rxp_type rxp_type;
678	int			paused;
679	int			coalescing_timeo;
680	/*
681	 * Small/Large (or Header/Data) buffer size to be configured
682	 * for SLR and HDS queue type.
683	 */
684	u32			frame_size;
685
686	/* header or small queue */
687	u32			q1_depth;
688	u32			q1_buf_size;
689
690	/* data or large queue */
691	u32			q0_depth;
692	u32			q0_buf_size;
693	u32			q0_num_vecs;
694	enum bna_status		q0_multi_buf;
695
696	enum bna_status rss_status;
697	struct bna_rss_config rss_config;
698
699	struct bna_hds_config hds_config;
700
701	enum bna_status vlan_strip_status;
702};
703
704/* Rx Path structure - one per MSIX vector/CPU */
705struct bna_rxp {
706	/* This should be the first one */
707	struct list_head			qe;
708
709	enum bna_rxp_type type;
710	union	bna_rxq_u	rxq;
711	struct bna_cq cq;
712
713	struct bna_rx *rx;
714
715	/* MSI-x vector number for configuring RSS */
716	int			vector;
717	int			hw_id;
718};
719
720/* RxF structure (hardware Rx Function) */
721struct bna_rxf {
722	bfa_fsm_t		fsm;
723	enum bna_rxf_flags flags;
724
725	struct bfa_msgq_cmd_entry msgq_cmd;
726	union {
727		struct bfi_enet_enable_req req;
728		struct bfi_enet_rss_cfg_req rss_req;
729		struct bfi_enet_rit_req rit_req;
730		struct bfi_enet_rx_vlan_req vlan_req;
731		struct bfi_enet_mcast_add_req mcast_add_req;
732		struct bfi_enet_mcast_del_req mcast_del_req;
733		struct bfi_enet_ucast_req ucast_req;
734	} bfi_enet_cmd;
735
736	/* callback for bna_rxf_start() */
737	void (*start_cbfn) (struct bna_rx *rx);
738	struct bna_rx *start_cbarg;
739
740	/* callback for bna_rxf_stop() */
741	void (*stop_cbfn) (struct bna_rx *rx);
742	struct bna_rx *stop_cbarg;
743
744	/* callback for bna_rx_receive_pause() / bna_rx_receive_resume() */
745	void (*oper_state_cbfn) (struct bnad *bnad, struct bna_rx *rx);
746	struct bnad *oper_state_cbarg;
747
748	/**
749	 * callback for:
750	 *	bna_rxf_ucast_set()
751	 *	bna_rxf_{ucast/mcast}_add(),
752	 *	bna_rxf_{ucast/mcast}_del(),
753	 *	bna_rxf_mode_set()
754	 */
755	void (*cam_fltr_cbfn)(struct bnad *bnad, struct bna_rx *rx);
756	struct bnad *cam_fltr_cbarg;
757
758	/* List of unicast addresses yet to be applied to h/w */
759	struct list_head			ucast_pending_add_q;
760	struct list_head			ucast_pending_del_q;
761	struct bna_mac *ucast_pending_mac;
762	int			ucast_pending_set;
763	/* ucast addresses applied to the h/w */
764	struct list_head			ucast_active_q;
765	struct bna_mac ucast_active_mac;
766	int			ucast_active_set;
767
768	/* List of multicast addresses yet to be applied to h/w */
769	struct list_head			mcast_pending_add_q;
770	struct list_head			mcast_pending_del_q;
771	/* multicast addresses applied to the h/w */
772	struct list_head			mcast_active_q;
773	struct list_head			mcast_handle_q;
774
775	/* Rx modes yet to be applied to h/w */
776	enum bna_rxmode rxmode_pending;
777	enum bna_rxmode rxmode_pending_bitmask;
778	/* Rx modes applied to h/w */
779	enum bna_rxmode rxmode_active;
780
781	u8			vlan_pending_bitmask;
782	enum bna_status vlan_filter_status;
783	u32	vlan_filter_table[(BFI_ENET_VLAN_ID_MAX) / 32];
784	bool			vlan_strip_pending;
785	enum bna_status		vlan_strip_status;
786
787	enum bna_rss_flags	rss_pending;
788	enum bna_status		rss_status;
789	struct bna_rss_config	rss_cfg;
790	u8			*rit;
791	int			rit_size;
792
793	struct bna_rx		*rx;
794};
795
796/* Rx object */
797struct bna_rx {
798	/* This should be the first one */
799	struct list_head			qe;
800	int			rid;
801	int			hw_id;
802
803	bfa_fsm_t		fsm;
804
805	enum bna_rx_type type;
806
807	int			num_paths;
808	struct list_head			rxp_q;
809
810	struct bna_hds_config	hds_cfg;
811
812	struct bna_rxf rxf;
813
814	enum bna_rx_flags rx_flags;
815
816	struct bfa_msgq_cmd_entry msgq_cmd;
817	union {
818		struct bfi_enet_rx_cfg_req	cfg_req;
819		struct bfi_enet_req		req;
820		struct bfi_enet_rx_cfg_rsp	cfg_rsp;
821	} bfi_enet_cmd;
822
823	/* Rx event handlers */
824	void (*rcb_setup_cbfn)(struct bnad *, struct bna_rcb *);
825	void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *);
826	void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
827	void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
828	void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *);
829	void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
830	void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
831
832	/* callback for bna_rx_disable(), bna_rx_stop() */
833	void (*stop_cbfn)(void *arg, struct bna_rx *rx);
834	void			*stop_cbarg;
835
836	struct bna *bna;
837	void			*priv; /* bnad's cookie */
838};
839
840struct bna_rx_event_cbfn {
841	/* Optional */
842	void (*rcb_setup_cbfn)(struct bnad *, struct bna_rcb *);
843	void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *);
844	void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
845	void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
846	void (*rx_stall_cbfn)(struct bnad *, struct bna_rx *);
847	/* Mandatory */
848	void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
849	void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
850};
851
852/* Rx module - keeps track of free, active rx objects */
853struct bna_rx_mod {
854	struct bna *bna;		/* back pointer to parent */
855	struct bna_rx *rx;		/* BFI_MAX_RXQ entries */
856	struct bna_rxp *rxp;		/* BFI_MAX_RXQ entries */
857	struct bna_rxq *rxq;		/* BFI_MAX_RXQ entries */
858
859	struct list_head			rx_free_q;
860	struct list_head			rx_active_q;
861	int			rx_free_count;
862
863	struct list_head			rxp_free_q;
864	int			rxp_free_count;
865
866	struct list_head			rxq_free_q;
867	int			rxq_free_count;
868
869	enum bna_rx_mod_flags flags;
870
871	/* callback for bna_rx_mod_stop() */
872	void (*stop_cbfn)(struct bna_enet *enet);
873
874	struct bfa_wc		rx_stop_wc;
875	u32		dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX];
876	u32		rid_mask;
877};
878
879/* CAM */
880
881struct bna_ucam_mod {
882	struct bna_mac *ucmac;		/* num_ucmac * 2 entries */
883	struct list_head			free_q;
884	struct list_head			del_q;
885
886	struct bna *bna;
887};
888
889struct bna_mcam_handle {
890	/* This should be the first one */
891	struct list_head			qe;
892	int			handle;
893	int			refcnt;
894};
895
896struct bna_mcam_mod {
897	struct bna_mac *mcmac;		/* num_mcmac * 2 entries */
898	struct bna_mcam_handle *mchandle;	/* num_mcmac entries */
899	struct list_head			free_q;
900	struct list_head			del_q;
901	struct list_head			free_handle_q;
902
903	struct bna *bna;
904};
905
906/* Statistics */
907
908struct bna_stats {
909	struct bna_dma_addr	hw_stats_dma;
910	struct bfi_enet_stats	*hw_stats_kva;
911	struct bfi_enet_stats	hw_stats;
912};
913
914struct bna_stats_mod {
915	bool		ioc_ready;
916	bool		stats_get_busy;
917	bool		stats_clr_busy;
918	struct bfa_msgq_cmd_entry stats_get_cmd;
919	struct bfa_msgq_cmd_entry stats_clr_cmd;
920	struct bfi_enet_stats_req stats_get;
921	struct bfi_enet_stats_req stats_clr;
922};
923
924/* BNA */
925
926struct bna {
927	struct bna_ident ident;
928	struct bfa_pcidev pcidev;
929
930	struct bna_reg regs;
931	struct bna_bit_defn bits;
932
933	struct bna_stats stats;
934
935	struct bna_ioceth ioceth;
936	struct bfa_cee cee;
937	struct bfa_flash flash;
938	struct bfa_msgq msgq;
939
940	struct bna_ethport ethport;
941	struct bna_enet enet;
942	struct bna_stats_mod stats_mod;
943
944	struct bna_tx_mod tx_mod;
945	struct bna_rx_mod rx_mod;
946	struct bna_ucam_mod ucam_mod;
947	struct bna_mcam_mod mcam_mod;
948
949	enum bna_mod_flags mod_flags;
950
951	int			default_mode_rid;
952	int			promisc_rid;
953
954	struct bnad *bnad;
955};
956#endif	/* __BNA_TYPES_H__ */
957