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
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
|
/* uti596.h: Contains the defines and structures used by the uti596 driver */
/*
* EII: March 11: Created v. 0.0
*/
#ifndef UTI596_H
#define UTI596_H
#include <rtems/error.h>
#include <rtems/rtems_bsdnet.h>
#include <sys/param.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
#include <sys/sockio.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
/* Ethernet statistics */
struct enet_statistics{
int rx_packets; /* total packets received */
int tx_packets; /* total packets transmitted */
int rx_errors; /* bad packets received */
int tx_errors; /* packet transmit problems */
int rx_dropped; /* no space in buffers */
int tx_dropped;
int tx_retries_exceeded; /* excessive retries */
int multicast; /* multicast packets received */
int collisions;
/* detailed rx_errors: */
int rx_length_errors;
int rx_over_errors; /* receiver ring buff overflow */
int rx_crc_errors; /* recved pkt with crc error */
int rx_frame_errors; /* recv'd frame alignment error */
int rx_fifo_errors; /* recv'r fifo overrun */
int rx_missed_errors; /* receiver missed packet */
/* detailed tx_errors */
int tx_aborted_errors;
int tx_carrier_errors;
int tx_fifo_errors;
int tx_heartbeat_errors;
int tx_window_errors;
/* NIC reset errors */
int nic_reset_count; /* The number of times uti596reset() has been called. */
};
#define CMD_EOL 0x8000 /* The last command of the list, stop. */
#define CMD_SUSP 0x4000 /* Suspend after doing cmd. */
#define CMD_INTR 0x2000 /* Interrupt after doing cmd. */
#define CMD_FLEX 0x0008 /* Enable flexible memory model */
#define SCB_STAT_CX 0x8000 /* Cmd completes with 'I' bit set */
#define SCB_STAT_FR 0x4000 /* Frame Received */
#define SCB_STAT_CNA 0x2000 /* Cmd unit Not Active */
#define SCB_STAT_RNR 0x1000 /* Receiver Not Ready */
#define SCB_CUS_SUSPENDED 0x0100
#define SCB_CUS_ACTIVE 0x0200
#define STAT_C 0x8000 /* Set to 1 after execution */
#define STAT_B 0x4000 /* 1 : Cmd being executed, 0 : Cmd done. */
#define STAT_OK 0x2000 /* 1: Command executed ok 0 : Error */
#define STAT_A 0x1000 /* command has been aborted */
#define STAT_S11 0x0800
#define STAT_S10 0x0400
#define STAT_S9 0x0200
#define STAT_S8 0x0100
#define STAT_S7 0x0080
#define STAT_S6 0x0040
#define STAT_S5 0x0020
#define STAT_MAX_COLLS 0x000F
#define RBD_STAT_P 0x4000 /* prefetch */
#define RBD_STAT_F 0x4000 /* used */
#define CUC_START 0x0100
#define CUC_RESUME 0x0200
#define CUC_SUSPEND 0x0300
#define CUC_ABORT 0x0400
#define RX_START 0x0010
#define RX_RESUME 0x0020
#define RX_SUSPEND 0x0030
#define RX_ABORT 0x0040
#define RU_SUSPENDED 0x0010
#define RU_NO_RESOURCES 0x0020
#define RU_READY 0x0040
#define I596_NULL ( ( void * ) 0xffffffff)
#define UTI_596_END_OF_FRAME 0x8000
struct i596_tbd; /* necessary forward declaration */
enum commands {
CmdNOp = 0,
CmdSASetup = 1,
CmdConfigure = 2,
CmdMulticastList = 3,
CmdTx = 4,
CmdTDR = 5,
CmdDump = 6,
CmdDiagnose = 7
};
/*
* 82596 Dump Command Result
*/
typedef volatile struct i596_dump_result {
unsigned char bf;
unsigned char config_bytes[11];
unsigned char reserved1[2];
unsigned char ia_bytes[6];
unsigned short last_tx_status;
unsigned short tx_crc_byte01;
unsigned short tx_crc_byte23;
unsigned short rx_crc_byte01;
unsigned short rx_crc_byte23;
unsigned short rx_temp_mem01;
unsigned short rx_temp_mem23;
unsigned short rx_temp_mem45;
unsigned short last_rx_status;
unsigned short hash_reg01;
unsigned short hash_reg23;
unsigned short hash_reg45;
unsigned short hash_reg67;
unsigned short slot_time_counter;
unsigned short wait_time_counter;
unsigned short rx_frame_length;
unsigned long reserved2;
unsigned long cb_in3;
unsigned long cb_in2;
unsigned long cb_in1;
unsigned long la_cb_addr;
unsigned long rdb_pointer;
unsigned long int_memory;
unsigned long rfd_size;
unsigned long tbd_pointer;
unsigned long base_addr;
unsigned long ru_temp_reg;
unsigned long tcb_count;
unsigned long next_rb_size;
unsigned long next_rb_addr;
unsigned long curr_rb_size;
unsigned long la_rbd_addr;
unsigned long next_rbd_addr;
unsigned long curr_rbd_addr;
unsigned long curr_rb_count;
unsigned long next_fd_addr;
unsigned long curr_fd_add;
unsigned long temp_cu_reg;
unsigned long next_tb_count;
unsigned long buffer_addr;
unsigned long la_tbd_addr;
unsigned long next_tbd_addr;
unsigned long cb_command;
unsigned long next_cb_addr;
unsigned long curr_cb_addr;
unsigned long scb_cmd_word;
unsigned long scb_pointer;
unsigned long cb_stat_word;
unsigned long mm_lfsr;
unsigned char micro_machine_bit_array[28];
unsigned char cu_port[16];
unsigned long mm_alu;
unsigned long reserved3;
unsigned long mm_temp_a_rr;
unsigned long mm_temp_a;
unsigned long tx_dma_b_cnt;
unsigned long mm_input_port_addr_reg;
unsigned long tx_dma_addr;
unsigned long mm_port_reg1;
unsigned long rx_dma_b_cnt;
unsigned long mm_port_reg2;
unsigned long rx_dma_addr;
unsigned long reserved4;
unsigned long bus_t_timers;
unsigned long diu_cntrl_reg;
unsigned long reserved5;
unsigned long sysbus;
unsigned long biu_cntrl_reg;
unsigned long mm_disp_reg;
unsigned long mm_status_reg;
unsigned short dump_status;
} i596_dump_result;
typedef volatile struct i596_selftest {
unsigned long rom_signature;
unsigned long results;
} i596_selftest;
/*
* Action commands
* (big endian, linear mode)
*/
typedef volatile struct i596_cmd {
unsigned short status;
unsigned short command;
volatile struct i596_cmd *next;
} i596_cmd;
typedef volatile struct i596_nop {
i596_cmd cmd;
} i596_nop;
typedef volatile struct i596_set_add {
i596_cmd cmd;
char data[8];
} i596_set_add;
typedef volatile struct i596_configure {
i596_cmd cmd;
char data[16];
} i596_configure;
typedef volatile struct i596_tx {
i596_cmd cmd;
volatile struct i596_tbd *pTbd;
unsigned short count;
unsigned short pad;
char data[6];
unsigned short length;
} i596_tx;
typedef volatile struct i596_tdr {
i596_cmd cmd;
unsigned long data;
} i596_tdr;
typedef volatile struct i596_dump {
i596_cmd cmd;
char *pData;
} i596_dump;
/*
* Transmit buffer descriptor
*/
typedef volatile struct i596_tbd {
unsigned short size;
unsigned short pad;
volatile struct i596_tbd *next;
char *data;
} i596_tbd;
/*
* Receive buffer descriptor
* (flexible memory structure)
*/
typedef volatile struct i596_rbd {
unsigned short count;
unsigned short offset;
volatile struct i596_rbd *next;
char *data;
unsigned short size;
unsigned short pad;
} i596_rbd;
/*
* Receive Frame Descriptor
*/
typedef volatile struct i596_rfd {
unsigned short stat;
unsigned short cmd;
volatile struct i596_rfd *next;
i596_rbd *pRbd;
unsigned short count;
unsigned short size;
char data [1532];
} i596_rfd;
/*
* System Control Block
*/
typedef volatile struct i596_scb {
unsigned short status;
unsigned short command;
unsigned long cmd_pointer;
unsigned long rfd_pointer;
unsigned long crc_err;
unsigned long align_err;
unsigned long resource_err;
unsigned long over_err;
unsigned long rcvdt_err;
unsigned long short_err;
unsigned short t_off;
unsigned short t_on;
i596_cmd *pCmd;
i596_rfd *pRfd;
} i596_scb;
/*
* Intermediate System Configuration Pointer
*/
typedef volatile struct i596_iscp {
uint8_t null1; /* Always zero */
uint8_t busy; /* Busy byte */
unsigned short scb_offset; /* Not used in linear mode */
unsigned long scb_pointer; /* Swapped pointer to scb */
i596_scb *scb; /* Real pointer to scb */
} i596_iscp;
/*
* System Configuration Pointer
*/
typedef volatile struct i596_scp {
unsigned long sysbus; /* Only low 8 bits are used */
unsigned long pad; /* Must be zero */
unsigned long iscp_pointer; /* Swapped pointer to iscp */
i596_iscp *iscp; /* Real pointer to iscp */
} i596_scp;
/*
* Device Dependent Data Structure
*/
typedef volatile struct uti596_softc {
struct arpcom arpcom;
i596_scp *pScp; /* Block aligned on 16 byte boundary */
i596_scp *base_scp; /* Unaligned block. Need for free() */
i596_iscp iscp;
i596_scb scb;
i596_set_add set_add;
i596_configure set_conf;
i596_tdr tdr;
i596_nop nop;
i596_tx *pTxCmd;
i596_tbd *pTbd;
i596_rfd *pBeginRFA;
i596_rfd *pEndRFA;
i596_rfd *pLastUnkRFD;
i596_rbd *pLastUnkRBD;
i596_rfd *pEndSavedQueue;
i596_cmd *pCmdHead;
i596_cmd *pCmdTail; /* unneeded, as chaining not used, but implemented */
rtems_id rxDaemonTid;
rtems_id txDaemonTid;
rtems_id resetDaemonTid;
struct enet_statistics stats;
int started;
unsigned long rxInterrupts;
unsigned long txInterrupts;
volatile int cmdOk;
unsigned short * pCurrent_command_status;
int resetDone;
unsigned long txRawWait;
i596_rfd *pInboundFrameQueue;
short int rxBdCount;
short int txBdCount;
short int countRFD;
short int savedCount;
i596_rfd *pSavedRfdQueue;
rtems_name semaphore_name;
rtems_id semaphore_id;
char zeroes[64];
unsigned long rawsndcnt;
int nic_reset; /* flag for requesting that ISR issue a reset quest */
} uti596_softc_;
#endif /* UTI596_H */
|