OSDN Git Service

2013.10.24
[uclinux-h8/uClinux-dist.git] / user / ethtool / skge.c
1 /*
2  * Copyright (C) 2004
3  *  Stephen Hemminger <shemminger@osdl.org>
4  */
5
6 #include <stdio.h>
7
8 #include "ethtool-util.h"
9
10 static void dump_addr(int n, const u8 *a)
11 {
12         int i;
13
14         printf("Addr %d            ", n);
15         for (i = 0; i < 6; i++)
16                 printf("%02X%c", a[i], i == 5 ? '\n' : ' ');
17 }
18
19 static void dump_timer(const char *name, const void *p)
20 {
21         const u8 *a = p;
22         const u32 *r = p;
23
24         printf("%s\n", name);
25         printf("\tInit 0x%08X Value 0x%08X\n", r[0], r[1]);
26         printf("\tTest 0x%02X       Control 0x%02X\n", a[8], a[9]);
27 }
28
29 static void dump_queue(const char *name, const void *a, int rx)
30 {
31         struct desc {
32                 u_int32_t               ctl;
33                 u_int32_t               next;
34                 u_int32_t               data_lo;
35                 u_int32_t               data_hi;
36                 u_int32_t               status;
37                 u_int32_t               timestamp;
38                 u_int16_t               csum2;
39                 u_int16_t               csum1;
40                 u_int16_t               csum2_start;
41                 u_int16_t               csum1_start;
42                 u_int32_t               addr_lo;
43                 u_int32_t               addr_hi;
44                 u_int32_t               count_lo;
45                 u_int32_t               count_hi;
46                 u_int32_t               byte_count;
47                 u_int32_t               csr;
48                 u_int32_t               flag;
49         };
50         const struct desc *d = a;
51
52         printf("\n%s\n", name);
53         printf("---------------\n");
54         printf("Descriptor Address       0x%08X%08X\n",
55                d->addr_hi, d->addr_lo);
56         printf("Address Counter          0x%08X%08X\n",
57                d->count_hi, d->count_lo);
58         printf("Current Byte Counter             %d\n", d->byte_count);
59         printf("BMU Control/Status               0x%08X\n", d->csr);
60         printf("Flag & FIFO Address              0x%08X\n", d->flag);
61         printf("\n");
62         printf("Control                          0x%08X\n", d->ctl);
63         printf("Next                             0x%08X\n", d->next);
64         printf("Data                     0x%08X%08X\n",
65                d->data_hi, d->data_lo);
66         printf("Status                           0x%08X\n", d->status);
67         printf("Timestamp                        0x%08X\n", d->timestamp);
68         if (rx) {
69                 printf("Csum1      Offset %4d Positon   %d\n",
70                        d->csum1, d->csum1_start);
71                 printf("Csum2      Offset %4d Positon   %d\n",
72                        d->csum2, d->csum2_start);
73         } else
74                 printf("Csum Start 0x%04X Pos %4d Write %d\n",
75                        d->csum1, d->csum2_start, d->csum1_start);
76
77 }
78
79 static void dump_ram(const char *name, const void *p)
80 {
81         const u32 *r = p;
82
83         printf("\n%s\n", name);
84         printf("---------------\n");
85         printf("Start Address                    0x%08X\n", r[0]);
86         printf("End Address                      0x%08X\n", r[1]);
87         printf("Write Pointer                    0x%08X\n", r[2]);
88         printf("Read Pointer                     0x%08X\n", r[3]);
89         printf("Upper Threshold/Pause Packets    0x%08X\n", r[4]);
90         printf("Lower Threshold/Pause Packets    0x%08X\n", r[5]);
91         printf("Upper Threshold/High Priority    0x%08X\n", r[6]);
92         printf("Lower Threshold/High Priority    0x%08X\n", r[7]);
93         printf("Packet Counter                   0x%08X\n", r[8]);
94         printf("Level                            0x%08X\n", r[9]);
95         printf("Test                             0x%08X\n", r[10]);
96 }
97
98 static void dump_fifo(const char *name, const void *p)
99 {
100         const u32 *r = p;
101
102         printf("\n%s\n", name);
103         printf("---------------\n");
104         printf("End Address                      0x%08X\n", r[0]);
105         printf("Write Pointer                    0x%08X\n", r[1]);
106         printf("Read Pointer                     0x%08X\n", r[2]);
107         printf("Packet Counter                   0x%08X\n", r[3]);
108         printf("Level                            0x%08X\n", r[4]);
109         printf("Control                          0x%08X\n", r[5]);
110         printf("Control/Test                     0x%08X\n", r[6]);
111         dump_timer("LED", p + 0x20);
112 }
113
114 int skge_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
115 {
116         const u32 *r = (const u32 *) regs->data;
117         int dual = !(regs->data[0x11a] & 1);
118
119         printf("Control Registers\n");
120         printf("-----------------\n");
121
122         printf("Register Access Port             0x%08X\n", r[0]);
123         printf("LED Control/Status               0x%08X\n", r[1]);
124         printf("Interrupt Source                 0x%08X\n", r[2]);
125         printf("Interrupt Mask                   0x%08X\n", r[3]);
126         printf("Interrupt Hardware Error Source  0x%08X\n", r[4]);
127         printf("Interrupt Hardware Error Mask    0x%08X\n", r[5]);
128         printf("Special Interrupt Source         0x%08X\n", r[6]);
129
130         printf("\nBus Management Unit\n");
131         printf("-------------------\n");
132         printf("CSR Receive Queue 1              0x%08X\n", r[24]);
133         printf("CSR Sync Queue 1                 0x%08X\n", r[26]);
134         printf("CSR Async Queue 1                0x%08X\n", r[27]);
135         if (dual) {
136                 printf("CSR Receive Queue 2              0x%08X\n", r[25]);
137                 printf("CSR Async Queue 2                0x%08X\n", r[29]);
138                 printf("CSR Sync Queue 2                 0x%08X\n", r[28]);
139         }
140
141         printf("\nMAC Address\n");
142         printf("-------------\n");
143         dump_addr(1, regs->data + 0x100);
144         dump_addr(2, regs->data + 0x108);
145         dump_addr(3, regs->data + 0x110);
146         printf("\n");
147
148         printf("Connector type                         0x%02X\n",
149                regs->data[0x118]);
150         printf("PMD type                               0x%02X\n",
151                regs->data[0x119]);
152         printf("Configuration                          0x%02X\n",
153                regs->data[0x11a]);
154         printf("Chip Revision                          0x%02X\n",
155                regs->data[0x11b]);
156
157         dump_timer("Timer", regs->data + 0x130);
158         dump_timer("IRQ Moderation", regs->data +0x140);
159         dump_timer("Blink Source", regs->data +0x170);
160
161         dump_queue("Receive Queue 1", regs->data +0x400, 1);
162         dump_queue("Sync Transmit Queue 1", regs->data +0x600, 0);
163         dump_queue("Async Transmit Queue 1", regs->data +0x680, 0);
164         if (dual) {
165                 dump_queue("Receive Queue 2", regs->data +0x480, 1);
166                 dump_queue("Async Transmit Queue 2", regs->data +0x780, 0);
167                 dump_queue("Sync Transmit Queue 2", regs->data +0x700, 0);
168         }
169
170         dump_ram("Receive RAMbuffer 1", regs->data+0x800);
171         dump_ram("Sync Transmit RAMbuffer 1", regs->data+0xa00);
172         dump_ram("Async Transmit RAMbuffer 1", regs->data+0xa80);
173         if (dual) {
174                 dump_ram("Receive RAMbuffer 2", regs->data+0x880);
175                 dump_ram("Sync Transmit RAMbuffer 2", regs->data+0xb00);
176                 dump_ram("Async Transmit RAMbuffer 21", regs->data+0xb80);
177         }
178
179         dump_fifo("Receive MAC FIFO 1", regs->data+0xc00);
180         dump_fifo("Transmit MAC FIFO 1", regs->data+0xd00);
181         if (dual) {
182                 dump_fifo("Receive MAC FIFO 2", regs->data+0xc80);
183                 dump_fifo("Transmit MAC FIFO 2", regs->data+0xd80);
184         }
185
186         dump_timer("Descriptor Poll", regs->data+0xe00);
187         return 0;
188
189 }