Commit 5e6575c0 authored by Willem Riede's avatar Willem Riede Committed by James Bottomley

[SCSI] osst: changes required to move forward to block request

On 02/07/2006 04:12:55 AM, Christoph Hellwig wrote:
> On Mon, Feb 06, 2006 at 08:02:21PM -0500, Willem Riede wrote:
>
> > But I will certainly help retire scsi_request. And anything else that is
> > needed to keep up with proper kernel style. Let me know what those are, if
> > you  would? I'll start looking at how st has changed, and will be back with
> > any  questions I may have.
>
> right now the above is the most urgent bit.  What would be nice but not
> required is a conversion to the sense handling helpers, similar to what
> st got (aka using the *normalize_sense functions and then dealing with the
> parsed sense buffer instead of the raw sense data)

Ok, so here is my first take at satisfying this request.
Be warned, that beyond compiling, and checking that the new module
doesn't immediately blow up, there hasn't yet been a lot of testing.

But this should allow you to comment on the changes, and move forward
with dropping scsi_request from the kernel code.
Signed-off-by: default avatarWillem Riede <osst@riede.org>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 286fc8f8
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
order) Klaus Ehrenfried, Wolfgang Denk, Steve Hirsch, Andreas Koppenh"ofer, order) Klaus Ehrenfried, Wolfgang Denk, Steve Hirsch, Andreas Koppenh"ofer,
Michael Leodolter, Eyal Lebedinsky, J"org Weule, and Eric Youngdale. Michael Leodolter, Eyal Lebedinsky, J"org Weule, and Eric Youngdale.
Copyright 1992 - 2002 Kai Makisara / 2000 - 2004 Willem Riede Copyright 1992 - 2002 Kai Makisara / 2000 - 2006 Willem Riede
email osst@riede.org email osst@riede.org
$Header: /cvsroot/osst/Driver/osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $ $Header: /cvsroot/osst/Driver/osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $
...@@ -24,7 +24,7 @@ ...@@ -24,7 +24,7 @@
*/ */
static const char * cvsid = "$Id: osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $"; static const char * cvsid = "$Id: osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $";
static const char * osst_version = "0.99.3"; static const char * osst_version = "0.99.4";
/* The "failure to reconnect" firmware bug */ /* The "failure to reconnect" firmware bug */
#define OSST_FW_NEED_POLL_MIN 10601 /*(107A)*/ #define OSST_FW_NEED_POLL_MIN 10601 /*(107A)*/
...@@ -69,7 +69,6 @@ static const char * osst_version = "0.99.3"; ...@@ -69,7 +69,6 @@ static const char * osst_version = "0.99.3";
#include <scsi/scsi_eh.h> #include <scsi/scsi_eh.h>
#include <scsi/scsi_host.h> #include <scsi/scsi_host.h>
#include <scsi/scsi_ioctl.h> #include <scsi/scsi_ioctl.h>
#include <scsi/scsi_request.h>
#define ST_KILOBYTE 1024 #define ST_KILOBYTE 1024
...@@ -176,16 +175,16 @@ static struct scsi_driver osst_template = { ...@@ -176,16 +175,16 @@ static struct scsi_driver osst_template = {
} }
}; };
static int osst_int_ioctl(struct osst_tape *STp, struct scsi_request ** aSRpnt, static int osst_int_ioctl(struct osst_tape *STp, struct osst_request ** aSRpnt,
unsigned int cmd_in, unsigned long arg); unsigned int cmd_in, unsigned long arg);
static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt, int frame, int skip); static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt, int frame, int skip);
static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt); static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt);
static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** aSRpnt); static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** aSRpnt);
static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ** aSRpnt, int pending); static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request ** aSRpnt, int pending);
static inline char *tape_name(struct osst_tape *tape) static inline char *tape_name(struct osst_tape *tape)
{ {
...@@ -194,52 +193,84 @@ static inline char *tape_name(struct osst_tape *tape) ...@@ -194,52 +193,84 @@ static inline char *tape_name(struct osst_tape *tape)
/* Routines that handle the interaction with mid-layer SCSI routines */ /* Routines that handle the interaction with mid-layer SCSI routines */
/* Normalize Sense */
static void osst_analyze_sense(struct osst_request *SRpnt, struct st_cmdstatus *s)
{
const u8 *ucp;
const u8 *sense = SRpnt->sense;
s->have_sense = scsi_normalize_sense(SRpnt->sense,
SCSI_SENSE_BUFFERSIZE, &s->sense_hdr);
s->flags = 0;
if (s->have_sense) {
s->deferred = 0;
s->remainder_valid =
scsi_get_sense_info_fld(sense, SCSI_SENSE_BUFFERSIZE, &s->uremainder64);
switch (sense[0] & 0x7f) {
case 0x71:
s->deferred = 1;
case 0x70:
s->fixed_format = 1;
s->flags = sense[2] & 0xe0;
break;
case 0x73:
s->deferred = 1;
case 0x72:
s->fixed_format = 0;
ucp = scsi_sense_desc_find(sense, SCSI_SENSE_BUFFERSIZE, 4);
s->flags = ucp ? (ucp[3] & 0xe0) : 0;
break;
}
}
}
/* Convert the result to success code */ /* Convert the result to success code */
static int osst_chk_result(struct osst_tape * STp, struct scsi_request * SRpnt) static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt)
{ {
char *name = tape_name(STp); char *name = tape_name(STp);
int result = SRpnt->sr_result; int result = SRpnt->result;
unsigned char * sense = SRpnt->sr_sense_buffer, scode; u8 * sense = SRpnt->sense, scode;
#if DEBUG #if DEBUG
const char *stp; const char *stp;
#endif #endif
struct st_cmdstatus *cmdstatp;
if (!result) { if (!result)
sense[0] = 0; /* We don't have sense data if this byte is zero */
return 0; return 0;
}
if ((driver_byte(result) & DRIVER_MASK) == DRIVER_SENSE) cmdstatp = &STp->buffer->cmdstat;
scode = sense[2] & 0x0f; osst_analyze_sense(SRpnt, cmdstatp);
else {
sense[0] = 0; /* We don't have sense data if this byte is zero */ if (cmdstatp->have_sense)
scode = STp->buffer->cmdstat.sense_hdr.sense_key;
else
scode = 0; scode = 0;
}
#if DEBUG #if DEBUG
if (debugging) { if (debugging) {
printk(OSST_DEB_MSG "%s:D: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", printk(OSST_DEB_MSG "%s:D: Error: %x, cmd: %x %x %x %x %x %x\n",
name, result, name, result,
SRpnt->sr_cmnd[0], SRpnt->sr_cmnd[1], SRpnt->sr_cmnd[2], SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2],
SRpnt->sr_cmnd[3], SRpnt->sr_cmnd[4], SRpnt->sr_cmnd[5], SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]);
SRpnt->sr_bufflen);
if (scode) printk(OSST_DEB_MSG "%s:D: Sense: %02x, ASC: %02x, ASCQ: %02x\n", if (scode) printk(OSST_DEB_MSG "%s:D: Sense: %02x, ASC: %02x, ASCQ: %02x\n",
name, scode, sense[12], sense[13]); name, scode, sense[12], sense[13]);
if (driver_byte(result) & DRIVER_SENSE) if (cmdstatp->have_sense)
scsi_print_req_sense("osst ", SRpnt); __scsi_print_sense("osst ", SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
} }
else else
#endif #endif
if (!(driver_byte(result) & DRIVER_SENSE) || if (cmdstatp->have_sense && (
((sense[0] & 0x70) == 0x70 &&
scode != NO_SENSE && scode != NO_SENSE &&
scode != RECOVERED_ERROR && scode != RECOVERED_ERROR &&
/* scode != UNIT_ATTENTION && */ /* scode != UNIT_ATTENTION && */
scode != BLANK_CHECK && scode != BLANK_CHECK &&
scode != VOLUME_OVERFLOW && scode != VOLUME_OVERFLOW &&
SRpnt->sr_cmnd[0] != MODE_SENSE && SRpnt->cmd[0] != MODE_SENSE &&
SRpnt->sr_cmnd[0] != TEST_UNIT_READY)) { /* Abnormal conditions for tape */ SRpnt->cmd[0] != TEST_UNIT_READY)) { /* Abnormal conditions for tape */
if (driver_byte(result) & DRIVER_SENSE) { if (cmdstatp->have_sense) {
printk(KERN_WARNING "%s:W: Command with sense data:\n", name); printk(KERN_WARNING "%s:W: Command with sense data:\n", name);
scsi_print_req_sense("osst:", SRpnt); __scsi_print_sense("osst ", SRpnt->sense, SCSI_SENSE_BUFFERSIZE);
} }
else { else {
static int notyetprinted = 1; static int notyetprinted = 1;
...@@ -259,15 +290,14 @@ static int osst_chk_result(struct osst_tape * STp, struct scsi_request * SRpnt) ...@@ -259,15 +290,14 @@ static int osst_chk_result(struct osst_tape * STp, struct scsi_request * SRpnt)
} }
STp->pos_unknown |= STp->device->was_reset; STp->pos_unknown |= STp->device->was_reset;
if ((sense[0] & 0x70) == 0x70 && if (cmdstatp->have_sense && scode == RECOVERED_ERROR) {
scode == RECOVERED_ERROR) {
STp->recover_count++; STp->recover_count++;
STp->recover_erreg++; STp->recover_erreg++;
#if DEBUG #if DEBUG
if (debugging) { if (debugging) {
if (SRpnt->sr_cmnd[0] == READ_6) if (SRpnt->cmd[0] == READ_6)
stp = "read"; stp = "read";
else if (SRpnt->sr_cmnd[0] == WRITE_6) else if (SRpnt->cmd[0] == WRITE_6)
stp = "write"; stp = "write";
else else
stp = "ioctl"; stp = "ioctl";
...@@ -283,74 +313,99 @@ static int osst_chk_result(struct osst_tape * STp, struct scsi_request * SRpnt) ...@@ -283,74 +313,99 @@ static int osst_chk_result(struct osst_tape * STp, struct scsi_request * SRpnt)
/* Wakeup from interrupt */ /* Wakeup from interrupt */
static void osst_sleep_done (struct scsi_cmnd * SCpnt) static void osst_sleep_done(void *data, char *sense, int result, int resid)
{ {
struct osst_tape * STp = container_of(SCpnt->request->rq_disk->private_data, struct osst_tape, driver); struct osst_request *SRpnt = data;
struct osst_tape *STp = SRpnt->stp;
if ((STp->buffer)->writing &&
(SCpnt->sense_buffer[0] & 0x70) == 0x70 &&
(SCpnt->sense_buffer[2] & 0x40)) {
/* EOM at write-behind, has all been written? */
if ((SCpnt->sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW)
STp->buffer->midlevel_result = SCpnt->result; /* Error */
else
STp->buffer->midlevel_result = INT_MAX; /* OK */
}
else
STp->buffer->midlevel_result = SCpnt->result;
SCpnt->request->rq_status = RQ_SCSI_DONE;
STp->buffer->last_SRpnt = SCpnt->sc_request;
memcpy(SRpnt->sense, sense, SCSI_SENSE_BUFFERSIZE);
STp->buffer->cmdstat.midlevel_result = SRpnt->result = result;
#if DEBUG #if DEBUG
STp->write_pending = 0; STp->write_pending = 0;
#endif #endif
complete(SCpnt->request->waiting); if (SRpnt->waiting)
complete(SRpnt->waiting);
}
/* osst_request memory management */
static struct osst_request *osst_allocate_request(void)
{
return kzalloc(sizeof(struct osst_request), GFP_KERNEL);
} }
static void osst_release_request(struct osst_request *streq)
{
kfree(streq);
}
/* Do the scsi command. Waits until command performed if do_wait is true. /* Do the scsi command. Waits until command performed if do_wait is true.
Otherwise osst_write_behind_check() is used to check that the command Otherwise osst_write_behind_check() is used to check that the command
has finished. */ has finished. */
static struct scsi_request * osst_do_scsi(struct scsi_request *SRpnt, struct osst_tape *STp, static struct osst_request * osst_do_scsi(struct osst_request *SRpnt, struct osst_tape *STp,
unsigned char *cmd, int bytes, int direction, int timeout, int retries, int do_wait) unsigned char *cmd, int bytes, int direction, int timeout, int retries, int do_wait)
{ {
unsigned char *bp; unsigned char *bp;
unsigned short use_sg;
#ifdef OSST_INJECT_ERRORS #ifdef OSST_INJECT_ERRORS
static int inject = 0; static int inject = 0;
static int repeat = 0; static int repeat = 0;
#endif #endif
struct completion *waiting;
/* if async, make sure there's no command outstanding */
if (!do_wait && ((STp->buffer)->last_SRpnt)) {
printk(KERN_ERR "%s: Async command already active.\n",
tape_name(STp));
if (signal_pending(current))
(STp->buffer)->syscall_result = (-EINTR);
else
(STp->buffer)->syscall_result = (-EBUSY);
return NULL;
}
if (SRpnt == NULL) {
SRpnt = osst_allocate_request();
if (SRpnt == NULL) { if (SRpnt == NULL) {
if ((SRpnt = scsi_allocate_request(STp->device, GFP_ATOMIC)) == NULL) { printk(KERN_ERR "%s: Can't allocate SCSI request.\n",
printk(KERN_ERR "%s:E: Can't get SCSI request.\n", tape_name(STp)); tape_name(STp));
if (signal_pending(current)) if (signal_pending(current))
(STp->buffer)->syscall_result = (-EINTR); (STp->buffer)->syscall_result = (-EINTR);
else else
(STp->buffer)->syscall_result = (-EBUSY); (STp->buffer)->syscall_result = (-EBUSY);
return NULL; return NULL;
} }
SRpnt->stp = STp;
} }
init_completion(&STp->wait); /* If async IO, set last_SRpnt. This ptr tells write_behind_check
SRpnt->sr_use_sg = (bytes > (STp->buffer)->sg[0].length) ? which IO is outstanding. It's nulled out when the IO completes. */
(STp->buffer)->use_sg : 0; if (!do_wait)
if (SRpnt->sr_use_sg) { (STp->buffer)->last_SRpnt = SRpnt;
waiting = &STp->wait;
init_completion(waiting);
SRpnt->waiting = waiting;
use_sg = (bytes > STp->buffer->sg[0].length) ? STp->buffer->use_sg : 0;
if (use_sg) {
bp = (char *)&(STp->buffer->sg[0]); bp = (char *)&(STp->buffer->sg[0]);
if (STp->buffer->sg_segs < SRpnt->sr_use_sg) if (STp->buffer->sg_segs < use_sg)
SRpnt->sr_use_sg = STp->buffer->sg_segs; use_sg = STp->buffer->sg_segs;
} }
else else
bp = (STp->buffer)->b_data; bp = (STp->buffer)->b_data;
SRpnt->sr_data_direction = direction;
SRpnt->sr_cmd_len = 0;
SRpnt->sr_request->waiting = &(STp->wait);
SRpnt->sr_request->rq_status = RQ_SCSI_BUSY;
SRpnt->sr_request->rq_disk = STp->drive;
scsi_do_req(SRpnt, (void *)cmd, bp, bytes, osst_sleep_done, timeout, retries); memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd));
STp->buffer->cmdstat.have_sense = 0;
STp->buffer->syscall_result = 0;
if (do_wait) { if (scsi_execute_async(STp->device, cmd, COMMAND_SIZE(cmd[0]), direction, bp, bytes,
wait_for_completion(SRpnt->sr_request->waiting); use_sg, timeout, retries, SRpnt, osst_sleep_done, GFP_KERNEL))
SRpnt->sr_request->waiting = NULL; /* could not allocate the buffer or request was too large */
(STp->buffer)->syscall_result = (-EBUSY);
else if (do_wait) {
wait_for_completion(waiting);
SRpnt->waiting = NULL;
STp->buffer->syscall_result = osst_chk_result(STp, SRpnt); STp->buffer->syscall_result = osst_chk_result(STp, SRpnt);
#ifdef OSST_INJECT_ERRORS #ifdef OSST_INJECT_ERRORS
if (STp->buffer->syscall_result == 0 && if (STp->buffer->syscall_result == 0 &&
...@@ -383,21 +438,22 @@ static void osst_write_behind_check(struct osst_tape *STp) ...@@ -383,21 +438,22 @@ static void osst_write_behind_check(struct osst_tape *STp)
STp->nbr_finished++; STp->nbr_finished++;
#endif #endif
wait_for_completion(&(STp->wait)); wait_for_completion(&(STp->wait));
(STp->buffer)->last_SRpnt->sr_request->waiting = NULL; STp->buffer->last_SRpnt->waiting = NULL;
STp->buffer->syscall_result = osst_chk_result(STp, STp->buffer->last_SRpnt); STp->buffer->syscall_result = osst_chk_result(STp, STp->buffer->last_SRpnt);
if ((STp->buffer)->syscall_result) if (STp->buffer->syscall_result)
(STp->buffer)->syscall_result = STp->buffer->syscall_result =
osst_write_error_recovery(STp, &((STp->buffer)->last_SRpnt), 1); osst_write_error_recovery(STp, &(STp->buffer->last_SRpnt), 1);
else else
STp->first_frame_position++; STp->first_frame_position++;
scsi_release_request((STp->buffer)->last_SRpnt); osst_release_request(STp->buffer->last_SRpnt);
if (STbuffer->writing < STbuffer->buffer_bytes) if (STbuffer->writing < STbuffer->buffer_bytes)
printk(KERN_WARNING "osst :A: write_behind_check: something left in buffer!\n"); printk(KERN_WARNING "osst :A: write_behind_check: something left in buffer!\n");
STbuffer->last_SRpnt = NULL;
STbuffer->buffer_bytes -= STbuffer->writing; STbuffer->buffer_bytes -= STbuffer->writing;
STbuffer->writing = 0; STbuffer->writing = 0;
...@@ -606,11 +662,11 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q ...@@ -606,11 +662,11 @@ static int osst_verify_frame(struct osst_tape * STp, int frame_seq_number, int q
/* /*
* Wait for the unit to become Ready * Wait for the unit to become Ready
*/ */
static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt,
unsigned timeout, int initial_delay) unsigned timeout, int initial_delay)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
unsigned long startwait = jiffies; unsigned long startwait = jiffies;
#if DEBUG #if DEBUG
int dbg = debugging; int dbg = debugging;
...@@ -630,10 +686,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt ...@@ -630,10 +686,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt
if (!SRpnt) return (-EBUSY); if (!SRpnt) return (-EBUSY);
while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) && while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) &&
(( SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 4 && (( SRpnt->sense[2] == 2 && SRpnt->sense[12] == 4 &&
(SRpnt->sr_sense_buffer[13] == 1 || SRpnt->sr_sense_buffer[13] == 8) ) || (SRpnt->sense[13] == 1 || SRpnt->sense[13] == 8) ) ||
( SRpnt->sr_sense_buffer[2] == 6 && SRpnt->sr_sense_buffer[12] == 0x28 && ( SRpnt->sense[2] == 6 && SRpnt->sense[12] == 0x28 &&
SRpnt->sr_sense_buffer[13] == 0 ) )) { SRpnt->sense[13] == 0 ) )) {
#if DEBUG #if DEBUG
if (debugging) { if (debugging) {
printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait ready\n", name); printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait ready\n", name);
...@@ -657,8 +713,8 @@ static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt ...@@ -657,8 +713,8 @@ static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Abnormal exit from onstream wait ready\n", name); printk(OSST_DEB_MSG "%s:D: Abnormal exit from onstream wait ready\n", name);
printk(OSST_DEB_MSG "%s:D: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", name, printk(OSST_DEB_MSG "%s:D: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", name,
STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], STp->buffer->syscall_result, SRpnt->sense[0], SRpnt->sense[2],
SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); SRpnt->sense[12], SRpnt->sense[13]);
#endif #endif
return (-EIO); return (-EIO);
} }
...@@ -671,10 +727,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt ...@@ -671,10 +727,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt
/* /*
* Wait for a tape to be inserted in the unit * Wait for a tape to be inserted in the unit
*/ */
static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned timeout) static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** aSRpnt, unsigned timeout)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
unsigned long startwait = jiffies; unsigned long startwait = jiffies;
#if DEBUG #if DEBUG
int dbg = debugging; int dbg = debugging;
...@@ -691,8 +747,7 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** a ...@@ -691,8 +747,7 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** a
if (!SRpnt) return (-EBUSY); if (!SRpnt) return (-EBUSY);
while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) && while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) &&
SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 0x3a && SRpnt->sense[2] == 2 && SRpnt->sense[12] == 0x3a && SRpnt->sense[13] == 0 ) {
SRpnt->sr_sense_buffer[13] == 0 ) {
#if DEBUG #if DEBUG
if (debugging) { if (debugging) {
printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait medium\n", name); printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait medium\n", name);
...@@ -711,13 +766,13 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** a ...@@ -711,13 +766,13 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** a
#if DEBUG #if DEBUG
debugging = dbg; debugging = dbg;
#endif #endif
if ( STp->buffer->syscall_result && SRpnt->sr_sense_buffer[2] != 2 && if ( STp->buffer->syscall_result && SRpnt->sense[2] != 2 &&
SRpnt->sr_sense_buffer[12] != 4 && SRpnt->sr_sense_buffer[13] == 1) { SRpnt->sense[12] != 4 && SRpnt->sense[13] == 1) {
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Abnormal exit from onstream wait medium\n", name); printk(OSST_DEB_MSG "%s:D: Abnormal exit from onstream wait medium\n", name);
printk(OSST_DEB_MSG "%s:D: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", name, printk(OSST_DEB_MSG "%s:D: Result = %d, Sense: 0=%02x, 2=%02x, 12=%02x, 13=%02x\n", name,
STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], STp->buffer->syscall_result, SRpnt->sense[0], SRpnt->sense[2],
SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); SRpnt->sense[12], SRpnt->sense[13]);
#endif #endif
return 0; return 0;
} }
...@@ -727,7 +782,7 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** a ...@@ -727,7 +782,7 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** a
return 1; return 1;
} }
static int osst_position_tape_and_confirm(struct osst_tape * STp, struct scsi_request ** aSRpnt, int frame) static int osst_position_tape_and_confirm(struct osst_tape * STp, struct osst_request ** aSRpnt, int frame)
{ {
int retval; int retval;
...@@ -741,10 +796,10 @@ static int osst_position_tape_and_confirm(struct osst_tape * STp, struct scsi_re ...@@ -741,10 +796,10 @@ static int osst_position_tape_and_confirm(struct osst_tape * STp, struct scsi_re
/* /*
* Wait for write(s) to complete * Wait for write(s) to complete
*/ */
static int osst_flush_drive_buffer(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_flush_drive_buffer(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
int result = 0; int result = 0;
int delay = OSST_WAIT_WRITE_COMPLETE; int delay = OSST_WAIT_WRITE_COMPLETE;
#if DEBUG #if DEBUG
...@@ -761,8 +816,8 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct scsi_request * ...@@ -761,8 +816,8 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct scsi_request *
*aSRpnt = SRpnt; *aSRpnt = SRpnt;
if (!SRpnt) return (-EBUSY); if (!SRpnt) return (-EBUSY);
if (STp->buffer->syscall_result) { if (STp->buffer->syscall_result) {
if ((SRpnt->sr_sense_buffer[2] & 0x0f) == 2 && SRpnt->sr_sense_buffer[12] == 4) { if ((SRpnt->sense[2] & 0x0f) == 2 && SRpnt->sense[12] == 4) {
if (SRpnt->sr_sense_buffer[13] == 8) { if (SRpnt->sense[13] == 8) {
delay = OSST_WAIT_LONG_WRITE_COMPLETE; delay = OSST_WAIT_LONG_WRITE_COMPLETE;
} }
} else } else
...@@ -775,7 +830,7 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct scsi_request * ...@@ -775,7 +830,7 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct scsi_request *
} }
#define OSST_POLL_PER_SEC 10 #define OSST_POLL_PER_SEC 10
static int osst_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int curr, int minlast, int to) static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int curr, int minlast, int to)
{ {
unsigned long startwait = jiffies; unsigned long startwait = jiffies;
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -830,9 +885,9 @@ static int osst_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt ...@@ -830,9 +885,9 @@ static int osst_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt
return -EBUSY; return -EBUSY;
} }
static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int writing) static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int writing)
{ {
struct scsi_request * SRpnt; struct osst_request * SRpnt;
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
unsigned long startwait = jiffies; unsigned long startwait = jiffies;
int retval = 1; int retval = 1;
...@@ -853,7 +908,7 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request * ...@@ -853,7 +908,7 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request *
while (retval && time_before (jiffies, startwait + 5*60*HZ)) { while (retval && time_before (jiffies, startwait + 5*60*HZ)) {
if (STp->buffer->syscall_result && (SRpnt->sr_sense_buffer[2] & 0x0f) != 2) { if (STp->buffer->syscall_result && (SRpnt->sense[2] & 0x0f) != 2) {
/* some failure - not just not-ready */ /* some failure - not just not-ready */
retval = osst_write_error_recovery(STp, aSRpnt, 0); retval = osst_write_error_recovery(STp, aSRpnt, 0);
...@@ -878,9 +933,9 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request * ...@@ -878,9 +933,9 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request *
if (STp->buffer->syscall_result) if (STp->buffer->syscall_result)
printk(KERN_WARNING printk(KERN_WARNING
"%s:W: Recover_wait_frame(read) cannot handle %02x:%02x:%02x\n", name, "%s:W: Recover_wait_frame(read) cannot handle %02x:%02x:%02x\n", name,
(*aSRpnt)->sr_sense_buffer[ 2] & 0x0f, (*aSRpnt)->sense[ 2] & 0x0f,
(*aSRpnt)->sr_sense_buffer[12], (*aSRpnt)->sense[12],
(*aSRpnt)->sr_sense_buffer[13]); (*aSRpnt)->sense[13]);
return retval; return retval;
} }
...@@ -888,10 +943,10 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request * ...@@ -888,10 +943,10 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request *
/* /*
* Read the next OnStream tape frame at the current location * Read the next OnStream tape frame at the current location
*/ */
static int osst_read_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int timeout) static int osst_read_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int timeout)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
int retval = 0; int retval = 0;
#if DEBUG #if DEBUG
os_aux_t * aux = STp->buffer->aux; os_aux_t * aux = STp->buffer->aux;
...@@ -929,10 +984,10 @@ static int osst_read_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt ...@@ -929,10 +984,10 @@ static int osst_read_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt
if (debugging) if (debugging)
printk(OSST_DEB_MSG "%s:D: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", printk(OSST_DEB_MSG "%s:D: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n",
name, name,
SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[1], SRpnt->sense[0], SRpnt->sense[1],
SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[3], SRpnt->sense[2], SRpnt->sense[3],
SRpnt->sr_sense_buffer[4], SRpnt->sr_sense_buffer[5], SRpnt->sense[4], SRpnt->sense[5],
SRpnt->sr_sense_buffer[6], SRpnt->sr_sense_buffer[7]); SRpnt->sense[6], SRpnt->sense[7]);
#endif #endif
} }
else else
...@@ -959,10 +1014,10 @@ static int osst_read_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt ...@@ -959,10 +1014,10 @@ static int osst_read_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt
return (retval); return (retval);
} }
static int osst_initiate_read(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_initiate_read(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
struct st_partstat * STps = &(STp->ps[STp->partition]); struct st_partstat * STps = &(STp->ps[STp->partition]);
struct scsi_request * SRpnt ; struct osst_request * SRpnt ;
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
int retval = 0; int retval = 0;
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -996,7 +1051,7 @@ static int osst_initiate_read(struct osst_tape * STp, struct scsi_request ** aSR ...@@ -996,7 +1051,7 @@ static int osst_initiate_read(struct osst_tape * STp, struct scsi_request ** aSR
return retval; return retval;
} }
static int osst_get_logical_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_get_logical_frame(struct osst_tape * STp, struct osst_request ** aSRpnt,
int frame_seq_number, int quiet) int frame_seq_number, int quiet)
{ {
struct st_partstat * STps = &(STp->ps[STp->partition]); struct st_partstat * STps = &(STp->ps[STp->partition]);
...@@ -1125,7 +1180,7 @@ static int osst_get_logical_frame(struct osst_tape * STp, struct scsi_request ** ...@@ -1125,7 +1180,7 @@ static int osst_get_logical_frame(struct osst_tape * STp, struct scsi_request **
return (STps->eof); return (STps->eof);
} }
static int osst_seek_logical_blk(struct osst_tape * STp, struct scsi_request ** aSRpnt, int logical_blk_num) static int osst_seek_logical_blk(struct osst_tape * STp, struct osst_request ** aSRpnt, int logical_blk_num)
{ {
struct st_partstat * STps = &(STp->ps[STp->partition]); struct st_partstat * STps = &(STp->ps[STp->partition]);
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -1234,7 +1289,7 @@ static int osst_seek_logical_blk(struct osst_tape * STp, struct scsi_request ** ...@@ -1234,7 +1289,7 @@ static int osst_seek_logical_blk(struct osst_tape * STp, struct scsi_request **
#define OSST_SECTOR_SHIFT 9 #define OSST_SECTOR_SHIFT 9
#define OSST_SECTOR_MASK 0x03F #define OSST_SECTOR_MASK 0x03F
static int osst_get_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_get_sector(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
int sector; int sector;
#if DEBUG #if DEBUG
...@@ -1264,7 +1319,7 @@ static int osst_get_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt ...@@ -1264,7 +1319,7 @@ static int osst_get_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt
return sector; return sector;
} }
static int osst_seek_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt, int sector) static int osst_seek_sector(struct osst_tape * STp, struct osst_request ** aSRpnt, int sector)
{ {
struct st_partstat * STps = &(STp->ps[STp->partition]); struct st_partstat * STps = &(STp->ps[STp->partition]);
int frame = sector >> OSST_FRAME_SHIFT, int frame = sector >> OSST_FRAME_SHIFT,
...@@ -1327,10 +1382,10 @@ static int osst_seek_sector(struct osst_tape * STp, struct scsi_request ** aSRpn ...@@ -1327,10 +1382,10 @@ static int osst_seek_sector(struct osst_tape * STp, struct scsi_request ** aSRpn
* Precondition for this function to work: all frames in the * Precondition for this function to work: all frames in the
* drive's buffer must be of one type (DATA, MARK or EOD)! * drive's buffer must be of one type (DATA, MARK or EOD)!
*/ */
static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst_request ** aSRpnt,
unsigned int frame, unsigned int skip, int pending) unsigned int frame, unsigned int skip, int pending)
{ {
struct scsi_request * SRpnt = * aSRpnt; struct osst_request * SRpnt = * aSRpnt;
unsigned char * buffer, * p; unsigned char * buffer, * p;
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
int flag, new_frame, i; int flag, new_frame, i;
...@@ -1474,8 +1529,8 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi ...@@ -1474,8 +1529,8 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi
SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout,
MAX_RETRIES, 1); MAX_RETRIES, 1);
if (SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 4 && if (SRpnt->sense[2] == 2 && SRpnt->sense[12] == 4 &&
(SRpnt->sr_sense_buffer[13] == 1 || SRpnt->sr_sense_buffer[13] == 8)) { (SRpnt->sense[13] == 1 || SRpnt->sense[13] == 8)) {
/* in the process of becoming ready */ /* in the process of becoming ready */
msleep(100); msleep(100);
continue; continue;
...@@ -1492,17 +1547,17 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi ...@@ -1492,17 +1547,17 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi
} }
*aSRpnt = SRpnt; *aSRpnt = SRpnt;
if (flag) { if (flag) {
if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && if ((SRpnt->sense[ 2] & 0x0f) == 13 &&
SRpnt->sr_sense_buffer[12] == 0 && SRpnt->sense[12] == 0 &&
SRpnt->sr_sense_buffer[13] == 2) { SRpnt->sense[13] == 2) {
printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name); printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name);
vfree(buffer); vfree(buffer);
return (-EIO); /* hit end of tape = fail */ return (-EIO); /* hit end of tape = fail */
} }
i = ((SRpnt->sr_sense_buffer[3] << 24) | i = ((SRpnt->sense[3] << 24) |
(SRpnt->sr_sense_buffer[4] << 16) | (SRpnt->sense[4] << 16) |
(SRpnt->sr_sense_buffer[5] << 8) | (SRpnt->sense[5] << 8) |
SRpnt->sr_sense_buffer[6] ) - new_frame; SRpnt->sense[6] ) - new_frame;
p = &buffer[i * OS_DATA_SIZE]; p = &buffer[i * OS_DATA_SIZE];
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Additional write error at %d\n", name, new_frame+i); printk(OSST_DEB_MSG "%s:D: Additional write error at %d\n", name, new_frame+i);
...@@ -1525,11 +1580,11 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi ...@@ -1525,11 +1580,11 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi
return 0; return 0;
} }
static int osst_reposition_and_retry(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_reposition_and_retry(struct osst_tape * STp, struct osst_request ** aSRpnt,
unsigned int frame, unsigned int skip, int pending) unsigned int frame, unsigned int skip, int pending)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
char * name = tape_name(STp); char * name = tape_name(STp);
int expected = 0; int expected = 0;
int attempts = 1000 / skip; int attempts = 1000 / skip;
...@@ -1581,9 +1636,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct scsi_request ...@@ -1581,9 +1636,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct scsi_request
*aSRpnt = SRpnt; *aSRpnt = SRpnt;
if (STp->buffer->syscall_result) { /* additional write error */ if (STp->buffer->syscall_result) { /* additional write error */
if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && if ((SRpnt->sense[ 2] & 0x0f) == 13 &&
SRpnt->sr_sense_buffer[12] == 0 && SRpnt->sense[12] == 0 &&
SRpnt->sr_sense_buffer[13] == 2) { SRpnt->sense[13] == 2) {
printk(KERN_ERR printk(KERN_ERR
"%s:E: Volume overflow in write error recovery\n", "%s:E: Volume overflow in write error recovery\n",
name); name);
...@@ -1628,9 +1683,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct scsi_request ...@@ -1628,9 +1683,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct scsi_request
* Error recovery algorithm for the OnStream tape. * Error recovery algorithm for the OnStream tape.
*/ */
static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ** aSRpnt, int pending) static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request ** aSRpnt, int pending)
{ {
struct scsi_request * SRpnt = * aSRpnt; struct osst_request * SRpnt = * aSRpnt;
struct st_partstat * STps = & STp->ps[STp->partition]; struct st_partstat * STps = & STp->ps[STp->partition];
char * name = tape_name(STp); char * name = tape_name(STp);
int retval = 0; int retval = 0;
...@@ -1639,20 +1694,20 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ...@@ -1639,20 +1694,20 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request
rw_state = STps->rw; rw_state = STps->rw;
if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) != 3 if ((SRpnt->sense[ 2] & 0x0f) != 3
|| SRpnt->sr_sense_buffer[12] != 12 || SRpnt->sense[12] != 12
|| SRpnt->sr_sense_buffer[13] != 0) { || SRpnt->sense[13] != 0) {
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Write error recovery cannot handle %02x:%02x:%02x\n", name, printk(OSST_DEB_MSG "%s:D: Write error recovery cannot handle %02x:%02x:%02x\n", name,
SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); SRpnt->sense[2], SRpnt->sense[12], SRpnt->sense[13]);
#endif #endif
return (-EIO); return (-EIO);
} }
frame = (SRpnt->sr_sense_buffer[3] << 24) | frame = (SRpnt->sense[3] << 24) |
(SRpnt->sr_sense_buffer[4] << 16) | (SRpnt->sense[4] << 16) |
(SRpnt->sr_sense_buffer[5] << 8) | (SRpnt->sense[5] << 8) |
SRpnt->sr_sense_buffer[6]; SRpnt->sense[6];
skip = SRpnt->sr_sense_buffer[9]; skip = SRpnt->sense[9];
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Detected physical bad frame at %u, advised to skip %d\n", name, frame, skip); printk(OSST_DEB_MSG "%s:D: Detected physical bad frame at %u, advised to skip %d\n", name, frame, skip);
...@@ -1707,7 +1762,7 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ...@@ -1707,7 +1762,7 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request
return retval; return retval;
} }
static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct osst_request ** aSRpnt,
int mt_op, int mt_count) int mt_op, int mt_count)
{ {
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -1806,7 +1861,7 @@ static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct scs ...@@ -1806,7 +1861,7 @@ static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct scs
* *
* Just scans for the filemark sequentially. * Just scans for the filemark sequentially.
*/ */
static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct osst_request ** aSRpnt,
int mt_op, int mt_count) int mt_op, int mt_count)
{ {
int cnt = 0; int cnt = 0;
...@@ -1860,7 +1915,7 @@ static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct ...@@ -1860,7 +1915,7 @@ static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct
/* /*
* Fast linux specific version of OnStream FSF * Fast linux specific version of OnStream FSF
*/ */
static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct osst_request ** aSRpnt,
int mt_op, int mt_count) int mt_op, int mt_count)
{ {
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -2011,10 +2066,10 @@ static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct ...@@ -2011,10 +2066,10 @@ static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct
* to test the error recovery mechanism. * to test the error recovery mechanism.
*/ */
#if DEBUG #if DEBUG
static void osst_set_retries(struct osst_tape * STp, struct scsi_request ** aSRpnt, int retries) static void osst_set_retries(struct osst_tape * STp, struct osst_request ** aSRpnt, int retries)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt = * aSRpnt; struct osst_request * SRpnt = * aSRpnt;
char * name = tape_name(STp); char * name = tape_name(STp);
memset(cmd, 0, MAX_COMMAND_SIZE); memset(cmd, 0, MAX_COMMAND_SIZE);
...@@ -2043,7 +2098,7 @@ static void osst_set_retries(struct osst_tape * STp, struct scsi_request ** aSRp ...@@ -2043,7 +2098,7 @@ static void osst_set_retries(struct osst_tape * STp, struct scsi_request ** aSRp
#endif #endif
static int osst_write_filemark(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_write_filemark(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
int result; int result;
int this_mark_ppos = STp->first_frame_position; int this_mark_ppos = STp->first_frame_position;
...@@ -2071,7 +2126,7 @@ static int osst_write_filemark(struct osst_tape * STp, struct scsi_request ** aS ...@@ -2071,7 +2126,7 @@ static int osst_write_filemark(struct osst_tape * STp, struct scsi_request ** aS
return result; return result;
} }
static int osst_write_eod(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_write_eod(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
int result; int result;
#if DEBUG #if DEBUG
...@@ -2094,7 +2149,7 @@ static int osst_write_eod(struct osst_tape * STp, struct scsi_request ** aSRpnt) ...@@ -2094,7 +2149,7 @@ static int osst_write_eod(struct osst_tape * STp, struct scsi_request ** aSRpnt)
return result; return result;
} }
static int osst_write_filler(struct osst_tape * STp, struct scsi_request ** aSRpnt, int where, int count) static int osst_write_filler(struct osst_tape * STp, struct osst_request ** aSRpnt, int where, int count)
{ {
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -2119,7 +2174,7 @@ static int osst_write_filler(struct osst_tape * STp, struct scsi_request ** aSRp ...@@ -2119,7 +2174,7 @@ static int osst_write_filler(struct osst_tape * STp, struct scsi_request ** aSRp
return osst_flush_drive_buffer(STp, aSRpnt); return osst_flush_drive_buffer(STp, aSRpnt);
} }
static int __osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRpnt, int where, int count) static int __osst_write_header(struct osst_tape * STp, struct osst_request ** aSRpnt, int where, int count)
{ {
char * name = tape_name(STp); char * name = tape_name(STp);
int result; int result;
...@@ -2146,7 +2201,7 @@ static int __osst_write_header(struct osst_tape * STp, struct scsi_request ** aS ...@@ -2146,7 +2201,7 @@ static int __osst_write_header(struct osst_tape * STp, struct scsi_request ** aS
return result; return result;
} }
static int osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRpnt, int locate_eod) static int osst_write_header(struct osst_tape * STp, struct osst_request ** aSRpnt, int locate_eod)
{ {
os_header_t * header; os_header_t * header;
int result; int result;
...@@ -2220,7 +2275,7 @@ static int osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRp ...@@ -2220,7 +2275,7 @@ static int osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRp
return result; return result;
} }
static int osst_reset_header(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_reset_header(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
if (STp->header_cache != NULL) if (STp->header_cache != NULL)
memset(STp->header_cache, 0, sizeof(os_header_t)); memset(STp->header_cache, 0, sizeof(os_header_t));
...@@ -2233,7 +2288,7 @@ static int osst_reset_header(struct osst_tape * STp, struct scsi_request ** aSRp ...@@ -2233,7 +2288,7 @@ static int osst_reset_header(struct osst_tape * STp, struct scsi_request ** aSRp
return osst_write_header(STp, aSRpnt, 1); return osst_write_header(STp, aSRpnt, 1);
} }
static int __osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** aSRpnt, int ppos) static int __osst_analyze_headers(struct osst_tape * STp, struct osst_request ** aSRpnt, int ppos)
{ {
char * name = tape_name(STp); char * name = tape_name(STp);
os_header_t * header; os_header_t * header;
...@@ -2410,7 +2465,7 @@ static int __osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** ...@@ -2410,7 +2465,7 @@ static int __osst_analyze_headers(struct osst_tape * STp, struct scsi_request **
return 1; return 1;
} }
static int osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_analyze_headers(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
int position, ppos; int position, ppos;
int first, last; int first, last;
...@@ -2465,7 +2520,7 @@ static int osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** a ...@@ -2465,7 +2520,7 @@ static int osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** a
return 1; return 1;
} }
static int osst_verify_position(struct osst_tape * STp, struct scsi_request ** aSRpnt) static int osst_verify_position(struct osst_tape * STp, struct osst_request ** aSRpnt)
{ {
int frame_position = STp->first_frame_position; int frame_position = STp->first_frame_position;
int frame_seq_numbr = STp->frame_seq_number; int frame_seq_numbr = STp->frame_seq_number;
...@@ -2541,11 +2596,11 @@ static unsigned int osst_parse_firmware_rev (const char * str) ...@@ -2541,11 +2596,11 @@ static unsigned int osst_parse_firmware_rev (const char * str)
/* /*
* Configure the OnStream SCII tape drive for default operation * Configure the OnStream SCII tape drive for default operation
*/ */
static int osst_configure_onstream(struct osst_tape *STp, struct scsi_request ** aSRpnt) static int osst_configure_onstream(struct osst_tape *STp, struct osst_request ** aSRpnt)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
char * name = tape_name(STp); char * name = tape_name(STp);
struct scsi_request * SRpnt = * aSRpnt; struct osst_request * SRpnt = * aSRpnt;
osst_mode_parameter_header_t * header; osst_mode_parameter_header_t * header;
osst_block_size_page_t * bs; osst_block_size_page_t * bs;
osst_capabilities_page_t * cp; osst_capabilities_page_t * cp;
...@@ -2712,7 +2767,7 @@ static int osst_configure_onstream(struct osst_tape *STp, struct scsi_request ** ...@@ -2712,7 +2767,7 @@ static int osst_configure_onstream(struct osst_tape *STp, struct scsi_request **
/* Step over EOF if it has been inadvertently crossed (ioctl not used because /* Step over EOF if it has been inadvertently crossed (ioctl not used because
it messes up the block number). */ it messes up the block number). */
static int cross_eof(struct osst_tape *STp, struct scsi_request ** aSRpnt, int forward) static int cross_eof(struct osst_tape *STp, struct osst_request ** aSRpnt, int forward)
{ {
int result; int result;
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -2741,10 +2796,10 @@ static int cross_eof(struct osst_tape *STp, struct scsi_request ** aSRpnt, int f ...@@ -2741,10 +2796,10 @@ static int cross_eof(struct osst_tape *STp, struct scsi_request ** aSRpnt, int f
/* Get the tape position. */ /* Get the tape position. */
static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt) static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt)
{ {
unsigned char scmd[MAX_COMMAND_SIZE]; unsigned char scmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
int result = 0; int result = 0;
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -2769,14 +2824,14 @@ static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** ...@@ -2769,14 +2824,14 @@ static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request **
*aSRpnt = SRpnt; *aSRpnt = SRpnt;
if (STp->buffer->syscall_result) if (STp->buffer->syscall_result)
result = ((SRpnt->sr_sense_buffer[2] & 0x0f) == 3) ? -EIO : -EINVAL; /* 3: Write Error */ result = ((SRpnt->sense[2] & 0x0f) == 3) ? -EIO : -EINVAL; /* 3: Write Error */
if (result == -EINVAL) if (result == -EINVAL)
printk(KERN_ERR "%s:E: Can't read tape position.\n", name); printk(KERN_ERR "%s:E: Can't read tape position.\n", name);
else { else {
if (result == -EIO) { /* re-read position - this needs to preserve media errors */ if (result == -EIO) { /* re-read position - this needs to preserve media errors */
unsigned char mysense[16]; unsigned char mysense[16];
memcpy (mysense, SRpnt->sr_sense_buffer, 16); memcpy (mysense, SRpnt->sense, 16);
memset (scmd, 0, MAX_COMMAND_SIZE); memset (scmd, 0, MAX_COMMAND_SIZE);
scmd[0] = READ_POSITION; scmd[0] = READ_POSITION;
STp->buffer->b_data = mybuf; STp->buffer->buffer_size = 24; STp->buffer->b_data = mybuf; STp->buffer->buffer_size = 24;
...@@ -2785,10 +2840,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** ...@@ -2785,10 +2840,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request **
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Reread position, reason=[%02x:%02x:%02x], result=[%s%02x:%02x:%02x]\n", printk(OSST_DEB_MSG "%s:D: Reread position, reason=[%02x:%02x:%02x], result=[%s%02x:%02x:%02x]\n",
name, mysense[2], mysense[12], mysense[13], STp->buffer->syscall_result?"":"ok:", name, mysense[2], mysense[12], mysense[13], STp->buffer->syscall_result?"":"ok:",
SRpnt->sr_sense_buffer[2],SRpnt->sr_sense_buffer[12],SRpnt->sr_sense_buffer[13]); SRpnt->sense[2],SRpnt->sense[12],SRpnt->sense[13]);
#endif #endif
if (!STp->buffer->syscall_result) if (!STp->buffer->syscall_result)
memcpy (SRpnt->sr_sense_buffer, mysense, 16); memcpy (SRpnt->sense, mysense, 16);
else else
printk(KERN_WARNING "%s:W: Double error in get position\n", name); printk(KERN_WARNING "%s:W: Double error in get position\n", name);
} }
...@@ -2825,10 +2880,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** ...@@ -2825,10 +2880,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request **
/* Set the tape block */ /* Set the tape block */
static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt, int ppos, int skip) static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt, int ppos, int skip)
{ {
unsigned char scmd[MAX_COMMAND_SIZE]; unsigned char scmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
struct st_partstat * STps; struct st_partstat * STps;
int result = 0; int result = 0;
int pp = (ppos == 3000 && !skip)? 0 : ppos; int pp = (ppos == 3000 && !skip)? 0 : ppos;
...@@ -2883,7 +2938,7 @@ static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request ** ...@@ -2883,7 +2938,7 @@ static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request **
return result; return result;
} }
static int osst_write_trailer(struct osst_tape *STp, struct scsi_request ** aSRpnt, int leave_at_EOT) static int osst_write_trailer(struct osst_tape *STp, struct osst_request ** aSRpnt, int leave_at_EOT)
{ {
struct st_partstat * STps = &(STp->ps[STp->partition]); struct st_partstat * STps = &(STp->ps[STp->partition]);
int result = 0; int result = 0;
...@@ -2910,12 +2965,12 @@ static int osst_write_trailer(struct osst_tape *STp, struct scsi_request ** aSRp ...@@ -2910,12 +2965,12 @@ static int osst_write_trailer(struct osst_tape *STp, struct scsi_request ** aSRp
/* osst versions of st functions - augmented and stripped to suit OnStream only */ /* osst versions of st functions - augmented and stripped to suit OnStream only */
/* Flush the write buffer (never need to write if variable blocksize). */ /* Flush the write buffer (never need to write if variable blocksize). */
static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** aSRpnt) static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** aSRpnt)
{ {
int offset, transfer, blks = 0; int offset, transfer, blks = 0;
int result = 0; int result = 0;
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt = *aSRpnt; struct osst_request * SRpnt = *aSRpnt;
struct st_partstat * STps; struct st_partstat * STps;
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -2923,13 +2978,13 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** ...@@ -2923,13 +2978,13 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request **
if (SRpnt == (STp->buffer)->last_SRpnt) if (SRpnt == (STp->buffer)->last_SRpnt)
#if DEBUG #if DEBUG
{ printk(OSST_DEB_MSG { printk(OSST_DEB_MSG
"%s:D: aSRpnt points to scsi_request that write_behind_check will release -- cleared\n", name); "%s:D: aSRpnt points to osst_request that write_behind_check will release -- cleared\n", name);
#endif #endif
*aSRpnt = SRpnt = NULL; *aSRpnt = SRpnt = NULL;
#if DEBUG #if DEBUG
} else if (SRpnt) } else if (SRpnt)
printk(OSST_DEB_MSG printk(OSST_DEB_MSG
"%s:D: aSRpnt does not point to scsi_request that write_behind_check will release -- strange\n", name); "%s:D: aSRpnt does not point to osst_request that write_behind_check will release -- strange\n", name);
#endif #endif
osst_write_behind_check(STp); osst_write_behind_check(STp);
if ((STp->buffer)->syscall_result) { if ((STp->buffer)->syscall_result) {
...@@ -3007,12 +3062,12 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** ...@@ -3007,12 +3062,12 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request **
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG printk(OSST_DEB_MSG
"%s:D: write sense [0]=0x%02x [2]=%02x [12]=%02x [13]=%02x\n", "%s:D: write sense [0]=0x%02x [2]=%02x [12]=%02x [13]=%02x\n",
name, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], name, SRpnt->sense[0], SRpnt->sense[2],
SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); SRpnt->sense[12], SRpnt->sense[13]);
#endif #endif
if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && if ((SRpnt->sense[0] & 0x70) == 0x70 &&
(SRpnt->sr_sense_buffer[2] & 0x40) && /* FIXME - SC-30 drive doesn't assert EOM bit */ (SRpnt->sense[2] & 0x40) && /* FIXME - SC-30 drive doesn't assert EOM bit */
(SRpnt->sr_sense_buffer[2] & 0x0f) == NO_SENSE) { (SRpnt->sense[2] & 0x0f) == NO_SENSE) {
STp->dirty = 0; STp->dirty = 0;
(STp->buffer)->buffer_bytes = 0; (STp->buffer)->buffer_bytes = 0;
result = (-ENOSPC); result = (-ENOSPC);
...@@ -3040,7 +3095,7 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** ...@@ -3040,7 +3095,7 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request **
/* Flush the tape buffer. The tape will be positioned correctly unless /* Flush the tape buffer. The tape will be positioned correctly unless
seek_next is true. */ seek_next is true. */
static int osst_flush_buffer(struct osst_tape * STp, struct scsi_request ** aSRpnt, int seek_next) static int osst_flush_buffer(struct osst_tape * STp, struct osst_request ** aSRpnt, int seek_next)
{ {
struct st_partstat * STps; struct st_partstat * STps;
int backspace = 0, result = 0; int backspace = 0, result = 0;
...@@ -3102,10 +3157,10 @@ static int osst_flush_buffer(struct osst_tape * STp, struct scsi_request ** aSRp ...@@ -3102,10 +3157,10 @@ static int osst_flush_buffer(struct osst_tape * STp, struct scsi_request ** aSRp
return result; return result;
} }
static int osst_write_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int synchronous) static int osst_write_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int synchronous)
{ {
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt; struct osst_request * SRpnt;
int blks; int blks;
#if DEBUG #if DEBUG
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -3166,9 +3221,9 @@ static int osst_write_frame(struct osst_tape * STp, struct scsi_request ** aSRpn ...@@ -3166,9 +3221,9 @@ static int osst_write_frame(struct osst_tape * STp, struct scsi_request ** aSRpn
if (debugging) if (debugging)
printk(OSST_DEB_MSG "%s:D: Error on write:\n", name); printk(OSST_DEB_MSG "%s:D: Error on write:\n", name);
#endif #endif
if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && if ((SRpnt->sense[0] & 0x70) == 0x70 &&
(SRpnt->sr_sense_buffer[2] & 0x40)) { (SRpnt->sense[2] & 0x40)) {
if ((SRpnt->sr_sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW) if ((SRpnt->sense[2] & 0x0f) == VOLUME_OVERFLOW)
return (-ENOSPC); return (-ENOSPC);
} }
else { else {
...@@ -3185,7 +3240,7 @@ static int osst_write_frame(struct osst_tape * STp, struct scsi_request ** aSRpn ...@@ -3185,7 +3240,7 @@ static int osst_write_frame(struct osst_tape * STp, struct scsi_request ** aSRpn
return 0; return 0;
} }
/* Lock or unlock the drive door. Don't use when struct scsi_request allocated. */ /* Lock or unlock the drive door. Don't use when struct osst_request allocated. */
static int do_door_lock(struct osst_tape * STp, int do_lock) static int do_door_lock(struct osst_tape * STp, int do_lock)
{ {
int retval, cmd; int retval, cmd;
...@@ -3233,7 +3288,7 @@ static ssize_t osst_write(struct file * filp, const char __user * buf, size_t co ...@@ -3233,7 +3288,7 @@ static ssize_t osst_write(struct file * filp, const char __user * buf, size_t co
int write_threshold; int write_threshold;
int doing_write = 0; int doing_write = 0;
const char __user * b_point; const char __user * b_point;
struct scsi_request * SRpnt = NULL; struct osst_request * SRpnt = NULL;
struct st_modedef * STm; struct st_modedef * STm;
struct st_partstat * STps; struct st_partstat * STps;
struct osst_tape * STp = filp->private_data; struct osst_tape * STp = filp->private_data;
...@@ -3424,7 +3479,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name ...@@ -3424,7 +3479,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name
#if DEBUG #if DEBUG
if (debugging) if (debugging)
printk(OSST_DEB_MSG "%s:D: Writing %d bytes to file %d block %d lblk %d fseq %d fppos %d\n", printk(OSST_DEB_MSG "%s:D: Writing %d bytes to file %d block %d lblk %d fseq %d fppos %d\n",
name, count, STps->drv_file, STps->drv_block, name, (int) count, STps->drv_file, STps->drv_block,
STp->logical_blk_num, STp->frame_seq_number, STp->first_frame_position); STp->logical_blk_num, STp->frame_seq_number, STp->first_frame_position);
#endif #endif
b_point = buf; b_point = buf;
...@@ -3460,7 +3515,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name ...@@ -3460,7 +3515,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name
#if DEBUG #if DEBUG
if (debugging) if (debugging)
printk(OSST_DEB_MSG "%s:D: EOM with %d bytes unwritten.\n", printk(OSST_DEB_MSG "%s:D: EOM with %d bytes unwritten.\n",
name, transfer); name, (int) transfer);
#endif #endif
} }
else { else {
...@@ -3478,7 +3533,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name ...@@ -3478,7 +3533,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name
if (retval < 0) { if (retval < 0) {
if (SRpnt != NULL) { if (SRpnt != NULL) {
scsi_release_request(SRpnt); osst_release_request(SRpnt);
SRpnt = NULL; SRpnt = NULL;
} }
STp->buffer->buffer_bytes = 0; STp->buffer->buffer_bytes = 0;
...@@ -3540,7 +3595,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name ...@@ -3540,7 +3595,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name
retval = total; retval = total;
out: out:
if (SRpnt != NULL) scsi_release_request(SRpnt); if (SRpnt != NULL) osst_release_request(SRpnt);
up(&STp->lock); up(&STp->lock);
...@@ -3556,7 +3611,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo ...@@ -3556,7 +3611,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo
int special; int special;
struct st_modedef * STm; struct st_modedef * STm;
struct st_partstat * STps; struct st_partstat * STps;
struct scsi_request * SRpnt = NULL; struct osst_request * SRpnt = NULL;
struct osst_tape * STp = filp->private_data; struct osst_tape * STp = filp->private_data;
char * name = tape_name(STp); char * name = tape_name(STp);
...@@ -3664,7 +3719,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo ...@@ -3664,7 +3719,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo
#if DEBUG #if DEBUG
if (debugging && STps->eof != ST_NOEOF) if (debugging && STps->eof != ST_NOEOF)
printk(OSST_DEB_MSG "%s:D: EOF up (%d). Left %d, needed %d.\n", name, printk(OSST_DEB_MSG "%s:D: EOF up (%d). Left %d, needed %d.\n", name,
STps->eof, (STp->buffer)->buffer_bytes, count - total); STps->eof, (STp->buffer)->buffer_bytes, (int) (count - total));
#endif #endif
/* force multiple of block size, note block_size may have been adjusted */ /* force multiple of block size, note block_size may have been adjusted */
transfer = (((STp->buffer)->buffer_bytes < count - total ? transfer = (((STp->buffer)->buffer_bytes < count - total ?
...@@ -3725,7 +3780,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo ...@@ -3725,7 +3780,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo
retval = total; retval = total;
out: out:
if (SRpnt != NULL) scsi_release_request(SRpnt); if (SRpnt != NULL) osst_release_request(SRpnt);
up(&STp->lock); up(&STp->lock);
...@@ -3913,7 +3968,7 @@ static int osst_set_options(struct osst_tape *STp, long options) ...@@ -3913,7 +3968,7 @@ static int osst_set_options(struct osst_tape *STp, long options)
/* Internal ioctl function */ /* Internal ioctl function */
static int osst_int_ioctl(struct osst_tape * STp, struct scsi_request ** aSRpnt, static int osst_int_ioctl(struct osst_tape * STp, struct osst_request ** aSRpnt,
unsigned int cmd_in, unsigned long arg) unsigned int cmd_in, unsigned long arg)
{ {
int timeout; int timeout;
...@@ -3921,7 +3976,7 @@ static int osst_int_ioctl(struct osst_tape * STp, struct scsi_request ** aSRpnt, ...@@ -3921,7 +3976,7 @@ static int osst_int_ioctl(struct osst_tape * STp, struct scsi_request ** aSRpnt,
int i, ioctl_result; int i, ioctl_result;
int chg_eof = 1; int chg_eof = 1;
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt = * aSRpnt; struct osst_request * SRpnt = * aSRpnt;
struct st_partstat * STps; struct st_partstat * STps;
int fileno, blkno, at_sm, frame_seq_numbr, logical_blk_num; int fileno, blkno, at_sm, frame_seq_numbr, logical_blk_num;
int datalen = 0, direction = DMA_NONE; int datalen = 0, direction = DMA_NONE;
...@@ -4279,14 +4334,14 @@ static int osst_int_ioctl(struct osst_tape * STp, struct scsi_request ** aSRpnt, ...@@ -4279,14 +4334,14 @@ static int osst_int_ioctl(struct osst_tape * STp, struct scsi_request ** aSRpnt,
} else if (cmd_in == MTERASE) { } else if (cmd_in == MTERASE) {
STp->header_ok = 0; STp->header_ok = 0;
} else if (SRpnt) { /* SCSI command was not completely successful. */ } else if (SRpnt) { /* SCSI command was not completely successful. */
if (SRpnt->sr_sense_buffer[2] & 0x40) { if (SRpnt->sense[2] & 0x40) {
STps->eof = ST_EOM_OK; STps->eof = ST_EOM_OK;
STps->drv_block = 0; STps->drv_block = 0;
} }
if (chg_eof) if (chg_eof)
STps->eof = ST_NOEOF; STps->eof = ST_NOEOF;
if ((SRpnt->sr_sense_buffer[2] & 0x0f) == BLANK_CHECK) if ((SRpnt->sense[2] & 0x0f) == BLANK_CHECK)
STps->eof = ST_EOD; STps->eof = ST_EOD;
if (cmd_in == MTLOAD && osst_wait_for_medium(STp, &SRpnt, 60)) if (cmd_in == MTLOAD && osst_wait_for_medium(STp, &SRpnt, 60))
...@@ -4304,7 +4359,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4304,7 +4359,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
unsigned short flags; unsigned short flags;
int i, b_size, new_session = 0, retval = 0; int i, b_size, new_session = 0, retval = 0;
unsigned char cmd[MAX_COMMAND_SIZE]; unsigned char cmd[MAX_COMMAND_SIZE];
struct scsi_request * SRpnt = NULL; struct osst_request * SRpnt = NULL;
struct osst_tape * STp; struct osst_tape * STp;
struct st_modedef * STm; struct st_modedef * STm;
struct st_partstat * STps; struct st_partstat * STps;
...@@ -4412,17 +4467,17 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4412,17 +4467,17 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
retval = (STp->buffer)->syscall_result; /* FIXME - valid? */ retval = (STp->buffer)->syscall_result; /* FIXME - valid? */
goto err_out; goto err_out;
} }
if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && if ((SRpnt->sense[0] & 0x70) == 0x70 &&
(SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY && (SRpnt->sense[2] & 0x0f) == NOT_READY &&
SRpnt->sr_sense_buffer[12] == 4 ) { SRpnt->sense[12] == 4 ) {
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Unit not ready, cause %x\n", name, SRpnt->sr_sense_buffer[13]); printk(OSST_DEB_MSG "%s:D: Unit not ready, cause %x\n", name, SRpnt->sense[13]);
#endif #endif
if (filp->f_flags & O_NONBLOCK) { if (filp->f_flags & O_NONBLOCK) {
retval = -EAGAIN; retval = -EAGAIN;
goto err_out; goto err_out;
} }
if (SRpnt->sr_sense_buffer[13] == 2) { /* initialize command required (LOAD) */ if (SRpnt->sense[13] == 2) { /* initialize command required (LOAD) */
memset (cmd, 0, MAX_COMMAND_SIZE); memset (cmd, 0, MAX_COMMAND_SIZE);
cmd[0] = START_STOP; cmd[0] = START_STOP;
cmd[1] = 1; cmd[1] = 1;
...@@ -4430,10 +4485,10 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4430,10 +4485,10 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE,
STp->timeout, MAX_RETRIES, 1); STp->timeout, MAX_RETRIES, 1);
} }
osst_wait_ready(STp, &SRpnt, (SRpnt->sr_sense_buffer[13]==1?15:3) * 60, 0); osst_wait_ready(STp, &SRpnt, (SRpnt->sense[13]==1?15:3) * 60, 0);
} }
if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && if ((SRpnt->sense[0] & 0x70) == 0x70 &&
(SRpnt->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */ (SRpnt->sense[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */
#if DEBUG #if DEBUG
printk(OSST_DEB_MSG "%s:D: Unit wants attention\n", name); printk(OSST_DEB_MSG "%s:D: Unit wants attention\n", name);
#endif #endif
...@@ -4446,8 +4501,8 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4446,8 +4501,8 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE,
STp->timeout, MAX_RETRIES, 1); STp->timeout, MAX_RETRIES, 1);
if ((SRpnt->sr_sense_buffer[0] & 0x70) != 0x70 || if ((SRpnt->sense[0] & 0x70) != 0x70 ||
(SRpnt->sr_sense_buffer[2] & 0x0f) != UNIT_ATTENTION) (SRpnt->sense[2] & 0x0f) != UNIT_ATTENTION)
break; break;
} }
...@@ -4473,7 +4528,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4473,7 +4528,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
* open without reconfiguring and re-reading the headers * open without reconfiguring and re-reading the headers
*/ */
if (!STp->buffer->syscall_result && STp->header_ok && if (!STp->buffer->syscall_result && STp->header_ok &&
!SRpnt->sr_result && SRpnt->sr_sense_buffer[0] == 0) { !SRpnt->result && SRpnt->sense[0] == 0) {
memset(cmd, 0, MAX_COMMAND_SIZE); memset(cmd, 0, MAX_COMMAND_SIZE);
cmd[0] = MODE_SENSE; cmd[0] = MODE_SENSE;
...@@ -4512,7 +4567,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4512,7 +4567,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
} }
STp->buffer->buffer_blocks = OS_DATA_SIZE / STp->block_size; STp->buffer->buffer_blocks = OS_DATA_SIZE / STp->block_size;
STp->fast_open = 1; STp->fast_open = 1;
scsi_release_request(SRpnt); osst_release_request(SRpnt);
return 0; return 0;
} }
#if DEBUG #if DEBUG
...@@ -4525,7 +4580,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4525,7 +4580,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
STp->fast_open = 0; STp->fast_open = 0;
if ((STp->buffer)->syscall_result != 0 && /* in all error conditions except no medium */ if ((STp->buffer)->syscall_result != 0 && /* in all error conditions except no medium */
(SRpnt->sr_sense_buffer[2] != 2 || SRpnt->sr_sense_buffer[12] != 0x3A) ) { (SRpnt->sense[2] != 2 || SRpnt->sense[12] != 0x3A) ) {
memset(cmd, 0, MAX_COMMAND_SIZE); memset(cmd, 0, MAX_COMMAND_SIZE);
cmd[0] = MODE_SELECT; cmd[0] = MODE_SELECT;
...@@ -4555,11 +4610,11 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4555,11 +4610,11 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE,
STp->timeout, MAX_RETRIES, 1); STp->timeout, MAX_RETRIES, 1);
if ((SRpnt->sr_sense_buffer[0] & 0x70) != 0x70 || if ((SRpnt->sense[0] & 0x70) != 0x70 ||
(SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY) (SRpnt->sense[2] & 0x0f) == NOT_READY)
break; break;
if ((SRpnt->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { if ((SRpnt->sense[2] & 0x0f) == UNIT_ATTENTION) {
STp->pos_unknown = 0; STp->pos_unknown = 0;
STp->partition = STp->new_partition = 0; STp->partition = STp->new_partition = 0;
if (STp->can_partitions) if (STp->can_partitions)
...@@ -4583,13 +4638,13 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4583,13 +4638,13 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
if ((STp->buffer)->syscall_result != 0) { if ((STp->buffer)->syscall_result != 0) {
if ((STp->device)->scsi_level >= SCSI_2 && if ((STp->device)->scsi_level >= SCSI_2 &&
(SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && (SRpnt->sense[0] & 0x70) == 0x70 &&
(SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY && (SRpnt->sense[2] & 0x0f) == NOT_READY &&
SRpnt->sr_sense_buffer[12] == 0x3a) { /* Check ASC */ SRpnt->sense[12] == 0x3a) { /* Check ASC */
STp->ready = ST_NO_TAPE; STp->ready = ST_NO_TAPE;
} else } else
STp->ready = ST_NOT_READY; STp->ready = ST_NOT_READY;
scsi_release_request(SRpnt); osst_release_request(SRpnt);
SRpnt = NULL; SRpnt = NULL;
STp->density = 0; /* Clear the erroneous "residue" */ STp->density = 0; /* Clear the erroneous "residue" */
STp->write_prot = 0; STp->write_prot = 0;
...@@ -4649,14 +4704,14 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) ...@@ -4649,14 +4704,14 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp)
osst_analyze_headers(STp, &SRpnt); osst_analyze_headers(STp, &SRpnt);
scsi_release_request(SRpnt); osst_release_request(SRpnt);
SRpnt = NULL; SRpnt = NULL;
return 0; return 0;
err_out: err_out:
if (SRpnt != NULL) if (SRpnt != NULL)
scsi_release_request(SRpnt); osst_release_request(SRpnt);
normalize_buffer(STp->buffer); normalize_buffer(STp->buffer);
STp->header_ok = 0; STp->header_ok = 0;
STp->in_use = 0; STp->in_use = 0;
...@@ -4673,7 +4728,7 @@ static int os_scsi_tape_flush(struct file * filp) ...@@ -4673,7 +4728,7 @@ static int os_scsi_tape_flush(struct file * filp)
struct osst_tape * STp = filp->private_data; struct osst_tape * STp = filp->private_data;
struct st_modedef * STm = &(STp->modes[STp->current_mode]); struct st_modedef * STm = &(STp->modes[STp->current_mode]);
struct st_partstat * STps = &(STp->ps[STp->partition]); struct st_partstat * STps = &(STp->ps[STp->partition]);
struct scsi_request * SRpnt = NULL; struct osst_request * SRpnt = NULL;
char * name = tape_name(STp); char * name = tape_name(STp);
if (file_count(filp) > 1) if (file_count(filp) > 1)
...@@ -4736,7 +4791,7 @@ static int os_scsi_tape_flush(struct file * filp) ...@@ -4736,7 +4791,7 @@ static int os_scsi_tape_flush(struct file * filp)
if (result == 0 && result2 < 0) if (result == 0 && result2 < 0)
result = result2; result = result2;
} }
if (SRpnt) scsi_release_request(SRpnt); if (SRpnt) osst_release_request(SRpnt);
if (STp->abort_count || STp->recover_count) { if (STp->abort_count || STp->recover_count) {
printk(KERN_INFO "%s:I:", name); printk(KERN_INFO "%s:I:", name);
...@@ -4790,7 +4845,7 @@ static int osst_ioctl(struct inode * inode,struct file * file, ...@@ -4790,7 +4845,7 @@ static int osst_ioctl(struct inode * inode,struct file * file,
unsigned int blk; unsigned int blk;
struct st_modedef * STm; struct st_modedef * STm;
struct st_partstat * STps; struct st_partstat * STps;
struct scsi_request * SRpnt = NULL; struct osst_request * SRpnt = NULL;
struct osst_tape * STp = file->private_data; struct osst_tape * STp = file->private_data;
char * name = tape_name(STp); char * name = tape_name(STp);
void __user * p = (void __user *)arg; void __user * p = (void __user *)arg;
...@@ -5104,14 +5159,14 @@ static int osst_ioctl(struct inode * inode,struct file * file, ...@@ -5104,14 +5159,14 @@ static int osst_ioctl(struct inode * inode,struct file * file,
retval = -EFAULT; retval = -EFAULT;
goto out; goto out;
} }
if (SRpnt) scsi_release_request(SRpnt); if (SRpnt) osst_release_request(SRpnt);
up(&STp->lock); up(&STp->lock);
return scsi_ioctl(STp->device, cmd_in, p); return scsi_ioctl(STp->device, cmd_in, p);
out: out:
if (SRpnt) scsi_release_request(SRpnt); if (SRpnt) osst_release_request(SRpnt);
up(&STp->lock); up(&STp->lock);
......
...@@ -518,7 +518,8 @@ struct osst_buffer { ...@@ -518,7 +518,8 @@ struct osst_buffer {
int writing; int writing;
int midlevel_result; int midlevel_result;
int syscall_result; int syscall_result;
struct scsi_request *last_SRpnt; struct osst_request *last_SRpnt;
struct st_cmdstatus cmdstat;
unsigned char *b_data; unsigned char *b_data;
os_aux_t *aux; /* onstream AUX structure at end of each block */ os_aux_t *aux; /* onstream AUX structure at end of each block */
unsigned short use_sg; /* zero or number of s/g segments for this adapter */ unsigned short use_sg; /* zero or number of s/g segments for this adapter */
...@@ -626,6 +627,15 @@ struct osst_tape { ...@@ -626,6 +627,15 @@ struct osst_tape {
struct gendisk *drive; struct gendisk *drive;
} ; } ;
/* scsi tape command */
struct osst_request {
unsigned char cmd[MAX_COMMAND_SIZE];
unsigned char sense[SCSI_SENSE_BUFFERSIZE];
int result;
struct osst_tape *stp;
struct completion *waiting;
};
/* Values of write_type */ /* Values of write_type */
#define OS_WRITE_DATA 0 #define OS_WRITE_DATA 0
#define OS_WRITE_EOD 1 #define OS_WRITE_EOD 1
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment