|
DataMuseum.dkPresents historical artifacts from the history of: Regnecentalen RC-900 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Regnecentalen RC-900 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 21224 (0x52e8) Types: TextFile Notes: UNIX file Names: »i214.h«
└─⟦a6ab2eb36⟧ Bits:30004042/kconfig3.imd SW95705I 386/ix Multi-user Release 1.2 └─⟦a6ab2eb36⟧ UNIX Filesystem └─⟦this⟧ »kc/new/usr/include/sys/i214.h«
/* Copyright (c) 1984 AT&T */ /* All Rights Reserved */ /* THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T */ /* The copyright notice above does not evidence any */ /* actual or intended publication of such source code. */ /* * INTEL CORPORATION PROPRIETARY INFORMATION * * This software is supplied under the terms of a license * agreement or nondisclosure agreement with Intel Corpo- * ration and may not be copied or disclosed except in * accordance with the terms of that agreement. */ #ident "@(#)i214.h 1.6 - 87/03/20" /* * i214.h * 214/215/217/218 Driver declarations. Support for 214/215G only. * * Details of the 215/218 hardware may be found in Intel manual order * number 144780-002 (215) * */ /******* Values needed but not defined in Unix 5.3 standard header files */ #define EBBHARD 128 /* Not in errno.h */ #define EBBSOFT 129 #define B_TAPE 2 /* Not in iobuf.h */ #define splbuf spl6 #define SPL spl5 /* for driver mutex */ #define NUMSPINDLE 12 /* # spindles per board */ #define FIRSTFLOPPY 4 /* first removable unit-number */ #define NEXT_REMOVE_UNIT 4 /* increment to next removable unit */ #define FIRSTTAPE 8 /* first tape unit */ #define FIXEDMASK (FIRSTFLOPPY - 1) /* mask for fixed-unit given unit */ #define LOC_BUF 1 /* local "sa" buffer from getablk */ #define EXP_BUF 0 /* exported buffer from getablk */ #define ERROR -1 /* error state, error return */ /* * Mapping of each minor device number to the following: * * Units * 0-3 Winchester disk * 4-7 Floppy disk * 8-11 Tape drive * * Drtab's are selected per unit. See i214cfg, below. * * Partitions are selected per drtab entry. See i214cdrt, below. * Minor table gives the index into the selected partition table. * * "Board" defines the board number, and corresponding entry in i214cfg. */ struct i214minor { unsigned partition: 4; /* index into partition table */ unsigned drtab: 4; /* index into drtab */ unsigned unit: 4; /* unit number */ unsigned board: 4; /* board number */ }; #define UNIT(dev) (i214minor[minor(dev)].unit) /* dev->unit# map */ #define DRTAB(dev) (i214minor[minor(dev)].drtab) /* dev->drtab-index map */ #define PARTITION(dev) (i214minor[minor(dev)].partition)/* dev->partition-index map */ #define BOARD(dev) (i214minor[minor(dev)].board) /* board number */ #define i214MINOR(bnum,unum,drnum,panum) ((bnum<<12)|(unum<<8)|(drnum<<4)|panum) /* used in c214.c */ #define BASEDEV(dev) (i214bases[BOARD(dev)*2+UNIT(dev)]) #define LOW(x) ((x)&0xFF) /* "low" byte */ #define HIGH(x) (((x)>>8)&0xFF) /* "high" byte */ /* * Partition structure. One per drtab[] entry. */ struct i214part { ushort p_tag; /* ID tag (from vtoc.h) */ ushort p_flag; /* permision flags (from vtoc.h) */ daddr_t p_fsec; /* first sector */ daddr_t p_nsec; /* number sectors */ }; /* * Per-board configuration. One of these per 215/218/217 . * c_devcod indicates what kind of device/floppies/tape are there and * what type of board this is (215[AB], 215G ). * * The c_drtab field is a pointer to a list of drtab entries per-unit. A zero * value implies non-existent unit. */ struct i214cfg { long c_wua; /* Physical Wake-Up Address */ char c_devcod[(NUMSPINDLE/FIRSTFLOPPY)]; char c_level; /* what interrupt level */ struct i214cdrt *c_drtab[NUMSPINDLE]; /* per-spindle pointer to */ }; /* drive-characteristic table */ /* * Per-board driver "dynamic" data. */ struct i214state { char s_1st_init; /* Do init sweep for ANY open */ char s_sstart; /* unit starting init sweep */ char s_exists; /* flag that board exists */ char s_support; /* level of support for 214 */ char s_state; /* what just finished (for intr) */ ushort t_flags; /* non-buffered flags */ char t_state; /* tape state */ char s_opunit; /* current unit being programmed */ ushort s_board; /* board number */ long s_wua; /* copy of i214cfg.c_wua */ char s_flags[NUMSPINDLE]; /* flags per spindle */ char s_devcod[NUMSPINDLE]; /* device-code for iopb */ char s_unit[NUMSPINDLE]; /* "unit" code for iopb */ char s_error[NUMSPINDLE]; /* status from nonbuffered op */ struct iobuf *s_bufh; /* pointer to regular buffer queue */ struct iobuf *t_bufh; /* pointer to tape buffer queue */ struct buf *rtfm_buf; /* pointer to blk for RTFM state */ char *d_buf; /* pointer to data buffer */ }; #define i214XBSIZ 0x8000 /* size of segment */ #define TP_GETBUF 1 /* allocate raw external buffers */ #define TP_FREEBUF 2 /* deallocate raw external buffers */ #define TP_RDBUF 3 /* write to raw external buffer */ #define TP_WRBUF 4 /* write to raw external buffer */ #define TP_FLUSH 5 /* flush raw external buffers */ #define TP_INITBUF 6 /* init raw external buffers */ #define BP_ENQUE(q, b) { \ int qmk = splbuf(); \ (b)->av_forw = 0; \ if((q)->b_actf == 0) \ (q)->b_actf = b; \ else \ ((q)->b_actl)->av_forw = b; \ (q)->b_actl = b; \ splx(qmk); \ }; #define BP_DEQUE(q, b) { \ int qmk = splbuf(); \ if((b = (q)->b_actf) != 0) { \ if(((q)->b_actf = (b)->av_forw) == 0) \ (q)->b_actl = 0; \ (b)->av_forw = 0; \ } \ splx(qmk); \ }; /* * Per-Unit State Flags. */ #define SF_OPEN 0x01 /* unit is open */ #define SF_READY 0x02 /* unit is ready; reset by media-change */ #define SF_VTOC_OK 0x04 /* a valid VTOC has been read for this unit */ #define SF_OPENING 0x08 /* open (VTOC reading) in progress */ /* * Per-board tape Flags */ #define TF_NO_BUFFER 0x01 /* means that no buffer is present */ #define TF_LONG_TERM 0x02 /* operation just invoked is long-term */ #define TF_WAIT_SECOND 0x04 /* waiting for 2nd int from long-term op */ /* tape operations had better wait */ #define TF_IM_WAITING 0x08 /* has left sleep for first interrupt */ #define TF_LT_DONE 0x10 /* don't bother sleeping; second interrupt */ /* has already happened */ #define TF_READING_TO_FM 0x20 /* Reading to filemark */ #define TF_WANTED 0x80 /* non-buffered request is waiting for a */ /* tape to finish a long-term operation */ #define TF_FOUND_FM 0x100 /* File mark encountered */ #define TF_FM_ALWAYS 0x200 /* Always set TF_FOUND_FM when a */ /* is encountered. This is used by */ /* the internal buffering. */ /* * Macros to make things easier to read/code/maintain/etc... */ #define IS220(dd) ((dd)->d_state.s_devcod[0] == DEV220) #define IS214(dd) ((dd)->d_state.s_devcod[0] == DEVWINIG) #define IO_OP(bp) (((bp)->b_flags & B_READ) ? READ_OP : WRITE_OP) #define ISTAPE(dd,unit) ((dd)->d_state.s_devcod[unit] == STREAMER) #define NOT_BTAPE(dev) (UNIT((dev)) < FIRSTTAPE) /* * 214 Wake-Up Block. Lives at wakeup-address, points at CCB. */ struct i214wub { char w_sysop; /* Must == 0x01 */ char w_rsvd; /* reserved */ ushort w_ccb; /* "offset" of CCB pointer */ ushort w_ccb_b; /* "base" == Kernel DS >> 4 */ }; /* * CCB (Channel Control Block). See 214 manual. */ struct i214ccb { char c_ccw1; /* 1 ==> Use 214 Firmware */ char c_busy1; /* 0x00 ==> Idle, 0xFF ==> busy */ ushort c_cib; /* "offset" of CIB pointer */ ushort c_cib_b; /* "base" == Kernel DS >> 4 */ ushort c_rsvd0; /* reserved */ char c_ccw2; /* Must == 0x01 */ char c_busy2; /* Not useful to Host */ ushort c_cpp; /* -> i214ccb.c_cp (offset) */ ushort c_cpp_b; /* "base" == Kernel DS >> 4 */ ushort c_cp; /* Control Pointer == 0x04 */ }; /* * CIB (Controller Invocation Block). See 214 manual. */ struct i214cib { char c_cmd; /* reserved */ char c_stat; /* Operation Status (see below) */ char c_cmdsem; /* Not used by 214 */ char c_statsem; /* 0xFF ==> new status avail */ ushort c_csa[2]; /* 214 Firmware; MUST == 0 */ ushort c_iopb; /* IOPB pointer offset */ ushort c_iopb_b; /* "base" == Kernel DS >> 4 */ ushort c_rsvd1[2]; /* reserved */ }; /* * IOPB (I/O Parameter Block). See 214 manual. */ /* * Note that the reserved field is set to 3 instead of 2 as the * manual describes. This is so that i_addr field is 32 bit aligned. * Note that the i_actual is then not 32 bit aligned. Better one * than three. */ struct i214iopb { ushort i_rsvd[3]; /* reserved */ ushort i_actual[2]; /* actual transfer count */ ushort i_device; /* Device Code (see below) */ char i_unit; /* Unit: <4> == fixed/rem, <1,0> == unit # */ char i_funct; /* Function Code (see below) */ ushort i_modifier; /* Modifier. 0 ==> normal, interrupt */ ushort i_cylinder; /* starting cylinder # */ char i_head; /* starting head # */ char i_sector; /* starting sector # */ ulong i_addr; /* buffer address */ ulong i_xfrcnt; /* Requested Transfer Count */ ulong i_gaddr_ptr; /* general address ptr (not used) */ }; /* * Drive-Data Table (used to initialize drives). See 214 manual. * Because of C alignment problem on secsiz, it must be entered bytewise. * Fields through dr_nalt are programmed into controller for an init (disk); * tapes only use first byte. Other fields are for internal driver use. * The i214cdrt structure is for static initialization of data. It has * to be moved into the drtab so it will be aligned the way the controller * wants it. */ struct i214drtab { ushort dr_ncyl; /* # cylinders */ char dr_nfhead; /* # fixed heads (Winchester) */ char dr_nrhead; /* # removable heads (floppy) */ char dr_nsec; /* # sectors per track */ char dr_lsecsiz; /* "low" of sector-size */ char dr_hsecsiz; /* "high" of sector-size */ char dr_nalt; /* # alternate cylinders */ /* if floppy, 0==FM, 1==MFM */ ushort dr_spc; /* actual sectors/cylinder */ ushort dr_lbps; /* logical blocks (512b) / sector */ ushort dr_secsiz; /* sector-size (bytes) */ struct i214part *dr_part; /* partition table pointer */ char dr_pnum; /* number of partitions */ struct alt_table *dr_altptr; /* points at alternates table */ }; struct i214cdrt { ushort cdr_ncyl; /* # cylinders */ char cdr_nfhead; /* # fixed heads (Winchester) */ char cdr_nrhead; /* # removable heads (floppy) */ char cdr_nsec; /* # sectors per track */ ushort cdr_secsiz; /* sector-size */ char cdr_nalt; /* # alternate cylinders */ struct i214part *cdr_part; /* partition table pointer */ char cdr_pnum; /* number of partitions */ }; #define dr_flags dr_nalt #define cdr_flags cdr_nalt #define DR_NO_REWIND 1 #define DR_READ_TO_FM 2 /* * Error Status-Structure, Returned on status inquiry. See 214 manual. * Note another alignment problem */ struct i214err { ushort e_hard; /* Hard Error Status (see below) */ char e_soft; /* soft error status */ char e_req_cyl_l; /* desired cylinder - low byte */ char e_req_cyl_h; /* desired cylinder - high byte */ char e_req_head; /* desired head and volume */ char e_req_sec; /* desired sector */ char e_act_cyl_l; /* act cylinder - low byte */ char e_act_cyl_h; /* act cylinder - high byte, flags */ char e_act_head; /* actual head & volume */ char e_act_sec; /* actual sector */ char e_retries; /* # retries attempted */ }; /*********************************************************************** i025 DEBUGGING: this is the structure which is used to fake bad blocks for testing. */ struct i214_bb_fake { daddr_t f_block_num; /* block number for fake */ dev_t f_device; /* device num (maj/min) for fake */ char f_serror; /* to be put in s_error field */ ushort f_hard_soft; /* to be put in e_hard or e_soft, depending on what is in serror. */ }; /* end of i025 DEBUGGING ************************************************************************/ /* * Tape status access defines. */ #define e_no_data e_act_cyl_h /* no data detected */ #define e_leot e_req_sec /* logical end of tape */ #define e_fm_found e_req_head /* file mark detected */ #define e_llp e_req_cyl_h /* at logical load point */ #define e_bot e_req_cyl_l /* at beginning of tape */ /* * Format Structure. 1 per "board" * i214ftk is the argument structure to the format ioctl. */ struct i214format { char f_trtype; /* format track-type code */ char f_pattern[4]; /* pattern; depends on f_trtype */ char f_interleave; /* interleave-factor */ daddr_t f_secno; /* for calculating absolute sector number */ }; struct i214ftk { ushort f_track; /* track # */ ushort f_intl; /* interleave factor */ ushort f_skew; /* track skew -- ignored by 214 */ char f_type; /* format type-code */ char f_pat[4]; /* pattern data */ }; /* * 214 device parameter structure. */ struct i214dp { /* Partition description (16 bytes) */ ushort ncyl; /* # cylinders */ char nfhead; /* # fixed heads (Winchester) */ char nrhead; /* # removable heads (floppy) */ char secptk; /* # sectors per track */ char nalt; /* # alternate cylinders */ ushort secsiz; /* sector-size */ daddr_t fstsec; /* First sector */ daddr_t numsec; /* Number of sectors */ }; /* * 214 Disk Driver Extensions. One per board. Contains information * about the transfer in progress for disks only. */ struct i214ext { ulong xfer_addr; /* current transfer address */ ulong xfer_count; /* current transfer count */ }; /* * 214 Per-Board Device-Data. One per board. */ struct i214dev { struct i214ext d_ext; struct i214state d_state; struct i214ccb d_ccb; struct i214cib d_cib; struct i214iopb d_iopb; struct i214drtab d_drtab[NUMSPINDLE]; struct i214err d_error; struct i214format d_format; struct i214ftk d_ftk; struct iotime d_iot; /* system accounting information */ }; /* * Values of buffer-header b_active, used for mutual-exclusion of * opens and other I/O requests. */ #define IO_IDLE 0 /* idle -- anything goes */ #define IO_BUSY 1 /* something going on */ #define IO_WAIT 2 /* waiting for controller to be idle */ /* * #define B_FORMAT 040000 * "new" buf.h flag: must NOT overlap buf.h! * */ /* * Values of i214state.s_state, internal driver state. */ #define NOTHING 0 /* normal situation */ #define GET_BAD_STATUS 1 /* retrieving status on hard error */ #define RESTORING 2 /* recalibrating to track 0 for retry */ #define INITIALIZING 3 /* going through init-sweep */ #define READING_LABEL 4 /* reading device label - unused */ #define FORMAT0 5 /* unused */ #define FORMAT1 6 /* unused */ #define FORMAT2 7 /* unused */ #define FORMAT3 8 /* unused */ #define T_INIT 9 /* initializing 217 controller */ #define T_RESET 10 /* resetting tape drive */ #define T_SOFT_STATUS 11 /* soft status check (for TS_READING) */ #define T_READING_TO_FM 12 /* dumping data to get out of read mode */ #define T_RTFM_STATUS 13 /* status check in T_READING_TO_FM */ #define WRITEFM 14 /* handle end of media */ /* * tape state variables for state.t_state. */ #define TS_READING 1 /* tape device engaged in a read op */ #define TS_WRITING 2 /* tape device engaged in a write op */ /* * IOPB fields/flags definitions. */ #define UNIT_REMOVABLE 0x10 /* ==> removable unit */ /* * 214 Wake-up command codes. These get output to the wakeup-address-port. */ #define WAKEUP_CLEAR_INT 0x00 #define WAKEUP_START 0x01 #define WAKEUP_RESET 0x02 /* * 214 IOPB Command Codes. */ #define INIT_OP 0x0 #define STATUS_OP 0x1 #define FORMAT_OP 0x2 #define READ_ID_OP 0x3 /* not used */ #define READ_OP 0x4 #define VERIFY_OP 0x5 /* not used */ #define WRITE_OP 0x6 #define WRITE_BUFFER_OP 0x7 /* not used */ #define SEEK_OP 0x8 /* not used */ #define DIAGNOSTIC_OP 0xF /* for RESTORING state */ /* * IOPB commands for tape only. These commands work only * on the iSBC 214 series of controller boards which supports * the iSBX 217 tape controller. * * l.t. (long term command) * s.t. (short term command) */ #define TAPEINIT_OP 0x10 /* s.t. initialize 217 firmware */ #define REW_OP 0x11 /* l.t. tape rewind */ #define SFFM_OP 0x12 /* l.t. forward a file mark */ #define SBFM_OP 0x13 /* l.t. backward a file mark not used */ #define WRFM_OP 0x14 /* s.t. write filemark */ #define ERASETAPE_OP 0x17 /* l.t. erase tape (format command) */ #define LOADTAPE_OP 0x18 /* l.t. tape to logical load point */ #define UNLOADTAPE_OP 0x19 /* l.t. tape to physical end of tape not used */ #define SFREC_OP 0x1A /* s.t. forward a record not used */ #define SBREC_OP 0x1B /* s.t. backward a record not used */ #define TAPERESET_OP 0x1C /* s.t. reset tape drive */ #define RETTAPE_OP 0x1D /* l.t. retension tape */ #define TAPE_STATUS_OP 0x1E /* s.t. get long term status info not used */ #define R_W_TERMINATE 0x1F /* terminate read/write command */ /* * 214 IOPB Modifier Bits. */ #define MOD_NO_INT 0x0001 /* no interrupt */ #define MOD_NO_RETRY 0x0002 /* no retry attempts */ #define MOD_DELETED_DATA 0x0004 /* 218 deleted-data RW - not used */ #define MOD_24_BIT 0x0010 /* 214 24-bit address mode */ #define MOD_NO_CLEAR 0x0020 /* 214 no clear the ram on init bit */ #define MOD_LT_STATUS 0x0040 /* 214 tape status for long command */ #define MOD_RECAL 0xFF00 /* to use diagnostic recalibrate cmd */ /* * Device Codes (for iopb.i_device). */ #define DEVWINI 0 /* Wini */ #define DEV8FLPY 1 /* 8" 218 Floppy */ #define DEV220 2 /* 220 */ #define DEV5FLPY 3 /* 5.25" 218 Floppy */ #define STREAMER 4 /* streamer tape (QIC-2) */ #define STARTSTOP 5 /* start/stop tape (Kennedy) not used */ #define DEVWINIG 8 /* 214 type, DEVWINI + 8 */ #define DEVMASK 7 /* mask to get actual device */ #ifdef INVALID #undef INVALID #endif #define INVALID 0xF /* invalid device code */ /* * Floppy FM/MFM codes for drtab[*].nalt. */ #define FLPY_FM 0 /* FM -- single density */ #define FLPY_MFM 1 /* MFM -- double density */ /* * Operation Status Bits. Returned by controller in i214cib.c_stat. * * Note: the 214 controller has two additional bit patterns * for tape identification. 0x?f for tape long term command complete * and 0x?e for media change. Since we will need to treat long term * command completion diffently any way it has been defined as a byte mask * instead of a bit mask. */ #define ST_OP_COMPL 0x01 /* immediate operation complete */ #define ST_SEEK_COMPL 0x02 /* seek complete */ #define ST_MEDIA_CHANGE 0x04 /* media changed */ #define ST_MCHANGE_MASK 0x05 /* I015 media change mask */ #define ST_COMPL_MASK 0x07 /* I015 operation complete mask */ #define ST_FLOPPY 0x08 /* ==> 218 floppy; possibly 217 tape */ #define ST_UNIT 0x30 /* unit mask */ #define ST_HARD_ERR 0x40 /* 0 ==> was soft, recovered error */ #define ST_ERROR 0x80 /* summary error - can read status */ #define ST_TAPE_MEDIA 0x0E /* I004 tape media change detected */ #define ST_LONG_COMPL 0x0F /* I004 tape long term complete */ /* * Error Bits. * * Errors returned to user in b_error (byte). Error is either soft-status * byte, or high-byte of hard-status byte. b_error needs to be a word, * and can be used as: * Bits Contents * 6-0 EIO * 7 0 ==> Hard, 1 ==> Soft status * 15-8 High-order byte of hard status, or soft status byte. * (just like iRMX 86; huh, guys? puck) * * I017 - additional bit definitions. */ #define HARD_214_REJECT 0x0001 #define HARD_214_RAM_ERR 0x0008 #define HARD_214_ROM_ERR 0x0010 #define HARD_LT_IN_PROGRESS 0x0020 #define HARD_FORMAT_TYPE 0x0040 #define HARD_END_OF_MEDIA 0x0080 #define HARD_ILL_SEC_SIZE 0x0100 #define HARD_DIAG_FAULT 0x0200 #define HARD_NO_INDEX 0x0400 #define HARD_INVALID_FUNC 0x0800 #define HARD_NO_SECTOR 0x1000 #define HARD_INVALID_ADDR 0x2000 #define HARD_NOT_READY 0x4000 #define HARD_WRITE_PROT 0x8000 #define SOFT_DATA_CRC 0x08 #define SOFT_ID_CRC 0x10 #define SOFT_DRIVE_FAULT 0x20 #define SOFT_CYL_ADDR_MISC 0x40 #define SOFT_SEEK_ERR 0x80 /* * I017 * Error bits defined for tapes; * see 214 HRM or i214harderr for descriptions. */ #define HARD_217_REJECT 0x0002 #define HARD_DRIVE_REJECT 0x0004 #define HARD_217_ROM_ERR 0x0010 #define HARD_CONFIGURATION 0x0040 #define HARD_LENGTH_ERR 0x0100 #define HARD_TIME_OUT 0x0400 #define HARD_NO_CARTRIDGE 0x1000 #define SOFT_TAPE_ERROR 0x02 #define SOFT_CABLE_CHECK 0x04 #define SOFT_DATA_ERROR 0x08 #define SOFT_OVER_UNDER_RUN 0x40 /* * Misc Format definitions, for i214ftk.f_type. */ #define FORMAT_DATA 0x00 /* format data track */ #define FORMAT_BAD 0x80 /* format bad track */ #define FORMAT_ALTERNATE 0x40 /* format alternate track */ /* * iSBC 214 ioctl mnemonics. */ #define I214_IOC_FMT (('W'<<8)|0) #define I214_IOC_RDC (('W'<<8)|32) /* * I004 * Tape ioctl mnemonics */ #define I214_REW (('W'<<8)|1) #define I214_SFFM (('W'<<8)|2) #define I214_SBFM (('W'<<8)|3) #define I214_RETTAPE (('W'<<8)|4) #define I214_SFREC (('W'<<8)|5) #define I214_SBREC (('W'<<8)|6) #define I214_WRFM (('W'<<8)|7) #define I214_ERASE (('W'<<8)|8) #define I214_TINIT (('W'<<8)|9) /* * I012 * Division ID for firmware version number recognition on 214. */ #define ISO_S 0x1 #define OMO 0x2 #define ISO_N 0x3 /* * I019 * Definitions for firmware version usage. */ #define NOSWEEP_SPT(dd) ((dd)->d_state.s_support >= 1) #define A24BIT_SPT(dd) ((dd)->d_state.s_support >= 3) #define TAPE_SPT(dd) ((dd)->d_state.s_support >= 4)