summaryrefslogtreecommitdiff
path: root/system/alpha/h/am79c960.h
blob: 727d992928011a9705be28c1150dd579aeef4ffe (plain)
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
370
371
372
373
374
375
376
377
378
379
380
381
#ifndef __AM79C960_H_LOADED
#define __AM79C960_H_LOADED
/*****************************************************************************

       Copyright © 1993, 1994 Digital Equipment Corporation,
                       Maynard, Massachusetts.

                        All Rights Reserved

Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted, provided
that the copyright notice and this permission notice appear in all copies
of software and supporting documentation, and that the name of Digital not
be used in advertising or publicity pertaining to distribution of the software
without specific, written prior permission. Digital grants this permission
provided that you prominently mark, as not part of the original, any
modifications made to this software or documentation.

Digital Equipment Corporation disclaims all warranties and/or guarantees
with regard to this software, including all implied warranties of fitness for
a particular purpose and merchantability, and makes no representations
regarding the use of, or the results of the use of, the software and
documentation in terms of correctness, accuracy, reliability, currentness or
otherwise; and you rely on the software, documentation and results solely at
your own risk.

******************************************************************************/

/*
 * $Id: am79c960.h,v 1.1.1.1 1997/10/30 23:27:13 verghese Exp $
 */

/*
 * MODULE DESCRIPTION:
 *
 *    Parameters and logicals for AM79C960 drivers in EB64 monitor
 *
 * HISTORY:
 *
 * $Log: am79c960.h,v $
 * Revision 1.1.1.1  1997/10/30 23:27:13  verghese
 * current 10/29/97
 *
 * Revision 1.8  1994/12/12  21:31:59  cruz
 * Fixed bug in TMD3 constants
 *
 * Revision 1.7  1994/08/05  20:13:47  fdh
 * Updated Copyright header and RCS $Id: identifier.
 *
 * Revision 1.6  1994/06/28  20:08:21  fdh
 * Modified filenames and build precedure to fit into a FAT filesystem.
 *
 * Revision 1.5  1994/06/24  15:26:49  rusling
 * Fixed initialization alignment problems.
 *
 * Revision 1.4  1994/06/20  14:18:59  fdh
 * Fixup header file preprocessor #include conditionals.
 *
 * Revision 1.3  1994/06/17  19:34:01  fdh
 * Clean-up...
 *
 * Revision 1.2  1994/06/03  20:11:11  fdh
 * Replaced shorts declared in bitfields to ints.
 *
 * Revision 1.1  1993/08/06  10:10:05  berent
 * Initial revision
 *
 *
 */



/*  The embedded Ethernet controller on the EB64 is an AMD Am79C960 device.
 *
 *  This device integrates an Am7990 LANCE Ethernet controller with an ISA
 *  bus interface plus all the serial interface logic bar some discrete
 *  termination and isolation transformers for AUI (10base5) and twisted
 *  pair (10baseT) connections.
 *
 *  The AUI port on EB64 is connected to an Am7996 thinwire transceiver to
 *  provide a 10base2 port (BNC) as well as the twisted pair (MMJ)
 *  connectivity.
 *
 *  The device is programmed in a similar but not identical fashion to the
 *  LANCE. The following programming differences and features are noted:
 *
 *  A RAP/RDP mechanism is used for register access like the LANCE, but with
 *  a much larger register set:
 *
 *        Initialisation block now part of on-chip register set with new
 *        ...features added to the mode register. This can be set up in
 *        ...memory and copied by the device using the csr0_INIT bit, or
 *        ...programmed directly to the device using the extended CSR map.
 *
 *        CSR3 completely changed - interrupt mask and enabling bits for
 *        ...new features
 *
 *        CSR3 can be accessed while the "LANCE" running
 *
 *        A register added for controlling the ISA bus DMA profile eg. FIFO
 *        ...watermarks for DMA loads and stores, TX transmission start
 *        ...point wrt data in TX FIFO, DMA burstsizes.
 *
 *        Registers to overrule ring sizes in initialisation blocks allowing
 *        ...ring sizes from 1-64k entries. CSR76 for RX; CSR78 for TX
 *
 *         Timer and ID registers
 *
 *         Missed pkt and RX collision counters
 *
 * A similar RAP/IDP mechanism is used to program ISA DMA signal timing, ISA
 * bus configuration, bits, and the functionality for the three LED drives
 * provided.
 *
 * The Am79C960 *must* use a 16-bit DMA path, but can use an 8-bit path for
 * CSR (IO) access. It also supports access to a sixteen byte area for
 * keeping the MAC address in PROM. This is always byte-wide access, as is a
 * shared memory mode to a larger local address space, not used on EB64.
 *
 * EB64 accesses to the 79C960 are through the VL82C486 ISA controller. All
 * CSR accesses should be done as 16-bit words, with the VL82C486 taking care
 * of the packing/unpacking issue. Enet PROM accesses are done as byte
 * accesses. The EB64 memory controller will perform read_modify_write cycles
 * into main memory to correctly merge the bytes/words, and preserve longword
 * parity.
 *
 *
 *  Please see the Am7990 and Am79C960 literature for definitive lists and
 *  further detail.
 *
 *  PLEASE NOTE: LANCE is used in many definitions for historical reasons.
 */


        /* Maximum number of AMD79C960's supported in the EB64 monitor */

