Annotation of 43BSDReno/sys/hpdev/scsireg.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1990 The Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * This code is derived from software contributed to Berkeley by
        !             6:  * Van Jacobson of Lawrence Berkeley Laboratory.
        !             7:  *
        !             8:  * Redistribution is only permitted until one year after the first shipment
        !             9:  * of 4.4BSD by the Regents.  Otherwise, redistribution and use in source and
        !            10:  * binary forms are permitted provided that: (1) source distributions retain
        !            11:  * this entire copyright notice and comment, and (2) distributions including
        !            12:  * binaries display the following acknowledgement:  This product includes
        !            13:  * software developed by the University of California, Berkeley and its
        !            14:  * contributors'' in the documentation or other materials provided with the
        !            15:  * distribution and in all advertising materials mentioning features or use
        !            16:  * of this software.  Neither the name of the University nor the names of
        !            17:  * its contributors may be used to endorse or promote products derived from
        !            18:  * this software without specific prior written permission.
        !            19:  * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            20:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            21:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            22:  *
        !            23:  *     @(#)scsireg.h   7.1 (Berkeley) 5/8/90
        !            24:  */
        !            25: 
        !            26: /*
        !            27:  * HP 98265A SCSI Interface Hardware Description.
        !            28:  */
        !            29: 
        !            30: struct scsidevice {
        !            31:        u_char  p0,  scsi_id;
        !            32: #define                        ID_MASK         0x1f
        !            33: #define                        SCSI_ID         0x07
        !            34: #define                        ID_WORD_DMA     0x20
        !            35:        u_char  p2,  scsi_csr;
        !            36: #define                        CSR_IE          0x80
        !            37: #define                        CSR_IR          0x40
        !            38: #define                        SCSI_IPL(csr)   ((((csr)>>4)&3)+3)
        !            39: #define                        CSR_DMA32       0x08
        !            40: #define                        CSR_DMAIN       0x04
        !            41: #define                        CSR_DE1         0x02
        !            42: #define                        CSR_DE0         0x01
        !            43:        u_char  p4,  scsi_wrap;
        !            44: #define                        WRAP_REQ        0x80
        !            45: #define                        WRAP_ACK        0x40
        !            46: #define                        WRAP_BSY        0x08
        !            47: #define                        WRAP_MSG        0x04
        !            48: #define                        WRAP_CD         0x02
        !            49: #define                        WRAP_IO         0x01
        !            50:        u_char  p6,  scsi_hconf;
        !            51: #define                        HCONF_TP        0x80
        !            52: #define                        SCSI_SYNC_XFER(hconf) (((hconf)>>5)&3)
        !            53: #define                        HCONF_SD        0x10
        !            54: #define                        HCONF_PARITY    0x08
        !            55:        u_char  p8[24];
        !            56:        u_char  p32, scsi_bdid;
        !            57:        u_char  p34, scsi_sctl;
        !            58: #define                        SCTL_DISABLE    0x80
        !            59: #define                        SCTL_CTRLRST    0x40
        !            60: #define                        SCTL_DIAG       0x20
        !            61: #define                        SCTL_ABRT_ENAB  0x10
        !            62: #define                        SCTL_PARITY_ENAB 0x08
        !            63: #define                        SCTL_SEL_ENAB   0x04
        !            64: #define                        SCTL_RESEL_ENAB 0x02
        !            65: #define                        SCTL_INTR_ENAB  0x01
        !            66:        u_char  p36, scsi_scmd;
        !            67: #define                        SCMD_RST        0x10
        !            68: #define                        SCMD_ICPT_XFR   0x08
        !            69: #define                        SCMD_PROG_XFR   0x04
        !            70: #define                        SCMD_PAD        0x01    /* if initiator */
        !            71: #define                        SCMD_PERR_STOP  0x01    /* if target */
        !            72:                        /* command codes */
        !            73: #define                        SCMD_BUS_REL    0x00
        !            74: #define                        SCMD_SELECT     0x20
        !            75: #define                        SCMD_RST_ATN    0x40
        !            76: #define                        SCMD_SET_ATN    0x60
        !            77: #define                        SCMD_XFR        0x80
        !            78: #define                        SCMD_XFR_PAUSE  0xa0
        !            79: #define                        SCMD_RST_ACK    0xc0
        !            80: #define                        SCMD_SET_ACK    0xe0
        !            81:        u_char  p38, scsi_tmod;
        !            82: #define                        TMOD_SYNC       0x80
        !            83:        u_char  p40, scsi_ints;
        !            84: #define                        INTS_SEL        0x80
        !            85: #define                        INTS_RESEL      0x40
        !            86: #define                        INTS_DISCON     0x20
        !            87: #define                        INTS_CMD_DONE   0x10
        !            88: #define                        INTS_SRV_REQ    0x08
        !            89: #define                        INTS_TIMEOUT    0x04
        !            90: #define                        INTS_HARD_ERR   0x02
        !            91: #define                        INTS_RST        0x01
        !            92:        u_char  p42, scsi_psns;
        !            93: #define                        PSNS_REQ        0x80
        !            94: #define                        PSNS_ACK        0x40
        !            95: #define                        PSNS_ATN        0x20
        !            96: #define                        PSNS_SEL        0x10
        !            97: #define                        PSNS_BSY        0x08
        !            98:        u_char  p44, scsi_ssts;
        !            99: #define                        SSTS_INITIATOR  0x80
        !           100: #define                        SSTS_TARGET     0x40
        !           101: #define                        SSTS_BUSY       0x20
        !           102: #define                        SSTS_XFR        0x10
        !           103: #define                        SSTS_ACTIVE     (SSTS_INITIATOR|SSTS_XFR)
        !           104: #define                        SSTS_RST        0x08
        !           105: #define                        SSTS_TCZERO     0x04
        !           106: #define                        SSTS_DREG_FULL  0x02
        !           107: #define                        SSTS_DREG_EMPTY 0x01
        !           108:        u_char  p46, scsi_serr;
        !           109: #define                        SERR_SCSI_PAR   0x80
        !           110: #define                        SERR_SPC_PAR    0x40
        !           111: #define                        SERR_TC_PAR     0x08
        !           112: #define                        SERR_PHASE_ERR  0x04
        !           113: #define                        SERR_SHORT_XFR  0x02
        !           114: #define                        SERR_OFFSET     0x01
        !           115:        u_char  p48, scsi_pctl;
        !           116: #define                        PCTL_BFINT_ENAB 0x80
        !           117:        u_char  p50, scsi_mbc;
        !           118:        u_char  p52, scsi_dreg;
        !           119:        u_char  p54, scsi_temp;
        !           120:        u_char  p56, scsi_tch;
        !           121:        u_char  p58, scsi_tcm;
        !           122:        u_char  p60, scsi_tcl;
        !           123:        u_char  p62, scsi_exbf;
        !           124: };
        !           125: 
        !           126: /* psns/pctl phase lines as bits */
        !           127: #define        PHASE_MSG       0x04
        !           128: #define        PHASE_CD        0x02            /* =1 if 'command' */
        !           129: #define        PHASE_IO        0x01            /* =1 if data inbound */
        !           130: /* Phase lines as values */
        !           131: #define        PHASE           0x07            /* mask for psns/pctl phase */
        !           132: #define        DATA_OUT_PHASE  0x00
        !           133: #define        DATA_IN_PHASE   0x01
        !           134: #define        CMD_PHASE       0x02
        !           135: #define        STATUS_PHASE    0x03
        !           136: #define        BUS_FREE_PHASE  0x04
        !           137: #define        ARB_SEL_PHASE   0x05    /* Fuji chip combines arbitration with sel. */
        !           138: #define        MESG_OUT_PHASE  0x06
        !           139: #define        MESG_IN_PHASE   0x07
        !           140: 
        !           141: /* SCSI Messages */
        !           142: 
        !           143: #define        MSG_CMD_COMPLETE        0x00
        !           144: #define MSG_EXT_MESSAGE                0x01
        !           145: #define        MSG_SAVE_DATA_PTR       0x02
        !           146: #define        MSG_RESTORE_PTR         0x03
        !           147: #define        MSG_DISCONNECT          0x04
        !           148: #define        MSG_INIT_DETECT_ERROR   0x05
        !           149: #define        MSG_ABORT               0x06
        !           150: #define        MSG_REJECT              0x07
        !           151: #define        MSG_NOOP                0x08
        !           152: #define        MSG_PARITY_ERROR        0x09
        !           153: #define        MSG_BUS_DEVICE_RESET    0x0C
        !           154: #define        MSG_IDENTIFY            0x80
        !           155: #define        MSG_IDENTIFY_DR         0xc0    /* (disconnect/reconnect allowed) */
        !           156: #define        MSG_SYNC_REQ            0x01
        !           157: 
        !           158: /* SCSI Commands */
        !           159: 
        !           160: #define CMD_TEST_UNIT_READY    0x00
        !           161: #define CMD_REQUEST_SENSE      0x03
        !           162: #define        CMD_INQUIRY             0x12
        !           163: #define CMD_SEND_DIAGNOSTIC    0x1D
        !           164: 
        !           165: #define CMD_FORMAT_UNIT                0x04
        !           166: #define CMD_REASSIGN_BLOCKS    0x07
        !           167: #define CMD_READ               0x08
        !           168: #define CMD_WRITE              0x0A
        !           169: #define CMD_MODE_SELECT                0x15
        !           170: #define CMD_RELEASE_UNIT       0x17
        !           171: #define CMD_MODE_SENSE         0x1A
        !           172: #define CMD_SEND_DIAG          0x1D
        !           173: #define CMD_READ_CAPACITY      0x25
        !           174: #define CMD_READ_EXT           0x28
        !           175: #define CMD_WRITE_EXT          0x2A
        !           176: #define CMD_READ_DEFECT_DATA   0x37
        !           177: #define                SD_MANUFAC_DEFECTS      0x14000000
        !           178: #define                SD_GROWN_DEFECTS        0x0c000000
        !           179: #define CMD_READ_BUFFER                0x3B
        !           180: #define CMD_WRITE_BUFFER       0x3C
        !           181: #define CMD_READ_FULL          0xF0
        !           182: #define CMD_MEDIA_TEST         0xF1
        !           183: #define CMD_ACCESS_LOG         0xF2
        !           184: #define CMD_WRITE_FULL         0xFC
        !           185: #define CMD_MANAGE_PRIMARY     0xFD
        !           186: #define CMD_EXECUTE_DATA       0xFE
        !           187: 
        !           188: /* SCSI status bits */
        !           189: 
        !           190: #define        STS_CHECKCOND   0x02    /* Check Condition (ie., read sense) */
        !           191: #define        STS_CONDMET     0x04    /* Condition Met (ie., search worked) */
        !           192: #define        STS_BUSY        0x08
        !           193: #define        STS_INTERMED    0x10    /* Intermediate status sent */
        !           194: #define        STS_EXT         0x80    /* Extended status valid */
        !           195: 
        !           196: /* command descriptor blocks */
        !           197: 
        !           198: struct scsi_cdb6 {
        !           199:        u_char  cmd;            /* command code */
        !           200:        u_char  lun:  3,        /* logical unit on ctlr */
        !           201:                lbah: 5;        /* msb of read/write logical block addr */
        !           202:        u_char  lbam;           /* middle byte of l.b.a. */
        !           203:        u_char  lbal;           /* lsb of l.b.a. */
        !           204:        u_char  len;            /* transfer length */
        !           205:        u_char  xtra;
        !           206: };
        !           207: 
        !           208: struct scsi_cdb10 {
        !           209:        u_char  cmd;            /* command code */
        !           210:        u_char  lun: 3,         /* logical unit on ctlr */
        !           211:                   : 4,
        !           212:                rel: 1;         /* l.b.a. is relative addr if =1 */
        !           213:        u_char  lbah;           /* msb of read/write logical block addr */
        !           214:        u_char  lbahm;          /* high middle byte of l.b.a. */
        !           215:        u_char  lbalm;          /* low middle byte of l.b.a. */
        !           216:        u_char  lbal;           /* lsb of l.b.a. */
        !           217:        u_char  reserved;
        !           218:        u_char  lenh;           /* msb transfer length */
        !           219:        u_char  lenl;           /* lsb transfer length */
        !           220:        u_char  xtra;
        !           221: };
        !           222: 
        !           223: /* basic sense data */
        !           224: 
        !           225: struct scsi_sense {
        !           226:        u_char  valid: 1,       /* l.b.a. is valid */
        !           227:                class: 3,
        !           228:                code:  4;
        !           229:        u_char  vu:    4,       /* vendor unique */
        !           230:                lbah:  4;
        !           231:        u_char  lbam;
        !           232:        u_char  lbal;
        !           233: };
        !           234: 
        !           235: struct scsi_xsense {
        !           236:        u_char  valid: 1,       /* l.b.a. is valid */
        !           237:                class: 3,
        !           238:                code:  4;
        !           239:        u_char  segment;
        !           240:        u_char  filemark: 1,
        !           241:                eom:      1,
        !           242:                ili:      1,    /* illegal length indicator */
        !           243:                rsvd:     1,
        !           244:                key:      4;
        !           245:        u_char  info1;
        !           246:        u_char  info2;
        !           247:        u_char  info3;
        !           248:        u_char  info4;
        !           249:        u_char  len;            /* additional sense length */
        !           250: };
        !           251: 
        !           252: /* inquiry data */
        !           253: struct scsi_inquiry {
        !           254:        u_char  type;
        !           255:        u_char  qual;
        !           256:        u_char  version;
        !           257:        u_char  rsvd;
        !           258:        u_char  len;
        !           259:        char    class[3];
        !           260:        char    vendor_id[8];
        !           261:        char    product_id[16];
        !           262:        char    rev[4];
        !           263: };
        !           264: 
        !           265: struct scsi_format_parms {             /* physical BFI format */
        !           266:        u_short reserved;
        !           267:        u_short list_len;
        !           268:        struct defect {
        !           269:                unsigned cyl  : 24;
        !           270:                unsigned head : 8;
        !           271:                long    bytes_from_index;
        !           272:        } defect[127];
        !           273: } format_parms;
        !           274: 
        !           275: struct scsi_reassign_parms {
        !           276:        u_short reserved;
        !           277:        u_short list_len;       /* length in bytes of defects only */
        !           278:        struct new_defect {
        !           279:                unsigned lba;   /* logical block address */
        !           280:        } new_defect[2];
        !           281: } reassign_parms;
        !           282: 
        !           283: struct scsi_modesel_hdr {
        !           284:        u_char  rsvd1;
        !           285:        u_char  media_type;
        !           286:        u_char  rsvd2;
        !           287:        u_char  block_desc_len;
        !           288:        u_int   density         : 8;
        !           289:        u_int   number_blocks   :24;
        !           290:        u_int   rsvd3           : 8;
        !           291:        u_int   block_length    :24;
        !           292: }; 
        !           293: 
        !           294: struct scsi_modesense_hdr {
        !           295:        u_char  len;
        !           296:        u_char  media_type;
        !           297:        u_char  wp    : 1;
        !           298:        u_char  rsvd1 : 7;
        !           299:        u_char  block_desc_len;
        !           300:        u_int   density         : 8;
        !           301:        u_int   number_blocks   :24;
        !           302:        u_int   rsvd2           : 8;
        !           303:        u_int   block_length    :24;
        !           304: }; 
        !           305: 
        !           306: /*
        !           307:  * Mode Select / Mode sense "pages"
        !           308:  */
        !           309: 
        !           310: /*
        !           311:  * Page One - Error Recovery Parameters 
        !           312:  */
        !           313: struct scsi_err_recovery {
        !           314:        u_char  page_savable    : 1;    /* save parameters */
        !           315:        u_char  reserved        : 1;
        !           316:        u_char  page_code       : 6;    /* = 0x01 */
        !           317:        u_char  page_length;            /* = 6 */
        !           318:        u_char  awre            : 1;    /* auto write realloc enabled */
        !           319:        u_char  arre            : 1;    /* auto read realloc enabled */
        !           320:        u_char  tb              : 1;    /* transfer block */
        !           321:        u_char  rc              : 1;    /* read continuous */
        !           322:        u_char  eec             : 1;    /* enable early correction */
        !           323:        u_char  per             : 1;    /* post error */
        !           324:        u_char  dte             : 1;    /* disable transfer on error */
        !           325:        u_char  dcr             : 1;    /* disable correction */
        !           326:        u_char  retry_count;
        !           327:        u_char  correction_span;
        !           328:        u_char  head_offset_count;
        !           329:        u_char  strobe_offset_count;
        !           330:        u_char  recovery_time_limit;
        !           331: };
        !           332: 
        !           333: /*
        !           334:  * Page Two - Disconnect / Reconnect Control Parameters
        !           335:  */
        !           336: struct scsi_disco_reco {
        !           337:        u_char  page_savable    : 1;    /* save parameters */
        !           338:        u_char  rsvd            : 1;
        !           339:        u_char  page_code       : 6;    /* = 0x02 */
        !           340:        u_char  page_length;            /* = 10 */
        !           341:        u_char  buffer_full_ratio;      /* write, how full before reconnect? */
        !           342:        u_char  buffer_empty_ratio;     /* read, how full before reconnect? */
        !           343: 
        !           344:        u_short bus_inactivity_limit;   /* how much bus time for busy */
        !           345:        u_short disconnect_time_limit;  /* min to remain disconnected */
        !           346:        u_short connect_time_limit;     /* min to remain connected */
        !           347:        u_short reserved_1;
        !           348: };
        !           349: 
        !           350: /*
        !           351:  * Page Three - Direct Access Device Format Parameters
        !           352:  */
        !           353: struct scsi_format {
        !           354:        u_char  page_savable    : 1;    /* save parameters */
        !           355:        u_char  rsvd            : 1;
        !           356:        u_char  page_code       : 6;    /* = 0x03 */
        !           357:        u_char  page_length;            /* = 22 */
        !           358:        u_short tracks_per_zone;        /*  Handling of Defects Fields */
        !           359:        u_short alt_sect_zone;
        !           360:        u_short alt_tracks_zone;
        !           361:        u_short alt_tracks_vol;
        !           362:        u_short sect_track;             /* Track Format Field */
        !           363:        u_short data_sect;              /* Sector Format Fields */
        !           364:        u_short interleave;
        !           365:        u_short track_skew_factor;
        !           366:        u_short cyl_skew_factor;
        !           367:        u_char  ssec            : 1;    /* Drive Type Field */
        !           368:        u_char  hsec            : 1;
        !           369:        u_char  rmb             : 1;
        !           370:        u_char  surf            : 1;
        !           371:        u_char  ins             : 1;
        !           372:        u_char  reserved_1      : 3;
        !           373:        u_char  reserved_2;
        !           374:        u_char  reserved_3;
        !           375:        u_char  reserved_4;
        !           376: };
        !           377: 
        !           378: /*
        !           379:  * Page Four - Rigid Disk Drive Geometry Parameters 
        !           380:  */
        !           381: struct scsi_geometry {
        !           382:        u_char  page_savable    : 1;    /* save parameters */
        !           383:        u_char  rsvd            : 1;
        !           384:        u_char  page_code       : 6;    /* = 0x04 */
        !           385:        u_char  page_length;            /* = 18 */
        !           386:        u_char  cyl_ub;                 /* number of cylinders */
        !           387:        u_char  cyl_mb;
        !           388:        u_char  cyl_lb;
        !           389:        u_char  heads;                  /* number of heads */
        !           390:        u_char  precomp_cyl_ub;         /* cylinder to start precomp */
        !           391:        u_char  precomp_cyl_mb;
        !           392:        u_char  precomp_cyl_lb;
        !           393:        u_char  current_cyl_ub;         /* cyl to start reduced current */
        !           394:        u_char  current_cyl_mb;
        !           395:        u_char  current_cyl_lb;
        !           396:        u_short step_rate;              /* drive step rate */
        !           397:        u_char  landing_cyl_ub;         /* landing zone cylinder */
        !           398:        u_char  landing_cyl_mb;
        !           399:        u_char  landing_cyl_lb;
        !           400:        u_char  reserved_1;
        !           401:        u_char  reserved_2;
        !           402:        u_char  reserved_3;
        !           403: };
        !           404: 
        !           405: /*
        !           406:  * Page 0x38 - Cache Control Parameters
        !           407:  */
        !           408: struct scsi_cache {
        !           409:        u_char  page_savable    : 1;    /* save parameters */
        !           410:        u_char  rsvd            : 1;
        !           411:        u_char  page_code       : 6;    /* = 0x38 */
        !           412:        u_char  page_length;            /* = 14 */
        !           413:        u_char rsvd_1   : 1;
        !           414:        u_char wie      : 1;            /* write index enable */
        !           415:        u_char rsvd_2   : 1;
        !           416:        u_char ce       : 1;            /* cache enable */
        !           417:        u_char table_size : 4;
        !           418:        u_char  prefetch_threshold;
        !           419:        u_char  maximum_threshold;
        !           420:        u_char  maximumprefetch_multiplier;
        !           421:        u_char  minimum_threshold;
        !           422:        u_char  minimum_prefetch_multiplier;
        !           423:        u_char  reserved[8];
        !           424: };
        !           425: 
        !           426: /*
        !           427:  * Driver ioctl's for various scsi operations.
        !           428:  */
        !           429: #ifndef _IOCTL_
        !           430: #include "ioctl.h"
        !           431: #endif
        !           432: 
        !           433: /*
        !           434:  * Control for SCSI "format" mode.
        !           435:  *
        !           436:  * "Format" mode allows a privileged process to issue direct SCSI
        !           437:  * commands to a drive (it is intended primarily to allow on-line
        !           438:  * formatting).  SDIOCSFORMAT with a non-zero arg will put the drive
        !           439:  * into format mode; a zero arg will take it out.  When in format
        !           440:  * mode, only the process that issued the SDIOCFORMAT can read or
        !           441:  * write the drive.
        !           442:  *
        !           443:  * In format mode, process is expected to
        !           444:  *     - do SDIOCSCSICOMMAND to supply cdb for next SCSI op
        !           445:  *     - do read or write as appropriate for cdb
        !           446:  *     - if i/o error, optionally do SDIOCSENSE to get completion
        !           447:  *       status and sense data from last scsi operation.
        !           448:  */
        !           449: 
        !           450: struct scsi_fmt_cdb {
        !           451:        int len;                /* cdb length (in bytes) */
        !           452:        u_char cdb[28];         /* cdb to use on next read/write */
        !           453: };
        !           454: 
        !           455: struct scsi_fmt_sense {
        !           456:        u_int status;           /* completion status of last op */
        !           457:        u_char sense[28];       /* sense data (if any) from last op */
        !           458: };
        !           459: 
        !           460: #define        SDIOCSFORMAT            _IOW('S', 0x1, int)
        !           461: #define        SDIOCGFORMAT            _IOR('S', 0x2, int)
        !           462: #define        SDIOCSCSICOMMAND        _IOW('S', 0x3, struct scsi_fmt_cdb)
        !           463: #define        SDIOCSENSE              _IOR('S', 0x4, struct scsi_fmt_sense)

unix.superglobalmegacorp.com

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