|
|
researchv9-SUN3(old)
/* @(#)scsi.h 1.1 86/02/03 SMI */
/*
* Copyright (c) 1983 by Sun Microsystems, Inc.
*/
/*
* Standard SCSI control blocks.
* These go in or out over the SCSI bus.
*/
struct scsi_cdb { /* scsi command description block */
u_char cmd; /* command code */
u_char lun : 3; /* logical unit number */
u_char high_addr : 5; /* high part of address */
u_char mid_addr; /* middle part of address */
u_char low_addr; /* low part of address */
u_char count; /* block count */
u_char vu_57 : 1; /* vendor unique (byte 5 bit 7) */
u_char vu_56 : 1; /* vendor unique (byte 5 bit 6) */
u_char : 4; /* reserved */
u_char fr : 1; /* flag request (interrupt at completion) */
u_char link : 1; /* link (another command follows) */
};
/*
* defines for SCSI tape cdb.
*/
#define t_code high_addr
#define high_count mid_addr
#define mid_count low_addr
#define low_count count
struct scsi_scb { /* scsi status completion block */
/* byte 0 */
u_char ext_st1 : 1; /* extended status (next byte valid) */
u_char vu_06 : 1; /* vendor unique */
u_char vu_05 : 1; /* vendor unique */
u_char is : 1; /* intermediate status sent */
u_char busy : 1; /* device busy or reserved */
u_char cm : 1; /* condition met */
u_char chk : 1; /* check condition: sense data available */
u_char vu_00 : 1; /* vendor unique */
/* byte 1 */
u_char ext_st2 : 1; /* extended status (next byte valid) */
u_char reserved: 6; /* reserved */
u_char ha_er : 1; /* host adapter detected error */
/* byte 2 */
u_char byte2; /* third byte */
};
struct scsi_sense { /* scsi sense for error classes 0-6 */
u_char adr_val : 1; /* sense data is valid */
u_char class : 3; /* error class (0-6) */
u_char code : 4; /* error code */
u_char high_addr; /* high byte of block addr */
u_char mid_addr; /* middle byte of block addr */
u_char low_addr; /* low byte of block addr */
u_char extra[12]; /* pad this struct so it can hold max num */
/* of sense bytes we may receive */
};
struct scsi_ext_sense { /* scsi extended sense for error class 7 */
/* byte 0 */
u_char adr_val : 1; /* sense data is valid */
u_char : 7; /* fixed at binary 1110000 */
u_char seg_num; /* segment number, applies to copy cmd only */
/* byte 2 */
u_char fil_mk : 1; /* file mark on device */
u_char eom : 1; /* end of media */
u_char ili : 1; /* incorrect length indicator */
u_char : 1; /* reserved */
u_char key : 4; /* sense key, see below */
u_char info_1; /* information byte 1 */
u_char info_2; /* information byte 2 */
u_char info_3; /* information byte 3 */
u_char info_4; /* information byte 4 */
u_char add_len; /* number of additional bytes */
/* additional bytes follow, if any */
};
/*
* Sense key values for extended sense.
*/
#define SC_NO_SENSE 0x0
#define SC_RECOVERABLE_ERROR 0x1
#define SC_NOT_READY 0x2
#define SC_MEDIUM_ERROR 0x3
#define SC_HARDWARE_ERROR 0x4
#define SC_ILLEGAL_REQUEST 0x5
#define SC_UNIT_ATTENTION 0x6
#define SC_DATA_PROTECT 0x7
#define SC_BLANK_CHECK 0x8
#define SC_VENDOR_UNIQUE 0x9
#define SC_COPY_ABORTED 0xa
#define SC_ABORT_COMMAND 0xb
#define SC_EQUAL 0xc
#define SC_VOLUME_OVERFLOW 0xd
#define SC_MISCOMPARE 0xe
#define SC_RESERVED 0xf
/*
* SCSI Operation codes.
*/
#define SC_TEST_UNIT_READY 0x00
#define SC_REZERO_UNIT 0x01
#define SC_REQUEST_SENSE 0x03
#define SC_READ 0x08
#define SC_WRITE 0x0a
#define SC_SEEK 0x0b
/*
* Messages that SCSI can send.
*/
#define SC_COMMAND_COMPLETE 0x00
#define SC_SAVE_DATA_PTR 0x02
#define SC_RESTORE_PTRS 0x03
#define SC_DISCONNECT 0x04
#define SC_IDENTIFY 0x80
#define SC_DR_IDENTIFY 0xc0
#define MORE_STATUS 0x80 /* More status flag */
#define STATUS_LEN 3 /* Max status len for SCSI */
#define cdbaddr(cdb, addr) (cdb)->high_addr = (addr) >> 16;\
(cdb)->mid_addr = ((addr) >> 8) & 0xFF;\
(cdb)->low_addr = (addr) & 0xFF
#define NLPART NDKMAP /* number of logical partitions (8) */
/*
* SCSI unit block.
*/
struct scsi_unit {
char un_target; /* scsi bus address of controller */
char un_lun; /* logical unit number of device */
char un_present; /* unit is present */
u_char un_scmd; /* special command */
u_short un_unit; /* real unit number of device */
struct scsi_unit_subr *un_ss; /* scsi device subroutines */
struct scsi_ctlr *un_c; /* scsi ctlr */
struct mb_device *un_md; /* mb device */
struct mb_ctlr *un_mc; /* mb controller */
struct buf un_utab; /* queue of requests */
struct buf un_sbuf; /* fake buffer for special commands */
struct buf un_rbuf; /* buffer for raw i/o */
/* current transfer: */
u_short un_flags; /* misc flags relating to cur xfer */
int un_baddr; /* virtual buffer address */
daddr_t un_blkno; /* current block */
short un_sec_left; /* sector count for single sectors */
short un_cmd; /* command (for cdb) */
short un_count; /* num sectors to xfer (for cdb) */
int un_dma_addr; /* dma address */
u_short un_dma_count; /* byte count expected */
short un_retries; /* retry count */
short un_restores; /* restore count */
char un_wantint; /* expecting interrupt */
/* the following save current dma information in case of disconnect */
int un_dma_curaddr; /* current addr to start dma to/from */
u_short un_dma_curcnt; /* current dma count */
u_short un_dma_curdir; /* direction of dma transfer */
};
/*
* bits in the scsi unit flags field
*/
#define SC_UNF_DVMA 0x0001 /* set if cur xfer requires dvma */
struct scsi_ctlr {
struct scsi_ha_reg *c_har; /* sc bus registers in i/o space */
struct scsi_si_reg *c_sir; /* si scsi ctlr logic regs */
struct scsi_cdb c_cdb; /* command description block */
struct scsi_scb c_scb; /* status completion block */
struct scsi_sense *c_sense; /* sense info on errors */
int c_flags; /* misc state flags */
struct scsi_unit *c_un; /* scsi unit using the bus */
struct scsi_ctlr_subr *c_ss; /* scsi device subroutines */
struct udc_table c_udct; /* scsi dma info for Sun3/50 */
struct buf *c_disqh; /* ptr to head of disconnect q */
struct buf *c_disqt; /* ptr to tail of disconnect q */
struct buf *c_flush; /* ptr to last element to flush */
};
/* misc controller flags */
#define SCSI_PRESENT 0x0001 /* scsi bus is alive */
#define SCSI_ONBOARD 0x0002 /* scsi logic is onboard */
#define SCSI_EN_RECON 0x0004 /* reconnect attempts are enabled */
#define SCSI_EN_DISCON 0x0008 /* disconnect attempts are enabled */
#define SCSI_FLUSH_DISQ 0x0010 /* flush disconnected tasks */
#define SCSI_FLUSHING 0x0020 /* flushing in progress */
/*
* Unit specific subroutines called from controllers.
*/
struct scsi_unit_subr {
int (*ss_attach)();
int (*ss_start)();
int (*ss_mkcdb)();
int (*ss_intr)();
int (*ss_unit_ptr)();
char *ss_devname;
};
/*
* Controller specific subroutines called from units.
*/
struct scsi_ctlr_subr {
int (*scs_ustart)();
int (*scs_start)();
int (*scs_done)();
int (*scs_cmd)();
int (*scs_getstat)();
int (*scs_cmd_wait)();
int (*scs_off)();
int (*scs_reset)();
int (*scs_dmacount)();
int (*scs_go)();
};
/*
* Defines for getting configuration parameters out of mb_device.
*/
#define TYPE(flags) (flags)
#define TARGET(slave) ((slave >> 3) & 07)
#define LUN(slave) (slave & 07)
#define SCSI_DISK 0
#define SCSI_TAPE 1
#define SCSI_FLOPPY 2
#define NUNIT 8 /* max nubmer of units per controller */
/*
* SCSI Error codes passed to device routines.
* The codes refer to SCSI general errors, not to device
* specific errors. Device specific errors are discovered
* by checking the sense data.
* The distinction between retryable and fatal is somewhat ad hoc.
*/
#define SE_NO_ERROR 0
#define SE_RETRYABLE 1
#define SE_FATAL 2
struct scsi_disk {
struct dk_map un_map[NLPART]; /* logical partitions */
struct dk_geom un_g; /* disk geometry */
};
struct scsi_tape {
int un_mspl; /* ptr to mode select param list */
int un_bufcnt; /* number of buffers in use */
int un_next_block; /* next record on tape */
int un_last_block; /* last record of file, if known */
short un_status; /* status from last sense */
short un_retry_ct; /* retry count */
short un_underruns; /* number of underruns */
char un_openf; /* tape is open */
char un_eof; /* eof seen but not sent to user */
char un_read_only; /* tape is read only */
char un_lastiow; /* last i/o was write */
char un_lastior; /* last i/o was read */
char un_reten_rewind; /* retension on next rewind */
char un_qic; /* qic format */
char un_ctype; /* controller type */
char un_reset_occurred; /* reset occured since last command */
char un_readmode; /* sysgen left in read mode */
char un_err_pending; /* illegal cmd error pending */
u_char un_last_cmd; /* last scsi command issued */
#ifdef sun2
char un_cipher_test; /* test for cipher drive in progres */
#endif
};
struct scsi_floppy {
u_char sf_flags;
u_char sf_mdb; /* media descriptor byte */
u_char sf_spt; /* sectors per track */
u_char sf_nhead; /* number of heads */
int sf_nblk; /* number of blocks on the disk */
};
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.