+Match against T4000* for HP QIC quirks (not T4000S* where it doesn't then

catch a T4000s)
+ Set *some* kind of error at EOM if we're in fixed mode and have pending errs.
  Do not clear the ERR_PENDING bit if more buffers are queued.
+ Release the start_ccb in this case also, else we hang forever on rewinding.
+ Any kind of error for load to BOT in samount should then cause an attempt
  to use REWIND to come back to BOT. Do the initial load command quietly.
+ In samount, if we succeed, set the relative position markers.
This commit is contained in:
mjacob 1999-03-01 01:07:47 +00:00
parent b9dfdf0276
commit 6784b7fe13

View File

@ -25,7 +25,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: scsi_sa.c,v 1.18 1999/02/05 08:49:34 mjacob Exp $
* $Id: scsi_sa.c,v 1.19 1999/02/10 00:03:15 ken Exp $
*/
#include <sys/param.h>
@ -217,7 +217,7 @@ static struct sa_quirk_entry sa_quirk_table[] =
},
{
{ T_SEQUENTIAL, SIP_MEDIA_REMOVABLE, "HP",
"T4000S*", "*"}, SA_QUIRK_FIXED|SA_QUIRK_1FM, 512
"T4000*", "*"}, SA_QUIRK_FIXED|SA_QUIRK_1FM, 512
},
{
{ T_SEQUENTIAL, SIP_MEDIA_REMOVABLE, "HP",
@ -1296,15 +1296,14 @@ sastart(struct cam_periph *periph, union ccb *start_ccb)
xpt_release_ccb(start_ccb);
} else if ((softc->flags & SA_FLAG_ERR_PENDING) != 0) {
struct buf *done_bp;
CAM_DEBUG(periph->path, CAM_DEBUG_INFO,
("sastart- coping with pending error %x\n",
softc->flags & SA_FLAG_ERR_PENDING));
bufq_remove(&softc->buf_queue, bp);
bp->b_resid = bp->b_bcount;
bp->b_flags |= B_ERROR;
if ((softc->flags & SA_FLAG_EOM_PENDING) != 0) {
if ((bp->b_flags & B_READ) == 0)
bp->b_error = ENOSPC;
else
bp->b_error = EIO;
}
if ((softc->flags & SA_FLAG_EOF_PENDING) != 0) {
bp->b_error = EIO;
@ -1312,10 +1311,21 @@ sastart(struct cam_periph *periph, union ccb *start_ccb)
if ((softc->flags & SA_FLAG_EIO_PENDING) != 0) {
bp->b_error = EIO;
}
softc->flags &= ~SA_FLAG_ERR_PENDING;
done_bp = bp;
bp = bufq_first(&softc->buf_queue);
/*
* Only if we have no other buffers queued up
* do we clear the pending error flag.
*/
if (bp == NULL)
softc->flags &= ~SA_FLAG_ERR_PENDING;
CAM_DEBUG(periph->path, CAM_DEBUG_INFO,
("sastart- coping with pending error %x, %smore "
"buffers queued up\n",
(softc->flags & SA_FLAG_ERR_PENDING),
(bp == NULL)? "no " : " "));
splx(s);
xpt_release_ccb(start_ccb);
biodone(done_bp);
} else {
u_int32_t length;
@ -1429,8 +1439,8 @@ sadone(struct cam_periph *periph, union ccb *done_ccb)
struct buf *q_bp;
/*
* Catastrophic error. Mark our pack as invalid,
* return all queued I/O with EIO, and unfreeze
* Catastrophic error. Mark the tape as not mounted.
* Return all queued I/O with EIO, and unfreeze
* our queue so that future transactions that
* attempt to fix this problem can get to the
* device.
@ -1439,7 +1449,6 @@ sadone(struct cam_periph *periph, union ccb *done_ccb)
s = splbio();
softc->flags &= ~SA_FLAG_TAPE_MOUNTED;
while ((q_bp = bufq_first(&softc->buf_queue)) != NULL) {
bufq_remove(&softc->buf_queue, q_bp);
q_bp->b_resid = q_bp->b_bcount;
@ -1566,14 +1575,14 @@ samount(struct cam_periph *periph, int oflags, dev_t dev)
*/
scsi_load_unload(&ccb->csio, 2, sadone, MSG_SIMPLE_Q_TAG, FALSE,
FALSE, FALSE, 1, SSD_FULL_SIZE, 60000);
error = cam_periph_runccb(ccb, saerror, 0, 0,
error = cam_periph_runccb(ccb, saerror, 0, SF_QUIET_IR,
&softc->device_stats);
if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0)
cam_release_devq(ccb->ccb_h.path, 0, 0, 0, FALSE);
/*
* In case device doesn't support it, do a REWIND instead
* In case this doesn't work, do a REWIND instead
*/
if (error == EINVAL) {
if (error) {
scsi_rewind(&ccb->csio, 5, sadone, MSG_SIMPLE_Q_TAG,
FALSE, SSD_FULL_SIZE,
(SA_REWIND_TIMEOUT) * 60 * 1000);
@ -1854,8 +1863,9 @@ tryagain:
}
if (error == 0)
if (error == 0) {
softc->flags |= SA_FLAG_TAPE_MOUNTED;
}
exit:
if (rblim != NULL)
free(rblim, M_TEMP);
@ -1863,8 +1873,10 @@ exit:
if (error != 0) {
cam_release_devq(ccb->ccb_h.path, 0, 0, 0, 0);
softc->dsreg = MTIO_DSREG_NIL;
} else
} else {
softc->fileno = softc->blkno = 0;
softc->dsreg = MTIO_DSREG_REST;
}
#if SA_2FM_AT_EOD == 1
if ((softc->quirks & SA_QUIRK_1FM) == 0)
softc->quirks |= SA_QUIRK_2FM;
@ -1973,6 +1985,8 @@ saerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags)
} else {
if (csio->cdb_io.cdb_bytes[0] == SA_WRITE)
error = ENOSPC;
else
error = EIO;
}
}
if ((sense->flags & SSD_FILEMARK) != 0) {