Reviewed by: J Wunsch <j@uriah.heep.sax.de>
-current commit for st.c, kernel support for /bin/mt's 'comp' option. (tested with exabyte and DAT tape units. Does not apparently work with all SCSI tape's, though).
This commit is contained in:
parent
50ed861cdd
commit
16ae72c2ec
@ -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.92 1998/07/31 09:00:39 phk Exp $
|
||||
* $Id: st.c,v 1.93 1998/08/18 00:32:49 bde Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -78,7 +78,7 @@ static errval st_touch_tape __P((u_int32_t unit));
|
||||
static errval st_write_filemarks __P((u_int32_t unit, int32_t number, u_int32_t flags));
|
||||
static errval st_load __P((u_int32_t unit, u_int32_t type, u_int32_t flags));
|
||||
static errval st_mode_select __P((u_int32_t unit, u_int32_t flags, \
|
||||
struct tape_pages *page, u_int32_t pagelen));
|
||||
struct tape_pages *page, u_int32_t pagelen, u_int32_t byte2));
|
||||
static errval st_comp __P((u_int32_t unit, u_int32_t mode));
|
||||
static int32_t st_chkeod __P((u_int32_t unit, boolean position, int32_t *nmarks,
|
||||
u_int32_t flags));
|
||||
@ -580,7 +580,7 @@ st_mount_tape(dev, flags)
|
||||
return errno;
|
||||
}
|
||||
}
|
||||
if ( (errno = st_mode_select(unit, 0, NULL, 0)) ) {
|
||||
if ( (errno = st_mode_select(unit, 0, NULL, 0, 0)) ) {
|
||||
printf("st%lu: Cannot set selected mode", (u_long)unit);
|
||||
return errno;
|
||||
}
|
||||
@ -1165,7 +1165,10 @@ struct proc *p, struct scsi_link *sc_link)
|
||||
* Check that the mode being asked for is aggreeable to the
|
||||
* drive. If not, put it back the way it was.
|
||||
*/
|
||||
if ( (errcode = st_mode_select(unit, 0, NULL, 0)) ) { /* put back as it was */
|
||||
if ( (errcode = st_mode_select(unit, 0, NULL, 0, 0)) ) {
|
||||
/*
|
||||
* put back as it was
|
||||
*/
|
||||
printf("st%lu: Cannot set selected mode", (u_long)unit);
|
||||
st->density = hold_density;
|
||||
st->blksiz = hold_blksiz;
|
||||
@ -1389,10 +1392,11 @@ st_mode_sense(unit, flags, page, pagelen, pagecode)
|
||||
* set it into the desire modes etc.
|
||||
*/
|
||||
static errval
|
||||
st_mode_select(unit, flags, page, pagelen)
|
||||
st_mode_select(unit, flags, page, pagelen, byte2)
|
||||
u_int32_t unit, flags;
|
||||
struct tape_pages *page;
|
||||
u_int32_t pagelen;
|
||||
u_int32_t byte2;
|
||||
{
|
||||
u_int32_t dat_len;
|
||||
struct scsi_mode_select scsi_cmd;
|
||||
@ -1425,6 +1429,7 @@ st_mode_select(unit, flags, page, pagelen)
|
||||
bzero(&scsi_cmd, sizeof(scsi_cmd));
|
||||
scsi_cmd.op_code = MODE_SELECT;
|
||||
scsi_cmd.length = dat_len;
|
||||
scsi_cmd.byte2 = (u_char)byte2;
|
||||
dat.header.blk_desc_len = sizeof(struct blk_desc);
|
||||
dat.header.dev_spec |= SMH_DSP_BUFF_MODE_ON;
|
||||
dat.blk_desc.density = st->density;
|
||||
@ -1494,7 +1499,12 @@ u_int32_t unit,mode;
|
||||
printf("st%lu: bad value for compression mode\n", (u_long)unit);
|
||||
return EINVAL;
|
||||
}
|
||||
if ( (retval = st_mode_select(unit, 0, &page, pagesize)) )
|
||||
/*
|
||||
* send ST_PAGE_CONFIGURATION page as SCSI-II command because it
|
||||
* is a SCSI-II structure. This requires the PF bit (0x10) to be
|
||||
* set for byte2.
|
||||
*/
|
||||
if ( (retval = st_mode_select(unit, 0, &page, pagesize, 0x10)) )
|
||||
{
|
||||
printf("select returned an error of %d\n",retval);
|
||||
return retval;
|
||||
@ -1958,7 +1968,7 @@ st_touch_tape(unit)
|
||||
default:
|
||||
readsiz = 1;
|
||||
st->flags &= ~ST_FIXEDBLOCKS;
|
||||
} if ( (errno = st_mode_select(unit, 0, NULL, 0)) ) {
|
||||
} if ( (errno = st_mode_select(unit, 0, NULL, 0, 0)) ) {
|
||||
goto bad;
|
||||
}
|
||||
st_read(unit, buf, readsiz, SCSI_SILENT);
|
||||
|
Loading…
Reference in New Issue
Block a user