[comp.protocols.appletalk] kboot part 3/3

bobs@randvax.UUCP (Rober Schwartzkopf) (01/30/91)

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 3)."
# Contents:  cmdidx.h cmdmacro.h
# Wrapped by bobs@chumley on Tue Jan 29 17:41:52 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'cmdidx.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'cmdidx.h'\"
else
echo shar: Extracting \"'cmdidx.h'\" \(4127 characters\)
sed "s/^X//" >'cmdidx.h' <<'END_OF_FILE'
X/*
X * $Header: /tmp_mnt/home/src/rand/etc/kboot/RCS/cmdidx.h,v 1.1 91/01/29 17:37:34 root Exp $
X *
X * $Log:	cmdidx.h,v $
X * Revision 1.1  91/01/29  17:37:34  root
X * Initial revision
X * 
X */
X
X/*
X**	Copyright (C) 1987, 1988 Kinetics, Inc.  All Rights Reserved.
X**	This program contains proprietary confidential information
X**	and trade secrets of Kinetics, Inc.  Reverse engineering
X**	of object code is prohibited.  Use of copyright notice
X**	is precautionary and does not imply publication.
X**
X**
X**	Indices into the jump table for PROM routines.
X**	Also, the command numbers for the routines when invoked
X**	from Kinetics LAP type command packets.
X**
X**	NOTE:	this include file is used in assembly source as
X**		well as C source, and so may not contain any C-dependent
X**		definitions.
X*/
X
X/* number of mc68000 vectors we support: */
X#define NUMVECS	64
X
X/* number of entries in subroutine table: */
X#define	NUMKCMDS	150
X
X/* commands commented with KLAP are callable as remote procedures: */
X#define	X_VERSION	 0		/* KLAP */
X#define	X_EXECUTE	 1		/* KLAP */
X#define	X_ACK		 2		/* OBSOLETE */
X#define	X_REBOOT	 3		/* KLAP */
X#define	X_SET68		 4
X#define	X_SET86		 5
X#define	X_ATINIT	 6
X#define	X_ATWRITE	 7
X#define	X_WAIT		 8		/* KLAP */
X#define	X_WHEREIS	 9		/* KLAP */
X#define	X_GETMEM	10		/* KLAP */
X#define	X_PROTECT	11		/* KLAP */
X#define	X_COPYMEM	12		/* KLAP */
X#define	X_CLRMEM	13		/* KLAP */
X#define	X_PROMRAM	14		/* KLAP */
X#define	X_RESET		15		/* KLAP */
X#define	X_USER0		16		/* KLAP */
X#define	X_USER1		17		/* KLAP */
X#define	X_USER2		18		/* KLAP */
X#define	X_USER3		19		/* KLAP */
X#define	X_USER4		20		/* KLAP */
X#define	X_USER5		21		/* KLAP */
X#define	X_USER6		22		/* KLAP */
X#define	X_USER7		23		/* KLAP */
X#define	X_BUFINIT	24
X#define	X_BUFGET	25
X#define	X_BUFFREE	26
X#define	X_BUFENQ	27
X#define	X_BUFDEQ	28
X#define	X_ERR		29		/* KLAP */
X#define	X_IDLE		30		/* KLAP */
X#define	X_KLAP		31
X#define	X_WHO		32		/* KLAP */
X#define	X_CA86		33
X#define	X_RES86		34
X#define	X_CLRINT	35
X#define	X_RCSID		36		/* KLAP */
X#define	X_EXPROM	37		/* KLAP */
X#define	X_INIPROM	38		/* KLAP */
X#define	X_RES8530	39
X#define	X_DMTSERV	40
X#define	X_SREC		41		/* KLAP */
X#define	X_SPL		42		/* KLAP */
X#define	X_LED		43
X#define	X_RAND		44		/* KLAP */
X#define	X_CMPMEM	45		/* KLAP */
X#define	X_SENDF		46
X#define	X_MEMSEG	47
X#define	X_MALLOC	48
X#define	X_FREE		49
X#define	X_IE_INIT	50
X#define	X_IEXSTART	51
X#define	X_KLAP2		52
X#define	X_PROM1_CHECK	53
X#define	X_PROM1_EXECUTE	54		/* KLAP */
X#define	X_ARPINIT	55
X#define	X_ARPINPUT	56
X#define	X_ARPRESOLVE	57
X#define	X_ARPTIMER	58
X#define	X_ISIPAARP	59
X#define	X_ETINIT	60
X#define	X_TIMING	61
X#define	X_ARPDUMP	62		/* KLAP */
X#define	X_ROUTEDDP	63
X#define	X_NBPINIT	64
X#define	X_NBPINPUT	65
X#define	X_RTMPINIT	66
X#define	X_RTMPINPUT	67
X#define	X_RTMPRESPONSE	68
X#define	X_RTMPTIMER	69
X#define	X_ZIPINIT	70
X#define	X_ZIPINPUT	71
X#define	X_ZIPTIMER	72
X#define	X_ATPINIT	73
X#define	X_ATPINPUT	74
X#define	X_ECHOINIT	75
X#define	X_ECHOINPUT	76
X#define	X_DDPIPINIT	77
X#define	X_ROUTEDDPINIT	78
X#define	X_AUTOCINIT	79
X#define	X_HASHINIT	80
X#define	X_NEWHASHTABLE	81
X#define	X_LOOKUP	82
X#define	X_ADD		83
X#define	X_REMOVE	84
X#define	X_FIRST		85
X#define	X_NEXT		86
X#define	X_NETLOOKUP	87
X#define	X_RMRTMP	88
X#define	X_RTMPREPLACE	89
X#define	X_ADDNET	90
X#define	X_RMNET		91
X#define	X_FINDZONE	92
X#define	X_AUTOCONF	93
X#define	X_RESET_AUTOCONF	94
X#define	X_DDPREPLY	95
X#define	X_ROUTEIP	96
X#define	X_ISSAMEZONE	97
X#define	X_CHECKSUM	98
X#define	X_WHERE2	99		/* KLAP */
X#define	X_GETCFGSUM	100		/* KLAP */
X#define	X_SETCFGSUM	101		/* KLAP */
X#define	X_DMSG		102		/* KLAP */
X#define	X_STATE		103		/* KLAP */
X#define	X_HWSTATUS	104		/* KLAP */
X#define	X_SENDFINIT	105
X#define	X_IESTATS	106		/* KLAP */
X#define	X_AATWRITE	107
X#define	X_ALLBUFS	108
X#define	X_MAKEBUFS	109
X#define	X_CLRPROTSTATS	110		/* KLAP */
X#define	X_GETPROTSTATS	111		/* KLAP */
X#define	X_SIZEMEM	112		/* KLAP */
X#define	X_SETACKLEN	113
X#define	X_IDENT		114		/* KLAP */
X#define	X_SETMCAST	115		/* KLAP */
X#define	X_CHECKFREE	116		/* KLAP */
X#define	X_CLRLOG	117		/* KLAP */
X#define	X_PAUSE		118		/* KLAP */
X#define	X_NOTIMP	(NUMKCMDS-1)
END_OF_FILE
if test 4127 -ne `wc -c <'cmdidx.h'`; then
    echo shar: \"'cmdidx.h'\" unpacked with wrong size!
