2 SCSI Tape Driver for Linux version 1.1 and newer. See the accompanying
3 file README.st for more information.
6 Rewritten from Dwayne Forsyth's SCSI tape driver by Kai Makisara.
7 Contribution and ideas from several people including (in alphabetical
8 order) Klaus Ehrenfried, Wolfgang Denk, Steve Hirsch, Andreas Koppenh"ofer,
9 Michael Leodolter, Eyal Lebedinsky, J"org Weule, and Eric Youngdale.
11 Copyright 1992 - 1997 Kai Makisara
12 email Kai.Makisara@metla.fi
14 Last modified: Wed Nov 5 23:39:52 1997 by makisara@home
15 Some small formal changes - aeb, 950809
18 #include <linux/module.h>
21 #include <linux/kernel.h>
22 #include <linux/sched.h>
24 #include <linux/init.h>
25 #include <linux/string.h>
26 #include <linux/errno.h>
27 #include <linux/mtio.h>
28 #include <linux/ioctl.h>
29 #include <linux/fcntl.h>
30 #include <asm/uaccess.h>
32 #include <asm/system.h>
33 #include <asm/spinlock.h>
35 /* The driver prints some debugging information on the console if DEBUG
36 is defined and non-zero. */
39 /* The message level for the debug messages is currently set to KERN_NOTICE
40 so that people can easily see the messages. Later when the debugging messages
41 in the drivers are more widely classified, this may be changed to KERN_DEBUG. */
42 #define ST_DEB_MSG KERN_NOTICE
44 #define MAJOR_NR SCSI_TAPE_MAJOR
45 #include <linux/blk.h>
49 #include <scsi/scsi_ioctl.h>
51 #include "constants.h"
54 MODULE_PARM(buffer_kbs
, "i");
55 MODULE_PARM(write_threshold_kbs
, "i");
56 MODULE_PARM(max_buffers
, "i");
57 static int buffer_kbs
= 0;
58 static int write_threshold_kbs
= 0;
59 static int max_buffers
= 0;
62 /* The default definitions have been moved to st_options.h */
64 #define ST_KILOBYTE 1024
66 #include "st_options.h"
68 #define ST_BUFFER_SIZE (ST_BUFFER_BLOCKS * ST_KILOBYTE)
69 #define ST_WRITE_THRESHOLD (ST_WRITE_THRESHOLD_BLOCKS * ST_KILOBYTE)
71 /* The buffer size should fit into the 24 bits for length in the
72 6-byte SCSI read and write commands. */
73 #if ST_BUFFER_SIZE >= (2 << 24 - 1)
74 #error "Buffer size should not exceed (2 << 24 - 1) bytes!"
78 static int debugging
= 1;
82 #define MAX_WRITE_RETRIES 0
83 #define MAX_READY_RETRIES 5
84 #define NO_TAPE NOT_READY
86 #define ST_TIMEOUT (900 * HZ)
87 #define ST_LONG_TIMEOUT (14000 * HZ)
89 #define TAPE_NR(x) (MINOR(x) & ~(128 | ST_MODE_MASK))
90 #define TAPE_MODE(x) ((MINOR(x) & ST_MODE_MASK) >> ST_MODE_SHIFT)
92 /* Internal ioctl to set both density (uppermost 8 bits) and blocksize (lower
94 #define SET_DENS_AND_BLK 0x10001
96 static int st_nbr_buffers
;
97 static ST_buffer
**st_buffers
;
98 static int st_buffer_size
= ST_BUFFER_SIZE
;
99 static int st_write_threshold
= ST_WRITE_THRESHOLD
;
100 static int st_max_buffers
= ST_MAX_BUFFERS
;
102 static Scsi_Tape
* scsi_tapes
= NULL
;
104 static int modes_defined
= FALSE
;
106 static ST_buffer
*new_tape_buffer(int, int);
107 static int enlarge_buffer(ST_buffer
*, int, int);
108 static void normalize_buffer(ST_buffer
*);
110 static int st_init(void);
111 static int st_attach(Scsi_Device
*);
112 static int st_detect(Scsi_Device
*);
113 static void st_detach(Scsi_Device
*);
115 struct Scsi_Device_Template st_template
= {NULL
, "tape", "st", NULL
, TYPE_TAPE
,
116 SCSI_TAPE_MAJOR
, 0, 0, 0, 0,
118 NULL
, st_attach
, st_detach
};
120 static int st_compression(Scsi_Tape
*, int);
122 static int find_partition(struct inode
*);
123 static int update_partition(struct inode
*);
125 static int st_int_ioctl(struct inode
* inode
, unsigned int cmd_in
,
131 /* Convert the result to success code */
133 st_chk_result(Scsi_Cmnd
* SCpnt
)
135 int dev
= TAPE_NR(SCpnt
->request
.rq_dev
);
136 int result
= SCpnt
->result
;
137 unsigned char * sense
= SCpnt
->sense_buffer
, scode
;
142 if (!result
/* && SCpnt->sense_buffer[0] == 0 */ )
145 scode
= sense
[2] & 0x0f;
149 printk(ST_DEB_MSG
"st%d: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n",
151 SCpnt
->data_cmnd
[0], SCpnt
->data_cmnd
[1], SCpnt
->data_cmnd
[2],
152 SCpnt
->data_cmnd
[3], SCpnt
->data_cmnd
[4], SCpnt
->data_cmnd
[5],
153 SCpnt
->request_bufflen
);
154 if (driver_byte(result
) & DRIVER_SENSE
)
155 print_sense("st", SCpnt
);
161 if (!(driver_byte(result
) & DRIVER_SENSE
) ||
162 ((sense
[0] & 0x70) == 0x70 &&
164 scode
!= RECOVERED_ERROR
&&
165 /* scode != UNIT_ATTENTION && */
166 scode
!= BLANK_CHECK
&&
167 scode
!= VOLUME_OVERFLOW
&&
168 SCpnt
->data_cmnd
[0] != MODE_SENSE
&&
169 SCpnt
->data_cmnd
[0] != TEST_UNIT_READY
)) { /* Abnormal conditions for tape */
170 if (driver_byte(result
) & DRIVER_SENSE
) {
171 printk(KERN_WARNING
"st%d: Error with sense data: ", dev
);
172 print_sense("st", SCpnt
);
175 printk(KERN_WARNING
"st%d: Error %x.\n", dev
, result
);
178 if ((sense
[0] & 0x70) == 0x70 &&
179 scode
== RECOVERED_ERROR
180 #if ST_RECOVERED_WRITE_FATAL
181 && SCpnt
->data_cmnd
[0] != WRITE_6
182 && SCpnt
->data_cmnd
[0] != WRITE_FILEMARKS
185 scsi_tapes
[dev
].recover_count
++;
186 scsi_tapes
[dev
].mt_status
->mt_erreg
+= (1 << MT_ST_SOFTERR_SHIFT
);
189 if (SCpnt
->data_cmnd
[0] == READ_6
)
191 else if (SCpnt
->data_cmnd
[0] == WRITE_6
)
195 printk(ST_DEB_MSG
"st%d: Recovered %s error (%d).\n", dev
, stp
,
196 scsi_tapes
[dev
].recover_count
);
199 if ((sense
[2] & 0xe0) == 0)
206 /* Wakeup from interrupt */
208 st_sleep_done (Scsi_Cmnd
* SCpnt
)
214 if ((st_nbr
= TAPE_NR(SCpnt
->request
.rq_dev
)) < st_template
.nr_dev
) {
215 STp
= &(scsi_tapes
[st_nbr
]);
216 if ((STp
->buffer
)->writing
&&
217 (SCpnt
->sense_buffer
[0] & 0x70) == 0x70 &&
218 (SCpnt
->sense_buffer
[2] & 0x40)) {
219 /* EOM at write-behind, has all been written? */
220 if ((SCpnt
->sense_buffer
[0] & 0x80) != 0)
221 remainder
= (SCpnt
->sense_buffer
[3] << 24) |
222 (SCpnt
->sense_buffer
[4] << 16) |
223 (SCpnt
->sense_buffer
[5] << 8) | SCpnt
->sense_buffer
[6];
226 if ((SCpnt
->sense_buffer
[2] & 0x0f) == VOLUME_OVERFLOW
||
228 (STp
->buffer
)->last_result
= SCpnt
->result
; /* Error */
230 (STp
->buffer
)->last_result
= INT_MAX
; /* OK */
233 (STp
->buffer
)->last_result
= SCpnt
->result
;
234 SCpnt
->request
.rq_status
= RQ_SCSI_DONE
;
235 (STp
->buffer
)->last_SCpnt
= SCpnt
;
238 STp
->write_pending
= 0;
240 up(SCpnt
->request
.sem
);
244 printk(KERN_ERR
"st?: Illegal interrupt device %x\n", st_nbr
);
249 /* Do the scsi command */
251 st_do_scsi(Scsi_Cmnd
*SCpnt
, Scsi_Tape
*STp
, unsigned char *cmd
, int bytes
,
252 int timeout
, int retries
)
256 spin_lock_irqsave(&io_request_lock
, flags
);
258 if ((SCpnt
= scsi_allocate_device(NULL
, STp
->device
, 1)) == NULL
) {
259 printk(KERN_ERR
"st%d: Can't get SCSI request.\n", TAPE_NR(STp
->devt
));
263 cmd
[1] |= (SCpnt
->lun
<< 5) & 0xe0;
264 STp
->sem
= MUTEX_LOCKED
;
265 SCpnt
->request
.sem
= &(STp
->sem
);
266 SCpnt
->request
.rq_status
= RQ_SCSI_BUSY
;
267 SCpnt
->request
.rq_dev
= STp
->devt
;
269 scsi_do_cmd(SCpnt
, (void *)cmd
, (STp
->buffer
)->b_data
, bytes
,
270 st_sleep_done
, timeout
, retries
);
271 spin_unlock_irqrestore(&io_request_lock
, flags
);
273 down(SCpnt
->request
.sem
);
275 (STp
->buffer
)->last_result_fatal
= st_chk_result(SCpnt
);
281 /* Handle the write-behind checking */
283 write_behind_check(Scsi_Tape
*STp
)
285 ST_buffer
* STbuffer
;
288 STbuffer
= STp
->buffer
;
291 if (STp
->write_pending
)
299 (STp
->buffer
)->last_result_fatal
= st_chk_result((STp
->buffer
)->last_SCpnt
);
300 scsi_release_command((STp
->buffer
)->last_SCpnt
);
302 if (STbuffer
->writing
< STbuffer
->buffer_bytes
)
303 memcpy(STbuffer
->b_data
,
304 STbuffer
->b_data
+ STbuffer
->writing
,
305 STbuffer
->buffer_bytes
- STbuffer
->writing
);
306 STbuffer
->buffer_bytes
-= STbuffer
->writing
;
307 STps
= &(STp
->ps
[STp
->partition
]);
308 if (STps
->drv_block
>= 0) {
309 if (STp
->block_size
== 0)
312 STps
->drv_block
+= STbuffer
->writing
/ STp
->block_size
;
314 STbuffer
->writing
= 0;
320 /* Step over EOF if it has been inadvertently crossed (ioctl not used because
321 it messes up the block number). */
323 cross_eof(Scsi_Tape
*STp
, int forward
)
326 unsigned char cmd
[10];
329 cmd
[1] = 0x01; /* Space FileMarks */
335 cmd
[2] = cmd
[3] = cmd
[4] = 0xff; /* -1 filemarks */
339 printk(ST_DEB_MSG
"st%d: Stepping over filemark %s.\n",
340 TAPE_NR(STp
->devt
), forward
? "forward" : "backward");
343 SCpnt
= st_do_scsi(NULL
, STp
, cmd
, 0, STp
->timeout
, MAX_RETRIES
);
347 scsi_release_command(SCpnt
);
350 if ((STp
->buffer
)->last_result
!= 0)
351 printk(KERN_ERR
"st%d: Stepping over filemark %s failed.\n",
352 TAPE_NR(STp
->devt
), forward
? "forward" : "backward");
354 return (STp
->buffer
)->last_result_fatal
;
358 /* Flush the write buffer (never need to write if variable blocksize). */
360 flush_write_buffer(Scsi_Tape
*STp
)
362 int offset
, transfer
, blks
;
364 unsigned char cmd
[10];
368 if ((STp
->buffer
)->writing
) {
369 write_behind_check(STp
);
370 if ((STp
->buffer
)->last_result_fatal
) {
373 printk(ST_DEB_MSG
"st%d: Async write error (flush) %x.\n",
374 TAPE_NR(STp
->devt
), (STp
->buffer
)->last_result
);
376 if ((STp
->buffer
)->last_result
== INT_MAX
)
382 if (STp
->block_size
== 0)
386 if (STp
->dirty
== 1) {
388 offset
= (STp
->buffer
)->buffer_bytes
;
389 transfer
= ((offset
+ STp
->block_size
- 1) /
390 STp
->block_size
) * STp
->block_size
;
393 printk(ST_DEB_MSG
"st%d: Flushing %d bytes.\n", TAPE_NR(STp
->devt
), transfer
);
395 memset((STp
->buffer
)->b_data
+ offset
, 0, transfer
- offset
);
400 blks
= transfer
/ STp
->block_size
;
405 SCpnt
= st_do_scsi(NULL
, STp
, cmd
, transfer
, STp
->timeout
, MAX_WRITE_RETRIES
);
409 STps
= &(STp
->ps
[STp
->partition
]);
410 if ((STp
->buffer
)->last_result_fatal
!= 0) {
411 if ((SCpnt
->sense_buffer
[0] & 0x70) == 0x70 &&
412 (SCpnt
->sense_buffer
[2] & 0x40) &&
413 (SCpnt
->sense_buffer
[2] & 0x0f) == NO_SENSE
) {
415 (STp
->buffer
)->buffer_bytes
= 0;
419 printk(KERN_ERR
"st%d: Error on flush.\n", TAPE_NR(STp
->devt
));
422 STps
->drv_block
= (-1);
425 if (STps
->drv_block
>= 0)
426 STps
->drv_block
+= blks
;
428 (STp
->buffer
)->buffer_bytes
= 0;
430 scsi_release_command(SCpnt
);
437 /* Flush the tape buffer. The tape will be positioned correctly unless
438 seek_next is true. */
440 flush_buffer(struct inode
* inode
, struct file
* filp
, int seek_next
)
442 int backspace
, result
;
444 ST_buffer
* STbuffer
;
446 int dev
= TAPE_NR(inode
->i_rdev
);
448 STp
= &(scsi_tapes
[dev
]);
449 STbuffer
= STp
->buffer
;
452 * If there was a bus reset, block further access
455 if( STp
->device
->was_reset
)
458 if (STp
->ready
!= ST_READY
)
461 STps
= &(STp
->ps
[STp
->partition
]);
462 if (STps
->rw
== ST_WRITING
) /* Writing */
463 return flush_write_buffer(STp
);
465 if (STp
->block_size
== 0)
468 backspace
= ((STp
->buffer
)->buffer_bytes
+
469 (STp
->buffer
)->read_pointer
) / STp
->block_size
-
470 ((STp
->buffer
)->read_pointer
+ STp
->block_size
- 1) /
472 (STp
->buffer
)->buffer_bytes
= 0;
473 (STp
->buffer
)->read_pointer
= 0;
476 if (STps
->eof
== ST_FM_HIT
) {
477 result
= cross_eof(STp
, FALSE
); /* Back over the EOF hit */
479 STps
->eof
= ST_NOEOF
;
481 if (STps
->drv_file
>= 0)
486 if (!result
&& backspace
> 0)
487 result
= st_int_ioctl(inode
, MTBSR
, backspace
);
489 else if (STps
->eof
== ST_FM_HIT
) {
490 if (STps
->drv_file
>= 0)
493 STps
->eof
= ST_NOEOF
;
500 \f/* Set the mode parameters */
502 set_mode_densblk(struct inode
* inode
, Scsi_Tape
*STp
, ST_mode
*STm
)
506 int dev
= TAPE_NR(inode
->i_rdev
);
508 if (!STp
->density_changed
&&
509 STm
->default_density
>= 0 &&
510 STm
->default_density
!= STp
->density
) {
511 arg
= STm
->default_density
;
516 arg
<<= MT_ST_DENSITY_SHIFT
;
517 if (!STp
->blksize_changed
&&
518 STm
->default_blksize
>= 0 &&
519 STm
->default_blksize
!= STp
->block_size
) {
520 arg
|= STm
->default_blksize
;
524 arg
|= STp
->block_size
;
526 st_int_ioctl(inode
, SET_DENS_AND_BLK
, arg
)) {
528 "st%d: Can't set default block size to %d bytes and density %x.\n",
529 dev
, STm
->default_blksize
, STm
->default_density
);
537 /* Open the device */
539 scsi_tape_open(struct inode
* inode
, struct file
* filp
)
541 unsigned short flags
;
542 int i
, need_dma_buffer
, new_session
= FALSE
;
543 unsigned char cmd
[10];
548 int dev
= TAPE_NR(inode
->i_rdev
);
549 int mode
= TAPE_MODE(inode
->i_rdev
);
551 if (dev
>= st_template
.dev_max
|| !scsi_tapes
[dev
].device
)
554 if( !scsi_block_when_processing_errors(scsi_tapes
[dev
].device
) )
559 STp
= &(scsi_tapes
[dev
]);
562 printk(ST_DEB_MSG
"st%d: Device already in use.\n", dev
);
566 STp
->rew_at_close
= (MINOR(inode
->i_rdev
) & 0x80) == 0;
568 if (mode
!= STp
->current_mode
) {
571 printk(ST_DEB_MSG
"st%d: Mode change from %d to %d.\n",
572 dev
, STp
->current_mode
, mode
);
575 STp
->current_mode
= mode
;
577 STm
= &(STp
->modes
[STp
->current_mode
]);
579 /* Allocate buffer for this user */
580 need_dma_buffer
= STp
->restr_dma
;
581 for (i
=0; i
< st_nbr_buffers
; i
++)
582 if (!st_buffers
[i
]->in_use
&&
583 (!need_dma_buffer
|| st_buffers
[i
]->dma
))
585 if (i
>= st_nbr_buffers
) {
586 STp
->buffer
= new_tape_buffer(FALSE
, need_dma_buffer
);
587 if (STp
->buffer
== NULL
) {
588 printk(KERN_WARNING
"st%d: Can't allocate tape buffer.\n", dev
);
593 STp
->buffer
= st_buffers
[i
];
594 (STp
->buffer
)->in_use
= 1;
595 (STp
->buffer
)->writing
= 0;
596 (STp
->buffer
)->last_result_fatal
= 0;
598 flags
= filp
->f_flags
;
599 STp
->write_prot
= ((flags
& O_ACCMODE
) == O_RDONLY
);
602 for (i
=0; i
< ST_NBR_PARTITIONS
; i
++) {
603 STps
= &(STp
->ps
[i
]);
606 STp
->ready
= ST_READY
;
607 STp
->recover_count
= 0;
609 STp
->nbr_waits
= STp
->nbr_finished
= 0;
612 if (scsi_tapes
[dev
].device
->host
->hostt
->module
)
613 __MOD_INC_USE_COUNT(scsi_tapes
[dev
].device
->host
->hostt
->module
);
614 if(st_template
.module
)
615 __MOD_INC_USE_COUNT(st_template
.module
);
617 memset ((void *) &cmd
[0], 0, 10);
618 cmd
[0] = TEST_UNIT_READY
;
620 SCpnt
= st_do_scsi(NULL
, STp
, cmd
, 0, STp
->long_timeout
, MAX_READY_RETRIES
);
622 if (scsi_tapes
[dev
].device
->host
->hostt
->module
)
623 __MOD_DEC_USE_COUNT(scsi_tapes
[dev
].device
->host
->hostt
->module
);
624 if(st_template
.module
)
625 __MOD_DEC_USE_COUNT(st_template
.module
);
629 if ((SCpnt
->sense_buffer
[0] & 0x70) == 0x70 &&
630 (SCpnt
->sense_buffer
[2] & 0x0f) == UNIT_ATTENTION
) { /* New media? */
631 memset ((void *) &cmd
[0], 0, 10);
632 cmd
[0] = TEST_UNIT_READY
;
634 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, 0, STp
->long_timeout
, MAX_READY_RETRIES
);
636 (STp
->device
)->was_reset
= 0;
637 STp
->partition
= STp
->new_partition
= 0;
638 if (STp
->can_partitions
)
639 STp
->nbr_partitions
= 1; /* This guess will be updated later if necessary */
640 for (i
=0; i
< ST_NBR_PARTITIONS
; i
++) {
641 STps
= &(STp
->ps
[i
]);
643 STps
->eof
= ST_NOEOF
;
645 STps
->last_block_valid
= FALSE
;
652 if ((STp
->buffer
)->last_result_fatal
!= 0) {
653 if ((STp
->device
)->scsi_level
>= SCSI_2
&&
654 (SCpnt
->sense_buffer
[0] & 0x70) == 0x70 &&
655 (SCpnt
->sense_buffer
[2] & 0x0f) == NOT_READY
&&
656 SCpnt
->sense_buffer
[12] == 0x3a) { /* Check ASC */
657 STp
->ready
= ST_NO_TAPE
;
659 STp
->ready
= ST_NOT_READY
;
660 scsi_release_command(SCpnt
);
662 STp
->density
= 0; /* Clear the erroneous "residue" */
665 STp
->ps
[0].drv_file
= STp
->ps
[0].drv_block
= 0;
666 STp
->partition
= STp
->new_partition
= 0;
667 STp
->door_locked
= ST_UNLOCKED
;
672 if (STp
->omit_blklims
)
673 STp
->min_block
= STp
->max_block
= (-1);
675 memset ((void *) &cmd
[0], 0, 10);
676 cmd
[0] = READ_BLOCK_LIMITS
;
678 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, 6, STp
->timeout
, MAX_READY_RETRIES
);
680 if (!SCpnt
->result
&& !SCpnt
->sense_buffer
[0]) {
681 STp
->max_block
= ((STp
->buffer
)->b_data
[1] << 16) |
682 ((STp
->buffer
)->b_data
[2] << 8) | (STp
->buffer
)->b_data
[3];
683 STp
->min_block
= ((STp
->buffer
)->b_data
[4] << 8) |
684 (STp
->buffer
)->b_data
[5];
687 printk(ST_DEB_MSG
"st%d: Block limits %d - %d bytes.\n", dev
, STp
->min_block
,
692 STp
->min_block
= STp
->max_block
= (-1);
695 printk(ST_DEB_MSG
"st%d: Can't read block limits.\n", dev
);
700 memset ((void *) &cmd
[0], 0, 10);
704 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, 12, STp
->timeout
, MAX_READY_RETRIES
);
706 if ((STp
->buffer
)->last_result_fatal
!= 0) {
709 printk(ST_DEB_MSG
"st%d: No Mode Sense.\n", dev
);
711 STp
->block_size
= ST_DEFAULT_BLOCK
; /* Educated guess (?) */
712 (STp
->buffer
)->last_result_fatal
= 0; /* Prevent error propagation */
713 STp
->drv_write_prot
= 0;
719 printk(ST_DEB_MSG
"st%d: Mode sense. Length %d, medium %x, WBS %x, BLL %d\n",
721 (STp
->buffer
)->b_data
[0], (STp
->buffer
)->b_data
[1],
722 (STp
->buffer
)->b_data
[2], (STp
->buffer
)->b_data
[3]);
725 if ((STp
->buffer
)->b_data
[3] >= 8) {
726 STp
->drv_buffer
= ((STp
->buffer
)->b_data
[2] >> 4) & 7;
727 STp
->density
= (STp
->buffer
)->b_data
[4];
728 STp
->block_size
= (STp
->buffer
)->b_data
[9] * 65536 +
729 (STp
->buffer
)->b_data
[10] * 256 + (STp
->buffer
)->b_data
[11];
732 printk(ST_DEB_MSG
"st%d: Density %x, tape length: %x, drv buffer: %d\n",
733 dev
, STp
->density
, (STp
->buffer
)->b_data
[5] * 65536 +
734 (STp
->buffer
)->b_data
[6] * 256 + (STp
->buffer
)->b_data
[7],
739 if (STp
->block_size
> (STp
->buffer
)->buffer_size
&&
740 !enlarge_buffer(STp
->buffer
, STp
->block_size
, STp
->restr_dma
)) {
741 printk(KERN_NOTICE
"st%d: Blocksize %d too large for buffer.\n", dev
,
743 (STp
->buffer
)->in_use
= 0;
745 if (scsi_tapes
[dev
].device
->host
->hostt
->module
)
746 __MOD_DEC_USE_COUNT(scsi_tapes
[dev
].device
->host
->hostt
->module
);
747 if(st_template
.module
)
748 __MOD_DEC_USE_COUNT(st_template
.module
);
751 STp
->drv_write_prot
= ((STp
->buffer
)->b_data
[2] & 0x80) != 0;
753 scsi_release_command(SCpnt
);
756 if (STp
->block_size
> 0)
757 (STp
->buffer
)->buffer_blocks
= st_buffer_size
/ STp
->block_size
;
759 (STp
->buffer
)->buffer_blocks
= 1;
760 (STp
->buffer
)->buffer_bytes
= (STp
->buffer
)->read_pointer
= 0;
764 printk(ST_DEB_MSG
"st%d: Block size: %d, buffer size: %d (%d blocks).\n", dev
,
765 STp
->block_size
, (STp
->buffer
)->buffer_size
,
766 (STp
->buffer
)->buffer_blocks
);
769 if (STp
->drv_write_prot
) {
773 printk(ST_DEB_MSG
"st%d: Write protected\n", dev
);
775 if ((flags
& O_ACCMODE
) == O_WRONLY
|| (flags
& O_ACCMODE
) == O_RDWR
) {
776 (STp
->buffer
)->in_use
= 0;
778 if (scsi_tapes
[dev
].device
->host
->hostt
->module
)
779 __MOD_DEC_USE_COUNT(scsi_tapes
[dev
].device
->host
->hostt
->module
);
780 if(st_template
.module
)
781 __MOD_DEC_USE_COUNT(st_template
.module
);
786 if (STp
->can_partitions
&& STp
->nbr_partitions
< 1) {
787 /* This code is reached when the device is opened for the first time
788 after the driver has been initialized with tape in the drive and the
789 partition support has been enabled. */
792 printk(ST_DEB_MSG
"st%d: Updating partition number in status.\n", dev
);
794 if ((STp
->partition
= find_partition(inode
)) < 0) {
795 (STp
->buffer
)->in_use
= 0;
797 if (scsi_tapes
[dev
].device
->host
->hostt
->module
)
798 __MOD_DEC_USE_COUNT(scsi_tapes
[dev
].device
->host
->hostt
->module
);
799 if(st_template
.module
)
800 __MOD_DEC_USE_COUNT(st_template
.module
);
801 return STp
->partition
;
803 STp
->new_partition
= STp
->partition
;
804 STp
->nbr_partitions
= 1; /* This guess will be updated when necessary */
807 if (new_session
) { /* Change the drive parameters for the new mode */
808 STp
->density_changed
= STp
->blksize_changed
= FALSE
;
809 STp
->compression_changed
= FALSE
;
810 if (!(STm
->defaults_for_writes
) &&
811 (i
= set_mode_densblk(inode
, STp
, STm
)) < 0) {
812 (STp
->buffer
)->in_use
= 0;
814 if (scsi_tapes
[dev
].device
->host
->hostt
->module
)
815 __MOD_DEC_USE_COUNT(scsi_tapes
[dev
].device
->host
->hostt
->module
);
816 if(st_template
.module
)
817 __MOD_DEC_USE_COUNT(st_template
.module
);
820 if (STp
->default_drvbuffer
!= 0xff) {
821 if (st_int_ioctl(inode
, MTSETDRVBUFFER
, STp
->default_drvbuffer
))
822 printk(KERN_WARNING
"st%d: Can't set default drive buffering to %d.\n",
823 dev
, STp
->default_drvbuffer
);
833 /* Close the device*/
835 scsi_tape_close(struct inode
* inode
, struct file
* filp
)
837 int result
= 0, result2
;
838 static unsigned char cmd
[10];
844 kdev_t devt
= inode
->i_rdev
;
848 STp
= &(scsi_tapes
[dev
]);
849 STm
= &(STp
->modes
[STp
->current_mode
]);
850 STps
= &(STp
->ps
[STp
->partition
]);
852 if (STp
->can_partitions
&&
853 (result
= update_partition(inode
)) < 0) {
856 printk(ST_DEB_MSG
"st%d: update_partition at close failed.\n", dev
);
861 if ( STps
->rw
== ST_WRITING
&& !(STp
->device
)->was_reset
) {
863 result
= flush_write_buffer(STp
);
867 printk(ST_DEB_MSG
"st%d: File length %ld bytes.\n",
868 dev
, (long)(filp
->f_pos
));
869 printk(ST_DEB_MSG
"st%d: Async write waits %d, finished %d.\n",
870 dev
, STp
->nbr_waits
, STp
->nbr_finished
);
874 if (result
== 0 || result
== (-ENOSPC
)) {
877 cmd
[0] = WRITE_FILEMARKS
;
878 cmd
[4] = 1 + STp
->two_fm
;
880 SCpnt
= st_do_scsi(NULL
, STp
, cmd
, 0, STp
->timeout
, MAX_WRITE_RETRIES
);
884 if ((STp
->buffer
)->last_result_fatal
!= 0 &&
885 ((SCpnt
->sense_buffer
[0] & 0x70) != 0x70 ||
886 (SCpnt
->sense_buffer
[2] & 0x4f) != 0x40 ||
887 ((SCpnt
->sense_buffer
[0] & 0x80) != 0 &&
888 (SCpnt
->sense_buffer
[3] | SCpnt
->sense_buffer
[4] |
889 SCpnt
->sense_buffer
[5] |
890 SCpnt
->sense_buffer
[6]) == 0))) {
891 /* Filter out successful write at EOM */
892 scsi_release_command(SCpnt
);
894 printk(KERN_ERR
"st%d: Error on write filemark.\n", dev
);
899 scsi_release_command(SCpnt
);
901 if (STps
->drv_file
>= 0)
905 cross_eof(STp
, FALSE
);
912 printk(ST_DEB_MSG
"st%d: Buffer flushed, %d EOF(s) written\n",
916 else if (!STp
->rew_at_close
) {
917 STps
= &(STp
->ps
[STp
->partition
]);
918 if (!STm
->sysv
|| STps
->rw
!= ST_READING
) {
920 result
= flush_buffer(inode
, filp
, 0);
921 else if (STps
->eof
== ST_FM_HIT
) {
922 result
= cross_eof(STp
, FALSE
);
924 if (STps
->drv_file
>= 0)
930 STps
->eof
= ST_NOEOF
;
933 else if ((STps
->eof
== ST_NOEOF
&&
934 !(result
= cross_eof(STp
, TRUE
))) ||
935 STps
->eof
== ST_FM_HIT
) {
936 if (STps
->drv_file
>= 0)
944 if (STp
->rew_at_close
) {
945 result2
= st_int_ioctl(inode
, MTREW
, 1);
950 if (STp
->door_locked
== ST_LOCKED_AUTO
)
951 st_int_ioctl(inode
, MTUNLOCK
, 0);
953 if (STp
->buffer
!= NULL
) {
954 normalize_buffer(STp
->buffer
);
955 (STp
->buffer
)->in_use
= 0;
959 if (scsi_tapes
[dev
].device
->host
->hostt
->module
)
960 __MOD_DEC_USE_COUNT(scsi_tapes
[dev
].device
->host
->hostt
->module
);
961 if(st_template
.module
)
962 __MOD_DEC_USE_COUNT(st_template
.module
);
970 st_write(struct file
* filp
, const char * buf
, size_t count
, loff_t
*ppos
)
972 struct inode
*inode
= filp
->f_dentry
->d_inode
;
974 ssize_t i
, do_count
, blks
, retval
, transfer
;
977 static unsigned char cmd
[10];
979 Scsi_Cmnd
* SCpnt
= NULL
;
983 int dev
= TAPE_NR(inode
->i_rdev
);
986 STp
= &(scsi_tapes
[dev
]);
989 * If we are in the middle of error recovery, don't let anyone
990 * else try and use this device. Also, if error recovery fails, it
991 * may try and take the device offline, in which case all further
992 * access to the device is prohibited.
994 if( !scsi_block_when_processing_errors(STp
->device
) )
999 if (ppos
!= &filp
->f_pos
) {
1000 /* "A request was outside the capabilities of the device." */
1004 if (STp
->ready
!= ST_READY
) {
1005 if (STp
->ready
== ST_NO_TAPE
)
1006 return (-ENOMEDIUM
);
1010 STm
= &(STp
->modes
[STp
->current_mode
]);
1017 * If there was a bus reset, block further access
1020 if( STp
->device
->was_reset
)
1025 printk(ST_DEB_MSG
"st%d: Incorrect device.\n", dev
);
1030 if (STp
->can_partitions
&&
1031 (retval
= update_partition(inode
)) < 0)
1033 STps
= &(STp
->ps
[STp
->partition
]);
1035 if (STp
->write_prot
)
1038 if (STp
->block_size
== 0 &&
1039 count
> (STp
->buffer
)->buffer_size
&&
1040 !enlarge_buffer(STp
->buffer
, count
, STp
->restr_dma
))
1041 return (-EOVERFLOW
);
1043 if (STp
->do_auto_lock
&& STp
->door_locked
== ST_UNLOCKED
&&
1044 !st_int_ioctl(inode
, MTLOCK
, 0))
1045 STp
->door_locked
= ST_LOCKED_AUTO
;
1047 if (STps
->rw
== ST_READING
) {
1048 retval
= flush_buffer(inode
, filp
, 0);
1051 STps
->rw
= ST_WRITING
;
1053 else if (STps
->rw
!= ST_WRITING
&&
1054 STps
->drv_file
== 0 && STps
->drv_block
== 0) {
1055 if ((retval
= set_mode_densblk(inode
, STp
, STm
)) < 0)
1057 if (STm
->default_compression
!= ST_DONT_TOUCH
&&
1058 !(STp
->compression_changed
)) {
1059 if (st_compression(STp
, (STm
->default_compression
== ST_YES
))) {
1060 printk(KERN_WARNING
"st%d: Can't set default compression.\n",
1068 if ((STp
->buffer
)->writing
) {
1069 write_behind_check(STp
);
1070 if ((STp
->buffer
)->last_result_fatal
) {
1073 printk(ST_DEB_MSG
"st%d: Async write error (write) %x.\n", dev
,
1074 (STp
->buffer
)->last_result
);
1076 if ((STp
->buffer
)->last_result
== INT_MAX
)
1077 STps
->eof
= ST_EOM_OK
;
1079 STps
->eof
= ST_EOM_ERROR
;
1082 if (STps
->eof
== ST_EOM_OK
)
1084 else if (STps
->eof
== ST_EOM_ERROR
)
1087 /* Check the buffer readability in cases where copy_user might catch
1088 the problems after some tape movement. */
1089 if (STp
->block_size
!= 0 &&
1090 (copy_from_user(&i
, buf
, 1) != 0 ||
1091 copy_from_user(&i
, buf
+ count
- 1, 1) != 0))
1094 if (!STm
->do_buffer_writes
) {
1095 if (STp
->block_size
!= 0 && (count
% STp
->block_size
) != 0)
1096 return (-EIO
); /* Write must be integral number of blocks */
1097 write_threshold
= 1;
1100 write_threshold
= (STp
->buffer
)->buffer_blocks
* STp
->block_size
;
1101 if (!STm
->do_async_writes
)
1108 cmd
[1] = (STp
->block_size
!= 0);
1110 STps
->rw
= ST_WRITING
;
1113 while((STp
->block_size
== 0 && !STm
->do_async_writes
&& count
> 0) ||
1114 (STp
->block_size
!= 0 &&
1115 (STp
->buffer
)->buffer_bytes
+ count
> write_threshold
))
1118 if (STp
->block_size
== 0)
1121 do_count
= (STp
->buffer
)->buffer_blocks
* STp
->block_size
-
1122 (STp
->buffer
)->buffer_bytes
;
1123 if (do_count
> count
)
1127 i
= copy_from_user((STp
->buffer
)->b_data
+
1128 (STp
->buffer
)->buffer_bytes
, b_point
, do_count
);
1132 scsi_release_command(SCpnt
);
1138 if (STp
->block_size
== 0)
1139 blks
= transfer
= do_count
;
1141 blks
= ((STp
->buffer
)->buffer_bytes
+ do_count
) /
1143 transfer
= blks
* STp
->block_size
;
1145 cmd
[2] = blks
>> 16;
1149 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, transfer
, STp
->timeout
, MAX_WRITE_RETRIES
);
1153 if ((STp
->buffer
)->last_result_fatal
!= 0) {
1156 printk(ST_DEB_MSG
"st%d: Error on write:\n", dev
);
1158 if ((SCpnt
->sense_buffer
[0] & 0x70) == 0x70 &&
1159 (SCpnt
->sense_buffer
[2] & 0x40)) {
1160 if (STp
->block_size
!= 0 && (SCpnt
->sense_buffer
[0] & 0x80) != 0)
1161 transfer
= (SCpnt
->sense_buffer
[3] << 24) |
1162 (SCpnt
->sense_buffer
[4] << 16) |
1163 (SCpnt
->sense_buffer
[5] << 8) | SCpnt
->sense_buffer
[6];
1164 else if (STp
->block_size
== 0 &&
1165 (SCpnt
->sense_buffer
[2] & 0x0f) == VOLUME_OVERFLOW
)
1166 transfer
= do_count
;
1169 if (STp
->block_size
!= 0)
1170 transfer
*= STp
->block_size
;
1171 if (transfer
<= do_count
) {
1172 filp
->f_pos
+= do_count
- transfer
;
1173 count
-= do_count
- transfer
;
1174 if (STps
->drv_block
>= 0) {
1175 if (STp
->block_size
== 0 && transfer
< do_count
)
1177 else if (STp
->block_size
!= 0)
1178 STps
->drv_block
+= (do_count
- transfer
) / STp
->block_size
;
1180 STps
->eof
= ST_EOM_OK
;
1181 retval
= (-ENOSPC
); /* EOM within current request */
1184 printk(ST_DEB_MSG
"st%d: EOM with %d bytes unwritten.\n",
1189 STps
->eof
= ST_EOM_ERROR
;
1190 STps
->drv_block
= (-1); /* Too cautious? */
1191 retval
= (-EIO
); /* EOM for old data */
1194 printk(ST_DEB_MSG
"st%d: EOM with lost data.\n", dev
);
1199 STps
->drv_block
= (-1); /* Too cautious? */
1203 scsi_release_command(SCpnt
);
1205 (STp
->buffer
)->buffer_bytes
= 0;
1208 return total
- count
;
1212 filp
->f_pos
+= do_count
;
1213 b_point
+= do_count
;
1215 if (STps
->drv_block
>= 0) {
1216 if (STp
->block_size
== 0)
1219 STps
->drv_block
+= blks
;
1221 (STp
->buffer
)->buffer_bytes
= 0;
1226 i
= copy_from_user((STp
->buffer
)->b_data
+
1227 (STp
->buffer
)->buffer_bytes
, b_point
, count
);
1231 scsi_release_command(SCpnt
);
1236 filp
->f_pos
+= count
;
1237 (STp
->buffer
)->buffer_bytes
+= count
;
1241 if (doing_write
&& (STp
->buffer
)->last_result_fatal
!= 0) {
1242 scsi_release_command(SCpnt
);
1244 return (STp
->buffer
)->last_result_fatal
;
1247 if (STm
->do_async_writes
&&
1248 (((STp
->buffer
)->buffer_bytes
>= STp
->write_threshold
&&
1249 (STp
->buffer
)->buffer_bytes
>= STp
->block_size
) ||
1250 STp
->block_size
== 0) ) {
1251 /* Schedule an asynchronous write */
1253 SCpnt
= scsi_allocate_device(NULL
, STp
->device
, 1);
1257 if (STp
->block_size
== 0)
1258 (STp
->buffer
)->writing
= (STp
->buffer
)->buffer_bytes
;
1260 (STp
->buffer
)->writing
= ((STp
->buffer
)->buffer_bytes
/
1261 STp
->block_size
) * STp
->block_size
;
1262 STp
->dirty
= !((STp
->buffer
)->writing
==
1263 (STp
->buffer
)->buffer_bytes
);
1265 if (STp
->block_size
== 0)
1266 blks
= (STp
->buffer
)->writing
;
1268 blks
= (STp
->buffer
)->writing
/ STp
->block_size
;
1269 cmd
[2] = blks
>> 16;
1272 STp
->sem
= MUTEX_LOCKED
;
1273 SCpnt
->request
.sem
= &(STp
->sem
);
1274 SCpnt
->request
.rq_status
= RQ_SCSI_BUSY
;
1275 SCpnt
->request
.rq_dev
= STp
->devt
;
1277 STp
->write_pending
= 1;
1280 spin_lock_irqsave(&io_request_lock
, flags
);
1282 (void *) cmd
, (STp
->buffer
)->b_data
,
1283 (STp
->buffer
)->writing
,
1284 st_sleep_done
, STp
->timeout
, MAX_WRITE_RETRIES
);
1285 spin_unlock_irqrestore(&io_request_lock
, flags
);
1287 else if (SCpnt
!= NULL
)
1289 scsi_release_command(SCpnt
);
1292 STps
->at_sm
&= (total
== 0);
1294 STps
->eof
= ST_NOEOF
;
1299 /* Read data from the tape. Returns zero in the normal case, one if the
1300 eof status has changed, and the negative error code in case of a
1301 fatal error. Otherwise updates the buffer and the eof state. */
1303 read_tape(struct inode
*inode
, long count
, Scsi_Cmnd
**aSCpnt
)
1305 int transfer
, blks
, bytes
;
1306 static unsigned char cmd
[10];
1311 int dev
= TAPE_NR(inode
->i_rdev
);
1317 STp
= &(scsi_tapes
[dev
]);
1318 STm
= &(STp
->modes
[STp
->current_mode
]);
1319 STps
= &(STp
->ps
[STp
->partition
]);
1320 if (STps
->eof
== ST_FM_HIT
)
1325 cmd
[1] = (STp
->block_size
!= 0);
1326 if (STp
->block_size
== 0)
1327 blks
= bytes
= count
;
1329 if (STm
->do_read_ahead
) {
1330 blks
= (STp
->buffer
)->buffer_blocks
;
1331 bytes
= blks
* STp
->block_size
;
1335 if (bytes
> (STp
->buffer
)->buffer_size
)
1336 bytes
= (STp
->buffer
)->buffer_size
;
1337 blks
= bytes
/ STp
->block_size
;
1338 bytes
= blks
* STp
->block_size
;
1341 cmd
[2] = blks
>> 16;
1346 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, bytes
, STp
->timeout
, MAX_RETRIES
);
1351 (STp
->buffer
)->read_pointer
= 0;
1355 /* Something to check */
1356 if ((STp
->buffer
)->last_result_fatal
) {
1360 printk(ST_DEB_MSG
"st%d: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n",
1362 SCpnt
->sense_buffer
[0], SCpnt
->sense_buffer
[1],
1363 SCpnt
->sense_buffer
[2], SCpnt
->sense_buffer
[3],
1364 SCpnt
->sense_buffer
[4], SCpnt
->sense_buffer
[5],
1365 SCpnt
->sense_buffer
[6], SCpnt
->sense_buffer
[7]);
1367 if ((SCpnt
->sense_buffer
[0] & 0x70) == 0x70) { /* extended sense */
1369 if ((SCpnt
->sense_buffer
[2] & 0x0f) == BLANK_CHECK
)
1370 SCpnt
->sense_buffer
[2] &= 0xcf; /* No need for EOM in this case */
1372 if ((SCpnt
->sense_buffer
[2] & 0xe0) != 0) { /* EOF, EOM, or ILI */
1373 /* Compute the residual count */
1374 if ((SCpnt
->sense_buffer
[0] & 0x80) != 0)
1375 transfer
= (SCpnt
->sense_buffer
[3] << 24) |
1376 (SCpnt
->sense_buffer
[4] << 16) |
1377 (SCpnt
->sense_buffer
[5] << 8) | SCpnt
->sense_buffer
[6];
1380 if (STp
->block_size
== 0 &&
1381 (SCpnt
->sense_buffer
[2] & 0x0f) == MEDIUM_ERROR
)
1384 if (SCpnt
->sense_buffer
[2] & 0x20) { /* ILI */
1385 if (STp
->block_size
== 0) {
1388 (STp
->buffer
)->buffer_bytes
= bytes
- transfer
;
1391 scsi_release_command(SCpnt
);
1392 SCpnt
= *aSCpnt
= NULL
;
1393 if (transfer
== blks
) { /* We did not get anything, error */
1394 printk(KERN_NOTICE
"st%d: Incorrect block size.\n", dev
);
1395 if (STps
->drv_block
>= 0)
1396 STps
->drv_block
+= blks
- transfer
+ 1;
1397 st_int_ioctl(inode
, MTBSR
, 1);
1400 /* We have some data, deliver it */
1401 (STp
->buffer
)->buffer_bytes
= (blks
- transfer
) *
1406 "st%d: ILI but enough data received %ld %d.\n",
1407 dev
, count
, (STp
->buffer
)->buffer_bytes
);
1409 if (STps
->drv_block
>= 0)
1410 STps
->drv_block
+= 1;
1411 if (st_int_ioctl(inode
, MTBSR
, 1))
1415 else if (SCpnt
->sense_buffer
[2] & 0x80) { /* FM overrides EOM */
1416 if (STps
->eof
!= ST_FM_HIT
)
1417 STps
->eof
= ST_FM_HIT
;
1419 STps
->eof
= ST_EOD_2
;
1420 if (STp
->block_size
== 0)
1421 (STp
->buffer
)->buffer_bytes
= 0;
1423 (STp
->buffer
)->buffer_bytes
=
1424 bytes
- transfer
* STp
->block_size
;
1428 "st%d: EOF detected (%d bytes read).\n",
1429 dev
, (STp
->buffer
)->buffer_bytes
);
1432 else if (SCpnt
->sense_buffer
[2] & 0x40) {
1433 if (STps
->eof
== ST_FM
)
1434 STps
->eof
= ST_EOD_1
;
1436 STps
->eof
= ST_EOM_OK
;
1437 if (STp
->block_size
== 0)
1438 (STp
->buffer
)->buffer_bytes
= bytes
- transfer
;
1440 (STp
->buffer
)->buffer_bytes
=
1441 bytes
- transfer
* STp
->block_size
;
1444 printk(ST_DEB_MSG
"st%d: EOM detected (%d bytes read).\n",
1445 dev
, (STp
->buffer
)->buffer_bytes
);
1448 } /* end of EOF, EOM, ILI test */
1449 else { /* nonzero sense key */
1452 printk(ST_DEB_MSG
"st%d: Tape error while reading.\n", dev
);
1454 STps
->drv_block
= (-1);
1455 if (STps
->eof
== ST_FM
&&
1456 (SCpnt
->sense_buffer
[2] & 0x0f) == BLANK_CHECK
) {
1460 "st%d: Zero returned for first BLANK CHECK after EOF.\n",
1463 STps
->eof
= ST_EOD_2
; /* First BLANK_CHECK after FM */
1465 else /* Some other extended sense code */
1468 } /* End of extended sense test */
1469 else { /* Non-extended sense */
1470 retval
= (STp
->buffer
)->last_result_fatal
;
1473 } /* End of error handling */
1474 else /* Read successful */
1475 (STp
->buffer
)->buffer_bytes
= bytes
;
1477 if (STps
->drv_block
>= 0) {
1478 if (STp
->block_size
== 0)
1481 STps
->drv_block
+= (STp
->buffer
)->buffer_bytes
/ STp
->block_size
;
1490 st_read(struct file
* filp
, char * buf
, size_t count
, loff_t
*ppos
)
1492 struct inode
* inode
= filp
->f_dentry
->d_inode
;
1494 ssize_t i
, transfer
;
1496 Scsi_Cmnd
* SCpnt
= NULL
;
1500 int dev
= TAPE_NR(inode
->i_rdev
);
1502 STp
= &(scsi_tapes
[dev
]);
1505 * If we are in the middle of error recovery, don't let anyone
1506 * else try and use this device. Also, if error recovery fails, it
1507 * may try and take the device offline, in which case all further
1508 * access to the device is prohibited.
1510 if( !scsi_block_when_processing_errors(STp
->device
) )
1515 if (ppos
!= &filp
->f_pos
) {
1516 /* "A request was outside the capabilities of the device." */
1520 if (STp
->ready
!= ST_READY
) {
1521 if (STp
->ready
== ST_NO_TAPE
)
1522 return (-ENOMEDIUM
);
1526 STm
= &(STp
->modes
[STp
->current_mode
]);
1531 printk(ST_DEB_MSG
"st%d: Incorrect device.\n", dev
);
1536 if (STp
->can_partitions
&&
1537 (total
= update_partition(inode
)) < 0)
1540 if (STp
->block_size
== 0 &&
1541 count
> (STp
->buffer
)->buffer_size
&&
1542 !enlarge_buffer(STp
->buffer
, count
, STp
->restr_dma
))
1543 return (-EOVERFLOW
);
1545 if (!(STm
->do_read_ahead
) && STp
->block_size
!= 0 &&
1546 (count
% STp
->block_size
) != 0)
1547 return (-EIO
); /* Read must be integral number of blocks */
1549 if (STp
->do_auto_lock
&& STp
->door_locked
== ST_UNLOCKED
&&
1550 !st_int_ioctl(inode
, MTLOCK
, 0))
1551 STp
->door_locked
= ST_LOCKED_AUTO
;
1553 STps
= &(STp
->ps
[STp
->partition
]);
1554 if (STps
->rw
== ST_WRITING
) {
1555 transfer
= flush_buffer(inode
, filp
, 0);
1558 STps
->rw
= ST_READING
;
1562 if (debugging
&& STps
->eof
!= ST_NOEOF
)
1563 printk(ST_DEB_MSG
"st%d: EOF/EOM flag up (%d). Bytes %d\n", dev
,
1564 STps
->eof
, (STp
->buffer
)->buffer_bytes
);
1566 if ((STp
->buffer
)->buffer_bytes
== 0 &&
1567 STps
->eof
>= ST_EOD_1
) {
1568 if (STps
->eof
< ST_EOD
) {
1572 return (-EIO
); /* EOM or Blank Check */
1575 /* Check the buffer writability before any tape movement. Don't alter
1577 if (copy_from_user(&i
, buf
, 1) != 0 ||
1578 copy_to_user(buf
, &i
, 1) != 0 ||
1579 copy_from_user(&i
, buf
+ count
- 1, 1) != 0 ||
1580 copy_to_user(buf
+ count
- 1, &i
, 1) != 0)
1583 STps
->rw
= ST_READING
;
1586 /* Loop until enough data in buffer or a special condition found */
1587 for (total
= 0, special
= 0; total
< count
&& !special
; ) {
1589 /* Get new data if the buffer is empty */
1590 if ((STp
->buffer
)->buffer_bytes
== 0) {
1591 special
= read_tape(inode
, count
- total
, &SCpnt
);
1592 if (special
< 0) { /* No need to continue read */
1595 scsi_release_command(SCpnt
);
1601 /* Move the data from driver buffer to user buffer */
1602 if ((STp
->buffer
)->buffer_bytes
> 0) {
1604 if (debugging
&& STps
->eof
!= ST_NOEOF
)
1605 printk(ST_DEB_MSG
"st%d: EOF up (%d). Left %d, needed %d.\n", dev
,
1606 STps
->eof
, (STp
->buffer
)->buffer_bytes
, count
- total
);
1608 transfer
= (STp
->buffer
)->buffer_bytes
< count
- total
?
1609 (STp
->buffer
)->buffer_bytes
: count
- total
;
1610 i
= copy_to_user(buf
, (STp
->buffer
)->b_data
+
1611 (STp
->buffer
)->read_pointer
, transfer
);
1615 scsi_release_command(SCpnt
);
1620 filp
->f_pos
+= transfer
;
1623 (STp
->buffer
)->buffer_bytes
-= transfer
;
1624 (STp
->buffer
)->read_pointer
+= transfer
;
1627 if (STp
->block_size
== 0)
1628 break; /* Read only one variable length block */
1630 } /* for (total = 0, special = 0; total < count && !special; ) */
1634 scsi_release_command(SCpnt
);
1638 /* Change the eof state if no data from tape or buffer */
1640 if (STps
->eof
== ST_FM_HIT
) {
1642 STps
->drv_block
= 0;
1643 if (STps
->drv_file
>= 0)
1646 else if (STps
->eof
== ST_EOD_1
) {
1647 STps
->eof
= ST_EOD_2
;
1648 STps
->drv_block
= 0;
1649 if (STps
->drv_file
>= 0)
1652 else if (STps
->eof
== ST_EOD_2
)
1655 else if (STps
->eof
== ST_FM
)
1656 STps
->eof
= ST_NOEOF
;
1663 /* Set the driver options */
1665 st_log_options(Scsi_Tape
*STp
, ST_mode
*STm
, int dev
)
1668 "st%d: Mode %d options: buffer writes: %d, async writes: %d, read ahead: %d\n",
1669 dev
, STp
->current_mode
, STm
->do_buffer_writes
, STm
->do_async_writes
,
1670 STm
->do_read_ahead
);
1672 "st%d: can bsr: %d, two FMs: %d, fast mteom: %d, auto lock: %d,\n",
1673 dev
, STp
->can_bsr
, STp
->two_fm
, STp
->fast_mteom
, STp
->do_auto_lock
);
1675 "st%d: defs for wr: %d, no block limits: %d, partitions: %d, s2 log: %d\n",
1676 dev
, STm
->defaults_for_writes
, STp
->omit_blklims
, STp
->can_partitions
,
1677 STp
->scsi2_logical
);
1679 "st%d: sysv: %d\n", dev
, STm
->sysv
);
1682 "st%d: debugging: %d\n",
1689 st_set_options(struct inode
* inode
, long options
)
1695 int dev
= TAPE_NR(inode
->i_rdev
);
1697 STp
= &(scsi_tapes
[dev
]);
1698 STm
= &(STp
->modes
[STp
->current_mode
]);
1699 if (!STm
->defined
) {
1700 memcpy(STm
, &(STp
->modes
[0]), sizeof(ST_mode
));
1701 modes_defined
= TRUE
;
1704 printk(ST_DEB_MSG
"st%d: Initialized mode %d definition from mode 0\n",
1705 dev
, STp
->current_mode
);
1709 code
= options
& MT_ST_OPTIONS
;
1710 if (code
== MT_ST_BOOLEANS
) {
1711 STm
->do_buffer_writes
= (options
& MT_ST_BUFFER_WRITES
) != 0;
1712 STm
->do_async_writes
= (options
& MT_ST_ASYNC_WRITES
) != 0;
1713 STm
->defaults_for_writes
= (options
& MT_ST_DEF_WRITES
) != 0;
1714 STm
->do_read_ahead
= (options
& MT_ST_READ_AHEAD
) != 0;
1715 STp
->two_fm
= (options
& MT_ST_TWO_FM
) != 0;
1716 STp
->fast_mteom
= (options
& MT_ST_FAST_MTEOM
) != 0;
1717 STp
->do_auto_lock
= (options
& MT_ST_AUTO_LOCK
) != 0;
1718 STp
->can_bsr
= (options
& MT_ST_CAN_BSR
) != 0;
1719 STp
->omit_blklims
= (options
& MT_ST_NO_BLKLIMS
) != 0;
1720 if ((STp
->device
)->scsi_level
>= SCSI_2
)
1721 STp
->can_partitions
= (options
& MT_ST_CAN_PARTITIONS
) != 0;
1722 STp
->scsi2_logical
= (options
& MT_ST_SCSI2LOGICAL
) != 0;
1723 STm
->sysv
= (options
& MT_ST_SYSV
) != 0;
1725 debugging
= (options
& MT_ST_DEBUGGING
) != 0;
1727 st_log_options(STp
, STm
, dev
);
1729 else if (code
== MT_ST_SETBOOLEANS
|| code
== MT_ST_CLEARBOOLEANS
) {
1730 value
= (code
== MT_ST_SETBOOLEANS
);
1731 if ((options
& MT_ST_BUFFER_WRITES
) != 0)
1732 STm
->do_buffer_writes
= value
;
1733 if ((options
& MT_ST_ASYNC_WRITES
) != 0)
1734 STm
->do_async_writes
= value
;
1735 if ((options
& MT_ST_DEF_WRITES
) != 0)
1736 STm
->defaults_for_writes
= value
;
1737 if ((options
& MT_ST_READ_AHEAD
) != 0)
1738 STm
->do_read_ahead
= value
;
1739 if ((options
& MT_ST_TWO_FM
) != 0)
1740 STp
->two_fm
= value
;
1741 if ((options
& MT_ST_FAST_MTEOM
) != 0)
1742 STp
->fast_mteom
= value
;
1743 if ((options
& MT_ST_AUTO_LOCK
) != 0)
1744 STp
->do_auto_lock
= value
;
1745 if ((options
& MT_ST_CAN_BSR
) != 0)
1746 STp
->can_bsr
= value
;
1747 if ((options
& MT_ST_NO_BLKLIMS
) != 0)
1748 STp
->omit_blklims
= value
;
1749 if ((STp
->device
)->scsi_level
>= SCSI_2
&&
1750 (options
& MT_ST_CAN_PARTITIONS
) != 0)
1751 STp
->can_partitions
= value
;
1752 if ((options
& MT_ST_SCSI2LOGICAL
) != 0)
1753 STp
->scsi2_logical
= value
;
1754 if ((options
& MT_ST_SYSV
) != 0)
1757 if ((options
& MT_ST_DEBUGGING
) != 0)
1760 st_log_options(STp
, STm
, dev
);
1762 else if (code
== MT_ST_WRITE_THRESHOLD
) {
1763 value
= (options
& ~MT_ST_OPTIONS
) * ST_KILOBYTE
;
1764 if (value
< 1 || value
> st_buffer_size
) {
1765 printk(KERN_WARNING
"st%d: Write threshold %d too small or too large.\n",
1769 STp
->write_threshold
= value
;
1770 printk(KERN_INFO
"st%d: Write threshold set to %d bytes.\n",
1773 else if (code
== MT_ST_DEF_BLKSIZE
) {
1774 value
= (options
& ~MT_ST_OPTIONS
);
1775 if (value
== ~MT_ST_OPTIONS
) {
1776 STm
->default_blksize
= (-1);
1777 printk(KERN_INFO
"st%d: Default block size disabled.\n", dev
);
1780 STm
->default_blksize
= value
;
1781 printk(KERN_INFO
"st%d: Default block size set to %d bytes.\n",
1782 dev
, STm
->default_blksize
);
1785 else if (code
== MT_ST_TIMEOUTS
) {
1786 value
= (options
& ~MT_ST_OPTIONS
);
1787 if ((value
& MT_ST_SET_LONG_TIMEOUT
) != 0) {
1788 STp
->long_timeout
= (value
& ~MT_ST_SET_LONG_TIMEOUT
) * HZ
;
1789 printk(KERN_INFO
"st%d: Long timeout set to %d seconds.\n", dev
,
1790 (value
& ~MT_ST_SET_LONG_TIMEOUT
));
1793 STp
->timeout
= value
* HZ
;
1794 printk(KERN_INFO
"st%d: Normal timeout set to %d seconds.\n", dev
,
1798 else if (code
== MT_ST_DEF_OPTIONS
) {
1799 code
= (options
& ~MT_ST_CLEAR_DEFAULT
);
1800 value
= (options
& MT_ST_CLEAR_DEFAULT
);
1801 if (code
== MT_ST_DEF_DENSITY
) {
1802 if (value
== MT_ST_CLEAR_DEFAULT
) {
1803 STm
->default_density
= (-1);
1804 printk(KERN_INFO
"st%d: Density default disabled.\n", dev
);
1807 STm
->default_density
= value
& 0xff;
1808 printk(KERN_INFO
"st%d: Density default set to %x\n",
1809 dev
, STm
->default_density
);
1812 else if (code
== MT_ST_DEF_DRVBUFFER
) {
1813 if (value
== MT_ST_CLEAR_DEFAULT
) {
1814 STp
->default_drvbuffer
= 0xff;
1815 printk(KERN_INFO
"st%d: Drive buffer default disabled.\n", dev
);
1818 STp
->default_drvbuffer
= value
& 7;
1819 printk(KERN_INFO
"st%d: Drive buffer default set to %x\n",
1820 dev
, STp
->default_drvbuffer
);
1823 else if (code
== MT_ST_DEF_COMPRESSION
) {
1824 if (value
== MT_ST_CLEAR_DEFAULT
) {
1825 STm
->default_compression
= ST_DONT_TOUCH
;
1826 printk(KERN_INFO
"st%d: Compression default disabled.\n", dev
);
1829 STm
->default_compression
= (value
& 1 ? ST_YES
: ST_NO
);
1830 printk(KERN_INFO
"st%d: Compression default set to %x\n",
1842 #define COMPRESSION_PAGE 0x0f
1843 #define COMPRESSION_PAGE_LENGTH 16
1845 #define MODE_HEADER_LENGTH 4
1847 #define DCE_MASK 0x80
1848 #define DCC_MASK 0x40
1849 #define RED_MASK 0x60
1852 /* Control the compression with mode page 15. Algorithm not changed if zero. */
1854 st_compression(Scsi_Tape
* STp
, int state
)
1857 unsigned char cmd
[10];
1858 Scsi_Cmnd
* SCpnt
= NULL
;
1860 if (STp
->ready
!= ST_READY
)
1863 /* Read the current page contents */
1865 cmd
[0] = MODE_SENSE
;
1867 cmd
[2] = COMPRESSION_PAGE
;
1868 cmd
[4] = COMPRESSION_PAGE_LENGTH
+ MODE_HEADER_LENGTH
;
1870 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, cmd
[4], STp
->timeout
, 0);
1873 dev
= TAPE_NR(SCpnt
->request
.rq_dev
);
1875 if ((STp
->buffer
)->last_result_fatal
!= 0) {
1878 printk(ST_DEB_MSG
"st%d: Compression mode page not supported.\n", dev
);
1880 scsi_release_command(SCpnt
);
1886 printk(ST_DEB_MSG
"st%d: Compression state is %d.\n", dev
,
1887 ((STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+ 2] & DCE_MASK
? 1 : 0));
1890 /* Check if compression can be changed */
1891 if (((STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+ 2] & DCC_MASK
) == 0) {
1894 printk(ST_DEB_MSG
"st%d: Compression not supported.\n", dev
);
1896 scsi_release_command(SCpnt
);
1903 (STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+ 2] |= DCE_MASK
;
1905 (STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+ 2] &= ~DCE_MASK
;
1908 cmd
[0] = MODE_SELECT
;
1910 cmd
[4] = COMPRESSION_PAGE_LENGTH
+ MODE_HEADER_LENGTH
;
1912 (STp
->buffer
)->b_data
[0] = 0; /* Reserved data length */
1913 (STp
->buffer
)->b_data
[1] = 0; /* Reserved media type byte */
1914 (STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
] &= 0x3f;
1915 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, cmd
[4], STp
->timeout
, 0);
1917 if ((STp
->buffer
)->last_result_fatal
!= 0) {
1920 printk(ST_DEB_MSG
"st%d: Compression change failed.\n", dev
);
1922 scsi_release_command(SCpnt
);
1929 printk(ST_DEB_MSG
"st%d: Compression state changed to %d.\n",
1933 scsi_release_command(SCpnt
);
1935 STp
->compression_changed
= TRUE
;
1940 /* Internal ioctl function */
1942 st_int_ioctl(struct inode
* inode
,
1943 unsigned int cmd_in
, unsigned long arg
)
1947 int i
, ioctl_result
;
1949 unsigned char cmd
[10];
1953 int fileno
, blkno
, at_sm
, undone
, datalen
;
1954 int dev
= TAPE_NR(inode
->i_rdev
);
1956 STp
= &(scsi_tapes
[dev
]);
1957 if (STp
->ready
!= ST_READY
&& cmd_in
!= MTLOAD
) {
1958 if (STp
->ready
== ST_NO_TAPE
)
1959 return (-ENOMEDIUM
);
1963 timeout
= STp
->long_timeout
;
1964 STps
= &(STp
->ps
[STp
->partition
]);
1965 fileno
= STps
->drv_file
;
1966 blkno
= STps
->drv_block
;
1967 at_sm
= STps
->at_sm
;
1973 chg_eof
= FALSE
; /* Changed from the FSF after this */
1976 cmd
[1] = 0x01; /* Space FileMarks */
1977 cmd
[2] = (arg
>> 16);
1978 cmd
[3] = (arg
>> 8);
1982 printk(ST_DEB_MSG
"st%d: Spacing tape forward over %d filemarks.\n",
1983 dev
, cmd
[2] * 65536 + cmd
[3] * 256 + cmd
[4]);
1988 at_sm
&= (arg
== 0);
1991 chg_eof
= FALSE
; /* Changed from the FSF after this */
1994 cmd
[1] = 0x01; /* Space FileMarks */
1996 cmd
[2] = (ltmp
>> 16);
1997 cmd
[3] = (ltmp
>> 8);
2003 ltmp
= ltmp
| (cmd
[2] << 16) | (cmd
[3] << 8) | cmd
[4];
2004 printk(ST_DEB_MSG
"st%d: Spacing tape backward over %ld filemarks.\n",
2010 blkno
= (-1); /* We can't know the block number */
2011 at_sm
&= (arg
== 0);
2015 cmd
[1] = 0x00; /* Space Blocks */
2016 cmd
[2] = (arg
>> 16);
2017 cmd
[3] = (arg
>> 8);
2021 printk(ST_DEB_MSG
"st%d: Spacing tape forward %d blocks.\n", dev
,
2022 cmd
[2] * 65536 + cmd
[3] * 256 + cmd
[4]);
2026 at_sm
&= (arg
== 0);
2030 cmd
[1] = 0x00; /* Space Blocks */
2032 cmd
[2] = (ltmp
>> 16);
2033 cmd
[3] = (ltmp
>> 8);
2039 ltmp
= ltmp
| (cmd
[2] << 16) | (cmd
[3] << 8) | cmd
[4];
2040 printk(ST_DEB_MSG
"st%d: Spacing tape backward %ld blocks.\n", dev
, (-ltmp
));
2045 at_sm
&= (arg
== 0);
2049 cmd
[1] = 0x04; /* Space Setmarks */
2050 cmd
[2] = (arg
>> 16);
2051 cmd
[3] = (arg
>> 8);
2055 printk(ST_DEB_MSG
"st%d: Spacing tape forward %d setmarks.\n", dev
,
2056 cmd
[2] * 65536 + cmd
[3] * 256 + cmd
[4]);
2059 blkno
= fileno
= (-1);
2065 cmd
[1] = 0x04; /* Space Setmarks */
2067 cmd
[2] = (ltmp
>> 16);
2068 cmd
[3] = (ltmp
>> 8);
2074 ltmp
= ltmp
| (cmd
[2] << 16) | (cmd
[3] << 8) | cmd
[4];
2075 printk(ST_DEB_MSG
"st%d: Spacing tape backward %ld setmarks.\n",
2080 blkno
= fileno
= (-1);
2086 if (STp
->write_prot
)
2088 cmd
[0] = WRITE_FILEMARKS
;
2089 if (cmd_in
== MTWSM
)
2091 cmd
[2] = (arg
>> 16);
2092 cmd
[3] = (arg
>> 8);
2094 timeout
= STp
->timeout
;
2097 if (cmd_in
== MTWEOF
)
2098 printk(ST_DEB_MSG
"st%d: Writing %d filemarks.\n", dev
,
2099 cmd
[2] * 65536 + cmd
[3] * 256 + cmd
[4]);
2101 printk(ST_DEB_MSG
"st%d: Writing %d setmarks.\n", dev
,
2102 cmd
[2] * 65536 + cmd
[3] * 256 + cmd
[4]);
2108 at_sm
= (cmd_in
== MTWSM
);
2111 cmd
[0] = REZERO_UNIT
;
2113 cmd
[1] = 1; /* Don't wait for completion */
2114 timeout
= STp
->timeout
;
2118 printk(ST_DEB_MSG
"st%d: Rewinding tape.\n", dev
);
2120 fileno
= blkno
= at_sm
= 0 ;
2125 cmd
[0] = START_STOP
;
2126 if (cmd_in
== MTLOAD
)
2129 * If arg >= 1 && arg <= 6 Enhanced load/unload in HP C1553A
2131 if (cmd_in
!= MTOFFL
&&
2132 arg
>= 1 + MT_ST_HPLOADER_OFFSET
2133 && arg
<= 6 + MT_ST_HPLOADER_OFFSET
) {
2136 printk(ST_DEB_MSG
"st%d: Enhanced %sload slot %2ld.\n",
2137 dev
, (cmd
[4]) ? "" : "un",
2138 arg
- MT_ST_HPLOADER_OFFSET
);
2141 cmd
[3] = arg
- MT_ST_HPLOADER_OFFSET
; /* MediaID field of C1553A */
2144 cmd
[1] = 1; /* Don't wait for completion */
2145 timeout
= STp
->timeout
;
2147 timeout
= STp
->long_timeout
;
2151 if (cmd_in
!= MTLOAD
)
2152 printk(ST_DEB_MSG
"st%d: Unloading tape.\n", dev
);
2154 printk(ST_DEB_MSG
"st%d: Loading tape.\n", dev
);
2157 fileno
= blkno
= at_sm
= 0 ;
2162 printk(ST_DEB_MSG
"st%d: No op on tape.\n", dev
);
2164 return 0; /* Should do something ? */
2167 cmd
[0] = START_STOP
;
2169 cmd
[1] = 1; /* Don't wait for completion */
2170 timeout
= STp
->timeout
;
2175 printk(ST_DEB_MSG
"st%d: Retensioning tape.\n", dev
);
2177 fileno
= blkno
= at_sm
= 0;
2180 if (!STp
->fast_mteom
) {
2181 /* space to the end of tape */
2182 ioctl_result
= st_int_ioctl(inode
, MTFSF
, 0x3fff);
2183 fileno
= STps
->drv_file
;
2184 if (STps
->eof
>= ST_EOD_1
)
2186 /* The next lines would hide the number of spaced FileMarks
2187 That's why I inserted the previous lines. I had no luck
2188 with detecting EOM with FSF, so we go now to EOM.
2197 printk(ST_DEB_MSG
"st%d: Spacing to end of recorded medium.\n", dev
);
2203 if (STp
->write_prot
)
2206 cmd
[1] = 1; /* To the end of tape */
2208 cmd
[1] |= 2; /* Don't wait for completion */
2209 timeout
= STp
->timeout
;
2211 timeout
= STp
->long_timeout
* 8;
2215 printk(ST_DEB_MSG
"st%d: Erasing tape.\n", dev
);
2217 fileno
= blkno
= at_sm
= 0 ;
2221 cmd
[0] = ALLOW_MEDIUM_REMOVAL
;
2222 cmd
[4] = SCSI_REMOVAL_PREVENT
;
2225 printk(ST_DEB_MSG
"st%d: Locking drive door.\n", dev
);
2230 cmd
[0] = ALLOW_MEDIUM_REMOVAL
;
2231 cmd
[4] = SCSI_REMOVAL_ALLOW
;
2234 printk(ST_DEB_MSG
"st%d: Unlocking drive door.\n", dev
);
2237 case MTSETBLK
: /* Set block length */
2238 case MTSETDENSITY
: /* Set tape density */
2239 case MTSETDRVBUFFER
: /* Set drive buffering */
2240 case SET_DENS_AND_BLK
: /* Set density and block size */
2242 if (STp
->dirty
|| (STp
->buffer
)->buffer_bytes
!= 0)
2243 return (-EIO
); /* Not allowed if data in buffer */
2244 if ((cmd_in
== MTSETBLK
|| cmd_in
== SET_DENS_AND_BLK
) &&
2245 (arg
& MT_ST_BLKSIZE_MASK
) != 0 &&
2246 ((arg
& MT_ST_BLKSIZE_MASK
) < STp
->min_block
||
2247 (arg
& MT_ST_BLKSIZE_MASK
) > STp
->max_block
||
2248 (arg
& MT_ST_BLKSIZE_MASK
) > st_buffer_size
)) {
2249 printk(KERN_WARNING
"st%d: Illegal block size.\n", dev
);
2252 cmd
[0] = MODE_SELECT
;
2253 cmd
[4] = datalen
= 12;
2255 memset((STp
->buffer
)->b_data
, 0, 12);
2256 if (cmd_in
== MTSETDRVBUFFER
)
2257 (STp
->buffer
)->b_data
[2] = (arg
& 7) << 4;
2259 (STp
->buffer
)->b_data
[2] =
2260 STp
->drv_buffer
<< 4;
2261 (STp
->buffer
)->b_data
[3] = 8; /* block descriptor length */
2262 if (cmd_in
== MTSETDENSITY
) {
2263 (STp
->buffer
)->b_data
[4] = arg
;
2264 STp
->density_changed
= TRUE
; /* At least we tried ;-) */
2266 else if (cmd_in
== SET_DENS_AND_BLK
)
2267 (STp
->buffer
)->b_data
[4] = arg
>> 24;
2269 (STp
->buffer
)->b_data
[4] = STp
->density
;
2270 if (cmd_in
== MTSETBLK
|| cmd_in
== SET_DENS_AND_BLK
) {
2271 ltmp
= arg
& MT_ST_BLKSIZE_MASK
;
2272 if (cmd_in
== MTSETBLK
)
2273 STp
->blksize_changed
= TRUE
; /* At least we tried ;-) */
2276 ltmp
= STp
->block_size
;
2277 (STp
->buffer
)->b_data
[9] = (ltmp
>> 16);
2278 (STp
->buffer
)->b_data
[10] = (ltmp
>> 8);
2279 (STp
->buffer
)->b_data
[11] = ltmp
;
2280 timeout
= STp
->timeout
;
2283 if (cmd_in
== MTSETBLK
|| cmd_in
== SET_DENS_AND_BLK
)
2284 printk(ST_DEB_MSG
"st%d: Setting block size to %d bytes.\n", dev
,
2285 (STp
->buffer
)->b_data
[9] * 65536 +
2286 (STp
->buffer
)->b_data
[10] * 256 +
2287 (STp
->buffer
)->b_data
[11]);
2288 if (cmd_in
== MTSETDENSITY
|| cmd_in
== SET_DENS_AND_BLK
)
2289 printk(ST_DEB_MSG
"st%d: Setting density code to %x.\n", dev
,
2290 (STp
->buffer
)->b_data
[4]);
2291 if (cmd_in
== MTSETDRVBUFFER
)
2292 printk(ST_DEB_MSG
"st%d: Setting drive buffer code to %d.\n", dev
,
2293 ((STp
->buffer
)->b_data
[2] >> 4) & 7);
2301 SCpnt
= st_do_scsi(NULL
, STp
, cmd
, datalen
, timeout
, MAX_RETRIES
);
2305 ioctl_result
= (STp
->buffer
)->last_result_fatal
;
2307 if (!ioctl_result
) { /* SCSI command successful */
2308 scsi_release_command(SCpnt
);
2310 STps
->drv_block
= blkno
;
2311 STps
->drv_file
= fileno
;
2312 STps
->at_sm
= at_sm
;
2314 if (cmd_in
== MTLOCK
)
2315 STp
->door_locked
= ST_LOCKED_EXPLICIT
;
2316 else if (cmd_in
== MTUNLOCK
)
2317 STp
->door_locked
= ST_UNLOCKED
;
2319 if (cmd_in
== MTBSFM
)
2320 ioctl_result
= st_int_ioctl(inode
, MTFSF
, 1);
2321 else if (cmd_in
== MTFSFM
)
2322 ioctl_result
= st_int_ioctl(inode
, MTBSF
, 1);
2324 if (cmd_in
== MTSETBLK
|| cmd_in
== SET_DENS_AND_BLK
) {
2325 STp
->block_size
= arg
& MT_ST_BLKSIZE_MASK
;
2326 if (STp
->block_size
!= 0)
2327 (STp
->buffer
)->buffer_blocks
=
2328 (STp
->buffer
)->buffer_size
/ STp
->block_size
;
2329 (STp
->buffer
)->buffer_bytes
= (STp
->buffer
)->read_pointer
= 0;
2330 if (cmd_in
== SET_DENS_AND_BLK
)
2331 STp
->density
= arg
>> MT_ST_DENSITY_SHIFT
;
2333 else if (cmd_in
== MTSETDRVBUFFER
)
2334 STp
->drv_buffer
= (arg
& 7);
2335 else if (cmd_in
== MTSETDENSITY
)
2338 if (cmd_in
== MTEOM
)
2340 else if (cmd_in
== MTFSF
)
2343 STps
->eof
= ST_NOEOF
;
2346 if (cmd_in
== MTOFFL
|| cmd_in
== MTUNLOAD
)
2347 STp
->rew_at_close
= 0;
2348 else if (cmd_in
== MTLOAD
) {
2349 STp
->rew_at_close
= (MINOR(inode
->i_rdev
) & 0x80) == 0;
2350 for (i
=0; i
< ST_NBR_PARTITIONS
; i
++) {
2351 STp
->ps
[i
].rw
= ST_IDLE
;
2352 STp
->ps
[i
].last_block_valid
= FALSE
;
2357 } else { /* SCSI command was not completely successful. Don't return
2358 from this block without releasing the SCSI command block! */
2360 if (SCpnt
->sense_buffer
[2] & 0x40) {
2361 if (cmd_in
!= MTBSF
&& cmd_in
!= MTBSFM
&&
2362 cmd_in
!= MTBSR
&& cmd_in
!= MTBSS
)
2363 STps
->eof
= ST_EOM_OK
;
2364 STps
->drv_block
= 0;
2368 (SCpnt
->sense_buffer
[3] << 24) +
2369 (SCpnt
->sense_buffer
[4] << 16) +
2370 (SCpnt
->sense_buffer
[5] << 8) +
2371 SCpnt
->sense_buffer
[6] );
2372 if (cmd_in
== MTWEOF
&&
2373 (SCpnt
->sense_buffer
[0] & 0x70) == 0x70 &&
2374 (SCpnt
->sense_buffer
[2] & 0x4f) == 0x40 &&
2375 ((SCpnt
->sense_buffer
[0] & 0x80) == 0 || undone
== 0)) {
2376 ioctl_result
= 0; /* EOF written succesfully at EOM */
2379 STps
->drv_file
= fileno
;
2380 STps
->eof
= ST_NOEOF
;
2382 else if ( (cmd_in
== MTFSF
) || (cmd_in
== MTFSFM
) ) {
2384 STps
->drv_file
= fileno
- undone
;
2386 STps
->drv_file
= fileno
;
2387 STps
->drv_block
= 0;
2388 STps
->eof
= ST_NOEOF
;
2390 else if ( (cmd_in
== MTBSF
) || (cmd_in
== MTBSFM
) ) {
2392 STps
->drv_file
= fileno
+ undone
;
2394 STps
->drv_file
= fileno
;
2395 STps
->drv_block
= 0;
2396 STps
->eof
= ST_NOEOF
;
2398 else if (cmd_in
== MTFSR
) {
2399 if (SCpnt
->sense_buffer
[2] & 0x80) { /* Hit filemark */
2400 if (STps
->drv_file
>= 0)
2402 STps
->drv_block
= 0;
2406 if (blkno
>= undone
)
2407 STps
->drv_block
= blkno
- undone
;
2409 STps
->drv_block
= (-1);
2410 STps
->eof
= ST_NOEOF
;
2413 else if (cmd_in
== MTBSR
) {
2414 if (SCpnt
->sense_buffer
[2] & 0x80) { /* Hit filemark */
2416 STps
->drv_block
= (-1);
2420 STps
->drv_block
= blkno
+ undone
;
2422 STps
->drv_block
= (-1);
2424 STps
->eof
= ST_NOEOF
;
2426 else if (cmd_in
== MTEOM
) {
2427 STps
->drv_file
= (-1);
2428 STps
->drv_block
= (-1);
2432 STps
->eof
= ST_NOEOF
;
2434 if ((SCpnt
->sense_buffer
[2] & 0x0f) == BLANK_CHECK
)
2437 if (cmd_in
== MTLOCK
)
2438 STp
->door_locked
= ST_LOCK_FAILS
;
2440 scsi_release_command(SCpnt
);
2444 return ioctl_result
;
2448 \f/* Get the tape position. If bt == 2, arg points into a kernel space mt_loc
2452 get_location(struct inode
* inode
, unsigned int *block
, int *partition
,
2456 int dev
= TAPE_NR(inode
->i_rdev
);
2458 unsigned char scmd
[10];
2461 STp
= &(scsi_tapes
[dev
]);
2462 if (STp
->ready
!= ST_READY
)
2465 memset (scmd
, 0, 10);
2466 if ((STp
->device
)->scsi_level
< SCSI_2
) {
2467 scmd
[0] = QFA_REQUEST_BLOCK
;
2471 scmd
[0] = READ_POSITION
;
2472 if (!logical
&& !STp
->scsi2_logical
)
2475 SCpnt
= st_do_scsi(NULL
, STp
, scmd
, 20, STp
->timeout
, MAX_READY_RETRIES
);
2479 if ((STp
->buffer
)->last_result_fatal
!= 0 ||
2480 (STp
->device
->scsi_level
>= SCSI_2
&&
2481 ((STp
->buffer
)->b_data
[0] & 4) != 0)) {
2482 *block
= *partition
= 0;
2485 printk(ST_DEB_MSG
"st%d: Can't read tape position.\n", dev
);
2491 if ((STp
->device
)->scsi_level
< SCSI_2
) {
2492 *block
= ((STp
->buffer
)->b_data
[0] << 16)
2493 + ((STp
->buffer
)->b_data
[1] << 8)
2494 + (STp
->buffer
)->b_data
[2];
2498 *block
= ((STp
->buffer
)->b_data
[4] << 24)
2499 + ((STp
->buffer
)->b_data
[5] << 16)
2500 + ((STp
->buffer
)->b_data
[6] << 8)
2501 + (STp
->buffer
)->b_data
[7];
2502 *partition
= (STp
->buffer
)->b_data
[1];
2503 if (((STp
->buffer
)->b_data
[0] & 0x80) &&
2504 (STp
->buffer
)->b_data
[1] == 0) /* BOP of partition 0 */
2505 STp
->ps
[0].drv_block
= STp
->ps
[0].drv_file
= 0;
2509 printk(ST_DEB_MSG
"st%d: Got tape pos. blk %d part %d.\n", dev
,
2510 *block
, *partition
);
2514 scsi_release_command(SCpnt
);
2521 /* Set the tape block and partition. Negative partition means that only the
2522 block should be set in vendor specific way. */
2524 set_location(struct inode
* inode
, unsigned int block
, int partition
,
2529 int dev
= TAPE_NR(inode
->i_rdev
);
2533 unsigned char scmd
[10];
2536 STp
= &(scsi_tapes
[dev
]);
2537 if (STp
->ready
!= ST_READY
)
2539 timeout
= STp
->long_timeout
;
2540 STps
= &(STp
->ps
[STp
->partition
]);
2544 printk(ST_DEB_MSG
"st%d: Setting block to %d and partition to %d.\n",
2545 dev
, block
, partition
);
2550 /* Update the location at the partition we are leaving */
2551 if ((!STp
->can_partitions
&& partition
!= 0) ||
2552 partition
>= ST_NBR_PARTITIONS
)
2554 if (partition
!= STp
->partition
) {
2555 if (get_location(inode
, &blk
, &p
, 1))
2556 STps
->last_block_valid
= FALSE
;
2558 STps
->last_block_valid
= TRUE
;
2559 STps
->last_block_visited
= blk
;
2562 printk(ST_DEB_MSG
"st%d: Visited block %d for partition %d saved.\n",
2563 dev
, blk
, STp
->partition
);
2568 memset (scmd
, 0, 10);
2569 if ((STp
->device
)->scsi_level
< SCSI_2
) {
2570 scmd
[0] = QFA_SEEK_BLOCK
;
2571 scmd
[2] = (block
>> 16);
2572 scmd
[3] = (block
>> 8);
2578 scmd
[3] = (block
>> 24);
2579 scmd
[4] = (block
>> 16);
2580 scmd
[5] = (block
>> 8);
2582 if (!logical
&& !STp
->scsi2_logical
)
2584 if (STp
->partition
!= partition
) {
2586 scmd
[8] = partition
;
2589 printk(ST_DEB_MSG
"st%d: Trying to change partition from %d to %d\n",
2590 dev
, STp
->partition
, partition
);
2595 scmd
[1] |= 1; /* Don't wait for completion */
2596 timeout
= STp
->timeout
;
2599 SCpnt
= st_do_scsi(NULL
, STp
, scmd
, 20, timeout
, MAX_READY_RETRIES
);
2603 STps
->drv_block
= STps
->drv_file
= (-1);
2604 STps
->eof
= ST_NOEOF
;
2605 if ((STp
->buffer
)->last_result_fatal
!= 0) {
2607 if (STp
->can_partitions
&&
2608 (STp
->device
)->scsi_level
>= SCSI_2
&&
2609 (p
= find_partition(inode
)) >= 0)
2613 if (STp
->can_partitions
) {
2614 STp
->partition
= partition
;
2615 STps
= &(STp
->ps
[partition
]);
2616 if (!STps
->last_block_valid
||
2617 STps
->last_block_visited
!= block
) {
2625 STps
->drv_block
= STps
->drv_file
= 0;
2629 scsi_release_command(SCpnt
);
2636 /* Find the current partition number for the drive status. Called from open and
2637 returns either partition number of negative error code. */
2639 find_partition(struct inode
*inode
)
2644 if ((i
= get_location(inode
, &block
, &partition
, 1)) < 0)
2646 if (partition
>= ST_NBR_PARTITIONS
)
2652 /* Change the partition if necessary */
2654 update_partition(struct inode
* inode
)
2656 int dev
= TAPE_NR(inode
->i_rdev
);
2660 STp
= &(scsi_tapes
[dev
]);
2661 if (STp
->partition
== STp
->new_partition
)
2663 STps
= &(STp
->ps
[STp
->new_partition
]);
2664 if (!STps
->last_block_valid
)
2665 STps
->last_block_visited
= 0;
2666 return set_location(inode
, STps
->last_block_visited
, STp
->new_partition
, 1);
2669 \f/* Functions for reading and writing the medium partition mode page. These
2670 seem to work with Wangtek 6200HS and HP C1533A. */
2672 #define PART_PAGE 0x11
2673 #define PART_PAGE_LENGTH 10
2675 /* Get the number of partitions on the tape. As a side effect reads the
2676 mode page into the tape buffer. */
2678 nbr_partitions(struct inode
* inode
)
2680 int dev
= TAPE_NR(inode
->i_rdev
), result
;
2682 Scsi_Cmnd
* SCpnt
= NULL
;
2683 unsigned char cmd
[10];
2685 STp
= &(scsi_tapes
[dev
]);
2686 if (STp
->ready
!= ST_READY
)
2689 memset ((void *) &cmd
[0], 0, 10);
2690 cmd
[0] = MODE_SENSE
;
2691 cmd
[1] = 8; /* Page format */
2695 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, 200, STp
->timeout
, MAX_READY_RETRIES
);
2698 scsi_release_command(SCpnt
);
2701 if ((STp
->buffer
)->last_result_fatal
!= 0) {
2704 printk(ST_DEB_MSG
"st%d: Can't read medium partition page.\n", dev
);
2709 result
= (STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+ 3] + 1;
2712 printk(ST_DEB_MSG
"st%d: Number of partitions %d.\n", dev
, result
);
2720 /* Partition the tape into two partitions if size > 0 or one partition if
2723 partition_tape(struct inode
* inode
, int size
)
2725 int dev
= TAPE_NR(inode
->i_rdev
), result
;
2728 Scsi_Cmnd
* SCpnt
= NULL
;
2729 unsigned char cmd
[10], *bp
;
2731 if ((result
= nbr_partitions(inode
)) < 0)
2733 STp
= &(scsi_tapes
[dev
]);
2735 /* The mode page is in the buffer. Let's modify it and write it. */
2736 bp
= &((STp
->buffer
)->b_data
[0]);
2739 bp
[MODE_HEADER_LENGTH
+ 3] = 0;
2742 printk(ST_DEB_MSG
"st%d: Formatting tape with one partition.\n", dev
);
2747 bp
[MODE_HEADER_LENGTH
+ 3] = 1;
2748 bp
[MODE_HEADER_LENGTH
+ 8] = (size
>> 8) & 0xff;
2749 bp
[MODE_HEADER_LENGTH
+ 9] = size
& 0xff;
2752 printk(ST_DEB_MSG
"st%d: Formatting tape with two partition (1 = %d MB).\n",
2756 bp
[MODE_HEADER_LENGTH
+ 6] = 0;
2757 bp
[MODE_HEADER_LENGTH
+ 7] = 0;
2758 bp
[MODE_HEADER_LENGTH
+ 4] = 0x30; /* IDP | PSUM = MB */
2762 bp
[MODE_HEADER_LENGTH
] &= 0x3f;
2763 bp
[MODE_HEADER_LENGTH
+ 1] = length
- 2;
2766 cmd
[0] = MODE_SELECT
;
2768 cmd
[4] = length
+ MODE_HEADER_LENGTH
;
2770 SCpnt
= st_do_scsi(SCpnt
, STp
, cmd
, cmd
[4], STp
->long_timeout
, MAX_READY_RETRIES
);
2773 scsi_release_command(SCpnt
);
2776 if ((STp
->buffer
)->last_result_fatal
!= 0) {
2777 printk(KERN_INFO
"st%d: Partitioning of tape failed.\n", dev
);
2788 /* The ioctl command */
2790 st_ioctl(struct inode
* inode
,struct file
* file
,
2791 unsigned int cmd_in
, unsigned long arg
)
2793 int i
, cmd_nr
, cmd_type
, bt
;
2796 struct mtpos mt_pos
;
2800 int dev
= TAPE_NR(inode
->i_rdev
);
2802 STp
= &(scsi_tapes
[dev
]);
2804 if (debugging
&& !STp
->in_use
) {
2805 printk(ST_DEB_MSG
"st%d: Incorrect device.\n", dev
);
2809 STm
= &(STp
->modes
[STp
->current_mode
]);
2810 STps
= &(STp
->ps
[STp
->partition
]);
2813 * If we are in the middle of error recovery, don't let anyone
2814 * else try and use this device. Also, if error recovery fails, it
2815 * may try and take the device offline, in which case all further
2816 * access to the device is prohibited.
2818 if( !scsi_block_when_processing_errors(STp
->device
) )
2823 cmd_type
= _IOC_TYPE(cmd_in
);
2824 cmd_nr
= _IOC_NR(cmd_in
);
2826 if (cmd_type
== _IOC_TYPE(MTIOCTOP
) && cmd_nr
== _IOC_NR(MTIOCTOP
)) {
2827 if (_IOC_SIZE(cmd_in
) != sizeof(mtc
))
2830 i
= copy_from_user((char *) &mtc
, (char *)arg
, sizeof(struct mtop
));
2834 if (mtc
.mt_op
== MTSETDRVBUFFER
&& !capable(CAP_SYS_ADMIN
)) {
2835 printk(KERN_WARNING
"st%d: MTSETDRVBUFFER only allowed for root.\n", dev
);
2838 if (!STm
->defined
&&
2839 (mtc
.mt_op
!= MTSETDRVBUFFER
&& (mtc
.mt_count
& MT_ST_OPTIONS
) == 0))
2842 if (!(STp
->device
)->was_reset
) {
2844 if (STps
->eof
== ST_FM_HIT
) {
2845 if (mtc
.mt_op
== MTFSF
|| mtc
.mt_op
== MTFSFM
|| mtc
.mt_op
== MTEOM
) {
2847 if (STps
->drv_file
>= 0)
2848 STps
->drv_file
+= 1;
2850 else if (mtc
.mt_op
== MTBSF
|| mtc
.mt_op
== MTBSFM
) {
2852 if (STps
->drv_file
>= 0)
2853 STps
->drv_file
+= 1;
2857 if (mtc
.mt_op
== MTSEEK
) {
2858 /* Old position must be restored if partition will be changed */
2859 i
= !STp
->can_partitions
||
2860 (STp
->new_partition
!= STp
->partition
);
2863 i
= mtc
.mt_op
== MTREW
|| mtc
.mt_op
== MTOFFL
||
2864 mtc
.mt_op
== MTRETEN
|| mtc
.mt_op
== MTEOM
||
2865 mtc
.mt_op
== MTLOCK
|| mtc
.mt_op
== MTLOAD
||
2866 mtc
.mt_op
== MTCOMPRESSION
;
2868 i
= flush_buffer(inode
, file
, i
);
2874 * If there was a bus reset, block further access
2875 * to this device. If the user wants to rewind the tape,
2876 * then reset the flag and allow access again.
2878 if(mtc
.mt_op
!= MTREW
&&
2879 mtc
.mt_op
!= MTOFFL
&&
2880 mtc
.mt_op
!= MTRETEN
&&
2881 mtc
.mt_op
!= MTERASE
&&
2882 mtc
.mt_op
!= MTSEEK
&&
2885 STp
->device
->was_reset
= 0;
2886 if (STp
->door_locked
!= ST_UNLOCKED
&&
2887 STp
->door_locked
!= ST_LOCK_FAILS
) {
2888 if (st_int_ioctl(inode
, MTLOCK
, 0)) {
2889 printk(KERN_NOTICE
"st%d: Could not relock door after bus reset.\n",
2891 STp
->door_locked
= ST_UNLOCKED
;
2896 if (mtc
.mt_op
!= MTNOP
&& mtc
.mt_op
!= MTSETBLK
&&
2897 mtc
.mt_op
!= MTSETDENSITY
&& mtc
.mt_op
!= MTWSM
&&
2898 mtc
.mt_op
!= MTSETDRVBUFFER
&& mtc
.mt_op
!= MTSETPART
)
2899 STps
->rw
= ST_IDLE
; /* Prevent automatic WEOF and fsf */
2901 if (mtc
.mt_op
== MTOFFL
&& STp
->door_locked
!= ST_UNLOCKED
)
2902 st_int_ioctl(inode
, MTUNLOCK
, 0); /* Ignore result! */
2904 if (mtc
.mt_op
== MTSETDRVBUFFER
&&
2905 (mtc
.mt_count
& MT_ST_OPTIONS
) != 0)
2906 return st_set_options(inode
, mtc
.mt_count
);
2907 if (mtc
.mt_op
== MTSETPART
) {
2908 if (!STp
->can_partitions
||
2909 mtc
.mt_count
< 0 || mtc
.mt_count
>= ST_NBR_PARTITIONS
)
2911 if (mtc
.mt_count
>= STp
->nbr_partitions
&&
2912 (STp
->nbr_partitions
= nbr_partitions(inode
)) < 0)
2914 if (mtc
.mt_count
>= STp
->nbr_partitions
)
2916 STp
->new_partition
= mtc
.mt_count
;
2919 if (mtc
.mt_op
== MTMKPART
) {
2920 if (!STp
->can_partitions
)
2922 if ((i
= st_int_ioctl(inode
, MTREW
, 0)) < 0 ||
2923 (i
= partition_tape(inode
, mtc
.mt_count
)) < 0)
2925 for (i
=0; i
< ST_NBR_PARTITIONS
; i
++) {
2926 STp
->ps
[i
].rw
= ST_IDLE
;
2927 STp
->ps
[i
].at_sm
= 0;
2928 STp
->ps
[i
].last_block_valid
= FALSE
;
2930 STp
->partition
= STp
->new_partition
= 0;
2931 STp
->nbr_partitions
= 1; /* Bad guess ?-) */
2932 STps
->drv_block
= STps
->drv_file
= 0;
2935 if (mtc
.mt_op
== MTSEEK
) {
2936 i
= set_location(inode
, mtc
.mt_count
, STp
->new_partition
, 0);
2937 if (!STp
->can_partitions
)
2938 STp
->ps
[0].rw
= ST_IDLE
;
2941 if (STp
->can_partitions
&& STp
->ready
== ST_READY
&&
2942 (i
= update_partition(inode
)) < 0)
2944 if (mtc
.mt_op
== MTCOMPRESSION
)
2945 return st_compression(STp
, (mtc
.mt_count
& 1));
2947 return st_int_ioctl(inode
, mtc
.mt_op
, mtc
.mt_count
);
2953 if ((i
= flush_buffer(inode
, file
, FALSE
)) < 0)
2955 if (STp
->can_partitions
&&
2956 (i
= update_partition(inode
)) < 0)
2959 if (cmd_type
== _IOC_TYPE(MTIOCGET
) && cmd_nr
== _IOC_NR(MTIOCGET
)) {
2961 if (_IOC_SIZE(cmd_in
) != sizeof(struct mtget
))
2964 (STp
->mt_status
)->mt_dsreg
=
2965 ((STp
->block_size
<< MT_ST_BLKSIZE_SHIFT
) & MT_ST_BLKSIZE_MASK
) |
2966 ((STp
->density
<< MT_ST_DENSITY_SHIFT
) & MT_ST_DENSITY_MASK
);
2967 (STp
->mt_status
)->mt_blkno
= STps
->drv_block
;
2968 (STp
->mt_status
)->mt_fileno
= STps
->drv_file
;
2969 if (STp
->block_size
!= 0) {
2970 if (STps
->rw
== ST_WRITING
)
2971 (STp
->mt_status
)->mt_blkno
+=
2972 (STp
->buffer
)->buffer_bytes
/ STp
->block_size
;
2973 else if (STps
->rw
== ST_READING
)
2974 (STp
->mt_status
)->mt_blkno
-= ((STp
->buffer
)->buffer_bytes
+
2975 STp
->block_size
- 1) / STp
->block_size
;
2978 (STp
->mt_status
)->mt_gstat
= 0;
2979 if (STp
->drv_write_prot
)
2980 (STp
->mt_status
)->mt_gstat
|= GMT_WR_PROT(0xffffffff);
2981 if ((STp
->mt_status
)->mt_blkno
== 0) {
2982 if ((STp
->mt_status
)->mt_fileno
== 0)
2983 (STp
->mt_status
)->mt_gstat
|= GMT_BOT(0xffffffff);
2985 (STp
->mt_status
)->mt_gstat
|= GMT_EOF(0xffffffff);
2987 (STp
->mt_status
)->mt_resid
= STp
->partition
;
2988 if (STps
->eof
== ST_EOM_OK
|| STps
->eof
== ST_EOM_ERROR
)
2989 (STp
->mt_status
)->mt_gstat
|= GMT_EOT(0xffffffff);
2990 else if (STps
->eof
>= ST_EOM_OK
)
2991 (STp
->mt_status
)->mt_gstat
|= GMT_EOD(0xffffffff);
2992 if (STp
->density
== 1)
2993 (STp
->mt_status
)->mt_gstat
|= GMT_D_800(0xffffffff);
2994 else if (STp
->density
== 2)
2995 (STp
->mt_status
)->mt_gstat
|= GMT_D_1600(0xffffffff);
2996 else if (STp
->density
== 3)
2997 (STp
->mt_status
)->mt_gstat
|= GMT_D_6250(0xffffffff);
2998 if (STp
->ready
== ST_READY
)
2999 (STp
->mt_status
)->mt_gstat
|= GMT_ONLINE(0xffffffff);
3000 if (STp
->ready
== ST_NO_TAPE
)
3001 (STp
->mt_status
)->mt_gstat
|= GMT_DR_OPEN(0xffffffff);
3003 (STp
->mt_status
)->mt_gstat
|= GMT_SM(0xffffffff);
3004 if (STm
->do_async_writes
|| (STm
->do_buffer_writes
&& STp
->block_size
!= 0) ||
3005 STp
->drv_buffer
!= 0)
3006 (STp
->mt_status
)->mt_gstat
|= GMT_IM_REP_EN(0xffffffff);
3008 i
= copy_to_user((char *)arg
, (char *)(STp
->mt_status
),
3009 sizeof(struct mtget
));
3013 (STp
->mt_status
)->mt_erreg
= 0; /* Clear after read */
3015 } /* End of MTIOCGET */
3017 if (cmd_type
== _IOC_TYPE(MTIOCPOS
) && cmd_nr
== _IOC_NR(MTIOCPOS
)) {
3018 if (_IOC_SIZE(cmd_in
) != sizeof(struct mtpos
))
3020 if ((i
= get_location(inode
, &blk
, &bt
, 0)) < 0)
3022 mt_pos
.mt_blkno
= blk
;
3023 i
= copy_to_user((char *)arg
, (char *) (&mt_pos
), sizeof(struct mtpos
));
3029 return scsi_ioctl(STp
->device
, cmd_in
, (void *) arg
);
3033 /* Try to allocate a new tape buffer */
3035 new_tape_buffer( int from_initialization
, int need_dma
)
3037 int priority
, a_size
;
3040 if (st_nbr_buffers
>= st_template
.dev_max
)
3041 return NULL
; /* Should never happen */
3043 if (from_initialization
) {
3044 priority
= GFP_ATOMIC
;
3045 a_size
= st_buffer_size
;
3048 priority
= GFP_KERNEL
;
3049 for (a_size
= PAGE_SIZE
; a_size
< st_buffer_size
; a_size
<<= 1)
3050 ; /* Make sure we allocate efficiently */
3052 tb
= (ST_buffer
*)scsi_init_malloc(sizeof(ST_buffer
), priority
);
3055 priority
|= GFP_DMA
;
3056 tb
->b_data
= (unsigned char *)scsi_init_malloc(a_size
, priority
);
3058 scsi_init_free((char *)tb
, sizeof(ST_buffer
));
3063 printk(KERN_NOTICE
"st: Can't allocate new tape buffer (nbr %d).\n",
3070 "st: Allocated tape buffer %d (%d bytes, dma: %d, a: %p).\n",
3071 st_nbr_buffers
, a_size
, need_dma
, tb
->b_data
);
3075 tb
->buffer_size
= a_size
;
3077 tb
->orig_b_data
= NULL
;
3078 st_buffers
[st_nbr_buffers
++] = tb
;
3083 /* Try to allocate a temporary enlarged tape buffer */
3085 enlarge_buffer(ST_buffer
*STbuffer
, int new_size
, int need_dma
)
3087 int a_size
, priority
;
3090 normalize_buffer(STbuffer
);
3092 for (a_size
= PAGE_SIZE
; a_size
< new_size
; a_size
<<= 1)
3093 ; /* Make sure that we allocate efficiently */
3095 priority
= GFP_KERNEL
;
3097 priority
|= GFP_DMA
;
3098 tbd
= (unsigned char *)scsi_init_malloc(a_size
, priority
);
3104 "st: Buffer at %p enlarged to %d bytes (dma: %d, a: %p).\n",
3105 STbuffer
->b_data
, a_size
, need_dma
, tbd
);
3108 STbuffer
->orig_b_data
= STbuffer
->b_data
;
3109 STbuffer
->orig_size
= STbuffer
->buffer_size
;
3110 STbuffer
->b_data
= tbd
;
3111 STbuffer
->buffer_size
= a_size
;
3116 /* Release the extra buffer */
3118 normalize_buffer(ST_buffer
*STbuffer
)
3120 if (STbuffer
->orig_b_data
== NULL
)
3123 scsi_init_free(STbuffer
->b_data
, STbuffer
->buffer_size
);
3124 STbuffer
->b_data
= STbuffer
->orig_b_data
;
3125 STbuffer
->orig_b_data
= NULL
;
3126 STbuffer
->buffer_size
= STbuffer
->orig_size
;
3130 printk(ST_DEB_MSG
"st: Buffer at %p normalized to %d bytes.\n",
3131 STbuffer
->b_data
, STbuffer
->buffer_size
);
3137 /* Set the boot options. Syntax: st=xxx,yyy
3138 where xxx is buffer size in 1024 byte blocks and yyy is write threshold
3139 in 1024 byte blocks. */
3141 st_setup(char *str
, int *ints
))
3143 if (ints
[0] > 0 && ints
[1] > 0)
3144 st_buffer_size
= ints
[1] * ST_KILOBYTE
;
3145 if (ints
[0] > 1 && ints
[2] > 0) {
3146 st_write_threshold
= ints
[2] * ST_KILOBYTE
;
3147 if (st_write_threshold
> st_buffer_size
)
3148 st_write_threshold
= st_buffer_size
;
3150 if (ints
[0] > 2 && ints
[3] > 0)
3151 st_max_buffers
= ints
[3];
3156 static struct file_operations st_fops
= {
3157 NULL
, /* lseek - default */
3158 st_read
, /* read - general block-dev read */
3159 st_write
, /* write - general block-dev write */
3160 NULL
, /* readdir - bad */
3162 st_ioctl
, /* ioctl */
3164 scsi_tape_open
, /* open */
3166 scsi_tape_close
, /* release */
3170 static int st_attach(Scsi_Device
* SDp
){
3176 if(SDp
->type
!= TYPE_TAPE
) return 1;
3178 if(st_template
.nr_dev
>= st_template
.dev_max
)
3184 for(tpnt
= scsi_tapes
, i
=0; i
<st_template
.dev_max
; i
++, tpnt
++)
3185 if(!tpnt
->device
) break;
3187 if(i
>= st_template
.dev_max
) panic ("scsi_devices corrupt (st)");
3189 scsi_tapes
[i
].device
= SDp
;
3190 if (SDp
->scsi_level
<= 2)
3191 scsi_tapes
[i
].mt_status
->mt_type
= MT_ISSCSI1
;
3193 scsi_tapes
[i
].mt_status
->mt_type
= MT_ISSCSI2
;
3195 tpnt
->devt
= MKDEV(SCSI_TAPE_MAJOR
, i
);
3197 tpnt
->waiting
= NULL
;
3199 tpnt
->drv_buffer
= 1; /* Try buffering if no mode sense */
3200 tpnt
->restr_dma
= (SDp
->host
)->unchecked_isa_dma
;
3202 tpnt
->do_auto_lock
= ST_AUTO_LOCK
;
3203 tpnt
->can_bsr
= ST_IN_FILE_POS
;
3204 tpnt
->can_partitions
= 0;
3205 tpnt
->two_fm
= ST_TWO_FM
;
3206 tpnt
->fast_mteom
= ST_FAST_MTEOM
;
3207 tpnt
->scsi2_logical
= ST_SCSI2LOGICAL
;
3208 tpnt
->write_threshold
= st_write_threshold
;
3209 tpnt
->default_drvbuffer
= 0xff; /* No forced buffering */
3210 tpnt
->partition
= 0;
3211 tpnt
->new_partition
= 0;
3212 tpnt
->nbr_partitions
= 0;
3213 tpnt
->timeout
= ST_TIMEOUT
;
3214 tpnt
->long_timeout
= ST_LONG_TIMEOUT
;
3216 for (i
=0; i
< ST_NBR_MODES
; i
++) {
3217 STm
= &(tpnt
->modes
[i
]);
3218 STm
->defined
= FALSE
;
3219 STm
->sysv
= ST_SYSV
;
3220 STm
->defaults_for_writes
= 0;
3221 STm
->do_async_writes
= ST_ASYNC_WRITES
;
3222 STm
->do_buffer_writes
= ST_BUFFER_WRITES
;
3223 STm
->do_read_ahead
= ST_READ_AHEAD
;
3224 STm
->default_compression
= ST_DONT_TOUCH
;
3225 STm
->default_blksize
= (-1); /* No forced size */
3226 STm
->default_density
= (-1); /* No forced density */
3229 for (i
=0; i
< ST_NBR_PARTITIONS
; i
++) {
3230 STps
= &(tpnt
->ps
[i
]);
3232 STps
->eof
= ST_NOEOF
;
3234 STps
->last_block_valid
= FALSE
;
3235 STps
->drv_block
= 0;
3239 tpnt
->current_mode
= 0;
3240 tpnt
->modes
[0].defined
= TRUE
;
3242 tpnt
->density_changed
= tpnt
->compression_changed
=
3243 tpnt
->blksize_changed
= FALSE
;
3245 st_template
.nr_dev
++;
3249 static int st_detect(Scsi_Device
* SDp
)
3251 if(SDp
->type
!= TYPE_TAPE
) return 0;
3254 "Detected scsi tape st%d at scsi%d, channel %d, id %d, lun %d\n",
3255 st_template
.dev_noticed
++,
3256 SDp
->host
->host_no
, SDp
->channel
, SDp
->id
, SDp
->lun
);
3261 static int st_registered
= 0;
3263 /* Driver initialization (not __initfunc because may be called later) */
3264 static int st_init()
3268 #if !ST_RUNTIME_BUFFERS
3272 if (st_template
.dev_noticed
== 0) return 0;
3274 if(!st_registered
) {
3275 if (register_chrdev(SCSI_TAPE_MAJOR
,"st",&st_fops
)) {
3276 printk(KERN_ERR
"Unable to get major %d for SCSI tapes\n",MAJOR_NR
);
3282 if (scsi_tapes
) return 0;
3283 st_template
.dev_max
= st_template
.dev_noticed
+ ST_EXTRA_DEVS
;
3284 if (st_template
.dev_max
< ST_MAX_TAPES
)
3285 st_template
.dev_max
= ST_MAX_TAPES
;
3286 if (st_template
.dev_max
> 128 / ST_NBR_MODES
)
3287 printk(KERN_INFO
"st: Only %d tapes accessible.\n", 128 / ST_NBR_MODES
);
3289 (Scsi_Tape
*) scsi_init_malloc(st_template
.dev_max
* sizeof(Scsi_Tape
),
3291 if (scsi_tapes
== NULL
) {
3292 printk(KERN_ERR
"Unable to allocate descriptors for SCSI tapes.\n");
3293 unregister_chrdev(SCSI_TAPE_MAJOR
, "st");
3298 printk(ST_DEB_MSG
"st: Buffer size %d bytes, write threshold %d bytes.\n",
3299 st_buffer_size
, st_write_threshold
);
3302 memset(scsi_tapes
, 0, st_template
.dev_max
* sizeof(Scsi_Tape
));
3303 for (i
=0; i
< st_template
.dev_max
; ++i
) {
3304 STp
= &(scsi_tapes
[i
]);
3305 STp
->capacity
= 0xfffff;
3306 STp
->mt_status
= (struct mtget
*) scsi_init_malloc(sizeof(struct mtget
),
3308 /* Initialize status */
3309 memset((void *) scsi_tapes
[i
].mt_status
, 0, sizeof(struct mtget
));
3312 /* Allocate the buffers */
3314 (ST_buffer
**) scsi_init_malloc(st_template
.dev_max
* sizeof(ST_buffer
*),
3316 if (st_buffers
== NULL
) {
3317 printk(KERN_ERR
"Unable to allocate tape buffer pointers.\n");
3318 unregister_chrdev(SCSI_TAPE_MAJOR
, "st");
3319 scsi_init_free((char *) scsi_tapes
,
3320 st_template
.dev_max
* sizeof(Scsi_Tape
));
3324 #if ST_RUNTIME_BUFFERS
3327 target_nbr
= st_template
.dev_noticed
;
3328 if (target_nbr
< ST_EXTRA_DEVS
)
3329 target_nbr
= ST_EXTRA_DEVS
;
3330 if (target_nbr
> st_max_buffers
)
3331 target_nbr
= st_max_buffers
;
3333 for (i
=st_nbr_buffers
=0; i
< target_nbr
; i
++) {
3334 if (!new_tape_buffer(TRUE
, TRUE
)) {
3337 printk(KERN_ERR
"Can't continue without at least one tape buffer.\n");
3338 unregister_chrdev(SCSI_TAPE_MAJOR
, "st");
3339 scsi_init_free((char *) st_buffers
,
3340 st_template
.dev_max
* sizeof(ST_buffer
*));
3341 scsi_init_free((char *) scsi_tapes
,
3342 st_template
.dev_max
* sizeof(Scsi_Tape
));
3345 printk(KERN_INFO
"No tape buffers allocated at initialization.\n");
3349 printk(KERN_INFO
"Number of tape buffers adjusted.\n");
3357 static void st_detach(Scsi_Device
* SDp
)
3362 for(tpnt
= scsi_tapes
, i
=0; i
<st_template
.dev_max
; i
++, tpnt
++)
3363 if(tpnt
->device
== SDp
) {
3364 tpnt
->device
= NULL
;
3366 st_template
.nr_dev
--;
3367 st_template
.dev_noticed
--;
3376 int init_module(void) {
3379 st_template
.module
= &__this_module
;
3380 result
= scsi_register_module(MODULE_SCSI_DEV
, &st_template
);
3385 st_buffer_size
= buffer_kbs
* ST_KILOBYTE
;
3386 if (write_threshold_kbs
> 0)
3387 st_write_threshold
= write_threshold_kbs
* ST_KILOBYTE
;
3388 if (st_write_threshold
> st_buffer_size
)
3389 st_write_threshold
= st_buffer_size
;
3390 if (max_buffers
> 0)
3391 st_max_buffers
= max_buffers
;
3392 printk(KERN_INFO
"st: bufsize %d, wrt %d, max buffers %d.\n",
3393 st_buffer_size
, st_write_threshold
, st_max_buffers
);
3398 void cleanup_module( void)
3402 scsi_unregister_module(MODULE_SCSI_DEV
, &st_template
);
3403 unregister_chrdev(SCSI_TAPE_MAJOR
, "st");
3405 if(scsi_tapes
!= NULL
) {
3406 scsi_init_free((char *) scsi_tapes
,
3407 st_template
.dev_max
* sizeof(Scsi_Tape
));
3409 if (st_buffers
!= NULL
) {
3410 for (i
=0; i
< st_nbr_buffers
; i
++)
3411 if (st_buffers
[i
] != NULL
) {
3412 scsi_init_free((char *) st_buffers
[i
]->b_data
,
3413 st_buffers
[i
]->buffer_size
);
3414 scsi_init_free((char *) st_buffers
[i
], sizeof(ST_buffer
));
3417 scsi_init_free((char *) st_buffers
,
3418 st_template
.dev_max
* sizeof(ST_buffer
*));
3421 st_template
.dev_max
= 0;
3422 printk(KERN_INFO
"st: Unloaded.\n");