16df4657fSmckusick /* 2*9639f1d4Sbostic * Copyright (c) 1990, 1993 3*9639f1d4Sbostic * The Regents of the University of California. All rights reserved. 46df4657fSmckusick * 56df4657fSmckusick * This code is derived from software contributed to Berkeley by 66df4657fSmckusick * Van Jacobson of Lawrence Berkeley Laboratory. 76df4657fSmckusick * 86df4657fSmckusick * %sccs.include.redist.c% 96df4657fSmckusick * 10*9639f1d4Sbostic * @(#)scsireg.h 8.1 (Berkeley) 06/10/93 116df4657fSmckusick */ 126df4657fSmckusick 136df4657fSmckusick /* 146df4657fSmckusick * HP 98265A SCSI Interface Hardware Description. 156df4657fSmckusick */ 166df4657fSmckusick 176df4657fSmckusick struct scsidevice { 186df4657fSmckusick u_char p0, scsi_id; 196df4657fSmckusick #define ID_MASK 0x1f 206df4657fSmckusick #define SCSI_ID 0x07 216df4657fSmckusick #define ID_WORD_DMA 0x20 226df4657fSmckusick u_char p2, scsi_csr; 236df4657fSmckusick #define CSR_IE 0x80 246df4657fSmckusick #define CSR_IR 0x40 256df4657fSmckusick #define SCSI_IPL(csr) ((((csr)>>4)&3)+3) 266df4657fSmckusick #define CSR_DMA32 0x08 276df4657fSmckusick #define CSR_DMAIN 0x04 286df4657fSmckusick #define CSR_DE1 0x02 296df4657fSmckusick #define CSR_DE0 0x01 306df4657fSmckusick u_char p4, scsi_wrap; 316df4657fSmckusick #define WRAP_REQ 0x80 326df4657fSmckusick #define WRAP_ACK 0x40 336df4657fSmckusick #define WRAP_BSY 0x08 346df4657fSmckusick #define WRAP_MSG 0x04 356df4657fSmckusick #define WRAP_CD 0x02 366df4657fSmckusick #define WRAP_IO 0x01 376df4657fSmckusick u_char p6, scsi_hconf; 386df4657fSmckusick #define HCONF_TP 0x80 396df4657fSmckusick #define SCSI_SYNC_XFER(hconf) (((hconf)>>5)&3) 406df4657fSmckusick #define HCONF_SD 0x10 416df4657fSmckusick #define HCONF_PARITY 0x08 426df4657fSmckusick u_char p8[24]; 436df4657fSmckusick u_char p32, scsi_bdid; 446df4657fSmckusick u_char p34, scsi_sctl; 456df4657fSmckusick #define SCTL_DISABLE 0x80 466df4657fSmckusick #define SCTL_CTRLRST 0x40 476df4657fSmckusick #define SCTL_DIAG 0x20 486df4657fSmckusick #define SCTL_ABRT_ENAB 0x10 496df4657fSmckusick #define SCTL_PARITY_ENAB 0x08 506df4657fSmckusick #define SCTL_SEL_ENAB 0x04 516df4657fSmckusick #define SCTL_RESEL_ENAB 0x02 526df4657fSmckusick #define SCTL_INTR_ENAB 0x01 536df4657fSmckusick u_char p36, scsi_scmd; 546df4657fSmckusick #define SCMD_RST 0x10 556df4657fSmckusick #define SCMD_ICPT_XFR 0x08 566df4657fSmckusick #define SCMD_PROG_XFR 0x04 576df4657fSmckusick #define SCMD_PAD 0x01 /* if initiator */ 586df4657fSmckusick #define SCMD_PERR_STOP 0x01 /* if target */ 596df4657fSmckusick /* command codes */ 606df4657fSmckusick #define SCMD_BUS_REL 0x00 616df4657fSmckusick #define SCMD_SELECT 0x20 626df4657fSmckusick #define SCMD_RST_ATN 0x40 636df4657fSmckusick #define SCMD_SET_ATN 0x60 646df4657fSmckusick #define SCMD_XFR 0x80 656df4657fSmckusick #define SCMD_XFR_PAUSE 0xa0 666df4657fSmckusick #define SCMD_RST_ACK 0xc0 676df4657fSmckusick #define SCMD_SET_ACK 0xe0 686df4657fSmckusick u_char p38, scsi_tmod; 696df4657fSmckusick #define TMOD_SYNC 0x80 706df4657fSmckusick u_char p40, scsi_ints; 716df4657fSmckusick #define INTS_SEL 0x80 726df4657fSmckusick #define INTS_RESEL 0x40 736df4657fSmckusick #define INTS_DISCON 0x20 746df4657fSmckusick #define INTS_CMD_DONE 0x10 756df4657fSmckusick #define INTS_SRV_REQ 0x08 766df4657fSmckusick #define INTS_TIMEOUT 0x04 776df4657fSmckusick #define INTS_HARD_ERR 0x02 786df4657fSmckusick #define INTS_RST 0x01 796df4657fSmckusick u_char p42, scsi_psns; 806df4657fSmckusick #define PSNS_REQ 0x80 816df4657fSmckusick #define PSNS_ACK 0x40 826df4657fSmckusick #define PSNS_ATN 0x20 836df4657fSmckusick #define PSNS_SEL 0x10 846df4657fSmckusick #define PSNS_BSY 0x08 856df4657fSmckusick u_char p44, scsi_ssts; 866df4657fSmckusick #define SSTS_INITIATOR 0x80 876df4657fSmckusick #define SSTS_TARGET 0x40 886df4657fSmckusick #define SSTS_BUSY 0x20 896df4657fSmckusick #define SSTS_XFR 0x10 906df4657fSmckusick #define SSTS_ACTIVE (SSTS_INITIATOR|SSTS_XFR) 916df4657fSmckusick #define SSTS_RST 0x08 926df4657fSmckusick #define SSTS_TCZERO 0x04 936df4657fSmckusick #define SSTS_DREG_FULL 0x02 946df4657fSmckusick #define SSTS_DREG_EMPTY 0x01 956df4657fSmckusick u_char p46, scsi_serr; 966df4657fSmckusick #define SERR_SCSI_PAR 0x80 976df4657fSmckusick #define SERR_SPC_PAR 0x40 986df4657fSmckusick #define SERR_TC_PAR 0x08 996df4657fSmckusick #define SERR_PHASE_ERR 0x04 1006df4657fSmckusick #define SERR_SHORT_XFR 0x02 1016df4657fSmckusick #define SERR_OFFSET 0x01 1026df4657fSmckusick u_char p48, scsi_pctl; 1036df4657fSmckusick #define PCTL_BFINT_ENAB 0x80 1046df4657fSmckusick u_char p50, scsi_mbc; 1056df4657fSmckusick u_char p52, scsi_dreg; 1066df4657fSmckusick u_char p54, scsi_temp; 1076df4657fSmckusick u_char p56, scsi_tch; 1086df4657fSmckusick u_char p58, scsi_tcm; 1096df4657fSmckusick u_char p60, scsi_tcl; 1106df4657fSmckusick u_char p62, scsi_exbf; 1116df4657fSmckusick }; 1126df4657fSmckusick 1136df4657fSmckusick /* psns/pctl phase lines as bits */ 1146df4657fSmckusick #define PHASE_MSG 0x04 1156df4657fSmckusick #define PHASE_CD 0x02 /* =1 if 'command' */ 1166df4657fSmckusick #define PHASE_IO 0x01 /* =1 if data inbound */ 1176df4657fSmckusick /* Phase lines as values */ 1186df4657fSmckusick #define PHASE 0x07 /* mask for psns/pctl phase */ 1196df4657fSmckusick #define DATA_OUT_PHASE 0x00 1206df4657fSmckusick #define DATA_IN_PHASE 0x01 1216df4657fSmckusick #define CMD_PHASE 0x02 1226df4657fSmckusick #define STATUS_PHASE 0x03 1236df4657fSmckusick #define BUS_FREE_PHASE 0x04 1246df4657fSmckusick #define ARB_SEL_PHASE 0x05 /* Fuji chip combines arbitration with sel. */ 1256df4657fSmckusick #define MESG_OUT_PHASE 0x06 1266df4657fSmckusick #define MESG_IN_PHASE 0x07 1276df4657fSmckusick 1286df4657fSmckusick /* SCSI Messages */ 1296df4657fSmckusick 1306df4657fSmckusick #define MSG_CMD_COMPLETE 0x00 1316df4657fSmckusick #define MSG_EXT_MESSAGE 0x01 1326df4657fSmckusick #define MSG_SAVE_DATA_PTR 0x02 1336df4657fSmckusick #define MSG_RESTORE_PTR 0x03 1346df4657fSmckusick #define MSG_DISCONNECT 0x04 1356df4657fSmckusick #define MSG_INIT_DETECT_ERROR 0x05 1366df4657fSmckusick #define MSG_ABORT 0x06 1376df4657fSmckusick #define MSG_REJECT 0x07 1386df4657fSmckusick #define MSG_NOOP 0x08 1396df4657fSmckusick #define MSG_PARITY_ERROR 0x09 1406df4657fSmckusick #define MSG_BUS_DEVICE_RESET 0x0C 1416df4657fSmckusick #define MSG_IDENTIFY 0x80 1426df4657fSmckusick #define MSG_IDENTIFY_DR 0xc0 /* (disconnect/reconnect allowed) */ 1436df4657fSmckusick #define MSG_SYNC_REQ 0x01 1446df4657fSmckusick 1456df4657fSmckusick /* SCSI Commands */ 1466df4657fSmckusick 1476df4657fSmckusick #define CMD_TEST_UNIT_READY 0x00 1486df4657fSmckusick #define CMD_REQUEST_SENSE 0x03 1496df4657fSmckusick #define CMD_INQUIRY 0x12 1506df4657fSmckusick #define CMD_SEND_DIAGNOSTIC 0x1D 1516df4657fSmckusick 1520b11f2d6Smckusick #define CMD_REWIND 0x01 153efa5eaeeShibler #define CMD_REZERO 0x01 1546df4657fSmckusick #define CMD_FORMAT_UNIT 0x04 1550b11f2d6Smckusick #define CMD_READ_BLOCK_LIMITS 0x05 1566df4657fSmckusick #define CMD_REASSIGN_BLOCKS 0x07 1576df4657fSmckusick #define CMD_READ 0x08 1586df4657fSmckusick #define CMD_WRITE 0x0A 1590b11f2d6Smckusick #define CMD_WRITE_FILEMARK 0x10 1600b11f2d6Smckusick #define CMD_SPACE 0x11 1616df4657fSmckusick #define CMD_MODE_SELECT 0x15 1626df4657fSmckusick #define CMD_RELEASE_UNIT 0x17 1630b11f2d6Smckusick #define CMD_ERASE 0x19 1646df4657fSmckusick #define CMD_MODE_SENSE 0x1A 1650b11f2d6Smckusick #define CMD_LOADUNLOAD 0x1B 1660b11f2d6Smckusick #define CMD_RECEIVE_DIAG 0x1C 1676df4657fSmckusick #define CMD_SEND_DIAG 0x1D 1680b11f2d6Smckusick #define CMD_P_A_MEDIA_REMOVAL 0x1E 1696df4657fSmckusick #define CMD_READ_CAPACITY 0x25 1706df4657fSmckusick #define CMD_READ_EXT 0x28 1716df4657fSmckusick #define CMD_WRITE_EXT 0x2A 1726df4657fSmckusick #define CMD_READ_DEFECT_DATA 0x37 1736df4657fSmckusick #define SD_MANUFAC_DEFECTS 0x14000000 1746df4657fSmckusick #define SD_GROWN_DEFECTS 0x0c000000 1756df4657fSmckusick #define CMD_READ_BUFFER 0x3B 1766df4657fSmckusick #define CMD_WRITE_BUFFER 0x3C 1776df4657fSmckusick #define CMD_READ_FULL 0xF0 1786df4657fSmckusick #define CMD_MEDIA_TEST 0xF1 1796df4657fSmckusick #define CMD_ACCESS_LOG 0xF2 1806df4657fSmckusick #define CMD_WRITE_FULL 0xFC 1816df4657fSmckusick #define CMD_MANAGE_PRIMARY 0xFD 1826df4657fSmckusick #define CMD_EXECUTE_DATA 0xFE 1836df4657fSmckusick 1846df4657fSmckusick /* SCSI status bits */ 1856df4657fSmckusick 1866df4657fSmckusick #define STS_CHECKCOND 0x02 /* Check Condition (ie., read sense) */ 1876df4657fSmckusick #define STS_CONDMET 0x04 /* Condition Met (ie., search worked) */ 1886df4657fSmckusick #define STS_BUSY 0x08 1896df4657fSmckusick #define STS_INTERMED 0x10 /* Intermediate status sent */ 1906df4657fSmckusick #define STS_EXT 0x80 /* Extended status valid */ 1916df4657fSmckusick 1926df4657fSmckusick /* command descriptor blocks */ 1936df4657fSmckusick 1946df4657fSmckusick struct scsi_cdb6 { 1956df4657fSmckusick u_char cmd; /* command code */ 1966df4657fSmckusick u_char lun: 3, /* logical unit on ctlr */ 1976df4657fSmckusick lbah: 5; /* msb of read/write logical block addr */ 1986df4657fSmckusick u_char lbam; /* middle byte of l.b.a. */ 1996df4657fSmckusick u_char lbal; /* lsb of l.b.a. */ 2006df4657fSmckusick u_char len; /* transfer length */ 2016df4657fSmckusick u_char xtra; 2026df4657fSmckusick }; 2036df4657fSmckusick 2046df4657fSmckusick struct scsi_cdb10 { 2056df4657fSmckusick u_char cmd; /* command code */ 2066df4657fSmckusick u_char lun: 3, /* logical unit on ctlr */ 2076df4657fSmckusick : 4, 2086df4657fSmckusick rel: 1; /* l.b.a. is relative addr if =1 */ 2096df4657fSmckusick u_char lbah; /* msb of read/write logical block addr */ 2106df4657fSmckusick u_char lbahm; /* high middle byte of l.b.a. */ 2116df4657fSmckusick u_char lbalm; /* low middle byte of l.b.a. */ 2126df4657fSmckusick u_char lbal; /* lsb of l.b.a. */ 2136df4657fSmckusick u_char reserved; 2146df4657fSmckusick u_char lenh; /* msb transfer length */ 2156df4657fSmckusick u_char lenl; /* lsb transfer length */ 2166df4657fSmckusick u_char xtra; 2176df4657fSmckusick }; 2186df4657fSmckusick 2196df4657fSmckusick /* basic sense data */ 2206df4657fSmckusick 2216df4657fSmckusick struct scsi_sense { 2226df4657fSmckusick u_char valid: 1, /* l.b.a. is valid */ 2236df4657fSmckusick class: 3, 2246df4657fSmckusick code: 4; 2256df4657fSmckusick u_char vu: 4, /* vendor unique */ 2266df4657fSmckusick lbah: 4; 2276df4657fSmckusick u_char lbam; 2286df4657fSmckusick u_char lbal; 2296df4657fSmckusick }; 2306df4657fSmckusick 2316df4657fSmckusick struct scsi_xsense { 2326df4657fSmckusick u_char valid: 1, /* l.b.a. is valid */ 2336df4657fSmckusick class: 3, 2346df4657fSmckusick code: 4; 2356df4657fSmckusick u_char segment; 2366df4657fSmckusick u_char filemark: 1, 2376df4657fSmckusick eom: 1, 2386df4657fSmckusick ili: 1, /* illegal length indicator */ 2396df4657fSmckusick rsvd: 1, 2406df4657fSmckusick key: 4; 2416df4657fSmckusick u_char info1; 2426df4657fSmckusick u_char info2; 2436df4657fSmckusick u_char info3; 2446df4657fSmckusick u_char info4; 2456df4657fSmckusick u_char len; /* additional sense length */ 2466df4657fSmckusick }; 2476df4657fSmckusick 2486df4657fSmckusick /* inquiry data */ 2496df4657fSmckusick struct scsi_inquiry { 2506df4657fSmckusick u_char type; 2516df4657fSmckusick u_char qual; 2526df4657fSmckusick u_char version; 2536df4657fSmckusick u_char rsvd; 2546df4657fSmckusick u_char len; 2556df4657fSmckusick char class[3]; 2566df4657fSmckusick char vendor_id[8]; 2576df4657fSmckusick char product_id[16]; 2586df4657fSmckusick char rev[4]; 2596df4657fSmckusick }; 2606df4657fSmckusick 2616df4657fSmckusick struct scsi_format_parms { /* physical BFI format */ 2626df4657fSmckusick u_short reserved; 2636df4657fSmckusick u_short list_len; 2646df4657fSmckusick struct defect { 2656df4657fSmckusick unsigned cyl : 24; 2666df4657fSmckusick unsigned head : 8; 2676df4657fSmckusick long bytes_from_index; 2686df4657fSmckusick } defect[127]; 2696df4657fSmckusick } format_parms; 2706df4657fSmckusick 2716df4657fSmckusick struct scsi_reassign_parms { 2726df4657fSmckusick u_short reserved; 2736df4657fSmckusick u_short list_len; /* length in bytes of defects only */ 2746df4657fSmckusick struct new_defect { 2756df4657fSmckusick unsigned lba; /* logical block address */ 2766df4657fSmckusick } new_defect[2]; 2776df4657fSmckusick } reassign_parms; 2786df4657fSmckusick 2796df4657fSmckusick struct scsi_modesel_hdr { 2806df4657fSmckusick u_char rsvd1; 2816df4657fSmckusick u_char media_type; 2826df4657fSmckusick u_char rsvd2; 2836df4657fSmckusick u_char block_desc_len; 2846df4657fSmckusick u_int density : 8; 2856df4657fSmckusick u_int number_blocks :24; 2866df4657fSmckusick u_int rsvd3 : 8; 2876df4657fSmckusick u_int block_length :24; 2886df4657fSmckusick }; 2896df4657fSmckusick 2906df4657fSmckusick struct scsi_modesense_hdr { 2916df4657fSmckusick u_char len; 2926df4657fSmckusick u_char media_type; 2936df4657fSmckusick u_char wp : 1; 2946df4657fSmckusick u_char rsvd1 : 7; 2956df4657fSmckusick u_char block_desc_len; 2966df4657fSmckusick u_int density : 8; 2976df4657fSmckusick u_int number_blocks :24; 2986df4657fSmckusick u_int rsvd2 : 8; 2996df4657fSmckusick u_int block_length :24; 3006df4657fSmckusick }; 3016df4657fSmckusick 3026df4657fSmckusick /* 3036df4657fSmckusick * Mode Select / Mode sense "pages" 3046df4657fSmckusick */ 3056df4657fSmckusick 3066df4657fSmckusick /* 3076df4657fSmckusick * Page One - Error Recovery Parameters 3086df4657fSmckusick */ 3096df4657fSmckusick struct scsi_err_recovery { 3106df4657fSmckusick u_char page_savable : 1; /* save parameters */ 3116df4657fSmckusick u_char reserved : 1; 3126df4657fSmckusick u_char page_code : 6; /* = 0x01 */ 3136df4657fSmckusick u_char page_length; /* = 6 */ 3146df4657fSmckusick u_char awre : 1; /* auto write realloc enabled */ 3156df4657fSmckusick u_char arre : 1; /* auto read realloc enabled */ 3166df4657fSmckusick u_char tb : 1; /* transfer block */ 3176df4657fSmckusick u_char rc : 1; /* read continuous */ 3186df4657fSmckusick u_char eec : 1; /* enable early correction */ 3196df4657fSmckusick u_char per : 1; /* post error */ 3206df4657fSmckusick u_char dte : 1; /* disable transfer on error */ 3216df4657fSmckusick u_char dcr : 1; /* disable correction */ 3226df4657fSmckusick u_char retry_count; 3236df4657fSmckusick u_char correction_span; 3246df4657fSmckusick u_char head_offset_count; 3256df4657fSmckusick u_char strobe_offset_count; 3266df4657fSmckusick u_char recovery_time_limit; 3276df4657fSmckusick }; 3286df4657fSmckusick 3296df4657fSmckusick /* 3306df4657fSmckusick * Page Two - Disconnect / Reconnect Control Parameters 3316df4657fSmckusick */ 3326df4657fSmckusick struct scsi_disco_reco { 3336df4657fSmckusick u_char page_savable : 1; /* save parameters */ 3346df4657fSmckusick u_char rsvd : 1; 3356df4657fSmckusick u_char page_code : 6; /* = 0x02 */ 3366df4657fSmckusick u_char page_length; /* = 10 */ 3376df4657fSmckusick u_char buffer_full_ratio; /* write, how full before reconnect? */ 3386df4657fSmckusick u_char buffer_empty_ratio; /* read, how full before reconnect? */ 3396df4657fSmckusick 3406df4657fSmckusick u_short bus_inactivity_limit; /* how much bus time for busy */ 3416df4657fSmckusick u_short disconnect_time_limit; /* min to remain disconnected */ 3426df4657fSmckusick u_short connect_time_limit; /* min to remain connected */ 3436df4657fSmckusick u_short reserved_1; 3446df4657fSmckusick }; 3456df4657fSmckusick 3466df4657fSmckusick /* 3476df4657fSmckusick * Page Three - Direct Access Device Format Parameters 3486df4657fSmckusick */ 3496df4657fSmckusick struct scsi_format { 3506df4657fSmckusick u_char page_savable : 1; /* save parameters */ 3516df4657fSmckusick u_char rsvd : 1; 3526df4657fSmckusick u_char page_code : 6; /* = 0x03 */ 3536df4657fSmckusick u_char page_length; /* = 22 */ 3546df4657fSmckusick u_short tracks_per_zone; /* Handling of Defects Fields */ 3556df4657fSmckusick u_short alt_sect_zone; 3566df4657fSmckusick u_short alt_tracks_zone; 3576df4657fSmckusick u_short alt_tracks_vol; 3586df4657fSmckusick u_short sect_track; /* Track Format Field */ 3596df4657fSmckusick u_short data_sect; /* Sector Format Fields */ 3606df4657fSmckusick u_short interleave; 3616df4657fSmckusick u_short track_skew_factor; 3626df4657fSmckusick u_short cyl_skew_factor; 3636df4657fSmckusick u_char ssec : 1; /* Drive Type Field */ 3646df4657fSmckusick u_char hsec : 1; 3656df4657fSmckusick u_char rmb : 1; 3666df4657fSmckusick u_char surf : 1; 3676df4657fSmckusick u_char ins : 1; 3686df4657fSmckusick u_char reserved_1 : 3; 3696df4657fSmckusick u_char reserved_2; 3706df4657fSmckusick u_char reserved_3; 3716df4657fSmckusick u_char reserved_4; 3726df4657fSmckusick }; 3736df4657fSmckusick 3746df4657fSmckusick /* 3756df4657fSmckusick * Page Four - Rigid Disk Drive Geometry Parameters 3766df4657fSmckusick */ 3776df4657fSmckusick struct scsi_geometry { 3786df4657fSmckusick u_char page_savable : 1; /* save parameters */ 3796df4657fSmckusick u_char rsvd : 1; 3806df4657fSmckusick u_char page_code : 6; /* = 0x04 */ 3816df4657fSmckusick u_char page_length; /* = 18 */ 3826df4657fSmckusick u_char cyl_ub; /* number of cylinders */ 3836df4657fSmckusick u_char cyl_mb; 3846df4657fSmckusick u_char cyl_lb; 3856df4657fSmckusick u_char heads; /* number of heads */ 3866df4657fSmckusick u_char precomp_cyl_ub; /* cylinder to start precomp */ 3876df4657fSmckusick u_char precomp_cyl_mb; 3886df4657fSmckusick u_char precomp_cyl_lb; 3896df4657fSmckusick u_char current_cyl_ub; /* cyl to start reduced current */ 3906df4657fSmckusick u_char current_cyl_mb; 3916df4657fSmckusick u_char current_cyl_lb; 3926df4657fSmckusick u_short step_rate; /* drive step rate */ 3936df4657fSmckusick u_char landing_cyl_ub; /* landing zone cylinder */ 3946df4657fSmckusick u_char landing_cyl_mb; 3956df4657fSmckusick u_char landing_cyl_lb; 3966df4657fSmckusick u_char reserved_1; 3976df4657fSmckusick u_char reserved_2; 3986df4657fSmckusick u_char reserved_3; 3996df4657fSmckusick }; 4006df4657fSmckusick 4016df4657fSmckusick /* 4026df4657fSmckusick * Page 0x38 - Cache Control Parameters 4036df4657fSmckusick */ 4046df4657fSmckusick struct scsi_cache { 4056df4657fSmckusick u_char page_savable : 1; /* save parameters */ 4066df4657fSmckusick u_char rsvd : 1; 4076df4657fSmckusick u_char page_code : 6; /* = 0x38 */ 4086df4657fSmckusick u_char page_length; /* = 14 */ 4096df4657fSmckusick u_char rsvd_1 : 1; 4106df4657fSmckusick u_char wie : 1; /* write index enable */ 4116df4657fSmckusick u_char rsvd_2 : 1; 4126df4657fSmckusick u_char ce : 1; /* cache enable */ 4136df4657fSmckusick u_char table_size : 4; 4146df4657fSmckusick u_char prefetch_threshold; 4156df4657fSmckusick u_char maximum_threshold; 4166df4657fSmckusick u_char maximumprefetch_multiplier; 4176df4657fSmckusick u_char minimum_threshold; 4186df4657fSmckusick u_char minimum_prefetch_multiplier; 4196df4657fSmckusick u_char reserved[8]; 4206df4657fSmckusick }; 4216df4657fSmckusick 4226df4657fSmckusick /* 4236df4657fSmckusick * Control for SCSI "format" mode. 4246df4657fSmckusick * 4256df4657fSmckusick * "Format" mode allows a privileged process to issue direct SCSI 4266df4657fSmckusick * commands to a drive (it is intended primarily to allow on-line 4276df4657fSmckusick * formatting). SDIOCSFORMAT with a non-zero arg will put the drive 4286df4657fSmckusick * into format mode; a zero arg will take it out. When in format 4296df4657fSmckusick * mode, only the process that issued the SDIOCFORMAT can read or 4306df4657fSmckusick * write the drive. 4316df4657fSmckusick * 4326df4657fSmckusick * In format mode, process is expected to 4336df4657fSmckusick * - do SDIOCSCSICOMMAND to supply cdb for next SCSI op 4346df4657fSmckusick * - do read or write as appropriate for cdb 4356df4657fSmckusick * - if i/o error, optionally do SDIOCSENSE to get completion 4366df4657fSmckusick * status and sense data from last scsi operation. 4376df4657fSmckusick */ 4386df4657fSmckusick 4396df4657fSmckusick struct scsi_fmt_cdb { 4406df4657fSmckusick int len; /* cdb length (in bytes) */ 4416df4657fSmckusick u_char cdb[28]; /* cdb to use on next read/write */ 4426df4657fSmckusick }; 4436df4657fSmckusick 4446df4657fSmckusick struct scsi_fmt_sense { 4456df4657fSmckusick u_int status; /* completion status of last op */ 4466df4657fSmckusick u_char sense[28]; /* sense data (if any) from last op */ 4476df4657fSmckusick }; 4486df4657fSmckusick 4496df4657fSmckusick #define SDIOCSFORMAT _IOW('S', 0x1, int) 4506df4657fSmckusick #define SDIOCGFORMAT _IOR('S', 0x2, int) 4516df4657fSmckusick #define SDIOCSCSICOMMAND _IOW('S', 0x3, struct scsi_fmt_cdb) 4526df4657fSmckusick #define SDIOCSENSE _IOR('S', 0x4, struct scsi_fmt_sense) 453