263 lines
5.9 KiB
C
263 lines
5.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Copyright(c) 2020 - 2023, Chengdu BeiZhongWangXin Technology Co., Ltd. */
|
|
|
|
#ifndef _NE6X_COMMON_H
|
|
#define _NE6X_COMMON_H
|
|
|
|
#define NE6X_MAX_U64 0xFFFFFFFFFFFFFFFFULL
|
|
|
|
#define NE6X_MODULE_TYPE_TOTAL_BYTE 3
|
|
|
|
#define NE6X_AQ_LINK_UP 0x1ULL
|
|
#define NE6X_AQ_AN_COMPLETED BIT(0)
|
|
|
|
#define PCI_VENDOR_ID_BZWX 0xD20C
|
|
|
|
struct ne6x_eth_stats {
|
|
u64 rx_bytes; /* gorc */
|
|
u64 rx_unicast; /* uprc */
|
|
u64 rx_multicast; /* mprc */
|
|
u64 rx_broadcast; /* bprc */
|
|
u64 rx_discards; /* rdpc */
|
|
u64 rx_miss;
|
|
u64 rx_unknown_protocol; /* rupp */
|
|
u64 tx_bytes; /* gotc */
|
|
u64 tx_unicast; /* uptc */
|
|
u64 tx_multicast; /* mptc */
|
|
u64 tx_broadcast; /* bptc */
|
|
u64 tx_discards; /* tdpc */
|
|
u64 tx_errors; /* tepc */
|
|
u64 rx_malform;
|
|
u64 tx_malform;
|
|
};
|
|
|
|
enum ne6x_phy_type {
|
|
NE6X_PHY_TYPE_UNKNOWN = 0,
|
|
NE6X_PHY_TYPE_10GBASE = 1,
|
|
NE6X_PHY_TYPE_25GBASE,
|
|
NE6X_PHY_TYPE_40GBASE,
|
|
NE6X_PHY_TYPE_100GBASE,
|
|
NE6X_PHY_TYPE_200GBASE,
|
|
};
|
|
|
|
#define NE6X_LINK_SPEED_10GB_SHIFT 0x1
|
|
#define NE6X_LINK_SPEED_40GB_SHIFT 0x2
|
|
#define NE6X_LINK_SPEED_25GB_SHIFT 0x3
|
|
#define NE6X_LINK_SPEED_100GB_SHIFT 0x4
|
|
#define NE6X_LINK_SPEED_200GB_SHIFT 0x5
|
|
|
|
enum ne6x_sdk_link_speed {
|
|
NE6X_LINK_SPEED_UNKNOWN = 0,
|
|
NE6X_LINK_SPEED_10GB = BIT(NE6X_LINK_SPEED_10GB_SHIFT),
|
|
NE6X_LINK_SPEED_40GB = BIT(NE6X_LINK_SPEED_40GB_SHIFT),
|
|
NE6X_LINK_SPEED_25GB = BIT(NE6X_LINK_SPEED_25GB_SHIFT),
|
|
NE6X_LINK_SPEED_100GB = BIT(NE6X_LINK_SPEED_100GB_SHIFT),
|
|
NE6X_LINK_SPEED_200GB = BIT(NE6X_LINK_SPEED_200GB_SHIFT),
|
|
};
|
|
|
|
struct ne6x_link_status {
|
|
u64 phy_type_low;
|
|
u64 phy_type_high;
|
|
|
|
u16 max_frame_size;
|
|
u16 req_speeds;
|
|
u8 topo_media_conflict;
|
|
u8 link_cfg_err;
|
|
u8 lse_ena; /* Link Status Event notification */
|
|
u8 link_info;
|
|
u8 an_info;
|
|
u8 ext_info;
|
|
u8 fec_info;
|
|
u8 pacing;
|
|
u32 link_speed;
|
|
u8 module_type[NE6X_MODULE_TYPE_TOTAL_BYTE];
|
|
};
|
|
|
|
struct ne6x_mac_info {
|
|
u8 perm_addr[ETH_ALEN];
|
|
};
|
|
|
|
struct ne6x_link_info {
|
|
u32 link;
|
|
u32 speed;
|
|
};
|
|
|
|
enum ne6x_media_type {
|
|
NE6X_MEDIA_UNKNOWN = 0,
|
|
NE6X_MEDIA_FIBER,
|
|
NE6X_MEDIA_BASET,
|
|
NE6X_MEDIA_BACKPLANE,
|
|
NE6X_MEDIA_DA,
|
|
NE6X_MEDIA_AUI,
|
|
};
|
|
|
|
struct ne6x_phy_info {
|
|
struct ne6x_link_status link_info;
|
|
struct ne6x_link_status link_info_old;
|
|
u64 phy_type_low;
|
|
u64 phy_type_high;
|
|
enum ne6x_media_type media_type;
|
|
u8 get_link_info;
|
|
u16 curr_user_speed_req;
|
|
};
|
|
|
|
struct ne6x_port_info {
|
|
struct ne6x_hw *hw; /* back pointer to HW instance */
|
|
|
|
u8 lport;
|
|
u8 hw_port_id; /* hardware port id */
|
|
u8 hw_trunk_id;
|
|
u32 hw_queue_base_old;
|
|
u32 hw_queue_base;
|
|
u32 hw_max_queue;
|
|
|
|
u32 queue; /* current used queue */
|
|
struct ne6x_link_info link_status;
|
|
struct ne6x_mac_info mac;
|
|
struct ne6x_phy_info phy;
|
|
};
|
|
|
|
struct ne6x_bus_info {
|
|
u16 domain_num;
|
|
u16 device;
|
|
u8 func;
|
|
u8 bus_num;
|
|
};
|
|
|
|
struct ne6x_mbx_snap_buffer_data {
|
|
u8 state : 4;
|
|
u8 len : 4;
|
|
u8 type;
|
|
u8 data[6];
|
|
};
|
|
|
|
/* Structure to track messages sent by VFs on mailbox:
|
|
* 1. vf_cntr : a counter array of VFs to track the number of
|
|
* asynchronous messages sent by each VF
|
|
* 2. vfcntr_len : number of entries in VF counter array
|
|
*/
|
|
struct ne6x_mbx_vf_counter {
|
|
u32 *vf_cntr;
|
|
u32 vfcntr_len;
|
|
};
|
|
|
|
/* Enum defining the different states of the mailbox snapshot in the
|
|
* PF-VF mailbox overflow detection algorithm. The
|
|
* snapshot can be in
|
|
* states:
|
|
* 1. NE6X_MAL_VF_DETECT_STATE_NEW_SNAPSHOT - generate a new static snapshot
|
|
* within
|
|
* the mailbox buffer.
|
|
* 2. NE6X_MAL_VF_DETECT_STATE_TRAVERSE - iterate through the mailbox snaphot
|
|
* 3.
|
|
* NE6X_MAL_VF_DETECT_STATE_DETECT - track the messages sent per VF via the
|
|
* mailbox and mark any VFs sending more
|
|
* messages than the threshold limit set.
|
|
* 4. NE6X_MAL_VF_DETECT_STATE_INVALID - Invalid mailbox state set to
|
|
* 0xFFFFFFFF.
|
|
*/
|
|
enum ne6x_mbx_snapshot_state {
|
|
NE6X_MAL_VF_DETECT_STATE_NEW_SNAPSHOT = 0,
|
|
NE6X_MAL_VF_DETECT_STATE_TRAVERSE,
|
|
NE6X_MAL_VF_DETECT_STATE_DETECT,
|
|
NE6X_MAL_VF_DETECT_STATE_INVALID = 0xF,
|
|
};
|
|
|
|
struct ne6x_mbx_snapshot {
|
|
enum ne6x_mbx_snapshot_state state;
|
|
struct ne6x_mbx_vf_counter mbx_vf;
|
|
};
|
|
|
|
enum virtchnl_vf_config_codes {
|
|
VIRTCHNL_VF_CONFIG_TRUST = 0,
|
|
VIRTCHNL_VF_CONFIG_FORCE_LINK = 1,
|
|
};
|
|
|
|
struct virtchnl_vf_config {
|
|
u8 type;
|
|
u8 data[5];
|
|
};
|
|
|
|
enum ne6x_adapter_state {
|
|
NE6X_ADPT_DOWN,
|
|
NE6X_ADPT_NEEDS_RESTART,
|
|
NE6X_ADPT_NETDEV_ALLOCD,
|
|
NE6X_ADPT_NETDEV_REGISTERED,
|
|
NE6X_ADPT_UMAC_FLTR_CHANGED,
|
|
NE6X_ADPT_MMAC_FLTR_CHANGED,
|
|
NE6X_ADPT_VLAN_FLTR_CHANGED,
|
|
NE6X_ADPT_PROMISC_CHANGED,
|
|
NE6X_ADPT_RELEASING,
|
|
NE6X_ADPT_RECOVER,
|
|
NE6X_ADPT_DOWN_REQUESTED,
|
|
NE6X_ADPT_OPEN,
|
|
NE6X_ADPT_NBITS /* must be last */
|
|
};
|
|
|
|
struct ne6x_adapt_comm {
|
|
u16 port_info;
|
|
DECLARE_BITMAP(state, NE6X_ADPT_NBITS);
|
|
};
|
|
|
|
struct ne6x_vlan {
|
|
u16 tpid;
|
|
u16 vid;
|
|
u8 prio;
|
|
};
|
|
|
|
struct ne6x_vf_vlan {
|
|
u16 vid;
|
|
u16 tpid;
|
|
};
|
|
|
|
struct ne6x_macvlan {
|
|
struct list_head list;
|
|
struct net_device *vdev;
|
|
u8 mac[ETH_ALEN];
|
|
};
|
|
|
|
/* values for UPT1_RSSConf.hashFunc */
|
|
enum {
|
|
NE6X_RSS_HASH_TYPE_NONE = 0x0,
|
|
NE6X_RSS_HASH_TYPE_IPV4 = 0x01,
|
|
NE6X_RSS_HASH_TYPE_IPV4_TCP = 0x02,
|
|
NE6X_RSS_HASH_TYPE_IPV6 = 0x04,
|
|
NE6X_RSS_HASH_TYPE_IPV6_TCP = 0x08,
|
|
NE6X_RSS_HASH_TYPE_IPV4_UDP = 0x10,
|
|
NE6X_RSS_HASH_TYPE_IPV6_UDP = 0x20,
|
|
};
|
|
|
|
enum {
|
|
NE6X_RSS_HASH_FUNC_NONE = 0x0,
|
|
NE6X_RSS_HASH_FUNC_TOEPLITZ = 0x01,
|
|
};
|
|
|
|
#define NE6X_RSS_MAX_KEY_SIZE 40
|
|
#define NE6X_RSS_MAX_IND_TABLE_SIZE 128
|
|
|
|
struct ne6x_rss_info {
|
|
u16 hash_type;
|
|
u16 hash_func;
|
|
u16 hash_key_size;
|
|
u16 ind_table_size;
|
|
u8 hash_key[NE6X_RSS_MAX_KEY_SIZE];
|
|
u8 ind_table[NE6X_RSS_MAX_IND_TABLE_SIZE];
|
|
};
|
|
|
|
#define NE6X_VF_VLAN(vid, tpid) ((struct ne6x_vf_vlan){vid, tpid})
|
|
|
|
#ifndef readq
|
|
static inline u64 readq(void __iomem *addr)
|
|
{
|
|
return readl(addr) + ((u64)readl(addr + 4) << 32);
|
|
}
|
|
|
|
static inline void writeq(u64 val, void __iomem *addr)
|
|
{
|
|
writel(val, addr);
|
|
writel(val >> 32, addr + 4);
|
|
}
|
|
#endif
|
|
|
|
#endif
|