#ifndef NCSI_BASIC_TYPES_H
#define NCSI_BASIC_TYPES_H
#include "bcmtype.h"
#include "license.h"
#include "mcp_shmem.h"
#define NCSI_TYPES_INTERFACE_REV 0x0010
#define PATH_SUPPORTED 2
#define NCSI_MAC_ADDRESS_MAX 4
#define NCSI_VLAN_TAG_COUNT 2
#define NCSI_HEADER_REV (0x01)
#define INTEGRATED_WITH_BOOTCODE
typedef u8_t* pu8_t;
typedef u16_t* pu16_t;
typedef u32_t* pu32_t;
typedef void* pVoid_t;
#define NCSI_TYPES_MILLISEC_TO_MICROSEC_MULTIPLIER 1000
#define NCSI_TYPES_CHANNEL_ID_MASK 0x000000C0
#define NCSI_TYPES_MAGIC_NUMBER 0xA5A5A5A5
#define NCSI_LANDMARK_SIGNATURE 0x01234567
#define NCSI_TYPES_MAX_MCP_FTQ_DEPTH_OS_PRESENT (5 << 12)
#define NCSI_TYPES_MAX_MCP_FTQ_DEPTH_OS_ABSENT (32 << 12)
#define NCSI_TYPES_MAX_L2_PKT_SIZE 1514
#define NCSI_TYPES_MAX_L2_PKT_SIZE_PLUS_VLAN 1518
#define NCSI_TYPES_MIN_L2_PKT_SIZE 60
#define UMP_BCNT_FRAGMENT_AND_ALIGNMENT_ADJUSTMENT 5
#define SIZEOF_CRC 4
#define SIZEOF_MAC_ADDRESS 6
#define SUCCESS 0
#define FAILURE 1
#define STATUS_OK 0
#define STATUS_ERROR 1
#define NCSI_TYPES_MIN_UMP_CMD_RSP_FRAME_SIZE 60
#define MDIO_PHY_ADDR(X) ( ( (X) & 0x1F ) << 21 )
#define MDIO_PHY_REG(X) ( ( (X) & 0x1F ) << 16 )
typedef struct NcsiVersion
#if defined (BIG_ENDIAN)
{
u8_t Major;
u8_t Minor;
u8_t Update;
u8_t Alpha1;
u8_t Reserved0;
u8_t Reserved1;
u8_t Reserved2;
u8_t Alpha2;
}NcsiVersion_t;
#elif defined (LITTLE_ENDIAN)
{
u8_t Alpha1;
u8_t Update;
u8_t Minor;
u8_t Major;
u8_t Alpha2;
u8_t Reserved2;
u8_t Reserved1;
u8_t Reserved0;
}NcsiVersion_t;
#endif
typedef struct NcsiMacAddr
#if defined (BIG_ENDIAN)
{
u16_t High;
u16_t LowHigh;
u16_t LowLow;
} NcsiMacAddr_t;
#elif defined (LITTLE_ENDIAN)
{
u16_t LowHigh;
u16_t High;
u16_t LowLow;
u8_t NcsiMacAddr_padding_16;
u8_t NcsiMacAddr_padding_24;
} NcsiMacAddr_t;
#endif
typedef struct UmpMacAddr
{
u32_t High;
u32_t Low;
} UmpMacAddr_t;
typedef UmpMacAddr_t* pUmpMacAddr_t;
typedef struct MacAddrConfig
{
u32_t IsEnabled;
UmpMacAddr_t Addr;
} MacAddrConfig_t;
typedef struct UmpVlan
#if defined (BIG_ENDIAN)
{
u16_t IsEnabled;
u16_t TagControlInfo ;
#define VLAN_TAG_VID_FIELD_MASK (0x0FFF << 0)
#define VLAN_TAG_PRI_FIELD_MASK (0xE000 << 0)
#define VLAN_TAG_CFI_FIELD_MASK (0x1000 << 0)
} UmpVlan_t;
#elif defined (LITTLE_ENDIAN)
{
u16_t TagControlInfo ;
u16_t IsEnabled;
#define VLAN_TAG_VID_FIELD_MASK (0x0FFF << 0)
#define VLAN_TAG_PRI_FIELD_MASK (0xE000 << 0)
#define VLAN_TAG_CFI_FIELD_MASK (0x1000 << 0)
} UmpVlan_t;
#endif
typedef UmpVlan_t* pVlanTag_t;
typedef struct PktErrorStat_t
{
u32_t EgressPktsDroppedNoSaMatch;
u32_t IngressPktsDroppedVlanMis;
u32_t CmdsDroppedSizeErr;
u32_t CmdsDroppedChanPkgIdErr;
u32_t CmdsDroppedNcsiHdrRevErr;
} PktErrorStat_t;
typedef struct UmpDebugData
#if defined (BIG_ENDIAN)
{
u32_t LandMark;
u32_t GlobalResetCount;
u32_t NcsiCmdDataAddr;
u32_t UmpRxDataAddr;
u32_t UmpTxDataAddr;
u16_t TxDescErrCount;
u16_t LoopBackPktCount;
} UmpDebugData_t;
#elif defined (LITTLE_ENDIAN)
{
u32_t LandMark;
u32_t GlobalResetCount;
u32_t NcsiCmdDataAddr;
u32_t UmpRxDataAddr;
u32_t UmpTxDataAddr;
u16_t LoopBackPktCount;
u16_t TxDescErrCount;
} UmpDebugData_t;
#endif
typedef UmpDebugData_t * UmpDebugDataPtr_t;
typedef struct CmdPktCnt
{
u32_t Rx;
u32_t Dropped;
u32_t CmdTypeErrs;
u32_t ChkSumErrs;
u64_t TotalRxPkts;
u64_t TotalTxPkts;
u64_t TotalRxBytes;
u64_t TotalTxBytes;
u32_t AensSent;
} CmdPktCnt_t;
typedef struct EgressPktCnt
{
u32_t TotalPktHigh;
u32_t TotalPktLow;
u32_t TotalDropped;
u32_t ChannelStateErr;
u32_t UnderSized;
u32_t OverSized;
} EgressPktCnt_t;
typedef struct IngressPktCnt
{
u32_t TotalPkt;
u32_t TotalDropped;
u32_t OverSizedErr;
u32_t UnderSizedErr;
u32_t ChannelStateErr;
} IngressPktCnt_t;
typedef struct SmbusErrCnt
#if defined (BIG_ENDIAN)
{
u8_t slave_rd_event;
u8_t slave_start_busy;
u8_t slave_arp_event;
u8_t master_rx_event;
u8_t slave_tx_underrun;
u8_t slave_rx_threshold_hit;
u8_t slave_rx_fifo_full;
u8_t master_tx_underrun;
u8_t master_rx_threshold_hit;
u8_t master_rx_fifo_full;
u8_t fifo_overflow;
u8_t transaction_error;
u8_t pec_error;
u8_t illegal_pkt_len;
u8_t lost_arbitration;
u8_t slave_off_line;
u8_t slave_busy;
u8_t slave_bus_timeout;
u8_t master_busy_timeout;
u8_t unused;
} SmbusErrCnt_t;
#elif defined (LITTLE_ENDIAN)
{
u8_t master_rx_event;
u8_t slave_arp_event;
u8_t slave_start_busy;
u8_t slave_rd_event;
u8_t master_tx_underrun;
u8_t slave_rx_threshold_hit;
u8_t slave_rx_fifo_full;
u8_t slave_tx_underrun;
u8_t transaction_error;
u8_t fifo_overflow;
u8_t master_rx_fifo_full;
u8_t master_rx_threshold_hit;
u8_t slave_off_line;
u8_t lost_arbitration;
u8_t illegal_pkt_len;
u8_t pec_error;
u8_t unused;
u8_t master_busy_timeout;
u8_t slave_bus_timeout;
u8_t slave_busy;
} SmbusErrCnt_t;
#endif
typedef struct UmpStatistics
{
CmdPktCnt_t NcsiCmdPktCnts;
union
{
EgressPktCnt_t BMC2MCP;
SmbusErrCnt_t smbus_err_cnts;
};
IngressPktCnt_t MCP2BMC;
} UmpStatistics_t;
typedef struct ChannelState
{
u32_t Ready :1;
u32_t InitialState :1;
u32_t TxPtEnabled :1;
u32_t RxPtEnabled :1;
} ChannelState_t;
typedef struct UmpPortConfigFlag
#if defined (BIG_ENDIAN)
{
u32_t :11;
u32_t NetwBmcPassthruDisabled :1;
u32_t VntagEnabled :1;
u32_t InvalidHiGigLen :1;
u32_t PerformReset :1;
u32_t LinkStateChange :1;
u32_t DriverStateChange :1;
u32_t DriverPresent :1;
u32_t ChannelSpecificReset :1;
u32_t Exceed375MaFlag :1;
u32_t OsPresentFlag :1;
u32_t HostBmcPassthruEnabled :1;
u32_t ResetPending :1;
u32_t VlanEnabled :1;
u32_t LinkForcedByBmc :1;
u32_t HiGigMode :1;
u32_t BroadcastFilterEnabled :1;
u32_t MulticastFilterEnabled :1;
u32_t InitialState :1;
u32_t Ready :1;
u32_t EgressPassThruEnabled :1;
u32_t ChannelEnabled :1;
} UmpPortConfigFlag_t;
#elif defined (LITTLE_ENDIAN)
{
u32_t ChannelEnabled :1;
u32_t EgressPassThruEnabled :1;
u32_t Ready :1;
u32_t InitialState :1;
u32_t MulticastFilterEnabled :1;
u32_t BroadcastFilterEnabled :1;
u32_t HiGigMode :1;
u32_t LinkForcedByBmc :1;
u32_t VlanEnabled :1;
u32_t ResetPending :1;
u32_t HostBmcPassthruEnabled :1;
u32_t OsPresentFlag :1;
u32_t Exceed375MaFlag :1;
u32_t ChannelSpecificReset :1;
u32_t DriverPresent :1;
u32_t DriverStateChange :1;
u32_t LinkStateChange :1;
u32_t PerformReset :1;
u32_t InvalidHiGigLen :1;
u32_t VntagEnabled :1;
u32_t NetwBmcPassthruDisabled :1;
u32_t :11;
} UmpPortConfigFlag_t;
#endif
typedef struct UmpPortConfig
#if defined (BIG_ENDIAN)
{
UmpPortConfigFlag_t Flags;
u32_t ResetCount : 12;
u32_t McId : 4;
u32_t AenConfig : 4;
u32_t BroadcastFilter : 4;
u32_t MulticastFilter : 4;
u32_t VlanConfiguration : 4;
u32_t LinkSettingsFromBmc;
u32_t OemLinkSettingsFromBmc;
MacAddrConfig_t MacAddr[NCSI_MAC_ADDRESS_MAX];
UmpVlan_t VlanTag[NCSI_VLAN_TAG_COUNT];
u32_t LinkStatus;
} UmpPortConfig_t;
#elif defined (LITTLE_ENDIAN)
{
UmpPortConfigFlag_t Flags;
u32_t VlanConfiguration : 4;
u32_t MulticastFilter : 4;
u32_t BroadcastFilter : 4;
u32_t AenConfig : 4;
u32_t McId : 4;
u32_t ResetCount : 12;
u32_t LinkSettingsFromBmc;
u32_t OemLinkSettingsFromBmc;
MacAddrConfig_t MacAddr[NCSI_MAC_ADDRESS_MAX];
UmpVlan_t VlanTag[NCSI_VLAN_TAG_COUNT];
u32_t LinkStatus;
} UmpPortConfig_t;
#endif
typedef struct
#if defined (BIG_ENDIAN)
{
u8_t vif_id;
u8_t allowed_priorities;
u16_t default_vlan_tag;
}vntag_cfg_t;
#elif defined (LITTLE_ENDIAN)
{
u16_t default_vlan_tag;
u8_t allowed_priorities;
u8_t vif_id;
}vntag_cfg_t;
#endif
typedef struct NcsiChannelData
{
UmpStatistics_t Statistics;
UmpPortConfig_t Config;
vntag_cfg_t VntagCfg;
} NcsiChannelData_t;
typedef struct SrcMacAddr
{
u32_t chnl : 8;
u32_t addr_hi : 24;
u32_t addr_lo;
} SrcMacAddr_t;
#define HOST_SRC_ADDR_HIST_SIZE 8
typedef struct HostSrcMacBuff
{
u32_t current_index;
SrcMacAddr_t host_addr[HOST_SRC_ADDR_HIST_SIZE];
} HostSrcMacBuff_t;
#if defined (BIG_ENDIAN)
typedef NcsiChannelData_t* pNcsiChannelData_t;
#else
typedef u32_t pNcsiChannelData_t;
#endif
typedef struct PackageState
#if defined (BIG_ENDIAN)
{
u32_t :12;
u32_t DellOemCmdSupport :1;
u32_t :1;
u32_t PrevResetType :8;
#define NCSI_RESET_TYPE_CHANNEL0_RESET 0
#define NCSI_RESET_TYPE_CHANNEL1_RESET 1
#define NCSI_RESET_TYPE_COLD_START 0xAA
#define NCSI_RESET_TYPE_WARM_START 0xBB
u32_t ControlPacketSeen :1;
u32_t LoopBackPktActive :1;
u32_t LoopBackEnabled :1;
u32_t SmbusMode :1;
u32_t SmbusFix :1;
u32_t Ready :1;
u32_t Selected :1;
u32_t DeselectPending :1;
u32_t HwArbEnabled :1;
u32_t FcDisabled :1;
} PackageState_t;
#elif defined (LITTLE_ENDIAN)
{
u32_t FcDisabled :1;
u32_t HwArbEnabled :1;
u32_t DeselectPending :1;
u32_t Selected :1;
u32_t Ready :1;
u32_t SmbusFix :1;
u32_t SmbusMode :1;
u32_t LoopBackEnabled :1;
u32_t LoopBackPktActive :1;
u32_t ControlPacketSeen :1;
u32_t PrevResetType :8;
#define NCSI_RESET_TYPE_CHANNEL0_RESET 0
#define NCSI_RESET_TYPE_CHANNEL1_RESET 1
#define NCSI_RESET_TYPE_COLD_START 0xAA
#define NCSI_RESET_TYPE_WARM_START 0xBB
u32_t :1;
u32_t DellOemCmdSupport :1;
u32_t :12;
} PackageState_t;
#endif
#define UMP_SELECTION_STATE_DESELECTED FALSE
#define UMP_SELECTION_STATE_SELECTED TRUE
typedef struct NcsiPersistentData
{
UmpDebugData_t Debug;
u32_t PackageId;
pNcsiChannelData_t pChannelSpecific[PATH_SUPPORTED * PORT_MAX];
PackageState_t PackageState;
NcsiChannelData_t ChannelData[PORT_MAX];
HostSrcMacBuff_t * pHostSrcBuff;
} NcsiPersistentData_t;
#if defined (BIG_ENDIAN)
typedef NcsiPersistentData_t* pNcsiPersistentData_t;
#else
typedef u32_t pNcsiPersistentData_t;
#endif
#define pNcsiPersistentData ((NcsiPersistentData_t *)&SHMEM(PATH_0)->mgmtfw_state)
typedef enum NcsiLibraryEntryType
{
NCSI_MAIN_LIB_MCP_SHARED_MEM_POINTER = 0 ,
NCSI_MAIN_LIB_MCP_REG_POINTER ,
NCSI_MAIN_LIB_MEM_FILL ,
NCSI_MAIN_LIB_MEM_CMP ,
NCSI_MAIN_LIB_MEM_COPY_BYTES ,
NCSI_MAIN_LIB_DELAY_US ,
NCSI_MAIN_LIB_FW_HACK ,
NCSI_MAIN_LIB_GET_LINK_STATUS_WORD ,
NCSI_MAIN_LIB_GET_OS_STATUS_WORD ,
NCSI_MAIN_LIB_GET_PORT_RESET_STATUS ,
NCSI_MAIN_LIB_HANDLE_PORT_RESET ,
NCSI_MAIN_LIB_GET_LOW_POWER_LINK_FLAG ,
NCSI_MAIN_LIB_SET_LOW_POWER_LINK_FLAG ,
NCSI_MAIN_LIB_SET_OS_STATUS_FLAG ,
NCSI_RX_LIB_COMPLETE_EGRESS_PACKET_TRANSFER ,
NCSI_RX_LIB_ALLOCATE_EGRESS_BUFFER ,
NCSI_RX_LIB_INITIALIZE_CHANNEL_RESOURCES ,
NCSI_RX_LIB_INITIALIZE ,
NCSI_TX_LIB_INITIALIZE ,
NCSI_TX_LIB_GET_INGRESS_BUFFER_ADDRESS ,
NCSI_TX_LIB_FREE_INGRESS_PACKET_BUFFER ,
NCSI_TX_LIB_VALIDATE_INGRESS_PACKET ,
NCSI_CMD_LIB_INITIALIZE ,
NCSI_CMD_LIB_DISABLE_VLAN_FILTER ,
NCSI_CMD_LIB_ENABLE_VLAN_FILTER ,
NCSI_CMD_LIB_SET_VLAN_MODE ,
NCSI_CMD_LIB_DISABLE_VLAN ,
NCSI_CMD_LIB_GET_UPDATED_STATISTICS ,
NCSI_CMD_LIB_ENABLE_CHANNEL ,
NCSI_CMD_LIB_ENABLE_BROADCAST_PACKET_FILTERING ,
NCSI_CMD_LIB_DISABLE_BROADCAST_PACKET_FILTERING ,
NCSI_CMD_LIB_DISABLE_MULTICAST_PACKET_FILTERING ,
NCSI_CMD_LIB_ENABLE_MULTICAST_PACKET_FILTERING ,
NCSI_CMD_LIB_SET_MAC_ADDRESS ,
NCSI_CMD_LIB_DISABLE_CHANNEL ,
NCSI_CMD_LIB_CLEAR_MAC_ADDRESS ,
#if 0
NCSI_CMD_LIB_GET_PCI_DEVICE_ID ,
NCSI_CMD_LIB_GET_PCI_VENDOR_ID ,
NCSI_CMD_LIB_GET_PCI_SUBSYSTEM_ID ,
NCSI_CMD_LIB_GET_PCI_SUBSYSTEMVENDOR_ID ,
NCSI_CMD_LIB_GET_HOST_MAC_ADDRESS ,
NCSI_CMD_LIB_GET_GET_BC_REV ,
#else
NCSI_CMD_LIB_GET_NCSI_PARAMETER ,
#endif
NCSI_CMD_LIB_SET_LINK ,
NCSI_CMD_LIB_GET_LINK_STATUS ,
NCSI_CMD_LIB_SET_VIRTUAL_MAC_ADDRESS ,
NCSI_LIB_SIZE
}NcsiLibraryEntry_t;
extern u32_t NcsiMain_Mem_Cmp (pu8_t, pu8_t, u32_t);
extern void NcsiMain_Delay_Usec (u32_t);
extern void NcsiMain_Mem_Fill (u8_t, pu8_t, u32_t);
extern void NcsiMain_Mem_Copy_Bytes (pu8_t, pu8_t, u32_t);
#endif