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

293 lines
10 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2022 - 2024 Mucse Corporation. */
#ifndef _RNPGBE_COMMON_H_
#define _RNPGBE_COMMON_H_
#include <linux/skbuff.h>
#include <linux/highmem.h>
#include "rnpgbe_type.h"
#include "rnpgbe.h"
#include "rnpgbe_regs.h"
struct rnpgbe_adapter;
#define TRACE() printk(KERN_DEBUG "==[ %s %d ] ==\n", __func__, __LINE__)
#ifdef CONFIG_RNP_RX_DEBUG
#define rx_debug_printk printk
#define rx_buf_dump buf_dump
#define rx_dbg(fmt, args...) \
printk(KERN_DEBUG "[ %s:%d ] " fmt, __func__, __LINE__, ##args)
#else
#define rx_debug_printk(fmt, args...)
#define rx_buf_dump(a, b, c)
#define rx_dbg(fmt, args...)
#endif /* CONFIG_RNP_RX_DEBUG */
#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 tx_dbg(fmt, args...) \
printk(KERN_DEBUG "[ %s:%d ] " fmt, __func__, __LINE__, ##args)
#else
#define desc_hex_dump(msg, buf, len)
#define tx_dbg(fmt, args...)
#endif /* CONFIG_RNP_TX_DEBUG */
#ifdef DEBUG
#define dbg(fmt, args...) \
printk(KERN_DEBUG "[ %s:%d ] " fmt, __func__, __LINE__, ##args)
#else
#define dbg(fmt, args...)
#endif
#ifdef CONFIG_RNP_VF_DEBUG
#define vf_dbg(fmt, args...) \
printk(KERN_DEBUG "[ %s:%d ] " fmt, __func__, __LINE__, ##args)
#else
#define vf_dbg(fmt, args...)
#endif
/* ================= registers read/write helper ===== */
#define p_rnpgbe_wr_reg(reg, val) \
do { \
printk(KERN_DEBUG " wr-reg: %p <== 0x%08x \t#%-4d %s\n", \
(reg), (val), __LINE__, __FILE__); \
iowrite32((val), (void *)(reg)); \
} while (0)
static inline unsigned int prnpgbe_rd_reg(void *reg)
{
unsigned int v = ioread32((void *)(reg));
printk(KERN_DEBUG " %p => 0x%08x\n", reg, v);
return v;
}
#ifdef IO_PRINT
static inline unsigned int rnpgbe_rd_reg(void *reg)
{
unsigned int v = ioread32((void *)(reg));
dbg(" rd-reg: %p <== 0x%08x\n", reg, v);
return v;
}
#define rnpgbe_wr_reg(reg, val) \
do { \
dbg(" wr-reg: %p <== 0x%08x \t#%-4d %s\n", (reg), (val), \
__LINE__, __FILE__); \
iowrite32((val), (void *)(reg)); \
} while (0)
#else
#define rnpgbe_rd_reg(reg) readl((void *)(reg))
#define rnpgbe_wr_reg(reg, val) writel((val), (void *)(reg))
#endif
#define rd32(hw, off) rnpgbe_rd_reg((hw)->hw_addr + (off))
#define wr32(hw, off, val) rnpgbe_wr_reg((hw)->hw_addr + (off), (val))
#define nic_rd32(nic, off) rnpgbe_rd_reg((nic)->nic_base_addr + (off))
#define nic_wr32(nic, off, val) \
rnpgbe_wr_reg((nic)->nic_base_addr + (off), (val))
#define dma_rd32(dma, off) rnpgbe_rd_reg((dma)->dma_base_addr + (off))
#define dma_wr32(dma, off, val) \
rnpgbe_wr_reg((dma)->dma_base_addr + (off), (val))
#define dma_ring_rd32(dma, off) rnpgbe_rd_reg((dma)->dma_ring_addr + (off))
#define dma_ring_wr32(dma, off, val) \
rnpgbe_wr_reg((dma)->dma_ring_addr + (off), (val))
#define eth_rd32(eth, off) rnpgbe_rd_reg((eth)->eth_base_addr + (off))
#define eth_wr32(eth, off, val) \
rnpgbe_wr_reg((eth)->eth_base_addr + (off), (val))
#define mac_rd32(mac, off) rnpgbe_rd_reg((mac)->mac_addr + (off))
#define mac_wr32(mac, off, val) rnpgbe_wr_reg((mac)->mac_addr + (off), (val))
#ifdef debug_ring
static inline unsigned int rnpgbe_rd_reg_1(int ring, u32 off, void *reg)
{
unsigned int v = ioread32((void *)(reg));
printk(KERN_DEBUG "%d rd-reg: %x <== 0x%08x\n", ring, off, v);
return v;
}
#define ring_rd32(ring, off) \
rnpgbe_rd_reg_1(ring->rnpgbe_queue_idx, off, (ring)->ring_addr + (off))
#define ring_wr32(ring, off, val) \
rnpgbe_wr_reg((ring)->ring_addr + (off), (val))
#else
#define ring_rd32(ring, off) rnpgbe_rd_reg((ring)->ring_addr + (off))
#define ring_wr32(ring, off, val) \
rnpgbe_wr_reg((ring)->ring_addr + (off), (val))
#endif
#define pwr32(hw, off, val) p_rnpgbe_wr_reg((hw)->hw_addr + (off), (val))
#define rnpgbe_mbx_rd(hw, off) rnpgbe_rd_reg((hw)->ring_msix_base + (off))
#define rnpgbe_mbx_wr(hw, off, val) \
rnpgbe_wr_reg((hw)->ring_msix_base + (off), val)
#define rnpgbe_set_reg_bit(hw, reg_def, bit) \
do { \
u32 reg = reg_def; \
u32 value = rd32(hw, reg); \
dbg("before set %x %x\n", reg, value); \
value |= (0x01 << (bit)); \
dbg("after set %x %x\n", reg, value); \
wr32(hw, reg, value); \
} while (0)
#define rnpgbe_clr_reg_bit(hw, reg_def, bit) \
do { \
u32 reg = reg_def; \
u32 value = rd32(hw, reg); \
dbg("before clr %x %x\n", reg, value); \
value &= (~(0x01 << (bit))); \
dbg("after clr %x %x\n", reg, value); \
wr32(hw, reg, value); \
} while (0)
#define rnpgbe_vlan_filter_on(hw) \
rnpgbe_set_reg_bit(hw, RNP_ETH_VLAN_FILTER_ENABLE, 30)
#define rnpgbe_vlan_filter_off(hw) \
rnpgbe_clr_reg_bit(hw, RNP_ETH_VLAN_FILTER_ENABLE, 30)
#define DPRINTK(nlevel, klevel, fmt, args...) \
((NETIF_MSG_##nlevel & adapter->msg_enable) ? \
(void)(netdev_printk(KERN_##klevel, adapter->netdev, fmt, \
##args)) : \
NULL)
/* ==== log helper === */
#ifdef HW_DEBUG
#define hw_dbg(hw, fmt, args...) printk(KERN_DEBUG "hw-dbg : " fmt, ##args)
#define eth_dbg(eth, fmt, args...) printk(KERN_DEBUG "hw-dbg : " fmt, ##args)
#else
#define hw_dbg(hw, fmt, args...)
#define eth_dbg(hw, fmt, args...)
#endif
#ifdef RNP_DEBUG_OPEN
#define rnpgbe_dbg(fmt, args...) printk(KERN_DEBUG fmt, ##args)
#else
#define rnpgbe_dbg(fmt, args...)
#endif
#define rnpgbe_info(fmt, args...) printk(KERN_DEBUG "rnp-info: " fmt, ##args)
#define rnpgbe_warn(fmt, args...) printk(KERN_DEBUG "rnp-warn: " fmt, ##args)
#define rnpgbe_err(fmt, args...) printk(KERN_ERR "rnp-err : " fmt, ##args)
#define e_info(msglvl, format, arg...) \
netif_info(adapter, msglvl, adapter->netdev, format, ##arg)
#define e_err(msglvl, format, arg...) \
netif_err(adapter, msglvl, adapter->netdev, format, ##arg)
#define e_warn(msglvl, format, arg...) \
netif_warn(adapter, msglvl, adapter->netdev, format, ##arg)
#define e_crit(msglvl, format, arg...) \
netif_crit(adapter, msglvl, adapter->netdev, format, ##arg)
#define e_dev_info(format, arg...) dev_info(&adapter->pdev->dev, format, ##arg)
#define e_dev_warn(format, arg...) dev_warn(&adapter->pdev->dev, format, ##arg)
#define e_dev_err(format, arg...) dev_err(&adapter->pdev->dev, format, ##arg)
#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[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(KERN_DEBUG "%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 __le64 build_ctob(u32 vlan_cmd, u32 mac_ip_len, u32 size)
{
return cpu_to_le64(((u64)vlan_cmd << 32) | ((u64)mac_ip_len << 16) |
((u64)size));
}
static inline void buf_dump(const char *msg, void *buf, int len)
{
int i, offset = 0;
int msg_len = 1024;
char 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(KERN_DEBUG "%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);
}
enum RNP_LOG_EVT {
LOG_MBX_IN,
LOG_MBX_OUT,
LOG_MBX_MSG_IN,
LOG_MBX_MSG_OUT,
LOG_LINK_EVENT,
LOG_ADPT_STAT,
LOG_MBX_ABLI,
LOG_MBX_LINK_STAT,
LOG_MBX_IFUP_DOWN,
LOG_MBX_LOCK,
LOG_ETHTOOL,
LOG_PHY,
};
#define MII_BUSY 0x00000001
#define MII_WRITE 0x00000002
#define MII_DATA_MASK GENMASK(15, 0)
extern unsigned int rnpgbe_loglevel;
#define rnpgbe_logd(evt, fmt, args...) \
do { \
if (BIT(evt) & rnpgbe_loglevel) { \
printk(KERN_DEBUG fmt, ##args); \
} \
} while (0)
#endif /* RNPGBE_COMMON */