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