BSD 4_3_Net_2 release
[unix-history] / usr / src / sys / vax / if / if_hy.h
CommitLineData
da7c5cc6 1/*
0880b18e 2 * Copyright (c) 1982, 1986 Regents of the University of California.
5f9369d6 3 * All rights reserved.
da7c5cc6 4 *
5f9369d6
KB
5 * This code is derived from software contributed to Berkeley by
6 * Tektronix Inc.
7 *
af359dea
C
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 * 3. All advertising materials mentioning features or use of this software
17 * must display the following acknowledgement:
18 * This product includes software developed by the University of
19 * California, Berkeley and its contributors.
20 * 4. Neither the name of the University nor the names of its contributors
21 * may be used to endorse or promote products derived from this software
22 * without specific prior written permission.
5f9369d6 23 *
af359dea
C
24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
5f9369d6 35 *
1c15e888 36 * @(#)if_hy.h 7.4 (Berkeley) 6/28/90
da7c5cc6 37 */
fe3ce306
SL
38
39/*
bdddb192
MK
40 * 4.2 BSD Unix Kernel - Vax Network Interface Support
41 *
42 * $Header: if_hy.h,v 10.0 84/06/30 19:51:21 steveg Stable $
43 * $Locker: $
44 *
45 * Modifications from Berkeley 4.2 BSD
46 * Copyright (c) 1983, Tektronix Inc.
47 * All Rights Reserved
48 *
49 *
50 * $Log: if_hy.h,v $
51 * Revision 10.0 84/06/30 19:51:21 steveg
52 * Big Build
53 *
54 * Revision 3.13 84/05/30 19:40:58 steveg
55 * update hy_stat to reflect new microcode
56 *
57 * Revision 3.12 84/05/30 19:06:57 steveg
58 * move driver state number definition here from if_hy.c
59 *
60 * Revision 3.11 84/05/30 18:56:15 steveg
61 * add definition of HYE_MAX and HYE_SIZE
62 *
63 * Revision 3.10 84/05/30 17:14:04 steveg
64 * add hyl_filter
65 *
66 * Revision 3.9 84/05/30 13:45:24 steveg
67 * rework logging
68 *
69 * Revision 3.8 84/05/04 05:18:59 steveg
70 * hyr_key now a u_long
71 *
72 * Revision 3.7 84/05/01 22:45:20 steveg
73 * add H_RLOOPBK for A710 remote end loopback command
74 *
75 *
fe3ce306
SL
76 */
77
bdddb192
MK
78
79/*
80 * Structure of a HYPERchannel adapter header
81 */
82struct hy_hdr {
83 short hyh_ctl; /* control */
84 short hyh_access; /* access code */
85 union {
86 short hyh_addr;
87 char hyh_baddr[2];
88 } hyh_uto, hyh_ufrom; /* to/from address */
89 short hyh_param; /* parameter word */
90 short hyh_type; /* record type */
91};
92
93
94#define hyh_to hyh_uto.hyh_addr
95#define hyh_to_port hyh_uto.hyh_baddr[1]
96#define hyh_to_adapter hyh_uto.hyh_baddr[0]
97
98#define hyh_from hyh_ufrom.hyh_addr
99#define hyh_from_port hyh_ufrom.hyh_baddr[1]
100#define hyh_from_adapter hyh_ufrom.hyh_baddr[0]
101
102/*
103 * Structure of a HYPERchannel message header (from software)
104 */
105struct hym_hdr {
106 struct {
107 short hymd_mplen; /* message proper len, if associated data */
108 } hym_d;
109 struct hy_hdr hym_h; /* hardware header, MUST BE LAST */
110};
111
112#define hym_mplen hym_d.hymd_mplen
113
114#define hym_ctl hym_h.hyh_ctl
115#define hym_access hym_h.hyh_access
116#define hym_param hym_h.hyh_param
117#define hym_type hym_h.hyh_type
118
119#define hym_to hym_h.hyh_to
120#define hym_to_port hym_h.hyh_to_port
121#define hym_to_adapter hym_h.hyh_to_adapter
122
123#define hym_from hym_h.hyh_from
124#define hym_from_port hym_h.hyh_from_port
125#define hym_from_adapter hym_h.hyh_from_adapter
126
127#define HYM_SWLEN (sizeof(struct hym_hdr) - sizeof(struct hy_hdr))
128
129/*
130 * HYPERchannel header word control bits
131 */
132#define H_XTRUNKS 0x00F0 /* transmit trunks */
133#define H_RTRUNKS 0x000F /* remote trunks to transmit on for loopback */
134#define H_ASSOC 0x0100 /* has associated data */
135#define H_LOOPBK 0x00FF /* loopback command */
136#define H_RLOOPBK 0x008F /* A710 remote loopback command */
137
138/*
139 * Hyperchannel record types
140 */
141#define HYLINK_IP 0 /* Internet Protocol Packet */
142
143/*
144 * Routing database
145 */
fe3ce306
SL
146#define HYRSIZE 37 /* max number of adapters in routing tables */
147
bdddb192
MK
148struct hy_route {
149 time_t hyr_lasttime; /* last update time */
150 u_char hyr_gateway[256];
151 struct hyr_hash {
152 u_long hyr_key; /* desired address */
fe3ce306 153 u_short hyr_flags; /* status flags - see below */
bdddb192 154 u_short hyr_size; /* number of entries */
fe3ce306
SL
155 union {
156 /*
157 * direct entry (can get there directly)
158 */
159 struct {
bdddb192
MK
160 u_short hyru_dst; /* adapter number & port */
161 u_short hyru_ctl; /* trunks to try */
fe3ce306
SL
162 u_short hyru_access; /* access code (mostly unused) */
163 } hyr_d;
bdddb192
MK
164#define hyr_dst hyr_u.hyr_d.hyru_dst
165#define hyr_ctl hyr_u.hyr_d.hyru_ctl
166#define hyr_access hyr_u.hyr_d.hyru_access
fe3ce306
SL
167 /*
168 * indirect entry (one or more hops required)
169 */
170 struct {
171 u_char hyru_pgate; /* 1st gateway slot */
172 u_char hyru_egate; /* # gateways */
173 u_char hyru_nextgate; /* gateway to use next */
174 } hyr_i;
bdddb192
MK
175#define hyr_pgate hyr_u.hyr_i.hyru_pgate
176#define hyr_egate hyr_u.hyr_i.hyru_egate
177#define hyr_nextgate hyr_u.hyr_i.hyru_nextgate
fe3ce306
SL
178 } hyr_u;
179 } hyr_hash[HYRSIZE];
fe3ce306
SL
180};
181
bdddb192
MK
182/*
183 * routing table set/get structure
184 *
185 * used to just pass the entire routing table through, but 4.2 ioctls
186 * limit the data part of an ioctl to 128 bytes or so and use the
187 * interface name to get things sent the right place.
188 * see ../net/if.h for additional details.
189 */
190struct hyrsetget {
191 char hyrsg_name[IFNAMSIZ]; /* if name, e.g. "hy0" */
192 struct hy_route *hyrsg_ptr; /* pointer to routing table */
193 unsigned hyrsg_len; /* size of routing table provided */
194};
fe3ce306
SL
195
196#define HYR_INUSE 0x01 /* entry in use */
197#define HYR_DIR 0x02 /* direct entry */
198#define HYR_GATE 0x04 /* gateway entry */
bdddb192
MK
199#define HYR_LOOP 0x08 /* hardware loopback entry */
200#define HYR_RLOOP 0x10 /* remote adapter hardware loopback entry */
fe3ce306
SL
201
202#define HYRHASH(x) (((x) ^ ((x) >> 16)) % HYRSIZE)
203
66111f48
KB
204#define HYSETROUTE _IOW('i', 0x80, struct hyrsetget)
205#define HYGETROUTE _IOW('i', 0x81, struct hyrsetget)
bdddb192
MK
206
207struct hylsetget {
208 char hylsg_name[IFNAMSIZ]; /* if name, e.g. "hy0" */
209 int hylsg_cmd; /* logging command */
210 caddr_t hylsg_ptr; /* pointer to table */
211 u_long hylsg_len; /* size of table provided */
212};
213
66111f48
KB
214#define HYSETLOG _IOW('i', 0x82, struct hylsetget)
215#define HYGETLOG _IOW('i', 0x83, struct hylsetget)
216#define HYGETELOG _IOW('i', 0x84, struct hylsetget)
bdddb192
MK
217
218/*
219 * Structure of Statistics Record (counters)
220 */
221struct hy_stat {
222 u_char hyc_df0[3]; /* # data frames trunk 0 */
223 u_char hyc_df1[3]; /* # data frames trunk 1 */
224 u_char hyc_df2[3]; /* # data frames trunk 2 */
225 u_char hyc_df3[3]; /* # data frames trunk 3 */
226 u_char hyc_cancel[2]; /* # cancel operations */
227 u_char hyc_abort[2]; /* # aborts */
228 u_char hyc_ret0[3]; /* # retransmissions trunk 0 */
229 u_char hyc_ret1[3]; /* # retransmissions trunk 1 */
230 u_char hyc_ret2[3]; /* # retransmissions trunk 2 */
231 u_char hyc_ret3[3]; /* # retransmissions trunk 3 */
232 u_char hyc_atype[3]; /* adapter type and revision level */
233 u_char hyc_uaddr; /* adapter unit number */
234};
235
236/*
237 * Structure of the Status Record
238 */
239struct hy_status {
240 u_char hys_gen_status; /* general status byte */
241 u_char hys_last_fcn; /* last function code issued */
242 u_char hys_resp_trunk; /* trunk response byte */
243 u_char hys_status_trunk; /* trunk status byte */
244 u_char hys_recd_resp; /* recieved response byte */
245 u_char hys_error; /* error code */
246 u_char hys_caddr; /* compressed addr of 1st msg on chain */
247 u_char hys_pad; /* not used */
248};
249
250/*
251 * Get port number from status record
252 */
253#define PORTNUM(p) (((p)->hys_gen_status >> 6) & 0x03)
254
255#define HYL_SIZE 16*1024
256struct hy_log {
257 struct hy_log *hyl_self;
258 u_char hyl_enable; /* logging enabled? */
259 u_char hyl_onerr; /* state to enter on error */
260 u_short hyl_wait; /* number of bytes till next wakeup */
261 u_short hyl_count; /* number of samples till stop */
262 u_short hyl_icount; /* initial value of hyl_count */
263 u_long hyl_filter; /* log items with specific bits set */
264 u_char *hyl_eptr; /* &hy_log.hyl_buf[HYL_SIZE] */
265 u_char *hyl_ptr; /* pointer into hyl_buf */
266 u_char hyl_buf[HYL_SIZE]; /* log buffer space */
267};
268
269#define HYL_NOP 0
270#define HYL_UP 1 /* markup */
271#define HYL_STATUS 2 /* status results (struct hy_status) */
272#define HYL_STATISTICS 3 /* statistics (struct hy_stat) */
273#define HYL_XMIT 4 /* packed being send (struct hym_hdr) */
274#define HYL_RECV 5 /* recieved pkt (short len; struct hym_hdr) */
275#define HYL_CMD 6 /* cmd issued (uchar cmd, state; short count) */
276#define HYL_INT 7 /* interrupt (short csr, wcr) */
277#define HYL_CANCEL 8 /* cancel transmit attempt */
278#define HYL_RESET 9 /* hyinit or unibus reset */
279#define HYL_IOCTL 10 /* hyioctl */
280
281#define HYL_DISABLED 0 /* logging disabled */
282#define HYL_CONTINUOUS 1 /* continuous logging */
283#define HYL_CATCHN 2 /* hyl_count transactions being captured */
284
285/*
286 * error code histograms
287 */
288#define HYE_MAX 0x18 /* maximum adapter error code */
289#define HYE_BINS 4 /* number of command bins */
290#define HYE_SIZE (HYE_MAX+1)*HYE_BINS /* size of histogram buffer */
291
292/*
293 * Requests for service (in order by descending priority).
294 */
295#define RQ_ENDOP 001 /* end the last adapter function */
296#define RQ_REISSUE 002 /* reissue previous cmd after status */
297#define RQ_STATUS 004 /* get the status of the adapter */
298#define RQ_STATISTICS 010 /* get the statistics of the adapter */
299#define RQ_MARKDOWN 020 /* mark this adapter port down */
300#define RQ_MARKUP 040 /* mark this interface up */
301
302#define RQ_XASSOC 0100 /* associated data to transmit */
303
304/*
305 * Driver states.
306 */
307#define STARTUP 0 /* initial state (before fully there) */
308#define IDLE 1 /* idle state */
309#define STATSENT 2 /* status cmd sent to adapter */
310#define ENDOPSENT 3 /* end operation cmd sent */
311#define RECVSENT 4 /* input message cmd sent */
312#define RECVDATASENT 5 /* input data cmd sent */
313#define XMITSENT 6 /* transmit message cmd sent */
314#define XMITDATASENT 7 /* transmit data cmd sent */
315#define WAITING 8 /* waiting for messages */
316#define CLEARSENT 9 /* clear wait for message cmd sent */
317#define MARKPORT 10 /* mark this host's adapter port down issued */
318#define RSTATSENT 11 /* read statistics cmd sent to adapter */
319
320#ifdef HYLOG
321char *hy_state_names[] = {
322 "Startup",
323 "Idle",
324 "Status Sent",
325 "End op Sent",
326 "Recieve Message Proper Sent",
327 "Recieve Data Sent",
328 "Transmit Message Proper Sent",
329 "Transmit Data Sent",
330 "Wait for Message Sent",
331 "Clear Wait for Message Sent",
332 "Mark Port Down Sent",
333 "Read Statistics Sent"
334};
335#endif
336