xref: /original-bsd/sys/vax/if/if_hyreg.h (revision 1af756d8)
1 /*
2  * Copyright (c) 1988 Regents of the University of California.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Tektronix Inc.
7  *
8  * %sccs.include.redist.c%
9  *
10  *	@(#)if_hyreg.h	7.3 (Berkeley) 06/28/90
11  */
12 
13 /*
14  * Modifications from Berkeley 4.2 BSD
15  * Copyright (c) 1983, Tektronix Inc.
16  * All Rights Reserved
17  */
18 
19 /*
20  * Network Systems Corporation Hyperchannel interface
21  *
22  * supports A410 adapter interfaced via a DEC DR-11B, NSC PI-13 or PI-14
23  *	(PI-14 is a PI-13 with different line drivers, software is
24  *	identical to a PI-13)
25  *
26  * Written by Steve Glaser, Tektronix Inc., July 1982
27  *
28  * NOTE:
29  *
30  * DR11B code has not been fully checked out with 4.1a.
31  * The first adapters at Tek came with DR11Bs, and the code once worked,
32  * but those have been upgraded to PI-13s.
33  */
34 
35 /*
36  * The HYPERchannel driver sends and receives messages formatted:
37  *
38  *	+---------------------------------------+	---
39  *	|					|	/|\
40  *	|  HYPERchannel adapter header (hy_hdr)	|	 |
41  *	|					|	 |
42  *	+---------------------------------------+	 |
43  *	|					|	 |
44  *	|     Internet Protocol header (ip)	|    message proper
45  *	|					|    (64 bytes max)
46  *	+---------------------------------------+	 |
47  *	|					|	 |
48  *	|	TCP header + user data		|	 |
49  *	|	(if it all fits here)		|	 |
50  *	|					|	\|/
51  *	+---------------------------------------+	---
52  *
53  *	+---------------------------------------+	---
54  *	|					|	/|\
55  *	|					|	 |
56  *	|	TCP header + user data		|  associated data
57  *	|					|	 |
58  *	|					|	\|/
59  *	+---------------------------------------+	---
60  *
61  * If all of the datagram will fit in the message proper (including
62  * the TCP header and user data) the entire datagram is passed in
63  * the message proper and the associated data feature of the HYPERchannel
64  * is not used.
65  *
66  * The mapping from internet addresses to HYPERchannel addresses is:
67  *
68  *	 0       7 8      15 16                   31
69  *	+---------+---------+-----------------------+
70  *	| network | special | HYPERchannel address  |
71  *	+---------+---------+-----------------------+
72  *
73  *	|<------------ internet address ----------->|
74  *
75  * The hyperchannel address is decoded as follows:
76  *
77  *       0                 7 8             13 14  15
78  *	+-------------------+----------------+------+
79  *	|   adapter number  |      zero      | port |
80  *	+-------------------+----------------+------+
81  *
82  * The low 2 bits are port number (interpreted by hyperchannel hardware).
83  *
84  * The encoding of special bits is:
85  *
86  *	00	normal packet
87  *
88  *	01	loop this packet back to the sender at the
89  *		specified adapter (ip header source/destination addresses
90  *		swapped before sending, command bits added to tell the
91  *		remote HYPERchannel adapter debug & performance studies]
92  *		this code acts like 02 (below) if the ip destination (before
93  *		any swapping) and the destination address don't match (e.g.
94  *		this packet is being routed through a gateway)
95  *
96  *	02	loop this packet back to the sender at the
97  *		specified adapter, but go through the specified adapter's
98  *		IP.  This is for testing IP's store and forward mechanism.
99  *
100  *	other	undefined, currently treated as normal packet
101  *
102  */
103 #define MPSIZE		64	/* "Message Proper" size */
104 #define MAXRETRY	4
105 
106 /*
107  * Device registers
108  */
109 struct	hydevice {
110 	short	hyd_wcr;	/* word count (negated) */
111 	u_short	hyd_bar;	/* bus address bits 15-0 */
112 	u_short	hyd_csr;	/* control and status */
113 	u_short	hyd_dbuf;	/* data buffer */
114 };
115 
116 /*
117  * CSR bit layout
118  */
119 #define	S_ERROR	   0100000	/* error */
120 #define	S_NEX	   0040000	/* non-existent memory error */
121 #define	S_ATTN	   0020000	/* attn (always zero) */
122 #ifdef PI13
123 #define S_STKINTR  0010000	/* stacked interrupt */
124 #else
125 #define	S_MAINT	   0010000	/* maintenance (not used) */
126 #endif
127 #define	S_A	   0004000	/* device status A (recieve data available) */
128 #define	S_B	   0002000	/* device status B (normal termination) */
129 #define	S_C	   0001000	/* device status C (abnormal termination) */
130 #ifdef PI13
131 #define S_POWEROFF 0000400	/* power off indicator */
132 #else
133 #define	S_CYCLE	   0000400	/* cycle (not used) */
134 #endif
135 #define	S_READY	   0000200	/* ready */
136 #define	S_IE	   0000100	/* interrupt enable */
137 #define	S_XBA	   0000060	/* bus address bit bits 17 and 16 */
138 #define S_CLRINT   0000014	/* clear stacked interrupt */
139 #define	S_IATTN    0000010	/* interrupt on attention only */
140 #define S_WC       0000004	/* interrupt on word count == 0 only */
141 #define S_IATTNWC  0000000	/* interrupt on word count == 0 and attention */
142 #define	S_BURST	   0000002	/* burst mode DMA (not used) */
143 #define	S_GO	   0000001	/* go */
144 
145 #define XBASHIFT	12
146 
147 #define HY_CSR_BITS "\20\
148 \20ERROR\17NEX\16ATTN\15STKINTR\14RECV_DATA\13NORMAL\12ABNORMAL\11POWER\
149 \10READY\07IENABLE\06XBA17\05XBA16\04IATTN\03IWC\02BURST\01GO"
150 
151 /*
152  * PI13 status conditions
153  */
154 #define	HYS_RECVDATA(x)	(((x)->hyd_csr & S_A) != 0)	/* get adapter data */
155 #define	HYS_NORMAL(x)	(((x)->hyd_csr & S_B) != 0)	/* done normally */
156 #define	HYS_ABNORMAL(x)	(((x)->hyd_csr & S_C) != 0)	/* done abnormally */
157 #define	HYS_ERROR(x)	(((x)->hyd_csr & S_ERROR) != 0)	/* error condition */
158 #define	HYS_DONE(x)	(((x)->hyd_csr & (S_ERROR|S_B|S_C)) != 0)
159 
160 /*
161  * Function Codes for the Hyperchannel Adapter
162  * The codes are offset so they can be "or"ed into
163  * the reg data buffer
164  */
165 #define	HYF_XMITMSG	0x04	/* transmit message */
166 #define	HYF_XMITDATA	0x08	/* transmit associated data */
167 #define	HYF_XMITLSTDATA	0x0C	/* transmit last associated data */
168 #define	HYF_XMITLOCMSG	0x10	/* transmit local message */
169 #define	HYF_INPUTMSG	0x24	/* input message proper */
170 #define	HYF_INPUTDATA	0x28	/* input assiciated data */
171 #define	HYF_STATUS	0x40	/* request status */
172 #define	HYF_DUMPREGS	0x50	/* dump extention registers */
173 #define	HYF_MARKP0	0x60	/* mark down port 0 */
174 #define	HYF_MARKP1	0x64	/* mark down port 1 */
175 #define	HYF_MARKP2	0x68	/* mark down port 2 */
176 #define	HYF_MARKP3	0x6C	/* mark down port 3 */
177 #define	HYF_MP0RR	0x70	/* mark down port 0 and reroute messages */
178 #define	HYF_MP1RR	0x74	/* mark down port 1 and reroute messages */
179 #define	HYF_MP2RR	0x78	/* mark down port 2 and reroute messages */
180 #define	HYF_MP3RR	0x7C	/* mark down port 3 and reroute messages */
181 #define	HYF_RSTATS	0xA0	/* read statistics */
182 #define	HYF_RCSTATS	0xA4	/* read and clear statistics */
183 #define	HYF_SETTEST	0xC0	/* enable test operations *set test mode) */
184 #define	HYF_SADDR_LEN	0xC4	/* test mode: set address and length */
185 #define	HYF_WBUFF	0xC8	/* test mode: write buffer */
186 #define	HYF_RBUFF	0xCC	/* test mode: read buffer */
187 #define HYF_CLRADAPTER	0xE0	/* clear adapter */
188 #define	HYF_END_OP	0xE4	/* end operation */
189 #define	HYF_CLRWFMSG	0xE6	/* clear wait for mwssage */
190 #define	HYF_WAITFORMSG	0xE8	/* wait for message */
191