source: rtems/c/src/lib/libbsp/m68k/mvme167/network/uti596.h @ e4c07444

4.104.114.84.95
Last change on this file since e4c07444 was 5a23ca84, checked in by Joel Sherrill <joel.sherrill@…>, on 04/05/00 at 13:01:21

New files from John Cotton <John.Cotton@…> and Charles-Antoine
Gauthier <charles.gauthier@…>. The power supply in their
VMEbus cage died so it was submitted at this point. It passes ttcp
which is a really good sign but they would like to do more testing
and cleanup once their hardware is functional again. Please
contact them if you are interested in using or fixing this driver.
As their comments indicate, the performance is actually quite good
even at this point as indicated by the ttcp results.

Please note that this is by no means a final version. The code is still
fairly ugly, and will require some further fixing. On the bright side, what
is attached works. I finally ran the test programs successfully with
optimized code and data cache enabled:

netdemos worked, but failed on the UDP transfer (runs out of buffers).

ttcp worked, with something like 1036 KB/sec Rx, 952 KB/sec Tx.

tftp worked

  • Property mode set to 100644
File size: 7.5 KB
Line 
1
2/* uti596.h: Contains the defines and structures used by the uti596 driver */
3
4/*
5 * EII: March 11: Created v. 0.0
6 *      Jan 12/98 Added STAT bits, s11-=s5 and max_colls.
7 *
8 *  $Id$
9 */
10
11#ifndef UTI596_H
12#define UTI596_H
13#include <rtems/error.h>
14#include <rtems/rtems_bsdnet.h>
15
16#include <sys/param.h>
17#include <sys/mbuf.h>
18#include <sys/socket.h>
19#include <sys/sockio.h>
20
21#include <net/if.h>
22
23#include <netinet/in.h>
24#include <netinet/if_ether.h>
25
26/* Ethernet statistics */
27
28struct enet_statistics{
29  int   rx_packets;                                                     /* total packets received */
30  int   tx_packets;                                                     /* total packets transmitted */
31  int   rx_errors;                                                      /* bad packets received */
32  int   tx_errors;                                                      /* packet transmit problems     */
33  int   rx_dropped;                                                     /* no space in buffers */
34  int   tx_dropped;
35  int   tx_retries_exceeded;  /* excessive retries */
36  int   multicast;                                                      /* multicast packets received   */
37  int   collisions;
38
39  /* detailed rx_errors: */
40  int   rx_length_errors;
41  int   rx_over_errors;                                 /* receiver ring buff overflow  */
42  int   rx_crc_errors;                                  /* recved pkt with crc error    */
43  int   rx_frame_errors;                                /* recv'd frame alignment error */
44  int   rx_fifo_errors;                                 /* recv'r fifo overrun          */
45  int   rx_missed_errors;                               /* receiver missed packet       */
46
47  /* detailed tx_errors */
48  int   tx_aborted_errors;
49  int   tx_carrier_errors;
50  int   tx_fifo_errors;
51  int   tx_heartbeat_errors;
52  int   tx_window_errors;
53
54  /* NIC reset errors */
55  int   nic_reset_count;      /* The number of times uti596reset() has been called. */
56};
57
58#define UTI596_MUTEX   1
59
60
61#define CMD_EOL                                         0x8000          /* The last command of the list, stop. */
62#define CMD_SUSP                                        0x4000          /* Suspend after doing cmd.                                      */
63#define CMD_INTR                                        0x2000          /* Interrupt after doing cmd.                            */
64
65#define CMD_FLEX                                        0x0008          /* Enable flexible memory model */
66
67#define SCB_STAT_CX             0x8000          /* Cmd completes with 'I' bit set */
68#define SCB_STAT_FR             0x4000          /* Frame Received                 */
69#define SCB_STAT_CNA            0x2000          /* Cmd unit Not Active            */
70#define SCB_STAT_RNR            0x1000          /* Receiver Not Ready             */
71
72#define SCB_CUS_SUSPENDED 0x0100
73#define SCB_CUS_ACTIVE    0x0200
74
75
76#define STAT_C                                          0x8000          /* Set to 1 after execution              */
77#define STAT_B                                          0x4000          /* 1 : Cmd being executed, 0 : Cmd done. */
78#define STAT_OK                                         0x2000          /* 1: Command executed ok 0 : Error      */
79#define STAT_A                                  0x1000          /* command has been aborted              */
80
81#define STAT_S11                0x0800
82#define STAT_S10                0x0400
83#define STAT_S9                 0x0200
84#define STAT_S8                 0x0100
85#define STAT_S7                 0x0080
86#define STAT_S6                 0x0040
87#define STAT_S5                 0x0020
88#define STAT_MAX_COLLS          0x000F
89
90
91
92#define RBD_STAT_P              0x4000          /* prefetch */
93#define RBD_STAT_F              0x4000          /* used */
94
95#define CUC_START                                       0x0100
96#define CUC_RESUME                              0x0200
97#define CUC_SUSPEND             0x0300
98#define CUC_ABORT                                       0x0400
99#define RX_START                                        0x0010
100#define RX_RESUME                                       0x0020
101#define RX_SUSPEND                              0x0030
102#define RX_ABORT                                        0x0040
103
104#define RU_SUSPENDED            0x0010
105#define RU_NO_RESOURCES         0x0020
106#define RU_READY                0x0040
107
108
109#define IO_ADDR                 0x360
110#define PORT_ADDR               IO_ADDR
111#define CHAN_ATTN               PORT_ADDR + 4
112#define NIC_ADDR                PORT_ADDR + 8
113
114#define I596_NULL ( ( void * ) 0xffffffff)
115#define UTI_596_END_OF_FRAME 0x8000
116#define SIZE_MASK       0x3fff
117
118struct i596_tbd;
119
120enum commands {
121  CmdNOp           = 0,
122  CmdSASetup       = 1,
123  CmdConfigure     = 2,
124  CmdMulticastList = 3,
125  CmdTx            = 4,
126  CmdTDR           = 5,
127  CmdDump          = 6,
128  CmdDiagnose      = 7
129};
130
131/*
132 * Action commands
133 *   (big endian, linear mode)
134 */
135typedef volatile struct i596_cmd {
136  volatile unsigned short status;
137  volatile unsigned short command;
138  volatile struct i596_cmd *next;
139} i596_cmd;
140
141typedef volatile struct i596_nop {
142  i596_cmd cmd;
143} i596_nop;
144
145typedef volatile struct i596_set_add {
146  i596_cmd cmd;
147  char   data[8];
148} i596_set_add;
149
150typedef volatile struct i596_configure {
151  i596_cmd cmd;
152  char   data[16];
153} i596_configure;
154
155typedef volatile struct i596_tx {
156    i596_cmd cmd;
157    volatile struct i596_tbd *pTbd;
158    unsigned short count;
159    unsigned short pad;
160    char data[6];
161    unsigned short length;
162} i596_tx;
163
164typedef volatile struct i596_tdr {
165  i596_cmd cmd;
166  unsigned long data;
167} i596_tdr;
168
169typedef volatile struct i596_dump {
170  i596_cmd cmd;
171  char   *pData;
172} i596_dump;
173
174/*
175 * Transmit buffer descriptor
176 */
177typedef volatile struct i596_tbd {
178    unsigned short size;
179    unsigned short pad;
180    volatile struct i596_tbd *next;
181    char *data;
182} i596_tbd;
183
184/*
185 * Receive buffer descriptor
186 *   (flexible memory structure)
187 */
188typedef volatile struct i596_rbd {
189    unsigned short count;
190    unsigned short offset;
191    volatile struct i596_rbd *next;
192    char *data;
193    unsigned short size;
194    unsigned short pad;
195} i596_rbd;
196
197/*
198 * Receive Frame Descriptor
199 */
200typedef volatile struct i596_rfd {
201    volatile unsigned short stat;
202    volatile unsigned short cmd;
203    volatile struct i596_rfd *next;
204    i596_rbd *pRbd;
205    unsigned short count;
206    unsigned short size;
207    char data [1532];   
208} i596_rfd;
209
210#define RX_RING_SIZE 8
211
212/*
213 * System Control Block
214 */
215typedef volatile struct i596_scb {
216    volatile unsigned short status;
217    volatile unsigned short command;
218    volatile unsigned long Cmd_val;
219    volatile unsigned long Rfd_val;
220    volatile unsigned long crc_err;
221    volatile unsigned long align_err;
222    volatile unsigned long resource_err;
223    volatile unsigned long over_err;
224    volatile unsigned long rcvdt_err;
225    volatile unsigned long short_err;
226    volatile unsigned short t_off;
227    volatile unsigned short t_on;
228    i596_cmd *pCmd;
229    i596_rfd *pRfd;
230} i596_scb;
231
232/*
233 * Intermediate System Configuration Pointer
234 */
235typedef volatile struct i596_iscp {
236    volatile unsigned long stat;
237    volatile unsigned long scb_val;
238    i596_scb *scb;
239} i596_iscp;
240
241/*
242 * System Configuration Pointer
243 */
244typedef volatile struct i596_scp {
245    unsigned long sysbus;
246    unsigned long pad;
247    unsigned long iscp_val;
248    i596_iscp *iscp;
249} i596_scp;
250
251typedef volatile struct uti596_softc {
252  struct arpcom          arpcom;
253  i596_scp              *pScp;
254  i596_iscp              iscp;
255  i596_scb               scb;
256  i596_set_add           set_add;
257  i596_configure         set_conf;
258  i596_tdr               tdr;
259  i596_nop               nop;               
260  unsigned long          stat;
261  i596_tx               *pTxCmd;
262  i596_tbd              *pTbd;
263
264  int                   ioAddr;
265
266  i596_rfd     *pBeginRFA;
267  i596_rfd     *pEndRFA;
268  i596_rfd     *pLastUnkRFD;
269  i596_rbd     *pLastUnkRBD;
270  i596_rfd     *pEndSavedQueue;
271  i596_cmd     *pCmdHead;
272  i596_cmd     *pCmdTail;  /* unneeded, as chaining not used, but implemented */
273
274  rtems_id              rxDaemonTid;
275  rtems_id              txDaemonTid;
276  rtems_id              resetDaemonTid;
277
278  struct enet_statistics stats;
279  int                  started;
280  unsigned long        rxInterrupts;
281  unsigned long        txInterrupts;
282  volatile int         cmdOk;
283  int                  resetDone;
284  unsigned long        txRawWait;
285  i596_rfd            *pInboundFrameQueue;
286  short int            rxBdCount;
287  short int            txBdCount;
288  short int            countRFD;
289  short int            savedCount;
290  i596_rfd            *pSavedRfdQueue;
291  rtems_name           semaphore_name;
292  rtems_id             semaphore_id;
293  char                 zeroes[64];
294  unsigned long        rawsndcnt;
295  int                  nic_reset; /* flag is for requesting that ISR issue a reset quest */
296} uti596_softc_;
297
298#endif /* UTI596_H */
Note: See TracBrowser for help on using the repository browser.