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