Annotation of researchv9/sys/sundev/scsi.h, revision 1.1

1.1     ! root        1: /*     @(#)scsi.h 1.1 86/02/03 SMI     */
        !             2: 
        !             3: /*
        !             4:  * Copyright (c) 1983 by Sun Microsystems, Inc.
        !             5:  */
        !             6: 
        !             7: /*
        !             8:  * Standard SCSI control blocks.
        !             9:  * These go in or out over the SCSI bus.
        !            10:  */
        !            11: struct scsi_cdb {              /* scsi command description block */
        !            12:        u_char  cmd;            /* command code */
        !            13:        u_char  lun       : 3;  /* logical unit number */
        !            14:        u_char  high_addr : 5;  /* high part of address */
        !            15:        u_char  mid_addr;       /* middle part of address */
        !            16:        u_char  low_addr;       /* low part of address */
        !            17:        u_char  count;          /* block count */
        !            18:        u_char  vu_57     : 1;  /* vendor unique (byte 5 bit 7) */
        !            19:        u_char  vu_56     : 1;  /* vendor unique (byte 5 bit 6) */
        !            20:        u_char            : 4;  /* reserved */
        !            21:        u_char  fr        : 1;  /* flag request (interrupt at completion) */
        !            22:        u_char  link      : 1;  /* link (another command follows) */
        !            23: };
        !            24: 
        !            25: /*
        !            26:  * defines for SCSI tape cdb.
        !            27:  */
        !            28: #define        t_code          high_addr
        !            29: #define        high_count      mid_addr
        !            30: #define        mid_count       low_addr
        !            31: #define low_count      count
        !            32: 
        !            33: struct scsi_scb {              /* scsi status completion block */
        !            34:        /* byte 0 */
        !            35:        u_char  ext_st1 : 1;    /* extended status (next byte valid) */
        !            36:        u_char  vu_06   : 1;    /* vendor unique */
        !            37:        u_char  vu_05   : 1;    /* vendor unique */
        !            38:        u_char  is      : 1;    /* intermediate status sent */
        !            39:        u_char  busy    : 1;    /* device busy or reserved */
        !            40:        u_char  cm      : 1;    /* condition met */
        !            41:        u_char  chk     : 1;    /* check condition: sense data available */
        !            42:        u_char  vu_00   : 1;    /* vendor unique */
        !            43:        /* byte 1 */
        !            44:        u_char  ext_st2 : 1;    /* extended status (next byte valid) */
        !            45:        u_char  reserved: 6;    /* reserved */
        !            46:        u_char  ha_er   : 1;    /* host adapter detected error */
        !            47:        /* byte 2 */
        !            48:        u_char  byte2;          /* third byte */
        !            49: };
        !            50: 
        !            51: struct scsi_sense {            /* scsi sense for error classes 0-6 */
        !            52:        u_char  adr_val : 1;    /* sense data is valid */
        !            53:        u_char  class   : 3;    /* error class (0-6) */
        !            54:        u_char  code    : 4;    /* error code */
        !            55:        u_char  high_addr;      /* high byte of block addr */
        !            56:        u_char  mid_addr;       /* middle byte of block addr */
        !            57:        u_char  low_addr;       /* low byte of block addr */
        !            58:        u_char  extra[12];      /* pad this struct so it can hold max num */
        !            59:                                /* of sense bytes we may receive */
        !            60: };
        !            61: 
        !            62: struct scsi_ext_sense {        /* scsi extended sense for error class 7 */
        !            63:        /* byte 0 */
        !            64:        u_char  adr_val : 1;    /* sense data is valid */
        !            65:        u_char          : 7;    /* fixed at binary 1110000 */
        !            66:        u_char  seg_num;        /* segment number, applies to copy cmd only */
        !            67:        /* byte 2 */
        !            68:        u_char  fil_mk  : 1;    /* file mark on device */
        !            69:        u_char  eom     : 1;    /* end of media */
        !            70:        u_char  ili     : 1;    /* incorrect length indicator */
        !            71:        u_char          : 1;    /* reserved */
        !            72:        u_char  key     : 4;    /* sense key, see below */
        !            73:        u_char  info_1;         /* information byte 1 */
        !            74:        u_char  info_2;         /* information byte 2 */
        !            75:        u_char  info_3;         /* information byte 3 */
        !            76:        u_char  info_4;         /* information byte 4 */
        !            77:        u_char  add_len;        /* number of additional bytes */
        !            78:        /* additional bytes follow, if any */
        !            79: };
        !            80:        
        !            81: /* 
        !            82:  * Sense key values for extended sense.
        !            83:  */
        !            84: #define        SC_NO_SENSE             0x0
        !            85: #define        SC_RECOVERABLE_ERROR    0x1
        !            86: #define        SC_NOT_READY            0x2
        !            87: #define        SC_MEDIUM_ERROR         0x3
        !            88: #define        SC_HARDWARE_ERROR       0x4
        !            89: #define        SC_ILLEGAL_REQUEST      0x5
        !            90: #define        SC_UNIT_ATTENTION       0x6
        !            91: #define        SC_DATA_PROTECT         0x7
        !            92: #define        SC_BLANK_CHECK          0x8
        !            93: #define        SC_VENDOR_UNIQUE        0x9
        !            94: #define        SC_COPY_ABORTED         0xa
        !            95: #define        SC_ABORT_COMMAND        0xb
        !            96: #define        SC_EQUAL                0xc
        !            97: #define        SC_VOLUME_OVERFLOW      0xd
        !            98: #define SC_MISCOMPARE          0xe
        !            99: #define SC_RESERVED            0xf
        !           100: 
        !           101: /*
        !           102:  * SCSI Operation codes. 
        !           103:  */
        !           104: #define        SC_TEST_UNIT_READY      0x00
        !           105: #define        SC_REZERO_UNIT          0x01
        !           106: #define        SC_REQUEST_SENSE        0x03
        !           107: #define        SC_READ                 0x08
        !           108: #define        SC_WRITE                0x0a
        !           109: #define        SC_SEEK                 0x0b
        !           110: 
        !           111: /*
        !           112:  * Messages that SCSI can send.
        !           113:  */
        !           114: #define        SC_COMMAND_COMPLETE     0x00
        !           115: #define SC_SAVE_DATA_PTR       0x02
        !           116: #define SC_RESTORE_PTRS                0x03
        !           117: #define SC_DISCONNECT          0x04
        !           118: #define SC_IDENTIFY            0x80
        !           119: #define SC_DR_IDENTIFY         0xc0
        !           120: 
        !           121: #define        MORE_STATUS 0x80        /* More status flag */
        !           122: #define        STATUS_LEN  3           /* Max status len for SCSI */
        !           123: 
        !           124: #define        cdbaddr(cdb, addr)      (cdb)->high_addr = (addr) >> 16;\
        !           125:                                (cdb)->mid_addr = ((addr) >> 8) & 0xFF;\
        !           126:                                (cdb)->low_addr = (addr) & 0xFF
        !           127: 
        !           128: 
        !           129: #define NLPART NDKMAP          /* number of logical partitions (8) */
        !           130: 
        !           131: /*
        !           132:  * SCSI unit block.
        !           133:  */
        !           134: struct scsi_unit {
        !           135:        char    un_target;              /* scsi bus address of controller */
        !           136:        char    un_lun;                 /* logical unit number of device */
        !           137:        char    un_present;             /* unit is present */
        !           138:        u_char  un_scmd;                /* special command */
        !           139:        u_short un_unit;                /* real unit number of device */
        !           140:        struct  scsi_unit_subr *un_ss;  /* scsi device subroutines */
        !           141:        struct  scsi_ctlr *un_c;        /* scsi ctlr */
        !           142:        struct  mb_device *un_md;       /* mb device */
        !           143:        struct  mb_ctlr *un_mc;         /* mb controller */
        !           144:        struct  buf un_utab;            /* queue of requests */
        !           145:        struct  buf un_sbuf;            /* fake buffer for special commands */
        !           146:        struct  buf un_rbuf;            /* buffer for raw i/o */
        !           147:        /* current transfer: */
        !           148:        u_short un_flags;               /* misc flags relating to cur xfer */
        !           149:        int     un_baddr;               /* virtual buffer address */
        !           150:        daddr_t un_blkno;               /* current block */
        !           151:        short   un_sec_left;            /* sector count for single sectors */
        !           152:        short   un_cmd;                 /* command (for cdb) */
        !           153:        short   un_count;               /* num sectors to xfer (for cdb) */
        !           154:        int     un_dma_addr;            /* dma address */
        !           155:        u_short un_dma_count;           /* byte count expected */
        !           156:        short   un_retries;             /* retry count */
        !           157:        short   un_restores;            /* restore count */
        !           158:        char    un_wantint;             /* expecting interrupt */
        !           159:        /* the following save current dma information in case of disconnect */
        !           160:        int     un_dma_curaddr;         /* current addr to start dma to/from */
        !           161:        u_short un_dma_curcnt;          /* current dma count */
        !           162:        u_short un_dma_curdir;          /* direction of dma transfer */
        !           163: };
        !           164: 
        !           165: /* 
        !           166:  * bits in the scsi unit flags field
        !           167:  */
        !           168: #define SC_UNF_DVMA    0x0001          /* set if cur xfer requires dvma */
        !           169: 
        !           170: struct scsi_ctlr {
        !           171:        struct  scsi_ha_reg *c_har;     /* sc bus registers in i/o space */
        !           172:        struct  scsi_si_reg *c_sir;     /* si scsi ctlr logic regs */
        !           173:        struct  scsi_cdb c_cdb;         /* command description block */
        !           174:        struct  scsi_scb c_scb;         /* status completion block */
        !           175:        struct  scsi_sense *c_sense;    /* sense info on errors */
        !           176:        int     c_flags;                /* misc state flags */
        !           177:        struct  scsi_unit *c_un;        /* scsi unit using the bus */
        !           178:        struct  scsi_ctlr_subr *c_ss;   /* scsi device subroutines */
        !           179:        struct  udc_table c_udct;       /* scsi dma info for Sun3/50 */
        !           180:        struct  buf *c_disqh;           /* ptr to head of disconnect q */
        !           181:        struct  buf *c_disqt;           /* ptr to tail of disconnect q */
        !           182:        struct  buf *c_flush;           /* ptr to last element to flush */
        !           183: };
        !           184: 
        !           185: /* misc controller flags */
        !           186: #define SCSI_PRESENT   0x0001          /* scsi bus is alive */
        !           187: #define SCSI_ONBOARD   0x0002          /* scsi logic is onboard */
        !           188: #define SCSI_EN_RECON  0x0004          /* reconnect attempts are enabled */
        !           189: #define SCSI_EN_DISCON 0x0008          /* disconnect attempts are enabled */
        !           190: #define SCSI_FLUSH_DISQ        0x0010          /* flush disconnected tasks */
        !           191: #define SCSI_FLUSHING  0x0020          /* flushing in progress */
        !           192: 
        !           193: /* 
        !           194:  * Unit specific subroutines called from controllers.
        !           195:  */
        !           196: struct scsi_unit_subr {
        !           197:        int     (*ss_attach)();
        !           198:        int     (*ss_start)();
        !           199:        int     (*ss_mkcdb)();
        !           200:        int     (*ss_intr)();
        !           201:        int     (*ss_unit_ptr)();
        !           202:        char    *ss_devname;
        !           203: };
        !           204: 
        !           205: /* 
        !           206:  * Controller specific subroutines called from units.
        !           207:  */
        !           208: struct scsi_ctlr_subr {
        !           209:        int     (*scs_ustart)();
        !           210:        int     (*scs_start)();
        !           211:        int     (*scs_done)();
        !           212:        int     (*scs_cmd)();
        !           213:        int     (*scs_getstat)();
        !           214:        int     (*scs_cmd_wait)();
        !           215:        int     (*scs_off)();
        !           216:        int     (*scs_reset)();
        !           217:        int     (*scs_dmacount)();
        !           218:        int     (*scs_go)();
        !           219: };
        !           220: 
        !           221: /*
        !           222:  * Defines for getting configuration parameters out of mb_device.
        !           223:  */
        !           224: #define        TYPE(flags)     (flags)
        !           225: #define TARGET(slave)  ((slave >> 3) & 07)
        !           226: #define LUN(slave)     (slave & 07)
        !           227: 
        !           228: #define SCSI_DISK      0
        !           229: #define SCSI_TAPE      1
        !           230: #define SCSI_FLOPPY    2
        !           231: 
        !           232: #define NUNIT          8       /* max nubmer of units per controller */
        !           233: 
        !           234: /*
        !           235:  * SCSI Error codes passed to device routines.
        !           236:  * The codes refer to SCSI general errors, not to device
        !           237:  * specific errors.  Device specific errors are discovered
        !           238:  * by checking the sense data.
        !           239:  * The distinction between retryable and fatal is somewhat ad hoc.
        !           240:  */
        !           241: #define        SE_NO_ERROR     0
        !           242: #define        SE_RETRYABLE    1
        !           243: #define        SE_FATAL        2
        !           244: 
        !           245: struct scsi_disk {
        !           246:        struct  dk_map un_map[NLPART];  /* logical partitions */
        !           247:        struct  dk_geom un_g;           /* disk geometry */
        !           248: };
        !           249: 
        !           250: struct scsi_tape {
        !           251:        int     un_mspl;                /* ptr to mode select param list */
        !           252:        int     un_bufcnt;              /* number of buffers in use */
        !           253:        int     un_next_block;          /* next record on tape */
        !           254:        int     un_last_block;          /* last record of file, if known */
        !           255:        short   un_status;              /* status from last sense */
        !           256:        short   un_retry_ct;            /* retry count */
        !           257:        short   un_underruns;           /* number of underruns */
        !           258:        char    un_openf;               /* tape is open */
        !           259:        char    un_eof;                 /* eof seen but not sent to user */
        !           260:        char    un_read_only;           /* tape is read only */
        !           261:        char    un_lastiow;             /* last i/o was write */
        !           262:        char    un_lastior;             /* last i/o was read */
        !           263:        char    un_reten_rewind;        /* retension on next rewind */
        !           264:        char    un_qic;                 /* qic format */
        !           265:        char    un_ctype;               /* controller type */
        !           266:        char    un_reset_occurred;      /* reset occured since last command */
        !           267:        char    un_readmode;            /* sysgen left in read mode */
        !           268:        char    un_err_pending;         /* illegal cmd error pending */
        !           269:        u_char  un_last_cmd;            /* last scsi command issued */
        !           270: #ifdef sun2
        !           271:        char    un_cipher_test;         /* test for cipher drive in progres */
        !           272: #endif
        !           273: };
        !           274: 
        !           275: struct scsi_floppy {
        !           276:        u_char  sf_flags;
        !           277:        u_char  sf_mdb;                 /* media descriptor byte */
        !           278:        u_char  sf_spt;                 /* sectors per track */
        !           279:        u_char  sf_nhead;               /* number of heads */
        !           280:        int     sf_nblk;                /* number of blocks on the disk */
        !           281: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.