New upstream version 18.11-rc1
[deb_dpdk.git] / drivers / net / qede / base / ecore.h
index 907b35b..524a1dd 100644 (file)
@@ -1,9 +1,7 @@
-/*
- * Copyright (c) 2016 QLogic Corporation.
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright (c) 2016 - 2018 Cavium Inc.
  * All rights reserved.
- * www.qlogic.com
- *
- * See LICENSE.qede_pmd for copyright and licensing details.
+ * www.cavium.com
  */
 
 #ifndef __ECORE_H
@@ -21,6 +19,7 @@
 #include <zlib.h>
 #endif
 
+#include "ecore_status.h"
 #include "ecore_hsi_common.h"
 #include "ecore_hsi_debug_tools.h"
 #include "ecore_hsi_init_func.h"
 #include "ecore_proto_if.h"
 #include "mcp_public.h"
 
-#define MAX_HWFNS_PER_DEVICE   (4)
+#define ECORE_MAJOR_VERSION            8
+#define ECORE_MINOR_VERSION            37
+#define ECORE_REVISION_VERSION         20
+#define ECORE_ENGINEERING_VERSION      0
+
+#define ECORE_VERSION                                                  \
+       ((ECORE_MAJOR_VERSION << 24) | (ECORE_MINOR_VERSION << 16) |    \
+        (ECORE_REVISION_VERSION << 8) | ECORE_ENGINEERING_VERSION)
+
+#define STORM_FW_VERSION                                               \
+       ((FW_MAJOR_VERSION << 24) | (FW_MINOR_VERSION << 16) |  \
+        (FW_REVISION_VERSION << 8) | FW_ENGINEERING_VERSION)
+
+#define IS_ECORE_PACING(p_hwfn)        \
+       (!!(p_hwfn->b_en_pacing))
+
+#define MAX_HWFNS_PER_DEVICE   2
 #define NAME_SIZE 128 /* @DPDK */
-#define VER_SIZE 16
 #define ECORE_WFQ_UNIT 100
 #include "../qede_logs.h" /* @DPDK */
 
@@ -38,6 +52,7 @@
 #define FCOE_BDQ_ID(_port_id) (_port_id + 2)
 /* Constants */
 #define ECORE_WID_SIZE         (1024)
+#define ECORE_MIN_WIDS         (4)
 
 /* Configurable */
 #define ECORE_PF_DEMS_SIZE     (4)
