|
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: 8845 (0x228d) Types: TextFile Notes: UNIX file Names: »tmc.h«
└─⟦5fb5a153b⟧ Bits:30004042/hpdd.imd SW95705I 386/ix Multi-user Release 1.2 └─⟦5fb5a153b⟧ UNIX Filesystem └─⟦this⟧ »hp/new/usr/include/sys/tmc.h«
/* * TMC-8X0 SCSI Host Adapter Driver Definition File */ #ident "@(#)tmc.h 1.1 - 88/03/15" /* * memory mapped address offsets */ #define READ_ROM 0x0000 #define READ_RAM 0x1800 #define WRITE_RAM 0x1800 #define READ_SCSI 0x1e00 #define WRITE_SCSI 0x1e00 /* read_status and write_control replace READ_STATUS and WRITE_CONTROL * read_status = 0x8 0x2 * write_control = 0x2 or 0x8 depending on TMC 830/840/880 */ /* * control port output codes */ #define C_RESET 0x01 /* assert SCSI reset line */ #define C_SELECT 0x02 /* assert SCSI select line */ #define C_BUSY 0x04 /* assert SCSI busy line */ #define C_ATTENTION 0x08 /* assert SCSI attention line */ #define C_ARBITRATION 0x10 /* start arbitration */ #define C_PARITY_ENABLE 0x20 /* parity enable */ #define C_INT 0x40 /* enable interrupt */ #define C_BUS_ENABLE 0x80 /* bus enable */ /* * input status byte */ #define I_BUSY 0x01 /* busy status from SCSI */ #define I_MESSAGE 0x02 /* message status line from SCSI */ #define I_IO 0x04 /* input/output line from SCSI */ #define I_CD 0x08 /* command/data line from SCSI */ #define I_REQUEST 0x10 /* request line from SCSI */ #define I_SELECT 0x20 /* select line from SCSI */ #define I_PARITY 0x40 /* parity error status */ #define I_ARB_COMP 0x80 /* arbitration complete */ /* * status byte */ #define S_PARITY 0x01 /* parity error */ #define S_CHECK_CONDITION 0x02 /* error exists --> request sense */ #define S_BUSY 0x08 /* busy, cont. can't accept command */ /* * message bytes */ #define M_SAVE_DATA_POINTERS 0x02 /* drive is going to disconnect */ #define M_DISCONNECT 0x04 /* drive disconnect */ #define M_IDENTIFY 0x80 /* establish connection */ #define M_SUPPORT_DISCONNECT 0x40 /* adapter supports discon/recon */ /* * opcodes */ #define OP_TEST_UNIT_READY 0x00 #define OP_REQUEST_SENSE 0x03 #define OP_READ 0x08 #define OP_WRITE 0x0a #define OP_START_STOP 0x1b #define OP_READ_CAPACITY 0x25 /* * return codes */ #define DK_DONE 0x0 #define DK_DISCONNECTING 0x1 #define DK_BUSY 0x2 #define DK_RETRY 0x3 #define DK_ERROR -1 /* * adapter scsi id */ #define SCSI_ADAPTER_ID 0x40 /* * selector macros to get at scsi memory addresses */ #define SCSI_IN(a) (scsiptr[a]) #define SCSI_OUT(a,v) (scsiptr[a] = v) /* * phase macros */ #define MSK(m, v) (((m) << 8) | (v)) #define PHASE_SIGNALS 0x1E #define DATA_OUT (I_REQUEST) #define DATA_IN (I_REQUEST|I_IO) #define MESSAGE_OUT 0x1A #define MESSAGE_IN 0x1E #define DATA_OUT_PHASE (adapter_status_check( \ MSK(PHASE_SIGNALS, DATA_OUT)) == 0) #define DATA_IN_PHASE (adapter_status_check( \ MSK(PHASE_SIGNALS, DATA_IN)) == 0) #define COMMAND_PHASE (adapter_status_check(command_msk) == 0) #define STATUS_PHASE (adapter_status_check(status_msk) == 0) #define MESSAGE_OUT_PHASE (adapter_status_check( \ MSK(PHASE_SIGNALS, MESSAGE_OUT)) == 0) #define MESSAGE_IN_PHASE (adapter_status_check( \ MSK(PHASE_SIGNALS, MESSAGE_IN)) == 0) /* * control line macros */ #define ARB_COMPLETE (adapter_status_check(MSK(I_ARB_COMP, I_ARB_COMP))==0) #define BUSY_LOW (adapter_status_check(MSK(I_BUSY, 0)) == 0) #define BUSY_HIGH (adapter_status_check(MSK(I_BUSY, I_BUSY))) #define REQUEST_HIGH (adapter_status_check(MSK(I_REQUEST, I_REQUEST)) == 0) #define MESSAGE_HIGH (adapter_status_check(message_high_msk) == 0) #define MESSAGE_LOW (adapter_status_check(message_low_msk) == 0) #define CD_HIGH (adapter_status_check(cd_high_msk) == 0) #define CD_LOW (adapter_status_check(cd_low_msk) == 0) #define IO_HIGH (adapter_status_check(MSK(I_IO, I_IO)) == 0) #define IO_LOW (adapter_status_check(MSK(I_IO, 0)) == 0) #define SELECT_HIGH (adapter_status_check(MSK(I_SELECT, I_SELECT)) == 0) #define SELECT_LOW (adapter_status_check(MSK(I_SELECT, 0)) == 0) #define ADAPTER_IDLE (adapter_status_check( \ MSK(I_BUSY|I_CD|I_IO|I_REQUEST|I_MESSAGE, 0)) == 0) /* * miscellaneous macros */ #define NBPS(dr) defined_drives[dr]->bytes_p_sect #define NSPT(dr) defined_drives[dr]->sect_p_trk #define NTPC(dr) defined_drives[dr]->trk_p_cyl #define NSPC(dr) defined_drives[dr]->sect_p_cyl #define NSPB(dr) (BSIZE / NBPS(dr)) #define b_hold_partp b_resid /* * constants */ #define FALSE 0 #define TRUE 1 #define NDK 2 /* number of drives */ #define NSCSI_IDS 8 /* available scsi ids */ #define NPARTS 8 /* number of logical disks per drive */ #define ERRLIM 0 /* number of retries before error */ #define MAXSECTORS 256 /* largest request */ #define SCSI_TIMEOUT 240 /* 4 minute timeout value */ #define STARTUP_TIME 3 #define TINY_WAIT 30L /* used when checking for arbitration */ #define SHORT_WAIT 1236L #define KINDA_SHORT_WAIT 12360L #define MEDIUM_WAIT 200000L /* longer than long */ #define LONG_WAIT 120000L #define RESET_DELAY (5 * HZ)/* time to delay() after reset */ #define RESET_SPIN 700000L/* how long to spin after reset */ #define IO_DELAY (1 * HZ)/* time to delay() after garbage I/O */ #define IO_SPIN 150000L /* how long to spin after I/O */ #define CB_FLAG 0 #define ECB_FLAG 1 #define DOS12_ID 1 #define ROOT_ID 2 #define USER_ID 3 #define DOS16_ID 4 #define BADTT_ID 0xff #define PART_WHOLE 0 #define PART_1 1 #define PART_2 2 #define PART_3 3 #define PART_4 4 #define PART_ACT 5 #define MAX_BADT 256 #define uchar_t unchar /* * control block */ struct cb { uchar_t cb_opcode; uchar_t cb_unit; uchar_t cb_block_address[2]; uchar_t cb_transfer_length; uchar_t cb_control_byte; }; /* * extended control block */ struct ecb { uchar_t ecb_opcode; uchar_t ecb_unit; uchar_t ecb_block_address[4]; uchar_t ecb_reserved; uchar_t ecb_transfer_length[2]; uchar_t ecb_control_byte; }; struct read_cap_data { uchar_t rcd_block_address[4]; uchar_t rcd_block_length[4]; }; struct sense_data { uchar_t sd_error; uchar_t sd_segment_no; uchar_t sd_sense_key; uchar_t sd_info[4]; uchar_t sd_sense_length; uchar_t sd_res1[4]; uchar_t sd_sense_code; uchar_t sd_res2[5]; }; struct part_struc { char boot_ind_hd; /* boot indication */ char begin_head_hd; /* beginning head number (1-???) */ char begin_sector_hd; /* beginning sector number (1-170) */ char begin_cyl_hd; /* beginning cylinder number (0-???) */ char system_ind_hd; /* system id byte */ char stop_head_hd; /* ending head number */ char stop_sector_hd; /* ending sector number */ char stop_cyl_hd; /* ending cylinder number */ daddr_t rel_sector_hd; /* relative starting sector number */ daddr_t total_sector_hd; /* total num of sectors in partition */ }; struct boot_part { char boot_code[ 512 - (4 * sizeof( struct part_struc )) - sizeof(unsigned) ]; struct part_struc partition_table[ 4 ]; /* partition table */ unsigned signature_hd; /* signature */ }; /* * table of pointers to each of the drive characteristics for each * drive; these are initialized at 'scsireset' time and are used to * get the pointer quick without extensive calculations. */ struct drive_types { unsigned cylinders; /* # of cylinders */ unsigned trk_p_cyl; /* # tracks per cyl (heads) */ unsigned write_precomp; /* precomp cylinder */ unsigned sect_p_trk; /* # sectors per track */ unsigned sect_p_cyl; /* # sectors per cylinder */ unsigned phy_p_log; /* # of sectors per block */ unsigned bytes_p_sect; /* # of bytes per sector */ unsigned parking; /* parking cylinder for transport */ unsigned reserved1; unsigned reserved2; }; /* * start and length of each logical disk on each physical disk. * also contains the start and end pointers into the bad track * table so that each request does not have to scan the entire * table. */ struct partab { daddr_t len; /* number of sectors in partition */ daddr_t sector_start; /* start sector of partition */ unsigned *strt_badt_ptr; /* starting & ending indexes for this */ unsigned *end_badt_ptr; /* partition in the badt table */ char part_type; /* sys id byte from disk structure */ }; /* * For drive specific information, such as tape open functions * (where a specific density mode needs to be set), or other * drive specific things that need to happen at file open time. */ struct drive_specific { char *ds_vendor; /* vender ID ASCII 8 bytes */ char *ds_product; /* product ID ASCII 16 bytes */ char *ds_revision; /* revision level ASCII 4 bytes */ int (*ds_open_func)(); /* tape drive open function or NULL */ }; #define ds_vid(X) (X->ds_vendor) #define ds_pid(X) (X->ds_product) #define ds_rev(X) (X->ds_revision) #define ds_open(X) (X->ds_open_func) struct mode_select { int mode; int density; int blk_len; }; typedef struct mode_select mode_sel_t;