summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorjkh <jkh@FreeBSD.org>1994-10-28 13:19:42 +0000
committerjkh <jkh@FreeBSD.org>1994-10-28 13:19:42 +0000
commit685a08f618f1d6486b02feef5b92ac3394ea6396 (patch)
treef25bfc481f2cb006b34dbf02b521cbcb41bb9726 /sys
parent076633a669c18cf80f86ceecd10b4d49f02cd834 (diff)
downloadFreeBSD-src-685a08f618f1d6486b02feef5b92ac3394ea6396.zip
FreeBSD-src-685a08f618f1d6486b02feef5b92ac3394ea6396.tar.gz
Andreas Klemm's tape erase patches from 1.1.5.1
Submitted by: andreas
Diffstat (limited to 'sys')
-rw-r--r--sys/scsi/scsi_tape.h20
-rw-r--r--sys/scsi/st.c47
-rw-r--r--sys/sys/mtio.h8
3 files changed, 72 insertions, 3 deletions
diff --git a/sys/scsi/scsi_tape.h b/sys/scsi/scsi_tape.h
index 920a781..3741136 100644
--- a/sys/scsi/scsi_tape.h
+++ b/sys/scsi/scsi_tape.h
@@ -21,7 +21,7 @@
/*
* Ported to run under 386BSD by Julian Elischer (julian@tfs.com) Sept 1992
*
- * $Id: scsi_tape.h,v 1.8 1993/11/18 05:02:57 rgrimes Exp $
+ * $Id: scsi_tape.h,v 1.9 1994/09/28 20:16:42 se Exp $
*/
#ifndef SCSI_SCSI_TAPE_H
#define SCSI_SCSI_TAPE_H 1
@@ -72,6 +72,23 @@ struct scsi_rewind
u_char control;
} rewind;
+/*
+** Tape erase - AKL: Andreas Klemm <andreas@knobel.gun.de>
+*/
+struct scsi_erase
+{
+ u_char op_code;
+ u_char byte2;
+#define SE_LONG 0x01 /*
+ ** Archive Viper 2525 doesn't allow short
+ ** erase, other tapes possibly don't allow
+ ** that, too.
+ */
+#define SE_IMMED 0x02
+ u_char unused[3];
+ u_char control;
+} erase;
+
struct scsi_load
{
u_char op_code;
@@ -104,6 +121,7 @@ struct scsi_blk_limits
#define WRITE_COMMAND_TAPE 0x0a
#define WRITE_FILEMARKS 0x10
#define SPACE 0x11
+#define ERASE 0x19 /* AKL */
#define LOAD_UNLOAD 0x1b /* same as above */
diff --git a/sys/scsi/st.c b/sys/scsi/st.c
index 8cfbf8d..24a3303 100644
--- a/sys/scsi/st.c
+++ b/sys/scsi/st.c
@@ -12,7 +12,7 @@
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
- * $Id: st.c,v 1.20 1994/10/19 00:09:47 wollman Exp $
+ * $Id: st.c,v 1.21 1994/10/23 21:27:59 wollman Exp $
*/
/*
@@ -153,6 +153,7 @@ static struct rogues gallery[] = /* ends with an all-null entry */
errval st_space __P((u_int32 unit, int32 number, u_int32 what, u_int32 flags));
errval st_rewind __P((u_int32 unit, boolean immed, u_int32 flags));
+errval st_erase __P((u_int32 unit, boolean immed, u_int32 flags)); /* AKL */
errval st_mode_sense __P((u_int32 unit, u_int32 flags));
errval st_decide_mode __P((u_int32 unit, boolean first_read));
errval st_rd_blk_lim __P((u_int32 unit, u_int32 flags));
@@ -1229,6 +1230,9 @@ stioctl(dev, cmd, arg, flag)
case MTREW: /* rewind */
errcode = st_rewind(unit, FALSE, flags);
break;
+ case MTERASE: /* erase - AKL */
+ errcode = st_erase(unit, FALSE, flags);
+ break;
case MTOFFL: /* rewind and put the drive offline */
st_unmount(unit, EJECT);
break;
@@ -1795,6 +1799,47 @@ st_rewind(unit, immed, flags)
flags));
}
+/*
+** Erase the device - AKL: Andreas Klemm <andreas@knobel.gun.de>
+*/
+errval
+st_erase(unit, immed, flags)
+ u_int32 unit, flags;
+ boolean immed;
+{
+ struct scsi_erase scsi_cmd;
+ struct st_data *st = st_data[unit];
+ errval error;
+ int32 nmarks;
+
+ error = st_chkeod(unit, FALSE, &nmarks, flags);
+ if (error != ESUCCESS)
+ return (error);
+ /*
+ ** AKL: Archive Viper 2525 technical manual 5.7 (ERASE 19h):
+ ** tape has to be positioned to BOT first before erase command
+ ** is issued or command is rejected. So we rewind the tape first
+ ** and exit with an error, if the tape can't be rewinded.
+ */
+ error = st_rewind(unit, FALSE, SCSI_SILENT);
+ if (error != ESUCCESS)
+ return (error);
+ st->flags &= ~ST_PER_ACTION;
+ bzero(&scsi_cmd, sizeof(scsi_cmd));
+ scsi_cmd.op_code = ERASE;
+ scsi_cmd.byte2 = SE_LONG; /* LONG_ERASE - AKL */
+ scsi_cmd.byte2 += immed ? SE_IMMED : 0; /* immed bit is here the 2nd! */
+ return (scsi_scsi_cmd(st->sc_link,
+ (struct scsi_generic *) &scsi_cmd,
+ sizeof(scsi_cmd),
+ 0,
+ 0,
+ ST_RETRIES,
+ immed ? 5000 : 300000, /* 5 sec or 5 min */
+ NULL,
+ flags));
+}
+
#ifdef NETBSD
#define SIGNAL_SHORT_READ
#else
diff --git a/sys/sys/mtio.h b/sys/sys/mtio.h
index 9300404..0474239 100644
--- a/sys/sys/mtio.h
+++ b/sys/sys/mtio.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)mtio.h 8.1 (Berkeley) 6/2/93
- * $Id$
+ * $Id: mtio.h,v 1.3 1994/08/02 07:53:17 davidg Exp $
*/
#ifndef _SYS_MTIO_H_
@@ -72,6 +72,12 @@ struct mtop {
/* and range from 0 to 0x17. Sets the value for the openned mode only */
#define MTSETDNSTY 11
+
+/*
+** Tape erase function - AKL: Andreas Klemm <andreas@knobel.gun.de>
+*/
+#define MTERASE 12
+
#endif
/* structure for MTIOCGET - mag tape get status command */
OpenPOWER on IntegriCloud