@@ -54,6 +69,7 @@ enum ecore_nvm_cmd {
        ECORE_NVM_READ_NVRAM = DRV_MSG_CODE_NVM_READ_NVRAM,
        ECORE_NVM_WRITE_NVRAM = DRV_MSG_CODE_NVM_WRITE_NVRAM,
        ECORE_NVM_DEL_FILE = DRV_MSG_CODE_NVM_DEL_FILE,
+       ECORE_EXT_PHY_FW_UPGRADE = DRV_MSG_CODE_EXT_PHY_FW_UPGRADE,
        ECORE_NVM_SET_SECURE_MODE = DRV_MSG_CODE_SET_SECURE_MODE,
        ECORE_PHY_RAW_READ = DRV_MSG_CODE_PHY_RAW_READ,
        ECORE_PHY_RAW_WRITE = DRV_MSG_CODE_PHY_RAW_WRITE,
@@ -80,11 +96,20 @@ enum ecore_nvm_cmd {
 #define SET_FIELD(value, name, flag)                                   \
 do {                                                                   \
        (value) &= ~(name##_MASK << name##_SHIFT);                      \
-       (value) |= (((u64)flag) << (name##_SHIFT));                     \
+       (value) |= ((((u64)flag) & (u64)name##_MASK) << (name##_SHIFT));\
 } while (0)
 
 #define GET_FIELD(value, name)                                         \
        (((value) >> (name##_SHIFT)) & name##_MASK)
+
+#define GET_MFW_FIELD(name, field)                             \
+       (((name) & (field ## _MASK)) >> (field ## _OFFSET))
+
+#define SET_MFW_FIELD(name, field, value)                              \
+do {                                                                   \
+       (name) &= ~((field ## _MASK));          \
+       (name) |= (((value) << (field ## _OFFSET)) & (field ## _MASK)); \
+} while (0)
 #endif
 
 static OSAL_INLINE u32 DB_ADDR(u32 cid, u32 DEMS)
@@ -158,8 +183,8 @@ enum DP_MODULE {
        ECORE_MSG_CXT           = 0x800000,
        ECORE_MSG_LL2           = 0x1000000,
        ECORE_MSG_ILT           = 0x2000000,
-       ECORE_MSG_RDMA          = 0x4000000,
-       ECORE_MSG_DEBUG         = 0x8000000,
+       ECORE_MSG_RDMA          = 0x4000000,
+       ECORE_MSG_DEBUG         = 0x8000000,
        /* to be added...up to 0x8000000 */
 };
 #endif
@@ -179,9 +204,11 @@ struct ecore_cxt_mngr;
 struct ecore_dma_mem;
 struct ecore_sb_sp_info;
 struct ecore_ll2_info;
+struct ecore_l2_info;
 struct ecore_igu_info;
 struct ecore_mcp_info;
 struct ecore_dcbx_info;
+struct ecore_llh_info;
 
 struct ecore_rt_data {
        u32     *init_val;
@@ -205,33 +232,29 @@ enum ecore_tunn_clss {
        MAX_ECORE_TUNN_CLSS,
 };
 
-struct ecore_tunn_start_params {
-       unsigned long tunn_mode;
-       u16     vxlan_udp_port;
-       u16     geneve_udp_port;
-       u8      update_vxlan_udp_port;
-       u8      update_geneve_udp_port;
-       u8      tunn_clss_vxlan;
-       u8      tunn_clss_l2geneve;
-       u8      tunn_clss_ipgeneve;
-       u8      tunn_clss_l2gre;
-       u8      tunn_clss_ipgre;
-};
-
-struct ecore_tunn_update_params {
-       unsigned long tunn_mode_update_mask;
-       unsigned long tunn_mode;
-       u16     vxlan_udp_port;
-       u16     geneve_udp_port;
-       u8      update_rx_pf_clss;
-       u8      update_tx_pf_clss;
-       u8      update_vxlan_udp_port;
-       u8      update_geneve_udp_port;
-       u8      tunn_clss_vxlan;
-       u8      tunn_clss_l2geneve;
-       u8      tunn_clss_ipgeneve;
-       u8      tunn_clss_l2gre;
-       u8      tunn_clss_ipgre;
+struct ecore_tunn_update_type {
+       bool b_update_mode;
+       bool b_mode_enabled;
+       enum ecore_tunn_clss tun_cls;
+};
+
+struct ecore_tunn_update_udp_port {
+       bool b_update_port;
+       u16 port;
+};
+
+struct ecore_tunnel_info {
+       struct ecore_tunn_update_type vxlan;
+       struct ecore_tunn_update_type l2_geneve;
+       struct ecore_tunn_update_type ip_geneve;
+       struct ecore_tunn_update_type l2_gre;
+       struct ecore_tunn_update_type ip_gre;
+
+       struct ecore_tunn_update_udp_port vxlan_port;
+       struct ecore_tunn_update_udp_port geneve_port;
+
+       bool b_update_rx_cls;
+       bool b_update_tx_cls;
 };
 
 /* The PCI personality is not quite synonymous to protocol ID:
@@ -243,7 +266,8 @@ enum ecore_pci_personality {
        ECORE_PCI_FCOE,
        ECORE_PCI_ISCSI,
        ECORE_PCI_ETH_ROCE,
-       ECORE_PCI_IWARP,
+       ECORE_PCI_ETH_IWARP,
+       ECORE_PCI_ETH_RDMA,
        ECORE_PCI_DEFAULT /* default in shmem */
 };
 
@@ -260,7 +284,6 @@ struct ecore_qm_iids {
  * is received from MFW.
  */
 enum ecore_resources {
-       ECORE_SB,
        ECORE_L2_QUEUE,
        ECORE_VPORT,
        ECORE_RSS_ENG,
@@ -273,7 +296,14 @@ enum ecore_resources {
        ECORE_LL2_QUEUE,
        ECORE_CMDQS_CQS,
        ECORE_RDMA_STATS_QUEUE,
-       ECORE_MAX_RESC,                 /* must be last */
+       ECORE_BDQ,
+
+       /* This is needed only internally for matching against the IGU.
+        * In case of legacy MFW, would be set to `0'.
+        */
+       ECORE_SB,
+
+       ECORE_MAX_RESC,
 };
 
 /* Features that require resources, given as input to the resource management
@@ -288,6 +318,7 @@ enum ecore_feature {
        ECORE_RDMA_CNQ,
        ECORE_ISCSI_CQ,
        ECORE_FCOE_CQ,
+       ECORE_VF_L2_QUE,
        ECORE_MAX_FEATURES,
 };
 
@@ -302,6 +333,7 @@ enum ecore_port_mode {
        ECORE_PORT_MODE_DE_2X25G,
        ECORE_PORT_MODE_DE_1X25G,
        ECORE_PORT_MODE_DE_4X25G,
+       ECORE_PORT_MODE_DE_2X10G,
 };
 
 enum ecore_dev_cap {
@@ -323,9 +355,32 @@ enum ecore_hw_err_type {
 };
 #endif
 
+enum ecore_db_rec_exec {
+       DB_REC_DRY_RUN,
+       DB_REC_REAL_DEAL,
+       DB_REC_ONCE,
+};
+
 struct ecore_hw_info {
        /* PCI personality */
        enum ecore_pci_personality personality;
+#define ECORE_IS_RDMA_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH_ROCE || \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_IWARP || \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
+#define ECORE_IS_ROCE_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH_ROCE || \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
+#define ECORE_IS_IWARP_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH_IWARP || \
+        (dev)->hw_info.personality == ECORE_PCI_ETH_RDMA)
+#define ECORE_IS_L2_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_ETH || \
+        ECORE_IS_RDMA_PERSONALITY(dev))
+#define ECORE_IS_FCOE_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_FCOE)
+#define ECORE_IS_ISCSI_PERSONALITY(dev) \
+       ((dev)->hw_info.personality == ECORE_PCI_ISCSI)
 
        /* Resource Allocation scheme results */
        u32 resc_start[ECORE_MAX_RESC];
@@ -347,9 +402,6 @@ struct ecore_hw_info {
 
        u8 num_active_tc;
 
-       /* Traffic class used for tcp out of order traffic */
-       u8 ooo_tc;
-
        /* The traffic class used by PF for it's offloaded protocol */
        u8 offload_tc;
 
@@ -372,24 +424,21 @@ struct ecore_hw_info {
        u32 port_mode;
        u32     hw_mode;
        unsigned long device_capabilities;
-};
 
-struct ecore_hw_cid_data {
-       u32     cid;
-       bool    b_cid_allocated;
-       u8      vfid; /* 1-based; 0 signals this is for a PF */
+       /* Default DCBX mode */
+       u8 dcbx_mode;
 
-       /* Additional identifiers */
-       u16     opaque_fid;
-       u8      vport_id;
+       u16 mtu;
 };
 
 /* maximun size of read/write commands (HW limit) */
 #define DMAE_MAX_RW_SIZE       0x2000
 
 struct ecore_dmae_info {
-       /* Mutex for synchronizing access to functions */
-       osal_mutex_t    mutex;
+       /* Spinlock for synchronizing access to functions */
+       osal_spinlock_t lock;
+
+       bool b_mem_ready;
 
        u8 channel;
 
@@ -424,15 +473,18 @@ struct ecore_qm_info {
        struct init_qm_port_params  *qm_port_params;
        u16                     start_pq;
        u8                      start_vport;
-       u8                      pure_lb_pq;
-       u8                      offload_pq;
-       u8                      pure_ack_pq;
-       u8                      ooo_pq;
-       u8                      vf_queues_offset;
+       u16                     pure_lb_pq;
+       u16                     offload_pq;
+       u16                     pure_ack_pq;
+       u16                     ooo_pq;
+       u16                     first_vf_pq;
+       u16                     first_mcos_pq;
+       u16                     first_rl_pq;
        u16                     num_pqs;
        u16                     num_vf_pqs;
        u8                      num_vports;
        u8                      max_phys_tcs_per_port;
+       u8                      ooo_tc;
        bool                    pf_rl_en;
        bool                    pf_wfq_en;
        bool                    vport_rl_en;
@@ -443,6 +495,12 @@ struct ecore_qm_info {
        u8                      num_pf_rls;
 };
 
+struct ecore_db_recovery_info {
+       osal_list_t list;
+       osal_spinlock_t lock;
+       u32 db_recovery_counter;
+};
+
 struct storm_stats {
        u32 address;
        u32 len;
@@ -458,21 +516,76 @@ struct ecore_fw_data {
        u32 init_ops_size;
 };
 
+enum ecore_mf_mode_bit {
+       /* Supports PF-classification based on tag */
+       ECORE_MF_OVLAN_CLSS,
+
+       /* Supports PF-classification based on MAC */
+       ECORE_MF_LLH_MAC_CLSS,
+
+       /* Supports PF-classification based on protocol type */
+       ECORE_MF_LLH_PROTO_CLSS,
+
+       /* Requires a default PF to be set */
+       ECORE_MF_NEED_DEF_PF,
+
+       /* Allow LL2 to multicast/broadcast */
+       ECORE_MF_LL2_NON_UNICAST,
+
+       /* Allow Cross-PF [& child VFs] Tx-switching */
+       ECORE_MF_INTER_PF_SWITCH,
+
+       /* TODO - if we ever re-utilize any of this logic, we can rename */
+       ECORE_MF_UFP_SPECIFIC,
+
+       ECORE_MF_DISABLE_ARFS,
+
+       /* Use vlan for steering */
+       ECORE_MF_8021Q_TAGGING,
+
+       /* Use stag for steering */
+       ECORE_MF_8021AD_TAGGING,
+
+       /* Allow FIP discovery fallback */
+       ECORE_MF_FIP_SPECIAL,
+};
+
+enum ecore_ufp_mode {
+       ECORE_UFP_MODE_ETS,
+       ECORE_UFP_MODE_VNIC_BW,
+};
+
+enum ecore_ufp_pri_type {
+       ECORE_UFP_PRI_OS,
+       ECORE_UFP_PRI_VNIC
+};
+
+struct ecore_ufp_info {
+       enum ecore_ufp_pri_type pri_type;
+       enum ecore_ufp_mode mode;
+       u8 tc;
+};
+
+enum BAR_ID {
+       BAR_ID_0,       /* used for GRC */
+       BAR_ID_1        /* Used for doorbells */
+};
+
 struct ecore_hwfn {
        struct ecore_dev                *p_dev;
        u8                              my_id;          /* ID inside the PF */
 #define IS_LEAD_HWFN(edev)             (!((edev)->my_id))
        u8                              rel_pf_id;      /* Relative to engine*/
        u8                              abs_pf_id;
-       #define ECORE_PATH_ID(_p_hwfn) \
-               (ECORE_IS_K2((_p_hwfn)->p_dev) ? 0 : ((_p_hwfn)->abs_pf_id & 1))
+#define ECORE_PATH_ID(_p_hwfn) \
+       (ECORE_IS_BB((_p_hwfn)->p_dev) ? ((_p_hwfn)->abs_pf_id & 1) : 0)
        u8                              port_id;
        bool                            b_active;
 
        u32                             dp_module;
        u8                              dp_level;
        char                            name[NAME_SIZE];
-       void                            *dp_ctx;
+       void                            *dp_ctx;
 
        bool                            first_on_engine;
        bool                            hw_init_done;
@@ -526,10 +639,6 @@ struct ecore_hwfn {
        bool                            b_rdma_enabled_in_prs;
        u32                             rdma_prs_search_reg;
 
-       /* Array of sb_info of all status blocks */
-       struct ecore_sb_info            *sbs_info[MAX_SB_PER_PF_MIMD];
-       u16                             num_sbs;
-
        struct ecore_cxt_mngr           *p_cxt_mngr;
 
        /* Flag indicating whether interrupts are enabled or not*/
@@ -543,9 +652,7 @@ struct ecore_hwfn {
        struct ecore_pf_iov             *pf_iov_info;
        struct ecore_mcp_info           *mcp_info;
        struct ecore_dcbx_info          *p_dcbx_info;
-
-       struct ecore_hw_cid_data        *p_tx_cids;
-       struct ecore_hw_cid_data        *p_rx_cids;
+       struct ecore_ufp_info           ufp_info;
 
        struct ecore_dmae_info          dmae_info;
 
@@ -558,6 +665,7 @@ struct ecore_hwfn {
 #endif
 
        struct dbg_tools_data           dbg_info;
+       void                            *dbg_user_info;
 
        struct z_stream_s               *stream;
 
@@ -572,15 +680,30 @@ struct ecore_hwfn {
        /* If one of the following is set then EDPM shouldn't be used */
        u8                              dcbx_no_edpm;
        u8                              db_bar_no_edpm;
+
+       /* L2-related */
+       struct ecore_l2_info            *p_l2_info;
+
+       /* Mechanism for recovering from doorbell drop */
+       struct ecore_db_recovery_info   db_recovery_info;
+
+       /* Enable/disable pacing, if request to enable then
+        * IOV and mcos configuration will be skipped.
+        * this actually reflects the value requested in
+        * struct ecore_hw_prepare_params by ecore client.
+        */
+       bool b_en_pacing;
+
+       /* @DPDK */
+       struct ecore_ptt                *p_arfs_ptt;
 };
 
-#ifndef __EXTRACT__LINUX__
 enum ecore_mf_mode {
        ECORE_MF_DEFAULT,
        ECORE_MF_OVLAN,
        ECORE_MF_NPAR,
+       ECORE_MF_UFP,
 };
-#endif
 
 /* @DPDK */
 struct ecore_dbg_feature {
@@ -599,15 +722,18 @@ enum qed_dbg_features {
        DBG_FEATURE_NUM
 };
 
+enum ecore_dev_type {
+       ECORE_DEV_TYPE_BB,
+       ECORE_DEV_TYPE_AH,
+};
+
 struct ecore_dev {
        u32                             dp_module;
        u8                              dp_level;
        char                            name[NAME_SIZE];
-       void                            *dp_ctx;
+       void                            *dp_ctx;
 
-       u8                              type;
-#define ECORE_DEV_TYPE_BB      (0 << 0)
-#define ECORE_DEV_TYPE_AH      (1 << 0)
+       enum ecore_dev_type             type;
 /* Translate type/revision combo into the proper conditions */
 #define ECORE_IS_BB(dev)       ((dev)->type == ECORE_DEV_TYPE_BB)
 #define ECORE_IS_BB_A0(dev)    (ECORE_IS_BB(dev) && CHIP_REV_IS_A0(dev))
@@ -619,67 +745,74 @@ struct ecore_dev {
 #endif
 #define ECORE_IS_AH(dev)       ((dev)->type == ECORE_DEV_TYPE_AH)
 #define ECORE_IS_K2(dev)       ECORE_IS_AH(dev)
+#define ECORE_IS_E4(dev)       (ECORE_IS_BB(dev) || ECORE_IS_AH(dev))
 
        u16 vendor_id;
        u16 device_id;
+#define ECORE_DEV_ID_MASK      0xff00
+#define ECORE_DEV_ID_MASK_BB   0x1600
+#define ECORE_DEV_ID_MASK_AH   0x8000
 
        u16                             chip_num;
-       #define CHIP_NUM_MASK                   0xffff
-       #define CHIP_NUM_SHIFT                  16
+#define CHIP_NUM_MASK                  0xffff
+#define CHIP_NUM_SHIFT                 0
 
-       u16                             chip_rev;
-       #define CHIP_REV_MASK                   0xf
-       #define CHIP_REV_SHIFT                  12
+       u                             chip_rev;
+#define CHIP_REV_MASK                  0xf
+#define CHIP_REV_SHIFT                 0
 #ifndef ASIC_ONLY
-       #define CHIP_REV_IS_TEDIBEAR(_p_dev) ((_p_dev)->chip_rev == 0x5)
-       #define CHIP_REV_IS_EMUL_A0(_p_dev) ((_p_dev)->chip_rev == 0xe)
-       #define CHIP_REV_IS_EMUL_B0(_p_dev) ((_p_dev)->chip_rev == 0xc)
-       #define CHIP_REV_IS_EMUL(_p_dev) (CHIP_REV_IS_EMUL_A0(_p_dev) || \
-                                         CHIP_REV_IS_EMUL_B0(_p_dev))
-       #define CHIP_REV_IS_FPGA_A0(_p_dev) ((_p_dev)->chip_rev == 0xf)
-       #define CHIP_REV_IS_FPGA_B0(_p_dev) ((_p_dev)->chip_rev == 0xd)
-       #define CHIP_REV_IS_FPGA(_p_dev) (CHIP_REV_IS_FPGA_A0(_p_dev) || \
-                                         CHIP_REV_IS_FPGA_B0(_p_dev))
-       #define CHIP_REV_IS_SLOW(_p_dev) \
-               (CHIP_REV_IS_EMUL(_p_dev) || CHIP_REV_IS_FPGA(_p_dev))
-       #define CHIP_REV_IS_A0(_p_dev) \
-               (CHIP_REV_IS_EMUL_A0(_p_dev) || \
-                CHIP_REV_IS_FPGA_A0(_p_dev) || \
-                !(_p_dev)->chip_rev)
-       #define CHIP_REV_IS_B0(_p_dev) \
-               (CHIP_REV_IS_EMUL_B0(_p_dev) || \
-                CHIP_REV_IS_FPGA_B0(_p_dev) || \
-                (_p_dev)->chip_rev == 1)
-       #define CHIP_REV_IS_ASIC(_p_dev) !CHIP_REV_IS_SLOW(_p_dev)
+#define CHIP_REV_IS_TEDIBEAR(_p_dev)   ((_p_dev)->chip_rev == 0x5)
+#define CHIP_REV_IS_EMUL_A0(_p_dev)    ((_p_dev)->chip_rev == 0xe)
+#define CHIP_REV_IS_EMUL_B0(_p_dev)    ((_p_dev)->chip_rev == 0xc)
+#define CHIP_REV_IS_EMUL(_p_dev) \
+       (CHIP_REV_IS_EMUL_A0(_p_dev) || CHIP_REV_IS_EMUL_B0(_p_dev))
+#define CHIP_REV_IS_FPGA_A0(_p_dev)    ((_p_dev)->chip_rev == 0xf)
+#define CHIP_REV_IS_FPGA_B0(_p_dev)    ((_p_dev)->chip_rev == 0xd)
+#define CHIP_REV_IS_FPGA(_p_dev) \
+       (CHIP_REV_IS_FPGA_A0(_p_dev) || CHIP_REV_IS_FPGA_B0(_p_dev))
+#define CHIP_REV_IS_SLOW(_p_dev) \
+       (CHIP_REV_IS_EMUL(_p_dev) || CHIP_REV_IS_FPGA(_p_dev))
+#define CHIP_REV_IS_A0(_p_dev) \
+       (CHIP_REV_IS_EMUL_A0(_p_dev) || CHIP_REV_IS_FPGA_A0(_p_dev) || \
+        (!(_p_dev)->chip_rev && !(_p_dev)->chip_metal))
+#define CHIP_REV_IS_B0(_p_dev) \
+       (CHIP_REV_IS_EMUL_B0(_p_dev) || CHIP_REV_IS_FPGA_B0(_p_dev) || \
+        ((_p_dev)->chip_rev == 1 && !(_p_dev)->chip_metal))
+#define CHIP_REV_IS_ASIC(_p_dev)       !CHIP_REV_IS_SLOW(_p_dev)
 #else
-       #define CHIP_REV_IS_A0(_p_dev)  (!(_p_dev)->chip_rev)
-       #define CHIP_REV_IS_B0(_p_dev)  ((_p_dev)->chip_rev == 1)
+#define CHIP_REV_IS_A0(_p_dev) \
+       (!(_p_dev)->chip_rev && !(_p_dev)->chip_metal)
+#define CHIP_REV_IS_B0(_p_dev) \
+       ((_p_dev)->chip_rev == 1 && !(_p_dev)->chip_metal)
 #endif
 
-       u16                             chip_metal;
-       #define CHIP_METAL_MASK                 0xff
-       #define CHIP_METAL_SHIFT                4
+       u                             chip_metal;
+#define CHIP_METAL_MASK                        0xff
+#define CHIP_METAL_SHIFT               0
 
-       u16                             chip_bond_id;
-       #define CHIP_BOND_ID_MASK               0xf
-       #define CHIP_BOND_ID_SHIFT              0
+       u                             chip_bond_id;
+#define CHIP_BOND_ID_MASK              0xff
+#define CHIP_BOND_ID_SHIFT             0
 
        u8                              num_engines;
-       u8                              num_ports_in_engines;
+       u8                              num_ports;
+       u8                              num_ports_in_engine;
        u8                              num_funcs_in_port;
 
        u8                              path_id;
+
+       unsigned long                   mf_bits;
        enum ecore_mf_mode              mf_mode;
-       #define IS_MF_DEFAULT(_p_hwfn)  \
-                       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_DEFAULT)
-       #define IS_MF_SI(_p_hwfn)       \
-                       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_NPAR)
-       #define IS_MF_SD(_p_hwfn)       \
-                       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_OVLAN)
+#define IS_MF_DEFAULT(_p_hwfn) \
+       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_DEFAULT)
+#define IS_MF_SI(_p_hwfn)      \
+       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_NPAR)
+#define IS_MF_SD(_p_hwfn)      \
+       (((_p_hwfn)->p_dev)->mf_mode == ECORE_MF_OVLAN)
 
        int                             pcie_width;
        int                             pcie_speed;
-       u8                              ver_str[NAME_SIZE]; /* @DPDK */
+
        /* Add MF related configuration */
        u8                              mcp_rev;
        u8                              boot_mode;
@@ -707,15 +840,32 @@ struct ecore_dev {
        /* HW functions */
        u8                              num_hwfns;
        struct ecore_hwfn               hwfns[MAX_HWFNS_PER_DEVICE];
+#define ECORE_LEADING_HWFN(dev)                (&dev->hwfns[0])
+#define ECORE_IS_CMT(dev)              ((dev)->num_hwfns > 1)
+
+       /* Engine affinity */
+       u8                              l2_affin_hint;
+       u8                              fir_affin;
+       u8                              iwarp_affin;
+       /* Macro for getting the engine-affinitized hwfn for FCoE/iSCSI/RoCE */
+#define ECORE_FIR_AFFIN_HWFN(dev)      (&dev->hwfns[dev->fir_affin])
+       /* Macro for getting the engine-affinitized hwfn for iWARP */
+#define ECORE_IWARP_AFFIN_HWFN(dev)    (&dev->hwfns[dev->iwarp_affin])
+       /* Generic macro for getting the engine-affinitized hwfn */
+#define ECORE_AFFIN_HWFN(dev) \
+       (ECORE_IS_IWARP_PERSONALITY(ECORE_LEADING_HWFN(dev)) ? \
+        ECORE_IWARP_AFFIN_HWFN(dev) : \
+        ECORE_FIR_AFFIN_HWFN(dev))
+       /* Macro for getting the index (0/1) of the engine-affinitized hwfn */
+#define ECORE_AFFIN_HWFN_IDX(dev) \
+       (IS_LEAD_HWFN(ECORE_AFFIN_HWFN(dev)) ? 0 : 1)
 
        /* SRIOV */
        struct ecore_hw_sriov_info      *p_iov_info;
 #define IS_ECORE_SRIOV(p_dev)          (!!(p_dev)->p_iov_info)
-       bool                            b_hw_channel;
-
-       unsigned long                   tunn_mode;
-
+       struct ecore_tunnel_info        tunnel;
        bool                            b_is_vf;
+       bool                            b_dont_override_vf_msix;
 
        u32                             drv_type;
 
@@ -736,7 +886,7 @@ struct ecore_dev {
        bool                            attn_clr_en;
 
        /* Indicates whether allowing the MFW to collect a crash dump */
-       bool                            mdump_en;
+       bool                            allow_mdump;
 
        /* Indicates if the reg_fifo is checked after any register access */
        bool                            chk_reg_fifo;
@@ -744,6 +894,12 @@ struct ecore_dev {
 #ifndef ASIC_ONLY
        bool                            b_is_emul_full;
 #endif
+       /* LLH info */
+       u8                              ppfid_bitmap;
+       struct ecore_llh_info           *p_llh_info;
+
+       /* Indicates whether this PF serves a storage target */
+       bool                            b_is_target;
 
 #ifdef CONFIG_ECORE_BINARY_FW /* @DPDK */
        void                            *firmware;
@@ -766,14 +922,7 @@ struct ecore_dev {
 #define NUM_OF_ENG_PFS(dev)    (ECORE_IS_BB(dev) ? MAX_NUM_PFS_BB \
                                                  : MAX_NUM_PFS_K2)
 
-#ifndef REAL_ASIC_ONLY
-#define ENABLE_EAGLE_ENG1_WORKAROUND(p_hwfn) ( \
-       (ECORE_IS_BB_A0(p_hwfn->p_dev)) && \
-       (ECORE_PATH_ID(p_hwfn) == 1) && \
-       ((p_hwfn->hw_info.port_mode == ECORE_PORT_MODE_DE_2X40G) || \
-        (p_hwfn->hw_info.port_mode == ECORE_PORT_MODE_DE_2X50G) || \
-        (p_hwfn->hw_info.port_mode == ECORE_PORT_MODE_DE_2X25G)))
-#endif
+#define CRC8_TABLE_SIZE 256
 
 /**
  * @brief ecore_concrete_to_sw_fid - get the sw function id from
@@ -783,8 +932,7 @@ struct ecore_dev {
  *
  * @return OSAL_INLINE u8
  */
-static OSAL_INLINE u8 ecore_concrete_to_sw_fid(struct ecore_dev *p_dev,
-                                         u32 concrete_fid)
+static OSAL_INLINE u8 ecore_concrete_to_sw_fid(u32 concrete_fid)
 {
        u8 vfid     = GET_FIELD(concrete_fid, PXP_CONCRETE_FID_VFID);
        u8 pfid     = GET_FIELD(concrete_fid, PXP_CONCRETE_FID_PFID);
@@ -799,11 +947,12 @@ static OSAL_INLINE u8 ecore_concrete_to_sw_fid(struct ecore_dev *p_dev,
        return sw_fid;
 }
 
-#define PURE_LB_TC 8
-#define OOO_LB_TC 9
+#define PKT_LB_TC 9
+#define MAX_NUM_VOQS_E4 20
 
 int ecore_configure_vport_wfq(struct ecore_dev *p_dev, u16 vp_id, u32 rate);
 void ecore_configure_vp_wfq_on_link_change(struct ecore_dev *p_dev,
+                                          struct ecore_ptt *p_ptt,
                                           u32 min_pf_rate);
 
 int ecore_configure_pf_max_bandwidth(struct ecore_dev *p_dev, u8 max_bw);
@@ -811,7 +960,67 @@ int ecore_configure_pf_min_bandwidth(struct ecore_dev *p_dev, u8 min_bw);
 void ecore_clean_wfq_db(struct ecore_hwfn *p_hwfn, struct ecore_ptt *p_ptt);
 int ecore_device_num_engines(struct ecore_dev *p_dev);
 int ecore_device_num_ports(struct ecore_dev *p_dev);
-
-#define ECORE_LEADING_HWFN(dev)        (&dev->hwfns[0])
+void ecore_set_fw_mac_addr(__le16 *fw_msb, __le16 *fw_mid, __le16 *fw_lsb,
+                          u8 *mac);
+
+/* Flags for indication of required queues */
+#define PQ_FLAGS_RLS   (1 << 0)
+#define PQ_FLAGS_MCOS  (1 << 1)
+#define PQ_FLAGS_LB    (1 << 2)
+#define PQ_FLAGS_OOO   (1 << 3)
+#define PQ_FLAGS_ACK   (1 << 4)
+#define PQ_FLAGS_OFLD  (1 << 5)
+#define PQ_FLAGS_VFS   (1 << 6)
+#define PQ_FLAGS_LLT   (1 << 7)
+
+/* physical queue index for cm context intialization */
+u16 ecore_get_cm_pq_idx(struct ecore_hwfn *p_hwfn, u32 pq_flags);
+u16 ecore_get_cm_pq_idx_mcos(struct ecore_hwfn *p_hwfn, u8 tc);
+u16 ecore_get_cm_pq_idx_vf(struct ecore_hwfn *p_hwfn, u16 vf);
+u16 ecore_get_cm_pq_idx_rl(struct ecore_hwfn *p_hwfn, u16 rl);
+
+/* qm vport for rate limit configuration */
+u16 ecore_get_qm_vport_idx_rl(struct ecore_hwfn *p_hwfn, u16 rl);
+
+const char *ecore_hw_get_resc_name(enum ecore_resources res_id);
+
+/* doorbell recovery mechanism */
+void ecore_db_recovery_dp(struct ecore_hwfn *p_hwfn);
+void ecore_db_recovery_execute(struct ecore_hwfn *p_hwfn,
+                              enum ecore_db_rec_exec);
+
+bool ecore_edpm_enabled(struct ecore_hwfn *p_hwfn);
+
+/* amount of resources used in qm init */
+u8 ecore_init_qm_get_num_tcs(struct ecore_hwfn *p_hwfn);
+u16 ecore_init_qm_get_num_vfs(struct ecore_hwfn *p_hwfn);
+u16 ecore_init_qm_get_num_pf_rls(struct ecore_hwfn *p_hwfn);
+u16 ecore_init_qm_get_num_vports(struct ecore_hwfn *p_hwfn);
+u16 ecore_init_qm_get_num_pqs(struct ecore_hwfn *p_hwfn);
+
+#define MFW_PORT(_p_hwfn)      ((_p_hwfn)->abs_pf_id % \
+                                ecore_device_num_ports((_p_hwfn)->p_dev))
+
+/* The PFID<->PPFID calculation is based on the relative index of a PF on its
+ * port. In BB there is a bug in the LLH in which the PPFID is actually engine
+ * based, and thus it equals the PFID.
+ */
+#define ECORE_PFID_BY_PPFID(_p_hwfn, abs_ppfid) \
+       (ECORE_IS_BB((_p_hwfn)->p_dev) ? \
+        (abs_ppfid) : \
+        (abs_ppfid) * (_p_hwfn)->p_dev->num_ports_in_engine + \
+        MFW_PORT(_p_hwfn))
+#define ECORE_PPFID_BY_PFID(_p_hwfn) \
+       (ECORE_IS_BB((_p_hwfn)->p_dev) ? \
+        (_p_hwfn)->rel_pf_id : \
+        (_p_hwfn)->rel_pf_id / (_p_hwfn)->p_dev->num_ports_in_engine)
+
+enum _ecore_status_t ecore_all_ppfids_wr(struct ecore_hwfn *p_hwfn,
+                                        struct ecore_ptt *p_ptt, u32 addr,
+                                        u32 val);
+
+/* Utility functions for dumping the content of the NIG LLH filters */
+enum _ecore_status_t ecore_llh_dump_ppfid(struct ecore_dev *p_dev, u8 ppfid);
+enum _ecore_status_t ecore_llh_dump_all(struct ecore_dev *p_dev);
 
 #endif /* __ECORE_H */