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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
/*
* Copyright (C) 2004
* Stephen Hemminger <shemminger@osdl.org>
*/
#include <stdio.h>
#include "ethtool-util.h"
static void dump_addr(int n, const u8 *a)
{
int i;
printf("Addr %d ", n);
for (i = 0; i < 6; i++)
printf("%02X%c", a[i], i == 5 ? '\n' : ' ');
}
static void dump_timer(const char *name, const void *p)
{
const u8 *a = p;
const u32 *r = p;
printf("%s\n", name);
printf("\tInit 0x%08X Value 0x%08X\n", r[0], r[1]);
printf("\tTest 0x%02X Control 0x%02X\n", a[8], a[9]);
}
static void dump_queue(const char *name, const void *a, int rx)
{
struct desc {
u_int32_t ctl;
u_int32_t next;
u_int32_t data_lo;
u_int32_t data_hi;
u_int32_t status;
u_int32_t timestamp;
u_int16_t csum2;
u_int16_t csum1;
u_int16_t csum2_start;
u_int16_t csum1_start;
u_int32_t addr_lo;
u_int32_t addr_hi;
u_int32_t count_lo;
u_int32_t count_hi;
u_int32_t byte_count;
u_int32_t csr;
u_int32_t flag;
};
const struct desc *d = a;
printf("\n%s\n", name);
printf("---------------\n");
printf("Descriptor Address 0x%08X%08X\n",
d->addr_hi, d->addr_lo);
printf("Address Counter 0x%08X%08X\n",
d->count_hi, d->count_lo);
printf("Current Byte Counter %d\n", d->byte_count);
printf("BMU Control/Status 0x%08X\n", d->csr);
printf("Flag & FIFO Address 0x%08X\n", d->flag);
printf("\n");
printf("Control 0x%08X\n", d->ctl);
printf("Next 0x%08X\n", d->next);
printf("Data 0x%08X%08X\n",
d->data_hi, d->data_lo);
printf("Status 0x%08X\n", d->status);
printf("Timestamp 0x%08X\n", d->timestamp);
if (rx) {
printf("Csum1 Offset %4d Positon %d\n",
d->csum1, d->csum1_start);
printf("Csum2 Offset %4d Positon %d\n",
d->csum2, d->csum2_start);
} else
printf("Csum Start 0x%04X Pos %4d Write %d\n",
d->csum1, d->csum2_start, d->csum1_start);
}
static void dump_ram(const char *name, const void *p)
{
const u32 *r = p;
printf("\n%s\n", name);
printf("---------------\n");
printf("Start Address 0x%08X\n", r[0]);
printf("End Address 0x%08X\n", r[1]);
printf("Write Pointer 0x%08X\n", r[2]);
printf("Read Pointer 0x%08X\n", r[3]);
printf("Upper Threshold/Pause Packets 0x%08X\n", r[4]);
printf("Lower Threshold/Pause Packets 0x%08X\n", r[5]);
printf("Upper Threshold/High Priority 0x%08X\n", r[6]);
printf("Lower Threshold/High Priority 0x%08X\n", r[7]);
printf("Packet Counter 0x%08X\n", r[8]);
printf("Level 0x%08X\n", r[9]);
printf("Test 0x%08X\n", r[10]);
}
static void dump_fifo(const char *name, const void *p)
{
const u32 *r = p;
printf("\n%s\n", name);
printf("---------------\n");
printf("End Address 0x%08X\n", r[0]);
printf("Write Pointer 0x%08X\n", r[1]);
printf("Read Pointer 0x%08X\n", r[2]);
printf("Packet Counter 0x%08X\n", r[3]);
printf("Level 0x%08X\n", r[4]);
printf("Control 0x%08X\n", r[5]);
printf("Control/Test 0x%08X\n", r[6]);
dump_timer("LED", p + 0x20);
}
int skge_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
{
const u32 *r = (const u32 *) regs->data;
int dual = !(regs->data[0x11a] & 1);
printf("Control Registers\n");
printf("-----------------\n");
printf("Register Access Port 0x%08X\n", r[0]);
printf("LED Control/Status 0x%08X\n", r[1]);
printf("Interrupt Source 0x%08X\n", r[2]);
printf("Interrupt Mask 0x%08X\n", r[3]);
printf("Interrupt Hardware Error Source 0x%08X\n", r[4]);
printf("Interrupt Hardware Error Mask 0x%08X\n", r[5]);
printf("Special Interrupt Source 0x%08X\n", r[6]);
printf("\nBus Management Unit\n");
printf("-------------------\n");
printf("CSR Receive Queue 1 0x%08X\n", r[24]);
printf("CSR Sync Queue 1 0x%08X\n", r[26]);
printf("CSR Async Queue 1 0x%08X\n", r[27]);
if (dual) {
printf("CSR Receive Queue 2 0x%08X\n", r[25]);
printf("CSR Async Queue 2 0x%08X\n", r[29]);
printf("CSR Sync Queue 2 0x%08X\n", r[28]);
}
printf("\nMAC Address\n");
printf("-------------\n");
dump_addr(1, regs->data + 0x100);
dump_addr(2, regs->data + 0x108);
dump_addr(3, regs->data + 0x110);
printf("\n");
printf("Connector type 0x%02X\n",
regs->data[0x118]);
printf("PMD type 0x%02X\n",
regs->data[0x119]);
printf("Configuration 0x%02X\n",
regs->data[0x11a]);
printf("Chip Revision 0x%02X\n",
regs->data[0x11b]);
dump_timer("Timer", regs->data + 0x130);
dump_timer("IRQ Moderation", regs->data +0x140);
dump_timer("Blink Source", regs->data +0x170);
dump_queue("Receive Queue 1", regs->data +0x400, 1);
dump_queue("Sync Transmit Queue 1", regs->data +0x600, 0);
dump_queue("Async Transmit Queue 1", regs->data +0x680, 0);
if (dual) {
dump_queue("Receive Queue 2", regs->data +0x480, 1);
dump_queue("Async Transmit Queue 2", regs->data +0x780, 0);
dump_queue("Sync Transmit Queue 2", regs->data +0x700, 0);
}
dump_ram("Receive RAMbuffer 1", regs->data+0x800);
dump_ram("Sync Transmit RAMbuffer 1", regs->data+0xa00);
dump_ram("Async Transmit RAMbuffer 1", regs->data+0xa80);
if (dual) {
dump_ram("Receive RAMbuffer 2", regs->data+0x880);
dump_ram("Sync Transmit RAMbuffer 2", regs->data+0xb00);
dump_ram("Async Transmit RAMbuffer 21", regs->data+0xb80);
}
dump_fifo("Receive MAC FIFO 1", regs->data+0xc00);
dump_fifo("Transmit MAC FIFO 1", regs->data+0xd00);
if (dual) {
dump_fifo("Receive MAC FIFO 2", regs->data+0xc80);
dump_fifo("Transmit MAC FIFO 2", regs->data+0xd80);
}
dump_timer("Descriptor Poll", regs->data+0xe00);
return 0;
}
|