bnx2x: Add iproute2 support for vfs
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / net / ethernet / broadcom / bnx2x / bnx2x.h
index e8d4db1..d62d037 100644 (file)
@@ -1,6 +1,6 @@
 /* bnx2x.h: Broadcom Everest network driver.
  *
- * Copyright (c) 2007-2012 Broadcom Corporation
+ * Copyright (c) 2007-2013 Broadcom Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 #ifndef BNX2X_H
 #define BNX2X_H
+
+#include <linux/pci.h>
 #include <linux/netdevice.h>
 #include <linux/dma-mapping.h>
 #include <linux/types.h>
+#include <linux/pci_regs.h>
 
 /* compilation time flags */
 
@@ -23,8 +26,8 @@
  * (you will need to reboot afterwards) */
 /* #define BNX2X_STOP_ON_ERROR */
 
-#define DRV_MODULE_VERSION      "1.78.00-0"
-#define DRV_MODULE_RELDATE      "2012/09/27"
+#define DRV_MODULE_VERSION      "1.78.02-0"
+#define DRV_MODULE_RELDATE      "2013/01/14"
 #define BNX2X_BC_VER            0x040200
 
 #if defined(CONFIG_DCB)
 #include "bnx2x_sp.h"
 #include "bnx2x_dcb.h"
 #include "bnx2x_stats.h"
+#include "bnx2x_vfpf.h"
+
+enum bnx2x_int_mode {
+       BNX2X_INT_MODE_MSIX,
+       BNX2X_INT_MODE_INTX,
+       BNX2X_INT_MODE_MSI
+};
 
 /* error/debug prints */
 
@@ -112,29 +122,29 @@ do {                                                               \
                dev_info(&bp->pdev->dev, fmt, ##__VA_ARGS__);    \
 } while (0)
 
+/* Error handling */
+void bnx2x_panic_dump(struct bnx2x *bp, bool disable_int);
 #ifdef BNX2X_STOP_ON_ERROR
-void bnx2x_int_disable(struct bnx2x *bp);
 #define bnx2x_panic()                          \
 do {                                           \
        bp->panic = 1;                          \
        BNX2X_ERR("driver assert\n");           \
-       bnx2x_int_disable(bp);                  \
-       bnx2x_panic_dump(bp);                   \
+       bnx2x_panic_dump(bp, true);             \
 } while (0)
 #else
 #define bnx2x_panic()                          \
 do {                                           \
        bp->panic = 1;                          \
        BNX2X_ERR("driver assert\n");           \
-       bnx2x_panic_dump(bp);                   \
+       bnx2x_panic_dump(bp, false);            \
 } while (0)
 #endif
 
 #define bnx2x_mc_addr(ha)      ((ha)->addr)
 #define bnx2x_uc_addr(ha)      ((ha)->addr)
 
-#define U64_LO(x)                      (u32)(((u64)(x)) & 0xffffffff)
-#define U64_HI(x)                      (u32)(((u64)(x)) >> 32)
+#define U64_LO(x)                      ((u32)(((u64)(x)) & 0xffffffff))
+#define U64_HI(x)                      ((u32)(((u64)(x)) >> 32))
 #define HILO_U64(hi, lo)               ((((u64)(hi)) << 32) + (lo))
 
 
@@ -334,6 +344,9 @@ union db_prod {
 #define SGE_PAGE_SIZE          PAGE_SIZE
 #define SGE_PAGE_SHIFT         PAGE_SHIFT
 #define SGE_PAGE_ALIGN(addr)   PAGE_ALIGN((typeof(PAGE_SIZE))(addr))
+#define SGE_PAGES              (SGE_PAGE_SIZE * PAGES_PER_SGE)
+#define TPA_AGG_SIZE           min_t(u32, (min_t(u32, 8, MAX_SKB_FRAGS) * \
+                                           SGE_PAGES), 0xffff)
 
 /* SGE ring related macros */
 #define NUM_RX_SGE_PAGES       2
