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