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