#define AM79C960_MAX_DEVICES	2


        /* Base addresses supported for 79C960 in ISA address space */

#define EMBEDDED_79C960_BASE 	0x360	    /* IOAM pins = 0b11 */
#define OPTION_79C960_BASE 	0x300	    /* IOAM pins = 0b00 */

        /* Assigned interrupt numbers for 8259 controller */

#define EMBEDDED_79C960_INT 	9
#define OPTION_79C960_INT	12

        /* Assigned mask numbers for enabling appropriate DMA channel */

#define EMBEDDED_79C960_DMA 	1
#define OPTION_79C960_DMA 	2


             /* CSR access offsets for 79C960 */

#define HW_ADDR_OFFSET  0    /* The hardware address is at the base address for the device */
#define	RDP_OFFSET	0x10
#define	RAP_OFFSET 	0x12
#define	RESET_OFFSET	0x14
#define	IDP_OFFSET	0x16
#define	VSW_OFFSET	0x18

#define LANCE_CSR0  0		/* Main csr */
#define LANCE_IADRL 1		/* Init block low address bits */
#define LANCE_IADRH 2		/* Init block high address bits */
#define LANCE_CSR3  3		/* Mask and function bits */
#define LANCE_CSR4  4           /* Additional mask and function bits, only exists on amd 79c960 */

    /* CSR bit definitions - CSR1 and 2 have no bit fields */

             /* CSR0 Bit definitions */

#define csr0_INIT	0x0001		/* Initialize - can be set with STRT on 79C960*/
#define csr0_STRT	0x0002		/* Start operation */
#define csr0_STOP	0x0004		/* Stop LANCE */
#define csr0_TDMD	0x0008		/* Transmit demand */
#define csr0_TXON	0x0010		/* Transmitter ON */
#define csr0_RXON	0x0020		/* Receiver ON */
#define csr0_IENA	0x0040		/* Interrupt enable */
#define csr0_INTR	0x0080		/* Interrupt received */
#define csr0_IDON	0x0100		/* Initialization done */
#define csr0_TINT	0x0200		/* Transmitter interrupt */
#define csr0_RINT	0x0400		/* Receiver interrupt */
#define csr0_MERR	0x0800		/* Memory error */
#define csr0_MISS	0x1000		/* Missed packet */
#define csr0_CERR	0x2000		/* Collision error */
#define csr0_BABL	0x4000		/* Babbling on the wire */
#define csr0_ERR	0x8000		/* Error logical OR */


             /* CSR3 Bit definitions - all undefined bits reserved */

