|
|
1.1 root 1: /*
2: * Copyright (c) 1985 by Sun Microsystems, Inc.
3: */
4:
5: /*
6: * AMD 7990 LANCE Ethernet controller registers.
7: *
8: * The LANCE chip saves address pins by accessing
9: * several registers with one address pin by first writing the
10: * register address to an internal address register, then reading
11: * or writing a data register. To use this safely, care must be
12: * taken that the driver isn't reentered between the writing
13: * of the address register and the access to the data register,
14: * lest the reentered code try to touch the registers and
15: * screw up the sequence.
16: *
17: * There are 4 registers accessible with this scheme, CSR0, CSR1,
18: * CSR2, and CSR3. In normal operation, only CSR0 can be or
19: * needs to be accessed, so the driver normally leaves a 0 in the
20: * Register Address Port, allowing CSR0 to be accessed simply by
21: * accessing the Register Data Port. During the initialization
22: * sequence, when the other CSRs need to be accessed, the appropriate
23: * CSR address is written into the address port, and afterwards
24: * the 0 is put back in the address port.
25: */
26:
27:
28: /*
29: * Buffer size is chosen to give room for:
30: * - the Ethernet maximum transmission unit, 1536
31: * - the CRC, 4
32: * - and an overrun consisting of the entire
33: * fifo contents, 48
34: */
35: #define MAXBUF 1588
36:
37: struct le_device {
38: u_short le_rdp; /* Register Data Port */
39: u_short : 14; /* Reserved */
40: u_short le_rap : 2; /* Register Address Port */
41: };
42: #define le_csr le_rdp
43:
44: #define LE_CSR0 0
45: #define LE_CSR1 1
46: #define LE_CSR2 2
47: #define LE_CSR3 3
48:
49: /*
50: * Control and status bits for CSR0.
51: * These behave somewhat strangely, but the net effect is that
52: * bit masks may be written to the register which affect only
53: * those functions for which there is a one bit in the mask.
54: * The exception is the interrupt enable, which must be explicitly
55: * set to the correct value in each mask that is used.
56: *
57: * RO - Read Only, writing has no effect
58: * RC - Read, Clear. Writing 1 clears, writing 0 has no effect
59: * RW - Read, Write.
60: * W1 - Write with 1 only. Writing 1 sets, writing 0 has no effect.
61: * Reading gives unpredictable data but doesn't hurt anything.
62: * RW1 - Read, Write with 1 only. Writing 1 sets, writing 0 has no effect.
63: */
64:
65: #define LE_ERR 0x8000 /* RO BABL | CERR | MISS | MERR */
66: #define LE_BABL 0x4000 /* RC transmitted too many bits */
67: #define LE_CERR 0x2000 /* RC No Heartbeat */
68: #define LE_MISS 0x1000 /* RC Missed an incoming packet */
69: #define LE_MERR 0x0800 /* RC Memory Error; no acknowledge */
70: #define LE_RINT 0x0400 /* RC Received packet Interrupt */
71: #define LE_TINT 0x0200 /* RC Transmitted packet Interrupt */
72: #define LE_IDON 0x0100 /* RC Initialization Done */
73: #define LE_INTR 0x0080 /* RO BABL|MISS|MERR|RINT|TINT|IDON */
74: #define LE_INEA 0x0040 /* RW Interrupt Enable */
75: #define LE_RXON 0x0020 /* RO Receiver On */
76: #define LE_TXON 0x0010 /* RO Transmitter On */
77: #define LE_TDMD 0x0008 /* W1 Transmit Demand (send it now) */
78: #define LE_STOP 0x0004 /* RW1 Stop */
79: #define LE_STRT 0x0002 /* RW1 Start */
80: #define LE_INIT 0x0001 /* RW1 Initialize */
81:
82: /*
83: * CSR1 is the low 16 bits of the address of the initialization block
84: * CSR2 is the high 8 bits of the address of the initialization block
85: * the high 8 bits of the register must be 0
86: * CSR3 mode bits:
87: *
88: */
89: #define LE_BSWP 0x4 /* Byte Swap (on for 68000 byte order) */
90: #define LE_ACON 0x2 /* ALE Control (on for active low ALE) */
91: #define LE_BCON 0x1 /* Byte Control (see the manual) */
92:
93: /* The address contained in this structure must be longword aligned */
94: struct le_drp { /* Descriptor Ring Pointer */
95: u_short drp_laddr; /* Low 16 bits of ring address */
96: u_char drp_len : 3; /* Binary exponent of no. of ring entries */
97: u_char : 5; /* Reserved */
98: u_char drp_haddr; /* High 16 bits of ring address */
99: };
100:
101: /*
102: * Initialization Block. This structure is constructed in memory,
103: * and it's address is written into the chip during initialization.
104: * The chip then fetches it's initialization info from the structure.
105: */
106: struct le_init_block {
107: /* In the normal mode, these 16 bits are all 0 */
108: u_short ib_prom : 1; /* Promiscuous Mode */
109: u_short : 7; /* Reserved */
110: u_short ib_intl : 1; /* Internal Loopback */
111: u_short ib_drty : 1; /* Disable Retry */
112: u_short ib_coll : 1; /* Force Collision */
113: u_short ib_dtcr : 1; /* Disable Transmit CRC */
114: u_short ib_loop : 1; /* Loopback */
115: u_short ib_dtx : 1; /* Disable Transmitter */
116: u_short ib_drx : 1; /* Disable Receiver */
117:
118: /*
119: * The bytes must be swapped within the word, so that, for example,
120: * the address 8:0:20:1:25:5a is written in the order
121: * 0 8 1 20 5a 25
122: */
123: u_char ib_padr[6];
124:
125: u_char ib_ladrf[8];
126:
127: struct le_drp ib_rdrp; /* Receive Descriptor Ring Pointer */
128: struct le_drp ib_tdrp; /* Transmit Descriptor Ring Pointer */
129: };
130:
131: struct le_md { /* Message Descriptor */
132: u_short lmd_ladr; /* Low Order 16 Address Bits */
133: u_char lmd_flags;
134: u_char lmd_hadr: 8; /* High Order 8 Address Bits */
135: u_short lmd_bcnt; /* Buffer Byte Count (maximum length) */
136: u_short lmd_mcnt; /* Message Byte Count (actual length) */
137: };
138: #define lmd_flags3 lmd_mcnt /* for Transmit message descriptor */
139:
140: /* Bits common to both rmds and tmds */
141: #define LMD_OWN 0x80 /* Chip owns the descriptor */
142: #define LMD_ERR 0x40 /* Error occurred */
143: #define LMD_STP 0x02 /* Start of Packet */
144: #define LMD_ENP 0x01 /* End of Packet */
145:
146: /* Bits in rmd flags */
147: #define RMD_FRAM 0x20 /* Framing error */
148: #define RMD_OFLO 0x10 /* Internal Silo Overflowed. Valid if !ENP */
149: #define RMD_CRC 0x08 /* CRC Error */
150: #define RMD_BUFF 0x04 /* Didn't have a buffer for the packet */
151: /* bits in tmd flags */
152: #define TMD_MORE 0x10 /* More than one retry was needed */
153: #define TMD_ONE 0x08 /* Exactly One Retry, valid only if !LCOL */
154: #define TMD_DEF 0x04 /* Deferred (net was initially busy) */
155:
156: /* Bits for lmd_errflags */
157: #define TMD_BUFF 0x8000 /* Buffer Error (imples underflow too) */
158: #define TMD_UFLO 0x4000 /* Underflow Error */
159: #define TMD_LCOL 0x1000 /* Late Collision */
160: #define TMD_LCAR 0x0800 /* Loss of Carrier */
161: #define TMD_RTRY 0x0400 /* More than 16 Retry's */
162: #define TMD_TDR 0x003f /* Time Domain Reflectometry counter mask */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.