154005Sfujita /* 2*63192Sbostic * Copyright (c) 1990, 1992, 1993 3*63192Sbostic * The Regents of the University of California. All rights reserved. 454005Sfujita * 554005Sfujita * This code is derived from software contributed to Berkeley by 654005Sfujita * Van Jacobson of Lawrence Berkeley Laboratory. 754005Sfujita * 854005Sfujita * %sccs.include.redist.c% 954005Sfujita * 10*63192Sbostic * @(#)scsireg.h 8.1 (Berkeley) 06/10/93 1154005Sfujita */ 1254005Sfujita 1354005Sfujita /* 1454005Sfujita * MB89352 SCSI Protocol Controller Hardware Description. 1554005Sfujita */ 1654005Sfujita 1754005Sfujita struct scsidevice { 1854005Sfujita u_char scsi_bdid, p0, p1, p2; /* 000 */ 1954005Sfujita u_char scsi_sctl, p3, p4, p5; /* 004 */ 2054005Sfujita #define SCTL_DISABLE 0x80 2154005Sfujita #define SCTL_CTRLRST 0x40 2254005Sfujita #define SCTL_DIAG 0x20 2354005Sfujita #define SCTL_ABRT_ENAB 0x10 2454005Sfujita #define SCTL_PARITY_ENAB 0x08 2554005Sfujita #define SCTL_SEL_ENAB 0x04 2654005Sfujita #define SCTL_RESEL_ENAB 0x02 2754005Sfujita #define SCTL_INTR_ENAB 0x01 2854005Sfujita u_char scsi_scmd, p6, p7, p8; /* 008 */ 2954005Sfujita #define SCMD_RST 0x10 3054005Sfujita #define SCMD_ICPT_XFR 0x08 3154005Sfujita #define SCMD_PROG_XFR 0x04 3254005Sfujita #define SCMD_PAD 0x01 /* if initiator */ 3354005Sfujita #define SCMD_PERR_STOP 0x01 /* if target */ 3454005Sfujita /* command codes */ 3554005Sfujita #define SCMD_BUS_REL 0x00 3654005Sfujita #define SCMD_SELECT 0x20 3754005Sfujita #define SCMD_RST_ATN 0x40 3854005Sfujita #define SCMD_SET_ATN 0x60 3954005Sfujita #define SCMD_XFR 0x80 4054005Sfujita #define SCMD_XFR_PAUSE 0xa0 4154005Sfujita #define SCMD_RST_ACK 0xc0 4254005Sfujita #define SCMD_SET_ACK 0xe0 4354005Sfujita u_char scsi_tmod, p9, p10, p11; /* 00C */ 4454005Sfujita #define TMOD_SYNC 0x80 4554005Sfujita u_char scsi_ints, p12, p13, p14; /* 010 */ 4654005Sfujita #define INTS_SEL 0x80 4754005Sfujita #define INTS_RESEL 0x40 4854005Sfujita #define INTS_DISCON 0x20 4954005Sfujita #define INTS_CMD_DONE 0x10 5054005Sfujita #define INTS_SRV_REQ 0x08 5154005Sfujita #define INTS_TIMEOUT 0x04 5254005Sfujita #define INTS_HARD_ERR 0x02 5354005Sfujita #define INTS_RST 0x01 5454005Sfujita u_char scsi_psns, p15, p16, p17; /* 014 */ 5554005Sfujita #define PSNS_REQ 0x80 5654005Sfujita #define PSNS_ACK 0x40 5754005Sfujita #define PSNS_ATN 0x20 5854005Sfujita #define PSNS_SEL 0x10 5954005Sfujita #define PSNS_BSY 0x08 6054005Sfujita #define scsi_sdgc scsi_psns 6154005Sfujita #define SDGC_XFER_ENAB 0x20 6254005Sfujita u_char scsi_ssts, p18, p19, p20; /* 018 */ 6354005Sfujita #define SSTS_INITIATOR 0x80 6454005Sfujita #define SSTS_TARGET 0x40 6554005Sfujita #define SSTS_BUSY 0x20 6654005Sfujita #define SSTS_XFR 0x10 6754005Sfujita #define SSTS_ACTIVE (SSTS_INITIATOR|SSTS_XFR) 6854005Sfujita #define SSTS_RST 0x08 6954005Sfujita #define SSTS_TCZERO 0x04 7054005Sfujita #define SSTS_DREG_FULL 0x02 7154005Sfujita #define SSTS_DREG_EMPTY 0x01 7254005Sfujita u_char scsi_serr, p21, p22, p23; /* 01C */ 7354005Sfujita #define SERR_SCSI_PAR 0x80 7454005Sfujita #define SERR_SPC_PAR 0x40 7554005Sfujita #define SERR_XFER_OUT 0x20 7654005Sfujita #define SERR_TC_PAR 0x08 7754005Sfujita #define SERR_PHASE_ERR 0x04 7854005Sfujita #define SERR_SHORT_XFR 0x02 7954005Sfujita #define SERR_OFFSET 0x01 8054005Sfujita u_char scsi_pctl, p24, p25, p26; /* 020 */ 8154005Sfujita #define PCTL_BFINT_ENAB 0x80 8254005Sfujita u_char scsi_mbc, p27, p28, p29; /* 024 */ 8354005Sfujita u_char scsi_dreg, p30, p31, p32; /* 028 */ 8454005Sfujita u_char scsi_temp, p33, p34, p35; /* 02C */ 8554005Sfujita u_char scsi_tch, p36, p37, p38; /* 030 */ 8654005Sfujita u_char scsi_tcm, p39, p40, p41; /* 034 */ 8754005Sfujita u_char scsi_tcl, p42, p43, p44; /* 038 */ 8854005Sfujita u_char scsi_exbf, p45, p46, p47; /* 03C */ 8954005Sfujita }; 9054005Sfujita 9154005Sfujita /* psns/pctl phase lines as bits */ 9254005Sfujita #define PHASE_MSG 0x04 9354005Sfujita #define PHASE_CD 0x02 /* =1 if 'command' */ 9454005Sfujita #define PHASE_IO 0x01 /* =1 if data inbound */ 9554005Sfujita /* Phase lines as values */ 9654005Sfujita #define PHASE 0x07 /* mask for psns/pctl phase */ 9754005Sfujita #define DATA_OUT_PHASE 0x00 9854005Sfujita #define DATA_IN_PHASE 0x01 9954005Sfujita #define CMD_PHASE 0x02 10054005Sfujita #define STATUS_PHASE 0x03 10154005Sfujita #define BUS_FREE_PHASE 0x04 10254005Sfujita #define ARB_SEL_PHASE 0x05 /* Fuji chip combines arbitration with sel. */ 10354005Sfujita #define MESG_OUT_PHASE 0x06 10454005Sfujita #define MESG_IN_PHASE 0x07 10554005Sfujita 10654005Sfujita /* SCSI Messages */ 10754005Sfujita 10854005Sfujita #define MSG_CMD_COMPLETE 0x00 10954005Sfujita #define MSG_EXT_MESSAGE 0x01 11054005Sfujita #define MSG_SAVE_DATA_PTR 0x02 11154005Sfujita #define MSG_RESTORE_PTR 0x03 11254005Sfujita #define MSG_DISCONNECT 0x04 11354005Sfujita #define MSG_INIT_DETECT_ERROR 0x05 11454005Sfujita #define MSG_ABORT 0x06 11554005Sfujita #define MSG_REJECT 0x07 11654005Sfujita #define MSG_NOOP 0x08 11754005Sfujita #define MSG_PARITY_ERROR 0x09 11854005Sfujita #define MSG_BUS_DEVICE_RESET 0x0C 11954005Sfujita #define MSG_IDENTIFY 0x80 12054005Sfujita #define MSG_IDENTIFY_DR 0xc0 /* (disconnect/reconnect allowed) */ 12154005Sfujita #define MSG_SYNC_REQ 0x01 12254005Sfujita 12354005Sfujita /* SCSI Commands */ 12454005Sfujita 12554005Sfujita #define CMD_TEST_UNIT_READY 0x00 12654005Sfujita #define CMD_REQUEST_SENSE 0x03 12754005Sfujita #define CMD_INQUIRY 0x12 12854005Sfujita #define CMD_SEND_DIAGNOSTIC 0x1D 12954005Sfujita 13054005Sfujita #define CMD_REWIND 0x01 13154005Sfujita #define CMD_FORMAT_UNIT 0x04 13254005Sfujita #define CMD_READ_BLOCK_LIMITS 0x05 13354005Sfujita #define CMD_REASSIGN_BLOCKS 0x07 13454005Sfujita #define CMD_READ 0x08 13554005Sfujita #define CMD_WRITE 0x0A 13654005Sfujita #define CMD_WRITE_FILEMARK 0x10 13754005Sfujita #define CMD_SPACE 0x11 13854005Sfujita #define CMD_MODE_SELECT 0x15 13954005Sfujita #define CMD_RELEASE_UNIT 0x17 14054005Sfujita #define CMD_ERASE 0x19 14154005Sfujita #define CMD_MODE_SENSE 0x1A 14254005Sfujita #define CMD_LOADUNLOAD 0x1B 14354005Sfujita #define CMD_RECEIVE_DIAG 0x1C 14454005Sfujita #define CMD_SEND_DIAG 0x1D 14554005Sfujita #define CMD_P_A_MEDIA_REMOVAL 0x1E 14654005Sfujita #define CMD_READ_CAPACITY 0x25 14754005Sfujita #define CMD_READ_EXT 0x28 14854005Sfujita #define CMD_WRITE_EXT 0x2A 14954005Sfujita #define CMD_READ_DEFECT_DATA 0x37 15054005Sfujita #define SD_MANUFAC_DEFECTS 0x14000000 15154005Sfujita #define SD_GROWN_DEFECTS 0x0c000000 15254005Sfujita #define CMD_READ_BUFFER 0x3B 15354005Sfujita #define CMD_WRITE_BUFFER 0x3C 15454005Sfujita #define CMD_READ_FULL 0xF0 15554005Sfujita #define CMD_MEDIA_TEST 0xF1 15654005Sfujita #define CMD_ACCESS_LOG 0xF2 15754005Sfujita #define CMD_WRITE_FULL 0xFC 15854005Sfujita #define CMD_MANAGE_PRIMARY 0xFD 15954005Sfujita #define CMD_EXECUTE_DATA 0xFE 16054005Sfujita 16154005Sfujita /* SCSI status bits */ 16254005Sfujita 16354005Sfujita #define STS_CHECKCOND 0x02 /* Check Condition (ie., read sense) */ 16454005Sfujita #define STS_CONDMET 0x04 /* Condition Met (ie., search worked) */ 16554005Sfujita #define STS_BUSY 0x08 16654005Sfujita #define STS_INTERMED 0x10 /* Intermediate status sent */ 16754005Sfujita #define STS_EXT 0x80 /* Extended status valid */ 16854005Sfujita 16954005Sfujita /* command descriptor blocks */ 17054005Sfujita 17154005Sfujita struct scsi_cdb6 { 17254005Sfujita u_char cmd; /* command code */ 17354005Sfujita u_char lun: 3, /* logical unit on ctlr */ 17454005Sfujita lbah: 5; /* msb of read/write logical block addr */ 17554005Sfujita u_char lbam; /* middle byte of l.b.a. */ 17654005Sfujita u_char lbal; /* lsb of l.b.a. */ 17754005Sfujita u_char len; /* transfer length */ 17854005Sfujita u_char xtra; 17954005Sfujita }; 18054005Sfujita 18154005Sfujita struct scsi_cdb10 { 18254005Sfujita u_char cmd; /* command code */ 18354005Sfujita u_char lun: 3, /* logical unit on ctlr */ 18454005Sfujita : 4, 18554005Sfujita rel: 1; /* l.b.a. is relative addr if =1 */ 18654005Sfujita u_char lbah; /* msb of read/write logical block addr */ 18754005Sfujita u_char lbahm; /* high middle byte of l.b.a. */ 18854005Sfujita u_char lbalm; /* low middle byte of l.b.a. */ 18954005Sfujita u_char lbal; /* lsb of l.b.a. */ 19054005Sfujita u_char reserved; 19154005Sfujita u_char lenh; /* msb transfer length */ 19254005Sfujita u_char lenl; /* lsb transfer length */ 19354005Sfujita u_char xtra; 19454005Sfujita }; 19554005Sfujita 19654005Sfujita /* basic sense data */ 19754005Sfujita 19854005Sfujita struct scsi_sense { 19954005Sfujita u_char valid: 1, /* l.b.a. is valid */ 20054005Sfujita class: 3, 20154005Sfujita code: 4; 20254005Sfujita u_char vu: 4, /* vendor unique */ 20354005Sfujita lbah: 4; 20454005Sfujita u_char lbam; 20554005Sfujita u_char lbal; 20654005Sfujita }; 20754005Sfujita 20854005Sfujita struct scsi_xsense { 20954005Sfujita u_char valid: 1, /* l.b.a. is valid */ 21054005Sfujita class: 3, 21154005Sfujita code: 4; 21254005Sfujita u_char segment; 21354005Sfujita u_char filemark: 1, 21454005Sfujita eom: 1, 21554005Sfujita ili: 1, /* illegal length indicator */ 21654005Sfujita rsvd: 1, 21754005Sfujita key: 4; 21854005Sfujita u_char info1; 21954005Sfujita u_char info2; 22054005Sfujita u_char info3; 22154005Sfujita u_char info4; 22254005Sfujita u_char len; /* additional sense length */ 22354005Sfujita }; 22454005Sfujita 22554005Sfujita /* inquiry data */ 22654005Sfujita struct scsi_inquiry { 22754005Sfujita u_char type; 22854005Sfujita u_char qual; 22954005Sfujita u_char version; 23054005Sfujita u_char rsvd; 23154005Sfujita u_char len; 23254005Sfujita char class[3]; 23354005Sfujita char vendor_id[8]; 23454005Sfujita char product_id[16]; 23554005Sfujita char rev[4]; 23654005Sfujita }; 23754005Sfujita 23854005Sfujita struct scsi_format_parms { /* physical BFI format */ 23954005Sfujita u_short reserved; 24054005Sfujita u_short list_len; 24154005Sfujita struct defect { 24254005Sfujita unsigned cyl : 24; 24354005Sfujita unsigned head : 8; 24454005Sfujita long bytes_from_index; 24554005Sfujita } defect[127]; 24654005Sfujita } format_parms; 24754005Sfujita 24854005Sfujita struct scsi_reassign_parms { 24954005Sfujita u_short reserved; 25054005Sfujita u_short list_len; /* length in bytes of defects only */ 25154005Sfujita struct new_defect { 25254005Sfujita unsigned lba; /* logical block address */ 25354005Sfujita } new_defect[2]; 25454005Sfujita } reassign_parms; 25554005Sfujita 25654005Sfujita struct scsi_modesel_hdr { 25754005Sfujita u_char rsvd1; 25854005Sfujita u_char media_type; 25954005Sfujita u_char rsvd2; 26054005Sfujita u_char block_desc_len; 26154005Sfujita u_int density : 8; 26254005Sfujita u_int number_blocks :24; 26354005Sfujita u_int rsvd3 : 8; 26454005Sfujita u_int block_length :24; 26554005Sfujita }; 26654005Sfujita 26754005Sfujita struct scsi_modesense_hdr { 26854005Sfujita u_char len; 26954005Sfujita u_char media_type; 27054005Sfujita u_char wp : 1; 27154005Sfujita u_char rsvd1 : 7; 27254005Sfujita u_char block_desc_len; 27354005Sfujita u_int density : 8; 27454005Sfujita u_int number_blocks :24; 27554005Sfujita u_int rsvd2 : 8; 27654005Sfujita u_int block_length :24; 27754005Sfujita }; 27854005Sfujita 27954005Sfujita /* 28054005Sfujita * Mode Select / Mode sense "pages" 28154005Sfujita */ 28254005Sfujita 28354005Sfujita /* 28454005Sfujita * Page One - Error Recovery Parameters 28554005Sfujita */ 28654005Sfujita struct scsi_err_recovery { 28754005Sfujita u_char page_savable : 1; /* save parameters */ 28854005Sfujita u_char reserved : 1; 28954005Sfujita u_char page_code : 6; /* = 0x01 */ 29054005Sfujita u_char page_length; /* = 6 */ 29154005Sfujita u_char awre : 1; /* auto write realloc enabled */ 29254005Sfujita u_char arre : 1; /* auto read realloc enabled */ 29354005Sfujita u_char tb : 1; /* transfer block */ 29454005Sfujita u_char rc : 1; /* read continuous */ 29554005Sfujita u_char eec : 1; /* enable early correction */ 29654005Sfujita u_char per : 1; /* post error */ 29754005Sfujita u_char dte : 1; /* disable transfer on error */ 29854005Sfujita u_char dcr : 1; /* disable correction */ 29954005Sfujita u_char retry_count; 30054005Sfujita u_char correction_span; 30154005Sfujita u_char head_offset_count; 30254005Sfujita u_char strobe_offset_count; 30354005Sfujita u_char recovery_time_limit; 30454005Sfujita }; 30554005Sfujita 30654005Sfujita /* 30754005Sfujita * Page Two - Disconnect / Reconnect Control Parameters 30854005Sfujita */ 30954005Sfujita struct scsi_disco_reco { 31054005Sfujita u_char page_savable : 1; /* save parameters */ 31154005Sfujita u_char rsvd : 1; 31254005Sfujita u_char page_code : 6; /* = 0x02 */ 31354005Sfujita u_char page_length; /* = 10 */ 31454005Sfujita u_char buffer_full_ratio; /* write, how full before reconnect? */ 31554005Sfujita u_char buffer_empty_ratio; /* read, how full before reconnect? */ 31654005Sfujita 31754005Sfujita u_short bus_inactivity_limit; /* how much bus time for busy */ 31854005Sfujita u_short disconnect_time_limit; /* min to remain disconnected */ 31954005Sfujita u_short connect_time_limit; /* min to remain connected */ 32054005Sfujita u_short reserved_1; 32154005Sfujita }; 32254005Sfujita 32354005Sfujita /* 32454005Sfujita * Page Three - Direct Access Device Format Parameters 32554005Sfujita */ 32654005Sfujita struct scsi_format { 32754005Sfujita u_char page_savable : 1; /* save parameters */ 32854005Sfujita u_char rsvd : 1; 32954005Sfujita u_char page_code : 6; /* = 0x03 */ 33054005Sfujita u_char page_length; /* = 22 */ 33154005Sfujita u_short tracks_per_zone; /* Handling of Defects Fields */ 33254005Sfujita u_short alt_sect_zone; 33354005Sfujita u_short alt_tracks_zone; 33454005Sfujita u_short alt_tracks_vol; 33554005Sfujita u_short sect_track; /* Track Format Field */ 33654005Sfujita u_short data_sect; /* Sector Format Fields */ 33754005Sfujita u_short interleave; 33854005Sfujita u_short track_skew_factor; 33954005Sfujita u_short cyl_skew_factor; 34054005Sfujita u_char ssec : 1; /* Drive Type Field */ 34154005Sfujita u_char hsec : 1; 34254005Sfujita u_char rmb : 1; 34354005Sfujita u_char surf : 1; 34454005Sfujita u_char ins : 1; 34554005Sfujita u_char reserved_1 : 3; 34654005Sfujita u_char reserved_2; 34754005Sfujita u_char reserved_3; 34854005Sfujita u_char reserved_4; 34954005Sfujita }; 35054005Sfujita 35154005Sfujita /* 35254005Sfujita * Page Four - Rigid Disk Drive Geometry Parameters 35354005Sfujita */ 35454005Sfujita struct scsi_geometry { 35554005Sfujita u_char page_savable : 1; /* save parameters */ 35654005Sfujita u_char rsvd : 1; 35754005Sfujita u_char page_code : 6; /* = 0x04 */ 35854005Sfujita u_char page_length; /* = 18 */ 35954005Sfujita u_char cyl_ub; /* number of cylinders */ 36054005Sfujita u_char cyl_mb; 36154005Sfujita u_char cyl_lb; 36254005Sfujita u_char heads; /* number of heads */ 36354005Sfujita u_char precomp_cyl_ub; /* cylinder to start precomp */ 36454005Sfujita u_char precomp_cyl_mb; 36554005Sfujita u_char precomp_cyl_lb; 36654005Sfujita u_char current_cyl_ub; /* cyl to start reduced current */ 36754005Sfujita u_char current_cyl_mb; 36854005Sfujita u_char current_cyl_lb; 36954005Sfujita u_short step_rate; /* drive step rate */ 37054005Sfujita u_char landing_cyl_ub; /* landing zone cylinder */ 37154005Sfujita u_char landing_cyl_mb; 37254005Sfujita u_char landing_cyl_lb; 37354005Sfujita u_char reserved_1; 37454005Sfujita u_char reserved_2; 37554005Sfujita u_char reserved_3; 37654005Sfujita }; 37754005Sfujita 37854005Sfujita /* 37954005Sfujita * Page 0x38 - Cache Control Parameters 38054005Sfujita */ 38154005Sfujita struct scsi_cache { 38254005Sfujita u_char page_savable : 1; /* save parameters */ 38354005Sfujita u_char rsvd : 1; 38454005Sfujita u_char page_code : 6; /* = 0x38 */ 38554005Sfujita u_char page_length; /* = 14 */ 38654005Sfujita u_char rsvd_1 : 1; 38754005Sfujita u_char wie : 1; /* write index enable */ 38854005Sfujita u_char rsvd_2 : 1; 38954005Sfujita u_char ce : 1; /* cache enable */ 39054005Sfujita u_char table_size : 4; 39154005Sfujita u_char prefetch_threshold; 39254005Sfujita u_char maximum_threshold; 39354005Sfujita u_char maximumprefetch_multiplier; 39454005Sfujita u_char minimum_threshold; 39554005Sfujita u_char minimum_prefetch_multiplier; 39654005Sfujita u_char reserved[8]; 39754005Sfujita }; 39854005Sfujita 39954005Sfujita /* 40054005Sfujita * Driver ioctl's for various scsi operations. 40154005Sfujita */ 40254005Sfujita #ifndef _IOCTL_ 40356519Sbostic #include <sys/ioctl.h> 40454005Sfujita #endif 40554005Sfujita 40654005Sfujita /* 40754005Sfujita * Control for SCSI "format" mode. 40854005Sfujita * 40954005Sfujita * "Format" mode allows a privileged process to issue direct SCSI 41054005Sfujita * commands to a drive (it is intended primarily to allow on-line 41154005Sfujita * formatting). SDIOCSFORMAT with a non-zero arg will put the drive 41254005Sfujita * into format mode; a zero arg will take it out. When in format 41354005Sfujita * mode, only the process that issued the SDIOCFORMAT can read or 41454005Sfujita * write the drive. 41554005Sfujita * 41654005Sfujita * In format mode, process is expected to 41754005Sfujita * - do SDIOCSCSICOMMAND to supply cdb for next SCSI op 41854005Sfujita * - do read or write as appropriate for cdb 41954005Sfujita * - if i/o error, optionally do SDIOCSENSE to get completion 42054005Sfujita * status and sense data from last scsi operation. 42154005Sfujita */ 42254005Sfujita 42354005Sfujita struct scsi_fmt_cdb { 42454005Sfujita int len; /* cdb length (in bytes) */ 42554005Sfujita u_char cdb[28]; /* cdb to use on next read/write */ 42654005Sfujita }; 42754005Sfujita 42854005Sfujita struct scsi_fmt_sense { 42954005Sfujita u_int status; /* completion status of last op */ 43054005Sfujita u_char sense[28]; /* sense data (if any) from last op */ 43154005Sfujita }; 43254005Sfujita 43354005Sfujita #define SDIOCSFORMAT _IOW('S', 0x1, int) 43454005Sfujita #define SDIOCGFORMAT _IOR('S', 0x2, int) 43554005Sfujita #define SDIOCSCSICOMMAND _IOW('S', 0x3, struct scsi_fmt_cdb) 43654005Sfujita #define SDIOCSENSE _IOR('S', 0x4, struct scsi_fmt_sense) 437