Augment compression and blocksize support. Update table of known densities.

This commit is contained in:
Justin T. Gibbs 1998-09-15 10:28:20 +00:00
parent b1758a280b
commit bb7f780427
2 changed files with 252 additions and 89 deletions

View File

@ -87,8 +87,8 @@ Rewind the tape
Rewind the tape and place the tape unit off-line
(Count is ignored).
.It Cm erase
Erase the tape
(Count is ignored).
Erase the tape.
A count of 0 disables long erase, which is on by default.
.It Cm retension
Re-tension the tape
(one full wind forth and back, Count is ignored).
@ -115,8 +115,35 @@ Forward space to end of data, identical to
.Cm eom .
.It Cm comp
Set compression mode.
(The kernel counterpart of this has not yet been reported to work
correctly.)
There are currently several possible values for the compression mode:
.Pp
.Bl -tag -width 123456789 -compact
.It off
Turn compression off
.It on
Turn compression on
.It none
Same as
.Ar off
.It enable
Same as
.Ar on
.It IDRC
IBM Improved Data Recording Capability compression (0x10).
.It DCLZ
DCLZ compression algorithm (0x20).
.El
.Pp
In addition to the above recognized compression keywords, the user can
supply a numeric compression algorithm for the tape drive to use. In most
cases, simply turning the compression
.Sq on
will have the desired effect of enabling the default compression algorithm
supported by the drive. If this is not the case (see the
.Cm status
display to see which compression algorithm is currently in use), the user
can manually specify one of the supported compression keywords (above), or
supply a numeric compression value.
.El
.Pp
If a tape name is not specified, and the environment variable
@ -124,66 +151,84 @@ If a tape name is not specified, and the environment variable
does not exist;
.Nm
uses the device
.Pa /dev/nrst0 .
.Pa /dev/nrsa0 .
.Pp
.Nm Mt
returns a 0 exit status when the operation(s) were successful,
1 if the command was unrecognized, and 2 if an operation failed.
.Pp
The following density table was taken from the
.Sq Historical sequential access density codes
table (A-1) in Revision 11 of the SCSI-3 Stream Device Commands (SSC)
working draft, dated November 11, 1997.
.Pp
The different density codes are as follows:
.Pp
.Dl 0x0 default for device
.Dl 0xE reserved for ECMA
.Bd -literal -offset indent
Value Tracks Density(bpi) Code Type Reference Note
0x1 9 800 NRZI R X3.22-1983 2
0x2 9 1600 PE R X3.39-1986 2
0x3 9 6250 GCR R X3.54-1986 2
0x5 4/9 8000 GCR C X3.136-1986 1
0x6 9 3200 PE R X3.157-1987 2
0x7 4 6400 IMFM C X3.116-1986 1
0x8 4 8000 GCR CS X3.158-1986 1
0x9 18 37871 GCR C X3B5/87-099 2
0xA 22 6667 MFM C X3B5/86-199 1
0xB 4 1600 PE C X3.56-1986 1
0xC 24 12690 GCR C HI-TC1 1,5
0xD 24 25380 GCR C HI-TC2 1,5
0xF 15 10000 GCR C QIC-120 1,5
0x10 18 10000 GCR C QIC-150 1,5
0x11 26 16000 GCR C QIC-320(525?) 1,5
0x12 30 51667 RLL C QIC-1350 1,5
0x13 1 61000 DDS CS X3B5/88-185A 4
0x14 1 43245 RLL CS X3.202-1991 4
0x15 1 45434 RLL CS ECMA TC17 4
0x16 48 10000 MFM C X3.193-1990 1
0x17 48 42500 MFM C X3B5/91-174 1
.Bd -literal -offset 3n
Value Width Tracks Density Code Type Reference Note
mm in bpmm bpi
0x01 12.7 (0.5) 9 32 (800) NRZI R X3.22-1983 2
0x02 12.7 (0.5) 9 63 (1,600) PE R X3.39-1986 2
0x03 12.7 (0.5) 9 246 (6,250) GCR R X3.54-1986 2
0x05 6.3 (0.25) 4/9 315 (8,000) GCR C X3.136-1986 1
0x06 12.7 (0.5) 9 126 (3,200) PE R X3.157-1987 2
0x07 6.3 (0.25) 4 252 (6,400) IMFM C X3.116-1986 1
0x08 3.81 (0.15) 4 315 (8,000) GCR CS X3.158-1987 1
0x09 12.7 (0.5) 18 1,491 (37,871) GCR C X3.180 2
0x0A 12.7 (0.5) 22 262 (6,667) MFM C X3B5/86-199 1
0x0B 6.3 (0.25) 4 63 (1,600) PE C X3.56-1986 1
0x0C 12.7 (0.5) 24 500 (12,690) GCR C HI-TC1 1,6
0x0D 12.7 (0.5) 24 999 (25,380) GCR C HI-TC2 1,6
0x0F 6.3 (0.25) 15 394 (10,000) GCR C QIC-120 1,6
0x10 6.3 (0.25) 18 394 (10,000) GCR C QIC-150 1,6
0x11 6.3 (0.25) 26 630 (16,000) GCR C QIC-320 1,6
0x12 6.3 (0.25) 30 2,034 (51,667) RLL C QIC-1350 1,6
0x13 3.81 (0.15) 1 2,400 (61,000) DDS CS X3B5/88-185A 5
0x14 8.0 (0.315) 1 1,703 (43,245) RLL CS X3.202-1991 5
0x15 8.0 (0.315) 1 1,789 (45,434) RLL CS ECMA TC17 5
0x16 12.7 (0.5) 48 394 (10,000) MFM C X3.193-1990 1
0x17 12.7 (0.5) 48 1,673 (42,500) MFM C X3B5/91-174 1
0x18 12.7 (0.5) 112 1,673 (42,500) MFM C X3B5/92-50 1
0x1C 6.3 (0.25) 34 1,654 (42,000) MFM C QIC-385M 1,6
0x1D 6.3 (0.25) 32 1,512 (38,400) GCR C QIC-410M 1,6
0x1E 6.3 (0.25) 30 1,385 (36,000) GCR C QIC-1000C 1,6
0x1F 6.3 (0.25) 30 2,666 (67,733) RLL C QIC-2100C 1,6
0x20 6.3 (0.25) 144 2,666 (67,733) RLL C QIC-6GB(M) 1,6
0x21 6.3 (0.25) 144 2,666 (67,733) RLL C QIC-20GB(C) 1,6
0x22 6.3 (0.25) 42 1,600 (40,640) GCR C QIC-2GB(C) ?
0x23 6.3 (0.25) 38 2,666 (67,733) RLL C QIC-875M ?
0x24 3.81 (0.15) 1 2,400 (61,000) CS DDS-2 5
0x25 3.81 (0.15) 1 3,816 (97,000) CS DDS-3 5
0x26 3.81 (0.15) 1 3,816 (97,000) CS DDS-4 5
0x27 8.0 (0.315) 1 3,056 (77,611) RLL CS Mammoth 5
0x28 12.7 (0.5) 36 1,491 (37,871) GCR C X3.224 1
0x29 12.7 (0.5)
0x2A
0x2B 12.7 (0.5) 3 ? ? ? C X3.267 5
.Ed
where Code means:
.Bd -literal -offset indent
NRZI Non Return to Zero, change on ones
GCR Group Code Recording
PE Phase Encoded
IMFM Inverted Modified Frequency Modulation
MFM Modified Frequency Modulation
DDS Dat Data Storage
RLL Run Length Encoding
.Bd -literal -offset 3n
Code Description Type Description
---------------- ----------------
NRZI Non return to zero, change on ones R Reel-to-reel
GCR Group code recording C Cartridge
PE Phase encoded CS Cassette
IMFM Inverted modified frequency modulation
MFM Modified frequency modulation
DDS DAT data storage
RLL Run length limited
.Ed
where Type means:
.Bd -literal -offset indent
R Reel-to-Reel
C Cartridge
CS cassette
.Ed
where Notes means:
.Bd -literal -offset indent
1 Serial Recorded
2 Parallel Recorded
3 Old format know as QIC-11
4 Helical Scan
5 Not ANSI standard, rather industry standard.
.Bd -literal -offset 3n
NOTES
1. Serial recorded.
2. Parallel recorded.
3. Old format known as QIC-11.
5. Helical scan.
6. This is not an American National Standard. The reference is based on
an industry standard definition of the media format.
.Ed
.Sh ENVIRONMENT
@ -202,7 +247,7 @@ is not given.
.Bl -tag -width /dev/*rst[0-9]*xx -compact
.It Pa /dev/*rwt*
QIC-02/QIC-36 magnetic tape interface
.It Pa /dev/*rst[0-9]*
.It Pa /dev/*rsa[0-9]*
SCSI magnetic tape interface
.El
.Sh SEE ALSO

View File

@ -68,8 +68,16 @@ static const char rcsid[] =
#define ZERO_ALLOWED 0x02
#define IS_DENSITY 0x04
#define DISABLE_THIS 0x08
#define IS_COMP 0x10
#endif /* defined(__FreeBSD__) */
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
struct commands {
char *c_name;
int c_code;
@ -95,12 +103,12 @@ struct commands {
{ "status", MTNOP, 1 },
{ "weof", MTWEOF, 0 },
#if defined(__FreeBSD__)
{ "erase", MTERASE, 0 },
{ "erase", MTERASE, 0, ZERO_ALLOWED},
{ "blocksize", MTSETBSIZ, 0, NEED_2ARGS|ZERO_ALLOWED },
{ "density", MTSETDNSTY, 0, NEED_2ARGS|ZERO_ALLOWED|IS_DENSITY },
{ "eom", MTEOD, 1 },
{ "eod", MTEOD, 1 },
{ "comp", MTCOMP, 0, NEED_2ARGS|ZERO_ALLOWED },
{ "comp", MTCOMP, 0, NEED_2ARGS|ZERO_ALLOWED|IS_COMP },
{ "retension", MTRETENS, 1 },
#endif /* defined(__FreeBSD__) */
{ NULL }
@ -113,6 +121,9 @@ void usage __P((void));
void st_status (struct mtget *);
int stringtodens (const char *s);
const char *denstostring (int d);
int denstobp(int d, int bpi);
u_int32_t stringtocomp(const char *s);
const char * comptostring(u_int32_t comp);
void warn_eof __P((void));
#endif /* defined (__FreeBSD__) */
@ -178,6 +189,14 @@ main(argc, argv)
"Using \"%s\" as an alias for %s\n",
*argv, dcanon);
p = "";
} else if (!isdigit(**argv) &&
comp->c_flags & IS_COMP) {
mt_com.mt_count = stringtocomp(*argv);
if ((u_int32_t)mt_com.mt_count == 0xf0f0f0f0)
errx(1, "%s: unknown compression",
*argv);
p = "";
} else
/* allow for hex numbers; useful for density */
mt_com.mt_count = strtol(*argv, &p, 0);
@ -187,6 +206,7 @@ main(argc, argv)
if (mt_com.mt_count <=
#if defined (__FreeBSD__)
((comp->c_flags & ZERO_ALLOWED)? -1: 0)
&& ((comp->c_flags & IS_COMP) == 0)
#else
0
#endif /* defined (__FreeBSD__) */
@ -344,30 +364,65 @@ usage()
struct densities {
int dens;
int bpmm;
int bpi;
const char *name;
} dens [] = {
{ 0x1, "X3.22-1983" },
{ 0x2, "X3.39-1986" },
{ 0x3, "X3.54-1986" },
{ 0x5, "X3.136-1986" },
{ 0x6, "X3.157-1987" },
{ 0x7, "X3.116-1986" },
{ 0x8, "X3.158-1986" },
{ 0x9, "X3B5/87-099" },
{ 0xA, "X3B5/86-199" },
{ 0xB, "X3.56-1986" },
{ 0xC, "HI-TC1" },
{ 0xD, "HI-TC2" },
{ 0xF, "QIC-120" },
{ 0x10, "QIC-150" },
{ 0x11, "QIC-320" },
{ 0x12, "QIC-1350" },
{ 0x13, "X3B5/88-185A" },
{ 0x14, "X3.202-1991" },
{ 0x15, "ECMA TC17" },
{ 0x16, "X3.193-1990" },
{ 0x17, "X3B5/91-174" },
{ 0, 0 }
} dens[] = {
/*
* Taken from T10 Project 997D
* SCSI-3 Stream Device Commands (SSC)
* Revision 11, 4-Nov-97
*/
/*Num. bpmm bpi Reference */
{ 0x1, 32, 800, "X3.22-1983" },
{ 0x2, 63, 1600, "X3.39-1986" },
{ 0x3, 246, 6250, "X3.54-1986" },
{ 0x5, 315, 8000, "X3.136-1986" },
{ 0x6, 126, 3200, "X3.157-1987" },
{ 0x7, 252, 6400, "X3.116-1986" },
{ 0x8, 315, 8000, "X3.158-1987" },
{ 0x9, 491, 37871, "X3.180" },
{ 0xA, 262, 6667, "X3B5/86-199" },
{ 0xB, 63, 1600, "X3.56-1986" },
{ 0xC, 500, 12690, "HI-TC1" },
{ 0xD, 999, 25380, "HI-TC2" },
{ 0xF, 394, 10000, "QIC-120" },
{ 0x10, 394, 10000, "QIC-150" },
{ 0x11, 630, 16000, "QIC-320" },
{ 0x12, 2034, 51667, "QIC-1350" },
{ 0x13, 2400, 61000, "X3B5/88-185A" },
{ 0x14, 1703, 43245, "X3.202-1991" },
{ 0x15, 1789, 45434, "ECMA TC17" },
{ 0x16, 394, 10000, "X3.193-1990" },
{ 0x17, 1673, 42500, "X3B5/91-174" },
{ 0x18, 1673, 42500, "X3B5/92-50" },
{ 0x1C, 1654, 42000, "QIC-385M" },
{ 0x1D, 1512, 38400, "QIC-410M" },
{ 0x1E, 1385, 36000, "QIC-1000C" },
{ 0x1F, 2666, 67733, "QIC-2100C" },
{ 0x20, 2666, 67733, "QIC-6GB(M)" },
{ 0x21, 2666, 67733, "QIC-20GB(C)" },
{ 0x22, 1600, 40640, "QIC-2GB(C)" },
{ 0x23, 2666, 67733, "QIC-875M" },
{ 0x24, 2400, 61000, "DDS-2" },
{ 0x25, 3816, 97000, "DDS-3" },
{ 0x26, 3816, 97000, "DDS-4" },
{ 0x27, 3056, 77611, "Mammoth" },
{ 0x28, 1491, 37871, "X3.224" },
{ 0, 0, 0, NULL }
};
struct compression_types {
u_int32_t comp_number;
const char *name;
} comp_types[] = {
{ 0x00, "none" },
{ 0x00, "off" },
{ 0x10, "IDRC" },
{ 0x20, "DCLZ" },
{ 0xffffffff, "enable" },
{ 0xffffffff, "on" },
{ 0xf0f0f0f0, NULL}
};
const char *
@ -386,6 +441,28 @@ denstostring(int d)
return sd->name;
}
/*
* Given a specific density number, return either the bits per inch or bits
* per millimeter for the given density.
*/
int
denstobp(int d, int bpi)
{
struct densities *sd;
for (sd = dens; sd->dens; sd++)
if (sd->dens == d)
break;
if (sd->dens == 0)
return(0);
else {
if (bpi)
return(sd->bpi);
else
return(sd->bpmm);
}
}
int
stringtodens(const char *s)
{
@ -406,26 +483,67 @@ getblksiz(int bs)
if (bs == 0)
return "variable";
else {
sprintf(buf, "= %d bytes", bs);
sprintf(buf, "%d bytes", bs);
return buf;
}
}
const char *
comptostring(u_int32_t comp)
{
static char buf[20];
struct compression_types *ct;
if (comp == MT_COMP_DISABLED)
return "disabled";
else if (comp == MT_COMP_UNSUPP)
return "unsupported";
for (ct = comp_types; ct->name; ct++)
if (ct->comp_number == comp)
break;
if (ct->comp_number == 0xf0f0f0f0) {
sprintf(buf, "0x%2x", comp);
return(buf);
} else
return(ct->name);
}
u_int32_t
stringtocomp(const char *s)
{
struct compression_types *ct;
size_t l = strlen(s);
for (ct = comp_types; ct->name; ct++)
if (strncasecmp(ct->name, s, l) == 0)
break;
return(ct->comp_number);
}
void
st_status(struct mtget *bp)
{
printf("Present Mode: Density = %-12s Blocksize %s Comp %d\n",
denstostring(bp->mt_density), getblksiz(bp->mt_blksiz), (int)bp->mt_comp);
printf("---------available modes---------\n");
printf("Mode 0: Density = %-12s Blocksize %s\n",
denstostring(bp->mt_density0), getblksiz(bp->mt_blksiz0));
printf("Mode 1: Density = %-12s Blocksize %s\n",
denstostring(bp->mt_density1), getblksiz(bp->mt_blksiz1));
printf("Mode 2: Density = %-12s Blocksize %s\n",
denstostring(bp->mt_density2), getblksiz(bp->mt_blksiz2));
printf("Mode 3: Density = %-12s Blocksize %s\n",
denstostring(bp->mt_density3), getblksiz(bp->mt_blksiz3));
printf("Mode Density Blocksize bpi "
"Compression\n"
"Current: %-12s %-12s %-7d %s\n"
"---------available modes---------\n"
"0: %-12s %-12s %-7d %s\n"
"1: %-12s %-12s %-7d %s\n"
"2: %-12s %-12s %-7d %s\n"
"3: %-12s %-12s %-7d %s\n",
denstostring(bp->mt_density), getblksiz(bp->mt_blksiz),
denstobp(bp->mt_density, TRUE), comptostring(bp->mt_comp),
denstostring(bp->mt_density0), getblksiz(bp->mt_blksiz0),
denstobp(bp->mt_density0, TRUE), comptostring(bp->mt_comp0),
denstostring(bp->mt_density1), getblksiz(bp->mt_blksiz1),
denstobp(bp->mt_density1, TRUE), comptostring(bp->mt_comp1),
denstostring(bp->mt_density2), getblksiz(bp->mt_blksiz2),
denstobp(bp->mt_density2, TRUE), comptostring(bp->mt_comp2),
denstostring(bp->mt_density3), getblksiz(bp->mt_blksiz3),
denstobp(bp->mt_density3, TRUE), comptostring(bp->mt_comp3));
}
void