bna: ENET and Tx Rx Redesign Enablement
[firefly-linux-kernel-4.4.55.git] / drivers / net / ethernet / brocade / bna / bna_types.h
index 2f89cb235248b234e34853c0efb6de588e11c730..655eb140bf944c5cfc47b690c5d891919def83f9 100644 (file)
 #define __BNA_TYPES_H__
 
 #include "cna.h"
-#include "bna_hw.h"
+#include "bna_hw_defs.h"
 #include "bfa_cee.h"
+#include "bfi_enet.h"
+#include "bfa_msgq.h"
 
 /**
  *
@@ -28,6 +30,7 @@
  *
  */
 
+struct bna_mcam_handle;
 struct bna_txq;
 struct bna_tx;
 struct bna_rxq;
@@ -35,6 +38,7 @@ struct bna_cq;
 struct bna_rx;
 struct bna_rxf;
 struct bna_port;
+struct bna_enet;
 struct bna;
 struct bnad;
 
@@ -104,13 +108,26 @@ enum bna_res_req_type {
        BNA_RES_T_MAX
 };
 
+enum bna_mod_res_req_type {
+       BNA_MOD_RES_MEM_T_TX_ARRAY      = 0,
+       BNA_MOD_RES_MEM_T_TXQ_ARRAY     = 1,
+       BNA_MOD_RES_MEM_T_RX_ARRAY      = 2,
+       BNA_MOD_RES_MEM_T_RXP_ARRAY     = 3,
+       BNA_MOD_RES_MEM_T_RXQ_ARRAY     = 4,
+       BNA_MOD_RES_MEM_T_UCMAC_ARRAY   = 5,
+       BNA_MOD_RES_MEM_T_MCMAC_ARRAY   = 6,
+       BNA_MOD_RES_MEM_T_MCHANDLE_ARRAY = 7,
+       BNA_MOD_RES_T_MAX
+};
+
 enum bna_tx_res_req_type {
        BNA_TX_RES_MEM_T_TCB    = 0,
        BNA_TX_RES_MEM_T_UNMAPQ = 1,
        BNA_TX_RES_MEM_T_QPT    = 2,
        BNA_TX_RES_MEM_T_SWQPT  = 3,
        BNA_TX_RES_MEM_T_PAGE   = 4,
-       BNA_TX_RES_INTR_T_TXCMPL = 5,
+       BNA_TX_RES_MEM_T_IBIDX  = 5,
+       BNA_TX_RES_INTR_T_TXCMPL = 6,
        BNA_TX_RES_T_MAX,
 };
 
