2026-01-29 22:25:33 +08:00

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