@@ -479,7 +492,6 @@ enum bnx2x_tpa_mode_t {
 struct bnx2x_fastpath {
        struct bnx2x            *bp; /* parent */
 
-#define BNX2X_NAPI_WEIGHT       128
        struct napi_struct      napi;
        union host_hc_status_block      status_blk;
        /* chip independed shortcuts into sb structure */
@@ -789,48 +801,63 @@ struct bnx2x_common {
 #define CHIP_NUM_57711E                        0x1650
 #define CHIP_NUM_57712                 0x1662
 #define CHIP_NUM_57712_MF              0x1663
+#define CHIP_NUM_57712_VF              0x166f
 #define CHIP_NUM_57713                 0x1651
 #define CHIP_NUM_57713E                        0x1652
 #define CHIP_NUM_57800                 0x168a
 #define CHIP_NUM_57800_MF              0x16a5
+#define CHIP_NUM_57800_VF              0x16a9
 #define CHIP_NUM_57810                 0x168e
 #define CHIP_NUM_57810_MF              0x16ae
+#define CHIP_NUM_57810_VF              0x16af
 #define CHIP_NUM_57811                 0x163d
 #define CHIP_NUM_57811_MF              0x163e
-#define CHIP_NUM_57840_OBSOLETE        0x168d
+#define CHIP_NUM_57811_VF              0x163f
+#define CHIP_NUM_57840_OBSOLETE                0x168d
 #define CHIP_NUM_57840_MF_OBSOLETE     0x16ab
 #define CHIP_NUM_57840_4_10            0x16a1
 #define CHIP_NUM_57840_2_20            0x16a2
 #define CHIP_NUM_57840_MF              0x16a4
+#define CHIP_NUM_57840_VF              0x16ad
 #define CHIP_IS_E1(bp)                 (CHIP_NUM(bp) == CHIP_NUM_57710)
 #define CHIP_IS_57711(bp)              (CHIP_NUM(bp) == CHIP_NUM_57711)
 #define CHIP_IS_57711E(bp)             (CHIP_NUM(bp) == CHIP_NUM_57711E)
 #define CHIP_IS_57712(bp)              (CHIP_NUM(bp) == CHIP_NUM_57712)
+#define CHIP_IS_57712_VF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57712_VF)
 #define CHIP_IS_57712_MF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57712_MF)
 #define CHIP_IS_57800(bp)              (CHIP_NUM(bp) == CHIP_NUM_57800)
 #define CHIP_IS_57800_MF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57800_MF)
+#define CHIP_IS_57800_VF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57800_VF)
 #define CHIP_IS_57810(bp)              (CHIP_NUM(bp) == CHIP_NUM_57810)
 #define CHIP_IS_57810_MF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57810_MF)
+#define CHIP_IS_57810_VF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57810_VF)
 #define CHIP_IS_57811(bp)              (CHIP_NUM(bp) == CHIP_NUM_57811)
 #define CHIP_IS_57811_MF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57811_MF)
+#define CHIP_IS_57811_VF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57811_VF)
 #define CHIP_IS_57840(bp)              \
                ((CHIP_NUM(bp) == CHIP_NUM_57840_4_10) || \
                 (CHIP_NUM(bp) == CHIP_NUM_57840_2_20) || \
                 (CHIP_NUM(bp) == CHIP_NUM_57840_OBSOLETE))
 #define CHIP_IS_57840_MF(bp)   ((CHIP_NUM(bp) == CHIP_NUM_57840_MF) || \
                                 (CHIP_NUM(bp) == CHIP_NUM_57840_MF_OBSOLETE))
+#define CHIP_IS_57840_VF(bp)           (CHIP_NUM(bp) == CHIP_NUM_57840_VF)
 #define CHIP_IS_E1H(bp)                        (CHIP_IS_57711(bp) || \
                                         CHIP_IS_57711E(bp))
 #define CHIP_IS_E2(bp)                 (CHIP_IS_57712(bp) || \
-                                        CHIP_IS_57712_MF(bp))
+                                        CHIP_IS_57712_MF(bp) || \
+                                        CHIP_IS_57712_VF(bp))
 #define CHIP_IS_E3(bp)                 (CHIP_IS_57800(bp) || \
                                         CHIP_IS_57800_MF(bp) || \
+                                        CHIP_IS_57800_VF(bp) || \
                                         CHIP_IS_57810(bp) || \
                                         CHIP_IS_57810_MF(bp) || \
