1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
/****************************************************************************
* Support for the Altera Triple Speed Ethernet 10/100/1000 Controller
*
* Copyright (C) 2014 Altera Corporation
*
* Author: Vince Bridgers <vbridgers2013@gmail.com>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 as published
* by the Free Software Foundation, incorporated herein by reference.
*/
#include <stdio.h>
#include <string.h>
#include "internal.h"
#define ALTERA_VERSION_MASK 0xffff
#define ALTERA_ETHTOOL_V1 1
int
bitset(u32 val, int bit)
{
if (val & (1 << bit))
return 1;
return 0;
}
int altera_tse_dump_regs(struct ethtool_drvinfo *info __maybe_unused,
struct ethtool_regs *regs)
{
int i;
u32 *tsereg = (unsigned int *)regs->data;
u32 version = regs->version;
if ((version & ALTERA_VERSION_MASK) > ALTERA_ETHTOOL_V1)
return -1;
/*
* Version 1: Initial TSE driver release. No feature information
* available, 32-bits of version is equal to 1.
*
* Version 2: Lower 16-bits of version is 2, upper 16 bits are:
* Bit 16 - SGMDA or MSGDMA Registers
* Bit 17 - PCS Present
* Bit 18 - Supplementary MAC Address Filter Registers Present
* Bit 19 - Multicast Hash Filter Present
* Bit 20 - IEEE 1588 Feature Present
*/
fprintf(stdout, "Altera TSE 10/100/1000 Registers, Version %d\n",
version);
fprintf(stdout, "---------------------------------------------\n");
fprintf(stdout, "Revision 0x%08X\n", tsereg[0]);
fprintf(stdout, " Core Version %d.%d\n",
(tsereg[0] & 0xffff) >> 8,
tsereg[0] & 0xff);
fprintf(stdout, " CustVersion 0x%08X\n", tsereg[0] >> 16);
fprintf(stdout, "Scratch 0x%08X\n", tsereg[1]);
fprintf(stdout, "Command/Config 0x%08X\n", tsereg[2]);
fprintf(stdout, " (0)TX_EN %d\n", bitset(tsereg[2], 0));
fprintf(stdout, " (1)RX_EN %d\n", bitset(tsereg[2], 1));
fprintf(stdout, " (2)XON_GEN %d\n", bitset(tsereg[2], 2));
fprintf(stdout, " (3)ETH_SPEED %d\n", bitset(tsereg[2], 3));
fprintf(stdout, " (4)PROMIS_EN %d\n", bitset(tsereg[2], 4));
fprintf(stdout, " (5)PAD_EN %d\n", bitset(tsereg[2], 5));
fprintf(stdout, " (6)CRC_FWD %d\n", bitset(tsereg[2], 6));
fprintf(stdout, " (7)PAUSE_FWD %d\n", bitset(tsereg[2], 7));
fprintf(stdout, " (8)PAUSE_IGN %d\n", bitset(tsereg[2], 8));
fprintf(stdout, " (9)TXADDR_INS %d\n", bitset(tsereg[2], 9));
fprintf(stdout, " (10)HD_EN %d\n", bitset(tsereg[2], 10));
fprintf(stdout, " (11)EXCESS_COL %d\n", bitset(tsereg[2], 11));
fprintf(stdout, " (12)LATE_COL %d\n", bitset(tsereg[2], 12));
fprintf(stdout, " (13)SW_RESET %d\n", bitset(tsereg[2], 13));
fprintf(stdout, " (14)MHASH_SEL %d\n", bitset(tsereg[2], 14));
fprintf(stdout, " (15)LOOP_EN %d\n", bitset(tsereg[2], 15));
fprintf(stdout, " (16-18)TX_ADDR_SEL %d\n",
(tsereg[2] & 0x30000) >> 16);
fprintf(stdout, " (19)MAGIC_EN %d\n", bitset(tsereg[2], 19));
fprintf(stdout, " (20)SLEEP %d\n", bitset(tsereg[2], 20));
fprintf(stdout, " (21)WAKEUP %d\n", bitset(tsereg[2], 21));
fprintf(stdout, " (22)XOFF_GEN %d\n", bitset(tsereg[2], 22));
fprintf(stdout, " (23)CTRL_FRAME_EN %d\n", bitset(tsereg[2], 23));
fprintf(stdout, " (24)NO_LEN_CHECK %d\n", bitset(tsereg[2], 24));
fprintf(stdout, " (25)ENA_10 %d\n", bitset(tsereg[2], 25));
fprintf(stdout, " (26)RX_ERR_DISC %d\n", bitset(tsereg[2], 26));
fprintf(stdout, " (31)CTRL_RESET %d\n", bitset(tsereg[2], 31));
fprintf(stdout, "mac_0 0x%08X\n", tsereg[3]);
fprintf(stdout, "mac_1 0x%08X\n", tsereg[4]);
fprintf(stdout, "frm_length 0x%08X\n", tsereg[5]);
fprintf(stdout, "pause_quant 0x%08X\n", tsereg[6]);
fprintf(stdout, "rx_section_empty 0x%08X\n", tsereg[7]);
fprintf(stdout, "rx_section_full 0x%08X\n", tsereg[8]);
fprintf(stdout, "tx_section_empty 0x%08X\n", tsereg[9]);
fprintf(stdout, "tx_section_full 0x%08X\n", tsereg[0xa]);
fprintf(stdout, "rx_almost_empty 0x%08X\n", tsereg[0xb]);
fprintf(stdout, "rx_almost_full 0x%08X\n", tsereg[0xc]);
fprintf(stdout, "tx_almost_empty 0x%08X\n", tsereg[0xd]);
fprintf(stdout, "tx_almost_full 0x%08X\n", tsereg[0xe]);
fprintf(stdout, "mdio_addr0 0x%08X\n", tsereg[0xf]);
fprintf(stdout, "mdio_addr1 0x%08X\n", tsereg[0x10]);
fprintf(stdout, "holdoff_quant 0x%08X\n", tsereg[0x11]);
fprintf(stdout, "tx_ipg_length 0x%08X\n", tsereg[0x17]);
fprintf(stdout, "Transmit Command 0x%08X\n", tsereg[0x3a]);
fprintf(stdout, "Receive Command 0x%08X\n", tsereg[0x3b]);
for (i = 0; i < 64; i++)
fprintf(stdout, "Multicast Hash[%02d] 0x%08X\n",
i,
tsereg[0x40 + i]);
return 0;
}
|