#define csr3_EMBA	0x0008		/* Enable Alternate Backoff Algorithm - 79C960 */
#define csr3_DXMT2PD	0x0010		/* Disable 2-part TX deferral - 79C960 */
#define csr3_IDONM	0x0100		/* Initialise Done interrupt mask */
#define csr3_TINT	0x0200		/* TX interrupt mask */
#define csr3_RINT	0x0400		/* RX interrupt mask */
#define csr3_MERM	0x0800		/* Memory error interrupt mask */
#define csr3_MISSM	0x1000		/* Missed pkt interrupt mask */
#define csr3_BABLM	0x4000		/* Babble interrupt mask */
#define csr3_MASKALL    0x5F00          /* Mask all CSR3 maskable interrupts */

             /* CSR4 Bit definitions - all undefined bits reserved */
                   /* This register is unique to the 79C960 */

#define csr4_JABM	0x0001		/* Jabber interrupt mask
#define csr4_JAB	0x0002		/* set if T-MAU detects a jabber condition
#define csr4_TXSTRTM	0x0004		/* TX start (of packet) interrupt mask */
#define csr4_TXSTRT	0x0008		/*    */
#define csr4_RCVCCOM	0x0010		/* RX Collision Counter Overflow interrupt mask */
#define csr4_RCVCCO	0x0020		/* RX Collision Counter Overflow bit */
#define csr4_MPCOM	0x0100		/* Missed Pkt counter overflow interrupt mask */
#define csr4_MPCO	0x0200		/* Missed Pkt counter overflow bit */
#define csr4_ASTRPRCV	0x0400		/* Enable Automatic Pad Stripping on RX - IEEE802.3 */
#define csr4_APADXMT	0x0800		/* Enable Automatic Padding on TX - IEEE802.3 */
#define csr4_DPOLL	0x1000		/* Disable polling - TX rings */
#define csr4_TIMER	0x2000		/*    */
#define csr4_DMAPLUS	0x4000		/* Disable CSR80 DMA burst counter */
#define csr4_ENTST	0x8000		/* Enable Test mode */



             /* Receive Message Descriptor */
       /* RMD0, RMD2 and RMD3 have no bit fields */

     /* Bits 0 -> 7 of RMD1 part of buffer address */

#define rmd1_ENP	0x0100		/* End of packet */
#define rmd1_STP	0x0200		/* Start of packet */
#define rmd1_BUFF	0x0400		/* Buffer error */
#define rmd1_CRC	0x0800		/* CRC error */
#define rmd1_OFLO	0x1000		/* Overflow error */
#define rmd1_FRAM	0x2000		/* Framing error */
#define rmd1_ERR	0x4000		/* Error logical OR */
#define rmd1_OWN	0x8000		/* Who owns it */



             /* Transmit Message Descriptor */
           /* TMD0 and TMD2 have no bit fields */

     /* Bits 0 -> 7 of TMD1 part of buffer address */

#define tmd1_ENP	0x0100		/* End of packet */
#define tmd1_STP	0x0200		/* Start of packet */
#define tmd1_DEF	0x0400		/* Had to defer */
#define tmd1_ONE	0x0800		/* One eretry needed */
#define tdm1_MORE	0x1000		/* More than one retry */
#define tmd1_ADDFCS	0x2000		/* Am79C960 specific - add FCS on pkt basis */
#define tmd1_ERR	0x4000		/* Error logical OR */
#define tmd1_OWN	0x8000		/* Who owns it */


  /* Bits 0 -> 9 of TMD3 provide a TDR counter for finding cable faults */

#define tmd3_RTRY	0x0400		/* Too many retries */
#define tmd3_LCAR	0x0800		/* Loss of Carrier */
#define tmd3_LCOL	0x1000		/* Late Collision on send */
#define tmd3_RES	0x2000		/* RESERVED */
#define tmd3_UFLO	0x4000		/* Underflow Error */
#define tmd3_BUFF	0x8000		/* Buffer Error */


             /* For init block - operating modes */

