|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 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: * 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.
23: *
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.
35: *
36: * @(#)if_hy.h 7.4 (Berkeley) 6/28/90
37: */
38:
39: /*
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: *
76: */
77:
78:
79: /*
80: * Structure of a HYPERchannel adapter header
81: */
82: struct 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: */
105: struct 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: */
146: #define HYRSIZE 37 /* max number of adapters in routing tables */
147:
148: struct 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 */
153: u_short hyr_flags; /* status flags - see below */
154: u_short hyr_size; /* number of entries */
155: union {
156: /*
157: * direct entry (can get there directly)
158: */
159: struct {
160: u_short hyru_dst; /* adapter number & port */
161: u_short hyru_ctl; /* trunks to try */
162: u_short hyru_access; /* access code (mostly unused) */
163: } hyr_d;
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
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;
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
178: } hyr_u;
179: } hyr_hash[HYRSIZE];
180: };
181:
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: */
190: struct 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: };
195:
196: #define HYR_INUSE 0x01 /* entry in use */
197: #define HYR_DIR 0x02 /* direct entry */
198: #define HYR_GATE 0x04 /* gateway entry */
199: #define HYR_LOOP 0x08 /* hardware loopback entry */
200: #define HYR_RLOOP 0x10 /* remote adapter hardware loopback entry */
201:
202: #define HYRHASH(x) (((x) ^ ((x) >> 16)) % HYRSIZE)
203:
204: #define HYSETROUTE _IOW('i', 0x80, struct hyrsetget)
205: #define HYGETROUTE _IOW('i', 0x81, struct hyrsetget)
206:
207: struct 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:
214: #define HYSETLOG _IOW('i', 0x82, struct hylsetget)
215: #define HYGETLOG _IOW('i', 0x83, struct hylsetget)
216: #define HYGETELOG _IOW('i', 0x84, struct hylsetget)
217:
218: /*
219: * Structure of Statistics Record (counters)
220: */
221: struct 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: */
239: struct 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
256: struct 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
321: char *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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.