|
|
1.1 root 1: /* Copyright (c) 1984 by Communication Machinery Corporation
2: *
3: * This file contains material which is proprietary to
4: * Communication Machinery Corporation (CMC) and which
5: * may not be divulged without the written permission
6: * of CMC.
7: *
8: * ENP-10 Ram Definition
9: *
10: * 3/15/85 Jon Phares
11: * Update 7/10/85 S. Holmgren
12: * ENP-10 update 7/21/85 J. Mullen
13: * ENP-20 update 8/11/85 J. Mullen
14: * Mods for CCI TAHOE system 8/14/85 J. Mullen
15: *
16: */
17:
18: #define K *1024
19:
20: #define ENPSIZE (124 K) /* VME bus space allocated to enp */
21: #define MINPKTSIZE 60 /* minimum ethernet packet size */
22:
23: /* Note: paged window (4 K) is identity mapped by ENP kernel to provide
24: * 124 K contiguous RAM (as reflected in RAM_SIZE)
25: */
26:
27: #define RAM_WINDOW (128 K)
28: #define IOACCESS_WINDOW (512)
29: #define FIXED_WINDOW (RAM_WINDOW - IOACCESS_WINDOW)
30: #define RAMROM_SWAP (4 K)
31: #define RAM_SIZE (FIXED_WINDOW - RAMROM_SWAP)
32:
33: #define HOST_RAMSIZE (48 K)
34: #define ENP_RAMSIZE (20 K)
35:
36: /* ...top of 4K local i/o space for ENP */
37:
38: #ifdef notdef
39: typedef struct iow10 {
40: char pad1[0x81];
41: /* written to: causes an interrupt on the host at the vector written
42: read from : returns the most significant 8 bits of the slave address */
43: char vector;
44: char pad2[0x1F];
45: char csrarr[0x1E];
46: char pad3[2];
47: char ier; /* intr. enable reg., 0x80 == enable,0 == off*/
48: char pad4[1];
49: char tir; /* transmit intr. (Level 4 INP autovector) */
50: char pad5[1];
51: char rir; /* receive intr. (Level 5 INP autovector) */
52: char pad6[1];
53: char uir; /* utility intr. (Level 1 INP autovector) */
54: char pad7[7];
55: char mapfirst4k; /* bit 7 set means ram, clear means rom */
56: char pad8[0x11];
57: char exr; /* exception register, see bit defines above */
58: char pad9[0xD1F];
59: char hst2enp_interrupt; /* R or W interrupts ENP */
60: char pad10[0xFF];
61: char hst2enp_reset; /* R or W resets ENP */
62: } iow10;
63: #endif notdef
64:
65: typedef struct iow20
66: {
67: char pad0;
68: char hst2enp_interrupt;
69: char pad1[510];
70: } iow20;
71:
72:
73: #ifdef notdef
74: typedef struct iow30
75: {
76: char pad0;
77: char impucsr;
78: char pad1[0x1d];
79: short bus2mpu_interrupt;
80: short bs2enp_wsctl;
81: short bs2enp_rsctl;
82: short enp2hst_clear_intr; /* 0x27 */
83: short enp_rcv_intr;
84: short enp_xmit_intr;
85: short hst2enp_interrupt; /* 0x2d */
86: short pad2;
87: char pad3[0xf];
88: short bus_page; /* Bus page register */
89: char pad4[0x1d];
90: short lock_ctrl;
91: char pad5[0x1d];
92: short duart[0x10]; /* 16 duart regs */
93: char pad6[0x1f];
94: short bus_window;
95: } iow30;
96: #endif notdef
97:
98: struct ether_addr
99: {
100: u_char ea_addr[6];
101: };
102:
103: #define ETHADDR struct ether_addr
104: #define ETHADDR_SIZE 6 /* size of ethernet address */
105:
106: typedef
107: struct ethlist
108: {
109: int e_listsize; /* active addr entries */
110: ETHADDR e_baseaddr; /* addr lance is working with */
111: ETHADDR e_addrs[ 16 ]; /* possible addresses */
112: } ETHLIST;
113:
114: typedef
115: struct enpstat
116: {
117: unsigned long e_xmit_successful; /* Successful transmissions */
118: unsigned long e_mult_retry; /* multiple retries on xmit */
119: unsigned long e_one_retry; /* single retries */
120: unsigned long e_fail_retry; /* too many retries */
121: unsigned long e_deferrals; /* transmission delayed due
122: to active medium */
123: unsigned long e_xmit_buff_err; /* xmit data chaining failed --
124: "can't happen" */
125: unsigned long e_silo_underrun; /* transmit data fetch failed */
126: unsigned long e_late_coll; /* collision after xmit */
127: unsigned long e_lost_carrier;
128: unsigned long e_babble; /* xmit length > 1518 */
129: unsigned long e_collision;
130: unsigned long e_xmit_mem_err;
131: unsigned long e_rcv_successful; /* good receptions */
132: unsigned long e_rcv_missed; /* no recv buff available */
133: unsigned long e_crc_err; /* checksum failed */
134: unsigned long e_frame_err; /* crc error AND
135: data length != 0 mod 8 */
136: unsigned long e_rcv_buff_err; /* rcv data chain failure --
137: "can't happen" */
138: unsigned long e_silo_overrun; /* receive data store failed */
139: unsigned long e_rcv_mem_err;
140: } ENPSTAT;
141:
142: typedef struct RING
143: {
144: short r_rdidx;
145: short r_wrtidx;
146: short r_size;
147: short r_pad;
148: int r_slot[1];
149: } RING;
150:
151: typedef struct RING32
152: {
153: short r_rdidx;
154: short r_wrtidx;
155: short r_size;
156: short r_pad; /* to make VAXen happy */
157: int r_slot[ 32 ];
158: } RING32;
159:
160: /*
161: * ENP Ram data layout
162: *
163: * If you don't put it here - it isn't there
164: *
165: */
166:
167: typedef struct enpdevice {
168: #ifdef notdef
169: char enp_ram_rom[4 K];
170: #endif notdef
171: union {
172: char all_ram[RAM_SIZE];
173: struct {
174: unsigned int t_go;
175: unsigned int t_pstart;
176: } t;
177: struct {
178: char nram[RAM_SIZE - (HOST_RAMSIZE + ENP_RAMSIZE)];
179: char hram[HOST_RAMSIZE];
180: char kram[ENP_RAMSIZE];
181: } u_ram;
182: struct
183: {
184: char pad7[ 0x100 ]; /* starts 0x1100 - 0x2000 */
185: short e_enpstate; /* 1102 */
186: short e_enpmode; /* 1104 */
187: int e_enpbase; /* 1104 */
188: int e_enprun; /* 1108 */
189: unsigned short e_intrvec;
190: unsigned short e_dummy[3];
191:
192: RING32 h_toenp; /* 110C */
193: RING32 h_hostfree;
194: RING32 e_tohost;
195: RING32 e_enpfree;
196:
197: ENPSTAT e_stat;
198: ETHLIST e_netaddr;
199: } iface;
200: } enp_u;
201: iow20 enp_iow;
202: } ENPDEVICE;
203:
204: #define enp_ram enp_u.all_ram
205: #define enp_nram enp_u.u_ram.nram
206: #define enp_hram enp_u.u_ram.hram
207: #define enp_kram enp_u.u_ram.kram
208: #define enp_go enp_u.t.t_go
209: #define enp_prog_start enp_u.t.t_pstart
210: #define enp_intrvec enp_u.iface.e_intrvec
211: #define enp_state enp_u.iface.e_enpstate
212: #define enp_mode enp_u.iface.e_enpmode
213: #define enp_base enp_u.iface.e_enpbase
214: #define enp_enprun enp_u.iface.e_enprun
215: #define enp_toenp enp_u.iface.h_toenp
216: #define enp_hostfree enp_u.iface.h_hostfree
217: #define enp_tohost enp_u.iface.e_tohost
218: #define enp_enpfree enp_u.iface.e_enpfree
219: #define enp_freembuf enp_u.iface.h_freembuf
220: #define enp_stat enp_u.iface.e_stat
221: #define enp_addr enp_u.iface.e_netaddr
222:
223: #define ENPVAL 0xff /* value to poke in enp_iow.hst2enp_interrupt */
224: #define RESETVAL 0x00 /* value to poke in enp_iow.enp2hst_clear_intr */
225:
226: #define INTR_ENP(addr) addr->enp_iow.hst2enp_interrupt = ENPVAL
227:
228: #if ENP == 30
229: #define ACK_ENP_INTR(addr) addr->enp_iow.enp2hst_clear_intr = RESETVAL
230: #define IS_ENP_INTR(addr) (addr->enp_iow.enp2hst_clear_intr&0x80)
231: # else
232: #define ACK_ENP_INTR(addr)
233: #define IS_ENP_INTR(addr) ( 1 )
234: #endif ENP == 30
235:
236: #ifdef notdef
237: #define RESET_ENP(addr) addr->enp_iow.hst2enp_reset = 01
238: # else
239: #define RESET_ENP(addr)
240: #endif notdef
241:
242: #ifdef TAHOE
243: #define ENP_GO( addr,start ) {int v; v = start; \
244: enpcopy(&v, &addr->enp_prog_start, sizeof(v) ); \
245: v = 0x80800000; \
246: enpcopy( &v, &addr->enp_go, sizeof(v) ); }
247: #else
248: #define ENP_GO( addr,start,intvec ) { addr->enp_prog_start = (unsigned int)(start); \
249: addr->enp_intrvec = (unsigned short) intvec; \
250: addr->enp_go = 0x80800000; }
251: #endif TAHOE
252:
253: #define SPL_ENP spl4
254:
255:
256: /*
257: * state bits
258: */
259:
260: #define S_ENPRESET 01 /* enp is in reset state */
261: #define S_ENPRUN 02 /* enp is in run state */
262:
263: /*
264: * mode bits
265: */
266:
267: #define E_SWAP16 0x1 /* swap two octets within 16 */
268: #define E_SWAP32 0x2 /* swap 16s within 32 */
269: #define E_SWAPRD 0x4 /* swap on read */
270: #define E_SWAPWRT 0x8 /* swap on write */
271: #define E_DMA 0x10 /* enp does data moving */
272:
273: #define E_EXAM_LIST 0x80000000 /*enp should examine addrlist */
274: #define E_ADDR_SUPP 0x40000000 /*enp should use supplied addr*/
275:
276:
277: /*
278: * Download ioctl definitions
279: */
280:
281: #define mkioctl(type,value) (0x20000000|('type'<<8)|value)
282:
283: #define ENPIOGO mkioctl( S,1 ) /* start the enp */
284: #define ENPIORESET mkioctl( S,2 ) /* reset the enp */
285:
286: /*
287: * The ENP Data Buffer Structure
288: */
289:
290: typedef struct BCB
291: {
292: struct BCB *b_link;
293: short b_stat;
294: short b_len;
295: char *b_addr;
296: short b_msglen;
297: short b_reserved;
298: }BCB;
299:
300: struct enp_softc
301: {
302: struct arpcom es_ac; /* common ethernet structures */
303: struct ether_addr es_boardaddr;/* board ethernet address */
304: };
305:
306: #define es_if es_ac.ac_if /* network-visible interface */
307: #define es_enaddr es_ac.ac_enaddr /* hardware ethernet address */
308:
309: #define ENP_OPEN 1 /* device enpram opened */
310: #define ENP_CLOSE 2 /* device enpram closed */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.