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 Rewind the tape and place the tape unit off-line
(Count is ignored). (Count is ignored).
.It Cm erase .It Cm erase
Erase the tape Erase the tape.
(Count is ignored). A count of 0 disables long erase, which is on by default.
.It Cm retension .It Cm retension
Re-tension the tape Re-tension the tape
(one full wind forth and back, Count is ignored). (one full wind forth and back, Count is ignored).
@ -115,8 +115,35 @@ Forward space to end of data, identical to
.Cm eom . .Cm eom .
.It Cm comp .It Cm comp
Set compression mode. Set compression mode.
(The kernel counterpart of this has not yet been reported to work There are currently several possible values for the compression mode:
correctly.) .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 .El
.Pp .Pp
If a tape name is not specified, and the environment variable 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; does not exist;
.Nm .Nm
uses the device uses the device
.Pa /dev/nrst0 . .Pa /dev/nrsa0 .
.Pp .Pp
.Nm Mt .Nm Mt
returns a 0 exit status when the operation(s) were successful, returns a 0 exit status when the operation(s) were successful,
1 if the command was unrecognized, and 2 if an operation failed. 1 if the command was unrecognized, and 2 if an operation failed.
.Pp .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: The different density codes are as follows:
.Pp .Pp
.Dl 0x0 default for device .Dl 0x0 default for device
.Dl 0xE reserved for ECMA .Dl 0xE reserved for ECMA
.Bd -literal -offset indent .Bd -literal -offset 3n
Value Tracks Density(bpi) Code Type Reference Note Value Width Tracks Density Code Type Reference Note
0x1 9 800 NRZI R X3.22-1983 2 mm in bpmm bpi
0x2 9 1600 PE R X3.39-1986 2 0x01 12.7 (0.5) 9 32 (800) NRZI R X3.22-1983 2
0x3 9 6250 GCR R X3.54-1986 2 0x02 12.7 (0.5) 9 63 (1,600) PE R X3.39-1986 2
0x5 4/9 8000 GCR C X3.136-1986 1 0x03 12.7 (0.5) 9 246 (6,250) GCR R X3.54-1986 2
0x6 9 3200 PE R X3.157-1987 2 0x05 6.3 (0.25) 4/9 315 (8,000) GCR C X3.136-1986 1
0x7 4 6400 IMFM C X3.116-1986 1 0x06 12.7 (0.5) 9 126 (3,200) PE R X3.157-1987 2
0x8 4 8000 GCR CS X3.158-1986 1 0x07 6.3 (0.25) 4 252 (6,400) IMFM C X3.116-1986 1
0x9 18 37871 GCR C X3B5/87-099 2 0x08 3.81 (0.15) 4 315 (8,000) GCR CS X3.158-1987 1
0xA 22 6667 MFM C X3B5/86-199 1 0x09 12.7 (0.5) 18 1,491 (37,871) GCR C X3.180 2
0xB 4 1600 PE C X3.56-1986 1 0x0A 12.7 (0.5) 22 262 (6,667) MFM C X3B5/86-199 1
0xC 24 12690 GCR C HI-TC1 1,5 0x0B 6.3 (0.25) 4 63 (1,600) PE C X3.56-1986 1
0xD 24 25380 GCR C HI-TC2 1,5 0x0C 12.7 (0.5) 24 500 (12,690) GCR C HI-TC1 1,6
0xF 15 10000 GCR C QIC-120 1,5 0x0D 12.7 (0.5) 24 999 (25,380) GCR C HI-TC2 1,6
0x10 18 10000 GCR C QIC-150 1,5 0x0F 6.3 (0.25) 15 394 (10,000) GCR C QIC-120 1,6
0x11 26 16000 GCR C QIC-320(525?) 1,5 0x10 6.3 (0.25) 18 394 (10,000) GCR C QIC-150 1,6
0x12 30 51667 RLL C QIC-1350 1,5 0x11 6.3 (0.25) 26 630 (16,000) GCR C QIC-320 1,6
0x13 1 61000 DDS CS X3B5/88-185A 4 0x12 6.3 (0.25) 30 2,034 (51,667) RLL C QIC-1350 1,6
0x14 1 43245 RLL CS X3.202-1991 4 0x13 3.81 (0.15) 1 2,400 (61,000) DDS CS X3B5/88-185A 5
0x15 1 45434 RLL CS ECMA TC17 4 0x14 8.0 (0.315) 1 1,703 (43,245) RLL CS X3.202-1991 5
0x16 48 10000 MFM C X3.193-1990 1 0x15 8.0 (0.315) 1 1,789 (45,434) RLL CS ECMA TC17 5
0x17 48 42500 MFM C X3B5/91-174 1 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 .Ed
where Code means: .Bd -literal -offset 3n
.Bd -literal -offset indent Code Description Type Description
NRZI Non Return to Zero, change on ones ---------------- ----------------
GCR Group Code Recording NRZI Non return to zero, change on ones R Reel-to-reel
PE Phase Encoded GCR Group code recording C Cartridge
IMFM Inverted Modified Frequency Modulation PE Phase encoded CS Cassette
MFM Modified Frequency Modulation IMFM Inverted modified frequency modulation
DDS Dat Data Storage MFM Modified frequency modulation
RLL Run Length Encoding DDS DAT data storage
RLL Run length limited
.Ed .Ed
where Type means: .Bd -literal -offset 3n
.Bd -literal -offset indent NOTES
R Reel-to-Reel 1. Serial recorded.
C Cartridge 2. Parallel recorded.
CS cassette 3. Old format known as QIC-11.
.Ed 5. Helical scan.
6. This is not an American National Standard. The reference is based on
where Notes means: an industry standard definition of the media format.
.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.
.Ed .Ed
.Sh ENVIRONMENT .Sh ENVIRONMENT
@ -202,7 +247,7 @@ is not given.
.Bl -tag -width /dev/*rst[0-9]*xx -compact .Bl -tag -width /dev/*rst[0-9]*xx -compact
.It Pa /dev/*rwt* .It Pa /dev/*rwt*
QIC-02/QIC-36 magnetic tape interface QIC-02/QIC-36 magnetic tape interface
.It Pa /dev/*rst[0-9]* .It Pa /dev/*rsa[0-9]*
SCSI magnetic tape interface SCSI magnetic tape interface
.El .El
.Sh SEE ALSO .Sh SEE ALSO

View File

@ -68,8 +68,16 @@ static const char rcsid[] =
#define ZERO_ALLOWED 0x02 #define ZERO_ALLOWED 0x02
#define IS_DENSITY 0x04 #define IS_DENSITY 0x04
#define DISABLE_THIS 0x08 #define DISABLE_THIS 0x08
#define IS_COMP 0x10
#endif /* defined(__FreeBSD__) */ #endif /* defined(__FreeBSD__) */
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
struct commands { struct commands {
char *c_name; char *c_name;
int c_code; int c_code;
@ -95,12 +103,12 @@ struct commands {
{ "status", MTNOP, 1 }, { "status", MTNOP, 1 },
{ "weof", MTWEOF, 0 }, { "weof", MTWEOF, 0 },
#if defined(__FreeBSD__) #if defined(__FreeBSD__)
{ "erase", MTERASE, 0 }, { "erase", MTERASE, 0, ZERO_ALLOWED},
{ "blocksize", MTSETBSIZ, 0, NEED_2ARGS|ZERO_ALLOWED }, { "blocksize", MTSETBSIZ, 0, NEED_2ARGS|ZERO_ALLOWED },
{ "density", MTSETDNSTY, 0, NEED_2ARGS|ZERO_ALLOWED|IS_DENSITY }, { "density", MTSETDNSTY, 0, NEED_2ARGS|ZERO_ALLOWED|IS_DENSITY },
{ "eom", MTEOD, 1 }, { "eom", MTEOD, 1 },
{ "eod", MTEOD, 1 }, { "eod", MTEOD, 1 },
{ "comp", MTCOMP, 0, NEED_2ARGS|ZERO_ALLOWED }, { "comp", MTCOMP, 0, NEED_2ARGS|ZERO_ALLOWED|IS_COMP },
{ "retension", MTRETENS, 1 }, { "retension", MTRETENS, 1 },
#endif /* defined(__FreeBSD__) */ #endif /* defined(__FreeBSD__) */
{ NULL } { NULL }
@ -113,6 +121,9 @@ void usage __P((void));
void st_status (struct mtget *); void st_status (struct mtget *);
int stringtodens (const char *s); int stringtodens (const char *s);
const char *denstostring (int d); 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)); void warn_eof __P((void));
#endif /* defined (__FreeBSD__) */ #endif /* defined (__FreeBSD__) */
@ -178,6 +189,14 @@ main(argc, argv)
"Using \"%s\" as an alias for %s\n", "Using \"%s\" as an alias for %s\n",
*argv, dcanon); *argv, dcanon);
p = ""; 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 } else
/* allow for hex numbers; useful for density */ /* allow for hex numbers; useful for density */
mt_com.mt_count = strtol(*argv, &p, 0); mt_com.mt_count = strtol(*argv, &p, 0);
@ -187,6 +206,7 @@ main(argc, argv)
if (mt_com.mt_count <= if (mt_com.mt_count <=
#if defined (__FreeBSD__) #if defined (__FreeBSD__)
((comp->c_flags & ZERO_ALLOWED)? -1: 0) ((comp->c_flags & ZERO_ALLOWED)? -1: 0)
&& ((comp->c_flags & IS_COMP) == 0)
#else #else
0 0
#endif /* defined (__FreeBSD__) */ #endif /* defined (__FreeBSD__) */
@ -344,30 +364,65 @@ usage()
struct densities { struct densities {
int dens; int dens;
int bpmm;
int bpi;
const char *name; const char *name;
} dens [] = { } dens[] = {
{ 0x1, "X3.22-1983" }, /*
{ 0x2, "X3.39-1986" }, * Taken from T10 Project 997D
{ 0x3, "X3.54-1986" }, * SCSI-3 Stream Device Commands (SSC)
{ 0x5, "X3.136-1986" }, * Revision 11, 4-Nov-97
{ 0x6, "X3.157-1987" }, */
{ 0x7, "X3.116-1986" }, /*Num. bpmm bpi Reference */
{ 0x8, "X3.158-1986" }, { 0x1, 32, 800, "X3.22-1983" },
{ 0x9, "X3B5/87-099" }, { 0x2, 63, 1600, "X3.39-1986" },
{ 0xA, "X3B5/86-199" }, { 0x3, 246, 6250, "X3.54-1986" },
{ 0xB, "X3.56-1986" }, { 0x5, 315, 8000, "X3.136-1986" },
{ 0xC, "HI-TC1" }, { 0x6, 126, 3200, "X3.157-1987" },
{ 0xD, "HI-TC2" }, { 0x7, 252, 6400, "X3.116-1986" },
{ 0xF, "QIC-120" }, { 0x8, 315, 8000, "X3.158-1987" },
{ 0x10, "QIC-150" }, { 0x9, 491, 37871, "X3.180" },
{ 0x11, "QIC-320" }, { 0xA, 262, 6667, "X3B5/86-199" },
{ 0x12, "QIC-1350" }, { 0xB, 63, 1600, "X3.56-1986" },
{ 0x13, "X3B5/88-185A" }, { 0xC, 500, 12690, "HI-TC1" },
{ 0x14, "X3.202-1991" }, { 0xD, 999, 25380, "HI-TC2" },
{ 0x15, "ECMA TC17" }, { 0xF, 394, 10000, "QIC-120" },
{ 0x16, "X3.193-1990" }, { 0x10, 394, 10000, "QIC-150" },
{ 0x17, "X3B5/91-174" }, { 0x11, 630, 16000, "QIC-320" },
{ 0, 0 } { 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 * const char *
@ -386,6 +441,28 @@ denstostring(int d)
return sd->name; 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 int
stringtodens(const char *s) stringtodens(const char *s)
{ {
@ -406,26 +483,67 @@ getblksiz(int bs)
if (bs == 0) if (bs == 0)
return "variable"; return "variable";
else { else {
sprintf(buf, "= %d bytes", bs); sprintf(buf, "%d bytes", bs);
return buf; 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 void
st_status(struct mtget *bp) st_status(struct mtget *bp)
{ {
printf("Present Mode: Density = %-12s Blocksize %s Comp %d\n", printf("Mode Density Blocksize bpi "
denstostring(bp->mt_density), getblksiz(bp->mt_blksiz), (int)bp->mt_comp); "Compression\n"
printf("---------available modes---------\n"); "Current: %-12s %-12s %-7d %s\n"
printf("Mode 0: Density = %-12s Blocksize %s\n", "---------available modes---------\n"
denstostring(bp->mt_density0), getblksiz(bp->mt_blksiz0)); "0: %-12s %-12s %-7d %s\n"
printf("Mode 1: Density = %-12s Blocksize %s\n", "1: %-12s %-12s %-7d %s\n"
denstostring(bp->mt_density1), getblksiz(bp->mt_blksiz1)); "2: %-12s %-12s %-7d %s\n"
printf("Mode 2: Density = %-12s Blocksize %s\n", "3: %-12s %-12s %-7d %s\n",
denstostring(bp->mt_density2), getblksiz(bp->mt_blksiz2)); denstostring(bp->mt_density), getblksiz(bp->mt_blksiz),
printf("Mode 3: Density = %-12s Blocksize %s\n", denstobp(bp->mt_density, TRUE), comptostring(bp->mt_comp),
denstostring(bp->mt_density3), getblksiz(bp->mt_blksiz3)); 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 void