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