xref: /csrg-svn/sys/vax/datakit/dkkmc.h (revision 38624)
1*38624Skarels /*
2*38624Skarels  *	kmc and cpu interface
3*38624Skarels  *		@(#)dkkmc.h	1.2 Garage 84/03/27
4*38624Skarels  */
5*38624Skarels 
6*38624Skarels /*
7*38624Skarels  *  structure for each datakit channel
8*38624Skarels  */
9*38624Skarels struct dkchan {
10*38624Skarels 	short dk_state ;
11*38624Skarels 	struct ifqueue dk_outq;		/* Output queue */
12*38624Skarels 	struct mpacket *dk_obuf ;	/* Active mbuf output chain */
13*38624Skarels 	struct mbuf *dk_pending;	/* Rest of current mbuf chain */
14*38624Skarels 
15*38624Skarels 	struct	ifuba	dk_uba;
16*38624Skarels 
17*38624Skarels 	int	(*dk_endfcn)() ;
18*38624Skarels 	caddr_t	dk_endparm ;
19*38624Skarels 	int	(*dk_supfcn)() ;
20*38624Skarels 	unsigned dk_rlen;	/* length of receive buffer */
21*38624Skarels 	int dk_ubmbase;	/* ubm base register used for this receive transaction */
22*38624Skarels 			/* only one receive pending at a time on a channel */
23*38624Skarels };
24*38624Skarels 
25*38624Skarels /*
26*38624Skarels  * structure for command to kmc from cpu and
27*38624Skarels  * report to cpu from kmc
28*38624Skarels  */
29*38624Skarels struct dkkin	{
30*38624Skarels 	short	k_type ;		/* cmd type or report type */
31*38624Skarels 	short	k_chan ;		/* chan number */
32*38624Skarels 	short	k_len ;			/* # of char */
33*38624Skarels 	char	k_ctl ;			/* cntl/time */
34*38624Skarels 	char	k_mode ;		/* rcv mode */
35*38624Skarels 	long	k_addr ;		/* address */
36*38624Skarels } ;
37*38624Skarels 
38*38624Skarels /*
39*38624Skarels  * command type
40*38624Skarels  */
41*38624Skarels #define	KC_INIT		0x01	/* init: 0,0,0,0 */
42*38624Skarels #define	KC_SEND		0x02	/* send: len, 0, 0, addr */
43*38624Skarels #define	KC_RCVB		0x03	/* rcv: len, time, mode, addr */
44*38624Skarels #define	KC_CLOSE	0x04	/* close: 0, 0, 0, 0 */
45*38624Skarels #define	KC_XINIT	0x05	/* re-init xmitter: 0, 0, 0, 0 */
46*38624Skarels #define	KC_CMD		0x06	/* cmd to kmc: cmd, 0, 0, 0 */
47*38624Skarels #define	KC_FLAG		0x07	/* i/oflag: iflag, oflaghi, oflaglo, 0 */
48*38624Skarels #define	KC_SOI		0x08	/* send express: (byte2<<8)|byte1, 0, 0, 0 */
49*38624Skarels #define	KC_SCTL		0x09	/* send cntl: ctl, 0, 0, 0 */
50*38624Skarels 
51*38624Skarels /*
52*38624Skarels  * report type
53*38624Skarels  */
54*38624Skarels #define	KS_SEND		0x0014	/* send: 0, 0, 0, 0 */
55*38624Skarels #define	KS_RDB		0x0015	/* rcv: residue len, cntl, mode, 0 */
56*38624Skarels #define	KS_EOI		0x0016	/* rcv express: (byte2<<8)|byte1, 0, 0, 0 */
57*38624Skarels #define	KS_CNTL		0x0017	/* rcv tdk cntl: cntl, 0, 0, 0 */
58*38624Skarels #define	KS_ERR		0x0018	/* error: code, 0, 0, 0 */
59*38624Skarels 
60*38624Skarels /*
61*38624Skarels  * The circular buffer, cmdbuf, is used to pass command to kmc:
62*38624Skarels  * while the circular buffer statbuf is used to report status.
63*38624Skarels  * There are 8 control and status registers (csr) accessible to
64*38624Skarels  * both cpu and kmc.
65*38624Skarels  * Csr4-csr5 are iused to indicate the head and tail respectively
66*38624Skarels  * of the cmdbuf.  Likewise, csr6-csr7 for statbuf.
67*38624Skarels  * At initialization time, the cpu and kmc would agree on the beginning
68*38624Skarels  * address of both buffers and their sizes.
69*38624Skarels  */
70*38624Skarels 
71*38624Skarels /*
72*38624Skarels  * sub command bits for KC_CMD
73*38624Skarels  */
74*38624Skarels #define	OFLUSH	(1<<1)	/* Flush output */
75*38624Skarels #define	OSPND	(1<<2)	/* Suspend output */
76*38624Skarels #define	ORSME	(1<<3)	/* Resume output */
77*38624Skarels 
78*38624Skarels /*
79*38624Skarels  * KC_RCV mode
80*38624Skarels  */
81*38624Skarels #define	RCBLOCK	(1<<5)	/* return on block boundary */
82*38624Skarels #define	RCTIME	(1<<6)	/* return on time expires */
83*38624Skarels /*
84*38624Skarels  * KS_RDB mode
85*38624Skarels  */
86*38624Skarels #define	SFULL	(1<<0)	/* buffer full */
87*38624Skarels #define	SCNTL	(1<<1)	/* cntl char rcv */
88*38624Skarels #define	SBLOCK	(1<<5)	/* block boundary */
89*38624Skarels #define	STIME	(1<<6)	/* time limit expired */
90*38624Skarels #define	SABORT	(1<<3)	/* rcv aborted */
91*38624Skarels /*
92*38624Skarels  * KC_SEND mode
93*38624Skarels  */
94*38624Skarels #define	SBOT	0	/* End blocks with BOT */
95*38624Skarels #define	SBOTM	0x80	/* End blocks with BOTM */
96*38624Skarels 
97*38624Skarels /*
98*38624Skarels  * KS_ERR codes
99*38624Skarels */
100*38624Skarels #define	E_SW		0x00	/* dispatcher switch */
101*38624Skarels #define	E_BUS		0x01	/* Unibus error */
102*38624Skarels #define	E_IPANIC	0x02	/* input routine panic */
103*38624Skarels #define	E_CMD		0x03	/* command unknown */
104*38624Skarels #define	E_NOQB		0x04	/* run out of queue or buffer */
105*38624Skarels #define	E_DUP		0x05	/* duplicate SEND */
106*38624Skarels #define	E_ODKOVF	0x06	/* output routine panic */
107*38624Skarels #define	E_UMETA		0x07	/* un-recognized cntl char */
108*38624Skarels #define	E_SYS1		0x0021	/* system error 1 (041) */
109*38624Skarels #define	E_SYS2		0x0022	/* system error 2 (042) */
110