fi
# end of 'cmdidx.h'
fi
if test -f 'cmdmacro.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'cmdmacro.h'\"
else
echo shar: Extracting \"'cmdmacro.h'\" \(44942 characters\)
sed "s/^X//" >'cmdmacro.h' <<'END_OF_FILE'
X/*
X * $Header: /tmp_mnt/home/src/rand/etc/kboot/RCS/cmdmacro.h,v 1.1 91/01/29 17:37:37 root Exp $
X *
X * $Log:	cmdmacro.h,v $
X * Revision 1.1  91/01/29  17:37:37  root
X * Initial revision
X * 
X */
X
X/*
X**	Copyright (C) 1987 Kinetics, Inc.  All Rights Reserved.
X**	This program contains proprietary confidential information
X**	and trade secrets of Kinetics, Inc.  Reverse engineering
X**	of object code is prohibited.  Use of copyright notice
X**	is precautionary and does not imply publication.
X**
X**
X** The PROM loader guarantees the following to be true when the
X** downloaded program begins executing:
X**
X**	- CPU is in supervisor state,
X**	- Interrupt service is at level 7
X**	- 'sp' contains the address of the boot prom 'jump_table'
X**	  defined below
X**
X**	NOTE:  this file included by assembly and C source,
X**	all C statements are to be bracketed by ASM_INCLUDE
X*/
X
X/*#include <cmdidx.h>		/* use the position dependent command
X				** indices for the X_nnn constants
X				*/
X#ifndef	ASM_INCLUDE
Xstruct fp_table {
X	struct {
X		unsigned short opcode;
X		unsigned long dst_addr;
X		} jump_table[NUMVECS];/* one jump per mc68000 vector */
X
X	int (*subr_table[NUMKCMDS])();
X	char rpctab[NUMKCMDS];		/* 1 indicates corresponding routine
X					** can be called via KLAP, 0 indicates
X					** subroutine only
X					*/
X};
X
Xextern struct fp_table *table_ptr;
X
X#define	K_VERSION(a)	table_ptr->subr_table[X_VERSION](a)
X#define	K_EXECUTE()	table_ptr->subr_table[X_EXECUTE]()
X#define	K_ACK()		table_ptr->subr_table[X_ACK]()
X#define	K_REBOOT()	table_ptr->subr_table[X_REBOOT]()
X#define	K_SET68()	table_ptr->subr_table[X_SET68]()
X#define	K_SET86(a)	table_ptr->subr_table[X_SET86](a)
X#define	K_ATINIT(a)	table_ptr->subr_table[X_ATINIT](a)
X#define	K_ATWRITE(a)	table_ptr->subr_table[X_ATWRITE](a)
X#define	K_WAIT(a)	table_ptr->subr_table[X_WAIT](a)
X#define	K_WHEREIS(a)	table_ptr->subr_table[X_WHEREIS](a)
X#define	K_GETMEM(a)	table_ptr->subr_table[X_GETMEM](a)
X#define	K_PROTECT(a)	table_ptr->subr_table[X_PROTECT](a)
X#define	K_COPYMEM(a)	table_ptr->subr_table[X_COPYMEM](a)
X#define	K_CLRMEM(a)	table_ptr->subr_table[X_CLRMEM](a)
X#define	K_PROMRAM(a)	table_ptr->subr_table[X_PROMRAM](a)
X#define	K_RESET()	table_ptr->subr_table[X_RESET]()
X#define	K_USER0(a)	table_ptr->subr_table[X_USER0](a)
X#define	K_USER1(a)	table_ptr->subr_table[X_USER1](a)
X#define	K_USER2(a)	table_ptr->subr_table[X_USER2](a)
X#define	K_USER3(a)	table_ptr->subr_table[X_USER3](a)
X#define	K_USER4(a)	table_ptr->subr_table[X_USER4](a)
X#define	K_USER5(a)	table_ptr->subr_table[X_USER5](a)
X#define	K_USER6(a)	table_ptr->subr_table[X_USER6](a)
X#define	K_USER7(a)	table_ptr->subr_table[X_USER7](a)
X#define	K_BUFINIT(a)	table_ptr->subr_table[X_BUFINIT](a)
X#define	K_BUFGET(a)	table_ptr->subr_table[X_BUFGET](a)
X#define	K_BUFFREE(a)	table_ptr->subr_table[X_BUFFREE](a)
X#define	K_BUFENQ(a)	table_ptr->subr_table[X_BUFENQ](a)
X#define	K_BUFDEQ(a)	table_ptr->subr_table[X_BUFDEQ](a)
X#define	K_ERR()		table_ptr->subr_table[X_ERR]()
X#define	K_IDLE()	table_ptr->subr_table[X_IDLE]()
X#define	K_KLAP(a)	table_ptr->subr_table[X_KLAP](a)
X#define	K_WHO()		table_ptr->subr_table[X_WHO]()
X#define	K_CA86()	table_ptr->subr_table[X_CA86]()
X#define	K_RES86()	table_ptr->subr_table[X_RES86]()
X#define	K_CLRINT()	table_ptr->subr_table[X_CLRINT]()
X#define	K_RCSID(a)	table_ptr->subr_table[X_RCSID](a)
X#define	K_EXPROM()	table_ptr->subr_table[X_EXPROM]()
X#define	K_INIPROM()	table_ptr->subr_table[X_INIPROM]()
X#define	K_RES8530()	table_ptr->subr_table[X_RES8530]()
X#define	K_DMTSERV()	table_ptr->subr_table[X_DMTSERV]()
X#define	K_SREC(a)	table_ptr->subr_table[X_SREC](a)
X#define	K_SPL(a)	table_ptr->subr_table[X_SPL](a)
X#define	K_LED(a)	table_ptr->subr_table[X_LED](a)
X#define	K_RAND(a)	table_ptr->subr_table[X_RAND](a)
X#define	K_CMPMEM(a)	table_ptr->subr_table[X_CMPMEM](a)
X#define	K_SENDF(a)	table_ptr->subr_table[X_SENDF](a)
X#define	K_MEMSEG(a)	table_ptr->subr_table[X_MEMSEG](a)
X#define	K_MALLOC(a)	table_ptr->subr_table[X_MALLOC](a)
X#define	K_FREE(a)	table_ptr->subr_table[X_FREE](a)
X#define	K_IE_INIT(a)	table_ptr->subr_table[X_IE_INIT](a)
X#define	K_IEXSTART(a)	table_ptr->subr_table[X_IEXSTART](a)
X#define	K_KLAP2(a)	table_ptr->subr_table[X_KLAP2](a)
X#define	K_PROM1_CHECK(a)	table_ptr->subr_table[X_PROM1_CHECK](a)
X#define	K_PROM1_EXECUTE()	table_ptr->subr_table[X_PROM1_EXECUTE]()
X#define	K_ARPINIT(a)	table_ptr->subr_table[X_ARPINIT](a)
X#define	K_ARPINPUT(a)	table_ptr->subr_table[X_ARPINPUT](a)
X#define	K_ARPRESOLVE(a)	table_ptr->subr_table[X_ARPRESOLVE](a)
X#define	K_ARPTIMER(a)	table_ptr->subr_table[X_ARPTIMER](a)
X#define	K_ISIPAARP(a)	table_ptr->subr_table[X_ISIPAARP](a)
X#define	K_ARPDUMP()	table_ptr->subr_table[X_ARPDUMP]()
X#define	K_ETINIT(a)	table_ptr->subr_table[X_ETINIT](a)
X#define	K_TIMING(a)	table_ptr->subr_table[X_TIMING](a)
X#define	K_ROUTEDDP(a)	table_ptr->subr_table[X_ROUTEDDP](a)
X#define	K_NBPINIT()	table_ptr->subr_table[X_NBPINIT]()
X#define	K_NBPINPUT(a)	table_ptr->subr_table[X_NBPINPUT](a)
X#define	K_RTMPINIT(a)	table_ptr->subr_table[X_RTMPINIT](a)
X#define	K_RTMPINPUT(a)	table_ptr->subr_table[X_RTMPINPUT](a)
X#define	K_RTMPRESPONSE(a)	table_ptr->subr_table[X_RTMPRESPONSE](a)
X#define	K_RTMPTIMER()	table_ptr->subr_table[X_RTMPTIMER]()
X#define	K_ZIPINIT(a)	table_ptr->subr_table[X_ZIPINIT](a)
X#define	K_ZIPINPUT(a)	table_ptr->subr_table[X_ZIPINPUT](a)
X#define	K_ZIPTIMER()	table_ptr->subr_table[X_ZIPTIMER]()
X#define	K_ATPINIT()	table_ptr->subr_table[X_ATPINIT]()
X#define	K_ATPINPUT(a)	table_ptr->subr_table[X_ATPINPUT](a)
X#define	K_ECHOINIT(a)	table_ptr->subr_table[X_ECHOINIT](a)
X#define	K_ECHOINPUT(a)	table_ptr->subr_table[X_ECHOINPUT](a)
X#define	K_DDPIPINIT(a)	table_ptr->subr_table[X_DDPIPINIT](a)
X#define	K_ROUTEDDPINIT(a)	table_ptr->subr_table[X_ROUTEDDPINIT](a)
X#define	K_AUTOCINIT(a)	table_ptr->subr_table[X_AUTOCINIT](a)
X#define	K_HASHINIT()	table_ptr->subr_table[X_HASHINIT]()
X#define	K_NEWHASHTABLE(a)	table_ptr->subr_table[X_NEWHASHTABLE](a)
X#define	K_LOOKUP(a)	table_ptr->subr_table[X_LOOKUP](a)
X#define	K_ADD(a)	table_ptr->subr_table[X_ADD](a)
X#define	K_REMOVE(a)	table_ptr->subr_table[X_REMOVE](a)
X#define	K_FIRST(a)	table_ptr->subr_table[X_FIRST](a)
X#define	K_NEXT(a)	table_ptr->subr_table[X_NEXT](a)
X#define	K_NETLOOKUP(a)	table_ptr->subr_table[X_NETLOOKUP](a)
X#define	K_RMRTMP(a)	table_ptr->subr_table[X_RMRTMP](a)
X#define	K_RTMPREPLACE(a)	table_ptr->subr_table[X_RTMPREPLACE](a)
X#define	K_ADDNET(a)	table_ptr->subr_table[X_ADDNET](a)
X#define	K_RMNET(a)	table_ptr->subr_table[X_RMNET](a)
X#define	K_FINDZONE(a)	table_ptr->subr_table[X_FINDZONE](a)
X#define	K_AUTOCONF(a)	table_ptr->subr_table[X_AUTOCONF](a)
X#define	K_RESET_AUTOCONF(a)	table_ptr->subr_table[X_RESET_AUTOCONF](a)
X#define	K_DDPREPLY(a)	table_ptr->subr_table[X_DDPREPLY](a)
X#define	K_ROUTEIP(a)	table_ptr->subr_table[X_ROUTEIP](a)
X#define	K_ISSAMEZONE(a)	table_ptr->subr_table[X_ISSAMEZONE](a)
X#define	K_CHECKSUM(a)	table_ptr->subr_table[X_CHECKSUM](a)
X#define	K_WHERE2(a)	table_ptr->subr_table[X_WHERE2](a)
X#define	K_GETCFGSUM(a)	table_ptr->subr_table[X_GETCFGSUM](a)
X#define	K_SETCFGSUM()	table_ptr->subr_table[X_SETCFGSUM]()
X#define	K_DMSG(a)	table_ptr->subr_table[X_DMSG](a)
X#define	K_STATE(a)	table_ptr->subr_table[X_STATE](a)
X#define	K_HWSTATUS(a)	table_ptr->subr_table[X_HWSTATUS](a)
X#define	K_SENDFINIT()	table_ptr->subr_table[X_SENDFINIT]()
X#define	K_IESTATS(a)	table_ptr->subr_table[X_IESTATS](a)
X#define	K_AATWRITE(a)	table_ptr->subr_table[X_AATWRITE](a)
X#define	K_ALLBUFS(a)	table_ptr->subr_table[X_ALLBUFS](a)
X#define	K_MAKEBUFS(a)	table_ptr->subr_table[X_MAKEBUFS](a)
X#define	K_CLRPROTSTATS()	table_ptr->subr_table[X_CLRPROTSTATS]()
X#define	K_GETPROTSTATS(a)	table_ptr->subr_table[X_GETPROTSTATS](a)
X#define	K_SIZEMEM(a)	table_ptr->subr_table[X_SIZEMEM](a)
X#define	K_SETACKLEN(a)	table_ptr->subr_table[X_SETACKLEN](a)
X#define	K_IDENT(a)	table_ptr->subr_table[X_IDENT](a)
X#define	K_SETMCAST(a)	table_ptr->subr_table[X_SETMCAST](a)
X#define	K_CHECKFREE()	table_ptr->subr_table[X_CHECKFREE]()
X#define	K_CLRLOG()	table_ptr->subr_table[X_CLRLOG]()
X#define	K_NOTIMP()	table_ptr->subr_table[X_NOTIMP]()
X
X/* structures and macro definitions for the above commands */
X
X/* X_VERSION */
Xstruct fp_version {
X	short	fpv_entries;	    /* number of valid entries in jump table */
X	short	fpv_version;	    /* version of the prom code */
X	long	fpv_model;	    /* "KFPS", "KFPQ", or "KFPM" */
X};
X
X/* X_EXECUTE */
X/* no parameters */
X
X/* X_ACK */
X/* no parameters */
X
X/* X_REBOOT */
X/* no parameters */
X
X/* X_SET68 */
X/* no parameters */
X
X/* X_SET86 */
X/* this structure is really defined in ie.h, but it should look like this */
X#ifdef	NEVER
Xstruct scb {
X	unsigned short	sc_status;	/* status */
X	unsigned short	sc_cmd;		/* command */
X	unsigned short	sc_clist;	/* command list */
X	unsigned short	sc_rlist;	/* receive frame list */
X	unsigned short	sc_crcerrs;	/* crc errors */
X	unsigned short	sc_alnerrs;	/* alignment errors */
X	unsigned short	sc_rscerrs;	/* resource errors (lack of rfd/rbd's) */
X	unsigned short	sc_ovrnerrs;	/* overrun errors (mem bus not avail) */
X};
X#endif	NEVER
X
X/* X_ATINIT */
X/* The parameter is a pointer to a short which is filled in with
X   the node number chosen by the AppleTalk initialization sequence */
X
X/* X_ATWRITE */
Xstruct fp_atwrite {
X	short	fpw_length;	/* number of bytes in the following string */
X	unsigned char *fpw_str;	/* string to be output onto the network */
X};
X
X/* X_WAIT */
X/* The parameter is a long integer which indicates
X   the number of milliseconds to delay */
X
X/* X_WHEREIS */
Xstruct fp_whereis {
X	char	*fpw_rom0;	/* first address of 1st ROM */
X	char	*fpw_rom1;	/* first address of 2nd ROM */
X	char	*fpw_8530;	/* address of Zilog 8530 chip */
X	char	*fpw_0port;	/* address of 1st 8-bit port */
X	char	*fpw_1port;	/* address of 2nd 8-bit port */
X	char	*fpw_ram2;	/* address of 1st RAM location */
X	char	*fpw_ramtop;	/* address of last RAM location */
X};
X
X/* X_GETMEM and X_CLRMEM and X_BUFINIT */
Xstruct fp_mem {
X	unsigned short fpm_count;	/* number of bytes */
X	char	*fpm_memp;	/* addr of allocated or to be cleared memory */
X};
X
X/* X_PROTECT */
Xstruct fp_proelem {			/* protection array element */
X	unsigned short fpp_count;	/* number of bytes to protect */
X	char	*fpp_memp;		/* address of memory to protect */
X	unsigned short fpp_chksum;	/* checksum of protected memory */
X};
X
Xstruct fp_protect {
X	short	fpt_oper;	/* type of protection operation and result */
X	short	fpt_count;	/* number of elements in protection array */
X	struct fp_proelem *fpt_elem; /* addr 1st element in protection array */
X};
X#endif	ASM_INCLUDE
X
X/* fpt_oper operations */
X#define	PR_FAIL		-1	/* result: check of checksums failed */
X#define	PR_PASS		0	/* result: check of checksums passed */
X#define	PR_PROTECT	1	/* operation: start protect via elem array */
X#define	PR_CHECK	2	/* operation: verify protect via elem array */
X#define	PR_CANCEL	3	/* operation: cancel protect via elem array */
X
X#ifndef	ASM_INCLUDE
X/* X_COPYMEM and X_CMPMEM */
Xstruct fp_copy {
X	char	*fpc_from;		/* location to copy/cmp bytes from */
X	char	*fpc_to;		/* location to copy/cmp bytes to */
X	unsigned short fpc_count;	/* number of bytes to copy/cmp */
X};
X
X/* macros based on COPYMEM and CMPMEM */
X#define	K_BCOPY(addr1,addr2,cnt) { \
X	struct fp_copy ab; \
X	ab.fpc_from = (char *)(addr1); \
X	ab.fpc_to = (char *)(addr2); \
X	ab.fpc_count = (unsigned short)(cnt); \
X	K_COPYMEM(&ab); \
X}
X
X#define	K_BZERO(addr,cnt) { \
X	struct fp_mem ab; \
X	ab.fpm_count = (unsigned short)(cnt); \
X	ab.fpm_memp = (char *)(addr); \
X	K_CLRMEM(&ab); \
X}
X
X#define	K_BCMP(rv,addr1,addr2,cnt) { \
X	struct fp_copy ab; \
X	ab.fpc_from = (char *)(addr1); \
X	ab.fpc_to = (char *)(addr2); \
X	ab.fpc_count = (unsigned short)(cnt); \
X	K_CMPMEM(&ab); \
X	(rv) = (int)ab.fpc_count; \
X}
X#endif	ASM_INCLUDE
X
X/* X_PROMRAM */
X
X/* packet buffer allocation types: */
X#define	PT_NTYPES	16	/* total number of types defined below */
X#define	PT_FREE		0	/* should be on free list */
X#define	PT_ABUS		1	/* received AppleTalk packet */
X#define	PT_ENET		2	/* received Ethernet packet */
X#define	PT_ARP		3	/* ARP packet */
X#define	PT_DATA		4	/* general data */
X#define	PT_ERBF		5	/* awaiting Ethernet receive packet */
X#define	PT_ETBF		6	/* awaiting Ethernet transmit complete */
X#define	PT_MALLOC	7	/* buffer allocated by malloc() */
X#define	PT_NFS		8	/* buffer allocated for nfs */
X#define	PT_ASP  	9	/* buffer for asp */
X#define	PT_NOFREE	10	/* don't free this buffer, for asp*/
X#define	PT_UNUSED4	11	/* spare, for future use or debugging */
X#define	PT_UNUSED5	12	/* spare, for future use or debugging */
X#define	PT_UNUSED6	13	/* spare, for future use or debugging */
X#define	PT_UNUSED7	14	/* spare, for future use or debugging */
X#define	PT_UNUSED8	15	/* spare, for future use or debugging */
X
X#ifndef	ASM_INCLUDE
Xstruct fp_bufinfo {
X	struct pbuf **fpb_pfree;/* beginning of the free list */
X	struct pqueue *fpb_pq;	/* received buffers queue (both networks) */
X	struct pqueue *fpb_sendq;/* Ethernet transmit queue */
X	unsigned short	fpb_bsize;	/* size of a buffer including header */
X	unsigned short	fpb_pbnavail;	/* total # of pbufs initialized */
X	unsigned long	fpb_pbndrops;	/* no buffers (used to be a short) */
X	unsigned short	fpb_pbntypes[PT_NTYPES];
X			/* type specific pbuf allocations */
X};
X#endif	ASM_INCLUDE
X
X/* NOTE - SNAMESIZE used in fp_ident as well */
X#define	SNAMESIZE	21	    /* extra char for null at end */
X#define	ZNAMESIZE	33	    /* extra char for null at end */
X#define	FNAMESIZE	33	/* extra char for null at end */
X#define	OPTSIZE	32	/* number of bytes for option parameters */
X#define NAMESIGNATURE	0x48617276	/* stored in fps_signature if fps_name
X				** field has been set by FastPath Manager
X				*/
X#ifndef	ASM_INCLUDE
X
Xstruct tftp_data {
X	char		unix_path[194];
X	unsigned long	srvr_addr;
X};
X	
Xstruct afp_data {
X	char		mac_path[64];
X	char		srvr_zone[ZNAMESIZE];
X	char		srvr_name[FNAMESIZE];
X	char		usr_name[32];
X	char		usr_passwd[8];
X	char		volume[28];
X};
X
X/*
X** WARNING: this size of this structure MUST be adjusted to
X** max lap size (586).  adjust fps_spare as necessary.
X*/
Xstruct fp_state {
X	unsigned short	fps_atnet;  /* current net number for AppleTalk side */
X	unsigned short	fps_etnet;  /* current net number for Ethernet side */
X	unsigned char	fps_valid;  /* following AppleTalk node number valid */
X	unsigned char	fps_node;   /* current AppleTalk LAP node number */
X	unsigned char	fps_netw;   /* network number (not used) */
X	unsigned char	fps_bridge; /* last known bridge num on net if any */
X	unsigned char	fps_ether[6]; /* current ethernet address */
X	char	fps_name[SNAMESIZE];/* ascii name of the gateway */
X	char	fps_file[SNAMESIZE];/* ascii name of srec file last loaded */
X	unsigned char	fps_pforce; /* non-zero forces execution of prom loop */
X	unsigned char	fps_reserve;	/* even pad */
X	unsigned char	fps_unused[4];
X	char	fps_atzone[ZNAMESIZE]; /* zone name for AppleTalk side */
X	char	fps_etzone[ZNAMESIZE]; /* zone name for Ethernet side */
X	unsigned char	fps_ETvalid;  /* EtherTalk node number valid */
X	unsigned char	fps_ETnode;   /* EtherTalk LAP node number */
X	short		fps_autoconfig;		/* auto-config switch */
X	short		fps_autoboot;		/* auto-boot switch */
X	unsigned long	fps_options;		/* option flags */
X	char		fps_optparam[OPTSIZE];	/* optional parameters */
X	
X	/* box specific data */
X	
X	long	fps_sn;		/* serial number of this box */
X	long	fps_date;	/* time/date of last configuration */
X	short	fps_type;	/* 0 = AppleTalk Only, 1 = IP Subnet, 2 = KIP */
X	char	fps_config[FNAMESIZE];	/* name of config file for this box */
X	char	fps_1align;	/* pad for compiler */
X	
X	char	fps_udpzone[ZNAMESIZE];	/* UDP AppleTalk zone name */
X	char	fps_2align;	/* pad for compiler */
X	
X	/* IP & KIP parameters */
X	
X	unsigned long	fps_ipdefrouter;/* address of default IP router */
X	unsigned long	fps_ipaddress;	/* Ethernet IP address of FastPath */
X	unsigned long	fps_ATipaddress;/* AppleTalk IP address of FastPath */
X	unsigned long	fps_ipbroadcast;/* IP broadcast address */
X	unsigned long	fps_ipsubmask;	/* IP subnet mask */
X	unsigned long	fps_ipkipserver;/* IP address of administrator host */	
X	unsigned short	fps_udpnet;	/* UDP AppleTalk net number */
X	unsigned char	fps_udpnode;	/* UDP AppleTalk node number */
X	unsigned char	fps_3align;	/* padding */
X	    
X	unsigned long	fps_nameserver;	/* IP address of name server */
X	unsigned long	fps_fileserver;	/* IP address of file server */
X	long	fps_lp1;	/* local parameter #1 */
X	long	fps_lp2;	/* local parameter #2 */
X	long	fps_lp3;	/* local parameter #3 */
X	long	fps_lp4;	/* local parameter #4 */
X	short	fps_ndynamics;	/* number of dynamically assigned
X				** addresses for IP assignment on EtherTalk
X				*/
X	short	fps_nstatics;	/* number of statically assigned
X				** addresses served by this box
X				*/
X
X	/* more box specific data: */
X	long	fps_signature;	/* signature for validating gateway name */
X
X	/* decnet stuff */
X	unsigned short	fps_areanode;	/* area and node */
X	short		fps_backtimer;	/* background routing timer */
X	short		fps_hellotimer;	/* hello timer */
X
X	/* AppleTalk 2.0 stuff */
X	unsigned short	fps_rstart;	/* range start for EtherTalk 2.0 */
X	unsigned short	fps_rend;	/* range end for EtherTalk 2.0 */
X	unsigned short	fps_et2net;  	/* net number for EtherTalk 2.0 side */
X	unsigned char	fps_et2valid;	/* EtherTalk 2.0 node number valid */
X	unsigned char	fps_et2node;	/* EtherTalk 2.0 LAP node number */
X	unsigned char	*fps_zoneList;	/* ptr to zone list for EtherTalk 2.0 */
X	unsigned long	fps_configTypes;    /* reserved for FastPath Manager */
X
X	/* defines what is next */
X	unsigned short	fps_data_type;	/* defines following data */
X	unsigned short  fps_data_len;	/* includes length field but not type */
X
X	/* Atalkap stuff */
X	unsigned short	fps_atap_options;
X	unsigned short	fps_atap_retry;
X
X	union {
X		struct tftp_data	tftp;
X		struct afp_data		afp;
X	} fps_trnsprt;
X
X	unsigned char	fps_spare[46];	/* available for future use */
X	unsigned long	fps_cfgsum;	/* configuration area checksum */
X};
X
X/* defines for the types pointed to by fps_configPtr */
X#define CFG_ZONE_LIST 1
X
X/*
X** new abstats structure, corresponding to Appletalk version 49
X*/
Xstruct fp_abstats {
X	int IntCount;		/* receive interrupt count */
X	int AbortCount;		/* abort interrupt count */
X	int SpurCount;		/* spurrious interrupt count */
X	int RcvCount;		/* good data packets received */
X	int XmitCount;		/* data packets transmitted */
X	int CRCCount;		/* bad CRC (all packets) */
X	int OvrCount;		/* receive overruns (all packets) */
X	int UndCount;		/* receive underruns (all packets) */
X	int NoHandCnt;		/* No protocol handler for packet */
X	int LenErrCnt;		/* Packet length does not match header's */
X	int BadCount;		/* Bad packets seen */
X	int CollsnCount;	/* Number of assumed collisions */
X	int DeferCount;		/* Number of times deferred to other packets */
X	int NoDtaCount;		/* No packet seen after RTS in */
X	int RandomCTS;		/* Unsolicted CTS */
X};
X
X/*
X**	the max size for the following structure is 64
X*/
Xstruct fp_promram {
X	short	fpr_count;	    	/* number of valid ptrs that follow */
X	struct fp_table	**fpr_jtable;	/* jump table */
X	struct fp_bufinfo *fpr_bufs;	/* buffer manager vector */
X	struct fp_state *fpr_state;	/* Prompt program's state vector */
X	struct fp_abstats *fpr_abstats;	/* AppleTalk statistics vector */
X	struct fp_iestats *fpr_iestats;	/* Ethernet statistics vector */
X	char	*fpr_1debug;	    	/* first level debug flag */
X	char	*fpr_2debug;	    	/* second level debug flag */
X	char	*fpr_3debug;	    	/* third level debug flag */
X	struct fp_ddpstats *fpr_ddpstats;/* DDP statistics vector */
X	char	*fpr_logbuf;		/* log buffer address */
X	char 	*fpr_protstats;		/* protected scratch area address */
X	char	fpr_unused[18];    	/* remaining ptrs are not defined yet */
X};
X
X/* X_RESET */
X/* no parameters */
X
X/* X_USER0, X_USER1, X_USER2, X_USER3, X_USER4, X_USER5, X_USER6, X_USER7 */
X/* parameters (if any) defined by user */
X
X/* X_BUFGET */
Xstruct fp_bget {
X	struct pbuf *fpg_buf;	/* address of buffer returned */
X	short	fpg_type;	/* type of buffer to be "gotten" */
X};
X
X#define	K_PGET(type,buf) { \
X	struct fp_bget bg; \
X	bg.fpg_type = (type); \
X	K_BUFGET(&bg); \
X	(buf) = bg.fpg_buf; \
X}
X
X/* X_BUFFREE */
Xstruct fp_bfree {
X	struct pbuf *fpf_buf;	/* address of buffer to be freed */
X	struct pbuf *fpf_nxt;	/* the freed buffer's link before it was freed*/
X};
X
X#define	K_PFREE(buf) { \
X	struct fp_bfree bf; \
X	bf.fpf_buf = (buf); \
X	K_BUFFREE(&bf); \
X}
X
X#define	K_PFREEN(buf,nxt) { \
X	struct fp_bfree bf; \
X	bf.fpf_buf = (buf); \
X	K_BUFFREE(&bf); \
X	(nxt) = bf.fpf_nxt; \
X}
X
X/* X_BUFENQ and  X_BUFDEQ */
Xstruct fp_bqueue {
X	struct pqueue *fpq_q;	/* addr of queue to enqueue to / dequeue from */
X	struct pbuf *fpq_buf;	/* addr of buffer to be enqueued or dequeued */
X};
X
X#define	K_PENQ(level,head,buf) { \
X	struct fp_bqueue bq; \
X	short pr; \
X	bq.fpq_q = (head); \
X	bq.fpq_buf = (buf); \
X	pr = (level); \
X	K_SPL(&pr);	 \
X	K_BUFENQ(&bq); \
X	K_SPLX(&pr); \
X}
X
X#define	K_PENQNP(head,buf) { \
X	struct fp_bqueue bq; \
X	bq.fpq_q = (head); \
X	bq.fpq_buf = (buf); \
X	K_BUFENQ(&bq); \
X}
X
X#define	K_PDEQ(level,head,buf) { \
X	struct fp_bqueue bq; \
X	short pr; \
X	bq.fpq_q = (head); \
X	pr = (level); \
X	K_SPL(&pr);	 \
X	K_BUFDEQ(&bq); \
X	K_SPL(&pr); \
X	(buf) = bq.fpq_buf; \
X}
X
X#define	K_PDEQNP(head,buf) { \
X	struct fp_bqueue bq; \
X	bq.fpq_q = (head); \
X	K_BUFDEQ(&bq); \
X	(buf) = bq.fpq_buf; \
X}
X
X/* X_ERR */
X/* no parameters */
X
X/* X_IDLE */
X/* no parameters */
X
X/* X_KLAP */
X/* The parameter is the address of a pbuf structure. See pbuf.h. */
X
X/* X_WHO */
X/* no parameters */
X
X/* X_CA86 */
X/* no parameters */
X
X/* X_RES86 */
X/* no parameters */
X
X/* X_CLRINT */
X/* no parameters */
X
X/* X_RCSID */
X/* The parameter is the address of a character array which is filled
X   in with the current RCS identification string of this PROM version. */
X
X/* X_EXPROM */
X/* no parameters */
X
X/* X_INIPROM */
X/* no parameters */
X
X/* X_RES8530 */
X/* no parameters */
X
X/* X_DMTSERV */
X/* no parameters */
X
X/* X_SREC */
X/* The parameter is the address of a character array which contains
X   the S-record to be interpreted and used by the gateway */
X
X/* X_SPL */
X/* The parameter is the address of a short which becomes the next processor
X   priority level. The previous priority level is returned at same location */
X#endif	ASM_INCLUDE
X
X/* macros for various spl options */
X#define SPL0_VAL	0x2000
X#define SPLIE_VAL	0x2200
X#define SPLABUS_VAL	0x2500
X#define SPLIMP_VAL	0x2700
X
X#ifndef	ASM_INCLUDE
X#define	K_SPL0(a) { \
X	*(a) = SPL0_VAL; \
X	K_SPL(a); \
X}
X
X#define	K_SPLIE(a) { \
X	*(a) = SPLIE_VAL; \
X	K_SPL(a); \
X}
X#define	K_SPLABUS(a) { \
X	*(a) = SPLABUS_VAL; \
X	K_SPL(a); \
X}
X
X#define	K_SPLIMP(a) { \
X	*(a) = SPLIMP_VAL; \
X	K_SPL(a); \
X}
X
X#define	K_SPLX(a) { \
X	K_SPL(a); \
X}
X
X/* X_LED */
Xstruct fp_led {
X	char	fpl_leds;		/* bit field: each bit is an led */
X	char	fpl_state;		/* LED_ON, LED_OFF, LED_TOGGLE */
X};
X#endif	ASM_INCLUDE
X
X/* constants for fpl_onoff */
X#define	LED_OFF		0
X#define	LED_ON		1
X#define	LED_TOGGLE	2		/* if on, off. if off, on */
X
X#ifndef	ASM_INCLUDE
X/* macros for led calls */
X#define	K_LEDON() { \
X	struct fp_led fpl; \
X	fpl.fpl_leds = 0; /* currently not used (only one led) */ \
X	fpl.fpl_state = LED_ON; \
X	K_LED(&fpl); \
X}
X
X#define	K_LEDOFF() { \
X	struct fp_led fpl; \
X	fpl.fpl_leds = 0; /* currently not used (only one led) */ \
X	fpl.fpl_state = LED_OFF; \
X	K_LED(&fpl); \
X}
X
X#define	K_LEDTOGGLE() { \
X	struct fp_led fpl; \
X	fpl.fpl_leds = 0; /* currently not used (only one led) */ \
X	fpl.fpl_state = LED_TOGGLE; \
X	K_LED(&fpl); \
X}
X
X/* X_RAND */
X/* The parameter is the address of a long integer which has a new random
X   number in it when the call returns. */
X
X/* X_SENDF */
X/* The parameter is the address of a stack location which contains a format
X   string address and followed by the variable number of arguments which are
X   required by that format string */
X
X/* X_DMSG */
X/* The parameter is a pointer to a 586 byte area in which to copy the
X   messages. */
X
X/* X_MEMSEG, X_MALLOC, X_FREE */
Xstruct fp_malloc {
X	union {
X		long	fpo_size;	 /* bytes, for memseg and malloc */
X		unsigned char *fpo_area; /* ptr to area, for free */
X	} fpo_parm;
X};
X
X#define	MEMSEG(cast_type,kcp,kss) { \
X	struct fp_malloc xyz0; \
X	xyz0.fpo_parm.fpo_size = (kss); \
X	K_MEMSEG(&xyz0); \
X	(kcp) = (cast_type)xyz0.fpo_parm.fpo_area; \
X}
X
X#define	MALLOC(cast_type,kcp,kss) { \
X	struct fp_malloc xyz0; \
X	xyz0.fpo_parm.fpo_size = (kss); \
X	K_MALLOC(&xyz0); \
X	(kcp) = (cast_type)xyz0.fpo_parm.fpo_area; \
X}
X
X#define	FREE(kcp) { \
X	struct fp_malloc xyz0; \
X	xyz0.fpo_parm.fpo_area = (unsigned char *)(kcp); \
X	K_FREE(&xyz0); \
X}
X#endif	ASM_INCLUDE
X
X/*
X** 	X_IE_INIT
X**
X**	ethernet initialization options:
X*/
X#define	STANDARD	0x0000		/* standard config */
X#define	NO_CRS		0x0008		/* transmit even if no carrier */
X#define	PROMISCUOUS	0x0001		/* promiscuous mode */
X
X#ifndef	ASM_INCLUDE
Xstruct	fp_ieinit {
X	unsigned short fpie_options;	/* one of:
X					** {STANDARD, NO_CRS, PROMISCUOUS} */
X	unsigned char *fpie_etheraddr;	/* ethernet address */
X	struct pqueue *fpie_recq;	/* recevie queue to use */
X	int	fpie_nbufs;		/* number of buffers to use */
X};
X
X#define	IE_INIT(O,E,Q,N)	{ \
X	struct	fp_ieinit arg; \
X	arg.fpie_options = (O);	/* options */ \
X	arg.fpie_etheraddr = (E);	/* ethernet address */ \
X	arg.fpie_recq = (Q);		/* receive queue to use */ \
X	arg.fpie_nbufs = (N);		/* number of buffers to use */ \
X	K_IE_INIT(&arg); \
X}
X
X/* X_IEXSTART */
X	/* takes pbuf as parameter */
X
X/* X_KLAP2 - version 2.0 of KLAP allows KLAP on ethernet: */
Xstruct	fp_klap {
X	struct pbuf **kl_pbuf;	/* pkt handle - contents set to 0 if freed */
X	struct ifnet *kl_ifp;	/* interface received on */
X};
X
X#define	KLAP2(P,IFP)	{ \
X	struct	fp_klap arg; \
X	arg.kl_pbuf = (P);	/* packet handle (struct **pbuf) */ \
X	arg.kl_ifp = (IFP);	/* interface received on */ \
X	K_KLAP2(&arg); \
X}
X#endif	ASM_INCLUDE
X
X/* X_PROM1_CHECK */
X	/* takes pointer to int as parameter - sets to 1 if PROM1 socket
X	** populated, otherwise 0.
X	*/
X#define	MAGIC_PROM1 0x4b465053  	/* this must be first long in PROM1
X					** for PROM0 to execute it
X					*/
X
X#ifndef	ASM_INCLUDE
X/* X_PROM1_EXECUTE -	no parameters */
X
X/* X_ARPINIT */
Xstruct fp_arp_init {
X	int options;
X	struct Addr *address;
X};
X#endif	ASM_INCLUDE
X	/* the "options" parameter consists of one or more of the
X	** following options or'ed together:
X	*/
X#define	ARPOPT_IP_OFF		0x0000
X#define	ARPOPT_IP_ON		0x0001
X#define ARPOPT_FAKEIP_ON	0x0002
X
X#ifndef	ASM_INCLUDE
X#define ARPINIT(OPT, ADDR) { \
X	struct fp_arp_init arg; \
X	arg.options = (OPT); \
X	arg.address = (struct Addr *) (ADDR); \
X	K_ARPINIT(&arg); \
X}
X
X/* X_ARPINPUT */
Xstruct	fp_arpin {
X	struct pbuf **arp_pbuf;	/* pkt handle - contents set to 0 if freed */
X	struct ifnet *arp_ifp;	/* hardware interface received on */
X	unsigned short arp_afin;	/* protocol interface received on */
X};
X
X#define	ARPINPUT(P,IFP,AFIN) { \
X	struct	fp_arpin arg; \
X	arg.arp_pbuf = (P); \
X	arg.arp_ifp = (IFP); \
X	arg.arp_afin = (AFIN); \
X	K_ARPINPUT(&arg); \
X}
X
X/* X_ARPRESOLVE */
Xstruct	fp_arpresolve {
X	struct pbuf **arpr_pbuf;/* pkt handle - contents set to 0 if freed */
X	struct ifnet *arpr_ifp;	/* hardware interface received on */
X	unsigned long *arpr_pdst;	/* protocol destination (value) */
X	unsigned char *arpr_hdst;	/* hardware destination (result) */
X	short *isresolved;	/* contents set to 1 if resolved */
X};
X
X#define	ARPRESOLVE(P,IFP,PDST,HDST,ISRESOLVED) { \
X	struct	fp_arpresolve arg; \
X	arg.arpr_pbuf = (P); \
X	arg.arpr_ifp = (IFP); \
X	arg.arpr_pdst = (PDST); \
X	arg.arpr_hdst = (HDST); \
X	arg.isresolved = (ISRESOLVED); \
X	K_ARPRESOLVE(&arg); \
X}
X
X/* X_ISIPAARP */
Xstruct	fp_isipaarp {
X	struct pbuf *pkt;	/* input ARP for IP resolution */
X	short *isaarp;	/* contents set to 1 if an AARP masquerading
X			** as IP ARP, o'wise set to 0
X			*/
X};
X
X#define	ISIPAARP(P,ANS) { \
X	struct	fp_isipaarp arg; \
X	arg.pkt = (P);		/* VALUE parameter */ \
X	arg.isaarp = (ANS);	/* RESULT parameter */ \
X	K_ISIPAARP(&arg); \
X}
X
X/* X_ARPDUMP */
X	/* no parameters */
X
X/* X_ETINIT */
X	/* parameter is pointer to if_net structure of EtherTalk interface.
X	** if_dnode is a VALUE-RESULT, initial value is taken as a hint
X	** for node-finding.  if_addr[3] is a RESULT - this is the
X	** EtherTalk node number saved as an IP address, used in
X	** earlier implementations, and retained for backwards compatibility.
X	*/
X#endif	ASM_INCLUDE
X
X/* X_TIMING */
X#define	MC68008	1
X#define	MC68000	2
X
X#ifndef	ASM_INCLUDE
Xstruct fp_timing {
X	int processor;		/* processor type */
X	int hertz;		/* processor clock speed in hertz */
X};
X
X/* X_ROUTEDDPINIT */
Xstruct fp_routeddpinit {
X	struct ifnet *ifab;		/* AppleTalk interface structure */
X	struct ifnet *ifie;		/* Ethernet interface structure */
X	struct ifnet *ifabip;		/* AppleTalk IP interface structure */
X	int *iscombgw;			/* is combined gateway? */
X	struct pqueue *pq;		/* incoming packet queue */
X};
X
X#define ROUTEDDPINIT(IFAB, IFIE, IFABIP, ISCOMBGW, PQ) { \
X	struct fp_routeddpinit arg; \
X	arg.ifab = (IFAB); \
X	arg.ifie = (IFIE); \
X	arg.ifabip = (IFABIP); \
X	arg.iscombgw = (ISCOMBGW); \
X	arg.pq = (PQ); \
X	K_ROUTEDDPINIT(&arg); \
X}
X
X/* X_ROUTEDDP */
Xstruct fp_routeddp {
X	struct pbuf **p;	/* LAP data of packet to route */
X	unsigned char lapdest;		/* short ddp params from lap */
X	unsigned char lapsrc;
X	unsigned char laptype;
X	struct ifnet *fromifp;	/* interface packet came from */
X};
X
X#define ROUTEDDP(PKT, DST, SRC, TYPE, IFP) { \
X	struct fp_routeddp arg; \
X	arg.p = (PKT); \
X	arg.lapdest = (DST); \
X	arg.lapsrc = (SRC); \
X	arg.laptype = (TYPE); \
X	arg.fromifp = (IFP); \
X	K_ROUTEDDP(&arg); \
X}
X
X/* X_NBPINPUT */
X/* X_RTMPINPUT */
X/* X_RTMPRESPONSE */
X/* X_ZIPINPUT */
X/* X_ATPINPUT */
X/* X_ECHOINPUT */
Xstruct fp_input {
X	struct pbuf **p;	/* pointer to the incoming packet */
X	struct gen_ddp *ddp_info;	/* generic ddp */
X	struct ifnet *ifp;	/* interface packet came from */
X};
X
X/* X_NBPINIT */
X/* no parameters */
X
X#define NBPINPUT(PKT, DDP, IFP) { \
X	struct fp_input arg; \
X	arg.p = (PKT); \
X	arg.ddp_info = (DDP); \
X	arg.ifp = (IFP); \
X	K_NBPINPUT(&arg); \
X}
X
X/* X_RTMPINIT */
Xstruct fp_rtmpinit {
X	short autoconf_on;		/* is autoconfig turned on? */
X	int delay;			/* autoconfig delay */
X	struct ifnet *ifnet,		/* linked list of interface structs */
X		*ifab, 			/* AppleTalk interface */
X		*ifie;			/* Ethernet interface */
X};
X
X#define RTMPINIT(AUTOCONF_ON, DELAY, IFNET, IFAB, IFIE) { \
X	struct fp_rtmpinit arg; \
X	arg.autoconf_on = (AUTOCONF_ON); \
X	arg.delay = (DELAY); \
X	arg.ifnet = (IFNET); \
X	arg.ifab = (IFAB); \
X	arg.ifie = (IFIE); \
X	K_RTMPINIT(&arg); \
X}
X
X#define RTMPINPUT(PKT, DDP, IFP) { \
X	struct fp_input arg; \
X	arg.p = (PKT); \
X	arg.ddp_info = (DDP); \
X	arg.ifp = (IFP); \
X	K_RTMPINPUT(&arg); \
X}
X
X#define RTMPRESPONSE(PKT, DDP, IFP) { \
X	struct fp_input arg; \
X	arg.p = (PKT); \
X	arg.ddp_info = (DDP); \
X	arg.ifp = (IFP); \
X	K_RTMPRESPONSE(&arg); \
X}
X
X/* X_RTMPTIMER */
X/* no parameters */
X
X/* X_ZIPINIT */
Xstruct fp_zipinit {
X	int atzconf,			/* AppleTalk zone configured? */
X		etzconf;		/* Ethernet zone configured? */
X	struct ifnet *ifab,		/* AppleTalk interface struct */
X		*ifie;			/* Ethernet interface struct */
X};
X
X#define ZIPINIT(ATZCONF, ETZCONF, IFAB, IFIE) { \
X	struct fp_zipinit arg; \
X	arg.atzconf = (ATZCONF); \
X	arg.etzconf = (ETZCONF); \
X	arg.ifab = (IFAB); \
X	arg.ifie = (IFIE); \
X	K_ZIPINIT(&arg); \
X}
X
X#define ZIPINPUT(PKT, DDP, IFP) { \
X	struct fp_input arg; \
X	arg.p = (PKT); \
X	arg.ddp_info = (DDP); \
X	arg.ifp = (IFP); \
X	K_ZIPINPUT(&arg); \
X}
X
X/* X_ZIPTIMER */
X/* no parameters */
X
X/* X_ATPINIT */
X/* no parameters */
X
X#define ATPINPUT(PKT, DDP, IFP) { \
X	struct fp_input arg; \
X	arg.p = (PKT); \
X	arg.ddp_info = (DDP); \
X	arg.ifp = (IFP); \
X	K_ATPINPUT(&arg); \
X}
X
X/* X_ECHOINIT */
Xstruct fp_echoinit {
X	struct ifnet *ifie;		/* Ethernet interface struct */
X};
X
X#define ECHOINIT(IFIE) { \
X	struct fp_echoinit arg; \
X	arg.ifie = (IFIE); \
X	K_ECHOINIT(&arg); \
X}
X
X#define ECHOINPUT(PKT, DDP, IFP) { \
X	struct fp_input arg; \
X	arg.p = (PKT); \
X	arg.ddp_info = (DDP); \
X	arg.ifp = (IFP); \
X	K_ECHOINPUT(&arg); \
X}
X
X/* X_DDPIPINIT */
Xstruct fp_ddpIPinit {
X	struct fp_promram *pvars;		/* pointer to prom vars */
X	struct Addr *macipbcast;		/* special bcast address */
X	unsigned char *etheraddr;		/* our ethernet address */
X	unsigned long *gwoptions;		/* gateway options */
X	unsigned short atnet;			/* AppleTalk net number */
X	struct ifnet *ifabip,		/* AppleTalk IP interface struct */
X		*ifieip;		/* Ethernet IP interface struct */
X	int *iscombgw;		/* is this a combined gateway? */
X};
X
X#define DDPIPINIT(PVARS, MACIPBCAST, ETHERADDR, GWOPTIONS, ATNET, IFABIP, IFIEIP, ISCOMBGW) { \
X	struct fp_ddpIPinit arg; \
X	arg.pvars = (PVARS); \
X	arg.macipbcast = (MACIPBCAST); \
X	arg.etheraddr = (ETHERADDR); \
X	arg.gwoptions = (GWOPTIONS); \
X	arg.atnet = (ATNET); \
X	arg.ifabip = (IFABIP); \
X	arg.ifieip = (IFIEIP); \
X	arg.iscombgw = (ISCOMBGW); \
X	K_DDPIPINIT(&arg); \
X}
X
X/* X_AUTOCINIT */
Xstruct fp_autocinit {
X	int *delay;			/* rtmp intervals before autoconf */
X	unsigned char *etheraddr;		/* our ethernet address */
X	struct ifnet *ifab;		/* AppleTalk interface */
X	struct ifnet *ifie;		/* Ethernet interface */
X};
X
X#define AUTOCINIT(DELAY, ETHERADDR, IFAB, IFIE) { \
X	struct fp_autocinit arg; \
X	arg.delay = (DELAY); \
X	arg.etheraddr = (ETHERADDR); \
X	arg.ifab = (IFAB); \
X	arg.ifie = (IFIE); \
X	K_AUTOCINIT(&arg); \
X}
X
X/* X_HASHINIT */
X/* no parameters */
X
X/* X_NEWHASHTAB */
Xstruct fp_newtab {
X	int (*key_func)();		/* pointer to hash function */
X	int (*match_func)();	/* pointer to key equality function */
X	unsigned short size;		/* number of buckets to allocate */
X	struct hashtab **table;	/* the new table */
X};
X
X#define NEWHASHTABLE(KEY, MATCH, SIZE, TAB) { \
X	struct fp_newtab arg; \
X	arg.key_func = (KEY); \
X	arg.match_func = (MATCH); \
X	arg.size = (SIZE); \
X	arg.table = (TAB); \
X	K_NEWHASHTABLE(&arg); \
X}
X
X/* X_LOOKUP */
Xstruct fp_lkuphash {
X	unsigned char *key;		/* the key to hash */
X	struct entry **prev;	/* return entry before sought entry */
X	struct hashtab *tab;	/* the table to search in */
X	struct entry **entry;	/* the sought entry */
X};
X
X#define LOOKUP(KEY, PREV, TAB, ENTRY) { \
X	struct fp_lkuphash arg; \
X	arg.key = (unsigned char *)(KEY); \
X	arg.prev = (struct entry **)(PREV); \
X	arg.tab = (TAB); \
X	arg.entry = (struct entry **)(ENTRY); \
X	K_LOOKUP(&arg); \
X}
X
X/* X_ADD */
Xstruct fp_addhash {
X	unsigned char *key;		/* the key of the entry to add */
X	struct entry *entry;	/* the entry to add */
X	struct hashtab *tab;	/* the table to add to */
X};
X
X#define ADD(KEY, ENTRY, TAB) { \
X	struct fp_addhash arg; \
X	arg.key = (unsigned char *)(KEY); \
X	arg.entry = (struct entry *)(ENTRY); \
X	arg.tab = (TAB); \
X	K_ADD(&arg); \
X}
X
X/* X_REMOVE */
Xstruct fp_delhash {
X	unsigned char *key;		/* the key of the entry to delete */
X	struct hashtab *tab;	/* the table to delete from */
X};
X
X#define REMOVE(KEY, TAB) { \
X	struct fp_delhash arg; \
X	arg.key = (unsigned char *)(KEY); \
X	arg.tab = (TAB); \
X	K_REMOVE(&arg); \
X}
X
X/* X_FIRST */
Xstruct fp_firsthash {
X	struct hashtab *tab;	/* table to search in */
X	struct entry **entry;	/* first entry in table */
X};
X
X#define FIRST(TAB, ENTRY) { \
X	struct fp_firsthash arg; \
X	arg.tab = (TAB); \
X	arg.entry = (struct entry **)(ENTRY); \
X	K_FIRST(&arg); \
X}
X
X/* X_NEXT */
Xstruct fp_nexthash {
X	unsigned char *key;		/* key of current entry */
X	struct entry *entry;	/* the current entry */
X	struct hashtab *tab;	/* the table to search in */
X	struct entry **nextentry;    /* the next entry in the table */
X};
X
X#define NEXT(KEY, ENTRY, TAB, NEXT) { \
X	struct fp_nexthash arg; \
X	arg.key = (unsigned char *)(KEY); \
X	arg.entry = (struct entry *)(ENTRY); \
X	arg.tab = (TAB); \
X	arg.nextentry = (struct entry **)(NEXT); \
X	K_NEXT(&arg); \
X}
X
X/* X_NETLOOKUP */
Xstruct fp_netlookup {
X	unsigned short net;		/* net number */
X	struct rtmptab **lastentry;	/* RESULT parameter */
X	struct rtmptab **the_net;	/* return value */
X};
X
X#define NETLOOKUP(NET, LASTENTRY, THE_NET) { \
X	struct fp_netlookup arg; \
X	arg.net = (NET); \
X	arg.lastentry = (LASTENTRY); \
X	arg.the_net = (THE_NET); \
X	K_NETLOOKUP(&arg); \
X}
X
X/* X_RMRTMP */
Xstruct fp_rmrtmp {
X	struct rtmptab *tp;		/* the entry to remove */
X};
X
X#define RMRTMP(TP) { \
X	struct fp_rmrtmp arg; \
X	arg.tp = (TP); \
X	K_RMRTMP(&arg); \
X}
X
X/* X_RTMPREPLACE */
Xstruct fp_rtmpreplace {
X	struct rtmptab *tp;		/* entry to replace */
X	int hops;			/* number of hops */
X	struct ifnet *ifp;		/* interface for entry */
X	unsigned char nodenum;		/* next IR for entry */
X	unsigned short net;			/* net number */
X	struct rtmptab **new_entry;	/* new entry */
X};
X
X#define RTMPREPLACE(TP, HOPS, IFP, NODENUM, NET, NEW_ENTRY) { \
X	struct fp_rtmpreplace arg; \
X	arg.tp = (TP); \
X	arg.hops = (HOPS); \
X	arg.ifp = (IFP); \
X	arg.nodenum = (NODENUM); \
X	arg.net = (NET); \
X	arg.new_entry = (NEW_ENTRY); \
X	K_RTMPREPLACE(&arg); \
X}
X
X/* X_ADDNET */
Xstruct fp_addNet {
X	unsigned char *zname;  	/* a Pascal string referring to the zone */
X	struct rtmptab *net;	/* the net to add to the list */
X};
X
X#define ADDNET(ZNAME, NET) { \
X	struct fp_addNet arg; \
X	arg.zname = (unsigned char *)(ZNAME); \
X	arg.net = (NET); \
X	K_ADDNET(&arg); \
X}
X
X/* X_RMNET */
Xstruct fp_rmNet {
X	struct zitEntry *zone;		/* the zone to remove from */
X	struct rtmptab *net;		/* the net to be removed */
X	struct rtmptab *prev; 		/* net before the net to be removed */
X};
X
X#define RMNET(ZONE, NET, PREV) { \
X	struct fp_rmNet arg; \
X	arg.zone = (ZONE); \
X	arg.net = (NET); \
X	arg.prev = (PREV); \
X	K_RMNET(&arg); \
X}
X
X/* X_FINDZONE */
Xstruct fp_findzone {
X	unsigned char *zone;
X	struct zitEntry **foundzone;
X};
X
X#define FINDZONE(ZONE, FOUNDZONE) { \
X	struct fp_findzone arg; \
X	arg.zone = (unsigned char *)(ZONE); \
X	arg.foundzone = (FOUNDZONE); \
X	K_FINDZONE(&arg); \
X}
X
X/* X_AUTOCONF */
X/* the parameter is a pointer to the interface structure
X** of the interface to be configured.
X*/
X
X
X/* X_RESET_AUTOCONF */
Xstruct fp_resetautoc {
X	struct ifnet *ifp;	/* pointer to interface to reset */
X	int *delay;		/* delay before autoconfiguring */
X};
X
X#define RESET_AUTOCONF(IFP, DELAY) { \
X	struct fp_resetautoc arg; \
X	arg.ifp = (IFP); \
X	arg.delay = (DELAY); \
X	K_RESET_AUTOCONF(&arg); \
X}
X
X/* X_DDPREPLY */
Xstruct fp_ddpreply {
X	struct pbuf **pkt;		/* the packet to send */
X	struct gen_ddp *gddp;    	/* generic ddp header for packet */
X	struct ifnet *ifp;		/* interface packet came from */
X};
X
X#define DDPREPLY(PKT, GDDP, IFP) { \
X	struct fp_ddpreply arg; \
X	arg.pkt = (PKT); \
X	arg.gddp = (GDDP); \
X	arg.ifp = (IFP); \
X	K_DDPREPLY(&arg); \
X}
X
X/* X_ROUTEIP */
Xstruct fp_routeip {
X	struct pbuf **pkt;		/* value result param */
X	struct ifnet *ifp;		/* source interface */
X	int isbcast;			/* is packet a broadcast? */
X};
X
X#define ROUTEIP(PKT, IFP, ISBCAST) { \
X	struct fp_routeip arg; \
X	arg.pkt = (PKT); \
X	arg.ifp = (IFP); \
X	arg.isbcast = (ISBCAST); \
X	K_ROUTEIP(&arg); \
X}
X
X/* X_ISSAMEZONE */
Xstruct fp_issamezone {
X 	struct zitEntry *zone;		/* zone to compare with */
X	unsigned char *zname;			/* a Pascal string */
X	unsigned short *same;		/* are the zones the same? */
X};
X
X#define ISSAMEZONE(ZONE, ZNAME, SAME) { \
X	struct fp_issamezone arg; \
X	arg.zone = (ZONE); \
X	arg.zname = (unsigned char *)(ZNAME); \
X	arg.same = (SAME); \
X	K_ISSAMEZONE(&arg); \
X}
X#endif	ASM_INCLUDE
X
X/* X_CHECKSUM */
X
X#define BYTESUM	1
X#define WORDSUM	2
X#define LONGSUM	3
X
X#ifndef	ASM_INCLUDE
Xstruct fp_checksum {
X	unsigned char *cs_loaddr;	/* address of first byte */
X	unsigned char *cs_hiaddr;	/* address of last byte */
X	short cs_size;	/* one of: {BYTESUM, WORDSUM, LONGSUM} */
X	unsigned long *cs_answptr;	/* pointer to storage for result */
X};
X
X#define	CHECKSUM(LO,HI,OPT,RESULTPTR) {\
X	struct fp_checksum arg;\
X	arg.cs_loaddr = (LO);\
X	arg.cs_hiaddr = (HI);\
X	arg.cs_size = (OPT);\
X	arg.cs_answptr = (RESULTPTR);\
X	K_CHECKSUM(&arg);\
X}
X#endif	ASM_INCLUDE
X
X/* X_WHERE2 */
X
X#define	FPMODEL123	1
X#define	FPMODEL4	2
X#define	WHERE2UNUSED	24
X
X#ifndef	ASM_INCLUDE
Xstruct fp_where2 {
X	short	fpw2_model;	/* model: one of {FPMODEL123, FPMODEL4}  */
X	/* following is zero for FPMODEL123: */
X	unsigned char	*fpw2_enetprom;	/* ethernet address ROM on KFPS-4 */
X	unsigned char	*fpw2_exrambot;	/* expansion ram first word */
X	unsigned char	*fpw2_exramtop;	/* expansion ram last word */
X	unsigned char	fpw2_spare[WHERE2UNUSED];	/* for future use */
X};
X
X/* X_GETCFGSUM	- takes pointer to unsigned long, computes checksum
X		of configuration area and returns result */
X
X/* X_SETCFGSUM	- recomputes and resets configuration area checksum.
X		- no parameters */
X
X/* X_DMSG	- argument is *char, copies contents of message log into
X		string, which must be large enough (586 bytes) */
X
X/* X_STATE	- argument is pointer to int, returns state of PROM,
X		defined to be one of the following: */
X#endif	ASM_INCLUDE
X
X#define	BOOTME			1
X#define	DOWNLOAD_VALID		2
X#define	FORCE_PROM_EXECUTION	3
X#define	PROM1_VALID		4
X#define	BE_A_BRIDGE		5
X#define	EXECUTING_BRIDGE	6
X#define	EXECUTING_DOWNLOAD	7
X#define	EXECUTING_PROM1		8
X
X/* upper and lower bounds state var can take: */
X#define	LBSTATE		1
X#define	UBSTATE		8
X
X/* X_HWSTATE -	takes pointer to unsigned long returns
X		hardware status returned by selftests,
X		formed by logically or'ing members from
X		the following set: */
X
X#define	SCC_BAD			0x01
X#define	I82586_BAD		0x02
X#define	BATTERY_LOW		0x04
X#define	EXP_RAM_INSTALLED	0x08
X#define	FUSE_BLOWN		0x10
X#define	RAMTEST_FAILED		0x20
X
X/* X_SENDFINIT -no parameters */
X
X/* X_IESTATS */
X
X/* array positions of various ethernet stats.
X** Note:  scb errors counts are updated only by K_IESTAT call.
X*/
X#define	SCB_CRCERRS	0
X#define	SCB_ALNERRS	1
X#define	SCB_RSCERRS	2
X#define	SCB_OVRNERRS	3
X#define	IN_PACKETS	4
X#define	OUT_PACKETS	5
X#define	BAD_TRANSMIT	6
X#define	OVERSIZE_FRAME	7
X#define	SPUR_RU_READY	8
X#define	SPUR_CU_ACTIVE	9
X#define	SPUR_UNKNOWN	10
X#define	BCAST_DROPS	11
X#define	RCV_RESTARTS	12
X#define	REINTERRUPTS	13
X#define	ENET_BUF_REROUTE	14
X#define	ENET_PBNDROP	15
X#define	XMIT_COLLISIONS	16
X#define	XMIT_DEFERS	17
X#define	XMIT_DMA_URUN	18
X#define	XMIT_MAX_COLL	19
X#define	XMIT_NO_CARRIER	20
X#define	XMIT_NO_CTS	21
X#define	XMIT_NO_SQE	22
X
X#define	MAXIESTATS 25
X#define	SIZEOFIESTATS ((MAXIESTATS*4)+4)
X
X#ifndef	ASM_INCLUDE
Xstruct fp_iestats {
X	struct scb *fpi_scbptr;		/* status control block */
X	int	fpi_stats[MAXIESTATS];	/* statistics array */
X};
X#endif	ASM_INCLUDE
X
X/* X_DDPSTATS */
X
X#define	BADATPSKT	0
X#define	BADECHO_REQ	1
X#define	BADHOPCNT	2
X#define	BADKLAPREQ	3
X#define	BADKLAPSKT	4
X#define	BADRTMPREQ_SKT	5
X#define	BADRTMP_SKT	6
X#define	BADZIPSKT	7
X#define	BAD_DDPTYPE	8
X#define	BAD_DESTNET	9
X#define	COPY_BCAST	10
X#define	ECHOLONG_DROP	11
X#define	ECHOSHORT_DROP	12
X#define	LAPBCAST_DROP	13
X#define	NBPLOOKUP_DROP	14
X#define	NOBUF_CPBCAST	15
X#define	RTMPREQ_DROP	16
X#define	SHORTDDP_DROP	17
X#define	TOOLONG_DDP	18
X#define	TOOSHORT_DDP	19
X
X#define	MAXDDPSTATS 30
X#define	SIZEOFDDPSTATS (MAXDDPSTATS*4)
X
X#ifndef	ASM_INCLUDE
Xstruct fp_ddpstats {
X	int	fpddp_stats[MAXDDPSTATS];	/* statistics array */
X};
X#endif	ASM_INCLUDE
X
X/* X_AATWRITE */
X	/* takes pbuf as parameter */
X
X/* X_ALLBUFS */
X	/* takes the address of the end of the download area, where
X	** packet buffers can start.
X	*/
X
X/* X_MAKEBUFS */
X	/* takes an array of unsigned longs, representing pairs
X	** of the form (lo,hi), terminated by (0,0).
X	*/
X
X/* NPROTSTATS*4 is the number of bytes in the protected scratch area */
X#define	NPROTSTATS	64
X
X/* X_CLRPROTSTATS */
X	/* no arguments.  Clears (NPROTSTATS*4) bytes of protected area
X	** in RAM which can be used as a general debugging aid.
X	*/
X
X/* X_GETPROTSTATS */
X	/* no arguments.  Returns (NPROTSTATS*4) bytes from a protected
X	** area in RAM which can be used as a general debugging aid.
X	*/
X
X/* X_SIZEMEM */
X	/* takes a pointer to an int as an arg, returns number of bytes
X	** of memory installed.
X	*/
X
X/* X_SETACKLEN */
X	/* argument is an int value.  Sets the length of the KLAP
X	** portion of a packet returned by a user-implemented KLAP call.
X	*/
X
X/* X_IDENT */
X#ifndef	ASM_INCLUDE
Xstruct fp_ident {
X	char	fpid_name[SNAMESIZE];	/* ascii name of the gateway */
X	char	fpid_pad;		/* padding, SNAMESIZE is odd */
X	unsigned char fpid_ether[6];	/* ethernet address of gw */
X	long	fpid_sn;		/* serial number of this box */
X	short	fpid_model;		/* model number */
X	short	fpid_version;		/* version of the prom code */
X	int	fpid_state;		/* operating state */
X};
X#endif	ASM_INCLUDE
X
X/* X_SETMCAST */
X
X/* maximum multicast addresses we can set up: */
X#define	MAX_MCAST	16
X
X#ifndef	ASM_INCLUDE
Xstruct fp_mcast {
X	unsigned short	fpmc_naddrs;	/* number of multicast addresses, 0
X					** to turn off multicasting */
X	unsigned char	fpmc_addrs[MAX_MCAST*6];
X			/* packed array of enet addresses */
X};
X#endif	ASM_INCLUDE
X
X/* X_CHECKFREE */
X	/* no parameters.  Checks the consistency of the buffer
X	** structures.  If error found, dumps diagnostics and
X	** reboots system.
X	*/
X
X/* X_CLRLOG */
X	/* no parameters.  Clears the log buffer. */
X
X/* X_PAUSE */
X	/* takes a pointer to a short as a parameter.  Returns 1 if
X	** the gateway was paused, and 0 if it was not.
X	** NOTE: the gateway cannot be paused if it is not executing
X	** 	the prom main loop.
X	*/
X
X/* X_NOTIMP -		no parameters */
END_OF_FILE
if test 44942 -ne `wc -c <'cmdmacro.h'`; then
    echo shar: \"'cmdmacro.h'\" unpacked with wrong size!
fi
# end of 'cmdmacro.h'
fi
echo shar: End of archive 3 \(of 3\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 3 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0