+                                        CHIP_IS_57810_VF(bp) || \
                                         CHIP_IS_57811(bp) || \
                                         CHIP_IS_57811_MF(bp) || \
+                                        CHIP_IS_57811_VF(bp) || \
                                         CHIP_IS_57840(bp) || \
-                                        CHIP_IS_57840_MF(bp))
+                                        CHIP_IS_57840_MF(bp) || \
+                                        CHIP_IS_57840_VF(bp))
 #define CHIP_IS_E1x(bp)                        (CHIP_IS_E1((bp)) || CHIP_IS_E1H((bp)))
 #define USES_WARPCORE(bp)              (CHIP_IS_E3(bp))
 #define IS_E1H_OFFSET                  (!CHIP_IS_E1(bp))
@@ -954,6 +981,11 @@ struct bnx2x_port {
 extern struct workqueue_struct *bnx2x_wq;
 
 #define BNX2X_MAX_NUM_OF_VFS   64
+#define BNX2X_VF_CID_WND       0
+#define BNX2X_CIDS_PER_VF      (1 << BNX2X_VF_CID_WND)
+#define BNX2X_CLIENTS_PER_VF   1
+#define BNX2X_FIRST_VF_CID     256
+#define BNX2X_VF_CIDS          (BNX2X_MAX_NUM_OF_VFS * BNX2X_CIDS_PER_VF)
 #define BNX2X_VF_ID_INVALID    0xFF
 
 /*
@@ -1104,6 +1136,7 @@ struct hw_context {
 /* forward */
 struct bnx2x_ilt;
 
+struct bnx2x_vfdb;
 
 enum bnx2x_recovery_state {
        BNX2X_RECOVERY_DONE,
@@ -1165,19 +1198,23 @@ struct bnx2x_fw_stats_req {
 };
 
 struct bnx2x_fw_stats_data {
-       struct stats_counter    storm_counters;
-       struct per_port_stats   port;
-       struct per_pf_stats     pf;
+       struct stats_counter            storm_counters;
+       struct per_port_stats           port;
+       struct per_pf_stats             pf;
        struct fcoe_statistics_params   fcoe;
-       struct per_queue_stats  queue_stats[1];
+       struct per_queue_stats          queue_stats[1];
 };
 
 /* Public slow path states */
 enum {
        BNX2X_SP_RTNL_SETUP_TC,
        BNX2X_SP_RTNL_TX_TIMEOUT,
-       BNX2X_SP_RTNL_AFEX_F_UPDATE,
        BNX2X_SP_RTNL_FAN_FAILURE,
+       BNX2X_SP_RTNL_AFEX_F_UPDATE,
+       BNX2X_SP_RTNL_ENABLE_SRIOV,
+       BNX2X_SP_RTNL_VFPF_MCAST,
+       BNX2X_SP_RTNL_VFPF_STORM_RX_MODE,
+       BNX2X_SP_RTNL_HYPERVISOR_VLAN,
 };
 
 
@@ -1231,6 +1268,21 @@ struct bnx2x {
          (vn) * ((CHIP_IS_E1x(bp) || (CHIP_MODE_IS_4_PORT(bp))) ? 2  : 1))
 #define BP_FW_MB_IDX(bp)               BP_FW_MB_IDX_VN(bp, BP_VN(bp))
 
+#ifdef CONFIG_BNX2X_SRIOV
+       /* vf pf channel mailbox contains request and response buffers */
+       struct bnx2x_vf_mbx_msg *vf2pf_mbox;
+       dma_addr_t              vf2pf_mbox_mapping;
+
+       /* we set aside a copy of the acquire response */
+       struct pfvf_acquire_resp_tlv acquire_resp;
+
+       /* bulletin board for messages from pf to vf */
+       union pf_vf_bulletin   *pf2vf_bulletin;
+       dma_addr_t              pf2vf_bulletin_mapping;
+
+       struct pf_vf_bulletin_content   old_bulletin;
+#endif /* CONFIG_BNX2X_SRIOV */
+
        struct net_device       *dev;
        struct pci_dev          *pdev;
 
@@ -1295,8 +1347,6 @@ struct bnx2x {
        __le16                  *eq_cons_sb;
        atomic_t                eq_spq_left; /* COMMON_XXX ramrods credit */
 
-
-
        /* Counter for marking that there is a STAT_QUERY ramrod pending */
        u16                     stats_pending;
        /*  Counter for completed statistics ramrods */
@@ -1318,8 +1368,6 @@ struct bnx2x {
 #define DISABLE_MSI_FLAG               (1 << 7)
 #define TPA_ENABLE_FLAG                        (1 << 8)
 #define NO_MCP_FLAG                    (1 << 9)
-
-#define BP_NOMCP(bp)                   (bp->flags & NO_MCP_FLAG)
 #define GRO_ENABLE_FLAG                        (1 << 10)
 #define MF_FUNC_DIS                    (1 << 11)
 #define OWN_CNIC_IRQ                   (1 << 12)
@@ -1330,6 +1378,17 @@ struct bnx2x {
 #define BC_SUPPORTS_FCOE_FEATURES      (1 << 19)
 #define USING_SINGLE_MSIX_FLAG         (1 << 20)
 #define BC_SUPPORTS_DCBX_MSG_NON_PMF   (1 << 21)
+#define IS_VF_FLAG                     (1 << 22)
+
+#define BP_NOMCP(bp)                   ((bp)->flags & NO_MCP_FLAG)
+
+#ifdef CONFIG_BNX2X_SRIOV
+#define IS_VF(bp)                      ((bp)->flags & IS_VF_FLAG)
+#define IS_PF(bp)                      (!((bp)->flags & IS_VF_FLAG))
+#else
+#define IS_VF(bp)                      false
+#define IS_PF(bp)                      true
+#endif
 
 #define NO_ISCSI(bp)           ((bp)->flags & NO_ISCSI_FLAG)
 #define NO_ISCSI_OOO(bp)       ((bp)->flags & NO_ISCSI_OOO_FLAG)
@@ -1349,6 +1408,7 @@ struct bnx2x {
        int                     mrrs;
 
        struct delayed_work     sp_task;
+       atomic_t                interrupt_occurred;
        struct delayed_work     sp_rtnl_task;
 
        struct delayed_work     period_task;
@@ -1432,6 +1492,7 @@ struct bnx2x {
        u8                      igu_sb_cnt;
        u8                      min_msix_vec_cnt;
 
+       u32                     igu_base_addr;
        dma_addr_t              def_status_blk_mapping;
 
        struct bnx2x_slowpath   *slowpath;
@@ -1580,6 +1641,9 @@ struct bnx2x {
        char                    fw_ver[32];
        const struct firmware   *firmware;
 
+       struct bnx2x_vfdb       *vfdb;
+#define IS_SRIOV(bp)           ((bp)->vfdb)
+
        /* DCB support on/off */
        u16 dcb_state;
 #define BNX2X_DCB_STATE_OFF                    0
@@ -1599,6 +1663,10 @@ struct bnx2x {
        int                                     dcb_version;
 
        /* CAM credit pools */
+
+       /* used only in sriov */
+       struct bnx2x_credit_pool_obj            vlans_pool;
+
        struct bnx2x_credit_pool_obj            macs_pool;
 
        /* RX_MODE object */
@@ -1636,6 +1704,9 @@ struct bnx2x {
 
        /* priority to cos mapping */
        u8                                      prio_to_cos[8];
+
+       int fp_array_size;
+       u32 dump_preset_idx;
 };
 
 /* Tx queues may be less or equal to Rx queues */
@@ -1813,12 +1884,16 @@ int bnx2x_del_all_macs(struct bnx2x *bp,
 
 /* Init Function API  */
 void bnx2x_func_init(struct bnx2x *bp, struct bnx2x_func_init_params *p);
+void bnx2x_init_sb(struct bnx2x *bp, dma_addr_t mapping, int vfid,
+                   u8 vf_valid, int fw_sb_id, int igu_sb_id);
+u32 bnx2x_get_pretend_reg(struct bnx2x *bp);
 int bnx2x_get_gpio(struct bnx2x *bp, int gpio_num, u8 port);
 int bnx2x_set_gpio(struct bnx2x *bp, int gpio_num, u32 mode, u8 port);
 int bnx2x_set_mult_gpio(struct bnx2x *bp, u8 pins, u32 mode);
 int bnx2x_set_gpio_int(struct bnx2x *bp, int gpio_num, u32 mode, u8 port);
 void bnx2x_read_mf_cfg(struct bnx2x *bp);
 
+int bnx2x_pretend_func(struct bnx2x *bp, u16 pretend_func_val);
 
 /* dmae */
 void bnx2x_read_dmae(struct bnx2x *bp, u32 src_addr, u32 len32);
@@ -1830,6 +1905,18 @@ u32 bnx2x_dmae_opcode_clr_src_reset(u32 opcode);
 u32 bnx2x_dmae_opcode(struct bnx2x *bp, u8 src_type, u8 dst_type,
                      bool with_comp, u8 comp_type);
 
+void bnx2x_prep_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae,
+                              u8 src_type, u8 dst_type);
+int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae);
+void bnx2x_dp_dmae(struct bnx2x *bp, struct dmae_command *dmae, int msglvl);
+
+/* FLR related routines */
+u32 bnx2x_flr_clnup_poll_count(struct bnx2x *bp);
+void bnx2x_tx_hw_flushed(struct bnx2x *bp, u32 poll_count);
+int bnx2x_send_final_clnup(struct bnx2x *bp, u8 clnup_func, u32 poll_cnt);
+u8 bnx2x_is_pcie_pending(struct pci_dev *dev);
+int bnx2x_flr_clnup_poll_hw_counter(struct bnx2x *bp, u32 reg,
+                                   char *msg, u32 poll_cnt);
 
 void bnx2x_calc_fc_adv(struct bnx2x *bp);
 int bnx2x_sp_post(struct bnx2x *bp, int command, int cid,
@@ -1854,6 +1941,9 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
        return val;
 }
 
+void bnx2x_igu_clear_sb_gen(struct bnx2x *bp, u8 func, u8 idu_sb_id,
+                           bool is_pf);
+
 #define BNX2X_ILT_ZALLOC(x, y, size) \
        do { \
                x = dma_alloc_coherent(&bp->pdev->dev, size, y, GFP_KERNEL); \
@@ -1990,10 +2080,8 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
 #define BNX2X_LOOPBACK_FAILED          (BNX2X_MAC_LOOPBACK_FAILED | \
                                         BNX2X_PHY_LOOPBACK_FAILED)
 
-
 #define STROM_ASSERT_ARRAY_SIZE                50
 
-
 /* must be used on a CID before placing it on a HW ring */
 #define HW_CID(bp, x)                  ((BP_PORT(bp) << 23) | \
                                         (BP_VN(bp) << BNX2X_SWCID_SHIFT) | \
@@ -2024,7 +2112,6 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
 /* Memory of fairness algorithm . 2 cycles */
 #define FAIR_MEM                                       2
 
-
 #define ATTN_NIG_FOR_FUNC              (1L << 8)
 #define ATTN_SW_TIMER_4_FUNC           (1L << 9)
 #define GPIO_2_FUNC                    (1L << 10)
@@ -2067,6 +2154,7 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
                                (AEU_INPUTS_ATTN_BITS_TSDM_HW_INTERRUPT | \
                                 AEU_INPUTS_ATTN_BITS_TCM_HW_INTERRUPT | \
                                 AEU_INPUTS_ATTN_BITS_TSEMI_HW_INTERRUPT | \
+                                AEU_INPUTS_ATTN_BITS_BRB_HW_INTERRUPT | \
                                 AEU_INPUTS_ATTN_BITS_PBCLIENT_HW_INTERRUPT)
 #define HW_PRTY_ASSERT_SET_0   (AEU_INPUTS_ATTN_BITS_BRB_PARITY_ERROR | \
                                 AEU_INPUTS_ATTN_BITS_PARSER_PARITY_ERROR | \
@@ -2128,7 +2216,6 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
 
 #define MULTI_MASK                     0x7f
 
-
 #define DEF_USB_FUNC_OFF       offsetof(struct cstorm_def_status_block_u, func)
 #define DEF_CSB_FUNC_OFF       offsetof(struct cstorm_def_status_block_c, func)
 #define DEF_XSB_FUNC_OFF       offsetof(struct xstorm_def_status_block, func)
@@ -2156,18 +2243,6 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
                (&bp->def_status_blk->sp_sb.\
                                        index_values[HC_SP_INDEX_ETH_DEF_CONS])
 
-#define SET_FLAG(value, mask, flag) \
-       do {\
-               (value) &= ~(mask);\
-               (value) |= ((flag) << (mask##_SHIFT));\
-       } while (0)
-
-#define GET_FLAG(value, mask) \
-       (((value) & (mask)) >> (mask##_SHIFT))
-
-#define GET_FIELD(value, fname) \
-       (((value) & (fname##_MASK)) >> (fname##_SHIFT))
-
 #define CAM_IS_INVALID(x) \
        (GET_FLAG(x.flags, \
        MAC_CONFIGURATION_ENTRY_ACTION_TYPE) == \
@@ -2178,7 +2253,6 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
 #define MC_HASH_OFFSET(bp, i)          (BAR_TSTRORM_INTMEM + \
        TSTORM_APPROXIMATE_MATCH_MULTICAST_FILTERING_OFFSET(BP_FUNC(bp)) + i*4)
 
-
 #ifndef PXP2_REG_PXP2_INT_STS
 #define PXP2_REG_PXP2_INT_STS          PXP2_REG_PXP2_INT_STS_0
 #endif
@@ -2190,9 +2264,16 @@ static inline u32 reg_poll(struct bnx2x *bp, u32 reg, u32 expected, int ms,
 #define BNX2X_VPD_LEN                  128
 #define VENDOR_ID_LEN                  4
 
+#define VF_ACQUIRE_THRESH              3
+#define VF_ACQUIRE_MAC_FILTERS         1
+#define VF_ACQUIRE_MC_FILTERS          10
+
+#define GOOD_ME_REG(me_reg) (((me_reg) & ME_REG_VF_VALID) && \
+                           (!((me_reg) & ME_REG_VF_ERR)))
+int bnx2x_nic_load_analyze_req(struct bnx2x *bp, u32 load_code);
 /* Congestion management fairness mode */
-#define CMNG_FNS_NONE          0
-#define CMNG_FNS_MINMAX                1
+#define CMNG_FNS_NONE                  0
+#define CMNG_FNS_MINMAX                        1
 
 #define HC_SEG_ACCESS_DEF              0   /*Driver decision 0-3*/
 #define HC_SEG_ACCESS_ATTN             4
@@ -2205,10 +2286,9 @@ static const u32 dmae_reg_go_c[] = {
        DMAE_REG_GO_C12, DMAE_REG_GO_C13, DMAE_REG_GO_C14, DMAE_REG_GO_C15
 };
 
-void bnx2x_set_ethtool_ops(struct net_device *netdev);
+void bnx2x_set_ethtool_ops(struct bnx2x *bp, struct net_device *netdev);
 void bnx2x_notify_link_changed(struct bnx2x *bp);
 
-
 #define BNX2X_MF_SD_PROTOCOL(bp) \
        ((bp)->mf_config[BP_VN(bp)] & FUNC_MF_CFG_PROTOCOL_MASK)
 
@@ -2229,6 +2309,18 @@ void bnx2x_notify_link_changed(struct bnx2x *bp);
                                (BNX2X_IS_MF_SD_PROTOCOL_ISCSI(bp) || \
                                 BNX2X_IS_MF_SD_PROTOCOL_FCOE(bp)))
 
+#define SET_FLAG(value, mask, flag) \
+       do {\
+               (value) &= ~(mask);\
+               (value) |= ((flag) << (mask##_SHIFT));\
+       } while (0)
+
+#define GET_FLAG(value, mask) \
+       (((value) & (mask)) >> (mask##_SHIFT))
+
+#define GET_FIELD(value, fname) \
+       (((value) & (fname##_MASK)) >> (fname##_SHIFT))
+
 enum {
        SWITCH_UPDATE,
        AFEX_UPDATE,