#define mode_DRX	0x0001		/* Disable receiver */
#define mode_DTX	0x0002		/* Disable transmitter */
#define mode_LOOP 	0x0004		/* Loopback mode */
#define mode_DTCR	0x0008		/* Disable transmit CRC */
#define mode_COLL	0x0010		/* Force collision */
#define mode_DRTY	0x0020		/* Disable retries */
#define mode_INTL  	0x0040		/* Internal loopback */
#define mode_PORTSEL0	0x0080		/* 0 = AUI; 1 = T-MAU */
#define mode_PORTSEL1	0x0100		/* MBZ */
#define mode_LRT_TSEL	0x0200		/* Low RX threshold/TX mode select */
#define mode_MENDECL	0x0400		/* MENDEC loopback mode */
#define mode_DAPC	0x0800		/* T-MAU: disable automatic polarity correction */
#define mode_DLNKTST	0x1000		/* Disable link status */
#define mode_DRCVPA	0x2000		/* Disable RX physical address */
#define mode_DRCVBC	0x4000		/* Disable RX broadcast */
#define mode_PROM	0x8000		/* Promiscuous mode */



             /* Initialization block. */

#define LANCE_INIT_BLOCK_SIZE 		24
#define LANCE_INIT_BLOCK_MODE_OFFSET 	0
#define LANCE_INIT_BLOCK_PADR_OFFSET 	2
#define LANCE_INIT_BLOCK_LADRF_OFFSET 	8
#define LANCE_INIT_BLOCK_RD_OFFSET	16
#define LANCE_INIT_BLOCK_TD_OFFSET	20


typedef struct {
    unsigned
      radr : 24,	/* Ring address.			*/
           :  5,
      rlen :  3;	/* Entries (0=1, 1=2, 2=4, 3=8...)	*/
} INIT_BLOCK_DESC;

             /* Receive buffer descriptor. */

typedef struct{
  unsigned int
    ladr : 24,		/* Buffer address.			*/
    enp	 : 1,		/* End of packet.			*/
    stp	 : 1,		/* Start of packet.			*/
    buff : 1,		/* Buffer error.			*/
    crc  : 1,		/* CRC error.				*/
    oflo : 1,		/* Overflow error.			*/
    fram : 1,		/* Framing error.			*/
    err  : 1,		/* Error summary: buff + crc + oflo + fram */
    own  : 1;		/* Buffer owner: host=0, lance=1.	*/
  uw bcnt;		/* Buffer size.				*/
  uw mcnt;		/* Message size.			*/
} LANCE_RECV_BD;

             /* Transmit buffer descriptor. */

typedef struct{
  unsigned int
    ladr : 24,		/* Buffer address.			*/
    enp	 : 1,		/* End of packet.			*/
    stp	 : 1,		/* Start of packet.			*/
    def	 : 1,		/* Deferred.				*/
    one	 : 1,		/* One retry.				*/
    more : 1,		/* More retries.			*/
    add_fcs : 1,        /* Add FCS on packet basis - 79C960 specific feature */
    err	 : 1,		/* Error summary: lcol + lcar + uflo + rtry */
    own	 : 1;		/* Buffer owner: host=0, lance=1.	*/
  uw bcnt;		/* Buffer size.				*/
  uw tmd3;		/* TMD 3				*/
} LANCE_SEND_BD;

#define LANCE_OWNS 1
#define HOST_OWNS  0

             /* Lance counters. */

typedef struct{
  time_t zeroed;
  int    b_recv;
  int    b_sent;
  int    f_recv;
  int    f_sent;
  int    mc_b_recv;
  int    mc_f_recv;
  int    f_sent_def;
  int    f_sent_sgl_col;
  int    f_sent_mult_col;
  int    send_fail_exs_col;
  int    send_fail_cc;
  int    send_fail_short;
  int    send_fail_open;
  int    send_fail_flen;
  int    send_fail_defer;
  int    recv_fail_fcs;
  int    recv_fail_f_err;
  int    recv_fail_flen;
  int    data_overrun;
  int    sbuf_unav;
  int    ubuf_unav;
  int    cc_fail;
} LANCE_CTRS;

typedef struct{
  int	base_addr;
  int	interrupt_line;
  int	dma_mask;
} AM79C960_CONFIG;

#define AM79C960_FLUSH_WATCHDOG	    5000    /* watchdog timeout  - in ms - for TX flush routine */

/* /ether/am79c960.c */
extern int am79c960_device_register(int device_no);
extern void am79c960_device_init_module(void );

#endif /* __AM79C960_H_LOADED */