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