X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fscsi%2Fosst.c;fp=drivers%2Fscsi%2Fosst.c;h=d9946bd95492e68ae43d9df891d497c86592d58d;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=4a2fed350d4e21620b134d2afac1244cb87670e0;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/scsi/osst.c b/drivers/scsi/osst.c index 4a2fed350..d9946bd95 100644 --- a/drivers/scsi/osst.c +++ b/drivers/scsi/osst.c @@ -13,7 +13,7 @@ order) Klaus Ehrenfried, Wolfgang Denk, Steve Hirsch, Andreas Koppenh"ofer, Michael Leodolter, Eyal Lebedinsky, J"org Weule, and Eric Youngdale. - Copyright 1992 - 2002 Kai Makisara / 2000 - 2006 Willem Riede + Copyright 1992 - 2002 Kai Makisara / 2000 - 2004 Willem Riede email osst@riede.org $Header: /cvsroot/osst/Driver/osst.c,v 1.73 2005/01/01 21:13:34 wriede Exp $ @@ -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 * osst_version = "0.99.4"; +static const char * osst_version = "0.99.3"; /* The "failure to reconnect" firmware bug */ #define OSST_FW_NEED_POLL_MIN 10601 /*(107A)*/ @@ -48,8 +48,8 @@ static const char * osst_version = "0.99.4"; #include #include #include +#include #include -#include #include #include #include @@ -70,6 +70,7 @@ static const char * osst_version = "0.99.4"; #include #include #include +#include #define ST_KILOBYTE 1024 @@ -86,7 +87,6 @@ static int max_sg_segs = 0; MODULE_AUTHOR("Willem Riede"); MODULE_DESCRIPTION("OnStream {DI-|FW-|SC-|USB}{30|50} Tape Driver"); MODULE_LICENSE("GPL"); -MODULE_ALIAS_CHARDEV_MAJOR(OSST_MAJOR); module_param(max_dev, int, 0444); MODULE_PARM_DESC(max_dev, "Maximum number of OnStream Tape Drives to attach (4)"); @@ -107,6 +107,8 @@ static struct osst_dev_parm { }; #endif +static char *osst_formats[ST_NBR_MODES] ={"", "l", "m", "a"}; + /* Some default definitions have been moved to osst_options.h */ #define OSST_BUFFER_SIZE (OSST_BUFFER_BLOCKS * ST_KILOBYTE) #define OSST_WRITE_THRESHOLD (OSST_WRITE_THRESHOLD_BLOCKS * ST_KILOBYTE) @@ -177,16 +179,16 @@ static struct scsi_driver osst_template = { } }; -static int osst_int_ioctl(struct osst_tape *STp, struct osst_request ** aSRpnt, +static int osst_int_ioctl(struct osst_tape *STp, struct scsi_request ** aSRpnt, unsigned int cmd_in, unsigned long arg); -static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt, int frame, int skip); +static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt, int frame, int skip); -static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt); +static int osst_get_frame_position(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_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** aSRpnt); -static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request ** aSRpnt, int pending); +static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ** aSRpnt, int pending); static inline char *tape_name(struct osst_tape *tape) { @@ -195,84 +197,52 @@ static inline char *tape_name(struct osst_tape *tape) /* 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 */ -static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt) +static int osst_chk_result(struct osst_tape * STp, struct scsi_request * SRpnt) { char *name = tape_name(STp); - int result = SRpnt->result; - u8 * sense = SRpnt->sense, scode; + int result = SRpnt->sr_result; + unsigned char * sense = SRpnt->sr_sense_buffer, scode; #if DEBUG const char *stp; #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; - - cmdstatp = &STp->buffer->cmdstat; - osst_analyze_sense(SRpnt, cmdstatp); - - if (cmdstatp->have_sense) - scode = STp->buffer->cmdstat.sense_hdr.sense_key; - else + } + if ((driver_byte(result) & DRIVER_MASK) == DRIVER_SENSE) + scode = sense[2] & 0x0f; + else { + sense[0] = 0; /* We don't have sense data if this byte is zero */ scode = 0; + } #if DEBUG if (debugging) { - printk(OSST_DEB_MSG "%s:D: Error: %x, cmd: %x %x %x %x %x %x\n", + printk(OSST_DEB_MSG "%s:D: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", name, result, - SRpnt->cmd[0], SRpnt->cmd[1], SRpnt->cmd[2], - SRpnt->cmd[3], SRpnt->cmd[4], SRpnt->cmd[5]); + SRpnt->sr_cmnd[0], SRpnt->sr_cmnd[1], SRpnt->sr_cmnd[2], + SRpnt->sr_cmnd[3], SRpnt->sr_cmnd[4], SRpnt->sr_cmnd[5], + SRpnt->sr_bufflen); if (scode) printk(OSST_DEB_MSG "%s:D: Sense: %02x, ASC: %02x, ASCQ: %02x\n", name, scode, sense[12], sense[13]); - if (cmdstatp->have_sense) - __scsi_print_sense("osst ", SRpnt->sense, SCSI_SENSE_BUFFERSIZE); + if (driver_byte(result) & DRIVER_SENSE) + scsi_print_req_sense("osst ", SRpnt); } else #endif - if (cmdstatp->have_sense && ( + if (!(driver_byte(result) & DRIVER_SENSE) || + ((sense[0] & 0x70) == 0x70 && scode != NO_SENSE && scode != RECOVERED_ERROR && /* scode != UNIT_ATTENTION && */ scode != BLANK_CHECK && scode != VOLUME_OVERFLOW && - SRpnt->cmd[0] != MODE_SENSE && - SRpnt->cmd[0] != TEST_UNIT_READY)) { /* Abnormal conditions for tape */ - if (cmdstatp->have_sense) { + SRpnt->sr_cmnd[0] != MODE_SENSE && + SRpnt->sr_cmnd[0] != TEST_UNIT_READY)) { /* Abnormal conditions for tape */ + if (driver_byte(result) & DRIVER_SENSE) { printk(KERN_WARNING "%s:W: Command with sense data:\n", name); - __scsi_print_sense("osst ", SRpnt->sense, SCSI_SENSE_BUFFERSIZE); + scsi_print_req_sense("osst:", SRpnt); } else { static int notyetprinted = 1; @@ -292,14 +262,15 @@ static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt) } STp->pos_unknown |= STp->device->was_reset; - if (cmdstatp->have_sense && scode == RECOVERED_ERROR) { + if ((sense[0] & 0x70) == 0x70 && + scode == RECOVERED_ERROR) { STp->recover_count++; STp->recover_erreg++; #if DEBUG if (debugging) { - if (SRpnt->cmd[0] == READ_6) + if (SRpnt->sr_cmnd[0] == READ_6) stp = "read"; - else if (SRpnt->cmd[0] == WRITE_6) + else if (SRpnt->sr_cmnd[0] == WRITE_6) stp = "write"; else stp = "ioctl"; @@ -315,99 +286,74 @@ static int osst_chk_result(struct osst_tape * STp, struct osst_request * SRpnt) /* Wakeup from interrupt */ -static void osst_sleep_done(void *data, char *sense, int result, int resid) +static void osst_sleep_done (struct scsi_cmnd * SCpnt) { - struct osst_request *SRpnt = data; - struct osst_tape *STp = SRpnt->stp; + struct osst_tape * STp = container_of(SCpnt->request->rq_disk->private_data, struct osst_tape, driver); + + 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 STp->write_pending = 0; #endif - if (SRpnt->waiting) - complete(SRpnt->waiting); + complete(SCpnt->request->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. Otherwise osst_write_behind_check() is used to check that the command has finished. */ -static struct osst_request * osst_do_scsi(struct osst_request *SRpnt, struct osst_tape *STp, +static struct scsi_request * osst_do_scsi(struct scsi_request *SRpnt, struct osst_tape *STp, unsigned char *cmd, int bytes, int direction, int timeout, int retries, int do_wait) { unsigned char *bp; - unsigned short use_sg; #ifdef OSST_INJECT_ERRORS static int inject = 0; static int repeat = 0; #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) { - printk(KERN_ERR "%s: Can't allocate SCSI request.\n", - tape_name(STp)); + if ((SRpnt = scsi_allocate_request(STp->device, GFP_ATOMIC)) == NULL) { + printk(KERN_ERR "%s:E: Can't get SCSI request.\n", tape_name(STp)); if (signal_pending(current)) (STp->buffer)->syscall_result = (-EINTR); else (STp->buffer)->syscall_result = (-EBUSY); return NULL; } - SRpnt->stp = STp; } - /* If async IO, set last_SRpnt. This ptr tells write_behind_check - which IO is outstanding. It's nulled out when the IO completes. */ - if (!do_wait) - (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) { + init_completion(&STp->wait); + SRpnt->sr_use_sg = (bytes > (STp->buffer)->sg[0].length) ? + (STp->buffer)->use_sg : 0; + if (SRpnt->sr_use_sg) { bp = (char *)&(STp->buffer->sg[0]); - if (STp->buffer->sg_segs < use_sg) - use_sg = STp->buffer->sg_segs; + if (STp->buffer->sg_segs < SRpnt->sr_use_sg) + SRpnt->sr_use_sg = STp->buffer->sg_segs; } else 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; - memcpy(SRpnt->cmd, cmd, sizeof(SRpnt->cmd)); - STp->buffer->cmdstat.have_sense = 0; - STp->buffer->syscall_result = 0; + scsi_do_req(SRpnt, (void *)cmd, bp, bytes, osst_sleep_done, timeout, retries); - if (scsi_execute_async(STp->device, cmd, COMMAND_SIZE(cmd[0]), direction, bp, bytes, - use_sg, timeout, retries, SRpnt, osst_sleep_done, GFP_KERNEL)) - /* 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; + if (do_wait) { + wait_for_completion(SRpnt->sr_request->waiting); + SRpnt->sr_request->waiting = NULL; STp->buffer->syscall_result = osst_chk_result(STp, SRpnt); #ifdef OSST_INJECT_ERRORS if (STp->buffer->syscall_result == 0 && @@ -440,22 +386,21 @@ static void osst_write_behind_check(struct osst_tape *STp) STp->nbr_finished++; #endif wait_for_completion(&(STp->wait)); - STp->buffer->last_SRpnt->waiting = NULL; + (STp->buffer)->last_SRpnt->sr_request->waiting = NULL; STp->buffer->syscall_result = osst_chk_result(STp, STp->buffer->last_SRpnt); - if (STp->buffer->syscall_result) - STp->buffer->syscall_result = - osst_write_error_recovery(STp, &(STp->buffer->last_SRpnt), 1); + if ((STp->buffer)->syscall_result) + (STp->buffer)->syscall_result = + osst_write_error_recovery(STp, &((STp->buffer)->last_SRpnt), 1); else STp->first_frame_position++; - osst_release_request(STp->buffer->last_SRpnt); + scsi_release_request((STp->buffer)->last_SRpnt); if (STbuffer->writing < STbuffer->buffer_bytes) printk(KERN_WARNING "osst :A: write_behind_check: something left in buffer!\n"); - STbuffer->last_SRpnt = NULL; STbuffer->buffer_bytes -= STbuffer->writing; STbuffer->writing = 0; @@ -664,11 +609,11 @@ err_out: /* * Wait for the unit to become Ready */ -static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_wait_ready(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned timeout, int initial_delay) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; unsigned long startwait = jiffies; #if DEBUG int dbg = debugging; @@ -688,10 +633,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt if (!SRpnt) return (-EBUSY); while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) && - (( SRpnt->sense[2] == 2 && SRpnt->sense[12] == 4 && - (SRpnt->sense[13] == 1 || SRpnt->sense[13] == 8) ) || - ( SRpnt->sense[2] == 6 && SRpnt->sense[12] == 0x28 && - SRpnt->sense[13] == 0 ) )) { + (( SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 4 && + (SRpnt->sr_sense_buffer[13] == 1 || SRpnt->sr_sense_buffer[13] == 8) ) || + ( SRpnt->sr_sense_buffer[2] == 6 && SRpnt->sr_sense_buffer[12] == 0x28 && + SRpnt->sr_sense_buffer[13] == 0 ) )) { #if DEBUG if (debugging) { printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait ready\n", name); @@ -715,8 +660,8 @@ static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt #if DEBUG 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, - STp->buffer->syscall_result, SRpnt->sense[0], SRpnt->sense[2], - SRpnt->sense[12], SRpnt->sense[13]); + STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], + SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return (-EIO); } @@ -729,10 +674,10 @@ static int osst_wait_ready(struct osst_tape * STp, struct osst_request ** aSRpnt /* * Wait for a tape to be inserted in the unit */ -static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** aSRpnt, unsigned timeout) +static int osst_wait_for_medium(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned timeout) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; unsigned long startwait = jiffies; #if DEBUG int dbg = debugging; @@ -749,7 +694,8 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** a if (!SRpnt) return (-EBUSY); while ( STp->buffer->syscall_result && time_before(jiffies, startwait + timeout*HZ) && - SRpnt->sense[2] == 2 && SRpnt->sense[12] == 0x3a && SRpnt->sense[13] == 0 ) { + SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 0x3a && + SRpnt->sr_sense_buffer[13] == 0 ) { #if DEBUG if (debugging) { printk(OSST_DEB_MSG "%s:D: Sleeping in onstream wait medium\n", name); @@ -768,13 +714,13 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** a #if DEBUG debugging = dbg; #endif - if ( STp->buffer->syscall_result && SRpnt->sense[2] != 2 && - SRpnt->sense[12] != 4 && SRpnt->sense[13] == 1) { + if ( STp->buffer->syscall_result && SRpnt->sr_sense_buffer[2] != 2 && + SRpnt->sr_sense_buffer[12] != 4 && SRpnt->sr_sense_buffer[13] == 1) { #if DEBUG 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, - STp->buffer->syscall_result, SRpnt->sense[0], SRpnt->sense[2], - SRpnt->sense[12], SRpnt->sense[13]); + STp->buffer->syscall_result, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], + SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return 0; } @@ -784,7 +730,7 @@ static int osst_wait_for_medium(struct osst_tape * STp, struct osst_request ** a return 1; } -static int osst_position_tape_and_confirm(struct osst_tape * STp, struct osst_request ** aSRpnt, int frame) +static int osst_position_tape_and_confirm(struct osst_tape * STp, struct scsi_request ** aSRpnt, int frame) { int retval; @@ -798,10 +744,10 @@ static int osst_position_tape_and_confirm(struct osst_tape * STp, struct osst_re /* * Wait for write(s) to complete */ -static int osst_flush_drive_buffer(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_flush_drive_buffer(struct osst_tape * STp, struct scsi_request ** aSRpnt) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int result = 0; int delay = OSST_WAIT_WRITE_COMPLETE; #if DEBUG @@ -818,8 +764,8 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct osst_request * *aSRpnt = SRpnt; if (!SRpnt) return (-EBUSY); if (STp->buffer->syscall_result) { - if ((SRpnt->sense[2] & 0x0f) == 2 && SRpnt->sense[12] == 4) { - if (SRpnt->sense[13] == 8) { + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == 2 && SRpnt->sr_sense_buffer[12] == 4) { + if (SRpnt->sr_sense_buffer[13] == 8) { delay = OSST_WAIT_LONG_WRITE_COMPLETE; } } else @@ -832,7 +778,7 @@ static int osst_flush_drive_buffer(struct osst_tape * STp, struct osst_request * } #define OSST_POLL_PER_SEC 10 -static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int curr, int minlast, int to) +static int osst_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int curr, int minlast, int to) { unsigned long startwait = jiffies; char * name = tape_name(STp); @@ -857,7 +803,7 @@ static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt ) && result >= 0) { #if DEBUG - if (debugging || time_after_eq(jiffies, startwait + 2*HZ/OSST_POLL_PER_SEC)) + if (debugging || jiffies - startwait >= 2*HZ/OSST_POLL_PER_SEC) printk (OSST_DEB_MSG "%s:D: Succ wait f fr %i (>%i): %i-%i %i (%i): %3li.%li s\n", name, curr, curr+minlast, STp->first_frame_position, @@ -868,7 +814,7 @@ static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt return 0; } #if DEBUG - if (time_after_eq(jiffies, startwait + 2*HZ/OSST_POLL_PER_SEC) && notyetprinted) + if (jiffies - startwait >= 2*HZ/OSST_POLL_PER_SEC && notyetprinted) { printk (OSST_DEB_MSG "%s:D: Wait for frame %i (>%i): %i-%i %i (%i)\n", name, curr, curr+minlast, STp->first_frame_position, @@ -887,9 +833,9 @@ static int osst_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt return -EBUSY; } -static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int writing) +static int osst_recover_wait_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int writing) { - struct osst_request * SRpnt; + struct scsi_request * SRpnt; unsigned char cmd[MAX_COMMAND_SIZE]; unsigned long startwait = jiffies; int retval = 1; @@ -910,7 +856,7 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request * while (retval && time_before (jiffies, startwait + 5*60*HZ)) { - if (STp->buffer->syscall_result && (SRpnt->sense[2] & 0x0f) != 2) { + if (STp->buffer->syscall_result && (SRpnt->sr_sense_buffer[2] & 0x0f) != 2) { /* some failure - not just not-ready */ retval = osst_write_error_recovery(STp, aSRpnt, 0); @@ -935,9 +881,9 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request * if (STp->buffer->syscall_result) printk(KERN_WARNING "%s:W: Recover_wait_frame(read) cannot handle %02x:%02x:%02x\n", name, - (*aSRpnt)->sense[ 2] & 0x0f, - (*aSRpnt)->sense[12], - (*aSRpnt)->sense[13]); + (*aSRpnt)->sr_sense_buffer[ 2] & 0x0f, + (*aSRpnt)->sr_sense_buffer[12], + (*aSRpnt)->sr_sense_buffer[13]); return retval; } @@ -945,10 +891,10 @@ static int osst_recover_wait_frame(struct osst_tape * STp, struct osst_request * /* * Read the next OnStream tape frame at the current location */ -static int osst_read_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int timeout) +static int osst_read_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int timeout) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int retval = 0; #if DEBUG os_aux_t * aux = STp->buffer->aux; @@ -986,10 +932,10 @@ static int osst_read_frame(struct osst_tape * STp, struct osst_request ** aSRpnt if (debugging) printk(OSST_DEB_MSG "%s:D: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", name, - SRpnt->sense[0], SRpnt->sense[1], - SRpnt->sense[2], SRpnt->sense[3], - SRpnt->sense[4], SRpnt->sense[5], - SRpnt->sense[6], SRpnt->sense[7]); + SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[1], + SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[3], + SRpnt->sr_sense_buffer[4], SRpnt->sr_sense_buffer[5], + SRpnt->sr_sense_buffer[6], SRpnt->sr_sense_buffer[7]); #endif } else @@ -1016,10 +962,10 @@ static int osst_read_frame(struct osst_tape * STp, struct osst_request ** aSRpnt return (retval); } -static int osst_initiate_read(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_initiate_read(struct osst_tape * STp, struct scsi_request ** aSRpnt) { struct st_partstat * STps = &(STp->ps[STp->partition]); - struct osst_request * SRpnt ; + struct scsi_request * SRpnt ; unsigned char cmd[MAX_COMMAND_SIZE]; int retval = 0; char * name = tape_name(STp); @@ -1053,7 +999,7 @@ static int osst_initiate_read(struct osst_tape * STp, struct osst_request ** aSR return retval; } -static int osst_get_logical_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_get_logical_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int frame_seq_number, int quiet) { struct st_partstat * STps = &(STp->ps[STp->partition]); @@ -1182,7 +1128,7 @@ static int osst_get_logical_frame(struct osst_tape * STp, struct osst_request ** return (STps->eof); } -static int osst_seek_logical_blk(struct osst_tape * STp, struct osst_request ** aSRpnt, int logical_blk_num) +static int osst_seek_logical_blk(struct osst_tape * STp, struct scsi_request ** aSRpnt, int logical_blk_num) { struct st_partstat * STps = &(STp->ps[STp->partition]); char * name = tape_name(STp); @@ -1291,7 +1237,7 @@ error: #define OSST_SECTOR_SHIFT 9 #define OSST_SECTOR_MASK 0x03F -static int osst_get_sector(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_get_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int sector; #if DEBUG @@ -1321,7 +1267,7 @@ static int osst_get_sector(struct osst_tape * STp, struct osst_request ** aSRpnt return sector; } -static int osst_seek_sector(struct osst_tape * STp, struct osst_request ** aSRpnt, int sector) +static int osst_seek_sector(struct osst_tape * STp, struct scsi_request ** aSRpnt, int sector) { struct st_partstat * STps = &(STp->ps[STp->partition]); int frame = sector >> OSST_FRAME_SHIFT, @@ -1384,10 +1330,10 @@ static int osst_seek_sector(struct osst_tape * STp, struct osst_request ** aSRpn * Precondition for this function to work: all frames in the * 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 osst_request ** aSRpnt, +static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned int frame, unsigned int skip, int pending) { - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; unsigned char * buffer, * p; unsigned char cmd[MAX_COMMAND_SIZE]; int flag, new_frame, i; @@ -1531,8 +1477,8 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); - if (SRpnt->sense[2] == 2 && SRpnt->sense[12] == 4 && - (SRpnt->sense[13] == 1 || SRpnt->sense[13] == 8)) { + if (SRpnt->sr_sense_buffer[2] == 2 && SRpnt->sr_sense_buffer[12] == 4 && + (SRpnt->sr_sense_buffer[13] == 1 || SRpnt->sr_sense_buffer[13] == 8)) { /* in the process of becoming ready */ msleep(100); continue; @@ -1549,17 +1495,17 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst } *aSRpnt = SRpnt; if (flag) { - if ((SRpnt->sense[ 2] & 0x0f) == 13 && - SRpnt->sense[12] == 0 && - SRpnt->sense[13] == 2) { + if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && + SRpnt->sr_sense_buffer[12] == 0 && + SRpnt->sr_sense_buffer[13] == 2) { printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name); vfree(buffer); return (-EIO); /* hit end of tape = fail */ } - i = ((SRpnt->sense[3] << 24) | - (SRpnt->sense[4] << 16) | - (SRpnt->sense[5] << 8) | - SRpnt->sense[6] ) - new_frame; + i = ((SRpnt->sr_sense_buffer[3] << 24) | + (SRpnt->sr_sense_buffer[4] << 16) | + (SRpnt->sr_sense_buffer[5] << 8) | + SRpnt->sr_sense_buffer[6] ) - new_frame; p = &buffer[i * OS_DATA_SIZE]; #if DEBUG printk(OSST_DEB_MSG "%s:D: Additional write error at %d\n", name, new_frame+i); @@ -1582,11 +1528,11 @@ static int osst_read_back_buffer_and_rewrite(struct osst_tape * STp, struct osst return 0; } -static int osst_reposition_and_retry(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_reposition_and_retry(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned int frame, unsigned int skip, int pending) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; char * name = tape_name(STp); int expected = 0; int attempts = 1000 / skip; @@ -1638,9 +1584,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct osst_request *aSRpnt = SRpnt; if (STp->buffer->syscall_result) { /* additional write error */ - if ((SRpnt->sense[ 2] & 0x0f) == 13 && - SRpnt->sense[12] == 0 && - SRpnt->sense[13] == 2) { + if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) == 13 && + SRpnt->sr_sense_buffer[12] == 0 && + SRpnt->sr_sense_buffer[13] == 2) { printk(KERN_ERR "%s:E: Volume overflow in write error recovery\n", name); @@ -1685,9 +1631,9 @@ static int osst_reposition_and_retry(struct osst_tape * STp, struct osst_request * Error recovery algorithm for the OnStream tape. */ -static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request ** aSRpnt, int pending) +static int osst_write_error_recovery(struct osst_tape * STp, struct scsi_request ** aSRpnt, int pending) { - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; struct st_partstat * STps = & STp->ps[STp->partition]; char * name = tape_name(STp); int retval = 0; @@ -1696,20 +1642,20 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request rw_state = STps->rw; - if ((SRpnt->sense[ 2] & 0x0f) != 3 - || SRpnt->sense[12] != 12 - || SRpnt->sense[13] != 0) { + if ((SRpnt->sr_sense_buffer[ 2] & 0x0f) != 3 + || SRpnt->sr_sense_buffer[12] != 12 + || SRpnt->sr_sense_buffer[13] != 0) { #if DEBUG printk(OSST_DEB_MSG "%s:D: Write error recovery cannot handle %02x:%02x:%02x\n", name, - SRpnt->sense[2], SRpnt->sense[12], SRpnt->sense[13]); + SRpnt->sr_sense_buffer[2], SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif return (-EIO); } - frame = (SRpnt->sense[3] << 24) | - (SRpnt->sense[4] << 16) | - (SRpnt->sense[5] << 8) | - SRpnt->sense[6]; - skip = SRpnt->sense[9]; + frame = (SRpnt->sr_sense_buffer[3] << 24) | + (SRpnt->sr_sense_buffer[4] << 16) | + (SRpnt->sr_sense_buffer[5] << 8) | + SRpnt->sr_sense_buffer[6]; + skip = SRpnt->sr_sense_buffer[9]; #if DEBUG printk(OSST_DEB_MSG "%s:D: Detected physical bad frame at %u, advised to skip %d\n", name, frame, skip); @@ -1764,7 +1710,7 @@ static int osst_write_error_recovery(struct osst_tape * STp, struct osst_request return retval; } -static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_space_over_filemarks_backward(struct osst_tape * STp, struct scsi_request ** aSRpnt, int mt_op, int mt_count) { char * name = tape_name(STp); @@ -1863,7 +1809,7 @@ found: * * Just scans for the filemark sequentially. */ -static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct scsi_request ** aSRpnt, int mt_op, int mt_count) { int cnt = 0; @@ -1917,7 +1863,7 @@ static int osst_space_over_filemarks_forward_slow(struct osst_tape * STp, struct /* * Fast linux specific version of OnStream FSF */ -static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct scsi_request ** aSRpnt, int mt_op, int mt_count) { char * name = tape_name(STp); @@ -2068,10 +2014,10 @@ static int osst_space_over_filemarks_forward_fast(struct osst_tape * STp, struct * to test the error recovery mechanism. */ #if DEBUG -static void osst_set_retries(struct osst_tape * STp, struct osst_request ** aSRpnt, int retries) +static void osst_set_retries(struct osst_tape * STp, struct scsi_request ** aSRpnt, int retries) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; char * name = tape_name(STp); memset(cmd, 0, MAX_COMMAND_SIZE); @@ -2100,7 +2046,7 @@ static void osst_set_retries(struct osst_tape * STp, struct osst_request ** aSRp #endif -static int osst_write_filemark(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_write_filemark(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int result; int this_mark_ppos = STp->first_frame_position; @@ -2128,7 +2074,7 @@ static int osst_write_filemark(struct osst_tape * STp, struct osst_request ** aS return result; } -static int osst_write_eod(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_write_eod(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int result; #if DEBUG @@ -2151,7 +2097,7 @@ static int osst_write_eod(struct osst_tape * STp, struct osst_request ** aSRpnt) return result; } -static int osst_write_filler(struct osst_tape * STp, struct osst_request ** aSRpnt, int where, int count) +static int osst_write_filler(struct osst_tape * STp, struct scsi_request ** aSRpnt, int where, int count) { char * name = tape_name(STp); @@ -2176,7 +2122,7 @@ static int osst_write_filler(struct osst_tape * STp, struct osst_request ** aSRp return osst_flush_drive_buffer(STp, aSRpnt); } -static int __osst_write_header(struct osst_tape * STp, struct osst_request ** aSRpnt, int where, int count) +static int __osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRpnt, int where, int count) { char * name = tape_name(STp); int result; @@ -2203,7 +2149,7 @@ static int __osst_write_header(struct osst_tape * STp, struct osst_request ** aS return result; } -static int osst_write_header(struct osst_tape * STp, struct osst_request ** aSRpnt, int locate_eod) +static int osst_write_header(struct osst_tape * STp, struct scsi_request ** aSRpnt, int locate_eod) { os_header_t * header; int result; @@ -2277,7 +2223,7 @@ static int osst_write_header(struct osst_tape * STp, struct osst_request ** aSRp return result; } -static int osst_reset_header(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_reset_header(struct osst_tape * STp, struct scsi_request ** aSRpnt) { if (STp->header_cache != NULL) memset(STp->header_cache, 0, sizeof(os_header_t)); @@ -2290,7 +2236,7 @@ static int osst_reset_header(struct osst_tape * STp, struct osst_request ** aSRp return osst_write_header(STp, aSRpnt, 1); } -static int __osst_analyze_headers(struct osst_tape * STp, struct osst_request ** aSRpnt, int ppos) +static int __osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** aSRpnt, int ppos) { char * name = tape_name(STp); os_header_t * header; @@ -2467,7 +2413,7 @@ static int __osst_analyze_headers(struct osst_tape * STp, struct osst_request ** return 1; } -static int osst_analyze_headers(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_analyze_headers(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int position, ppos; int first, last; @@ -2522,7 +2468,7 @@ static int osst_analyze_headers(struct osst_tape * STp, struct osst_request ** a return 1; } -static int osst_verify_position(struct osst_tape * STp, struct osst_request ** aSRpnt) +static int osst_verify_position(struct osst_tape * STp, struct scsi_request ** aSRpnt) { int frame_position = STp->first_frame_position; int frame_seq_numbr = STp->frame_seq_number; @@ -2598,11 +2544,11 @@ static unsigned int osst_parse_firmware_rev (const char * str) /* * Configure the OnStream SCII tape drive for default operation */ -static int osst_configure_onstream(struct osst_tape *STp, struct osst_request ** aSRpnt) +static int osst_configure_onstream(struct osst_tape *STp, struct scsi_request ** aSRpnt) { unsigned char cmd[MAX_COMMAND_SIZE]; char * name = tape_name(STp); - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; osst_mode_parameter_header_t * header; osst_block_size_page_t * bs; osst_capabilities_page_t * cp; @@ -2769,7 +2715,7 @@ static int osst_configure_onstream(struct osst_tape *STp, struct osst_request ** /* Step over EOF if it has been inadvertently crossed (ioctl not used because it messes up the block number). */ -static int cross_eof(struct osst_tape *STp, struct osst_request ** aSRpnt, int forward) +static int cross_eof(struct osst_tape *STp, struct scsi_request ** aSRpnt, int forward) { int result; char * name = tape_name(STp); @@ -2798,10 +2744,10 @@ static int cross_eof(struct osst_tape *STp, struct osst_request ** aSRpnt, int f /* Get the tape position. */ -static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt) +static int osst_get_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt) { unsigned char scmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int result = 0; char * name = tape_name(STp); @@ -2826,14 +2772,14 @@ static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** *aSRpnt = SRpnt; if (STp->buffer->syscall_result) - result = ((SRpnt->sense[2] & 0x0f) == 3) ? -EIO : -EINVAL; /* 3: Write Error */ + result = ((SRpnt->sr_sense_buffer[2] & 0x0f) == 3) ? -EIO : -EINVAL; /* 3: Write Error */ if (result == -EINVAL) printk(KERN_ERR "%s:E: Can't read tape position.\n", name); else { if (result == -EIO) { /* re-read position - this needs to preserve media errors */ unsigned char mysense[16]; - memcpy (mysense, SRpnt->sense, 16); + memcpy (mysense, SRpnt->sr_sense_buffer, 16); memset (scmd, 0, MAX_COMMAND_SIZE); scmd[0] = READ_POSITION; STp->buffer->b_data = mybuf; STp->buffer->buffer_size = 24; @@ -2842,10 +2788,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** #if DEBUG 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:", - SRpnt->sense[2],SRpnt->sense[12],SRpnt->sense[13]); + SRpnt->sr_sense_buffer[2],SRpnt->sr_sense_buffer[12],SRpnt->sr_sense_buffer[13]); #endif if (!STp->buffer->syscall_result) - memcpy (SRpnt->sense, mysense, 16); + memcpy (SRpnt->sr_sense_buffer, mysense, 16); else printk(KERN_WARNING "%s:W: Double error in get position\n", name); } @@ -2882,10 +2828,10 @@ static int osst_get_frame_position(struct osst_tape *STp, struct osst_request ** /* Set the tape block */ -static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** aSRpnt, int ppos, int skip) +static int osst_set_frame_position(struct osst_tape *STp, struct scsi_request ** aSRpnt, int ppos, int skip) { unsigned char scmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; struct st_partstat * STps; int result = 0; int pp = (ppos == 3000 && !skip)? 0 : ppos; @@ -2940,7 +2886,7 @@ static int osst_set_frame_position(struct osst_tape *STp, struct osst_request ** return result; } -static int osst_write_trailer(struct osst_tape *STp, struct osst_request ** aSRpnt, int leave_at_EOT) +static int osst_write_trailer(struct osst_tape *STp, struct scsi_request ** aSRpnt, int leave_at_EOT) { struct st_partstat * STps = &(STp->ps[STp->partition]); int result = 0; @@ -2967,12 +2913,12 @@ out: /* osst versions of st functions - augmented and stripped to suit OnStream only */ /* Flush the write buffer (never need to write if variable blocksize). */ -static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** aSRpnt) +static int osst_flush_write_buffer(struct osst_tape *STp, struct scsi_request ** aSRpnt) { int offset, transfer, blks = 0; int result = 0; unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = *aSRpnt; + struct scsi_request * SRpnt = *aSRpnt; struct st_partstat * STps; char * name = tape_name(STp); @@ -2980,13 +2926,13 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** if (SRpnt == (STp->buffer)->last_SRpnt) #if DEBUG { printk(OSST_DEB_MSG - "%s:D: aSRpnt points to osst_request that write_behind_check will release -- cleared\n", name); + "%s:D: aSRpnt points to scsi_request that write_behind_check will release -- cleared\n", name); #endif *aSRpnt = SRpnt = NULL; #if DEBUG } else if (SRpnt) printk(OSST_DEB_MSG - "%s:D: aSRpnt does not point to osst_request that write_behind_check will release -- strange\n", name); + "%s:D: aSRpnt does not point to scsi_request that write_behind_check will release -- strange\n", name); #endif osst_write_behind_check(STp); if ((STp->buffer)->syscall_result) { @@ -3064,12 +3010,12 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** #if DEBUG printk(OSST_DEB_MSG "%s:D: write sense [0]=0x%02x [2]=%02x [12]=%02x [13]=%02x\n", - name, SRpnt->sense[0], SRpnt->sense[2], - SRpnt->sense[12], SRpnt->sense[13]); + name, SRpnt->sr_sense_buffer[0], SRpnt->sr_sense_buffer[2], + SRpnt->sr_sense_buffer[12], SRpnt->sr_sense_buffer[13]); #endif - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x40) && /* FIXME - SC-30 drive doesn't assert EOM bit */ - (SRpnt->sense[2] & 0x0f) == NO_SENSE) { + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x40) && /* FIXME - SC-30 drive doesn't assert EOM bit */ + (SRpnt->sr_sense_buffer[2] & 0x0f) == NO_SENSE) { STp->dirty = 0; (STp->buffer)->buffer_bytes = 0; result = (-ENOSPC); @@ -3097,7 +3043,7 @@ static int osst_flush_write_buffer(struct osst_tape *STp, struct osst_request ** /* Flush the tape buffer. The tape will be positioned correctly unless seek_next is true. */ -static int osst_flush_buffer(struct osst_tape * STp, struct osst_request ** aSRpnt, int seek_next) +static int osst_flush_buffer(struct osst_tape * STp, struct scsi_request ** aSRpnt, int seek_next) { struct st_partstat * STps; int backspace = 0, result = 0; @@ -3159,10 +3105,10 @@ static int osst_flush_buffer(struct osst_tape * STp, struct osst_request ** aSRp return result; } -static int osst_write_frame(struct osst_tape * STp, struct osst_request ** aSRpnt, int synchronous) +static int osst_write_frame(struct osst_tape * STp, struct scsi_request ** aSRpnt, int synchronous) { unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt; + struct scsi_request * SRpnt; int blks; #if DEBUG char * name = tape_name(STp); @@ -3223,9 +3169,9 @@ static int osst_write_frame(struct osst_tape * STp, struct osst_request ** aSRpn if (debugging) printk(OSST_DEB_MSG "%s:D: Error on write:\n", name); #endif - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x40)) { - if ((SRpnt->sense[2] & 0x0f) == VOLUME_OVERFLOW) + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x40)) { + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == VOLUME_OVERFLOW) return (-ENOSPC); } else { @@ -3242,7 +3188,7 @@ static int osst_write_frame(struct osst_tape * STp, struct osst_request ** aSRpn return 0; } -/* Lock or unlock the drive door. Don't use when struct osst_request allocated. */ +/* Lock or unlock the drive door. Don't use when struct scsi_request allocated. */ static int do_door_lock(struct osst_tape * STp, int do_lock) { int retval, cmd; @@ -3290,7 +3236,7 @@ static ssize_t osst_write(struct file * filp, const char __user * buf, size_t co int write_threshold; int doing_write = 0; const char __user * b_point; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct st_modedef * STm; struct st_partstat * STps; struct osst_tape * STp = filp->private_data; @@ -3481,7 +3427,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name #if DEBUG if (debugging) printk(OSST_DEB_MSG "%s:D: Writing %d bytes to file %d block %d lblk %d fseq %d fppos %d\n", - name, (int) count, STps->drv_file, STps->drv_block, + name, count, STps->drv_file, STps->drv_block, STp->logical_blk_num, STp->frame_seq_number, STp->first_frame_position); #endif b_point = buf; @@ -3517,7 +3463,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name #if DEBUG if (debugging) printk(OSST_DEB_MSG "%s:D: EOM with %d bytes unwritten.\n", - name, (int) transfer); + name, transfer); #endif } else { @@ -3535,7 +3481,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name if (retval < 0) { if (SRpnt != NULL) { - osst_release_request(SRpnt); + scsi_release_request(SRpnt); SRpnt = NULL; } STp->buffer->buffer_bytes = 0; @@ -3597,7 +3543,7 @@ if (SRpnt) printk(KERN_ERR "%s:A: Not supposed to have SRpnt at line %d\n", name retval = total; out: - if (SRpnt != NULL) osst_release_request(SRpnt); + if (SRpnt != NULL) scsi_release_request(SRpnt); up(&STp->lock); @@ -3613,7 +3559,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo int special; struct st_modedef * STm; struct st_partstat * STps; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct osst_tape * STp = filp->private_data; char * name = tape_name(STp); @@ -3721,7 +3667,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo #if DEBUG if (debugging && STps->eof != ST_NOEOF) printk(OSST_DEB_MSG "%s:D: EOF up (%d). Left %d, needed %d.\n", name, - STps->eof, (STp->buffer)->buffer_bytes, (int) (count - total)); + STps->eof, (STp->buffer)->buffer_bytes, count - total); #endif /* force multiple of block size, note block_size may have been adjusted */ transfer = (((STp->buffer)->buffer_bytes < count - total ? @@ -3782,7 +3728,7 @@ static ssize_t osst_read(struct file * filp, char __user * buf, size_t count, lo retval = total; out: - if (SRpnt != NULL) osst_release_request(SRpnt); + if (SRpnt != NULL) scsi_release_request(SRpnt); up(&STp->lock); @@ -3970,7 +3916,7 @@ static int osst_set_options(struct osst_tape *STp, long options) /* Internal ioctl function */ -static int osst_int_ioctl(struct osst_tape * STp, struct osst_request ** aSRpnt, +static int osst_int_ioctl(struct osst_tape * STp, struct scsi_request ** aSRpnt, unsigned int cmd_in, unsigned long arg) { int timeout; @@ -3978,7 +3924,7 @@ static int osst_int_ioctl(struct osst_tape * STp, struct osst_request ** aSRpnt, int i, ioctl_result; int chg_eof = 1; unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = * aSRpnt; + struct scsi_request * SRpnt = * aSRpnt; struct st_partstat * STps; int fileno, blkno, at_sm, frame_seq_numbr, logical_blk_num; int datalen = 0, direction = DMA_NONE; @@ -4336,14 +4282,14 @@ os_bypass: } else if (cmd_in == MTERASE) { STp->header_ok = 0; } else if (SRpnt) { /* SCSI command was not completely successful. */ - if (SRpnt->sense[2] & 0x40) { + if (SRpnt->sr_sense_buffer[2] & 0x40) { STps->eof = ST_EOM_OK; STps->drv_block = 0; } if (chg_eof) STps->eof = ST_NOEOF; - if ((SRpnt->sense[2] & 0x0f) == BLANK_CHECK) + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == BLANK_CHECK) STps->eof = ST_EOD; if (cmd_in == MTLOAD && osst_wait_for_medium(STp, &SRpnt, 60)) @@ -4361,7 +4307,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) unsigned short flags; int i, b_size, new_session = 0, retval = 0; unsigned char cmd[MAX_COMMAND_SIZE]; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct osst_tape * STp; struct st_modedef * STm; struct st_partstat * STps; @@ -4469,17 +4415,17 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) retval = (STp->buffer)->syscall_result; /* FIXME - valid? */ goto err_out; } - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x0f) == NOT_READY && - SRpnt->sense[12] == 4 ) { + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY && + SRpnt->sr_sense_buffer[12] == 4 ) { #if DEBUG - printk(OSST_DEB_MSG "%s:D: Unit not ready, cause %x\n", name, SRpnt->sense[13]); + printk(OSST_DEB_MSG "%s:D: Unit not ready, cause %x\n", name, SRpnt->sr_sense_buffer[13]); #endif if (filp->f_flags & O_NONBLOCK) { retval = -EAGAIN; goto err_out; } - if (SRpnt->sense[13] == 2) { /* initialize command required (LOAD) */ + if (SRpnt->sr_sense_buffer[13] == 2) { /* initialize command required (LOAD) */ memset (cmd, 0, MAX_COMMAND_SIZE); cmd[0] = START_STOP; cmd[1] = 1; @@ -4487,10 +4433,10 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); } - osst_wait_ready(STp, &SRpnt, (SRpnt->sense[13]==1?15:3) * 60, 0); + osst_wait_ready(STp, &SRpnt, (SRpnt->sr_sense_buffer[13]==1?15:3) * 60, 0); } - if ((SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */ + if ((SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { /* New media? */ #if DEBUG printk(OSST_DEB_MSG "%s:D: Unit wants attention\n", name); #endif @@ -4503,8 +4449,8 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); - if ((SRpnt->sense[0] & 0x70) != 0x70 || - (SRpnt->sense[2] & 0x0f) != UNIT_ATTENTION) + if ((SRpnt->sr_sense_buffer[0] & 0x70) != 0x70 || + (SRpnt->sr_sense_buffer[2] & 0x0f) != UNIT_ATTENTION) break; } @@ -4530,7 +4476,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) * open without reconfiguring and re-reading the headers */ if (!STp->buffer->syscall_result && STp->header_ok && - !SRpnt->result && SRpnt->sense[0] == 0) { + !SRpnt->sr_result && SRpnt->sr_sense_buffer[0] == 0) { memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = MODE_SENSE; @@ -4569,7 +4515,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) } STp->buffer->buffer_blocks = OS_DATA_SIZE / STp->block_size; STp->fast_open = 1; - osst_release_request(SRpnt); + scsi_release_request(SRpnt); return 0; } #if DEBUG @@ -4582,7 +4528,7 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) STp->fast_open = 0; if ((STp->buffer)->syscall_result != 0 && /* in all error conditions except no medium */ - (SRpnt->sense[2] != 2 || SRpnt->sense[12] != 0x3A) ) { + (SRpnt->sr_sense_buffer[2] != 2 || SRpnt->sr_sense_buffer[12] != 0x3A) ) { memset(cmd, 0, MAX_COMMAND_SIZE); cmd[0] = MODE_SELECT; @@ -4612,11 +4558,11 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) SRpnt = osst_do_scsi(SRpnt, STp, cmd, 0, DMA_NONE, STp->timeout, MAX_RETRIES, 1); - if ((SRpnt->sense[0] & 0x70) != 0x70 || - (SRpnt->sense[2] & 0x0f) == NOT_READY) + if ((SRpnt->sr_sense_buffer[0] & 0x70) != 0x70 || + (SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY) break; - if ((SRpnt->sense[2] & 0x0f) == UNIT_ATTENTION) { + if ((SRpnt->sr_sense_buffer[2] & 0x0f) == UNIT_ATTENTION) { STp->pos_unknown = 0; STp->partition = STp->new_partition = 0; if (STp->can_partitions) @@ -4640,13 +4586,13 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) if ((STp->buffer)->syscall_result != 0) { if ((STp->device)->scsi_level >= SCSI_2 && - (SRpnt->sense[0] & 0x70) == 0x70 && - (SRpnt->sense[2] & 0x0f) == NOT_READY && - SRpnt->sense[12] == 0x3a) { /* Check ASC */ + (SRpnt->sr_sense_buffer[0] & 0x70) == 0x70 && + (SRpnt->sr_sense_buffer[2] & 0x0f) == NOT_READY && + SRpnt->sr_sense_buffer[12] == 0x3a) { /* Check ASC */ STp->ready = ST_NO_TAPE; } else STp->ready = ST_NOT_READY; - osst_release_request(SRpnt); + scsi_release_request(SRpnt); SRpnt = NULL; STp->density = 0; /* Clear the erroneous "residue" */ STp->write_prot = 0; @@ -4706,14 +4652,14 @@ static int os_scsi_tape_open(struct inode * inode, struct file * filp) osst_analyze_headers(STp, &SRpnt); - osst_release_request(SRpnt); + scsi_release_request(SRpnt); SRpnt = NULL; return 0; err_out: if (SRpnt != NULL) - osst_release_request(SRpnt); + scsi_release_request(SRpnt); normalize_buffer(STp->buffer); STp->header_ok = 0; STp->in_use = 0; @@ -4724,13 +4670,13 @@ err_out: /* Flush the tape buffer before close */ -static int os_scsi_tape_flush(struct file * filp, fl_owner_t id) +static int os_scsi_tape_flush(struct file * filp) { int result = 0, result2; struct osst_tape * STp = filp->private_data; struct st_modedef * STm = &(STp->modes[STp->current_mode]); struct st_partstat * STps = &(STp->ps[STp->partition]); - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; char * name = tape_name(STp); if (file_count(filp) > 1) @@ -4793,7 +4739,7 @@ out: if (result == 0 && result2 < 0) result = result2; } - if (SRpnt) osst_release_request(SRpnt); + if (SRpnt) scsi_release_request(SRpnt); if (STp->abort_count || STp->recover_count) { printk(KERN_INFO "%s:I:", name); @@ -4847,7 +4793,7 @@ static int osst_ioctl(struct inode * inode,struct file * file, unsigned int blk; struct st_modedef * STm; struct st_partstat * STps; - struct osst_request * SRpnt = NULL; + struct scsi_request * SRpnt = NULL; struct osst_tape * STp = file->private_data; char * name = tape_name(STp); void __user * p = (void __user *)arg; @@ -5161,14 +5107,14 @@ static int osst_ioctl(struct inode * inode,struct file * file, retval = -EFAULT; goto out; } - if (SRpnt) osst_release_request(SRpnt); + if (SRpnt) scsi_release_request(SRpnt); up(&STp->lock); return scsi_ioctl(STp->device, cmd_in, p); out: - if (SRpnt) osst_release_request(SRpnt); + if (SRpnt) scsi_release_request(SRpnt); up(&STp->lock); @@ -5492,7 +5438,7 @@ static int __init osst_setup (char *str) char *stp; stp = get_options(str, ARRAY_SIZE(ints), ints); - + if (ints[0] > 0) { for (i = 0; i < ints[0] && i < ARRAY_SIZE(parms); i++) *parms[i].val = ints[i + 1]; @@ -5507,7 +5453,7 @@ static int __init osst_setup (char *str) break; } } - if (i >= ARRAY_SIZE(parms)) + if (i >= sizeof(parms) / sizeof(struct osst_dev_parm)) printk(KERN_INFO "osst :I: Illegal parameter in '%s'\n", stp); stp = strchr(stp, ','); @@ -5721,7 +5667,7 @@ static int osst_probe(struct device *dev) struct st_partstat * STps; struct osst_buffer * buffer; struct gendisk * drive; - int i, dev_num; + int i, mode, dev_num; if (SDp->type != TYPE_TAPE || !osst_supports(SDp)) return -ENODEV; @@ -5857,6 +5803,18 @@ static int osst_probe(struct device *dev) snprintf(name, 8, "%s%s", "n", tape_name(tpnt)); osst_sysfs_add(MKDEV(OSST_MAJOR, dev_num + 128), dev, tpnt, name); } + for (mode = 0; mode < ST_NBR_MODES; ++mode) { + /* Rewind entry */ + devfs_mk_cdev(MKDEV(OSST_MAJOR, dev_num + (mode << 5)), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/ot%s", SDp->devfs_name, osst_formats[mode]); + + /* No-rewind entry */ + devfs_mk_cdev(MKDEV(OSST_MAJOR, dev_num + (mode << 5) + 128), + S_IFCHR | S_IRUGO | S_IWUGO, + "%s/ot%sn", SDp->devfs_name, osst_formats[mode]); + } + drive->number = devfs_register_tape(SDp->devfs_name); sdev_printk(KERN_INFO, SDp, "osst :I: Attached OnStream %.5s tape as %s\n", @@ -5873,7 +5831,7 @@ static int osst_remove(struct device *dev) { struct scsi_device * SDp = to_scsi_device(dev); struct osst_tape * tpnt; - int i; + int i, mode; if ((SDp->type != TYPE_TAPE) || (osst_nr_dev <= 0)) return 0; @@ -5884,6 +5842,11 @@ static int osst_remove(struct device *dev) osst_sysfs_destroy(MKDEV(OSST_MAJOR, i)); osst_sysfs_destroy(MKDEV(OSST_MAJOR, i+128)); tpnt->device = NULL; + for (mode = 0; mode < ST_NBR_MODES; ++mode) { + devfs_remove("%s/ot%s", SDp->devfs_name, osst_formats[mode]); + devfs_remove("%s/ot%sn", SDp->devfs_name, osst_formats[mode]); + } + devfs_unregister_tape(tpnt->drive->number); put_disk(tpnt->drive); os_scsi_tapes[i] = NULL; osst_nr_dev--;