293 lines
10 KiB
C
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 */
|