V10/lsys/sys/kdi.h
/*
* per-channel structure
*/
struct kdi {
struct queue *dkrq;
struct block *ibp;
struct block *obp;
ubm_t imap;
ubm_t omap;
unsigned short rsize; /* # bytes in last read */
unsigned char chan;
unsigned char ostate;
unsigned char kno;
unsigned char lastctl;
};
/*
* per-kmc structure
*/
struct kdikmc {
struct kdi *kdi; /* per-channel structures */
char *state; /* per-channel state */
struct buf *buf; /* where the data above is stashed */
ubm_t umap; /* map token for kmc stuff below */
uaddr_t ubad; /* unibus addr of device data */
struct dkmodule *modp;
time_t badtime;
char init;
char bad;
char ubno;
};
/*
* format of UB addresses sent to KMC
*/
struct kmaddr {
unsigned short hi;
unsigned short lo;
};
/*
* KMC init packet
*/
struct kinit {
struct kmaddr cmdaddr; /* UB addr of cmd buf */
struct kmaddr stataddr; /* UB addr of statbuf */
struct kmaddr bufaddr; /* UB addr of KMC workspace */
struct kmaddr csraddr; /* for DR11C - unused */
};
/*
* command/status packets
*/
struct kin { /* KMC command buffer */
unsigned char type; /* command type */
unsigned char serno; /* probably seq number */
unsigned char chan; /* channel number */
unsigned char fill2; /* probably seq number */
unsigned short len; /* byte count */
char ctl; /* possible control byte */
char mode; /* command variant */
struct kmaddr addr; /* UB location of buffer */
};
/*
* Big structure with stuff that needs to be accessible on the unibus
* one per kmc
*/
#define NKMB 10 /* number of cmd/status packets */
struct kmcdk {
struct kinit kinit; /* the init packet */
struct kin cmd[NKMB]; /* KMC command buffer */
struct kin stat[NKMB]; /* KMC status buffer */
char kmcbuf[16*1024]; /* temp space for KMC */
};