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, Steve Hirsch, Wolfgang Denk, Andreas Koppenh"ofer, 9 J"org Weule, and Eric Youngdale. 11 Copyright 1992, 1993, 1994, 1995 Kai Makisara 12 email Kai.Makisara@metla.fi 14 Last modified: Sat Nov 4 22:23:54 1995 by root@kai.makisara.fi 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/string.h> 25 #include <linux/errno.h> 26 #include <linux/mtio.h> 27 #include <linux/ioctl.h> 28 #include <linux/fcntl.h> 29 #include <asm/segment.h> 31 #include <asm/system.h> 33 /* The driver prints some debugging information on the console if DEBUG 34 is defined and non-zero. */ 37 #define MAJOR_NR SCSI_TAPE_MAJOR 38 #include <linux/blk.h> 41 #include"scsi_ioctl.h" 45 /* The default definitions have been moved to st_options.h */ 47 #define ST_BLOCK_SIZE 1024 49 #include"st_options.h" 51 #define ST_BUFFER_SIZE (ST_BUFFER_BLOCKS * ST_BLOCK_SIZE) 52 #define ST_WRITE_THRESHOLD (ST_WRITE_THRESHOLD_BLOCKS * ST_BLOCK_SIZE) 54 /* The buffer size should fit into the 24 bits for length in the 55 6-byte SCSI read and write commands. */ 56 #if ST_BUFFER_SIZE >= (2 << 24 - 1) 57 #error"Buffer size should not exceed (2 << 24 - 1) bytes!" 61 static int debugging
=1; 65 #define MAX_WRITE_RETRIES 0 66 #define MAX_READY_RETRIES 5 67 #define NO_TAPE NOT_READY 69 #define ST_TIMEOUT (900 * HZ) 70 #define ST_LONG_TIMEOUT (2000 * HZ) 72 #define TAPE_NR(x) (MINOR(x) & 127) 74 static int st_nbr_buffers
; 75 static ST_buffer
**st_buffers
; 76 static int st_buffer_size
= ST_BUFFER_SIZE
; 77 static int st_write_threshold
= ST_WRITE_THRESHOLD
; 78 static int st_max_buffers
= ST_MAX_BUFFERS
; 80 Scsi_Tape
* scsi_tapes
= NULL
; 82 static ST_buffer
*new_tape_buffer(int); 83 static intenlarge_buffer(ST_buffer
*,int); 84 static voidnormalize_buffer(ST_buffer
*); 86 static intst_init(void); 87 static intst_attach(Scsi_Device
*); 88 static intst_detect(Scsi_Device
*); 89 static voidst_detach(Scsi_Device
*); 91 struct Scsi_Device_Template st_template
= {NULL
,"tape","st", NULL
, TYPE_TAPE
, 92 SCSI_TAPE_MAJOR
,0,0,0,0, 94 NULL
, st_attach
, st_detach
}; 96 static intst_int_ioctl(struct inode
* inode
,struct file
* file
, 97 unsigned int cmd_in
,unsigned long arg
); 102 /* Convert the result to success code */ 104 st_chk_result(Scsi_Cmnd
* SCpnt
) 106 int dev
=TAPE_NR(SCpnt
->request
.rq_dev
); 107 int result
= SCpnt
->result
; 108 unsigned char* sense
= SCpnt
->sense_buffer
, scode
; 113 if(!result
/* && SCpnt->sense_buffer[0] == 0 */) 117 printk("st%d: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", dev
, result
, 118 SCpnt
->data_cmnd
[0], SCpnt
->data_cmnd
[1], SCpnt
->data_cmnd
[2], 119 SCpnt
->data_cmnd
[3], SCpnt
->data_cmnd
[4], SCpnt
->data_cmnd
[5], 120 SCpnt
->request_bufflen
); 121 if(driver_byte(result
) & DRIVER_SENSE
) 122 print_sense("st", SCpnt
); 127 scode
= sense
[2] &0x0f; 128 if(!(driver_byte(result
) & DRIVER_SENSE
) || 129 ((sense
[0] &0x70) ==0x70&& 131 scode
!= RECOVERED_ERROR
&& 132 scode
!= UNIT_ATTENTION
&& 133 scode
!= BLANK_CHECK
&& 134 scode
!= VOLUME_OVERFLOW
&& 135 SCpnt
->data_cmnd
[0] != MODE_SENSE
)) {/* Abnormal conditions for tape */ 136 printk("st%d: Error %x. ", dev
, result
); 138 if(driver_byte(result
) & DRIVER_SENSE
) 139 print_sense("st", SCpnt
); 145 if((sense
[0] &0x70) ==0x70&& 146 scode
== RECOVERED_ERROR
147 #if ST_RECOVERED_WRITE_FATAL 148 && SCpnt
->data_cmnd
[0] != WRITE_6
149 && SCpnt
->data_cmnd
[0] != WRITE_FILEMARKS
152 scsi_tapes
[dev
].recover_count
++; 153 scsi_tapes
[dev
].mt_status
->mt_erreg
+= (1<< MT_ST_SOFTERR_SHIFT
); 155 if(debugging
) {/* This is compiled always on purpose */ 156 if(SCpnt
->data_cmnd
[0] == READ_6
) 158 else if(SCpnt
->data_cmnd
[0] == WRITE_6
) 162 printk("st%d: Recovered %s error (%d).\n", dev
, stp
, 163 scsi_tapes
[dev
].recover_count
); 172 /* Wakeup from interrupt */ 174 st_sleep_done(Scsi_Cmnd
* SCpnt
) 180 if((st_nbr
=TAPE_NR(SCpnt
->request
.rq_dev
)) < st_template
.nr_dev
) { 181 STp
= &(scsi_tapes
[st_nbr
]); 182 if((STp
->buffer
)->writing
&& 183 (SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 184 (SCpnt
->sense_buffer
[2] &0x40)) { 185 /* EOM at write-behind, has all been written? */ 186 if((SCpnt
->sense_buffer
[0] &0x80) !=0) 187 remainder
= (SCpnt
->sense_buffer
[3] <<24) | 188 (SCpnt
->sense_buffer
[4] <<16) | 189 (SCpnt
->sense_buffer
[5] <<8) | SCpnt
->sense_buffer
[6]; 192 if((SCpnt
->sense_buffer
[2] &0x0f) == VOLUME_OVERFLOW
|| 194 (STp
->buffer
)->last_result
= SCpnt
->result
;/* Error */ 196 (STp
->buffer
)->last_result
= INT_MAX
;/* OK */ 199 (STp
->buffer
)->last_result
= SCpnt
->result
; 200 if((STp
->buffer
)->writing
) { 201 /* Process errors before releasing request */ 202 (STp
->buffer
)->last_result_fatal
=st_chk_result(SCpnt
); 203 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 206 SCpnt
->request
.rq_status
= RQ_SCSI_DONE
; 209 STp
->write_pending
=0; 211 up(SCpnt
->request
.sem
); 215 printk("st?: Illegal interrupt device %x\n", st_nbr
); 220 /* Do the scsi command */ 222 st_do_scsi(Scsi_Cmnd
*SCpnt
, Scsi_Tape
*STp
,unsigned char*cmd
,int bytes
, 223 int timeout
,int retries
) 226 if((SCpnt
=allocate_device(NULL
, STp
->device
,1)) == NULL
) { 227 printk("st%d: Can't get SCSI request.\n",TAPE_NR(STp
->devt
)); 231 cmd
[1] |= (SCpnt
->lun
<<5) &0xe0; 232 STp
->sem
= MUTEX_LOCKED
; 233 SCpnt
->request
.sem
= &(STp
->sem
); 234 SCpnt
->request
.rq_status
= RQ_SCSI_BUSY
; 235 SCpnt
->request
.rq_dev
= STp
->devt
; 237 scsi_do_cmd(SCpnt
, (void*)cmd
, (STp
->buffer
)->b_data
, bytes
, 238 st_sleep_done
, timeout
, retries
); 240 down(SCpnt
->request
.sem
); 242 (STp
->buffer
)->last_result_fatal
=st_chk_result(SCpnt
); 248 /* Handle the write-behind checking */ 250 write_behind_check(Scsi_Tape
*STp
) 252 ST_buffer
* STbuffer
; 254 STbuffer
= STp
->buffer
; 257 if(STp
->write_pending
) 265 if(STbuffer
->writing
< STbuffer
->buffer_bytes
) 266 memcpy(STbuffer
->b_data
, 267 STbuffer
->b_data
+ STbuffer
->writing
, 268 STbuffer
->buffer_bytes
- STbuffer
->writing
); 269 STbuffer
->buffer_bytes
-= STbuffer
->writing
; 270 if(STp
->drv_block
>=0) { 271 if(STp
->block_size
==0) 274 STp
->drv_block
+= STbuffer
->writing
/ STp
->block_size
; 276 STbuffer
->writing
=0; 282 /* Back over EOF if it has been inadvertently crossed (ioctl not used because 283 it messes up the block number). */ 285 back_over_eof(Scsi_Tape
*STp
) 288 unsigned char cmd
[10]; 291 cmd
[1] =0x01;/* Space FileMarks */ 292 cmd
[2] = cmd
[3] = cmd
[4] =0xff;/* -1 filemarks */ 295 SCpnt
=st_do_scsi(NULL
, STp
, cmd
,0, ST_TIMEOUT
, MAX_RETRIES
); 299 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 300 if((STp
->buffer
)->last_result
!=0) { 301 printk("st%d: Backing over filemark failed.\n",TAPE_NR(STp
->devt
)); 302 if((STp
->mt_status
)->mt_fileno
>=0) 303 (STp
->mt_status
)->mt_fileno
+=1; 304 (STp
->mt_status
)->mt_blkno
=0; 307 return(STp
->buffer
)->last_result_fatal
; 311 /* Flush the write buffer (never need to write if variable blocksize). */ 313 flush_write_buffer(Scsi_Tape
*STp
) 315 int offset
, transfer
, blks
; 317 unsigned char cmd
[10]; 320 if((STp
->buffer
)->writing
) { 321 write_behind_check(STp
); 322 if((STp
->buffer
)->last_result_fatal
) { 325 printk("st%d: Async write error (flush) %x.\n",TAPE_NR(STp
->devt
), 326 (STp
->buffer
)->last_result
); 328 if((STp
->buffer
)->last_result
== INT_MAX
) 334 if(STp
->block_size
==0) 340 offset
= (STp
->buffer
)->buffer_bytes
; 341 transfer
= ((offset
+ STp
->block_size
-1) / 342 STp
->block_size
) * STp
->block_size
; 345 printk("st%d: Flushing %d bytes.\n",TAPE_NR(STp
->devt
), transfer
); 347 memset((STp
->buffer
)->b_data
+ offset
,0, transfer
- offset
); 352 blks
= transfer
/ STp
->block_size
; 357 SCpnt
=st_do_scsi(NULL
, STp
, cmd
, transfer
, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 361 if((STp
->buffer
)->last_result_fatal
!=0) { 362 printk("st%d: Error on flush.\n",TAPE_NR(STp
->devt
)); 363 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 364 (SCpnt
->sense_buffer
[2] &0x40) && 365 (SCpnt
->sense_buffer
[2] &0x0f) != VOLUME_OVERFLOW
) { 367 (STp
->buffer
)->buffer_bytes
=0; 372 STp
->drv_block
= (-1); 375 if(STp
->drv_block
>=0) 376 STp
->drv_block
+= blks
; 378 (STp
->buffer
)->buffer_bytes
=0; 380 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 386 /* Flush the tape buffer. The tape will be positioned correctly unless 387 seek_next is true. */ 389 flush_buffer(struct inode
* inode
,struct file
* filp
,int seek_next
) 391 int backspace
, result
; 393 ST_buffer
* STbuffer
; 394 int dev
=TAPE_NR(inode
->i_rdev
); 396 STp
= &(scsi_tapes
[dev
]); 397 STbuffer
= STp
->buffer
; 400 * If there was a bus reset, block further access 403 if( STp
->device
->was_reset
) 406 if(STp
->ready
!= ST_READY
) 409 if(STp
->rw
== ST_WRITING
)/* Writing */ 410 returnflush_write_buffer(STp
); 412 if(STp
->block_size
==0) 415 backspace
= ((STp
->buffer
)->buffer_bytes
+ 416 (STp
->buffer
)->read_pointer
) / STp
->block_size
- 417 ((STp
->buffer
)->read_pointer
+ STp
->block_size
-1) / 419 (STp
->buffer
)->buffer_bytes
=0; 420 (STp
->buffer
)->read_pointer
=0; 423 if((STp
->eof
== ST_FM
) && !STp
->eof_hit
) { 424 result
=back_over_eof(STp
);/* Back over the EOF hit */ 430 if(!result
&& backspace
>0) 431 result
=st_int_ioctl(inode
, filp
, MTBSR
, backspace
); 438 /* Open the device */ 440 scsi_tape_open(struct inode
* inode
,struct file
* filp
) 442 unsigned short flags
; 444 unsigned char cmd
[10]; 447 int dev
=TAPE_NR(inode
->i_rdev
); 449 if(dev
>= st_template
.dev_max
|| !scsi_tapes
[dev
].device
) 451 STp
= &(scsi_tapes
[dev
]); 453 printk("st%d: Device already in use.\n", dev
); 457 /* Allocate buffer for this user */ 458 for(i
=0; i
< st_nbr_buffers
; i
++) 459 if(!st_buffers
[i
]->in_use
) 461 if(i
>= st_nbr_buffers
) { 462 STp
->buffer
=new_tape_buffer(FALSE
); 463 if(STp
->buffer
== NULL
) { 464 printk("st%d: No free buffers.\n", dev
); 469 STp
->buffer
= st_buffers
[i
]; 470 (STp
->buffer
)->in_use
=1; 471 (STp
->buffer
)->writing
=0; 474 flags
= filp
->f_flags
; 475 STp
->write_prot
= ((flags
& O_ACCMODE
) == O_RDONLY
); 479 STp
->ready
= ST_READY
; 480 if(STp
->eof
!= ST_EOD
)/* Save EOD across opens */ 483 STp
->recover_count
=0; 485 STp
->nbr_waits
= STp
->nbr_finished
=0; 488 memset((void*) &cmd
[0],0,10); 489 cmd
[0] = TEST_UNIT_READY
; 491 SCpnt
=st_do_scsi(NULL
, STp
, cmd
,0, ST_LONG_TIMEOUT
, MAX_READY_RETRIES
); 495 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 496 (SCpnt
->sense_buffer
[2] &0x0f) == UNIT_ATTENTION
) {/* New media? */ 497 (STp
->mt_status
)->mt_fileno
=0; 498 memset((void*) &cmd
[0],0,10); 499 cmd
[0] = TEST_UNIT_READY
; 501 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
,0, ST_LONG_TIMEOUT
, MAX_READY_RETRIES
); 503 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
=0; 505 (STp
->device
)->was_reset
=0; 508 if((STp
->buffer
)->last_result_fatal
!=0) { 509 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 510 (SCpnt
->sense_buffer
[2] &0x0f) == NO_TAPE
) { 511 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
=0; 512 printk("st%d: No tape.\n", dev
); 513 STp
->ready
= ST_NO_TAPE
; 515 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
= (-1); 516 STp
->ready
= ST_NOT_READY
; 518 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 519 STp
->density
=0;/* Clear the erroneous "residue" */ 523 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
=0; 524 STp
->door_locked
= ST_UNLOCKED
; 525 if(scsi_tapes
[dev
].device
->host
->hostt
->usage_count
) 526 (*scsi_tapes
[dev
].device
->host
->hostt
->usage_count
)++; 527 if(st_template
.usage_count
) (*st_template
.usage_count
)++; 531 memset((void*) &cmd
[0],0,10); 532 cmd
[0] = READ_BLOCK_LIMITS
; 534 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
,6, ST_TIMEOUT
, MAX_READY_RETRIES
); 536 if(!SCpnt
->result
&& !SCpnt
->sense_buffer
[0]) { 537 STp
->max_block
= ((STp
->buffer
)->b_data
[1] <<16) | 538 ((STp
->buffer
)->b_data
[2] <<8) | (STp
->buffer
)->b_data
[3]; 539 STp
->min_block
= ((STp
->buffer
)->b_data
[4] <<8) | 540 (STp
->buffer
)->b_data
[5]; 543 printk("st%d: Block limits %d - %d bytes.\n", dev
, STp
->min_block
, 548 STp
->min_block
= STp
->max_block
= (-1); 551 printk("st%d: Can't read block limits.\n", dev
); 555 memset((void*) &cmd
[0],0,10); 559 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
,12, ST_TIMEOUT
, MAX_READY_RETRIES
); 561 if((STp
->buffer
)->last_result_fatal
!=0) { 564 printk("st%d: No Mode Sense.\n", dev
); 566 STp
->block_size
= ST_DEFAULT_BLOCK
;/* Educated guess (?) */ 567 (STp
->buffer
)->last_result_fatal
=0;/* Prevent error propagation */ 568 STp
->drv_write_prot
=0; 574 printk("st%d: Mode sense. Length %d, medium %x, WBS %x, BLL %d\n", dev
, 575 (STp
->buffer
)->b_data
[0], (STp
->buffer
)->b_data
[1], 576 (STp
->buffer
)->b_data
[2], (STp
->buffer
)->b_data
[3]); 579 if((STp
->buffer
)->b_data
[3] >=8) { 580 STp
->drv_buffer
= ((STp
->buffer
)->b_data
[2] >>4) &7; 581 STp
->density
= (STp
->buffer
)->b_data
[4]; 582 STp
->block_size
= (STp
->buffer
)->b_data
[9] *65536+ 583 (STp
->buffer
)->b_data
[10] *256+ (STp
->buffer
)->b_data
[11]; 586 printk("st%d: Density %x, tape length: %x, drv buffer: %d\n", 587 dev
, STp
->density
, (STp
->buffer
)->b_data
[5] *65536+ 588 (STp
->buffer
)->b_data
[6] *256+ (STp
->buffer
)->b_data
[7], 593 if(STp
->block_size
> (STp
->buffer
)->buffer_size
&& 594 !enlarge_buffer(STp
->buffer
, STp
->block_size
)) { 595 printk("st%d: Blocksize %d too large for buffer.\n", dev
, 597 (STp
->buffer
)->in_use
=0; 601 STp
->drv_write_prot
= ((STp
->buffer
)->b_data
[2] &0x80) !=0; 603 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 605 if(STp
->block_size
>0) 606 (STp
->buffer
)->buffer_blocks
= st_buffer_size
/ STp
->block_size
; 608 (STp
->buffer
)->buffer_blocks
=1; 609 (STp
->buffer
)->buffer_bytes
= (STp
->buffer
)->read_pointer
=0; 613 printk("st%d: Block size: %d, buffer size: %d (%d blocks).\n", dev
, 614 STp
->block_size
, (STp
->buffer
)->buffer_size
, 615 (STp
->buffer
)->buffer_blocks
); 618 if(STp
->drv_write_prot
) { 622 printk("st%d: Write protected\n", dev
); 624 if((flags
& O_ACCMODE
) == O_WRONLY
|| (flags
& O_ACCMODE
) == O_RDWR
) { 625 (STp
->buffer
)->in_use
=0; 632 if(scsi_tapes
[dev
].device
->host
->hostt
->usage_count
) 633 (*scsi_tapes
[dev
].device
->host
->hostt
->usage_count
)++; 634 if(st_template
.usage_count
) (*st_template
.usage_count
)++; 640 /* Close the device*/ 642 scsi_tape_close(struct inode
* inode
,struct file
* filp
) 646 static unsigned char cmd
[10]; 649 kdev_t devt
= inode
->i_rdev
; 653 rewind
= (MINOR(devt
) &0x80) ==0; 655 STp
= &(scsi_tapes
[dev
]); 657 if( STp
->rw
== ST_WRITING
&& !(STp
->device
)->was_reset
) { 659 result
=flush_write_buffer(STp
); 663 printk("st%d: File length %ld bytes.\n", dev
, (long)(filp
->f_pos
)); 664 printk("st%d: Async write waits %d, finished %d.\n", dev
, 665 STp
->nbr_waits
, STp
->nbr_finished
); 669 if(result
==0|| result
== (-ENOSPC
)) { 672 cmd
[0] = WRITE_FILEMARKS
; 673 cmd
[4] =1+ STp
->two_fm
; 675 SCpnt
=st_do_scsi(NULL
, STp
, cmd
,0, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 679 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 681 if((STp
->buffer
)->last_result_fatal
!=0) 682 printk("st%d: Error on write filemark.\n", dev
); 684 if((STp
->mt_status
)->mt_fileno
>=0) 685 (STp
->mt_status
)->mt_fileno
++ ; 694 printk("st%d: Buffer flushed, %d EOF(s) written\n", dev
, cmd
[4]); 699 flush_buffer(inode
, filp
,0); 701 if((STp
->eof
== ST_FM
) && !STp
->eof_hit
) 707 st_int_ioctl(inode
, filp
, MTREW
,1); 709 if(STp
->door_locked
== ST_LOCKED_AUTO
) 710 st_int_ioctl(inode
, filp
, MTUNLOCK
,0); 712 if(STp
->buffer
!= NULL
) { 713 normalize_buffer(STp
->buffer
); 714 (STp
->buffer
)->in_use
=0; 718 if(scsi_tapes
[dev
].device
->host
->hostt
->usage_count
) 719 (*scsi_tapes
[dev
].device
->host
->hostt
->usage_count
)--; 720 if(st_template
.usage_count
) (*st_template
.usage_count
)--; 728 st_write(struct inode
* inode
,struct file
* filp
,const char* buf
,int count
) 730 int total
, do_count
, blks
, retval
, transfer
; 733 static unsigned char cmd
[10]; 735 Scsi_Cmnd
* SCpnt
= NULL
; 737 int dev
=TAPE_NR(inode
->i_rdev
); 739 STp
= &(scsi_tapes
[dev
]); 740 if(STp
->ready
!= ST_READY
) 744 * If there was a bus reset, block further access 747 if( STp
->device
->was_reset
) 752 printk("st%d: Incorrect device.\n", dev
); 760 if(STp
->block_size
==0&& 761 count
> (STp
->buffer
)->buffer_size
&& 762 !enlarge_buffer(STp
->buffer
, count
)) 765 if(STp
->do_auto_lock
&& STp
->door_locked
== ST_UNLOCKED
&& 766 !st_int_ioctl(inode
, filp
, MTLOCK
,0)) 767 STp
->door_locked
= ST_LOCKED_AUTO
; 769 if(STp
->rw
== ST_READING
) { 770 retval
=flush_buffer(inode
, filp
,0); 773 STp
->rw
= ST_WRITING
; 776 if(STp
->moves_after_eof
<255) 777 STp
->moves_after_eof
++; 779 if((STp
->buffer
)->writing
) { 780 write_behind_check(STp
); 781 if((STp
->buffer
)->last_result_fatal
) { 784 printk("st%d: Async write error (write) %x.\n", dev
, 785 (STp
->buffer
)->last_result
); 787 if((STp
->buffer
)->last_result
== INT_MAX
) { 788 retval
= (-ENOSPC
);/* All has been written */ 789 STp
->eof
= ST_EOM_OK
; 797 if(STp
->eof
== ST_EOM_OK
) 799 else if(STp
->eof
== ST_EOM_ERROR
) 802 if(!STp
->do_buffer_writes
) { 803 if(STp
->block_size
!=0&& (count
% STp
->block_size
) !=0) 804 return(-EIO
);/* Write must be integral number of blocks */ 808 write_threshold
= (STp
->buffer
)->buffer_blocks
* STp
->block_size
; 809 if(!STp
->do_async_writes
) 816 cmd
[1] = (STp
->block_size
!=0); 818 STp
->rw
= ST_WRITING
; 821 while((STp
->block_size
==0&& !STp
->do_async_writes
&& count
>0) || 822 (STp
->block_size
!=0&& 823 (STp
->buffer
)->buffer_bytes
+ count
> write_threshold
)) 826 if(STp
->block_size
==0) 829 do_count
= (STp
->buffer
)->buffer_blocks
* STp
->block_size
- 830 (STp
->buffer
)->buffer_bytes
; 834 memcpy_fromfs((STp
->buffer
)->b_data
+ 835 (STp
->buffer
)->buffer_bytes
, b_point
, do_count
); 837 if(STp
->block_size
==0) 838 blks
= transfer
= do_count
; 840 blks
= ((STp
->buffer
)->buffer_bytes
+ do_count
) / 842 transfer
= blks
* STp
->block_size
; 848 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
, transfer
, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 852 if((STp
->buffer
)->last_result_fatal
!=0) { 855 printk("st%d: Error on write:\n", dev
); 857 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 858 (SCpnt
->sense_buffer
[2] &0x40)) { 859 if(STp
->block_size
!=0&& (SCpnt
->sense_buffer
[0] &0x80) !=0) 860 transfer
= (SCpnt
->sense_buffer
[3] <<24) | 861 (SCpnt
->sense_buffer
[4] <<16) | 862 (SCpnt
->sense_buffer
[5] <<8) | SCpnt
->sense_buffer
[6]; 863 else if(STp
->block_size
==0&& 864 (SCpnt
->sense_buffer
[2] &0x0f) == VOLUME_OVERFLOW
) 868 if(STp
->block_size
!=0) 869 transfer
*= STp
->block_size
; 870 if(transfer
<= do_count
) { 871 filp
->f_pos
+= do_count
- transfer
; 872 count
-= do_count
- transfer
; 873 if(STp
->drv_block
>=0) { 874 if(STp
->block_size
==0&& transfer
< do_count
) 876 else if(STp
->block_size
!=0) 877 STp
->drv_block
+= (do_count
- transfer
) / STp
->block_size
; 879 STp
->eof
= ST_EOM_OK
; 880 retval
= (-ENOSPC
);/* EOM within current request */ 883 printk("st%d: EOM with %d bytes unwritten.\n", 888 STp
->eof
= ST_EOM_ERROR
; 889 STp
->drv_block
= (-1);/* Too cautious? */ 890 retval
= (-EIO
);/* EOM for old data */ 893 printk("st%d: EOM with lost data.\n", dev
); 898 STp
->drv_block
= (-1);/* Too cautious? */ 902 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 903 (STp
->buffer
)->buffer_bytes
=0; 906 return total
- count
; 910 filp
->f_pos
+= do_count
; 913 if(STp
->drv_block
>=0) { 914 if(STp
->block_size
==0) 917 STp
->drv_block
+= blks
; 919 (STp
->buffer
)->buffer_bytes
=0; 924 memcpy_fromfs((STp
->buffer
)->b_data
+ 925 (STp
->buffer
)->buffer_bytes
,b_point
,count
); 926 filp
->f_pos
+= count
; 927 (STp
->buffer
)->buffer_bytes
+= count
; 931 if(doing_write
&& (STp
->buffer
)->last_result_fatal
!=0) { 932 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 933 return(STp
->buffer
)->last_result_fatal
; 936 if(STp
->do_async_writes
&& 937 ((STp
->buffer
)->buffer_bytes
>= STp
->write_threshold
|| 938 STp
->block_size
==0) ) { 939 /* Schedule an asynchronous write */ 941 SCpnt
=allocate_device(NULL
, STp
->device
,1); 945 if(STp
->block_size
==0) 946 (STp
->buffer
)->writing
= (STp
->buffer
)->buffer_bytes
; 948 (STp
->buffer
)->writing
= ((STp
->buffer
)->buffer_bytes
/ 949 STp
->block_size
) * STp
->block_size
; 950 STp
->dirty
= !((STp
->buffer
)->writing
== 951 (STp
->buffer
)->buffer_bytes
); 953 if(STp
->block_size
==0) 954 blks
= (STp
->buffer
)->writing
; 956 blks
= (STp
->buffer
)->writing
/ STp
->block_size
; 960 STp
->sem
= MUTEX_LOCKED
; 961 SCpnt
->request
.sem
= &(STp
->sem
); 962 SCpnt
->request
.rq_status
= RQ_SCSI_BUSY
; 963 SCpnt
->request
.rq_dev
= STp
->devt
; 965 STp
->write_pending
=1; 969 (void*) cmd
, (STp
->buffer
)->b_data
, 970 (STp
->buffer
)->writing
, 971 st_sleep_done
, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 973 else if(SCpnt
!= NULL
) 974 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 976 STp
->at_sm
&= (total
!=0); 983 st_read(struct inode
* inode
,struct file
* filp
,char* buf
,int count
) 986 int transfer
, blks
, bytes
; 987 static unsigned char cmd
[10]; 988 Scsi_Cmnd
* SCpnt
= NULL
; 990 int dev
=TAPE_NR(inode
->i_rdev
); 992 STp
= &(scsi_tapes
[dev
]); 993 if(STp
->ready
!= ST_READY
) 997 printk("st%d: Incorrect device.\n", dev
); 1002 if(STp
->block_size
==0&& 1003 count
> (STp
->buffer
)->buffer_size
&& 1004 !enlarge_buffer(STp
->buffer
, count
)) 1007 if(!(STp
->do_read_ahead
) && STp
->block_size
!=0&& 1008 (count
% STp
->block_size
) !=0) 1009 return(-EIO
);/* Read must be integral number of blocks */ 1011 if(STp
->do_auto_lock
&& STp
->door_locked
== ST_UNLOCKED
&& 1012 !st_int_ioctl(inode
, filp
, MTLOCK
,0)) 1013 STp
->door_locked
= ST_LOCKED_AUTO
; 1015 if(STp
->rw
== ST_WRITING
) { 1016 transfer
=flush_buffer(inode
, filp
,0); 1019 STp
->rw
= ST_READING
; 1021 if(STp
->moves_after_eof
<255) 1022 STp
->moves_after_eof
++; 1025 if(debugging
&& STp
->eof
!= ST_NOEOF
) 1026 printk("st%d: EOF flag up. Bytes %d\n", dev
, 1027 (STp
->buffer
)->buffer_bytes
); 1029 if(((STp
->buffer
)->buffer_bytes
==0) && 1030 (STp
->eof
== ST_EOM_OK
|| STp
->eof
== ST_EOD
)) 1031 return(-EIO
);/* EOM or Blank Check */ 1033 STp
->rw
= ST_READING
; 1035 for(total
=0; total
< count
; ) { 1037 if((STp
->buffer
)->buffer_bytes
==0&& 1038 STp
->eof
== ST_NOEOF
) { 1042 cmd
[1] = (STp
->block_size
!=0); 1043 if(STp
->block_size
==0) 1044 blks
= bytes
= count
; 1046 if(STp
->do_read_ahead
) { 1047 blks
= (STp
->buffer
)->buffer_blocks
; 1048 bytes
= blks
* STp
->block_size
; 1052 if(bytes
> (STp
->buffer
)->buffer_size
) 1053 bytes
= (STp
->buffer
)->buffer_size
; 1054 blks
= bytes
/ STp
->block_size
; 1055 bytes
= blks
* STp
->block_size
; 1062 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
, bytes
, ST_TIMEOUT
, MAX_RETRIES
); 1066 (STp
->buffer
)->read_pointer
=0; 1070 if((STp
->buffer
)->last_result_fatal
) { 1073 printk("st%d: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", dev
, 1074 SCpnt
->sense_buffer
[0], SCpnt
->sense_buffer
[1], 1075 SCpnt
->sense_buffer
[2], SCpnt
->sense_buffer
[3], 1076 SCpnt
->sense_buffer
[4], SCpnt
->sense_buffer
[5], 1077 SCpnt
->sense_buffer
[6], SCpnt
->sense_buffer
[7]); 1079 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70) {/* extended sense */ 1081 if((SCpnt
->sense_buffer
[2] &0xe0) !=0) {/* EOF, EOM, or ILI */ 1083 if((SCpnt
->sense_buffer
[0] &0x80) !=0) 1084 transfer
= (SCpnt
->sense_buffer
[3] <<24) | 1085 (SCpnt
->sense_buffer
[4] <<16) | 1086 (SCpnt
->sense_buffer
[5] <<8) | SCpnt
->sense_buffer
[6]; 1089 if(STp
->block_size
==0&& 1090 (SCpnt
->sense_buffer
[2] &0x0f) == MEDIUM_ERROR
) 1093 if(SCpnt
->sense_buffer
[2] &0x20) { 1094 if(STp
->block_size
==0) { 1097 (STp
->buffer
)->buffer_bytes
= bytes
- transfer
; 1100 printk("st%d: Incorrect block size.\n", dev
); 1101 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1105 else if(SCpnt
->sense_buffer
[2] &0x40) { 1106 STp
->eof
= ST_EOM_OK
; 1107 if(STp
->block_size
==0) 1108 (STp
->buffer
)->buffer_bytes
= bytes
- transfer
; 1110 (STp
->buffer
)->buffer_bytes
= 1111 bytes
- transfer
* STp
->block_size
; 1114 printk("st%d: EOM detected (%d bytes read).\n", dev
, 1115 (STp
->buffer
)->buffer_bytes
); 1118 else if(SCpnt
->sense_buffer
[2] &0x80) { 1120 if(STp
->block_size
==0) 1121 (STp
->buffer
)->buffer_bytes
=0; 1123 (STp
->buffer
)->buffer_bytes
= 1124 bytes
- transfer
* STp
->block_size
; 1128 "st%d: EOF detected (%d bytes read, transferred %d bytes).\n", 1129 dev
, (STp
->buffer
)->buffer_bytes
, total
); 1132 }/* end of EOF, EOM, ILI test */ 1133 else{/* nonzero sense key */ 1136 printk("st%d: Tape error while reading.\n", dev
); 1138 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 1139 STp
->drv_block
= (-1); 1142 else if(STp
->moves_after_eof
==1&& 1143 (SCpnt
->sense_buffer
[2] &0x0f) == BLANK_CHECK
) { 1146 printk("st%d: Zero returned for first BLANK CHECK after EOF.\n", 1150 return0;/* First BLANK_CHECK after EOF */ 1155 }/* End of extended sense test */ 1157 transfer
= (STp
->buffer
)->last_result_fatal
; 1158 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1161 }/* End of error handling */ 1162 else/* Read successful */ 1163 (STp
->buffer
)->buffer_bytes
= bytes
; 1165 if(STp
->drv_block
>=0) { 1166 if(STp
->block_size
==0) 1169 STp
->drv_block
+= (STp
->buffer
)->buffer_bytes
/ STp
->block_size
; 1172 }/* if ((STp->buffer)->buffer_bytes == 0 && 1173 STp->eof == ST_NOEOF) */ 1175 if((STp
->buffer
)->buffer_bytes
>0) { 1177 if(debugging
&& STp
->eof
!= ST_NOEOF
) 1178 printk("st%d: EOF up. Left %d, needed %d.\n", dev
, 1179 (STp
->buffer
)->buffer_bytes
, count
- total
); 1181 transfer
= (STp
->buffer
)->buffer_bytes
< count
- total
? 1182 (STp
->buffer
)->buffer_bytes
: count
- total
; 1183 memcpy_tofs(buf
, (STp
->buffer
)->b_data
+ 1184 (STp
->buffer
)->read_pointer
,transfer
); 1185 filp
->f_pos
+= transfer
; 1188 (STp
->buffer
)->buffer_bytes
-= transfer
; 1189 (STp
->buffer
)->read_pointer
+= transfer
; 1191 else if(STp
->eof
!= ST_NOEOF
) { 1194 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1195 if(total
==0&& STp
->eof
== ST_FM
) { 1196 STp
->eof
= ST_NOEOF
; 1198 if(STp
->moves_after_eof
>1) 1199 STp
->moves_after_eof
=0; 1200 if((STp
->mt_status
)->mt_fileno
>=0) 1201 (STp
->mt_status
)->mt_fileno
++; 1203 if(total
==0&& STp
->eof
== ST_EOM_OK
) 1204 return(-EIO
);/* ST_EOM_ERROR not used in read */ 1208 if(STp
->block_size
==0) 1209 count
= total
;/* Read only one variable length block */ 1211 }/* for (total = 0; total < count; ) */ 1214 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1221 /* Set the driver options */ 1223 st_set_options(struct inode
* inode
,long options
) 1227 int dev
=TAPE_NR(inode
->i_rdev
); 1229 STp
= &(scsi_tapes
[dev
]); 1230 if((options
& MT_ST_OPTIONS
) == MT_ST_BOOLEANS
) { 1231 STp
->do_buffer_writes
= (options
& MT_ST_BUFFER_WRITES
) !=0; 1232 STp
->do_async_writes
= (options
& MT_ST_ASYNC_WRITES
) !=0; 1233 STp
->do_read_ahead
= (options
& MT_ST_READ_AHEAD
) !=0; 1234 STp
->two_fm
= (options
& MT_ST_TWO_FM
) !=0; 1235 STp
->fast_mteom
= (options
& MT_ST_FAST_MTEOM
) !=0; 1236 STp
->do_auto_lock
= (options
& MT_ST_AUTO_LOCK
) !=0; 1238 debugging
= (options
& MT_ST_DEBUGGING
) !=0; 1240 "st%d: options: buffer writes: %d, async writes: %d, read ahead: %d\n", 1241 dev
, STp
->do_buffer_writes
, STp
->do_async_writes
, 1242 STp
->do_read_ahead
); 1243 printk(" two FMs: %d, fast mteom: %d auto lock: %d, debugging: %d\n", 1244 STp
->two_fm
, STp
->fast_mteom
, STp
->do_auto_lock
, debugging
); 1247 else if((options
& MT_ST_OPTIONS
) == MT_ST_WRITE_THRESHOLD
) { 1248 value
= (options
& ~MT_ST_OPTIONS
) * ST_BLOCK_SIZE
; 1249 if(value
<1|| value
> st_buffer_size
) { 1250 printk("st: Write threshold %d too small or too large.\n", 1254 STp
->write_threshold
= value
; 1256 printk("st%d: Write threshold set to %d bytes.\n", dev
, 1257 STp
->write_threshold
); 1267 /* Internal ioctl function */ 1269 st_int_ioctl(struct inode
* inode
,struct file
* file
, 1270 unsigned int cmd_in
,unsigned long arg
) 1272 int timeout
= ST_LONG_TIMEOUT
; 1275 unsigned char cmd
[10]; 1278 int fileno
, blkno
, at_sm
, undone
, datalen
; 1279 int dev
=TAPE_NR(inode
->i_rdev
); 1281 STp
= &(scsi_tapes
[dev
]); 1282 if(STp
->ready
!= ST_READY
&& cmd_in
!= MTLOAD
) 1284 fileno
= (STp
->mt_status
)->mt_fileno
; 1285 blkno
= STp
->drv_block
; 1294 cmd
[1] =0x01;/* Space FileMarks */ 1295 cmd
[2] = (arg
>>16); 1300 printk("st%d: Spacing tape forward over %d filemarks.\n", dev
, 1301 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1311 cmd
[1] =0x01;/* Space FileMarks */ 1313 cmd
[2] = (ltmp
>>16); 1314 cmd
[3] = (ltmp
>>8); 1320 ltmp
= ltmp
| (cmd
[2] <<16) | (cmd
[3] <<8) | cmd
[4]; 1321 printk("st%d: Spacing tape backward over %ld filemarks.\n", dev
, (-ltmp
)); 1326 blkno
= (-1);/* We can't know the block number */ 1331 cmd
[1] =0x00;/* Space Blocks */ 1332 cmd
[2] = (arg
>>16); 1337 printk("st%d: Spacing tape forward %d blocks.\n", dev
, 1338 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1346 cmd
[1] =0x00;/* Space Blocks */ 1348 cmd
[2] = (ltmp
>>16); 1349 cmd
[3] = (ltmp
>>8); 1355 ltmp
= ltmp
| (cmd
[2] <<16) | (cmd
[3] <<8) | cmd
[4]; 1356 printk("st%d: Spacing tape backward %ld blocks.\n", dev
, (-ltmp
)); 1365 cmd
[1] =0x04;/* Space Setmarks */ 1366 cmd
[2] = (arg
>>16); 1371 printk("st%d: Spacing tape forward %d setmarks.\n", dev
, 1372 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1375 blkno
= fileno
= (-1); 1381 cmd
[1] =0x04;/* Space Setmarks */ 1383 cmd
[2] = (ltmp
>>16); 1384 cmd
[3] = (ltmp
>>8); 1390 ltmp
= ltmp
| (cmd
[2] <<16) | (cmd
[3] <<8) | cmd
[4]; 1391 printk("st%d: Spacing tape backward %ld setmarks.\n", dev
, (-ltmp
)); 1395 blkno
= fileno
= (-1); 1403 cmd
[0] = WRITE_FILEMARKS
; 1406 cmd
[2] = (arg
>>16); 1409 timeout
= ST_TIMEOUT
; 1412 if(cmd_in
== MTWEOF
) 1413 printk("st%d: Writing %d filemarks.\n", dev
, 1414 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1416 printk("st%d: Writing %d setmarks.\n", dev
, 1417 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1423 at_sm
= (cmd_in
== MTWSM
); 1426 cmd
[0] = REZERO_UNIT
; 1428 cmd
[1] =1;/* Don't wait for completion */ 1429 timeout
= ST_TIMEOUT
; 1433 printk("st%d: Rewinding tape.\n", dev
); 1435 fileno
= blkno
= at_sm
=0; 1438 cmd
[0] = START_STOP
; 1440 cmd
[1] =1;/* Don't wait for completion */ 1441 timeout
= ST_TIMEOUT
; 1445 printk("st%d: Unloading tape.\n", dev
); 1447 fileno
= blkno
= at_sm
=0; 1452 printk("st%d: No op on tape.\n", dev
); 1454 return0;/* Should do something ? */ 1457 cmd
[0] = START_STOP
; 1459 cmd
[1] =1;/* Don't wait for completion */ 1460 timeout
= ST_TIMEOUT
; 1465 printk("st%d: Retensioning tape.\n", dev
); 1467 fileno
= blkno
= at_sm
=0; 1470 if(!STp
->fast_mteom
) { 1471 /* space to the end of tape */ 1472 ioctl_result
=st_int_ioctl(inode
, file
, MTFSF
,0x3fff); 1473 fileno
= (STp
->mt_status
)->mt_fileno
; 1474 if(STp
->eof
== ST_EOD
|| STp
->eof
== ST_EOM_OK
) 1476 /* The next lines would hide the number of spaced FileMarks 1477 That's why I inserted the previous lines. I had no luck 1478 with detecting EOM with FSF, so we go now to EOM. 1487 printk("st%d: Spacing to end of recorded medium.\n", dev
); 1496 cmd
[1] =1;/* To the end of tape */ 1498 cmd
[1] |=2;/* Don't wait for completion */ 1499 timeout
= ST_TIMEOUT
; 1501 timeout
= ST_LONG_TIMEOUT
*8; 1505 printk("st%d: Erasing tape.\n", dev
); 1507 fileno
= blkno
= at_sm
=0; 1510 cmd
[0] = ALLOW_MEDIUM_REMOVAL
; 1511 cmd
[4] = SCSI_REMOVAL_PREVENT
; 1514 printk("st%d: Locking drive door.\n", dev
); 1518 cmd
[0] = ALLOW_MEDIUM_REMOVAL
; 1519 cmd
[4] = SCSI_REMOVAL_ALLOW
; 1522 printk("st%d: Unlocking drive door.\n", dev
); 1527 cmd
[0] = START_STOP
; 1528 if(cmd_in
== MTLOAD
) 1531 cmd
[1] |=2;/* Don't wait for completion */ 1532 timeout
= ST_TIMEOUT
; 1534 timeout
= ST_LONG_TIMEOUT
*8; 1538 if((STp
->device
)->scsi_level
< SCSI_2
) { 1539 cmd
[0] = QFA_SEEK_BLOCK
; 1540 cmd
[2] = (arg
>>16); 1548 cmd
[3] = (arg
>>24); 1549 cmd
[4] = (arg
>>16); 1554 cmd
[1] |=1;/* Don't wait for completion */ 1555 timeout
= ST_TIMEOUT
; 1559 printk("st%d: Seeking tape to block %ld.\n", dev
, arg
); 1561 fileno
= blkno
= (-1); 1564 case MTSETBLK
:/* Set block length */ 1565 case MTSETDENSITY
:/* Set tape density */ 1566 case MTSETDRVBUFFER
:/* Set drive buffering */ 1567 if(STp
->dirty
|| (STp
->buffer
)->buffer_bytes
!=0) 1568 return(-EIO
);/* Not allowed if data in buffer */ 1569 if(cmd_in
== MTSETBLK
&& 1571 (arg
< STp
->min_block
|| arg
> STp
->max_block
|| 1572 arg
> st_buffer_size
)) { 1573 printk("st%d: Illegal block size.\n", dev
); 1576 cmd
[0] = MODE_SELECT
; 1577 cmd
[4] = datalen
=12; 1579 memset((STp
->buffer
)->b_data
,0,12); 1580 if(cmd_in
== MTSETDRVBUFFER
) 1581 (STp
->buffer
)->b_data
[2] = (arg
&7) <<4; 1583 (STp
->buffer
)->b_data
[2] = 1584 STp
->drv_buffer
<<4; 1585 (STp
->buffer
)->b_data
[3] =8;/* block descriptor length */ 1586 if(cmd_in
== MTSETDENSITY
) 1587 (STp
->buffer
)->b_data
[4] = arg
; 1589 (STp
->buffer
)->b_data
[4] = STp
->density
; 1590 if(cmd_in
== MTSETBLK
) 1593 ltmp
= STp
->block_size
; 1594 (STp
->buffer
)->b_data
[9] = (ltmp
>>16); 1595 (STp
->buffer
)->b_data
[10] = (ltmp
>>8); 1596 (STp
->buffer
)->b_data
[11] = ltmp
; 1597 timeout
= ST_TIMEOUT
; 1600 if(cmd_in
== MTSETBLK
) 1601 printk("st%d: Setting block size to %d bytes.\n", dev
, 1602 (STp
->buffer
)->b_data
[9] *65536+ 1603 (STp
->buffer
)->b_data
[10] *256+ 1604 (STp
->buffer
)->b_data
[11]); 1605 else if(cmd_in
== MTSETDENSITY
) 1606 printk("st%d: Setting density code to %x.\n", dev
, 1607 (STp
->buffer
)->b_data
[4]); 1609 printk("st%d: Setting drive buffer code to %d.\n", dev
, 1610 ((STp
->buffer
)->b_data
[2] >>4) &7); 1615 printk("st%d: Unknown st_ioctl command %x.\n", dev
, cmd_in
); 1619 SCpnt
=st_do_scsi(NULL
, STp
, cmd
, datalen
, timeout
, MAX_RETRIES
); 1623 ioctl_result
= (STp
->buffer
)->last_result_fatal
; 1625 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1628 STp
->moves_after_eof
=0; 1630 STp
->moves_after_eof
=1; 1631 if(!ioctl_result
) {/* SCSI command successful */ 1632 if(cmd_in
!= MTSEEK
) { 1633 STp
->drv_block
= blkno
; 1634 (STp
->mt_status
)->mt_fileno
= fileno
; 1638 STp
->drv_block
= (STp
->mt_status
)->mt_fileno
= (-1); 1641 if(cmd_in
== MTLOCK
) 1642 STp
->door_locked
= ST_LOCKED_EXPLICIT
; 1643 else if(cmd_in
== MTUNLOCK
) 1644 STp
->door_locked
= ST_UNLOCKED
; 1645 if(cmd_in
== MTBSFM
) 1646 ioctl_result
=st_int_ioctl(inode
, file
, MTFSF
,1); 1647 else if(cmd_in
== MTFSFM
) 1648 ioctl_result
=st_int_ioctl(inode
, file
, MTBSF
,1); 1649 else if(cmd_in
== MTSETBLK
) { 1650 STp
->block_size
= arg
; 1652 (STp
->buffer
)->buffer_blocks
= 1653 (STp
->buffer
)->buffer_size
/ STp
->block_size
; 1654 (STp
->buffer
)->buffer_bytes
= (STp
->buffer
)->read_pointer
=0; 1656 else if(cmd_in
== MTSETDRVBUFFER
) 1657 STp
->drv_buffer
= (arg
&7); 1658 else if(cmd_in
== MTSETDENSITY
) 1660 else if(cmd_in
== MTEOM
) { 1664 else if(cmd_in
!= MTSETBLK
&& cmd_in
!= MTNOP
) { 1665 STp
->eof
= ST_NOEOF
; 1668 }else{/* SCSI command was not completely successful */ 1669 if(SCpnt
->sense_buffer
[2] &0x40) { 1670 if(cmd_in
!= MTBSF
&& cmd_in
!= MTBSFM
&& 1671 cmd_in
!= MTBSR
&& cmd_in
!= MTBSS
) 1672 STp
->eof
= ST_EOM_OK
; 1677 (SCpnt
->sense_buffer
[3] <<24) + 1678 (SCpnt
->sense_buffer
[4] <<16) + 1679 (SCpnt
->sense_buffer
[5] <<8) + 1680 SCpnt
->sense_buffer
[6] ); 1681 if( (cmd_in
== MTFSF
) || (cmd_in
== MTFSFM
) ) { 1683 (STp
->mt_status
)->mt_fileno
= fileno
- undone
; 1685 (STp
->mt_status
)->mt_fileno
= fileno
; 1688 else if( (cmd_in
== MTBSF
) || (cmd_in
== MTBSFM
) ) { 1689 (STp
->mt_status
)->mt_fileno
= fileno
+ undone
; 1692 else if(cmd_in
== MTFSR
) { 1693 if(SCpnt
->sense_buffer
[2] &0x80) {/* Hit filemark */ 1694 (STp
->mt_status
)->mt_fileno
++; 1699 STp
->drv_block
= blkno
- undone
; 1701 STp
->drv_block
= (-1); 1704 else if(cmd_in
== MTBSR
) { 1705 if(SCpnt
->sense_buffer
[2] &0x80) {/* Hit filemark */ 1706 (STp
->mt_status
)->mt_fileno
--; 1707 STp
->drv_block
= (-1); 1711 STp
->drv_block
= blkno
+ undone
; 1713 STp
->drv_block
= (-1); 1716 else if(cmd_in
== MTEOM
|| cmd_in
== MTSEEK
) { 1717 (STp
->mt_status
)->mt_fileno
= (-1); 1718 STp
->drv_block
= (-1); 1720 if(STp
->eof
== ST_NOEOF
&& 1721 (SCpnt
->sense_buffer
[2] &0x0f) == BLANK_CHECK
) 1723 if(cmd_in
== MTLOCK
) 1724 STp
->door_locked
= ST_LOCK_FAILS
; 1727 return ioctl_result
; 1732 /* The ioctl command */ 1734 st_ioctl(struct inode
* inode
,struct file
* file
, 1735 unsigned int cmd_in
,unsigned long arg
) 1737 int i
, cmd_nr
, cmd_type
, result
; 1739 struct mtpos mt_pos
; 1740 unsigned char scmd
[10]; 1743 int dev
=TAPE_NR(inode
->i_rdev
); 1745 STp
= &(scsi_tapes
[dev
]); 1747 if(debugging
&& !STp
->in_use
) { 1748 printk("st%d: Incorrect device.\n", dev
); 1754 * If this is something intended for the lower layer, just pass it 1757 if( cmd_in
== SCSI_IOCTL_GET_IDLUN
|| cmd_in
== SCSI_IOCTL_PROBE_HOST
) 1759 returnscsi_ioctl(STp
->device
, cmd_in
, (void*) arg
); 1762 cmd_type
=_IOC_TYPE(cmd_in
); 1763 cmd_nr
=_IOC_NR(cmd_in
); 1764 if(cmd_type
==_IOC_TYPE(MTIOCTOP
) && cmd_nr
==_IOC_NR(MTIOCTOP
)) { 1765 if(_IOC_SIZE(cmd_in
) !=sizeof(mtc
)) 1768 i
=verify_area(VERIFY_READ
, (void*)arg
,sizeof(mtc
)); 1772 memcpy_fromfs((char*) &mtc
, (char*)arg
,sizeof(struct mtop
)); 1774 if(!(STp
->device
)->was_reset
) { 1775 i
=flush_buffer(inode
, file
, mtc
.mt_op
== MTSEEK
|| 1776 mtc
.mt_op
== MTREW
|| mtc
.mt_op
== MTOFFL
|| 1777 mtc
.mt_op
== MTRETEN
|| mtc
.mt_op
== MTEOM
|| 1778 mtc
.mt_op
== MTLOCK
|| mtc
.mt_op
== MTLOAD
); 1784 * If there was a bus reset, block further access 1785 * to this device. If the user wants to rewind the tape, 1786 * then reset the flag and allow access again. 1788 if(mtc
.mt_op
!= MTREW
&& 1789 mtc
.mt_op
!= MTOFFL
&& 1790 mtc
.mt_op
!= MTRETEN
&& 1791 mtc
.mt_op
!= MTERASE
&& 1792 mtc
.mt_op
!= MTSEEK
&& 1795 STp
->device
->was_reset
=0; 1796 if(STp
->door_locked
!= ST_UNLOCKED
&& 1797 STp
->door_locked
!= ST_LOCK_FAILS
) { 1798 if(st_int_ioctl(inode
, file
, MTLOCK
,0)) { 1799 printk("st%d: Could not relock door after bus reset.\n", dev
); 1800 STp
->door_locked
= ST_UNLOCKED
; 1805 if(mtc
.mt_op
!= MTNOP
&& mtc
.mt_op
!= MTSETBLK
&& 1806 mtc
.mt_op
!= MTSETDENSITY
&& mtc
.mt_op
!= MTWSM
&& 1807 mtc
.mt_op
!= MTSETDRVBUFFER
) 1808 STp
->rw
= ST_IDLE
;/* Prevent automatic WEOF */ 1810 if(mtc
.mt_op
== MTOFFL
&& STp
->door_locked
!= ST_UNLOCKED
) 1811 st_int_ioctl(inode
, file
, MTUNLOCK
,0);/* Ignore result! */ 1813 if(mtc
.mt_op
== MTSETDRVBUFFER
&& 1814 (mtc
.mt_count
& MT_ST_OPTIONS
) !=0) 1815 returnst_set_options(inode
, mtc
.mt_count
); 1817 returnst_int_ioctl(inode
, file
, mtc
.mt_op
, mtc
.mt_count
); 1819 else if(cmd_type
==_IOC_TYPE(MTIOCGET
) && cmd_nr
==_IOC_NR(MTIOCGET
)) { 1821 if(_IOC_SIZE(cmd_in
) !=sizeof(struct mtget
)) 1823 i
=verify_area(VERIFY_WRITE
, (void*)arg
,sizeof(struct mtget
)); 1827 (STp
->mt_status
)->mt_dsreg
= 1828 ((STp
->block_size
<< MT_ST_BLKSIZE_SHIFT
) & MT_ST_BLKSIZE_MASK
) | 1829 ((STp
->density
<< MT_ST_DENSITY_SHIFT
) & MT_ST_DENSITY_MASK
); 1830 (STp
->mt_status
)->mt_blkno
= STp
->drv_block
; 1831 if(STp
->block_size
!=0) { 1832 if(STp
->rw
== ST_WRITING
) 1833 (STp
->mt_status
)->mt_blkno
+= 1834 (STp
->buffer
)->buffer_bytes
/ STp
->block_size
; 1835 else if(STp
->rw
== ST_READING
) 1836 (STp
->mt_status
)->mt_blkno
-= ((STp
->buffer
)->buffer_bytes
+ 1837 STp
->block_size
-1) / STp
->block_size
; 1840 (STp
->mt_status
)->mt_gstat
=0; 1841 if(STp
->drv_write_prot
) 1842 (STp
->mt_status
)->mt_gstat
|=GMT_WR_PROT(0xffffffff); 1843 if((STp
->mt_status
)->mt_blkno
==0) { 1844 if((STp
->mt_status
)->mt_fileno
==0) 1845 (STp
->mt_status
)->mt_gstat
|=GMT_BOT(0xffffffff); 1847 (STp
->mt_status
)->mt_gstat
|=GMT_EOF(0xffffffff); 1849 if(STp
->eof
== ST_EOM_OK
|| STp
->eof
== ST_EOM_ERROR
) 1850 (STp
->mt_status
)->mt_gstat
|=GMT_EOT(0xffffffff); 1851 else if(STp
->eof
== ST_EOD
) 1852 (STp
->mt_status
)->mt_gstat
|=GMT_EOD(0xffffffff); 1853 if(STp
->density
==1) 1854 (STp
->mt_status
)->mt_gstat
|=GMT_D_800(0xffffffff); 1855 else if(STp
->density
==2) 1856 (STp
->mt_status
)->mt_gstat
|=GMT_D_1600(0xffffffff); 1857 else if(STp
->density
==3) 1858 (STp
->mt_status
)->mt_gstat
|=GMT_D_6250(0xffffffff); 1859 if(STp
->ready
== ST_READY
) 1860 (STp
->mt_status
)->mt_gstat
|=GMT_ONLINE(0xffffffff); 1861 if(STp
->ready
== ST_NO_TAPE
) 1862 (STp
->mt_status
)->mt_gstat
|=GMT_DR_OPEN(0xffffffff); 1864 (STp
->mt_status
)->mt_gstat
|=GMT_SM(0xffffffff); 1866 memcpy_tofs((char*)arg
, (char*)(STp
->mt_status
), 1867 sizeof(struct mtget
)); 1869 (STp
->mt_status
)->mt_erreg
=0;/* Clear after read */ 1872 else if(cmd_type
==_IOC_TYPE(MTIOCPOS
) && cmd_nr
==_IOC_NR(MTIOCPOS
)) { 1873 if(STp
->ready
!= ST_READY
) 1877 printk("st%d: get tape position.\n", dev
); 1879 if(_IOC_SIZE(cmd_in
) !=sizeof(struct mtpos
)) 1882 i
=flush_buffer(inode
, file
,0); 1886 i
=verify_area(VERIFY_WRITE
, (void*)arg
,sizeof(struct mtpos
)); 1891 if((STp
->device
)->scsi_level
< SCSI_2
) { 1892 scmd
[0] = QFA_REQUEST_BLOCK
; 1896 scmd
[0] = READ_POSITION
; 1899 SCpnt
=st_do_scsi(NULL
, STp
, scmd
,20, ST_TIMEOUT
, MAX_READY_RETRIES
); 1903 if((STp
->buffer
)->last_result_fatal
!=0) { 1904 mt_pos
.mt_blkno
= (-1); 1907 printk("st%d: Can't read tape position.\n", dev
); 1913 if((STp
->device
)->scsi_level
< SCSI_2
) 1914 mt_pos
.mt_blkno
= ((STp
->buffer
)->b_data
[0] <<16) 1915 + ((STp
->buffer
)->b_data
[1] <<8) 1916 + (STp
->buffer
)->b_data
[2]; 1918 mt_pos
.mt_blkno
= ((STp
->buffer
)->b_data
[4] <<24) 1919 + ((STp
->buffer
)->b_data
[5] <<16) 1920 + ((STp
->buffer
)->b_data
[6] <<8) 1921 + (STp
->buffer
)->b_data
[7]; 1925 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1927 memcpy_tofs((char*)arg
, (char*) (&mt_pos
),sizeof(struct mtpos
)); 1931 returnscsi_ioctl(STp
->device
, cmd_in
, (void*) arg
); 1935 /* Try to allocate a new tape buffer */ 1937 new_tape_buffer(int from_initialization
) 1939 int priority
, a_size
; 1942 if(st_nbr_buffers
>= st_template
.dev_max
) 1943 return NULL
;/* Should never happen */ 1945 if(from_initialization
) { 1946 priority
= GFP_ATOMIC
| GFP_DMA
; 1947 a_size
= st_buffer_size
; 1950 priority
= GFP_KERNEL
| GFP_DMA
; 1951 for(a_size
= PAGE_SIZE
; a_size
< st_buffer_size
; a_size
<<=1) 1952 ;/* Make sure we allocate efficiently */ 1954 tb
= (ST_buffer
*)scsi_init_malloc(sizeof(ST_buffer
), priority
); 1956 tb
->b_data
= (unsigned char*)scsi_init_malloc(a_size
, priority
); 1958 scsi_init_free((char*)tb
,sizeof(ST_buffer
)); 1963 printk("st: Can't allocate new tape buffer (nbr %d).\n", st_nbr_buffers
); 1969 printk("st: Allocated tape buffer %d (%d bytes).\n", st_nbr_buffers
, 1973 tb
->buffer_size
= a_size
; 1975 tb
->orig_b_data
= NULL
; 1976 st_buffers
[st_nbr_buffers
++] = tb
; 1981 /* Try to allocate a temporary enlarged tape buffer */ 1983 enlarge_buffer(ST_buffer
*STbuffer
,int new_size
) 1988 normalize_buffer(STbuffer
); 1990 for(a_size
= PAGE_SIZE
; a_size
< new_size
; a_size
<<=1) 1991 ;/* Make sure that we allocate efficiently */ 1993 tbd
= (unsigned char*)scsi_init_malloc(a_size
, GFP_DMA
| GFP_KERNEL
); 1999 printk("st: Buffer enlarged to %d bytes.\n", a_size
); 2002 STbuffer
->orig_b_data
= STbuffer
->b_data
; 2003 STbuffer
->orig_size
= STbuffer
->buffer_size
; 2004 STbuffer
->b_data
= tbd
; 2005 STbuffer
->buffer_size
= a_size
; 2010 /* Release the extra buffer */ 2012 normalize_buffer(ST_buffer
*STbuffer
) 2014 if(STbuffer
->orig_b_data
== NULL
) 2017 scsi_init_free(STbuffer
->b_data
, STbuffer
->buffer_size
); 2018 STbuffer
->b_data
= STbuffer
->orig_b_data
; 2019 STbuffer
->orig_b_data
= NULL
; 2020 STbuffer
->buffer_size
= STbuffer
->orig_size
; 2024 printk("st: Buffer normalized to %d bytes.\n", STbuffer
->buffer_size
); 2029 /* Set the boot options. Syntax: st=xxx,yyy 2030 where xxx is buffer size in 512 byte blocks and yyy is write threshold 2031 in 512 byte blocks. */ 2033 st_setup(char*str
,int*ints
) 2035 if(ints
[0] >0&& ints
[1] >0) 2036 st_buffer_size
= ints
[1] * ST_BLOCK_SIZE
; 2037 if(ints
[0] >1&& ints
[2] >0) { 2038 st_write_threshold
= ints
[2] * ST_BLOCK_SIZE
; 2039 if(st_write_threshold
> st_buffer_size
) 2040 st_write_threshold
= st_buffer_size
; 2042 if(ints
[0] >2&& ints
[3] >0) 2043 st_max_buffers
= ints
[3]; 2047 static struct file_operations st_fops
= { 2048 NULL
,/* lseek - default */ 2049 st_read
,/* read - general block-dev read */ 2050 st_write
,/* write - general block-dev write */ 2051 NULL
,/* readdir - bad */ 2053 st_ioctl
,/* ioctl */ 2055 scsi_tape_open
,/* open */ 2056 scsi_tape_close
,/* release */ 2060 static intst_attach(Scsi_Device
* SDp
){ 2064 if(SDp
->type
!= TYPE_TAPE
)return1; 2066 if(st_template
.nr_dev
>= st_template
.dev_max
) 2072 for(tpnt
= scsi_tapes
, i
=0; i
<st_template
.dev_max
; i
++, tpnt
++) 2073 if(!tpnt
->device
)break; 2075 if(i
>= st_template
.dev_max
)panic("scsi_devices corrupt (st)"); 2077 scsi_tapes
[i
].device
= SDp
; 2078 if(SDp
->scsi_level
<=2) 2079 scsi_tapes
[i
].mt_status
->mt_type
= MT_ISSCSI1
; 2081 scsi_tapes
[i
].mt_status
->mt_type
= MT_ISSCSI2
; 2083 tpnt
->devt
=MKDEV(SCSI_TAPE_MAJOR
, i
); 2086 tpnt
->eof
= ST_NOEOF
; 2087 tpnt
->waiting
= NULL
; 2089 tpnt
->drv_buffer
=1;/* Try buffering if no mode sense */ 2091 tpnt
->do_buffer_writes
= ST_BUFFER_WRITES
; 2092 tpnt
->do_async_writes
= ST_ASYNC_WRITES
; 2093 tpnt
->do_read_ahead
= ST_READ_AHEAD
; 2094 tpnt
->do_auto_lock
= ST_AUTO_LOCK
; 2095 tpnt
->two_fm
= ST_TWO_FM
; 2096 tpnt
->fast_mteom
= ST_FAST_MTEOM
; 2097 tpnt
->write_threshold
= st_write_threshold
; 2099 tpnt
->moves_after_eof
=1; 2102 st_template
.nr_dev
++; 2106 static intst_detect(Scsi_Device
* SDp
) 2108 if(SDp
->type
!= TYPE_TAPE
)return0; 2110 printk("Detected scsi tape st%d at scsi%d, channel %d, id %d, lun %d\n", 2111 st_template
.dev_noticed
++, 2112 SDp
->host
->host_no
, SDp
->channel
, SDp
->id
, SDp
->lun
); 2117 static int st_registered
=0; 2119 /* Driver initialization */ 2124 #if !ST_RUNTIME_BUFFERS 2128 if(st_template
.dev_noticed
==0)return0; 2130 if(!st_registered
) { 2131 if(register_chrdev(SCSI_TAPE_MAJOR
,"st",&st_fops
)) { 2132 printk("Unable to get major %d for SCSI tapes\n",MAJOR_NR
); 2138 if(scsi_tapes
)return0; 2139 st_template
.dev_max
= st_template
.dev_noticed
+ ST_EXTRA_DEVS
; 2140 if(st_template
.dev_max
< ST_MAX_TAPES
) 2141 st_template
.dev_max
= ST_MAX_TAPES
; 2143 (Scsi_Tape
*)scsi_init_malloc(st_template
.dev_max
*sizeof(Scsi_Tape
), 2145 if(scsi_tapes
== NULL
) { 2146 printk("Unable to allocate descriptors for SCSI tapes.\n"); 2147 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2152 printk("st: Buffer size %d bytes, write threshold %d bytes.\n", 2153 st_buffer_size
, st_write_threshold
); 2156 for(i
=0; i
< st_template
.dev_max
; ++i
) { 2157 STp
= &(scsi_tapes
[i
]); 2159 STp
->capacity
=0xfffff; 2162 STp
->eof
= ST_NOEOF
; 2163 STp
->waiting
= NULL
; 2165 STp
->drv_buffer
=1;/* Try buffering if no mode sense */ 2167 STp
->do_buffer_writes
= ST_BUFFER_WRITES
; 2168 STp
->do_async_writes
= ST_ASYNC_WRITES
; 2169 STp
->do_read_ahead
= ST_READ_AHEAD
; 2170 STp
->do_auto_lock
= ST_AUTO_LOCK
; 2171 STp
->two_fm
= ST_TWO_FM
; 2172 STp
->fast_mteom
= ST_FAST_MTEOM
; 2173 STp
->write_threshold
= st_write_threshold
; 2175 STp
->moves_after_eof
=1; 2177 STp
->mt_status
= (struct mtget
*)scsi_init_malloc(sizeof(struct mtget
), 2179 /* Initialize status */ 2180 memset((void*) scsi_tapes
[i
].mt_status
,0,sizeof(struct mtget
)); 2183 /* Allocate the buffers */ 2185 (ST_buffer
**)scsi_init_malloc(st_template
.dev_max
*sizeof(ST_buffer
*), 2187 if(st_buffers
== NULL
) { 2188 printk("Unable to allocate tape buffer pointers.\n"); 2189 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2190 scsi_init_free((char*) scsi_tapes
, 2191 st_template
.dev_max
*sizeof(Scsi_Tape
)); 2195 #if ST_RUNTIME_BUFFERS 2198 target_nbr
= st_template
.dev_noticed
; 2199 if(target_nbr
< ST_EXTRA_DEVS
) 2200 target_nbr
= ST_EXTRA_DEVS
; 2201 if(target_nbr
> st_max_buffers
) 2202 target_nbr
= st_max_buffers
; 2204 for(i
=st_nbr_buffers
=0; i
< target_nbr
; i
++) { 2205 if(!new_tape_buffer(TRUE
)) { 2207 printk("Can't continue without at least one tape buffer.\n"); 2208 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2209 scsi_init_free((char*) st_buffers
, 2210 st_template
.dev_max
*sizeof(ST_buffer
*)); 2211 scsi_init_free((char*) scsi_tapes
, 2212 st_template
.dev_max
*sizeof(Scsi_Tape
)); 2215 printk("Number of tape buffers adjusted.\n"); 2223 static voidst_detach(Scsi_Device
* SDp
) 2228 for(tpnt
= scsi_tapes
, i
=0; i
<st_template
.dev_max
; i
++, tpnt
++) 2229 if(tpnt
->device
== SDp
) { 2230 tpnt
->device
= NULL
; 2232 st_template
.nr_dev
--; 2233 st_template
.dev_noticed
--; 2242 intinit_module(void) { 2243 st_template
.usage_count
= &mod_use_count_
; 2244 returnscsi_register_module(MODULE_SCSI_DEV
, &st_template
); 2247 voidcleanup_module(void) 2251 scsi_unregister_module(MODULE_SCSI_DEV
, &st_template
); 2252 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2254 if(scsi_tapes
!= NULL
) { 2255 scsi_init_free((char*) scsi_tapes
, 2256 st_template
.dev_max
*sizeof(Scsi_Tape
)); 2258 if(st_buffers
!= NULL
) { 2259 for(i
=0; i
< st_nbr_buffers
; i
++) 2260 if(st_buffers
[i
] != NULL
) { 2261 scsi_init_free((char*) st_buffers
[i
]->b_data
, 2262 st_buffers
[i
]->buffer_size
); 2263 scsi_init_free((char*) st_buffers
[i
],sizeof(ST_buffer
)); 2266 scsi_init_free((char*) st_buffers
, 2267 st_template
.dev_max
*sizeof(ST_buffer
*)); 2270 st_template
.dev_max
=0;