xref: /csrg-svn/sys/vax/if/if_hy.h (revision 29282)
123296Smckusick /*
2*29282Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
323296Smckusick  * All rights reserved.  The Berkeley software License Agreement
423296Smckusick  * specifies the terms and conditions for redistribution.
523296Smckusick  *
6*29282Smckusick  *	@(#)if_hy.h	7.1 (Berkeley) 06/05/86
723296Smckusick  */
811196Ssam 
911196Ssam /*
1021129Skarels  * 4.2 BSD Unix Kernel - Vax Network Interface Support
1121129Skarels  *
1221129Skarels  * $Header: if_hy.h,v 10.0 84/06/30 19:51:21 steveg Stable $
1321129Skarels  * $Locker:  $
1421129Skarels  *
1521129Skarels  * Modifications from Berkeley 4.2 BSD
1621129Skarels  * Copyright (c) 1983, Tektronix Inc.
1721129Skarels  * All Rights Reserved
1821129Skarels  *
1921129Skarels  *
2021129Skarels  * $Log:	if_hy.h,v $
2121129Skarels  *	Revision 10.0  84/06/30  19:51:21  steveg
2221129Skarels  *	Big Build
2321129Skarels  *
2421129Skarels  *	Revision 3.13  84/05/30  19:40:58  steveg
2521129Skarels  *	update hy_stat to reflect new microcode
2621129Skarels  *
2721129Skarels  *	Revision 3.12  84/05/30  19:06:57  steveg
2821129Skarels  *	move driver state number definition here from if_hy.c
2921129Skarels  *
3021129Skarels  *	Revision 3.11  84/05/30  18:56:15  steveg
3121129Skarels  *	add definition of HYE_MAX and HYE_SIZE
3221129Skarels  *
3321129Skarels  *	Revision 3.10  84/05/30  17:14:04  steveg
3421129Skarels  *	add hyl_filter
3521129Skarels  *
3621129Skarels  *	Revision 3.9  84/05/30  13:45:24  steveg
3721129Skarels  *	rework logging
3821129Skarels  *
3921129Skarels  *	Revision 3.8  84/05/04  05:18:59  steveg
4021129Skarels  *	hyr_key now a u_long
4121129Skarels  *
4221129Skarels  *	Revision 3.7  84/05/01  22:45:20  steveg
4321129Skarels  *	add H_RLOOPBK for A710 remote end loopback command
4421129Skarels  *
4521129Skarels  *
4611196Ssam  */
4711196Ssam 
4821129Skarels 
4921129Skarels /*
5021129Skarels  * Structure of a HYPERchannel adapter header
5121129Skarels  */
5221129Skarels struct	hy_hdr {
5321129Skarels 	short	hyh_ctl;		/* control */
5421129Skarels 	short	hyh_access;		/* access code */
5521129Skarels 	union {
5621129Skarels 		short	hyh_addr;
5721129Skarels 		char	hyh_baddr[2];
5821129Skarels 	} hyh_uto, hyh_ufrom;		/* to/from address */
5921129Skarels 	short	hyh_param;		/* parameter word */
6021129Skarels 	short	hyh_type;		/* record type */
6121129Skarels };
6221129Skarels 
6321129Skarels 
6421129Skarels #define hyh_to		hyh_uto.hyh_addr
6521129Skarels #define hyh_to_port	hyh_uto.hyh_baddr[1]
6621129Skarels #define hyh_to_adapter	hyh_uto.hyh_baddr[0]
6721129Skarels 
6821129Skarels #define hyh_from	hyh_ufrom.hyh_addr
6921129Skarels #define hyh_from_port	hyh_ufrom.hyh_baddr[1]
7021129Skarels #define hyh_from_adapter hyh_ufrom.hyh_baddr[0]
7121129Skarels 
7221129Skarels /*
7321129Skarels  * Structure of a HYPERchannel message header (from software)
7421129Skarels  */
7521129Skarels struct	hym_hdr {
7621129Skarels 	struct {
7721129Skarels 		short	hymd_mplen;	/* message proper len, if associated data */
7821129Skarels 	} hym_d;
7921129Skarels 	struct	hy_hdr hym_h;	/* hardware header, MUST BE LAST */
8021129Skarels };
8121129Skarels 
8221129Skarels #define hym_mplen	hym_d.hymd_mplen
8321129Skarels 
8421129Skarels #define hym_ctl		hym_h.hyh_ctl
8521129Skarels #define hym_access	hym_h.hyh_access
8621129Skarels #define hym_param	hym_h.hyh_param
8721129Skarels #define hym_type	hym_h.hyh_type
8821129Skarels 
8921129Skarels #define hym_to		hym_h.hyh_to
9021129Skarels #define hym_to_port	hym_h.hyh_to_port
9121129Skarels #define hym_to_adapter	hym_h.hyh_to_adapter
9221129Skarels 
9321129Skarels #define hym_from	hym_h.hyh_from
9421129Skarels #define hym_from_port	hym_h.hyh_from_port
9521129Skarels #define hym_from_adapter hym_h.hyh_from_adapter
9621129Skarels 
9721129Skarels #define HYM_SWLEN (sizeof(struct hym_hdr) - sizeof(struct hy_hdr))
9821129Skarels 
9921129Skarels /*
10021129Skarels  * HYPERchannel header word control bits
10121129Skarels  */
10221129Skarels #define H_XTRUNKS	0x00F0	/* transmit trunks */
10321129Skarels #define H_RTRUNKS	0x000F	/* remote trunks to transmit on for loopback */
10421129Skarels #define H_ASSOC		0x0100	/* has associated data */
10521129Skarels #define H_LOOPBK	0x00FF	/* loopback command */
10621129Skarels #define H_RLOOPBK	0x008F	/* A710 remote loopback command */
10721129Skarels 
10821129Skarels /*
10921129Skarels  * Hyperchannel record types
11021129Skarels  */
11121129Skarels #define HYLINK_IP	0	/* Internet Protocol Packet */
11221129Skarels 
11321129Skarels /*
11421129Skarels  * Routing database
11521129Skarels  */
11611196Ssam #define HYRSIZE  37	/* max number of adapters in routing tables */
11711196Ssam 
11821129Skarels struct hy_route {
11921129Skarels 	time_t hyr_lasttime;		/* last update time */
12021129Skarels 	u_char hyr_gateway[256];
12121129Skarels 	struct hyr_hash {
12221129Skarels 		u_long	hyr_key;	/* desired address */
12311196Ssam 		u_short hyr_flags;	/* status flags - see below */
12421129Skarels 		u_short hyr_size;	/* number of entries */
12511196Ssam 		union {
12611196Ssam 			/*
12711196Ssam 			 * direct entry (can get there directly)
12811196Ssam 			 */
12911196Ssam 			struct {
13021129Skarels 				u_short hyru_dst;	/* adapter number & port */
13121129Skarels 				u_short hyru_ctl;	/* trunks to try */
13211196Ssam 				u_short hyru_access;	/* access code (mostly unused) */
13311196Ssam 			} hyr_d;
13421129Skarels #define hyr_dst		hyr_u.hyr_d.hyru_dst
13521129Skarels #define hyr_ctl		hyr_u.hyr_d.hyru_ctl
13621129Skarels #define hyr_access	hyr_u.hyr_d.hyru_access
13711196Ssam 			/*
13811196Ssam 			 * indirect entry (one or more hops required)
13911196Ssam 			 */
14011196Ssam 			struct {
14111196Ssam 				u_char hyru_pgate;	/* 1st gateway slot */
14211196Ssam 				u_char hyru_egate;	/* # gateways */
14311196Ssam 				u_char hyru_nextgate;	/* gateway to use next */
14411196Ssam 			} hyr_i;
14521129Skarels #define hyr_pgate	hyr_u.hyr_i.hyru_pgate
14621129Skarels #define hyr_egate	hyr_u.hyr_i.hyru_egate
14721129Skarels #define hyr_nextgate	hyr_u.hyr_i.hyru_nextgate
14811196Ssam 		} hyr_u;
14911196Ssam 	} hyr_hash[HYRSIZE];
15011196Ssam };
15111196Ssam 
15221129Skarels /*
15321129Skarels  * routing table set/get structure
15421129Skarels  *
15521129Skarels  * used to just pass the entire routing table through, but 4.2 ioctls
15621129Skarels  * limit the data part of an ioctl to 128 bytes or so and use the
15721129Skarels  * interface name to get things sent the right place.
15821129Skarels  * see ../net/if.h for additional details.
15921129Skarels  */
16021129Skarels struct hyrsetget {
16121129Skarels 	char	hyrsg_name[IFNAMSIZ];	/* if name, e.g. "hy0" */
16221129Skarels 	struct hy_route *hyrsg_ptr;	/* pointer to routing table */
16321129Skarels 	unsigned	hyrsg_len;	/* size of routing table provided */
16421129Skarels };
16511196Ssam 
16611196Ssam #define HYR_INUSE	0x01	/* entry in use */
16711196Ssam #define HYR_DIR		0x02	/* direct entry */
16811196Ssam #define HYR_GATE	0x04	/* gateway entry */
16921129Skarels #define HYR_LOOP	0x08	/* hardware loopback entry */
17021129Skarels #define HYR_RLOOP	0x10	/* remote adapter hardware loopback entry */
17111196Ssam 
17211196Ssam #define HYRHASH(x) (((x) ^ ((x) >> 16)) % HYRSIZE)
17311196Ssam 
17421129Skarels #define HYSETROUTE	_IOW(i, 0x80, struct hyrsetget)
17521129Skarels #define HYGETROUTE	_IOW(i, 0x81, struct hyrsetget)
17621129Skarels 
17721129Skarels struct	hylsetget {
17821129Skarels 	char	hylsg_name[IFNAMSIZ];	/* if name, e.g. "hy0" */
17921129Skarels 	int	hylsg_cmd;		/* logging command */
18021129Skarels 	caddr_t	hylsg_ptr;		/* pointer to table */
18121129Skarels 	u_long	hylsg_len;		/* size of table provided */
18221129Skarels };
18321129Skarels 
18421129Skarels #define HYSETLOG	_IOW(i, 0x82, struct hylsetget)
18521129Skarels #define HYGETLOG	_IOW(i, 0x83, struct hylsetget)
18621129Skarels #define HYGETELOG	_IOW(i, 0x84, struct hylsetget)
18721129Skarels 
18821129Skarels /*
18921129Skarels  * Structure of Statistics Record (counters)
19021129Skarels  */
19121129Skarels struct	hy_stat {
19221129Skarels 	u_char	hyc_df0[3];		/* # data frames trunk 0 */
19321129Skarels 	u_char	hyc_df1[3];		/* # data frames trunk 1 */
19421129Skarels 	u_char	hyc_df2[3];		/* # data frames trunk 2 */
19521129Skarels 	u_char	hyc_df3[3];		/* # data frames trunk 3 */
19621129Skarels 	u_char	hyc_cancel[2];		/* # cancel operations */
19721129Skarels 	u_char	hyc_abort[2];		/* # aborts */
19821129Skarels 	u_char	hyc_ret0[3];		/* # retransmissions trunk 0 */
19921129Skarels 	u_char	hyc_ret1[3];		/* # retransmissions trunk 1 */
20021129Skarels 	u_char	hyc_ret2[3];		/* # retransmissions trunk 2 */
20121129Skarels 	u_char	hyc_ret3[3];		/* # retransmissions trunk 3 */
20221129Skarels 	u_char	hyc_atype[3];		/* adapter type and revision level */
20321129Skarels 	u_char	hyc_uaddr;		/* adapter unit number */
20421129Skarels };
20521129Skarels 
20621129Skarels /*
20721129Skarels  * Structure of the Status Record
20821129Skarels  */
20921129Skarels struct hy_status {
21021129Skarels 	u_char	hys_gen_status;		/* general status byte */
21121129Skarels 	u_char	hys_last_fcn;		/* last function code issued */
21221129Skarels 	u_char	hys_resp_trunk;		/* trunk response byte */
21321129Skarels 	u_char	hys_status_trunk;	/* trunk status byte */
21421129Skarels 	u_char	hys_recd_resp;		/* recieved response byte */
21521129Skarels 	u_char	hys_error;		/* error code */
21621129Skarels 	u_char	hys_caddr;		/* compressed addr of 1st msg on chain */
21721129Skarels 	u_char	hys_pad;		/* not used */
21821129Skarels };
21921129Skarels 
22021129Skarels /*
22121129Skarels  * Get port number from status record
22221129Skarels  */
22321129Skarels #define PORTNUM(p)	(((p)->hys_gen_status >> 6) & 0x03)
22421129Skarels 
22521129Skarels #define HYL_SIZE 16*1024
22621129Skarels struct hy_log {
22721129Skarels 	struct	hy_log *hyl_self;
22821129Skarels 	u_char	hyl_enable;		/* logging enabled? */
22921129Skarels 	u_char	hyl_onerr;		/* state to enter on error */
23021129Skarels 	u_short	hyl_wait;		/* number of bytes till next wakeup */
23121129Skarels 	u_short	hyl_count;		/* number of samples till stop */
23221129Skarels 	u_short hyl_icount;		/* initial value of hyl_count */
23321129Skarels 	u_long	hyl_filter;		/* log items with specific bits set */
23421129Skarels 	u_char	*hyl_eptr;		/* &hy_log.hyl_buf[HYL_SIZE] */
23521129Skarels 	u_char	*hyl_ptr;		/* pointer into hyl_buf */
23621129Skarels 	u_char	hyl_buf[HYL_SIZE];	/* log buffer space */
23721129Skarels };
23821129Skarels 
23921129Skarels #define HYL_NOP		0
24021129Skarels #define HYL_UP		1	/* markup */
24121129Skarels #define HYL_STATUS	2	/* status results (struct hy_status) */
24221129Skarels #define HYL_STATISTICS	3	/* statistics (struct hy_stat) */
24321129Skarels #define HYL_XMIT	4	/* packed being send (struct hym_hdr) */
24421129Skarels #define HYL_RECV	5	/* recieved pkt (short len; struct hym_hdr) */
24521129Skarels #define HYL_CMD		6	/* cmd issued (uchar cmd, state; short count) */
24621129Skarels #define HYL_INT		7	/* interrupt (short csr, wcr) */
24721129Skarels #define	HYL_CANCEL	8	/* cancel transmit attempt */
24821129Skarels #define	HYL_RESET	9	/* hyinit or unibus reset */
24921129Skarels #define	HYL_IOCTL	10	/* hyioctl */
25021129Skarels 
25121129Skarels #define HYL_DISABLED	0	/* logging disabled */
25221129Skarels #define HYL_CONTINUOUS	1	/* continuous logging */
25321129Skarels #define HYL_CATCHN	2	/* hyl_count transactions being captured */
25421129Skarels 
25521129Skarels /*
25621129Skarels  * error code histograms
25721129Skarels  */
25821129Skarels #define	HYE_MAX		0x18		/* maximum adapter error code */
25921129Skarels #define	HYE_BINS	4		/* number of command bins */
26021129Skarels #define	HYE_SIZE  (HYE_MAX+1)*HYE_BINS	/* size of histogram buffer */
26121129Skarels 
26221129Skarels /*
26321129Skarels  * Requests for service (in order by descending priority).
26421129Skarels  */
26521129Skarels #define RQ_ENDOP	001	/* end the last adapter function */
26621129Skarels #define RQ_REISSUE	002	/* reissue previous cmd after status */
26721129Skarels #define RQ_STATUS	004	/* get the status of the adapter */
26821129Skarels #define RQ_STATISTICS	010	/* get the statistics of the adapter */
26921129Skarels #define RQ_MARKDOWN	020	/* mark this adapter port down */
27021129Skarels #define RQ_MARKUP	040	/* mark this interface up */
27121129Skarels 
27221129Skarels #define RQ_XASSOC	0100	/* associated data to transmit */
27321129Skarels 
27421129Skarels /*
27521129Skarels  * Driver states.
27621129Skarels  */
27721129Skarels #define	STARTUP		0	/* initial state (before fully there) */
27821129Skarels #define	IDLE		1	/* idle state */
27921129Skarels #define	STATSENT	2	/* status cmd sent to adapter */
28021129Skarels #define	ENDOPSENT	3	/* end operation cmd sent */
28121129Skarels #define	RECVSENT	4	/* input message cmd sent */
28221129Skarels #define	RECVDATASENT	5	/* input data cmd sent */
28321129Skarels #define	XMITSENT	6	/* transmit message cmd sent */
28421129Skarels #define	XMITDATASENT	7	/* transmit data cmd sent */
28521129Skarels #define	WAITING		8	/* waiting for messages */
28621129Skarels #define	CLEARSENT	9	/* clear wait for message cmd sent */
28721129Skarels #define MARKPORT	10	/* mark this host's adapter port down issued */
28821129Skarels #define RSTATSENT	11	/* read statistics cmd sent to adapter */
28921129Skarels 
29021129Skarels #ifdef HYLOG
29121129Skarels char *hy_state_names[] = {
29221129Skarels 	"Startup",
29321129Skarels 	"Idle",
29421129Skarels 	"Status Sent",
29521129Skarels 	"End op Sent",
29621129Skarels 	"Recieve Message Proper Sent",
29721129Skarels 	"Recieve Data Sent",
29821129Skarels 	"Transmit Message Proper Sent",
29921129Skarels 	"Transmit Data Sent",
30021129Skarels 	"Wait for Message Sent",
30121129Skarels 	"Clear Wait for Message Sent",
30221129Skarels 	"Mark Port Down Sent",
30321129Skarels 	"Read Statistics Sent"
30421129Skarels };
30521129Skarels #endif
30621129Skarels 
307