Commit | Line | Data |
---|---|---|
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 | */ | |
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 | */ | |
fe3ce306 SL |
146 | #define HYRSIZE 37 /* max number of adapters in routing tables */ |
147 | ||
bdddb192 MK |
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 */ | |
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 | */ | |
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 | }; | |
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 | |
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 | ||
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 | */ | |
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 |