diff --git a/sys/scsi/cd.c b/sys/scsi/cd.c index 538c9e1d4222..879b0f735a85 100644 --- a/sys/scsi/cd.c +++ b/sys/scsi/cd.c @@ -13,11 +13,17 @@ * functioning of this software in any circumstances. * */ -static char rev[] = "$Revision: 1.2 $"; +static char rev[] = "$Revision: 1.5 $"; /* * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system */ #define SPLCD splbio @@ -703,8 +709,8 @@ cdioctl(dev_t dev, int cmd, caddr_t addr, int flag) struct cd_mode_data data; if(error = cd_get_mode(unit,&data,AUDIO_PAGE)) break; - data.page.audio.sotc = 0; - data.page.audio.immed = 1; + data.page.audio.flags &= ~CD_PA_SOTC; + data.page.audio.flags |= CD_PA_IMMED; if(error = cd_set_mode(unit,&data)) break; return(cd_play_tracks(unit @@ -722,8 +728,8 @@ cdioctl(dev_t dev, int cmd, caddr_t addr, int flag) struct cd_mode_data data; if(error = cd_get_mode(unit,&data,AUDIO_PAGE)) break; - data.page.audio.sotc = 0; - data.page.audio.immed = 1; + data.page.audio.flags &= ~CD_PA_SOTC; + data.page.audio.flags |= CD_PA_IMMED; if(error = cd_set_mode(unit,&data)) break; return(cd_play(unit,args->blk,args->len)); @@ -876,10 +882,10 @@ cdioctl(dev_t dev, int cmd, caddr_t addr, int flag) struct cd_mode_data data; if(error = cd_get_mode(unit,&data,AUDIO_PAGE)) break; - data.page.audio.port[LEFT_PORT].channels = 15; - data.page.audio.port[RIGHT_PORT].channels = 15; - data.page.audio.port[2].channels = 15; - data.page.audio.port[3].channels = 15; + data.page.audio.port[LEFT_PORT].channels = LEFT_CHANNEL; + data.page.audio.port[RIGHT_PORT].channels = LEFT_CHANNEL; + data.page.audio.port[2].channels = 0; + data.page.audio.port[3].channels = 0; if(error = cd_set_mode(unit,&data)) break; } @@ -1070,7 +1076,7 @@ int page; bzero(&scsi_cmd, sizeof(scsi_cmd)); bzero(data,sizeof(*data)); scsi_cmd.op_code = MODE_SENSE; - scsi_cmd.page_code = page; + scsi_cmd.page = page; scsi_cmd.length = sizeof(*data) & 0xff; retval = cd_scsi_cmd(unit, &scsi_cmd, @@ -1092,7 +1098,7 @@ struct cd_mode_data *data; bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = MODE_SELECT; - scsi_cmd.pf = 1; + scsi_cmd.byte2 |= SMS_PF; scsi_cmd.length = sizeof(*data) & 0xff; data->header.data_length = 0; /*show_mem(data,sizeof(*data));/**/ @@ -1224,8 +1230,8 @@ cd_start_unit(unit,part,type) bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = START_STOP; - scsi_cmd.start = type==CD_START?1:0; - scsi_cmd.loej = type==CD_EJECT?1:0; + scsi_cmd.how |= (type==CD_START)?SSS_START:0; + scsi_cmd.how |= (type==CD_EJECT)?SSS_LOEJ:0; if (cd_scsi_cmd(unit, &scsi_cmd, @@ -1249,7 +1255,7 @@ int unit,type,flags; if(type==CD_EJECT || type==PR_PREVENT || cd_data[unit].openparts == 0 ) { bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = PREVENT_ALLOW; - scsi_cmd.prevent=type==CD_EJECT?PR_ALLOW:type; + scsi_cmd.how = (type==CD_EJECT)?PR_ALLOW:type; if (cd_scsi_cmd(unit, &scsi_cmd, sizeof(struct scsi_prevent), @@ -1281,8 +1287,8 @@ struct cd_sub_channel_info *data; scsi_cmd.op_code=READ_SUBCHANNEL; if(mode==CD_MSF_FORMAT) - scsi_cmd.msf=1; - scsi_cmd.subQ=1; + scsi_cmd.byte2 |= CD_MSF; + scsi_cmd.byte3=SRS_SUBQ; scsi_cmd.subchan_format=format; scsi_cmd.track=track; scsi_cmd.data_len[0]=(len)>>8; @@ -1315,7 +1321,7 @@ struct cd_toc_entry *data; scsi_cmd.op_code=READ_TOC; if(mode==CD_MSF_FORMAT) - scsi_cmd.msf=1; + scsi_cmd.byte2 |= CD_MSF; scsi_cmd.from_track=start; scsi_cmd.data_len[0]=(ntoc)>>8; scsi_cmd.data_len[1]=(ntoc)&0xff; @@ -1521,11 +1527,11 @@ struct scsi_xfer *xs; silent = (xs->flags & SCSI_SILENT); sense = &(xs->sense); - switch(sense->error_class) + switch(sense->error_code & SSD_ERRCODE) { - case 7: + case 0x70: { - key=sense->ext.extended.sense_key; + key=sense->ext.extended.flags & SSD_KEY; switch(key) { case 0x0: @@ -1534,7 +1540,7 @@ struct scsi_xfer *xs; if(!silent) { printf("cd%d: soft error(corrected) ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)", (sense->ext.extended.info[0] <<24)| @@ -1553,7 +1559,7 @@ struct scsi_xfer *xs; if(!silent) { printf("cd%d: medium error ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)", (sense->ext.extended.info[0] <<24)| @@ -1585,7 +1591,7 @@ struct scsi_xfer *xs; { printf("cd%d: attempted protection violation ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1601,7 +1607,7 @@ struct scsi_xfer *xs; { printf("cd%d: block wrong state (worm)\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1629,7 +1635,7 @@ struct scsi_xfer *xs; { printf("cd%d: search returned\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1649,7 +1655,7 @@ struct scsi_xfer *xs; { printf("cd%d: verify miscompare\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1667,19 +1673,12 @@ struct scsi_xfer *xs; } break; } - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: + default: { - if(!silent)printf("cd%d: error class %d code %d\n", + if(!silent)printf("cd%d: error code %d\n", unit, - sense->error_class, - sense->error_code); - if(sense->valid) + sense->error_code & SSD_ERRCODE); + if(sense->error_code & SSD_ERRCODE_VALID) if(!silent)printf("block no. %d (decimal)\n", (sense->ext.unextended.blockhi <<16) + (sense->ext.unextended.blockmed <<8) diff --git a/sys/scsi/ch.c b/sys/scsi/ch.c index 57a4749eb638..ba7cdcd62632 100644 --- a/sys/scsi/ch.c +++ b/sys/scsi/ch.c @@ -1,5 +1,16 @@ +/* + */ /* - * Written by Julian Elischer (julian@tfs.com) + * HISTORY + * + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system + * */ #include @@ -89,7 +100,7 @@ struct scsi_switch *scsi_switch; unit = next_ch_unit++; if( unit >= NCH) { - printf("Too many scsi changers..(%d > %d) reconfigure kernel",(unit + 1),NCH); + printf("Too many scsi changers..(%d > %d) reconfigure kernel\n",(unit + 1),NCH); return(0); } /*******************************************************\ @@ -359,7 +370,7 @@ char *data; bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = READ_ELEMENT_STATUS; - scsi_cmd.element_type_code=type; + scsi_cmd.byte2 = type; scsi_cmd.starting_element_addr[0]=(from>>8)&0xff; scsi_cmd.starting_element_addr[1]=from&0xff; scsi_cmd.number_of_elements[1]=1; @@ -518,8 +529,8 @@ int unit,flags; for(l=1;l>=0;l--) { bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = MODE_SENSE; - scsi_cmd.dbd = l; - scsi_cmd.page_code = 0x3f; /* All Pages */ + scsi_cmd.byte2 = SMS_DBD; + scsi_cmd.page = 0x3f; /* All Pages */ scsi_cmd.length = sizeof(scsi_sense); /*******************************************************\ * do the command, but we don't need the results * @@ -750,42 +761,41 @@ struct scsi_xfer *xs; * Get the sense fields and work out what CLASS * \***************************************************************/ sense = &(xs->sense); - switch(sense->error_class) + switch(sense->error_code & SSD_ERRCODE) { /***************************************************************\ * If it's class 7, use the extended stuff and interpret the key * \***************************************************************/ - case 7: + case 0x70: { - key=sense->ext.extended.sense_key; - if(sense->ext.extended.ili) + key=sense->ext.extended.flags & SSD_KEY; + if(sense->ext.extended.flags & SSD_ILI) if(!silent) { printf("length error "); } - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) xs->resid = ntohl(*((long *)sense->ext.extended.info)); if(xs->bp) { xs->bp->b_flags |= B_ERROR; return(ESUCCESS); } - if(sense->ext.extended.eom) + if(sense->ext.extended.flags & SSD_EOM) if(!silent) printf("end of medium "); - if(sense->ext.extended.filemark) + if(sense->ext.extended.flags & SSD_FILEMARK) if(!silent) printf("filemark "); if(ch_debug) { - printf("code%x class%x valid%x\n" - ,sense->error_code - ,sense->error_class - ,sense->valid); + printf("code%x valid%x\n" + ,sense->error_code & SSD_ERRCODE + ,sense->error_code & SSD_ERRCODE_VALID); printf("seg%x key%x ili%x eom%x fmark%x\n" ,sense->ext.extended.segment - ,sense->ext.extended.sense_key - ,sense->ext.extended.ili - ,sense->ext.extended.eom - ,sense->ext.extended.filemark); + ,sense->ext.extended.flags & SSD_KEY + ,sense->ext.extended.flags & SSD_ILI + ,sense->ext.extended.flags & SSD_EOM + ,sense->ext.extended.flags & SSD_FILEMARK); printf("info: %x %x %x %x followed by %d extra bytes\n" ,sense->ext.extended.info[0] ,sense->ext.extended.info[1] @@ -819,7 +829,7 @@ struct scsi_xfer *xs; if(!silent) { printf("st%d: soft error(corrected) ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -842,7 +852,7 @@ struct scsi_xfer *xs; if(!silent) { printf("st%d: medium error ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -881,7 +891,7 @@ struct scsi_xfer *xs; { printf("st%d: attempted protection violation " , unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -900,7 +910,7 @@ struct scsi_xfer *xs; { printf("st%d: block wrong state (worm)\n " , unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -932,7 +942,7 @@ struct scsi_xfer *xs; if(!silent) { printf("st%d: search returned\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -954,7 +964,7 @@ struct scsi_xfer *xs; if(!silent) { printf("st%d: verify miscompare\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -978,19 +988,12 @@ struct scsi_xfer *xs; /***************************************************************\ * If it's NOT class 7, just report it. * \***************************************************************/ - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: + default: { - if(!silent) printf("st%d: error class %d code %d\n", + if(!silent) printf("st%d: error code %d\n", unit, - sense->error_class, - sense->error_code); - if(sense->valid) + sense->error_code & SSD_ERRCODE); + if(sense->error_code & SSD_ERRCODE_VALID) if(!silent) printf("block no. %d (decimal)\n", (sense->ext.unextended.blockhi <<16), + (sense->ext.unextended.blockmed <<8), diff --git a/sys/scsi/scsi_all.h b/sys/scsi/scsi_all.h index 3d9a829b2968..2a1b6a6ad842 100644 --- a/sys/scsi/scsi_all.h +++ b/sys/scsi/scsi_all.h @@ -1,15 +1,31 @@ /* * HISTORY * $Log: scsi_all.h,v $ - * Revision 1.1.1.1 1993/06/12 14:57:27 rgrimes - * Initial import, 0.1 + pk 0.2.4-B1 - * + * Revision 1.4 93/08/05 21:37:37 julian + * fix the definitionof the last byte of each scsi command. + * + * Revision 1.3 93/08/01 02:39:21 julian + * compiles.. no mode bitfields + * + * Revision 1.2 93/07/31 22:52:26 julian + * removed all bitfields + * + * Revision 1.1 93/04/12 21:51:01 root + * checkin for 'jules' + * * Revision 1.2 1992/11/20 23:07:13 julian * add a definition for device type T_NODEVICE * * Revision 1.1 1992/09/26 22:14:02 julian * Initial revision * + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system * */ @@ -42,6 +58,15 @@ * SCSI command format */ +/* + * Define dome bits that are in ALL (or a lot of) scsi commands + */ +#define SCSI_CTL_LINK 0x01 +#define SCSI_CTL_FLAG 0x02 +#define SCSI_CTL_VENDOR 0xC0 +#define SCSI_CMD_LUN 0xA0 /*these two should not be needed*/ +#define SCSI_CMD_LUN_SHIFT 5 /* LUN in the cmd is no longer SCSI */ + struct scsi_generic { @@ -52,152 +77,117 @@ struct scsi_generic struct scsi_test_unit_ready { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[3]; - u_char link:1; - u_char flag:4; - u_char :3; + u_char control; }; struct scsi_send_diag { u_char op_code; - u_char uol:1; - u_char dol:1; - u_char selftest:1; - u_char :1; - u_char pf:1; - u_char lun:3; + u_char byte2; +#define SSD_UOL 0x01 +#define SSD_DOL 0x02 +#define SSD_SELFTEST 0x04 +#define SSD_PF 0x10 u_char unused[1]; u_char paramlen[2]; - u_char link:1; - u_char flag:4; - u_char :3; + u_char control; }; struct scsi_sense { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[2]; u_char length; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_inquiry { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[2]; u_char length; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_mode_sense { u_char op_code; - u_char :3; - u_char dbd:1; - u_char rsvd:1; - u_char lun:3; - u_char page_code:6; - u_char page_ctrl:2; + u_char byte2; +#define SMS_DBD 0x08 + u_char page; +#define SMS_PAGE_CODE 0x3F +#define SMS_PAGE_CTRL 0xC0 +#define SMS_PAGE_CTRL_CURRENT 0x00 +#define SMS_PAGE_CTRL_CHANGEABLE 0x40 +#define SMS_PAGE_CTRL_DEFAULT 0x80 +#define SMS_PAGE_CTRL_SAVED 0xC0 u_char unused; u_char length; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_mode_sense_big { u_char op_code; - u_char :3; - u_char dbd:1; - u_char rsvd:1; - u_char lun:3; - u_char page_code:6; - u_char page_ctrl:2; + u_char byte2; /* same bits as small version */ + u_char page; /* same bits as small version */ u_char unused[4]; u_char length[2]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_mode_select { u_char op_code; - u_char sp:1; - u_char :3; - u_char pf:1; - u_char lun:3; + u_char byte2; +#define SMS_SP 0x01 +#define SMS_PF 0x10 u_char unused[2]; u_char length; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_mode_select_big { u_char op_code; - u_char sp:1; - u_char :3; - u_char pf:1; - u_char lun:3; + u_char byte2; /* same bits as small version */ u_char unused[5]; u_char length[2]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_reserve { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[2]; u_char length; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_release { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[2]; u_char length; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_prevent { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[2]; - u_char prevent:1; - u_char :7; - u_char link:1; - u_char flag:1; - u_char :6; + u_char how; + u_char control; }; -#define PR_PREVENT 1 -#define PR_ALLOW 0 +#define PR_PREVENT 0x01 +#define PR_ALLOW 0x00 /* * Opcodes @@ -240,19 +230,31 @@ struct scsi_prevent struct scsi_inquiry_data { - u_char device_type:5; - u_char device_qualifier:3; - u_char dev_qual2:7; - u_char removable:1; - u_char ansii_version:3; - u_char :5; + u_char device; +#define SID_TYPE 0x1F +#define SID_QUAL 0xE0 +#define SID_QUAL_LU_OK 0x00 +#define SID_QUAL_LU_OFFLINE 0x20 +#define SID_QUAL_RSVD 0x40 +#define SID_QUAL_BAD_LU 0x60 + u_char dev_qual2; +#define SID_QUAL2 0x7F +#define SID_REMOVABLE 0x80 + u_char version; +#define SID_ANSII 0x07 +#define SID_ECMA 0x38 +#define SID_ISO 0xC0 u_char response_format; u_char additional_length; u_char unused[2]; - u_char :3; - u_char can_link:1; - u_char can_sync:1; - u_char :3; + u_char flags; +#define SID_SftRe 0x01 +#define SID_CmdQue 0x02 +#define SID_Linked 0x08 +#define SID_Sync 0x10 +#define SID_WBus16 0x20 +#define SID_WBus32 0x40 +#define SID_RelAdr 0x80 char vendor[8]; char product[16]; char revision[4]; @@ -262,37 +264,22 @@ struct scsi_inquiry_data struct scsi_sense_data { - u_char error_code:4; - u_char error_class:3; - u_char valid:1; + u_char error_code; /* same bits as new version */ union { struct { - u_char blockhi:5; - u_char vendor:3; + u_char blockhi; u_char blockmed; u_char blocklow; } unextended; struct { u_char segment; - u_char sense_key:4; - u_char :1; - u_char ili:1; - u_char eom:1; - u_char filemark:1; + u_char flags; /* same bits as new version */ u_char info[4]; u_char extra_len; /* allocate enough room to hold new stuff - u_char cmd_spec_info[4]; - u_char add_sense_code; - u_char add_sense_code_qual; - u_char fru; - u_char sense_key_spec_1:7; - u_char sksv:1; - u_char sense_key_spec_2; - u_char sense_key_spec_3; ( by increasing 16 to 26 below) */ u_char extra_bytes[26]; } extended; @@ -300,33 +287,33 @@ struct scsi_sense_data }; struct scsi_sense_data_new { - u_char error_code:7; - u_char valid:1; + u_char error_code; +#define SSD_ERRCODE 0x7F +#define SSD_ERRCODE_VALID 0x80 union { - struct + struct /* this is depreciated, the standard says "DON'T"*/ { - u_char blockhi:5; - u_char vendor:3; + u_char blockhi; u_char blockmed; u_char blocklow; } unextended; struct { u_char segment; - u_char sense_key:4; - u_char :1; - u_char ili:1; - u_char eom:1; - u_char filemark:1; + u_char flags; +#define SSD_KEY 0x0F +#define SSD_ILI 0x20 +#define SSD_EOM 0x40 +#define SSD_FILEMARK 0x80 u_char info[4]; u_char extra_len; u_char cmd_spec_info[4]; u_char add_sense_code; u_char add_sense_code_qual; u_char fru; - u_char sense_key_spec_1:7; - u_char sksv:1; + u_char sense_key_spec_1; +#define SSD_SCS_VALID 0x80 u_char sense_key_spec_2; u_char sense_key_spec_3; u_char extra_bytes[16]; diff --git a/sys/scsi/scsi_cd.h b/sys/scsi/scsi_cd.h index 660688937f09..b5758c898438 100644 --- a/sys/scsi/scsi_cd.h +++ b/sys/scsi/scsi_cd.h @@ -12,6 +12,13 @@ * on the understanding that TFS is not responsible for the correct * functioning of this software in any circumstances. * + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system */ @@ -19,6 +26,11 @@ /* * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 */ +/* + * Define two bits always in the same place in byte 2 (flag byte) + */ +#define CD_RELADDR 0x01 +#define CD_MSF 0x02 /* * SCSI command format @@ -27,29 +39,22 @@ struct scsi_read_capacity_cd { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char addr_3; /* Most Significant */ u_char addr_2; u_char addr_1; u_char addr_0; /* Least Significant */ u_char unused[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_pause { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[6]; - u_char resume:1; - u_char :7; - u_char link:1; - u_char flag:1; - u_char :6; + u_char resume; + u_char control; }; #define PA_PAUSE 1 #define PA_RESUME 0 @@ -57,8 +62,7 @@ struct scsi_pause struct scsi_play_msf { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused; u_char start_m; u_char start_s; @@ -66,132 +70,96 @@ struct scsi_play_msf u_char end_m; u_char end_s; u_char end_f; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_play_track { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[2]; u_char start_track; u_char start_index; u_char unused1; u_char end_track; u_char end_index; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_play { u_char op_code; - u_char reladdr:1; - u_char :4; - u_char lun:3; + u_char byte2; u_char blk_addr[4]; u_char unused; u_char xfer_len[2]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_play_big { u_char op_code; - u_char reladdr:1; - u_char :4; - u_char lun:3; + u_char byte2; /* same as above */ u_char blk_addr[4]; u_char xfer_len[4]; u_char unused; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_play_rel_big { u_char op_code; - u_char reladdr:1; - u_char :4; - u_char lun:3; + u_char byte2; /* same as above */ u_char blk_addr[4]; u_char xfer_len[4]; u_char track; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_read_header { u_char op_code; - u_char :1; - u_char msf:1; - u_char :3; - u_char lun:3; + u_char byte2; u_char blk_addr[4]; u_char unused; u_char data_len[2]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_read_subchannel { u_char op_code; - u_char :1; - u_char msf:1; - u_char :3; - u_char lun:3; - u_char :6; - u_char subQ:1; - u_char :1; + u_char byte2; + u_char byte3; +#define SRS_SUBQ 0x40 u_char subchan_format; u_char unused[2]; u_char track; u_char data_len[2]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_read_toc { u_char op_code; - u_char :1; - u_char msf:1; - u_char :3; - u_char lun:3; + u_char byte2; u_char unused[4]; u_char from_track; u_char data_len[2]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; ; struct scsi_read_cd_capacity { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char addr_3; /* Most Significant */ u_char addr_2; u_char addr_1; u_char addr_0; /* Least Significant */ u_char unused[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; /* @@ -211,26 +179,6 @@ struct scsi_read_cd_capacity #define PLAY_TRACK_REL_BIG 0xa9 /* cdrom play track/index mode */ -struct cd_inquiry_data /* in case there is some special info */ -{ - u_char device_type:5; - u_char device_qualifier:3; - u_char dev_qual2:7; - u_char removable:1; - u_char ansii_version:3; - u_char :5; - u_char response_format; - u_char additional_length; - u_char unused[2]; - u_char :3; - u_char can_link:1; - u_char can_sync:1; - u_char :3; - char vendor[8]; - char product[16]; - char revision[4]; - u_char extra[8]; -}; struct scsi_read_cd_cap_data { @@ -246,32 +194,31 @@ struct scsi_read_cd_cap_data union cd_pages { -#define AUDIO_PAGE 0x0e struct audio_page { - u_char page_code:6; - u_char :1; - u_char ps:1; + u_char page_code; +#define CD_PAGE_CODE 0x3F +#define AUDIO_PAGE 0x0e +#define CD_PAGE_PS 0x80 u_char param_len; - u_char :1; - u_char sotc:1; - u_char immed:1; - u_char :5; + u_char flags; +#define CD_PA_SOTC 0x02 +#define CD_PA_IMMED 0x04 u_char unused[2]; - u_char format_lba:4; - u_char :3; - u_char apr_valid:1; + u_char format_lba; +#define CD_PA_FORMAT_LBA 0x0F +#define CD_PA_APR_VALID 0x80 u_char lb_per_sec[2]; struct port_control { - u_char channels:4; + u_char channels; +#define CHANNEL 0x0F #define CHANNEL_0 1 #define CHANNEL_1 2 #define CHANNEL_2 4 #define CHANNEL_3 8 #define LEFT_CHANNEL CHANNEL_0 #define RIGHT_CHANNEL CHANNEL_1 - u_char :4; u_char volume; } port[4]; #define LEFT_PORT 0 diff --git a/sys/scsi/scsi_changer.h b/sys/scsi/scsi_changer.h index 16ca71fe833a..172f9c382e13 100644 --- a/sys/scsi/scsi_changer.h +++ b/sys/scsi/scsi_changer.h @@ -1,3 +1,15 @@ +/* + * HISTORY + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system + * + */ + /* * SCSI changer interface description */ @@ -29,17 +41,15 @@ struct scsi_read_element_status { u_char op_code; - u_char element_type_code:4; - u_char voltag:1; - u_char lun:3; + u_char byte2; +#define SRES_ELEM_TYPE_CODE 0x0F +#define SRES_ELEM_VOLTAG 0x10 u_char starting_element_addr[2]; u_char number_of_elements[2]; u_char resv1; u_char allocation_length[3]; u_char resv2; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; #define RE_ALL_ELEMENTS 0 #define RE_MEDIUM_TRANSPORT_ELEMENT 1 @@ -50,32 +60,24 @@ struct scsi_read_element_status struct scsi_move_medium { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char transport_element_address[2]; u_char source_address[2]; u_char destination_address[2]; u_char rsvd[2]; - u_char invert:1; - u_char :7; - u_char link:1; - u_char flag:1; - u_char :6; + u_char invert; + u_char control; }; struct scsi_position_to_element { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char transport_element_address[2]; u_char source_address[2]; u_char rsvd[2]; - u_char invert:1; - u_char :7; - u_char link:1; - u_char flag:1; - u_char :6; + u_char invert; + u_char control; }; /* @@ -96,9 +98,9 @@ struct scsi_element_status_data struct element_status_page { u_char element_type_code; - u_char :5; - u_char avoltag:1; - u_char pvoltag:1; + u_char flags; +#define ESP_AVOLTAG 0x40 +#define ESP_PVOLTAG 0x80 u_char element_descriptor_length[2]; u_char rsvd; u_char byte_count_of_descriptor_data[3]; diff --git a/sys/scsi/scsi_disk.h b/sys/scsi/scsi_disk.h index 75f81509526e..38e53c556650 100644 --- a/sys/scsi/scsi_disk.h +++ b/sys/scsi/scsi_disk.h @@ -1,16 +1,29 @@ - /* * HISTORY * $Log: scsi_disk.h,v $ - * Revision 1.1.1.1 1993/06/12 14:57:27 rgrimes - * Initial import, 0.1 + pk 0.2.4-B1 - * + * Revision 1.3 93/08/05 21:38:11 julian + * fix the definitionof the last byte of each scsi command. + * + * Revision 1.2 93/07/31 22:52:42 julian + * removed all bitfields + * + * Revision 1.1 93/04/12 21:51:04 root + * checkin for 'jules' + * * Revision 1.2 1992/10/13 03:14:21 julian * added the load-eject field in 'start/stop' for removable devices. * * Revision 1.1 1992/09/26 22:11:29 julian * Initial revision * + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system + * */ /* @@ -73,73 +86,58 @@ struct scsi_reassign_blocks { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_rw { u_char op_code; - u_char addr_2:5; /* Most significant */ - u_char lun:3; + u_char addr_2; /* Most significant */ +#define SRW_TOPADDR 0x1F /* only 5 bits here */ u_char addr_1; u_char addr_0; /* least significant */ u_char length; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_rw_big { u_char op_code; - u_char rel_addr:1; - u_char :4; /* Most significant */ - u_char lun:3; - u_char addr_3; + u_char byte2; +#define SRWB_RELADDR 0x01 + u_char addr_3; /* Most significant */ u_char addr_2; u_char addr_1; u_char addr_0; /* least significant */ u_char reserved;; u_char length2; u_char length1; - u_char link:1; - u_char flag:1; - u_char :4; - u_char vendor:2; + u_char control; }; struct scsi_read_capacity { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char addr_3; /* Most Significant */ u_char addr_2; u_char addr_1; u_char addr_0; /* Least Significant */ u_char unused[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; }; struct scsi_start_stop { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[2]; - u_char start:1; - u_char loej:1; - u_char :6; - u_char link:1; - u_char flag:1; - u_char :6; + u_char how; +#define SSS_START 0x01 +#define SSS_LOEJ 0x02 + u_char control; }; @@ -190,8 +188,8 @@ struct scsi_reassign_blocks_data union disk_pages /* this is the structure copied from osf */ { struct page_disk_format { - u_char pg_code:6; /* page code (should be 3) */ - u_char :2; + u_char pg_code; /* page code (should be 3) */ +#define DISK_PGCODE 0x3F /* only 6 bits valid */ u_char pg_length; /* page length (should be 0x16) */ u_char trk_z_1; /* tracks per zone (MSB) */ u_char trk_z_0; /* tracks per zone (LSB) */ @@ -211,17 +209,16 @@ union disk_pages /* this is the structure copied from osf */ u_char trk_skew_0; /* track skew factor (LSB) */ u_char cyl_skew_1; /* cylinder skew (MSB) */ u_char cyl_skew_0; /* cylinder skew (LSB) */ - u_char reserved1:4; - u_char surf:1; - u_char rmb:1; - u_char hsec:1; - u_char ssec:1; + u_char flags; /* various */ +#define DISK_FMT_SURF 0x10 +#define DISK_FMT_RMB 0x20 +#define DISK_FMT_HSEC 0x40 +#define DISK_FMT_SSEC 0x80 u_char reserved2; u_char reserved3; } disk_format; struct page_rigid_geometry { - u_char pg_code:7; /* page code (should be 4) */ - u_char mbone:1; /* must be one */ + u_char pg_code; /* page code (should be 4) */ u_char pg_length; /* page length (should be 0x16) */ u_char ncyl_2; /* number of cylinders (MSB) */ u_char ncyl_1; /* number of cylinders */ diff --git a/sys/scsi/scsi_tape.h b/sys/scsi/scsi_tape.h index f4a26d756124..e43aa8305aec 100644 --- a/sys/scsi/scsi_tape.h +++ b/sys/scsi/scsi_tape.h @@ -1,13 +1,20 @@ /* * HISTORY * $Log: scsi_tape.h,v $ + * Revision 1.5 93/08/05 21:38:14 julian + * fix the definitionof the last byte of each scsi command. * - * julian - added some special stuff for some OLD scsi tapes (CIPHER - * ST150S) - * - * Revision 1.1.1.1 1993/06/12 14:57:27 rgrimes - * Initial import, 0.1 + pk 0.2.4-B1 - * + * Revision 1.4 93/08/01 02:39:40 julian + * compiles.. no mode bitfields + * + * Revision 1.3 93/07/31 23:05:40 root + * removed all bitfields + * + * Revision 1.2 93/05/10 23:57:23 root + * added some special stuff for some OLD scsi tapes (CIPHER ST150S) + * + * Revision 1.1 93/04/12 21:51:06 root + * checkin for 'jules' * * Revision 1.2 1993/01/26 18:39:08 julian * add the 'write protected' bit in the device status struct. @@ -15,6 +22,14 @@ * Revision 1.1 1992/09/26 22:10:21 julian * Initial revision * + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system + * */ /* @@ -41,6 +56,10 @@ * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 */ + + + + /* * SCSI command format */ @@ -49,25 +68,19 @@ struct scsi_rw_tape { u_char op_code; - u_char fixed:1; - u_char :4; - u_char lun:3; + u_char byte2; +#define SRWT_FIXED 0x01 u_char len[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; } rw_tape; struct scsi_space { u_char op_code; - u_char code:2; - u_char :3; - u_char lun:3; + u_char byte2; +#define SS_CODE 0x03 u_char number[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; } space; #define SP_BLKS 0 #define SP_FILEMARKS 1 @@ -77,52 +90,40 @@ struct scsi_space struct scsi_write_filemarks { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char number[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; } write_filemarks; struct scsi_rewind { u_char op_code; - u_char immed:1; - u_char :4; - u_char lun:3; + u_char byte2; +#define SR_IMMED 0x01 u_char unused[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; } rewind; struct scsi_load { u_char op_code; - u_char immed:1; - u_char :4; - u_char lun:3; + u_char byte2; +#define SL_IMMED 0x01 u_char unused[2]; - u_char load:1; - u_char reten:1; - u_char :6; - u_char link:1; - u_char flag:1; - u_char :6; + u_char how; + u_char control; } load; #define LD_UNLOAD 0 #define LD_LOAD 1 +#define LD_RETEN 2 + struct scsi_blk_limits { u_char op_code; - u_char :5; - u_char lun:3; + u_char byte2; u_char unused[3]; - u_char link:1; - u_char flag:1; - u_char :6; + u_char control; } blk_limits; /* @@ -149,15 +150,13 @@ struct scsi_blk_limits_data u_char min_length_0; /* Least significant */ }; -struct scsi_mode_header_tape -{ - u_char data_length; /* Sense data length */ - u_char medium_type; - u_char speed:4; - u_char buf_mode:3; - u_char write_protected:1; - u_char blk_desc_len; -}; +/* defines for the device specific byte in the mode select/sense header */ +#define SMH_DSP_SPEED 0x0F +#define SMH_DSP_BUFF_MODE 0x70 +#define SMH_DSP_BUFF_MODE_OFF 0x00 +#define SMH_DSP_BUFF_MODE_ON 0x10 +#define SMH_DSP_BUFF_MODE_MLTI 0x20 +#define SMH_DSP_WRITE_PROT 0x80 /* A special for the CIPHER ST150S(old drive) */ struct blk_desc_cipher @@ -166,9 +165,9 @@ struct blk_desc_cipher u_char nblocks[3]; u_char reserved; u_char blklen[3]; - u_char sec:1; /* soft error count */ - u_char aui:1; /* autoload inhibit */ - u_char :6; + u_char other; +#define ST150_SEC 0x01 /* soft error count */ +#define SR150_AUI 0x02 /* autoload inhibit */ }; diff --git a/sys/scsi/scsiconf.c b/sys/scsi/scsiconf.c index 264dc1bc68c6..04aec868927d 100644 --- a/sys/scsi/scsiconf.c +++ b/sys/scsi/scsiconf.c @@ -12,6 +12,13 @@ * on the understanding that TFS is not responsible for the correct * functioning of this software in any circumstances. * + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system */ /* @@ -19,11 +26,9 @@ */ /* - * $Log: - * 23 May 93 Rodney W. Grimes ADDED Pioneer DRM-600 cd changer - * - */ - +$Log: +* +*/ #include #include "st.h" #include "sd.h" @@ -131,8 +136,6 @@ knowndevs[] = { #if NCD > 0 { T_READONLY,T_REMOV,"SONY ","CD-ROM CDU-8012 " ,"3.1a",cdattach,"cd",SC_ONE_LU }, - { T_READONLY,T_REMOV,"PIONEER ","CD-ROM DRM-600 " - ,"any",cdattach,"cd",SC_MORE_LUS }, #endif NCD #if NBLL > 0 { T_PROCESSOR,T_FIXED,"AEG ","READER " @@ -174,7 +177,7 @@ struct scsi_switch *scsi_switch; #if SCSI_DELAY > 2 printf("waiting for scsi devices to settle\n"); #else SCSI_DELAY > 2 -#define SCSI_DELAY 15 +#define SCSI_DELAY 2 #endif SCSI_DELAY > 2 #else #define SCSI_DELAY 2 @@ -339,19 +342,10 @@ int *maybe_more; desc[12]); } - type = inqbuf.device_type; - qualifier = inqbuf.device_qualifier; - remov = inqbuf.removable; + type = inqbuf.device & SID_TYPE; + qualifier = inqbuf.device & SID_QUAL; + remov = inqbuf.dev_qual2 & SID_REMOVABLE; - /* Check for a non-existent unit. If the device is returning - * this much, then we must set the flag that has - * the searcher keep looking on other luns. - */ - if (qualifier == 3 && type == T_NODEVICE) - { - *maybe_more = 1; - return (struct scsidevs *)0; - } /* Any device qualifier that has * the top bit set (qualifier&4 != 0) is vendor specific and @@ -360,20 +354,31 @@ int *maybe_more; switch(qualifier) { - case 0: + case SID_QUAL_LU_OK: qtype=""; break; - case 1: + + case SID_QUAL_LU_OFFLINE: qtype=", Unit not Connected!"; break; - case 2: + + case SID_QUAL_RSVD: qtype=", Reserved Peripheral Qualifier!"; - break; - case 3: - qtype=", The Target can't support this Unit!"; + *maybe_more = 1; + return (struct scsidevs *)0; break; - default: + case SID_QUAL_BAD_LU: + /* + * Check for a non-existent unit. If the device is returning + * this much, then we must set the flag that has + * the searcher keep looking on other luns. + */ + qtype=", The Target can't support this Unit!"; + *maybe_more = 1; + return (struct scsidevs *)0; + + default: dtype="vendor specific"; qtype=""; *maybe_more = 1; @@ -381,48 +386,53 @@ int *maybe_more; } if (dtype == 0) + { switch(type) { - case T_DIRECT: - dtype="direct"; - break; - case T_SEQUENTIAL: - dtype="sequential"; - break; - case T_PRINTER: - dtype="printer"; - break; - case T_PROCESSOR: - dtype="processor"; - break; - case T_READONLY: - dtype="readonly"; - break; - case T_WORM: - dtype="worm"; - break; - case T_SCANNER: - dtype="scanner"; - break; - case T_OPTICAL: - dtype="optical"; - break; - case T_CHANGER: - dtype="changer"; - break; - case T_COMM: - dtype="communication"; - break; - default: - dtype="unknown"; - break; + case T_DIRECT: + dtype="direct"; + break; + case T_SEQUENTIAL: + dtype="sequential"; + break; + case T_PRINTER: + dtype="printer"; + break; + case T_PROCESSOR: + dtype="processor"; + break; + case T_READONLY: + dtype="readonly"; + break; + case T_WORM: + dtype="worm"; + break; + case T_SCANNER: + dtype="scanner"; + break; + case T_OPTICAL: + dtype="optical"; + break; + case T_CHANGER: + dtype="changer"; + break; + case T_COMM: + dtype="communication"; + break; + case T_NODEVICE: + *maybe_more = 1; + return (struct scsidevs *)0; + default: + dtype="unknown"; + break; } + } /***********************************************\ * Then if it's advanced enough, more detailed * * information * \***********************************************/ - if(inqbuf.ansii_version > 0) + if((inqbuf.version & SID_ANSII) > 0) { if ((len = inqbuf.additional_length + ( (char *)inqbuf.unused @@ -454,14 +464,14 @@ int *maybe_more; ,manu ,model ,version - ,inqbuf.ansii_version + ,inqbuf.version & SID_ANSII ); /***********************************************\ * Try make as good a match as possible with * * available sub drivers * \***********************************************/ bestmatch = (selectdev(unit,target,lu,&scsi_switch, - qualifier,type,remov,manu,model,version)); + qualifier,type,remov?T_REMOV:T_FIXED,manu,model,version)); if((bestmatch) && (bestmatch->flags & SC_MORE_LUS)) { *maybe_more = 1; @@ -486,7 +496,7 @@ char *manu,*model,*rev; struct scsidevs *bestmatch = (struct scsidevs *)0; struct scsidevs *thisentry = knowndevs; - type |= (qualifier << 5); + type |= qualifier; /* why? */ thisentry--; while( count++ < numents) @@ -605,9 +615,10 @@ retry: scsi_xfer.error=0; * correct response. * *( especially exabytes) * \*******************************************************/ - if(scsi_xfer.sense.error_class == 7 ) + if(((scsi_xfer.sense.error_code & SSD_ERRCODE) == 0x70 ) + ||((scsi_xfer.sense.error_code & SSD_ERRCODE) == 0x71 )) { - key = scsi_xfer.sense.ext.extended.sense_key ; + key = scsi_xfer.sense.ext.extended.flags & SSD_KEY ; switch(key) { case 2: /* not ready BUT PRESENT! */ @@ -690,8 +701,8 @@ retry: scsi_xfer.error=0; * correct response. * *( especially exabytes) * \*******************************************************/ - if((scsi_xfer.sense.error_class == 7 ) - && (scsi_xfer.sense.ext.extended.sense_key == 6)) + if(((scsi_xfer.sense.error_code & SSD_ERRCODE) == 0x70 ) + && ((scsi_xfer.sense.ext.extended.flags & SSD_KEY) == 6)) { /* it's changed so it's there */ spinwait(1000); { diff --git a/sys/scsi/scsiconf.h b/sys/scsi/scsiconf.h index 64457886e736..c36efde535c8 100644 --- a/sys/scsi/scsiconf.h +++ b/sys/scsi/scsiconf.h @@ -12,6 +12,13 @@ * on the understanding that TFS is not responsible for the correct * functioning of this software in any circumstances. * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system + * */ /* diff --git a/sys/scsi/sd.c b/sys/scsi/sd.c index fda382beeda0..af85d878f941 100644 --- a/sys/scsi/sd.c +++ b/sys/scsi/sd.c @@ -12,9 +12,16 @@ * on the understanding that TFS is not responsible for the correct * functioning of this software in any circumstances. * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system + * */ -static char rev[] = "$Revision: 1.2 $"; +static char rev[] = "$Revision: 1.5 $"; /* * Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992 @@ -134,7 +141,7 @@ struct scsi_switch *scsi_switch; \*******************************************************/ if( unit >= NSD) { - printf("Too many scsi disks..(%d > %d) reconfigure kernel",(unit + 1),NSD); + printf("Too many scsi disks..(%d > %d) reconfigure kernel\n",(unit + 1),NSD); return(0); } /*******************************************************\ @@ -174,7 +181,7 @@ struct scsi_switch *scsi_switch; * request must specify this. * \*******************************************************/ sd_get_parms(unit, SCSI_NOSLEEP | SCSI_NOMASK); - printf("sd%d: %dMB, cyls %d, heads %d, secs %d, bytes/sec %d\n", + printf(" sd%d: %dMB, cyls %d, heads %d, secs %d, bytes/sec %d\n", unit, ( dp->cyls * dp->heads @@ -904,7 +911,7 @@ int unit,type,flags; bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = PREVENT_ALLOW; - scsi_cmd.prevent=type; + scsi_cmd.how=type; return (sd_scsi_cmd(unit, &scsi_cmd, sizeof(scsi_cmd), @@ -923,7 +930,7 @@ int unit,flags; bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = START_STOP; - scsi_cmd.start = 1; + scsi_cmd.how = SSS_START; return (sd_scsi_cmd(unit, &scsi_cmd, @@ -995,7 +1002,7 @@ int sd_get_parms(unit, flags) { bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = MODE_SENSE; - scsi_cmd.page_code = 3; + scsi_cmd.page = 3; scsi_cmd.length = 0x24; /*******************************************************\ * do the command, but we don't need the results * @@ -1032,7 +1039,7 @@ int sd_get_parms(unit, flags) \*******************************************************/ bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = MODE_SENSE; - scsi_cmd.page_code = 4; + scsi_cmd.page = 4; scsi_cmd.length = 0x20; /*******************************************************\ * If the command worked, use the results to fill out * @@ -1251,11 +1258,11 @@ struct scsi_xfer *xs; silent = (xs->flags & SCSI_SILENT); sense = &(xs->sense); - switch(sense->error_class) + switch(sense->error_code & SSD_ERRCODE) { - case 7: + case 0x70: { - key=sense->ext.extended.sense_key; + key=sense->ext.extended.flags & SSD_KEY; switch(key) { case 0x0: @@ -1264,7 +1271,7 @@ struct scsi_xfer *xs; if(!silent) { printf("sd%d: soft error(corrected) ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)", (sense->ext.extended.info[0] <<24)| @@ -1283,7 +1290,7 @@ struct scsi_xfer *xs; if(!silent) { printf("sd%d: medium error ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)", (sense->ext.extended.info[0] <<24)| @@ -1320,7 +1327,7 @@ struct scsi_xfer *xs; { printf("sd%d: attempted protection violation ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1336,7 +1343,7 @@ struct scsi_xfer *xs; { printf("sd%d: block wrong state (worm)\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1364,7 +1371,7 @@ struct scsi_xfer *xs; { printf("sd%d: search returned\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1384,7 +1391,7 @@ struct scsi_xfer *xs; { printf("sd%d: verify miscompare\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1402,19 +1409,12 @@ struct scsi_xfer *xs; } break; } - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: + default: { - if(!silent)printf("sd%d: error class %d code %d\n", + if(!silent)printf("sd%d: code %d\n", unit, - sense->error_class, - sense->error_code); - if(sense->valid) + sense->error_code & SSD_ERRCODE); + if(sense->error_code & SSD_ERRCODE_VALID) if(!silent)printf("block no. %d (decimal)\n", (sense->ext.unextended.blockhi <<16) + (sense->ext.unextended.blockmed <<8) @@ -1446,143 +1446,13 @@ sdsize(dev_t dev) return((int)sd->disklabel.d_partitions[part].p_size); } -#ifdef SCSIDUMP -#include -/***********************************************************************\ -* dump all of physical memory into the partition specified, starting * -* at offset 'dumplo' into the partition. * -\***********************************************************************/ -static struct scsi_xfer sx; -#define MAXTRANSFER 8 /* 1 page at a time */ -int -sddump(dev_t dev) /* dump core after a system crash */ -{ - register struct sd_data *sd; /* disk unit to do the IO */ - long num; /* number of sectors to write */ - int unit, part, sdc; - long blkoff, blknum, blkcnt; - long nblocks; - char *addr; - struct scsi_rw_big cmd; - extern int Maxmem; - static sddoingadump = 0 ; - extern caddr_t CADDR1; /* map the page we are about to write, here*/ - struct scsi_xfer *xs = &sx; - int retval; - - addr = (char *) 0; /* starting address */ - - /* toss any characters present prior to dump */ - while (sgetc(1)) - ; - - /* size of memory to dump */ - num = Maxmem; - unit = UNIT(dev); /* eventually support floppies? */ - part = PARTITION(dev); /* file system */ - /* check for acceptable drive number */ - if (unit >= NSD) return(ENXIO); /* 31 Jul 92*/ - - sd = sd_data+unit; - /* was it ever initialized etc. ? */ - if (!(sd->flags & SDINIT)) return (ENXIO); - if (sd->flags & SDVALID != SDVALID) return (ENXIO) ; - if (sd->flags & SDWRITEPROT) return (ENXIO); - - /* Convert to disk sectors */ - num = (u_long) num * NBPG / sd->disklabel.d_secsize; - - /* check if controller active */ - if (sddoingadump) return(EFAULT); - - nblocks = sd->disklabel.d_partitions[part].p_size; - blkoff = sd->disklabel.d_partitions[part].p_offset; - - /* check transfer bounds against partition size */ - if ((dumplo < 0) || ((dumplo + num) > nblocks)) - return(EINVAL); - - sddoingadump = 1 ; - - blknum = dumplo + blkoff; - while (num > 0) - { - if (blkcnt > MAXTRANSFER) blkcnt = MAXTRANSFER; - pmap_enter( kernel_pmap, - CADDR1, - trunc_page(addr), - VM_PROT_READ, - TRUE); -#ifndef NOT_TRUSTED - /*******************************************************\ - * Fill out the scsi command * - \*******************************************************/ - bzero(&cmd, sizeof(cmd)); - cmd.op_code = WRITE_BIG; - cmd.addr_3 = (blknum & 0xff000000) >> 24; - cmd.addr_2 = (blknum & 0xff0000) >> 16; - cmd.addr_1 = (blknum & 0xff00) >> 8; - cmd.addr_0 = blknum & 0xff; - cmd.length2 = (blkcnt & 0xff00) >> 8; - cmd.length1 = (blkcnt & 0xff); - /*******************************************************\ - * Fill out the scsi_xfer structure * - * Note: we cannot sleep as we may be an interrupt * - \*******************************************************/ - bzero(xs, sizeof(sx)); - xs->flags |= SCSI_NOMASK|SCSI_NOSLEEP|INUSE; - xs->adapter = sd->ctlr; - xs->targ = sd->targ; - xs->lu = sd->lu; - xs->retries = SD_RETRIES; - xs->timeout = 10000;/* 10000 millisecs for a disk !*/ - xs->cmd = (struct scsi_generic *)&cmd; - xs->cmdlen = sizeof(cmd); - xs->resid = blkcnt * 512; - xs->when_done = 0; - xs->done_arg = unit; - xs->done_arg2 = (int)xs; - xs->error = XS_NOERROR; - xs->bp = 0; - xs->data = (u_char *)CADDR1; - xs->datalen = blkcnt * 512; - - /*******************************************************\ - * Pass all this info to the scsi driver. * - \*******************************************************/ - retval = (*(sd->sc_sw->scsi_cmd))(xs); - switch(retval) - { - case SUCCESSFULLY_QUEUED: - case HAD_ERROR: - return(ENXIO); /* we said not to sleep! */ - case COMPLETE: - break; - default: - return(ENXIO); /* we said not to sleep! */ - } -#else NOT_TRUSTED - printf ("sd%d addr 0x%x, blk %d\n",unit,addr,blknum); -#endif - - if ((unsigned)addr % (1024*1024) == 0) printf("%d ", num/2048) ; - /* update block count */ - num -= MAXTRANSFER; - blknum += MAXTRANSFER ; - (int) addr += 512 * MAXTRANSFER; - - /* operator aborting dump? */ - if (sgetc(1)) - return(EINTR); - } - return(0); -} -#else /* No SCSIDUMP CODE */ sddump() { - printf("\nsddump() -- not implemented\n"); - DELAY(100000000); /* 100 seconds */ - return(-1); + printf("sddump() -- not implemented\n"); + return(-1); } -#endif + + + + diff --git a/sys/scsi/st.c b/sys/scsi/st.c index 0fd40d4e6d0f..5b9e8ea168e7 100644 --- a/sys/scsi/st.c +++ b/sys/scsi/st.c @@ -12,6 +12,13 @@ * on the understanding that TFS is not responsible for the correct * functioning of this software in any circumstances. * + * + * PATCHES MAGIC LEVEL PATCH THAT GOT US HERE + * -------------------- ----- ---------------------- + * CURRENT PATCH LEVEL: 1 00098 + * -------------------- ----- ---------------------- + * + * 16 Feb 93 Julian Elischer ADDED for SCSI system */ /* @@ -205,7 +212,7 @@ struct scsi_switch *scsi_switch; unit = next_st_unit++; if( unit >= NST) { - printf("Too many scsi tapes..(%d > %d) reconfigure kernel", + printf("Too many scsi tapes..(%d > %d) reconfigure kernel\n", (unit + 1),NST); return(0); } @@ -240,17 +247,17 @@ struct scsi_switch *scsi_switch; { if(st_test_ready(unit,SCSI_NOSLEEP | SCSI_NOMASK | SCSI_SILENT)) { - printf("st%d: tape present: %d blocks of %d bytes\n", + printf("\tst%d: tape present: %d blocks of %d bytes\n", unit, st->numblks, st->media_blksiz); } else { - printf("st%d: drive empty\n", unit); + printf("\tst%d: drive empty\n", unit); } } else { - printf("st%d: drive offline\n", unit); + printf("\tst%d: drive offline\n", unit); } /*******************************************************\ * Set up the bufs for this device * @@ -301,10 +308,10 @@ int unit; if (scsi_inquire(st->ctlr, st->targ, st->lu, st->sc_sw, &inqbuf, SCSI_NOSLEEP | SCSI_NOMASK | SCSI_SILENT) != COMPLETE) { - printf("st%d: couldn't get device type, using default\n", unit); + printf(" st%d: couldn't get device type, using default\n", unit); return; } - if(inqbuf.ansii_version == 0) + if((inqbuf.version & SID_ANSII) == 0) { /***********************************************\ * If not advanced enough, use default values * @@ -339,7 +346,7 @@ int unit; if ((strcmp(manu, finger->manu) == 0 ) && (strcmp(model2, finger->model) == 0 )) { - printf("st%d: %s is a known rogue\n", unit,finger->name); + printf(" st%d: %s is a known rogue\n", unit,finger->name); st->modes[0] = finger->modes[0]; st->modes[1] = finger->modes[1]; st->modes[2] = finger->modes[2]; @@ -872,7 +879,7 @@ ststart(unit) \*******************************************************/ if(st->flags & ST_FIXEDBLOCKS) { - cmd.fixed = 1; + cmd.byte2 |= SRWT_FIXED; lto3b(bp->b_bcount/st->blksiz,cmd.len); } else @@ -1004,7 +1011,7 @@ struct scsi_xfer *xs; * again for more data... we have it all * * SO SET THE ERROR BIT! * * * - * UNDER MACH:(CMU) * + * UNDER MACH (CMU) and NetBSD: * * To indicate the same as above, we * * need only have a non 0 resid that is * * less than the b_bcount, but the * @@ -1026,6 +1033,7 @@ struct scsi_xfer *xs; * for EOM and resid == count for EOF). * * We will report the EOx NEXT time.. * \***************************************/ +/* how do I distinguish NetBSD? at present it's wrong for NetBsd */ #ifdef MACH /*osf and cmu varieties */ #ifdef OSF bp->b_flags |= B_ERROR; @@ -1139,7 +1147,7 @@ caddr_t arg; unsigned int opri; int errcode = 0; unsigned char unit; - int number,flags,ret; + int number,flags; struct st_data *st; /*******************************************************\ @@ -1166,7 +1174,6 @@ caddr_t arg; g->mt_dns_high = st->modes[HIGH_DSTY].density; g->mt_dns_medium = st->modes[MED_DSTY].density; g->mt_dns_low = st->modes[LOW_DSTY].density; - ret=TRUE; break; } @@ -1186,29 +1193,29 @@ caddr_t arg; switch ((short)(mt->mt_op)) { case MTWEOF: /* write an end-of-file record */ - ret = st_write_filemarks(unit,number,flags); + if(!st_write_filemarks(unit,number,flags)) errcode = EIO; st_data[unit].flags &= ~ST_WRITTEN; break; case MTFSF: /* forward space file */ - ret = st_space(unit,number,SP_FILEMARKS,flags); + if(!st_space(unit,number,SP_FILEMARKS,flags)) errcode = EIO; break; case MTBSF: /* backward space file */ - ret = st_space(unit,-number,SP_FILEMARKS,flags); + if(!st_space(unit,-number,SP_FILEMARKS,flags)) errcode = EIO; break; case MTFSR: /* forward space record */ - ret = st_space(unit,number,SP_BLKS,flags); + if(!st_space(unit,number,SP_BLKS,flags)) errcode = EIO; break; case MTBSR: /* backward space record */ - ret = st_space(unit,-number,SP_BLKS,flags); + if(!st_space(unit,-number,SP_BLKS,flags)) errcode = EIO; break; case MTREW: /* rewind */ - ret = st_rewind(unit,FALSE,flags); + if(!st_rewind(unit,FALSE,flags)) errcode = EIO; break; case MTOFFL: /* rewind and put the drive offline */ - if((ret = st_rewind(unit,FALSE,flags))) + if(st_rewind(unit,FALSE,flags)) { st_prevent(unit,PR_ALLOW,0); - ret = st_load(unit,LD_UNLOAD,flags); + st_load(unit,LD_UNLOAD,flags); } else { @@ -1218,14 +1225,13 @@ caddr_t arg; case MTNOP: /* no operation, sets status only */ case MTCACHE: /* enable controller cache */ case MTNOCACHE: /* disable controller cache */ - ret = TRUE;; break; case MTSETBSIZ: /* Set block size for device */ if (st->blkmin == st->blkmax) { /* This doesn't make sense for a */ /* real fixed block device */ - ret = FALSE; + errcode = EINVAL; } else { @@ -1238,14 +1244,13 @@ caddr_t arg; else { if (number < st->blkmin || number > st->blkmax) - { ret = FALSE; - ret = FALSE; + { + errcode = EINVAL; } else { st->blksiz = number; st->flags |= ST_FIXEDBLOCKS; - ret = TRUE; } } } @@ -1257,51 +1262,49 @@ caddr_t arg; case MTSETHDNSTY: /* Set high density defaults for device */ if (number < 0 || number > SCSI_2_MAX_DENSITY_CODE) { - ret = EINVAL; + errcode = EINVAL; } else { st->modes[HIGH_DSTY].density = number; - ret = TRUE; } break; case MTSETMDNSTY: /* Set medium density defaults for device */ if (number < 0 || number > SCSI_2_MAX_DENSITY_CODE) { - ret = EINVAL; + errcode = EINVAL; } else { st->modes[MED_DSTY].density = number; - ret = TRUE; } break; case MTSETLDNSTY: /* Set low density defaults for device */ if (number < 0 || number > SCSI_2_MAX_DENSITY_CODE) { - ret = FALSE; + errcode = EINVAL; } else { st->modes[LOW_DSTY].density = number; - ret = TRUE; } break; default: - return EINVAL; + errcode = EINVAL; } break; } case MTIOCIEOT: case MTIOCEEOT: - ret=TRUE; break; + default: + errcode = EINVAL; } - return(ret?ESUCCESS:EIO); + return errcode; } @@ -1427,13 +1430,13 @@ int unit,flags; struct scsi_mode_sense scsi_cmd; struct scsi_sense { - struct scsi_mode_header_tape header; + struct scsi_mode_header header; struct blk_desc blk_desc; }scsi_sense; struct scsi_sense_page_0 { - struct scsi_mode_header_tape header; + struct scsi_mode_header header; struct blk_desc blk_desc; unsigned char sense_data[PAGE_0_SENSE_DATA_SIZE]; /* Tandberg tape drives returns page 00 */ @@ -1499,9 +1502,11 @@ int unit,flags; unit, st->numblks, st->media_blksiz, - (((struct scsi_sense *)scsi_sense_ptr)->header.write_protected ? + ((((struct scsi_sense *)scsi_sense_ptr)->header.dev_spec + & SMH_DSP_WRITE_PROT) ? "protected" : "enabled"), - (((struct scsi_sense *)scsi_sense_ptr)->header.buf_mode ? + ((((struct scsi_sense *)scsi_sense_ptr)->header.dev_spec + & SMH_DSP_BUFF_MODE)? "" : "un") ); } @@ -1526,12 +1531,12 @@ int unit,flags,dsty_code; struct scsi_mode_select scsi_cmd; struct dat { - struct scsi_mode_header_tape header; + struct scsi_mode_header header; struct blk_desc blk_desc; }dat; struct dat_page_0 { - struct scsi_mode_header_tape header; + struct scsi_mode_header header; struct blk_desc blk_desc; unsigned char sense_data[PAGE_0_SENSE_DATA_SIZE]; }dat_page_0; @@ -1559,7 +1564,7 @@ int unit,flags,dsty_code; scsi_cmd.op_code = MODE_SELECT; scsi_cmd.length = dat_len; ((struct dat *)dat_ptr)->header.blk_desc_len = sizeof(struct blk_desc); - ((struct dat *)dat_ptr)->header.buf_mode = 1; + ((struct dat *)dat_ptr)->header.dev_spec |= SMH_DSP_BUFF_MODE_ON; ((struct dat *)dat_ptr)->blk_desc.density = dsty_code; if(st->flags & ST_FIXEDBLOCKS) { @@ -1603,7 +1608,7 @@ int unit,number,what,flags; st_data[unit].flags &= ~(ST_AT_FILEMARK | ST_AT_EOM); bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = SPACE; - scsi_cmd.code = what; + scsi_cmd.byte2 = what & SS_CODE; lto3b(number,scsi_cmd.number); if (st_scsi_cmd(unit, &scsi_cmd, @@ -1658,15 +1663,10 @@ int unit,type,flags; st_data[unit].flags &= ~(ST_AT_FILEMARK | ST_AT_EOM); bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = LOAD_UNLOAD; - scsi_cmd.load=type; + scsi_cmd.how=type; if (type == LD_LOAD) { - /*scsi_cmd.reten=TRUE;*/ - scsi_cmd.reten=FALSE; - } - else - { - scsi_cmd.reten=FALSE; + /*scsi_cmd.how |= LD_RETEN;*/ } if (st_scsi_cmd(unit, &scsi_cmd, @@ -1693,7 +1693,7 @@ int unit,type,flags; bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = PREVENT_ALLOW; - scsi_cmd.prevent=type; + scsi_cmd.how=type; if (st_scsi_cmd(unit, &scsi_cmd, sizeof(scsi_cmd), @@ -1720,7 +1720,7 @@ int unit,immed,flags; st_data[unit].flags &= ~(ST_AT_FILEMARK | ST_AT_EOM); bzero(&scsi_cmd, sizeof(scsi_cmd)); scsi_cmd.op_code = REWIND; - scsi_cmd.immed=immed; + scsi_cmd.byte2=immed?SR_IMMED:0?SR_IMMED:0; if (st_scsi_cmd(unit, &scsi_cmd, sizeof(scsi_cmd), @@ -1899,16 +1899,15 @@ struct scsi_xfer *xs; if(st_debug) { int count = 0; - printf("code%x class%x valid%x\n" - ,sense->error_code - ,sense->error_class - ,sense->valid); + printf("code%x valid%x\n" + ,sense->error_code & SSD_ERRCODE + ,sense->error_code & SSD_ERRCODE_VALID ? 1 : 0); printf("seg%x key%x ili%x eom%x fmark%x\n" ,sense->ext.extended.segment - ,sense->ext.extended.sense_key - ,sense->ext.extended.ili - ,sense->ext.extended.eom - ,sense->ext.extended.filemark); + ,sense->ext.extended.flags & SSD_KEY + ,sense->ext.extended.flags & SSD_ILI ? 1 : 0 + ,sense->ext.extended.flags & SSD_EOM ? 1 : 0 + ,sense->ext.extended.flags & SSD_FILEMARK ? 1 : 0); printf("info: %x %x %x %x followed by %d extra bytes\n" ,sense->ext.extended.info[0] ,sense->ext.extended.info[1] @@ -1922,26 +1921,26 @@ struct scsi_xfer *xs; } printf("\n"); } - switch(sense->error_class) + switch(sense->error_code & SSD_ERRCODE) { /***************************************************************\ * If it's class 7, use the extended stuff and interpret the key * \***************************************************************/ - case 7: + case 0x70: { - if(sense->ext.extended.eom) + if(sense->ext.extended.flags & SSD_EOM) { st_data[unit].flags |= ST_AT_EOM; } - if(sense->ext.extended.filemark) + if(sense->ext.extended.flags & SSD_FILEMARK) { st_data[unit].flags |= ST_AT_FILEMARK; } - if(sense->ext.extended.ili) + if(sense->ext.extended.flags & SSD_ILI) { - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { /*******************************\ * In all ili cases, note that * @@ -1970,18 +1969,18 @@ struct scsi_xfer *xs; } }/* there may be some other error. check the rest */ - key=sense->ext.extended.sense_key; + key=sense->ext.extended.flags & SSD_KEY; switch(key) { case 0x0: - if(!(sense->ext.extended.ili)) + if(!(sense->ext.extended.flags & SSD_ILI)) xs->resid = 0; /* XXX check this */ return(ESUCCESS); case 0x1: if(!silent) { printf("st%d: soft error(corrected) ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -1994,7 +1993,7 @@ struct scsi_xfer *xs; printf("\n"); } } - if(!(sense->ext.extended.ili)) + if(!(sense->ext.extended.flags & SSD_ILI)) xs->resid = 0; /* XXX check this */ return(ESUCCESS); case 0x2: @@ -2004,7 +2003,7 @@ struct scsi_xfer *xs; if(!silent) { printf("st%d: medium error ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -2038,7 +2037,7 @@ struct scsi_xfer *xs; { printf("st%d: attempted protection violation " , unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -2057,7 +2056,7 @@ struct scsi_xfer *xs; { printf("st%d: fixed block wrong size \n " , unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("requested size: %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -2087,7 +2086,7 @@ struct scsi_xfer *xs; if(!silent) { printf("st%d: search returned\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -2109,7 +2108,7 @@ struct scsi_xfer *xs; if(!silent) { printf("st%d: verify miscompare\n ", unit); - if(sense->valid) + if(sense->error_code & SSD_ERRCODE_VALID) { printf("block no. %d (decimal)\n", (sense->ext.extended.info[0] <<24)| @@ -2133,19 +2132,12 @@ struct scsi_xfer *xs; /***************************************************************\ * If it's NOT class 7, just report it. * \***************************************************************/ - case 0: - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: + default: { - if(!silent) printf("st%d: error class %d code %d\n", + if(!silent) printf("st%d: error code %d\n", unit, - sense->error_class, - sense->error_code); - if(sense->valid) + sense->error_code & SSD_ERRCODE); + if(sense->error_code & SSD_ERRCODE_VALID) if(!silent) printf("block no. %d (decimal)\n", (sense->ext.unextended.blockhi <<16), + (sense->ext.unextended.blockmed <<8),