@@ -127,8 +144,10 @@ enum bna_rx_mem_type {
        BNA_RX_RES_MEM_T_DSWQPT         = 9,    /* RX s/w QPT */
        BNA_RX_RES_MEM_T_DPAGE          = 10,   /* RX s/w QPT */
        BNA_RX_RES_MEM_T_HPAGE          = 11,   /* RX s/w QPT */
-       BNA_RX_RES_T_INTR               = 12,   /* Rx interrupts */
-       BNA_RX_RES_T_MAX                = 13
+       BNA_RX_RES_MEM_T_IBIDX          = 12,
+       BNA_RX_RES_MEM_T_RIT            = 13,
+       BNA_RX_RES_T_INTR               = 14,   /* Rx interrupts */
+       BNA_RX_RES_T_MAX                = 15
 };
 
 enum bna_mbox_state {
@@ -142,14 +161,15 @@ enum bna_tx_type {
 };
 
 enum bna_tx_flags {
-       BNA_TX_F_PORT_STARTED   = 1,
+       BNA_TX_F_ENET_STARTED   = 1,
        BNA_TX_F_ENABLED        = 2,
-       BNA_TX_F_PRIO_LOCK      = 4,
+       BNA_TX_F_PRIO_CHANGED   = 4,
+       BNA_TX_F_BW_UPDATED     = 8,
 };
 
 enum bna_tx_mod_flags {
-       BNA_TX_MOD_F_PORT_STARTED       = 1,
-       BNA_TX_MOD_F_PORT_LOOPBACK      = 2,
+       BNA_TX_MOD_F_ENET_STARTED       = 1,
+       BNA_TX_MOD_F_ENET_LOOPBACK      = 2,
 };
 
 enum bna_rx_type {
@@ -165,16 +185,19 @@ enum bna_rxp_type {
 
 enum bna_rxmode {
        BNA_RXMODE_PROMISC      = 1,
-       BNA_RXMODE_ALLMULTI     = 2
+       BNA_RXMODE_DEFAULT      = 2,
+       BNA_RXMODE_ALLMULTI     = 4
 };
 
 enum bna_rx_event {
        RX_E_START                      = 1,
        RX_E_STOP                       = 2,
        RX_E_FAIL                       = 3,
-       RX_E_RXF_STARTED                = 4,
-       RX_E_RXF_STOPPED                = 5,
-       RX_E_RXQ_STOPPED                = 6,
+       RX_E_STARTED                    = 4,
+       RX_E_STOPPED                    = 5,
+       RX_E_RXF_STARTED                = 6,
+       RX_E_RXF_STOPPED                = 7,
+       RX_E_CLEANUP_DONE               = 8,
 };
 
 enum bna_rx_state {
@@ -186,14 +209,13 @@ enum bna_rx_state {
 };
 
 enum bna_rx_flags {
-       BNA_RX_F_ENABLE         = 0x01,         /* bnad enabled rxf */
-       BNA_RX_F_PORT_ENABLED   = 0x02,         /* Port object is enabled */
-       BNA_RX_F_PORT_FAILED    = 0x04,         /* Port in failed state */
+       BNA_RX_F_ENET_STARTED   = 1,
+       BNA_RX_F_ENABLED        = 2,
 };
 
 enum bna_rx_mod_flags {
-       BNA_RX_MOD_F_PORT_STARTED       = 1,
-       BNA_RX_MOD_F_PORT_LOOPBACK      = 2,
+       BNA_RX_MOD_F_ENET_STARTED       = 1,
+       BNA_RX_MOD_F_ENET_LOOPBACK      = 2,
 };
 
 enum bna_rxf_oper_state {
@@ -202,25 +224,17 @@ enum bna_rxf_oper_state {
 };
 
 enum bna_rxf_flags {
-       BNA_RXF_FL_STOP_PENDING         = 0x01,
-       BNA_RXF_FL_FAILED               = 0x02,
-       BNA_RXF_FL_RSS_CONFIG_PENDING   = 0x04,
-       BNA_RXF_FL_OPERSTATE_CHANGED    = 0x08,
-       BNA_RXF_FL_RXF_ENABLED          = 0x10,
-       BNA_RXF_FL_VLAN_CONFIG_PENDING  = 0x20,
+       BNA_RXF_F_PAUSED                = 1,
 };
 
 enum bna_rxf_event {
        RXF_E_START                     = 1,
        RXF_E_STOP                      = 2,
        RXF_E_FAIL                      = 3,
-       RXF_E_CAM_FLTR_MOD              = 4,
-       RXF_E_STARTED                   = 5,
-       RXF_E_STOPPED                   = 6,
-       RXF_E_CAM_FLTR_RESP             = 7,
-       RXF_E_PAUSE                     = 8,
-       RXF_E_RESUME                    = 9,
-       RXF_E_STAT_CLEARED              = 10,
+       RXF_E_CONFIG                    = 4,
+       RXF_E_PAUSE                     = 5,
+       RXF_E_RESUME                    = 6,
+       RXF_E_FW_RESP                   = 7,
 };
 
 enum bna_rxf_state {
@@ -241,6 +255,12 @@ enum bna_port_type {
        BNA_PORT_T_LOOPBACK_EXTERNAL    = 2,
 };
 
+enum bna_enet_type {
+       BNA_ENET_T_REGULAR              = 0,
+       BNA_ENET_T_LOOPBACK_INTERNAL    = 1,
+       BNA_ENET_T_LOOPBACK_EXTERNAL    = 2,
+};
+
 enum bna_link_status {
        BNA_LINK_DOWN           = 0,
        BNA_LINK_UP             = 1,
@@ -253,6 +273,12 @@ enum bna_llport_flags {
        BNA_LLPORT_F_RX_STARTED         = 4
 };
 
+enum bna_ethport_flags {
+       BNA_ETHPORT_F_ADMIN_UP          = 1,
+       BNA_ETHPORT_F_PORT_ENABLED      = 2,
+       BNA_ETHPORT_F_RX_STARTED        = 4,
+};
+
 enum bna_port_flags {
        BNA_PORT_F_DEVICE_READY = 1,
        BNA_PORT_F_ENABLED      = 2,
@@ -260,6 +286,23 @@ enum bna_port_flags {
        BNA_PORT_F_MTU_CHANGED  = 8
 };
 
+enum bna_enet_flags {
+       BNA_ENET_F_IOCETH_READY         = 1,
+       BNA_ENET_F_ENABLED              = 2,
+       BNA_ENET_F_PAUSE_CHANGED        = 4,
+       BNA_ENET_F_MTU_CHANGED          = 8
+};
+
+enum bna_rss_flags {
+       BNA_RSS_F_RIT_PENDING           = 1,
+       BNA_RSS_F_CFG_PENDING           = 2,
+       BNA_RSS_F_STATUS_PENDING        = 4,
+};
+
+enum bna_mod_flags {
+       BNA_MOD_F_INIT_DONE             = 1,
+};
+
 enum bna_pkt_rates {
        BNA_PKT_RATE_10K                = 10000,
        BNA_PKT_RATE_20K                = 20000,
@@ -289,10 +332,17 @@ enum bna_dim_bias_types {
        BNA_BIAS_T_MAX                  = 2
 };
 
+#define BNA_MAX_NAME_SIZE      64
+struct bna_ident {
+       int                     id;
+       char                    name[BNA_MAX_NAME_SIZE];
+};
+
 struct bna_mac {
        /* This should be the first one */
        struct list_head                        qe;
        u8                      addr[ETH_ALEN];
+       struct bna_mcam_handle *handle;
 };
 
 struct bna_mem_descr {
@@ -338,23 +388,29 @@ struct bna_qpt {
        u32             page_size;
 };
 
+struct bna_attr {
+       int                     num_txq;
+       int                     num_rxp;
+       int                     num_ucmac;
+       int                     num_mcmac;
+       int                     max_rit_size;
+};
+
 /**
  *
- * Device
+ * IOCEth
  *
  */
 
-struct bna_device {
+struct bna_ioceth {
        bfa_fsm_t               fsm;
        struct bfa_ioc ioc;
 
-       enum bna_intr_type intr_type;
-       int                     vector;
+       struct bna_attr attr;
+       struct bfa_msgq_cmd_entry msgq_cmd;
+       struct bfi_enet_attr_req attr_req;
 
-       void (*ready_cbfn)(struct bnad *bnad, enum bna_cb_status status);
-       struct bnad *ready_cbarg;
-
-       void (*stop_cbfn)(struct bnad *bnad, enum bna_cb_status status);
+       void (*stop_cbfn)(struct bnad *bnad);
        struct bnad *stop_cbarg;
 
        struct bna *bna;
@@ -445,6 +501,68 @@ struct bna_port {
        struct bna *bna;
 };
 
+/**
+ *
+ * Enet
+ *
+ */
+
+struct bna_enet {
+       bfa_fsm_t               fsm;
+       enum bna_enet_flags flags;
+
+       enum bna_enet_type type;
+
+       struct bna_pause_config pause_config;
+       int                     mtu;
+
+       /* Callback for bna_enet_disable(), enet_stop() */
+       void (*stop_cbfn)(void *);
+       void                    *stop_cbarg;
+
+       /* Callback for bna_enet_pause_config() */
+       void (*pause_cbfn)(struct bnad *);
+
+       /* Callback for bna_enet_mtu_set() */
+       void (*mtu_cbfn)(struct bnad *);
+
+       struct bfa_wc           chld_stop_wc;
+
+       struct bfa_msgq_cmd_entry msgq_cmd;
+       struct bfi_enet_set_pause_req pause_req;
+
+       struct bna *bna;
+};
+
+/**
+ *
+ * Ethport
+ *
+ */
+
+struct bna_ethport {
+       bfa_fsm_t               fsm;
+       enum bna_ethport_flags flags;
+
+       enum bna_link_status link_status;
+
+       int                     rx_started_count;
+
+       void (*stop_cbfn)(struct bna_enet *);
+
+       void (*adminup_cbfn)(struct bnad *, enum bna_cb_status);
+
+       void (*link_cbfn)(struct bnad *, enum bna_link_status);
+
+       struct bfa_msgq_cmd_entry msgq_cmd;
+       union {
+               struct bfi_enet_enable_req admin_req;
+               struct bfi_enet_diag_lb_req lpbk_req;
+       } bfi_enet_cmd;
+
+       struct bna *bna;
+};
+
 /**
  *
  * Interrupt Block
@@ -478,55 +596,20 @@ struct bna_ib_dbell {
        u32             doorbell_ack;
 };
 
-/* Interrupt timer configuration */
-struct bna_ib_config {
-       u8              coalescing_timeo;    /* Unit is 5usec. */
-
-       int                     interpkt_count;
-       int                     interpkt_timeo;
-
-       enum ib_flags ctrl_flags;
-};
-
 /* IB structure */
 struct bna_ib {
-       /* This should be the first one */
-       struct list_head                        qe;
-
-       int                     ib_id;
-
-       int                     ref_count;
-       int                     start_count;
-
        struct bna_dma_addr ib_seg_host_addr;
        void            *ib_seg_host_addr_kva;
-       u32             idx_mask; /* Size >= BNA_IBIDX_MAX_SEGSIZE */
-
-       struct bna_ibidx_seg *idx_seg;
 
        struct bna_ib_dbell door_bell;
 
-       struct bna_intr *intr;
-
-       struct bna_ib_config ib_config;
-
-       struct bna *bna;
-};
-
-/* IB module - keeps track of IBs and interrupts */
-struct bna_ib_mod {
-       struct bna_ib *ib;              /* BFI_MAX_IB entries */
-       struct bna_intr *intr;          /* BFI_MAX_IB entries */
-       struct bna_ibidx_seg *idx_seg;  /* BNA_IBIDX_TOTAL_SEGS */
-
-       struct list_head                        ib_free_q;
-
-       struct list_head                ibidx_seg_pool[BFI_IBIDX_TOTAL_POOLS];
+       enum bna_intr_type      intr_type;
+       int                     intr_vector;
 
-       struct list_head                        intr_free_q;
-       struct list_head                        intr_active_q;
+       u8                      coalescing_timeo;    /* Unit is 5usec. */
 
-       struct bna *bna;
+       int                     interpkt_count;
+       int                     interpkt_timeo;
 };
 
 /**
@@ -552,6 +635,7 @@ struct bna_tcb {
        /* Control path */
        struct bna_txq *txq;
        struct bnad *bnad;
+       void                    *priv; /* BNAD's cookie */
        enum bna_intr_type intr_type;
        int                     intr_vector;
        u8                      priority; /* Current priority */
@@ -565,68 +649,66 @@ struct bna_txq {
        /* This should be the first one */
        struct list_head                        qe;
 
-       int                     txq_id;
-
        u8                      priority;
 
        struct bna_qpt qpt;
        struct bna_tcb *tcb;
-       struct bna_ib *ib;
-       int                     ib_seg_offset;
+       struct bna_ib ib;
 
        struct bna_tx *tx;
 
+       int                     hw_id;
+
        u64             tx_packets;
        u64             tx_bytes;
 };
 
-/* TxF structure (hardware Tx Function) */
-struct bna_txf {
-       int                     txf_id;
-       enum txf_flags ctrl_flags;
-       u16             vlan;
-};
-
 /* Tx object */
 struct bna_tx {
        /* This should be the first one */
        struct list_head                        qe;
+       int                     rid;
+       int                     hw_id;
 
        bfa_fsm_t               fsm;
        enum bna_tx_flags flags;
 
        enum bna_tx_type type;
+       int                     num_txq;
 
        struct list_head                        txq_q;
-       struct bna_txf txf;
+       u16                     txf_vlan_id;
 
        /* Tx event handlers */
        void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
        void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
-       void (*tx_stall_cbfn)(struct bnad *, struct bna_tcb *);
-       void (*tx_resume_cbfn)(struct bnad *, struct bna_tcb *);
-       void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tcb *);
+       void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
+       void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
+       void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
 
        /* callback for bna_tx_disable(), bna_tx_stop() */
-       void (*stop_cbfn)(void *arg, struct bna_tx *tx,
-                               enum bna_cb_status status);
+       void (*stop_cbfn)(void *arg, struct bna_tx *tx);
        void                    *stop_cbarg;
 
        /* callback for bna_tx_prio_set() */
-       void (*prio_change_cbfn)(struct bnad *bnad, struct bna_tx *tx,
-                               enum bna_cb_status status);
+       void (*prio_change_cbfn)(struct bnad *bnad, struct bna_tx *tx);
 
-       struct bfa_wc           txq_stop_wc;
-
-       struct bna_mbox_qe mbox_qe;
+       struct bfa_msgq_cmd_entry msgq_cmd;
+       union {
+               struct bfi_enet_tx_cfg_req      cfg_req;
+               struct bfi_enet_req             req;
+               struct bfi_enet_tx_cfg_rsp      cfg_rsp;
+       } bfi_enet_cmd;
 
        struct bna *bna;
        void                    *priv;  /* bnad's cookie */
 };
 
+/* Tx object configuration used during creation */
 struct bna_tx_config {
        int                     num_txq;
        int                     txq_depth;
+       int                     coalescing_timeo;
        enum bna_tx_type tx_type;
 };
 
@@ -635,9 +717,9 @@ struct bna_tx_event_cbfn {
        void (*tcb_setup_cbfn)(struct bnad *, struct bna_tcb *);
        void (*tcb_destroy_cbfn)(struct bnad *, struct bna_tcb *);
        /* Mandatory */
-       void (*tx_stall_cbfn)(struct bnad *, struct bna_tcb *);
-       void (*tx_resume_cbfn)(struct bnad *, struct bna_tcb *);
-       void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tcb *);
+       void (*tx_stall_cbfn)(struct bnad *, struct bna_tx *);
+       void (*tx_resume_cbfn)(struct bnad *, struct bna_tx *);
+       void (*tx_cleanup_cbfn)(struct bnad *, struct bna_tx *);
 };
 
 /* Tx module - keeps track of free, active tx objects */
@@ -651,17 +733,19 @@ struct bna_tx_mod {
        struct list_head                        txq_free_q;
 
        /* callback for bna_tx_mod_stop() */
-       void (*stop_cbfn)(struct bna_port *port,
-                               enum bna_cb_status status);
+       void (*stop_cbfn)(struct bna_enet *enet);
 
        struct bfa_wc           tx_stop_wc;
 
        enum bna_tx_mod_flags flags;
 
-       int                     priority;
-       int                     cee_link;
+       u8                      prio_map;
+       int                     default_prio;
+       int                     iscsi_over_cee;
+       int                     iscsi_prio;
+       int                     prio_reconfigured;
 
-       u32             txf_bmap[2];
+       u32                     rid_mask;
 
        struct bna *bna;
 };
@@ -693,13 +777,6 @@ struct bna_rit_segment {
        struct bna_rit_entry *rit;
 };
 
-struct bna_rit_mod {
-       struct bna_rit_entry *rit;
-       struct bna_rit_segment *rit_segment;
-
-       struct list_head                rit_seg_pool[BFI_RIT_SEG_TOTAL_POOLS];
-};
-
 /**
  *
  * Rx object
@@ -719,8 +796,9 @@ struct bna_rcb {
        int                     page_count;
        /* Control path */
        struct bna_rxq *rxq;
-       struct bna_cq *cq;
+       struct bna_ccb *ccb;
        struct bnad *bnad;
+       void                    *priv; /* BNAD's cookie */
        unsigned long           flags;
        int                     id;
 };
@@ -728,7 +806,6 @@ struct bna_rcb {
 /* RxQ structure - QPT, configuration */
 struct bna_rxq {
        struct list_head                        qe;
-       int                     rxq_id;
 
        int                     buffer_size;
        int                     q_depth;
@@ -739,6 +816,8 @@ struct bna_rxq {
        struct bna_rxp *rxp;
        struct bna_rx *rx;
 
+       int                     hw_id;
+
        u64             rx_packets;
        u64             rx_bytes;
        u64             rx_packets_with_error;
@@ -784,6 +863,7 @@ struct bna_ccb {
        /* Control path */
        struct bna_cq *cq;
        struct bnad *bnad;
+       void                    *priv; /* BNAD's cookie */
        enum bna_intr_type intr_type;
        int                     intr_vector;
        u8                      rx_coalescing_timeo; /* For NAPI */
@@ -793,46 +873,43 @@ struct bna_ccb {
 
 /* CQ QPT, configuration  */
 struct bna_cq {
-       int                     cq_id;
-
        struct bna_qpt qpt;
        struct bna_ccb *ccb;
 
-       struct bna_ib *ib;
-       u8                      ib_seg_offset;
+       struct bna_ib ib;
 
        struct bna_rx *rx;
 };
 
 struct bna_rss_config {
-       enum rss_hash_type hash_type;
+       enum bfi_enet_rss_type  hash_type;
        u8                      hash_mask;
-       u32             toeplitz_hash_key[BFI_RSS_HASH_KEY_LEN];
+       u32             toeplitz_hash_key[BFI_ENET_RSS_KEY_LEN];
 };
 
 struct bna_hds_config {
-       enum hds_header_type hdr_type;
-       int                     header_size;
+       enum bfi_enet_hds_type  hdr_type;
+       int                     forced_offset;
 };
 
-/* This structure is used during RX creation */
+/* Rx object configuration used during creation */
 struct bna_rx_config {
        enum bna_rx_type rx_type;
        int                     num_paths;
        enum bna_rxp_type rxp_type;
        int                     paused;
        int                     q_depth;
+       int                     coalescing_timeo;
        /*
         * Small/Large (or Header/Data) buffer size to be configured
         * for SLR and HDS queue type. Large buffer size comes from
-        * port->mtu.
+        * enet->mtu.
         */
        int                     small_buff_size;
 
        enum bna_status rss_status;
        struct bna_rss_config rss_config;
 
-       enum bna_status hds_status;
        struct bna_hds_config hds_config;
 
        enum bna_status vlan_strip_status;
@@ -851,51 +928,35 @@ struct bna_rxp {
 
        /* MSI-x vector number for configuring RSS */
        int                     vector;
-
-       struct bna_mbox_qe mbox_qe;
-};
-
-/* HDS configuration structure */
-struct bna_rxf_hds {
-       enum hds_header_type hdr_type;
-       int                     header_size;
-};
-
-/* RSS configuration structure */
-struct bna_rxf_rss {
-       enum rss_hash_type hash_type;
-       u8                      hash_mask;
-       u32             toeplitz_hash_key[BFI_RSS_HASH_KEY_LEN];
+       int                     hw_id;
 };
 
 /* RxF structure (hardware Rx Function) */
 struct bna_rxf {
        bfa_fsm_t               fsm;
-       int                     rxf_id;
-       enum rxf_flags ctrl_flags;
-       u16             default_vlan_tag;
-       enum bna_rxf_oper_state rxf_oper_state;
-       enum bna_status hds_status;
-       struct bna_rxf_hds hds_cfg;
-       enum bna_status rss_status;
-       struct bna_rxf_rss rss_cfg;
-       struct bna_rit_segment *rit_segment;
-       struct bna_rx *rx;
-       u32             forced_offset;
-       struct bna_mbox_qe mbox_qe;
-       int                     mcast_rxq_id;
+       enum bna_rxf_flags flags;
+
+       struct bfa_msgq_cmd_entry msgq_cmd;
+       union {
+               struct bfi_enet_enable_req req;
+               struct bfi_enet_rss_cfg_req rss_req;
+               struct bfi_enet_rit_req rit_req;
+               struct bfi_enet_rx_vlan_req vlan_req;
+               struct bfi_enet_mcast_add_req mcast_add_req;
+               struct bfi_enet_mcast_del_req mcast_del_req;
+               struct bfi_enet_ucast_req ucast_req;
+       } bfi_enet_cmd;
 
        /* callback for bna_rxf_start() */
-       void (*start_cbfn) (struct bna_rx *rx, enum bna_cb_status status);
+       void (*start_cbfn) (struct bna_rx *rx);
        struct bna_rx *start_cbarg;
 
        /* callback for bna_rxf_stop() */
-       void (*stop_cbfn) (struct bna_rx *rx, enum bna_cb_status status);
+       void (*stop_cbfn) (struct bna_rx *rx);
        struct bna_rx *stop_cbarg;
 
-       /* callback for bna_rxf_receive_enable() / bna_rxf_receive_disable() */
-       void (*oper_state_cbfn) (struct bnad *bnad, struct bna_rx *rx,
-                       enum bna_cb_status status);
+       /* callback for bna_rx_receive_pause() / bna_rx_receive_resume() */
+       void (*oper_state_cbfn) (struct bnad *bnad, struct bna_rx *rx);
        struct bnad *oper_state_cbarg;
 
        /**
@@ -905,25 +966,25 @@ struct bna_rxf {
         *      bna_rxf_{ucast/mcast}_del(),
         *      bna_rxf_mode_set()
         */
-       void (*cam_fltr_cbfn)(struct bnad *bnad, struct bna_rx *rx,
-                               enum bna_cb_status status);
+       void (*cam_fltr_cbfn)(struct bnad *bnad, struct bna_rx *rx);
        struct bnad *cam_fltr_cbarg;
 
-       enum bna_rxf_flags rxf_flags;
-
        /* List of unicast addresses yet to be applied to h/w */
        struct list_head                        ucast_pending_add_q;
        struct list_head                        ucast_pending_del_q;
+       struct bna_mac *ucast_pending_mac;
        int                     ucast_pending_set;
        /* ucast addresses applied to the h/w */
        struct list_head                        ucast_active_q;
-       struct bna_mac *ucast_active_mac;
+       struct bna_mac ucast_active_mac;
+       int                     ucast_active_set;
 
        /* List of multicast addresses yet to be applied to h/w */
        struct list_head                        mcast_pending_add_q;
        struct list_head                        mcast_pending_del_q;
        /* multicast addresses applied to the h/w */
        struct list_head                        mcast_active_q;
+       struct list_head                        mcast_handle_q;
 
        /* Rx modes yet to be applied to h/w */
        enum bna_rxmode rxmode_pending;
@@ -931,41 +992,58 @@ struct bna_rxf {
        /* Rx modes applied to h/w */
        enum bna_rxmode rxmode_active;
 
+       u8                      vlan_pending_bitmask;
        enum bna_status vlan_filter_status;
-       u32             vlan_filter_table[(BFI_MAX_VLAN + 1) / 32];
+       u32     vlan_filter_table[(BFI_ENET_VLAN_ID_MAX) / 32];
+       bool                    vlan_strip_pending;
+       enum bna_status         vlan_strip_status;
+
+       enum bna_rss_flags      rss_pending;
+       enum bna_status         rss_status;
+       struct bna_rss_config   rss_cfg;
+       u8                      *rit;
+       int                     rit_size;
+
+       struct bna_rx           *rx;
 };
 
 /* Rx object */
 struct bna_rx {
        /* This should be the first one */
        struct list_head                        qe;
+       int                     rid;
+       int                     hw_id;
 
        bfa_fsm_t               fsm;
 
        enum bna_rx_type type;
 
-       /* list-head for RX path objects */
+       int                     num_paths;
        struct list_head                        rxp_q;
 
+       struct bna_hds_config   hds_cfg;
+
        struct bna_rxf rxf;
 
        enum bna_rx_flags rx_flags;
 
-       struct bna_mbox_qe mbox_qe;
-
-       struct bfa_wc           rxq_stop_wc;
+       struct bfa_msgq_cmd_entry msgq_cmd;
+       union {
+               struct bfi_enet_rx_cfg_req      cfg_req;
+               struct bfi_enet_req             req;
+               struct bfi_enet_rx_cfg_rsp      cfg_rsp;
+       } bfi_enet_cmd;
 
        /* Rx event handlers */
        void (*rcb_setup_cbfn)(struct bnad *, struct bna_rcb *);
        void (*rcb_destroy_cbfn)(struct bnad *, struct bna_rcb *);
        void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
        void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
-       void (*rx_cleanup_cbfn)(struct bnad *, struct bna_ccb *);
-       void (*rx_post_cbfn)(struct bnad *, struct bna_rcb *);
+       void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
+       void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
 
        /* callback for bna_rx_disable(), bna_rx_stop() */
-       void (*stop_cbfn)(void *arg, struct bna_rx *rx,
-                               enum bna_cb_status status);
+       void (*stop_cbfn)(void *arg, struct bna_rx *rx);
        void                    *stop_cbarg;
 
        struct bna *bna;
@@ -979,8 +1057,8 @@ struct bna_rx_event_cbfn {
        void (*ccb_setup_cbfn)(struct bnad *, struct bna_ccb *);
        void (*ccb_destroy_cbfn)(struct bnad *, struct bna_ccb *);
        /* Mandatory */
-       void (*rx_cleanup_cbfn)(struct bnad *, struct bna_ccb *);
-       void (*rx_post_cbfn)(struct bnad *, struct bna_rcb *);
+       void (*rx_cleanup_cbfn)(struct bnad *, struct bna_rx *);
+       void (*rx_post_cbfn)(struct bnad *, struct bna_rx *);
 };
 
 /* Rx module - keeps track of free, active rx objects */
@@ -1003,12 +1081,11 @@ struct bna_rx_mod {
        enum bna_rx_mod_flags flags;
 
        /* callback for bna_rx_mod_stop() */
-       void (*stop_cbfn)(struct bna_port *port,
-                               enum bna_cb_status status);
+       void (*stop_cbfn)(struct bna_enet *enet);
 
        struct bfa_wc           rx_stop_wc;
        u32             dim_vector[BNA_LOAD_T_MAX][BNA_BIAS_T_MAX];
-       u32             rxf_bmap[2];
+       u32             rid_mask;
 };
 
 /**
@@ -1024,9 +1101,18 @@ struct bna_ucam_mod {
        struct bna *bna;
 };
 
+struct bna_mcam_handle {
+       /* This should be the first one */
+       struct list_head                        qe;
+       int                     handle;
+       int                     refcnt;
+};
+
 struct bna_mcam_mod {
        struct bna_mac *mcmac;          /* BFI_MAX_MCMAC entries */
+       struct bna_mcam_handle *mchandle;       /* BFI_MAX_MCMAC entries */
        struct list_head                        free_q;
+       struct list_head                        free_handle_q;
 
        struct bna *bna;
 };
@@ -1059,7 +1145,6 @@ struct bna_rx_stats {
        int                     num_active_mcast;
        int                     rxmode_active;
        int                     vlan_filter_status;
-       u32             vlan_filter_table[(BFI_MAX_VLAN + 1) / 32];
        int                     rss_status;
        int                     hds_status;
 };
@@ -1072,15 +1157,22 @@ struct bna_sw_stats {
        int                     priority;
        int                     num_active_tx;
        int                     num_active_rx;
-       struct bna_tx_stats tx_stats[BFI_MAX_TXQ];
-       struct bna_rx_stats rx_stats[BFI_MAX_RXQ];
 };
 
 struct bna_stats {
-       u32             txf_bmap[2];
-       u32             rxf_bmap[2];
-       struct bfi_ll_stats     *hw_stats;
-       struct bna_sw_stats *sw_stats;
+       struct bna_dma_addr     hw_stats_dma;
+       struct bfi_enet_stats   *hw_stats_kva;
+       struct bfi_enet_stats   hw_stats;
+};
+
+struct bna_stats_mod {
+       bool            ioc_ready;
+       bool            stats_get_busy;
+       bool            stats_clr_busy;
+       struct bfa_msgq_cmd_entry stats_get_cmd;
+       struct bfa_msgq_cmd_entry stats_clr_cmd;
+       struct bfi_enet_stats_req stats_get;
+       struct bfi_enet_stats_req stats_clr;
 };
 
 /**
@@ -1090,38 +1182,32 @@ struct bna_stats {
  */
 
 struct bna {
+       struct bna_ident ident;
        struct bfa_pcidev pcidev;
 
-       int                     port_num;
+       struct bna_reg regs;
+       struct bna_bit_defn bits;
 
-       struct bna_chip_regs regs;
-
-       struct bna_dma_addr hw_stats_dma;
        struct bna_stats stats;
 
-       struct bna_device device;
+       struct bna_ioceth ioceth;
        struct bfa_cee cee;
+       struct bfa_msgq msgq;
 
-       struct bna_mbox_mod mbox_mod;
-
-       struct bna_port port;
+       struct bna_ethport ethport;
+       struct bna_enet enet;
+       struct bna_stats_mod stats_mod;
 
        struct bna_tx_mod tx_mod;
-
        struct bna_rx_mod rx_mod;
-
-       struct bna_ib_mod ib_mod;
-
        struct bna_ucam_mod ucam_mod;
        struct bna_mcam_mod mcam_mod;
 
-       struct bna_rit_mod rit_mod;
-
-       int                     rxf_promisc_id;
+       enum bna_mod_flags mod_flags;
 
-       struct bna_mbox_qe mbox_qe;
+       int                     default_mode_rid;
+       int                     promisc_rid;
 
        struct bnad *bnad;
 };
-
 #endif /* __BNA_TYPES_H__ */