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