blob: 1550ac0c1c2b29fbf1ccf87d2fe0952607f29f83 [file] [log] [blame]
/* Copyright (c) 2020 Intel Corporation */
#include <stdio.h>
#include "internal.h"
#define RAH_RAH 0x0000FFFF
#define RAH_ASEL 0x00010000
#define RAH_QSEL 0x000C0000
#define RAH_QSEL_EN 0x10000000
#define RAH_AV 0x80000000
#define RCTL_RXEN 0x00000002
#define RCTL_SBP 0x00000004
#define RCTL_UPE 0x00000008
#define RCTL_MPE 0x00000010
#define RCTL_LPE 0x00000020
#define RCTL_LBM 0x000000C0
#define RCTL_LBM_PHY 0x00000000
#define RCTL_LBM_MAC 0x00000040
#define RCTL_HSEL 0x00000300
#define RCTL_HSEL_MULTICAST 0x00000000
#define RCTL_HSEL_UNICAST 0x00000100
#define RCTL_HSEL_BOTH 0x00000200
#define RCTL_MO 0x00003000
#define RCTL_MO_47_36 0x00000000
#define RCTL_MO_43_32 0x00001000
#define RCTL_MO_39_28 0x00002000
#define RCTL_BAM 0x00008000
#define RCTL_BSIZE 0x00030000
#define RCTL_BSIZE_2048 0x00000000
#define RCTL_BSIZE_1024 0x00010000
#define RCTL_BSIZE_512 0x00020000
#define RCTL_VFE 0x00040000
#define RCTL_CFIEN 0x00080000
#define RCTL_CFI 0x00100000
#define RCTL_PSP 0x00200000
#define RCTL_DPF 0x00400000
#define RCTL_PMCF 0x00800000
#define RCTL_SECRC 0x04000000
#define VLANPQF_VP0QSEL 0x00000003
#define VLANPQF_VP0PBSEL 0x00000004
#define VLANPQF_VLANP0V 0x00000008
#define VLANPQF_VP1QSEL 0x00000030
#define VLANPQF_VP1PBSEL 0x00000040
#define VLANPQF_VLANP1V 0x00000080
#define VLANPQF_VP2QSEL 0x00000300
#define VLANPQF_VP2PBSEL 0x00000400
#define VLANPQF_VLANP2V 0x00000800
#define VLANPQF_VP3QSEL 0x00003000
#define VLANPQF_VP3PBSEL 0x00004000
#define VLANPQF_VLANP3V 0x00008000
#define VLANPQF_VP4QSEL 0x00030000
#define VLANPQF_VP4PBSEL 0x00040000
#define VLANPQF_VLANP4V 0x00080000
#define VLANPQF_VP5QSEL 0x00300000
#define VLANPQF_VP5PBSEL 0x00400000
#define VLANPQF_VLANP5V 0x00800000
#define VLANPQF_VP6QSEL 0x03000000
#define VLANPQF_VP6PBSEL 0x04000000
#define VLANPQF_VLANP6V 0x08000000
#define VLANPQF_VP7QSEL 0x30000000
#define VLANPQF_VP7PBSEL 0x40000000
#define VLANPQF_VLANP7V 0x80000000
#define ETQF_ETYPE 0x0000FFFF
#define ETQF_QUEUE 0x00070000
#define ETQF_ETYPE_LEN 0x01F00000
#define ETQF_ETYPE_LEN_EN 0x02000000
#define ETQF_FILTER_EN 0x04000000
#define ETQF_IMMEDIATE_INTR 0x20000000
#define ETQF_1588_TIMESTAMP 0x40000000
#define ETQF_QUEUE_EN 0x80000000
#define RAH_QSEL_SHIFT 18
#define VLANPQF_VP1QSEL_SHIFT 4
#define VLANPQF_VP2QSEL_SHIFT 8
#define VLANPQF_VP3QSEL_SHIFT 12
#define VLANPQF_VP4QSEL_SHIFT 16
#define VLANPQF_VP5QSEL_SHIFT 20
#define VLANPQF_VP6QSEL_SHIFT 24
#define VLANPQF_VP7QSEL_SHIFT 28
#define ETQF_QUEUE_SHIFT 16
#define ETQF_ETYPE_LEN_SHIFT 20
static const char *bit_to_boolean(u32 val)
{
return val ? "yes" : "no";
}
static const char *bit_to_enable(u32 val)
{
return val ? "enabled" : "disabled";
}
static const char *bit_to_prio(u32 val)
{
return val ? "low" : "high";
}
int igc_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
struct ethtool_regs *regs)
{
u32 reg;
int offset, i;
u32 *regs_buff = (u32 *)regs->data;
u8 version = (u8)(regs->version >> 24);
if (version != 2)
return -1;
for (offset = 0; offset < 24; offset++) {
reg = regs_buff[offset];
printf("%04d: 0x%08X\n", offset, reg);
}
offset = 24;
reg = regs_buff[offset];
printf("%04d: RCTL (Receive Control Register) \n"
" Receiver: %s\n"
" Stop Bad Packets: %s\n"
" Unicast Promiscuous: %s\n"
" Multicast Promiscuous: %s\n"
" Long Packet Reception: %s\n"
" Loopback Model: %s\n"
" Hash Select for MTA: %s\n"
" Multicast/Unicast Table Offset: %s\n"
" Broadcast Accept Mode: %s\n"
" Receive Buffer Size: %s\n"
" VLAN Filter: %s\n"
" Canonical Form Indicator: %s\n"
" Canonical Form Indicator Bit: %s\n"
" Pad Small Receive Packets: %s\n"
" Discard Pause Frames: %s\n"
" Pass MAC Control Frames: %s\n"
" Strip Ethernet CRC: %s\n",
offset,
bit_to_enable(reg & RCTL_RXEN),
bit_to_enable(reg & RCTL_SBP),
bit_to_enable(reg & RCTL_UPE),
bit_to_enable(reg & RCTL_MPE),
bit_to_enable(reg & RCTL_LPE),
(reg & RCTL_LBM) == RCTL_LBM_PHY ? "PHY" :
(reg & RCTL_LBM) == RCTL_LBM_MAC ? "MAC" :
"undefined",
(reg & RCTL_HSEL) == RCTL_HSEL_MULTICAST ? "multicast only" :
(reg & RCTL_HSEL) == RCTL_HSEL_UNICAST ? "unicast only" :
(reg & RCTL_HSEL) == RCTL_HSEL_BOTH ? "multicast and unicast" :
"reserved",
(reg & RCTL_MO) == RCTL_MO_47_36 ? "bits [47:36]" :
(reg & RCTL_MO) == RCTL_MO_43_32 ? "bits [43:32]" :
(reg & RCTL_MO) == RCTL_MO_39_28 ? "bits [39:28]" :
"bits [35:24]",
bit_to_enable(reg & RCTL_BAM),
(reg & RCTL_BSIZE) == RCTL_BSIZE_2048 ? "2048 bytes" :
(reg & RCTL_BSIZE) == RCTL_BSIZE_1024 ? "1024 bytes" :
(reg & RCTL_BSIZE) == RCTL_BSIZE_512 ? "512 bytes" :
"256 bytes",
bit_to_enable(reg & RCTL_VFE),
bit_to_enable(reg & RCTL_CFIEN),
reg & RCTL_CFI ? "discarded" : "accepted",
bit_to_enable(reg & RCTL_PSP),
bit_to_enable(reg & RCTL_DPF),
bit_to_enable(reg & RCTL_PMCF),
bit_to_enable(reg & RCTL_SECRC));
for (offset = 25; offset < 172; offset++) {
reg = regs_buff[offset];
printf("%04d: 0x%08X\n", offset, reg);
}
offset = 172;
for (i = 0; i < 16; i++) {
reg = regs_buff[offset + i];
printf("%04d: RAL (Receive Address Low %02d) \n"
" Receive Address Low: %08X\n",
offset + i, i,
reg);
}
offset = 188;
for (i = 0; i < 16; i++) {
reg = regs_buff[offset + i];
printf("%04d: RAH (Receive Address High %02d) \n"
" Receive Address High: %04X\n"
" Address Select: %s\n"
" Queue Select: %d\n"
" Queue Select Enable: %s\n"
" Address Valid: %s\n",
offset + i, i,
reg & RAH_RAH,
reg & RAH_ASEL ? "source" : "destination",
(reg & RAH_QSEL) >> RAH_QSEL_SHIFT,
bit_to_boolean(reg & RAH_QSEL_EN),
bit_to_boolean(reg & RAH_AV));
}
offset = 204;
reg = regs_buff[offset];
printf("%04d: VLANPQF (VLAN Priority Queue Filter) \n"
" Priority 0 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n"
" Priority 1 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n"
" Priority 2 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n"
" Priority 3 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n"
" Priority 4 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n"
" Priority 5 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n"
" Priority 6 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n"
" Priority 7 \n"
" Queue: %d\n"
" Packet Buffer: %s\n"
" Valid: %s\n",
offset,
reg & VLANPQF_VP0QSEL,
bit_to_prio(reg & VLANPQF_VP0PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP0V),
(reg & VLANPQF_VP1QSEL) >> VLANPQF_VP1QSEL_SHIFT,
bit_to_prio(reg & VLANPQF_VP1PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP1V),
(reg & VLANPQF_VP2QSEL) >> VLANPQF_VP2QSEL_SHIFT,
bit_to_prio(reg & VLANPQF_VP2PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP2V),
(reg & VLANPQF_VP3QSEL) >> VLANPQF_VP3QSEL_SHIFT,
bit_to_prio(reg & VLANPQF_VP3PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP3V),
(reg & VLANPQF_VP4QSEL) >> VLANPQF_VP4QSEL_SHIFT,
bit_to_prio(reg & VLANPQF_VP4PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP4V),
(reg & VLANPQF_VP5QSEL) >> VLANPQF_VP5QSEL_SHIFT,
bit_to_prio(reg & VLANPQF_VP5PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP5V),
(reg & VLANPQF_VP6QSEL) >> VLANPQF_VP6QSEL_SHIFT,
bit_to_prio(reg & VLANPQF_VP6PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP6V),
(reg & VLANPQF_VP7QSEL) >> VLANPQF_VP7QSEL_SHIFT,
bit_to_prio(reg & VLANPQF_VP7PBSEL),
bit_to_boolean(reg & VLANPQF_VLANP7V));
offset = 205;
for (i = 0; i < 8; i++) {
reg = regs_buff[offset + i];
printf("%04d: ETQF (EType Queue Filter %d) \n"
" EType: %04X\n"
" EType Length: %d\n"
" EType Length Enable: %s\n"
" Queue: %d\n"
" Queue Enable: %s\n"
" Immediate Interrupt: %s\n"
" 1588 Time Stamp: %s\n"
" Filter Enable: %s\n",
offset + i, i,
reg & ETQF_ETYPE,
(reg & ETQF_ETYPE_LEN) >> ETQF_ETYPE_LEN_SHIFT,
bit_to_boolean(reg & ETQF_ETYPE_LEN_EN),
(reg & ETQF_QUEUE) >> ETQF_QUEUE_SHIFT,
bit_to_boolean(reg & ETQF_QUEUE_EN),
bit_to_enable(reg & ETQF_IMMEDIATE_INTR),
bit_to_enable(reg & ETQF_1588_TIMESTAMP),
bit_to_boolean(reg & ETQF_FILTER_EN));
}
return 0;
}