|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1992,1991,1990,1989 Carnegie Mellon University
4: * All Rights Reserved.
5: *
6: * Permission to use, copy, modify and distribute this software and its
7: * documentation is hereby granted, provided that both the copyright
8: * notice and this permission notice appear in all copies of the
9: * software, derivative works or modified versions, and any portions
10: * thereof, and that both notices appear in supporting documentation.
11: *
12: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
13: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
14: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
15: *
16: * Carnegie Mellon requests users of this software to return to
17: *
18: * Software Distribution Coordinator or [email protected]
19: * School of Computer Science
20: * Carnegie Mellon University
21: * Pittsburgh PA 15213-3890
22: *
23: * any improvements or extensions that they make and grant Carnegie Mellon
24: * the rights to redistribute these changes.
25: */
26: /*
27: * File: if_se.h
28: * Authors: Robert V. Baron and Alessandro Forin
29: * Date: 1989
30: *
31: */
32: /*
33: * AMD 7990 "Lance" Ethernet interface definitions.
34: * All structures are as seen from the Lance,
35: * both in the memory-alignment sense and in the
36: * byte-order sense. Mapping to host memory is
37: * model specific: on pmaxen there is a 16 bit gap
38: * every other 16 bits.
39: */
40:
41: #include <scsi/scsi_endian.h>
42:
43: /*
44: * Selection of one of the four Lance CSR is done in a
45: * two-step process: select which CSR first by writing
46: * into the RAP, then access the register via the RDP.
47: * Note that (a) the selection remains, and (b) all
48: * but CSR0 can only be accessed when the chip is stopped.
49: * These registers are mapped in the 'registers' I/O segment.
50: */
51: #ifndef se_reg_type
52: #define se_reg_type unsigned short
53: #endif
54: typedef volatile se_reg_type *se_reg_t;
55:
56: #define CSR0_SELECT 0x0 /* Valid RAP selections */
57: #define CSR1_SELECT 0x1
58: #define CSR2_SELECT 0x2
59: #define CSR3_SELECT 0x3
60:
61: /*
62: * Bit definitions for the CSR0.
63: * Legend:
64: * R=Readable W=Writeable
65: * S=Set-on-write-1 C=Clear-on-write-1
66: */
67:
68: #define LN_CSR0_INIT 0x0001 /* (RS) Initialize */
69: #define LN_CSR0_STRT 0x0002 /* (RS) Start */
70: #define LN_CSR0_STOP 0x0004 /* (RS) Stop */
71: #define LN_CSR0_TDMD 0x0008 /* (RS) Transmit demand */
72: #define LN_CSR0_TXON 0x0010 /* (R) Transmitter enabled */
73: #define LN_CSR0_RXON 0x0020 /* (R) Receiver enabled */
74: #define LN_CSR0_INEA 0x0040 /* (RW) Interrupt enable */
75: #define LN_CSR0_INTR 0x0080 /* (R) Interrupt pending */
76: #define LN_CSR0_IDON 0x0100 /* (RC) Initialization done */
77: #define LN_CSR0_TINT 0x0200 /* (RC) Transmitter interrupt */
78: #define LN_CSR0_RINT 0x0400 /* (RC) Receiver interrupt */
79: #define LN_CSR0_MERR 0x0800 /* (RC) Memory error during DMA */
80: #define LN_CSR0_MISS 0x1000 /* (RC) No available receive buffers */
81: #define LN_CSR0_CERR 0x2000 /* (RC) Signal quality (SQE) test */
82: #define LN_CSR0_BABL 0x4000 /* (RC) Babble error: xmit too long */
83: #define LN_CSR0_ERR 0x8000 /* (R) Error summary: any of the 4 above */
84:
85: #define LN_CSR0_WTC 0x7f00 /* Write-to-clear bits */
86:
87: /*
88: * Bit definitions for the CSR1.
89: */
90:
91: #define LN_CSR1_MBZ 0x0001 /* Must be zero */
92: #define LN_CSR1_IADR 0xfffe /* (RW) Initialization block address (low) */
93:
94: /*
95: * Bit definitions for the CSR2.
96: */
97:
98: #define LN_CSR2_IADR 0x00ff /* (RW) Initialization block address (high) */
99: #define LN_CSR2_XXXX 0xff00 /* (RW) Reserved */
100:
101: /*
102: * Bit definitions for the CSR3.
103: */
104:
105: #define LN_CSR3_BCON 0x0001 /* (RW) BM/HOLD Control */
106: #define LN_CSR3_ACON 0x0002 /* (RW) ALE Control */
107: #define LN_CSR3_BSWP 0x0004 /* (RW) Byte Swap */
108: #define LN_CSR3_XXXX 0xfff8 /* (RW) Reserved */
109:
110:
111: /*
112: * Initialization Block
113: *
114: * Read when the INIT command is sent to the lance.
115: */
116:
117: struct se_init_block {
118: unsigned short mode; /* Mode Register, see below */
119: unsigned short phys_addr_low; /* Ethernet address */
120: unsigned short phys_addr_med; /* Ethernet address */
121: unsigned short phys_addr_high; /* Ethernet address */
122: unsigned short logical_addr_filter0; /* Multicast filter */
123: unsigned short logical_addr_filter1; /* Multicast filter */
124: unsigned short logical_addr_filter2; /* Multicast filter */
125: unsigned short logical_addr_filter3; /* Multicast filter */
126: unsigned short recv_ring_pointer_lo; /* Receive Ring ptr, low */
127: BITFIELD_3(unsigned char,
128: recv_ring_pointer_hi, /* Receive Ring ptr, high */
129: reserved0 : 5,
130: recv_ring_len : 3); /* Length: log2(nbuffers) */
131: unsigned short xmit_ring_pointer_lo; /* Transmit Ring ptr, low */
132: BITFIELD_3(unsigned char,
133: xmit_ring_pointer_hi, /* Transmit Ring ptr, high */
134: reserved1 : 5,
135: xmit_ring_len : 3); /* Length: log2(nbuffers) */
136: };
137:
138: typedef volatile struct se_init_block *se_init_block_t;
139:
140: /*
141: * Bit definitions for the MODE word
142: * (Normally set to 0)
143: */
144:
145: #define LN_MODE_DRX 0x0001 /* Disable Receiver */
146: #define LN_MODE_DTX 0x0002 /* Disable Transmitter */
147: #define LN_MODE_LOOP 0x0004 /* Loopback mode */
148: #define LN_MODE_DTRC 0x0008 /* Disable CRC generation */
149: #define LN_MODE_COLL 0x0010 /* Force collision */
150: #define LN_MODE_DRTY 0x0020 /* Disable retry */
151: #define LN_MODE_INTL 0x0040 /* Internal Loopback mode */
152: #define LN_MODE_XXXX 0x7f80 /* Reserved */
153: #define LN_MODE_PROM 0x8000 /* Promiscuous mode */
154:
155: /*
156: * Bit definitions for the ring pointers
157: */
158:
159: #define LN_RNGP_LOW 0xfffc /* longword aligned */
160:
161:
162: /*
163: * Buffer Descriptors
164: * Legend:
165: * H-set-by-Host C-set-by-chip
166: */
167:
168: struct se_desc {
169: unsigned short addr_low; /* (H) Buffer pointer low */
170: BITFIELD_2(unsigned char,
171: addr_hi, /* (H) Buffer pointer high */
172: status); /* (HC) Buffer status */
173: unsigned short buffer_size; /* (H) Buffer length (bytes),*/
174: /* bits 15..12 must be ones */
175: union {
176: struct {
177: BITFIELD_2(unsigned short,
178: bcnt : 12, /* (C) Rcvd data size */
179: res : 4); /* Reads as zeroes */
180: } rcv;
181: struct {
182: BITFIELD_2(unsigned short,
183: TDR : 10, /* (C) Time Domain Reflectometry */
184: flg2 : 6); /* (C) Xmit status */
185: } xmt;
186: unsigned short bits;
187: } desc4;
188: #define message_size desc4.rcv.bcnt
189: #define tdr desc4.xmt.TDR
190: #define status2 desc4.xmt.flg2
191: };
192:
193: typedef volatile struct se_desc *se_desc_t;
194:
195: /*
196: * Bit definition for STATUS byte (receive case)
197: */
198:
199: #define LN_RSTATE_ENP 0x01 /* (C) End of Packet */
200: #define LN_RSTATE_STP 0x02 /* (C) Start of packet */
201: #define LN_RSTATE_BUFF 0x04 /* (C) Buffer error */
202: #define LN_RSTATE_CRC 0x08 /* (C) CRC error */
203: #define LN_RSTATE_OFLO 0x10 /* (C) SILO Overflow */
204: #define LN_RSTATE_FRAM 0x20 /* (C) Framing error */
205: #define LN_RSTATE_ERR 0x40 /* (C) Error summary */
206: #define LN_RSTATE_OWN 0x80 /* (C) Owned by Lance Chip (if set) */
207:
208:
209: /*
210: * Bit definition for STATUS byte (transmit case)
211: */
212:
213: #define LN_TSTATE_ENP 0x01 /* (H) End of Packet */
214: #define LN_TSTATE_STP 0x02 /* (H) Start of packet */
215: #define LN_TSTATE_DEF 0x04 /* (C) Deferred */
216: #define LN_TSTATE_ONE 0x08 /* (C) Retried exactly once */
217: #define LN_TSTATE_MORE 0x10 /* (C) Retried more than once */
218: #define LN_TSTATE_XXXX 0x20 /* Reserved */
219: #define LN_TSTATE_ERR 0x40 /* (C) Error summary (see status2) */
220: #define LN_TSTATE_OWN 0x80 /* (H) Owned by Lance Chip (if set) */
221:
222: /*
223: * Bit definitions for STATUS2 byte (transmit case)
224: */
225:
226: #define LN_TSTATE2_RTRY 0x01 /* (C) Failed after 16 retransmissions */
227: #define LN_TSTATE2_LCAR 0x02 /* (C) Loss of Carrier */
228: #define LN_TSTATE2_LCOL 0x04 /* (C) Late collision */
229: #define LN_TSTATE2_XXXX 0x08 /* Reserved */
230: #define LN_TSTATE2_UFLO 0x10 /* (C) Underflow (late memory) */
231: #define LN_TSTATE2_BUFF 0x20 /* (C) Buffering error (no ENP) */
232:
233: /* Errors that disable the transmitter */
234: #define LN_TSTATE2_DISABLE (LN_TSTATE2_UFLO|LN_TSTATE2_BUFF|LN_TSTATE2_RTRY)
235:
236: /*
237: * Other chip characteristics
238: */
239:
240: #define LN_MINBUF_CH 100 /* Minimum size of first lance buffer, if
241: chaining */
242:
243: #define LN_MINBUF_NOCH 60 /* Minimum size of a lance buffer, if
244: no chaining and DTCR==1 */
245:
246: #define LN_MINBUF_NOCH_RAW 64 /* Minimum size of a lance buffer, if
247: no chaining and DTCR==0 */
248:
249: /*
250: * Information for mapped ether
251: */
252: typedef struct mapped_ether_info {
253: volatile unsigned int interrupt_count;
254: /* tot interrupts received */
255: volatile unsigned short saved_csr0;
256: /* copy of csr0 at last intr */
257: unsigned char rom_stride;
258: unsigned char ram_stride;
259: /* rom&ram strides */
260: unsigned buffer_size;
261: /* how much ram for lance */
262: natural_t buffer_physaddr;
263: /* where it is in phys memory */
264: unsigned wait_event;
265: } *mapped_ether_info_t;
266:
267: #ifdef KERNEL
268: extern struct se_switch {
269: vm_offset_t regspace;
270: vm_offset_t bufspace;
271: vm_offset_t ln_bufspace;
272: vm_offset_t romspace;
273: short romstride;
274: short ramstride;
275: int ramsize;
276: void (*desc_copyin)( vm_offset_t, vm_offset_t, int);
277: void (*desc_copyout)( vm_offset_t, vm_offset_t, int);
278: void (*data_copyin)( vm_offset_t, vm_offset_t, int);
279: void (*data_copyout)( vm_offset_t, vm_offset_t, int);
280: void (*bzero)( vm_offset_t, int );
281: vm_offset_t (*mapaddr)( vm_offset_t );
282: vm_size_t (*mapoffs)( vm_size_t );
283: } *se_sw;
284: #endif KERNEL
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.