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

365 lines
10 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2022 - 2024 Mucse Corporation. */
#ifndef _RNPVF_DEFINES_H_
#define _RNPVF_DEFINES_H_
#include <linux/skbuff.h>
#include <linux/highmem.h>
/* Device IDs */
#define RNP_DEV_ID_N10_PF0_VF 0x8001
#define RNP_DEV_ID_N10_PF1_VF 0x8002
#define RNP_DEV_ID_N10_PF0_VF_N 0x1010
#define RNP_DEV_ID_N10_PF1_VF_N 0x1011
#define RNP_VF_IRQ_CLEAR_MASK 7
#define RNP_VF_MAX_TX_QUEUES 8
#define RNP_VF_MAX_RX_QUEUES 8
/* DCB define */
#define RNP_VF_MAX_TRAFFIC_CLASS 8
/* Link speed */
typedef u32 rnp_link_speed;
#define RNP_LINK_SPEED_UNKNOWN 0
#define RNP_LINK_SPEED_10_FULL BIT(2)
#define RNP_LINK_SPEED_100_FULL BIT(3)
#define RNP_LINK_SPEED_1GB_FULL BIT(4)
#define RNP_LINK_SPEED_10GB_FULL BIT(5)
#define RNP_LINK_SPEED_40GB_FULL BIT(6)
#define RNP_LINK_SPEED_25GB_FULL BIT(7)
#define RNP_LINK_SPEED_50GB_FULL BIT(8)
#define RNP_LINK_SPEED_100GB_FULL BIT(9)
#define RNP_LINK_SPEED_10_HALF BIT(10)
#define RNP_LINK_SPEED_100_HALF BIT(11)
#define RNP_LINK_SPEED_1GB_HALF BIT(12)
#define RNP_SFP_MODE_10G_LR BIT(13)
#define RNP_SFP_MODE_10G_SR BIT(14)
#define RNP_SFP_MODE_10G_LRM BIT(15)
#define RNP_SFP_MODE_1G_T BIT(16)
#define RNP_SFP_MODE_1G_KX BIT(17)
#define RNP_SFP_MODE_1G_SX BIT(18)
#define RNP_SFP_MODE_1G_LX BIT(19)
#define RNP_SFP_MODE_40G_SR4 BIT(20)
#define RNP_SFP_MODE_40G_CR4 BIT(21)
#define RNP_SFP_MODE_40G_LR4 BIT(22)
#define RNP_SFP_MODE_1G_CX BIT(23)
/* Number of Transmit and Receive Descriptors must be a multiple of 8 */
#define RNP_REQ_TX_DESCRIPTOR_MULTIPLE 8
#define RNP_REQ_RX_DESCRIPTOR_MULTIPLE 8
#define RNP_REQ_TX_BUFFER_GRANULARITY 1024
/* Interrupt Vector Allocation Registers */
#define RNP_IVAR_ALLOC_VAL 0x80 /* Interrupt Allocation valid */
#define RNP_VF_INIT_TIMEOUT 200 /* Number of retries to clear RSTI */
/* Transmit Descriptor - Advanced */
struct rnp_tx_desc {
union {
__le64 pkt_addr; /* Packet buffer address */
struct {
__le32 adr_lo;
__le32 adr_hi;
};
};
__le16 blen;
union {
struct {
__le16 ip_len : 9;
__le16 mac_len : 7;
};
__le16 mac_ip_len; /* used only in tso & csum */
};
__le16 vlan;
#define RNP_TXD_FLAGS_VLAN_PRIO_MASK 0xe000
#define RNP_TX_FLAGS_VLAN_PRIO_SHIFT 13
#define RNP_TX_FLAGS_VLAN_CFI_SHIFT 12
__le16 cmd;
#define RNP_TXD_VLAN_VALID (0x1 << 15)
#define RNP_TXD_SVLAN_TYPE (0x1 << 14)
#define RNP_TXD_VLAN_CTRL_NOP (0x00 << 13)
#define RNP_TXD_VLAN_CTRL_RM_VLAN (0x01 << 13)
#define RNP_TXD_VLAN_CTRL_INSERT_VLAN (0x02 << 13)
#define RNP_TXD_L4_CSUM (0x1 << 12) /* udp tcp sctp csum */
#define RNP_TXD_IP_CSUM (0x1 << 11)
#define RNP_TXD_TUNNEL_MASK (0x3000000)
#define RNP_TXD_TUNNEL_VXLAN (0x01 << 8)
#define RNP_TXD_TUNNEL_NVGRE (0x02 << 8)
#define RNP_TXD_L4_TYPE_UDP (0x03 << 6)
#define RNP_TXD_L4_TYPE_TCP (0x01 << 6)
#define RNP_TXD_L4_TYPE_SCTP (0x02 << 6)
#define RNP_TXD_FLAG_IPv4 (0 << 5)
#define RNP_TXD_FLAG_IPv6 (0x1 << 5)
#define RNP_TXD_FLAG_TSO (0x1 << 4)
#define RNP_TXD_CMD_RS (0x1 << 2)
#define RNP_TXD_STAT_DD (0x1 << 1)
#define RNP_TXD_CMD_EOP (0x1 << 0)
} __packed;
struct rnp_tx_ctx_desc {
__le16 mss_len;
u8 vfnum;
u8 l4_hdr_len;
u8 tunnel_hdr_len;
__le16 inner_vlan;
u8 vf_veb_flags;
#define VF_IGNORE_VLAN (0x1 << 1) /* bit 57 */
#define VF_VEB_MARK (0x1 << 0) /* bit 56 */
__le32 res;
__le16 rev1;
__le16 cmd;
#define RNP_TXD_FLAG_TO_RPU (0x1 << 15)
#define RNP_TXD_SMAC_CTRL_NOP (0x00 << 12)
#define RNP_TXD_SMAC_CTRL_REPLACE_MACADDR0 (0x02 << 12)
#define RNP_TXD_SMAC_CTRL_REPLACE_MACADDR1 (0bx06 << 12)
#define RNP_TXD_CTX_VLAN_CTRL_NOP (0x00 << 10)
#define RNP_TXD_CTX_VLAN_CTRL_RM_VLAN (0x01 << 10)
#define RNP_TXD_CTX_VLAN_CTRL_INSERT_VLAN (0x02 << 10)
#define RNP_TXD_MTI_CRC_PAD_CTRL (0x01000000)
#define RNP_TXD_CTX_CTRL_DESC (0x1 << 3)
#define RNP_TXD_CTX_CMD_RS (0x1 << 2)
#define RNP_TXD_STAT_DD (0x1 << 1)
} __packed;
/* Receive Descriptor - Advanced */
union rnp_rx_desc {
struct {
union {
__le64 pkt_addr; /* Packet buffer address */
struct {
__le32 addr_lo;
__le32 addr_hi;
};
};
u8 dumy[6];
__le16 cmd;
#define RNP_RXD_FLAG_RS (0x1 << 2)
};
struct {
__le32 rss_hash;
__le16 mark;
__le16 rev1;
#define RNP_RX_L3_TYPE_MASK (0x1 << 15) /* 1 is ipv4 */
#define VEB_VF_PKG (0x1 << 0) /* bit 48 */
#define VEB_VF_IGNORE_VLAN (0x1 << 1) /* bit 49 */
__le16 len;
__le16 padding_len;
__le16 vlan;
__le16 cmd;
#define RNP_RXD_STAT_VLAN_VALID (0x1 << 15)
#define RNP_RXD_STAT_STAG (0x01 << 14)
#define RNP_RXD_STAT_TUNNEL_NVGRE (0x02 << 13)
#define RNP_RXD_STAT_TUNNEL_VXLAN (0x01 << 13)
#define RNP_RXD_STAT_ERR_MASK (0x1f << 8)
#define RNP_RXD_STAT_TUNNEL_MASK (0x03 << 13)
#define RNP_RXD_STAT_SCTP_MASK (0x04 << 8)
#define RNP_RXD_STAT_L4_MASK (0x02 << 8)
#define RNP_RXD_STAT_ERR_MASK_NOSCTP (0x1b << 8)
#define RNP_RXD_STAT_L4_SCTP (0x02 << 6)
#define RNP_RXD_STAT_L4_TCP (0x01 << 6)
#define RNP_RXD_STAT_L4_UDP (0x03 << 6)
#define RNP_RXD_STAT_IPV6 (0x1 << 5)
#define RNP_RXD_STAT_IPV4 (0x0 << 5)
#define RNP_RXD_STAT_PTP (0x1 << 4)
#define RNP_RXD_STAT_DD (0x1 << 1)
#define RNP_RXD_STAT_EOP (0x1 << 0)
} wb;
} __packed;
/* Interrupt register bitmasks */
#define RNP_EITR_CNT_WDIS 0x80000000
#define RNP_MAX_EITR 0x00000FF8
#define RNP_MIN_EITR 8
/* Error Codes */
#define RNP_ERR_INVALID_MAC_ADDR -1
#define RNP_ERR_RESET_FAILED -2
#define RNP_ERR_INVALID_ARGUMENT -3
#ifdef DEBUG
#define dbg(fmt, args...) \
printk(KERN_DEBUG "[ %s:%d ] " fmt, __func__, __LINE__, ##args)
#else
#define dbg(fmt, args...)
#endif
#define rnpvf_dbg(fmt, args...) printk(KERN_DEBUG fmt, ##args)
#define rnpvf_info(fmt, args...) \
printk(KERN_DEBUG "rnpvf-info: " fmt, ##args)
#define rnpvf_warn(fmt, args...) \
printk(KERN_DEBUG "rnpvf-warn: " fmt, ##args)
#define rnpvf_err(fmt, args...) printk(KERN_ERR "rnpvf-err : " fmt, ##args)
#define DPRINTK(nlevel, klevel, fmt, args...) \
((NETIF_MSG_##nlevel & adapter->msg_enable) ? \
(void)(netdev_printk(KERN_##klevel, adapter->netdev, \
fmt, ##args)) : \
NULL)
#ifdef CONFIG_RNP_TX_DEBUG
static inline void buf_dump_line(const char *msg, int line, void *buf,
int len)
{
int i, offset = 0;
int msg_len = 1024;
//u8 msg_buf[msg_len];
u8 msg_buf[1024];
u8 *ptr = (u8 *)buf;
offset += snprintf(msg_buf + offset, msg_len,
"=== %s #%d line:%d buf:%p==\n000: ", msg, len,
line, buf);
for (i = 0; i < len; ++i) {
if (i != 0 && (i % 16) == 0 &&
(offset >= (1024 - 10 * 16))) {
printk("%s\n", msg_buf);
offset = 0;
}
if (i != 0 && (i % 16) == 0) {
offset += snprintf(msg_buf + offset, msg_len,
"\n%03x: ", i);
}
offset += snprintf(msg_buf + offset, msg_len, "%02x ",
ptr[i]);
}
offset += snprintf(msg_buf + offset, msg_len, "\n");
printk(KERN_DEBUG "%s\n", msg_buf);
}
#else
#define buf_dump_line(msg, line, buf, len)
#endif
static inline void buf_dump(const char *msg, void *buf, int len)
{
int i, offset = 0;
int msg_len = 1024;
u8 msg_buf[1024];
u8 *ptr = (u8 *)buf;
offset += snprintf(msg_buf + offset, msg_len,
"=== %s #%d ==\n000: ", msg, len);
for (i = 0; i < len; ++i) {
if (i != 0 && (i % 16) == 0 &&
(offset >= (1024 - 10 * 16))) {
printk("%s\n", msg_buf);
offset = 0;
}
if (i != 0 && (i % 16) == 0) {
offset += snprintf(msg_buf + offset, msg_len,
"\n%03x: ", i);
}
offset += snprintf(msg_buf + offset, msg_len, "%02x ",
ptr[i]);
}
offset += snprintf(msg_buf + offset, msg_len, "\n=== done ==\n");
printk(KERN_DEBUG "%s\n", msg_buf);
}
static inline void _rnp_skb_dump(const struct sk_buff *skb, bool full_pkt)
{
static atomic_t can_dump_full = ATOMIC_INIT(5);
struct skb_shared_info *sh = skb_shinfo(skb);
struct net_device *dev = skb->dev;
struct sk_buff *list_skb;
bool has_mac, has_trans;
int headroom, tailroom;
int i, len, seg_len;
const char *level = KERN_WARNING;
if (full_pkt)
full_pkt = atomic_dec_if_positive(&can_dump_full) >= 0;
if (full_pkt)
len = skb->len;
else
len = min_t(int, skb->len, MAX_HEADER + 128);
headroom = skb_headroom(skb);
tailroom = skb_tailroom(skb);
has_mac = skb_mac_header_was_set(skb);
has_trans = skb_transport_header_was_set(skb);
printk(KERN_DEBUG
"%sskb len=%u headroom=%u headlen=%u tailroom=%u\n"
"mac=(%d,%d) net=(%d,%d) trans=%d\n"
"shinfo(txflags=%u nr_frags=%u gso(size=%u type=%u segs=%u))\n"
"csum(0x%x ip_summed=%u complete_sw=%u valid=%u level=%u)\n"
"hash(0x%x sw=%u l4=%u) proto=0x%04x pkttype=%u iif=%d\n",
level, skb->len, headroom, skb_headlen(skb), tailroom,
has_mac ? skb->mac_header : -1,
has_mac ? (skb->network_header - skb->mac_header) : -1,
skb->network_header,
has_trans ? skb_network_header_len(skb) : -1,
has_trans ? skb->transport_header : -1, sh->tx_flags,
sh->nr_frags, sh->gso_size, sh->gso_type, sh->gso_segs,
skb->csum, skb->ip_summed, skb->csum_complete_sw,
skb->csum_valid, skb->csum_level, skb->hash, skb->sw_hash,
skb->l4_hash, ntohs(skb->protocol), skb->pkt_type,
skb->skb_iif);
if (dev)
printk(KERN_DEBUG "%sdev name=%s feat=0x%pNF\n", level,
dev->name, &dev->features);
seg_len = min_t(int, skb_headlen(skb), len);
if (seg_len)
print_hex_dump(level, "skb linear: ", DUMP_PREFIX_OFFSET,
16, 1, skb->data, seg_len, false);
len -= seg_len;
for (i = 0; len && i < skb_shinfo(skb)->nr_frags; i++) {
skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
u32 p_len;
struct page *p;
u8 *vaddr;
p = skb_frag_address(frag);
p_len = skb_frag_size(frag);
seg_len = min_t(int, p_len, len);
vaddr = kmap_atomic(p);
print_hex_dump(level, "skb frag: ", DUMP_PREFIX_OFFSET,
16, 1, vaddr, seg_len, false);
kunmap_atomic(vaddr);
len -= seg_len;
if (!len)
break;
}
if (full_pkt && skb_has_frag_list(skb)) {
printk(KERN_DEBUG "skb fraglist:\n");
skb_walk_frags(skb, list_skb)
_rnp_skb_dump(list_skb, true);
}
}
#define TRACE() printk(KERN_DEBUG "=[%s] %d == \n", __func__, __LINE__)
#ifdef CONFIG_RNP_TX_DEBUG
#define desc_hex_dump(msg, buf, len) \
print_hex_dump(KERN_WARNING, msg, DUMP_PREFIX_OFFSET, 16, 1, \
(buf), (len), false)
#define rnpvf_skb_dump _rnp_skb_dump
#else
#define desc_hex_dump(msg, buf, len)
#define rnpvf_skb_dump(skb, full_pkt)
#endif
#ifdef CONFIG_RNP_RX_DEBUG
#define rx_debug_printk printk
#define rx_buf_dump buf_dump
#else
#define rx_debug_printk(fmt, args...)
#define rx_buf_dump(a, b, c)
#endif /* CONFIG_RNP_RX_DEBUG */
#endif /* _RNPVF_DEFINES_H_ */