root/usr/src/uts/common/io/qede/579xx/hsi/mcp/bdn.h
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, v.1,  (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://opensource.org/licenses/CDDL-1.0.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/

/*
* Copyright 2014-2017 Cavium, Inc. 
* The contents of this file are subject to the terms of the Common Development 
* and Distribution License, v.1,  (the "License").

* You may not use this file except in compliance with the License.

* You can obtain a copy of the License at available 
* at http://opensource.org/licenses/CDDL-1.0

* See the License for the specific language governing permissions and 
* limitations under the License.
*/

/****************************************************************************
 * Copyright(c) 2009-2015 Broadcom Corporation, all rights reserved
 * Proprietary and Confidential Information.
 *
 * This source file is the property of Broadcom Corporation, and
 * may not be copied or distributed in any isomorphic form without
 * the prior written consent of Broadcom Corporation.
 *
 * Name: bdn.h
 *
 * Description: BDN definitions
 *
 * Author: Yaniv Rosner
 *
 ****************************************************************************/

#ifndef BDN_H
#define BDN_H

#if 0
typedef u32 bdn_cfg;
#define BDN_CFG_SIZE_MASK               0x0000ffff
#define BDN_CFG_SIZE_OFFSET             0
#define BDN_CFG_STATE_MASK              0x00ff0000
#define BDN_CFG_STATE_OFFSET            16
        #define BDN_CFG_STATE_ACTIVE            0x00010000
        #define BDN_CFG_STATE_PENDING           0x00020000
        #define BDN_CFG_STATE_DEFAULT           0x00040000

#define SERVER_DESCRIPTION_MAX_LENGTH 64
struct server_descrip {
        u8 len;
        u8 str[SERVER_DESCRIPTION_MAX_LENGTH];
};

#define SERVER_UUID_LENGTH       36
struct server_uuid {
        u8 len;
        u8 str[SERVER_UUID_LENGTH];
};

#define GENERALIZED_TIME_MAX_SIZE 16 /* YYYYMMDDhhmmss.s */
struct generalized_time {
        u8 len;
        u8 time_str[GENERALIZED_TIME_MAX_SIZE];
};
#define CONNECTION_ID_LENGTH    16

#define SLOT_TYPE_NUM_MAX_LENGTH 32
struct slot_type_num {
        u8 len;
        u8 str[SLOT_TYPE_NUM_MAX_LENGTH];
};

#define ILO_MGMT_MAX_NUM_OF_ADDR 3
#define ILO_MGMT_ADDR_MAX_LENGTH 16
struct iLO_mgmt_addr {
        u8 num_of_add;
        u8 len_of_add[ILO_MGMT_MAX_NUM_OF_ADDR];
        u8 str[ILO_MGMT_MAX_NUM_OF_ADDR][ILO_MGMT_ADDR_MAX_LENGTH];
};

#define ENCLOSURE_ID_LENGTH      36
struct enclosure_id {
        u8 len;
        u8 str[ENCLOSURE_ID_LENGTH];
        u8 res[3];
};

struct base_dev_next_os {
        u8 reset_2_factory;
        u8 res[3];
};

struct base_dev_now {
        u8 one_view_config;
        u8 res[3];
};

struct base_dev {
        struct base_dev_now now;
        struct base_dev_next_os next_os;
};

struct server_info {
        u8 optional_bitmap;
#define SERVER_INFO_ILO_MGMT_VLAN_PRESENT       (1<<0)
#define SERVER_INFO_DATA_TIMESTAMP_PRESENT      (1<<1)
#define SERVER_INFO_ENCLOSURE_ID_PRESENT        (1<<2)
        struct server_descrip server_descrip;
        struct server_uuid server_uuid;
        struct slot_type_num slot_type_num;
        struct iLO_mgmt_addr iLO_mgmt_addr;
        u16 iLO_mgmt_vlan;
        struct generalized_time data_timestamp;
};

struct Codec_Info {
        u32 version;    /* Version of Codec */

        enum codec_location {
                e_None          = 0,
                e_Here          = 1,
                e_FRU_EEPROM    = 2
        } loc; /* DEFAULT e-None */
        u16 total_size; /* total size of Codec in bytes.Max size 32K (64K?)*/
        u16 num_msg_segments;   /* number of segments = total size / max message payload size */
};

#define MAX_CODEC_SIZE          0x8000
#define CODEC_SEGMENT_SIZE      0x400
#define NUMBER_OF_SEGMENTS (MAX_CODEC_SIZE/CODEC_SEGMENT_SIZE)
struct codec_t {
        u8 data[NUMBER_OF_SEGMENTS][CODEC_SEGMENT_SIZE];
};

struct bdn_netport_now {
        bdn_cfg hdr;
        u8 enable_port;
        u8 enable_diag;
        u8 num_pfs_min_bw;
        u8 num_pfs_max_bw;
        u8 min_bw[MCP_GLOB_FUNC_MAX]; 
        u8 max_bw[MCP_GLOB_FUNC_MAX]; 
};

struct bdn_netport_on_port_reset {
        bdn_cfg hdr;
        u32 link_config;
/* Same definitions as in PORT_HW_CFG_SPEED_CAPABILITY_D3_MASK */
#define BDN_LINK_CONFIG_ADVERTISED_SPEED_MASK   0x0000ffff
#define BDN_LINK_CONFIG_ADVERTISED_SPEED_SHIFT  0
/* Same definitions as PORT_FEATURE_FLOW_CONTROL_MASK */
#define BDN_LINK_CONFIG_FLOW_CONTROL_MASK       0x00070000
#define BDN_LINK_CONFIG_FLOW_CONTROL_SHIFT      16

#define BDN_LINK_CONFIG_PFC_ENABLED_MASK        0x00080000
#define BDN_LINK_CONFIG_PFC_ENABLED_SHIFT       19

#define BDN_LINK_CONFIG_EEE_ENABLED_MASK        0x00100000
#define BDN_LINK_CONFIG_EEE_ENABLED_SHIFT       20
};

struct bdn_netport_next_os_boot {
        bdn_cfg hdr;
        u8   num_pfs;
        u8   num_vf_per_pf[MCP_GLOB_FUNC_MAX];
};

struct bdn_netport_diag_ctrl {
        bdn_cfg hdr;
        u8  port_reset;
        u8  local_loopback;
        u8  remote_loopback;
        u8  rsrv[1];
};

struct bdn_netport {
        struct bdn_netport_now now;
        struct bdn_netport_on_port_reset on_port_reset; /* On Port Reset */
        struct bdn_netport_next_os_boot next_os_boot; /* Next OS Boot */
        struct bdn_netport_diag_ctrl diag_ctrl;
};

#define CONNECTION_ID_LEN 16
struct bdn_flexfunc_now {
        bdn_cfg hdr;
        u8 connection_id[CONNECTION_ID_LEN];
        u8 fnic_enabled;
        u8 rsrv[3];
};

struct bdn_flexfunc_next_os_boot {
        bdn_cfg hdr;
        u32 optional_bitmap;
#define FLEXFUNC_CFG_NEXT_OS_C2S_PCP_MAP_PRESENT        (1<<0)
#define FLEXFUNC_CFG_NEXT_OS_PORT_ASSIGNMENT_PRESENT    (1<<1)
#define FLEXFUNC_CFG_NEXT_OS_EMB_LAG_PRESENT            (1<<2)
        u8 mac_addr[6];
        u8 func_type;
        u8 boot_mode;
        u8 c_2_s_pcp_map[9]; /*  Maps O/S C-VLAN PCP value to S-VLAN PCP value for TX
                              * -- items 1-8 correspond to the O/S C-VLAN PCP values 0-7
                              * -- item 9 is the default if no C-VLAN present
                              * -- Values in these 9 bytes are the expected S-PCP values.
                              * -- If NetDev-Device-Module: EVB-Support.c-2-s-pcp-map = FALSE, then
                              * --     all values must be identical
                              * -- else, it supports C-PCP -> S-PCP mapping
                              */
        u16 mtu_size;
        u8 rsrv[1];
};

struct bdn_flex_func_diag_ctrl {
        bdn_cfg hdr;
        u8  enable_wol;
        u8  rsrv[3];
};

struct bdn_flex_func {
        struct bdn_flexfunc_now now;
        struct bdn_flexfunc_next_os_boot next_os_boot; /* Next OS Boot */
        struct bdn_flex_func_diag_ctrl diag_ctrl;
};

#define FC_NPIV_WWPN_SIZE 8
#define FC_NPIV_WWNN_SIZE 8
struct bdn_npiv_settings {
        u8 npiv_wwpn[FC_NPIV_WWPN_SIZE];
        u8 npiv_wwnn[FC_NPIV_WWNN_SIZE];
};

struct bdn_fc_npiv_cfg {
        /* hdr used internally by the MFW */
        u32 hdr;
        u32 num_of_npiv;
};

#define MAX_NUMBER_NPIV 64
struct bdn_fc_npiv_tbl {
        struct bdn_fc_npiv_cfg fc_npiv_cfg;
        struct bdn_npiv_settings settings[MAX_NUMBER_NPIV];
};


struct bdn_fc_npiv {
        struct bdn_fc_npiv_tbl now; /* Next device level reset */
};

struct bdn_iscsi_initiator_cfg {
        u32 optional_bitmap;
#define ISCSI_INITIATOR_ROUTE_PRESENT   (1<<0)
#define ISCSI_INITIATOR_PRIMARY_DNS_PRESENT     (1<<1)
#define ISCSI_INITIATOR_SECONDARY_DNS_PRESENT   (1<<2)
        u8 name[232];
        u8 ip_add[16];
        u8 netmask[16];
        u8 route[16];
        u8 primary_dns[16];
        u8 secondary_dns[16];
};

struct bdn_iscsi_target_params {
        u32 optional_bitmap;
#define ISCSI_TARGET_LLMNR_ENABLE_PRESENT       (1<<0)
#define ISCSI_TARGET_ROUTE_ADV_ENABLE_PRESENT   (1<<1)
#define ISCSI_TARGET_IPV2_PRESENT       (1<<2)
        u8 name[232];
        u32 lun;
        u8 ip_addr[16];
        u32 tcp_port;
        u8 ip_addr_2[16];
        u32 tcp_port_2;
        u32 llmnr_en;
        u32 route_adv_en;
};

struct bdn_iscsi_authentication {
        u32 optional_bitmap;
#define ISCSI_AUTH_CHAP_USERNAME_PRESENT        (1<<0)
#define ISCSI_AUTH_CHAP_SECRET_PRESENT  (1<<1)
#define ISCSI_AUTH_MUTUAL_USERNAME_PRESENT      (1<<2)
#define ISCSI_AUTH_MUTUAL_SECRET_PRESENT        (1<<3)
        u32 auth_meth;
        u8 username[232];
        u8 secret[16];
        u32 secret_len;
        u8 mutual_username[232];
        u8 mutual_secret[16];
        u32 mutual_secret_len;
};

struct bdn_iscsi_boot_cfg {
        u32 optional_bitmap;
#define ISCSI_CFG_CVID_PRESENT  (1<<0)
#define ISCSI_CFG_DNS_VIA_DHCP_PRESENT  (1<<1)
#define ISCSI_CFG_TARGET_INFO_DHCP_PRESENT      (1<<2)
#define ISCSI_CFG_INITIATOR_PRESENT     (1<<3)
#define ISCSI_CFG_TARGET_PRESENT        (1<<4)
#define ISCSI_CFG_DHCP_VENDOR_ID_PRESENT        (1<<5)
#define ISCSI_CFG_AUTH_PRESENT  (1<<6)
#define ISCSI_AUTH_HEADER_DIGEST_FLAG_PRESENT   (1<<7)
#define ISCSI_AUTH_DATA_DIGEST_FLAG_PRESENT     (1<<8)
        bdn_cfg hdr;
        u32 cvid;
        u32 ip_add_type;
        u32 dns_via_dhcp;
        u32 target_via_dhcp;
        u8 dhcp_vendor_id[32];
        u32 head_digest_flag_en;
        u32 data_digest_flag_en;
};

struct bdn_iscsi_boot_next_dlr {
        struct bdn_iscsi_boot_cfg cfg; /* Next device level reset */
        struct bdn_iscsi_initiator_cfg initiator_cfg;
        struct bdn_iscsi_target_params target_params;
        struct bdn_iscsi_authentication authentication;
};

struct bdn_iscsi_boot {
        struct bdn_iscsi_boot_next_dlr next_dlr; /* Next device level reset */
};

#define FCOE_TARGETS_WWPN_SIZE 8
#define FCOE_TARGETS_LUN_SIZE 8

struct bdn_fcoe_targets {
        u8 wwpn[FCOE_TARGETS_WWPN_SIZE];
        u8 lun_id[FCOE_TARGETS_LUN_SIZE];
};

struct bdn_fcoe_boot_cfg {
                u32 optional_bitmap;
#define FCOE_CFG_CVID_PRESENT   (1<<0)
#define FCOE_BASE_WWNN_PRESENT  (1<<1)
#define FCOE_WWPN_PRESENT       (1<<2)
        bdn_cfg hdr;
        u32 cvid;
        u8 base_wwnn[FCOE_TARGETS_WWPN_SIZE]; /* Host World wide name*/
        u8 wwpn[FCOE_TARGETS_WWPN_SIZE]; /* base wwpn */
        u32 num_of_fcoe_targets;
};

struct bdn_fcoe_boot_next_dlr {
        struct bdn_fcoe_boot_cfg cfg; /* Next device level reset */
        struct bdn_fcoe_targets fcoe_targets[8];
};

struct bdn_fcoe_boot {
        struct bdn_fcoe_boot_next_dlr next_dlr; /* Next device level reset */
};
#ifndef PF_NUM_MAX
#define PF_NUM_MAX 8
#endif
struct bdn_ncsi_next_dlr {
        bdn_cfg hdr;
        u32 ncsi_scid;
};

struct bdn_ncsi {
        struct bdn_ncsi_next_dlr bdn_ncsi_next_dlr;
};

// Rapid-Response-Poll-Module definition
#define MAX_CCT_SIZE                    64
#define VALID_RPP_SIGNATURE             0x69616853
struct rpp_sum_stc {
        u32 hash;
        u32 num;
};

struct digest_stc {
        u8 type;
        u8 inst;
        u16 digest;
};

struct bdn_rapid_respon_stc {
        u32 sig;
        struct rpp_sum_stc rpp_sum;
        u8 num_of_cct;
        u8 res[3];
        struct digest_stc cct[MAX_CCT_SIZE];
#ifdef CONFIG_SUPPORT_SCI
        struct digest_stc sci[MAX_CCT_SIZE];
#endif
};

struct bdn {
        u32 size;
        struct base_dev base_dev;
        struct server_info server_info;
        struct bdn_netport netport[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
        struct bdn_flex_func flexfunc[PF_NUM_MAX];
        struct bdn_fc_npiv fc_npiv[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
        struct bdn_iscsi_boot iscsi_boot[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
        struct bdn_fcoe_boot fcoe_boot[MCP_GLOB_PORT_MAX * MCP_GLOB_PATH_MAX];
        struct bdn_ncsi ncsi;
        struct bdn_rapid_respon_stc rpp_stc;
        struct enclosure_id serv_info_enc_id;
        u32 crc;
};

union bdn_image {
        struct bdn bdn;
        u8 rsrv[0x9000];
};

/* Expected BDN size is basically the offset of rsrv within the bdn structure */
#define BDN_SIZE (sizeof(struct bdn))
#define BDN_SERVER_INFO()                 (ASN1_P->bdn_addr + OFFSETOF(struct bdn, server_info))
#define BDN_BASE_DEV_NEXT_OS()             (ASN1_P->bdn_addr + OFFSETOF(struct bdn, base_dev.next_os))
#define BDN_BASE_DEV_NOW()                        (ASN1_P->bdn_addr + OFFSETOF(struct bdn, base_dev.now))
/* #define BDN_CODEC_INFO()               (ASN1_P->bdn_addr + OFFSETOF(struct bdn, codec_info)) */
/* #define BDN_CODEC_DATA()               (ASN1_P->bdn_addr + OFFSETOF(struct bdn, codec)) */
#define BDN_NETPORT_NOW(papo)             (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].now))
#define BDN_NETPORT_ON_PORT_RESET(papo)   (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].on_port_reset))
#define BDN_NETPORT_NEXT_OS_BOOT(papo)    (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].next_os_boot))
#define BDN_NETPORT_DIAG_CTRL(papo)       (ASN1_P->bdn_addr + OFFSETOF(struct bdn, netport[(papo.path << 1) + papo.port].diag_ctrl))
#define BDN_FLEXFUNC_NOW(pf_num)          (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].now))
#define BDN_FLEXFUNC_NEXT_OS_BOOT(pf_num) (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].next_os_boot))
#define BDN_FLEXFUNC_DIAG_CTRL(pf_num)    (ASN1_P->bdn_addr + OFFSETOF(struct bdn, flexfunc[pf_num].diag_ctrl))
#define BDN_FC_NPIV_NOW(papo)             (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fc_npiv[(papo.path << 1) + papo.port].now))
#define BDN_FC_NPIV_NOW_CFG(papo)                 (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fc_npiv[(papo.path << 1) + papo.port].now.fc_npiv_cfg))
#define BDN_FC_NPIV_NOW_SETTINGS(papo, idx)               (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fc_npiv[(papo.path << 1) + papo.port].now.settings[idx]))
#define BDN_ISCSI_BOOT_NEXT_DLR_CFG(papo)         (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.cfg))
#define BDN_ISCSI_BOOT_NEXT_DLR_INITIATOR(papo)   (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.initiator_cfg))
#define BDN_ISCSI_BOOT_NEXT_DLR_TARGET(papo)      (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.target_params))
#define BDN_ISCSI_BOOT_NEXT_DLR_AUTHENTICATION(papo)      (ASN1_P->bdn_addr + OFFSETOF(struct bdn, iscsi_boot[(papo.path << 1) + papo.port].next_dlr.authentication))
#define BDN_FCOE_BOOT_NEXT_DLR_CFG(papo)          (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fcoe_boot[(papo.path << 1) + papo.port].next_dlr.cfg))
#define BDN_FCOE_BOOT_NEXT_DLR_TARGET(papo, idx)         (ASN1_P->bdn_addr + OFFSETOF(struct bdn, fcoe_boot[(papo.path << 1) + papo.port].next_dlr.fcoe_targets[idx]))
#define BDN_NCSI_NEXT_DLR()       (ASN1_P->bdn_addr + OFFSETOF(struct bdn, ncsi.bdn_ncsi_next_dlr))
#define BDN_RAPID_RESPONSE                (ASN1_P->bdn_addr + OFFSETOF(struct bdn, rpp_stc))
#define BDN_SERV_INFO_ENC_ID()            (ASN1_P->bdn_addr + OFFSETOF(struct bdn, serv_info_enc_id))
#define BDN_CRC()                         (ASN1_P->bdn_addr + sizeof(union bdn_image))
#endif

#define BDN_SIZE_IMAGE_MAX              (0x9000)

#define BDN_SIZE_OF_MAC                 (6)
#define BDN_SIZE_OF_WWN                 (8)
#define BDN_SIZE_OF_IPV4                (4)
#define BDN_SIZE_OF_IPV6                (16)
#define BDN_DIR_MAX                     (8)
#define BDN_SIZE_OF_PF_PER_PORT         (16)
#define BDN_SIZE_OF_CONNECTION_ID       (16)
#define BDN_SIZE_OF_C2SPCP_MAP          (9)
#define BDN_SIZE_OF_ISCSI_NAME          (236)
#define BDN_SIZE_OF_ISCSI_SEC           (16)
#define BDN_SIZE_OF_FCOE_TARGETS        (8)
#define BDN_SIZE_OF_FCOE_LUN_ID         (8)
#define BDN_SIZE_OF_DHCP_VENDOR_ID      (32)
#define BDN_SIZE_OF_SERV_DESC           (64)
#define BDN_SIZE_OF_SERV_UUID           (36)
#define BDN_SIZE_OF_SERV_SLOT           (32)
#define BDN_NUM_OF_ILO_ADDR             (3)
#define BDN_SIZE_OF_ILO_ADDR            (16)
#define BDN_SIZE_OF_SERV_TIME           (20)
#define BDN_SIZE_OF_ENCLOSURE_ID        (36)
#define BDN_CCT_MAX_SIZE                (64)
#define BDN_SCI_MAX_SIZE                (64)

struct bdn_dir {
        u16 offset;
        u16 length;
};

#define BDN_DIR_CFG_NOW                 (0)
#define BDN_DIR_CFG_NEXT_FLR            (1)
#define BDN_DIR_CFG_PORT_RESET          (2)
#define BDN_DIR_CFG_NEXT_DLR            (3)
#define BDN_DIR_CFG_NEXT_OS_BOOT        (4)
#define BDN_DIR_CFG_NEXT_PWR_CYC        (5)
#define BDN_DIR_CFG_DIAG_CTRL           (6)

typedef u32 bdn_cfg_state;
#define BDN_CFG_STATE_MASK              0x000000ff
#define BDN_CFG_STATE_OFFSET            0
#define BDN_CFG_STATE_NA                0x00000000
#define BDN_CFG_STATE_ACTIVE            0x00000001
#define BDN_CFG_STATE_PENDING           0x00000002
#define BDN_CFG_STATE_DEFAULT           0x00000004

#define BDN_CFG_STATE_IS(x, y)          ((((x)->state & BDN_CFG_STATE_MASK) >> BDN_CFG_STATE_OFFSET) == BDN_CFG_STATE_##y)
#define BDN_OPTIONAL_SET(x, y)          (x)->optional |= (1 << (y))
#define BDN_OPTIONAL_CHECK(x, y)        ((x)->optional & (1 << (y)))

/*.************************* Base-Device-Module************************* */
struct bdn_base_now {
        bdn_cfg_state   state;
        u32             optional;

        u32     rsv:24,
                dci_mgmt:8;

        u32     rsrv;
};

struct bdn_base_osb {
        bdn_cfg_state   state;
        u32             optional;

        u32     rsv:31,
                reset_2_factory:1;

        u32     rsrv;
};

struct bdn_base {
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_base_now     now;
        struct bdn_base_osb     osb;    /* Next os reboot */
};

/*.************************* Network-Device-Module********************** */
struct bdn_nport_now {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_NETPORT_NOW_OPT_MIN_BW              (0)
#define BDN_NETPORT_NOW_OPT_MAX_BW              (1)

        u32     rsv:14,
                enable_port:1,
                enable_diag:1,
                num_pfs_min_bw:8,
                num_pfs_max_bw:8;

        u8      min_bw[BDN_SIZE_OF_PF_PER_PORT];
        u8      max_bw[BDN_SIZE_OF_PF_PER_PORT];

        u32     rsrv;
};

struct bdn_nport_plr {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_NETPORT_RESET_OPT_ADV_SPEED         (0)
#define BDN_NETPORT_RESET_OPT_FLOW_CTRL         (1)
#define BDN_NETPORT_RESET_OPT_EEE_ENABLE        (2)

        u32     rsv:11,
                eee_enable:1,
                flow_ctrl:4,
                adv_speed:16;

        u32     rsrv;
};

struct bdn_nport_osb {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_NETPORT_BOOT_OPT_NUM_VF             (0)
#define BDN_NETPORT_BOOT_OPT_NPIV_ENABLE        (1)

        u32     rsv:23,
                npiv_enable:1,
                num_pfs:8;
        u8      num_vfs[BDN_SIZE_OF_PF_PER_PORT];

        u32     rsrv;
};

struct bdn_nport_dgn {
        bdn_cfg_state   state;
        u32             optional;

        u32     rsv:29,
                port_reset:1,
                local_loopback:1,
                remote_loopback:1;

        u32     rsrv;
};

struct bdn_nport {
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_nport_now    now;
        struct bdn_nport_plr    plr;    /* Next device level reset */
        struct bdn_nport_osb    osb;    /* Next os reboot */
        struct bdn_nport_dgn    dgn;
};

/* ************************* FlexFunc-Module************************* */
struct bdn_flex_now {
        bdn_cfg_state   state;
        u32             optional;

        u8      connection_id[BDN_SIZE_OF_CONNECTION_ID];
        u32     rsv:31,
                fnic_enabled:1;

        u32     rsrv;
};

struct bdn_flex_dlr {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_FLEXFUNC_DLR_OPT_FC_WWNN            (0)
#define BDN_FLEXFUNC_DLR_OPT_FC_WWPN            (1)

        u8      fc_wwnn[BDN_SIZE_OF_WWN];
        u8      fc_wwpn[BDN_SIZE_OF_WWN];

        u32     rsrv[2];
};

struct bdn_flex_osb {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_FLEXFUNC_BOOT_OPT_C2SPCP_MAP        (0)
#define BDN_FLEXFUNC_BOOT_OPT_PORT_ASSIGNMENT   (1)
#define BDN_FLEXFUNC_BOOT_OPT_EMB_LAG           (2)
#define BDN_FLEXFUNC_BOOT_OPT_MTU_SIZE          (3)
#define BDN_FLEXFUNC_BOOT_OPT_OVER_MTU          (4)

        u8      mac_addr[BDN_SIZE_OF_MAC];
        u8      c_2_s_pcp_map[BDN_SIZE_OF_C2SPCP_MAP];
        /*  Maps O/S C-VLAN PCP value to S-VLAN PCP value for TX
         * -- items 1-8 correspond to the O/S C-VLAN PCP values 0-7
         * -- item 9 is the default if no C-VLAN present
         * -- Values in these 9 bytes are the expected S-PCP values.
         * -- If NetDev-Device-Module: EVB-Support.c-2-s-pcp-map = FALSE, then
         * --     all values must be identical
         * -- else, it supports C-PCP -> S-PCP mapping
         */
        u8      func_type;
        u32     rsv:2,
                valid_mac_addr:1,
                override_mtu:1,
                boot_mode:4,
                port_assign:4,
                emb_lag:4,
                mtu_size:16;

        u32     rsrv;
};

struct bdn_flex_dgn {
        bdn_cfg_state   state;
        u32             optional;

        u32     rsv:31,
                enable_wol:1;

        u32     rsrv;
};

struct bdn_flex {
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_flex_now     now;
        struct bdn_flex_dlr     dlr;    /* Next device level reset */
        struct bdn_flex_osb     osb;    /* Next os reboot */
        struct bdn_flex_dgn     dgn;
};

/* ************************* FC-NPIV-Module************************* */
struct bdn_npiv_dlr {
        bdn_cfg_state   state;
        u32             optional;

        struct dci_fc_npiv_tbl  npiv_tbl;
};

struct bdn_npiv {
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_npiv_dlr     dlr;    /* Next device level reset */
};

/* ************************* iSCSI-Boot-Module************************* */
struct bdn_iscsi_init {
        u32     rsv:21,
                opt_route:1,
                opt_pri_dns:1,
                opt_sec_dns:1,
                name_size:8;

        u8      ip_add[BDN_SIZE_OF_IPV6];
        u8      netmask[BDN_SIZE_OF_IPV6];
        u8      route[BDN_SIZE_OF_IPV6];
        u8      primary_dns[BDN_SIZE_OF_IPV6];
        u8      secondary_dns[BDN_SIZE_OF_IPV6];
        u8      name[BDN_SIZE_OF_ISCSI_NAME];
};

struct bdn_iscsi_trgt {
        u32 optional;
#define BDN_ISCSI_TARGET_OPT_LLMNR_ENABLE       (0)
#define BDN_ISCSI_TARGET_OPT_ROUTE_ADV_ENABLE   (1)

        u32     rsv:21,
                opt_ip2:1,
                llmnr_en:1,
                route_adv_en:1,
                name_size:8;

        u32     lun;
        u16     tcpport;
        u16     tcpport2;

        u8      ip[BDN_SIZE_OF_IPV6];
        u8      ip2[BDN_SIZE_OF_IPV6];
        u8      name[BDN_SIZE_OF_ISCSI_NAME];

        u32     rsrv;
};

struct bdn_iscsi_auth {
        u32     rsv:2,
                c_sec_size:6,
                auth_method:2,
                m_sec_size:6,
                c_name_size:8,
                m_name_size:8;

        u8      chap_username[BDN_SIZE_OF_ISCSI_NAME];
        u8      chap_secret[BDN_SIZE_OF_ISCSI_SEC];
        u8      mutual_username[BDN_SIZE_OF_ISCSI_NAME];
        u8      mutual_secret[BDN_SIZE_OF_ISCSI_SEC];

        u32     rsrv;
};

struct bdn_iboot_dlr {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_ISCSI_BOOT_OPT_CVID                 (0)
#define BDN_ISCSI_BOOT_OPT_INITIATOR            (1)
#define BDN_ISCSI_BOOT_OPT_TARGET               (2)
#define BDN_ISCSI_BOOT_OPT_AUTH                 (3)
#define BDN_ISCSI_BOOT_OPT_HEAD_DIGEST_EN       (4)
#define BDN_ISCSI_BOOT_OPT_DATA_DIGEST_EN       (5)

        u32     rsv:4,
                initiator_dhcp:1,
                target_dhcp:1,
                head_digest_en:1,
                data_digest_en:1,
                dhcp_vendor_id_size:8,
                ip_type:4,
                cvid:12;

        u8      dhcp_vendor_id[BDN_SIZE_OF_DHCP_VENDOR_ID];

        u32     rsrv;

        struct bdn_iscsi_init   init;
        struct bdn_iscsi_trgt   trgt;
        struct bdn_iscsi_auth   auth;
};

struct bdn_iboot {
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_iboot_dlr    dlr;    /* Next device level reset */
};

/* ************************* FCoE-Boot-Module************************* */
struct bdn_fcoe_trgt {
        u8 wwpn[BDN_SIZE_OF_WWN];
        u8 lunid[BDN_SIZE_OF_FCOE_LUN_ID];
};

struct bdn_fboot_dlr {
        bdn_cfg_state   state;
        u32             optional;

        u32     rsv:24,
                num_of_targets:4;

        struct bdn_fcoe_trgt trgt[BDN_SIZE_OF_FCOE_TARGETS];

        u32     rsrv;
};

struct bdn_fboot {
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_fboot_dlr    dlr;     /* Next device level reset */
};

/* *************************    NCSI-Module    ************************* */
struct bdn_ncsi_dlr {
        bdn_cfg_state   state;
        u32             optional;

        u32     ncsi_scid:12,
                rsv:20;
        u32     rsv2;
};

struct bdn_ncsi {
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_ncsi_dlr     dlr;
};

/* ************************* Server-Info-Module************************* */
struct bdn_serv {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_SERV_INFO_OPT_ILO_VLAN      (0)
#define BDN_SERV_INFO_OPT_TIMESTAMP     (1)
#define BDN_SERV_INFO_OPT_ENCLOSURE     (2)

        u16 ilo_vlan;
        u8 serv_desc_size;
        u8 serv_uuid_size;
        u8 slot_info_size;
        u8 timestamp_size;
        u8 enclosure_size;
        u8 ilo_addr_num;
        u8 ilo_addr_size[BDN_NUM_OF_ILO_ADDR];
        u8 crc8; /* the crc8 from last put command */

        u8 serv_desc[BDN_SIZE_OF_SERV_DESC];
        u8 serv_uuid[BDN_SIZE_OF_SERV_UUID];
        u8 slot_info[BDN_SIZE_OF_SERV_SLOT];
        u8 ilo_addr[BDN_NUM_OF_ILO_ADDR][BDN_SIZE_OF_ILO_ADDR];
        u8 timestamp[BDN_SIZE_OF_SERV_TIME];
        u8 enclosure[BDN_SIZE_OF_ENCLOSURE_ID];
};

/* ********************* Rapid-Response-Poll-Module ******************** */
struct bdn_rrp_digest {
        u8      object;
        u8      index;  /* the index from zero */
        u16     digest;
};

struct bdn_rrp {
        bdn_cfg_state   state;
        u32             optional;
#define BDN_RRP_OPT_CCT         (0)
#define BDN_RRP_OPT_SCI         (1)

        u32     hash;
        u32     num_cct:8,
                num_sci:8,
                rsv:16;

        struct bdn_rrp_digest cct[BDN_CCT_MAX_SIZE];
        struct bdn_rrp_digest sci[BDN_SCI_MAX_SIZE];
};

/* 0x20 bytes */
struct bdn_head {
        u32     signature;
#define BDN_HEAD_SIGN_SHIFT             (8)
#define BDN_HEAD_SIGN_MASK              (0xffffff << BDN_HEAD_SIGN_SHIFT)
#define BDN_HEAD_SIGN_VALID             (((u32)'B' << 16) | ((u32)'D' << 8) | 'N')
#define BDN_HEAD_SIGN_VER_SHIFT         (0)
#define BDN_HEAD_SIGN_VER_MASK          (0xff << BDN_HEAD_SIGN_VER_SHIFT)
#define BDN_HEAD_SIGN_VER_CURRENT       (1)
#define BDN_HEAD_SIGN_CURRENT           ((BDN_HEAD_SIGN_VALID << BDN_HEAD_SIGN_SHIFT) | (BDN_HEAD_SIGN_VER_CURRENT << BDN_HEAD_SIGN_VER_SHIFT))

        u32     num_port:8,
                num_func:8,
                rsrv_bit:16;

        struct bdn_dir  glob;
        struct bdn_dir  port;
        struct bdn_dir  func;

        u32     rsrv[3];
};

struct bdn_glob {
#define BDN_DIR_GLOB_SERV_INFO          0
#define BDN_DIR_GLOB_BASE_DEV           1
#define BDN_DIR_GLOB_NCSI               2
#define BDN_DIR_GLOB_RRP                3
        struct bdn_dir  dir[BDN_DIR_MAX];

        struct bdn_serv serv;
        struct bdn_base base;
        struct bdn_ncsi ncsi;
        struct bdn_rrp  rrp;

        u32     rsrv[8];
};

struct bdn_port {
#define BDN_DIR_PORT_NETPORT            0
#define BDN_DIR_PORT_FC_NPIV            1
#define BDN_DIR_PORT_ISCSI_BOOT         2
#define BDN_DIR_PORT_FCOE_BOOT          3
        struct bdn_dir          dir[BDN_DIR_MAX];

        struct bdn_nport        port;
        struct bdn_npiv         npiv;
        struct bdn_iboot        iboot;
        struct bdn_fboot        fboot;

};

struct bdn_func {
#define BDN_DIR_FUNC_FLEX_FUNC          0
        struct bdn_dir  dir[BDN_DIR_MAX];

        struct bdn_flex flex;

        u32     rsrv[4];
};

struct bdn {
        struct bdn_head head;
        struct bdn_glob glob;
        struct bdn_port port[MCP_GLOB_PORT_MAX];
        struct bdn_func func[MCP_GLOB_FUNC_MAX];
};

#define BDN_OFFSET_GLOB(x)              (OFFSETOF(struct bdn, glob.x) & 0xffff)
#define BDN_OFFSET_BASE(x)              (OFFSETOF(struct bdn, glob.base.x) & 0xffff)
#define BDN_OFFSET_NCSI(x)              (OFFSETOF(struct bdn, glob.ncsi.x) & 0xffff)
#define BDN_OFFSET_PORT(x, y)           (OFFSETOF(struct bdn, port[(x)].y) & 0xffff)
#define BDN_OFFSET_NPORT(x, y)          (OFFSETOF(struct bdn, port[(x)].port.y) & 0xffff)
#define BDN_OFFSET_NPIV(x, y)           (OFFSETOF(struct bdn, port[(x)].npiv.y) & 0xffff)
#define BDN_OFFSET_IBOOT(x, y)          (OFFSETOF(struct bdn, port[(x)].iboot.y) & 0xffff)
#define BDN_OFFSET_FBOOT(x, y)          (OFFSETOF(struct bdn, port[(x)].fboot.y) & 0xffff)
#define BDN_OFFSET_FUNC(x, y)           (OFFSETOF(struct bdn, func[(x)].y) & 0xffff)
#define BDN_OFFSET_FLEX(x, y)           (OFFSETOF(struct bdn, func[(x)].flex.y) & 0xffff)
#define BDN_OFFSET_CRC                  (BDN_SIZE_IMAGE_MAX - 4)

union bdn_image {
        struct bdn bdn;
        u8_t rsrv[BDN_SIZE_IMAGE_MAX];
};

#endif /* BDN_H */