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 - 1996 Kai Makisara 12 email Kai.Makisara@metla.fi 14 Last modified: Sun Apr 7 20:33:27 1996 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 /* The message level for the debug messages is currently set to KERN_NOTICE 38 so that people can easily see the messages. Later when the debugging messages 39 in the drivers are more widely classified, this may be changed to KERN_DEBUG. */ 40 #define ST_DEB_MSG KERN_NOTICE 42 #define MAJOR_NR SCSI_TAPE_MAJOR 43 #include <linux/blk.h> 46 #include"scsi_ioctl.h" 50 /* The default definitions have been moved to st_options.h */ 52 #define ST_BLOCK_SIZE 1024 54 #include"st_options.h" 56 #define ST_BUFFER_SIZE (ST_BUFFER_BLOCKS * ST_BLOCK_SIZE) 57 #define ST_WRITE_THRESHOLD (ST_WRITE_THRESHOLD_BLOCKS * ST_BLOCK_SIZE) 59 /* The buffer size should fit into the 24 bits for length in the 60 6-byte SCSI read and write commands. */ 61 #if ST_BUFFER_SIZE >= (2 << 24 - 1) 62 #error"Buffer size should not exceed (2 << 24 - 1) bytes!" 66 static int debugging
=1; 70 #define MAX_WRITE_RETRIES 0 71 #define MAX_READY_RETRIES 5 72 #define NO_TAPE NOT_READY 74 #define ST_TIMEOUT (900 * HZ) 75 #define ST_LONG_TIMEOUT (2000 * HZ) 77 #define TAPE_NR(x) (MINOR(x) & ~(128 | ST_MODE_MASK)) 78 #define TAPE_MODE(x) ((MINOR(x) & ST_MODE_MASK) >> ST_MODE_SHIFT) 80 static int st_nbr_buffers
; 81 static ST_buffer
**st_buffers
; 82 static int st_buffer_size
= ST_BUFFER_SIZE
; 83 static int st_write_threshold
= ST_WRITE_THRESHOLD
; 84 static int st_max_buffers
= ST_MAX_BUFFERS
; 86 Scsi_Tape
* scsi_tapes
= NULL
; 88 static int modes_defined
= FALSE
; 90 static ST_buffer
*new_tape_buffer(int,int); 91 static intenlarge_buffer(ST_buffer
*,int,int); 92 static voidnormalize_buffer(ST_buffer
*); 94 static intst_init(void); 95 static intst_attach(Scsi_Device
*); 96 static intst_detect(Scsi_Device
*); 97 static voidst_detach(Scsi_Device
*); 99 struct Scsi_Device_Template st_template
= {NULL
,"tape","st", NULL
, TYPE_TAPE
, 100 SCSI_TAPE_MAJOR
,0,0,0,0, 102 NULL
, st_attach
, st_detach
}; 104 static intst_compression(Scsi_Tape
*,int); 106 static intst_int_ioctl(struct inode
* inode
,struct file
* file
, 107 unsigned int cmd_in
,unsigned long arg
); 112 /* Convert the result to success code */ 114 st_chk_result(Scsi_Cmnd
* SCpnt
) 116 int dev
=TAPE_NR(SCpnt
->request
.rq_dev
); 117 int result
= SCpnt
->result
; 118 unsigned char* sense
= SCpnt
->sense_buffer
, scode
; 123 if(!result
/* && SCpnt->sense_buffer[0] == 0 */) 127 printk(ST_DEB_MSG
"st%d: Error: %x, cmd: %x %x %x %x %x %x Len: %d\n", 129 SCpnt
->data_cmnd
[0], SCpnt
->data_cmnd
[1], SCpnt
->data_cmnd
[2], 130 SCpnt
->data_cmnd
[3], SCpnt
->data_cmnd
[4], SCpnt
->data_cmnd
[5], 131 SCpnt
->request_bufflen
); 132 if(driver_byte(result
) & DRIVER_SENSE
) 133 print_sense("st", SCpnt
); 138 scode
= sense
[2] &0x0f; 139 if(!(driver_byte(result
) & DRIVER_SENSE
) || 140 ((sense
[0] &0x70) ==0x70&& 142 scode
!= RECOVERED_ERROR
&& 143 /* scode != UNIT_ATTENTION && */ 144 scode
!= BLANK_CHECK
&& 145 scode
!= VOLUME_OVERFLOW
&& 146 SCpnt
->data_cmnd
[0] != MODE_SENSE
&& 147 SCpnt
->data_cmnd
[0] != TEST_UNIT_READY
)) {/* Abnormal conditions for tape */ 149 if(driver_byte(result
) & DRIVER_SENSE
) { 150 printk(KERN_WARNING
"st%d: Error with sense data: ", dev
); 151 print_sense("st", SCpnt
); 154 printk(KERN_WARNING
"st%d: Error %x.\n", dev
, result
); 158 if((sense
[0] &0x70) ==0x70&& 159 scode
== RECOVERED_ERROR
160 #if ST_RECOVERED_WRITE_FATAL 161 && SCpnt
->data_cmnd
[0] != WRITE_6
162 && SCpnt
->data_cmnd
[0] != WRITE_FILEMARKS
165 scsi_tapes
[dev
].recover_count
++; 166 scsi_tapes
[dev
].mt_status
->mt_erreg
+= (1<< MT_ST_SOFTERR_SHIFT
); 168 if(debugging
) {/* This is compiled always on purpose */ 169 if(SCpnt
->data_cmnd
[0] == READ_6
) 171 else if(SCpnt
->data_cmnd
[0] == WRITE_6
) 175 printk(ST_DEB_MSG
"st%d: Recovered %s error (%d).\n", dev
, stp
, 176 scsi_tapes
[dev
].recover_count
); 179 if((sense
[2] &0xe0) ==0) 186 /* Wakeup from interrupt */ 188 st_sleep_done(Scsi_Cmnd
* SCpnt
) 194 if((st_nbr
=TAPE_NR(SCpnt
->request
.rq_dev
)) < st_template
.nr_dev
) { 195 STp
= &(scsi_tapes
[st_nbr
]); 196 if((STp
->buffer
)->writing
&& 197 (SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 198 (SCpnt
->sense_buffer
[2] &0x40)) { 199 /* EOM at write-behind, has all been written? */ 200 if((SCpnt
->sense_buffer
[0] &0x80) !=0) 201 remainder
= (SCpnt
->sense_buffer
[3] <<24) | 202 (SCpnt
->sense_buffer
[4] <<16) | 203 (SCpnt
->sense_buffer
[5] <<8) | SCpnt
->sense_buffer
[6]; 206 if((SCpnt
->sense_buffer
[2] &0x0f) == VOLUME_OVERFLOW
|| 208 (STp
->buffer
)->last_result
= SCpnt
->result
;/* Error */ 210 (STp
->buffer
)->last_result
= INT_MAX
;/* OK */ 213 (STp
->buffer
)->last_result
= SCpnt
->result
; 214 if((STp
->buffer
)->writing
) { 215 /* Process errors before releasing request */ 216 (STp
->buffer
)->last_result_fatal
=st_chk_result(SCpnt
); 217 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 220 SCpnt
->request
.rq_status
= RQ_SCSI_DONE
; 223 STp
->write_pending
=0; 225 up(SCpnt
->request
.sem
); 229 printk(KERN_ERR
"st?: Illegal interrupt device %x\n", st_nbr
); 234 /* Do the scsi command */ 236 st_do_scsi(Scsi_Cmnd
*SCpnt
, Scsi_Tape
*STp
,unsigned char*cmd
,int bytes
, 237 int timeout
,int retries
) 240 if((SCpnt
=allocate_device(NULL
, STp
->device
,1)) == NULL
) { 241 printk(KERN_ERR
"st%d: Can't get SCSI request.\n",TAPE_NR(STp
->devt
)); 245 cmd
[1] |= (SCpnt
->lun
<<5) &0xe0; 246 STp
->sem
= MUTEX_LOCKED
; 247 SCpnt
->request
.sem
= &(STp
->sem
); 248 SCpnt
->request
.rq_status
= RQ_SCSI_BUSY
; 249 SCpnt
->request
.rq_dev
= STp
->devt
; 251 scsi_do_cmd(SCpnt
, (void*)cmd
, (STp
->buffer
)->b_data
, bytes
, 252 st_sleep_done
, timeout
, retries
); 254 down(SCpnt
->request
.sem
); 256 (STp
->buffer
)->last_result_fatal
=st_chk_result(SCpnt
); 262 /* Handle the write-behind checking */ 264 write_behind_check(Scsi_Tape
*STp
) 266 ST_buffer
* STbuffer
; 268 STbuffer
= STp
->buffer
; 271 if(STp
->write_pending
) 279 if(STbuffer
->writing
< STbuffer
->buffer_bytes
) 280 memcpy(STbuffer
->b_data
, 281 STbuffer
->b_data
+ STbuffer
->writing
, 282 STbuffer
->buffer_bytes
- STbuffer
->writing
); 283 STbuffer
->buffer_bytes
-= STbuffer
->writing
; 284 if(STp
->drv_block
>=0) { 285 if(STp
->block_size
==0) 288 STp
->drv_block
+= STbuffer
->writing
/ STp
->block_size
; 290 STbuffer
->writing
=0; 296 /* Back over EOF if it has been inadvertently crossed (ioctl not used because 297 it messes up the block number). */ 299 back_over_eof(Scsi_Tape
*STp
) 302 unsigned char cmd
[10]; 305 cmd
[1] =0x01;/* Space FileMarks */ 306 cmd
[2] = cmd
[3] = cmd
[4] =0xff;/* -1 filemarks */ 309 SCpnt
=st_do_scsi(NULL
, STp
, cmd
,0, ST_TIMEOUT
, MAX_RETRIES
); 313 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 314 if((STp
->buffer
)->last_result
!=0) { 315 printk(KERN_ERR
"st%d: Backing over filemark failed.\n",TAPE_NR(STp
->devt
)); 316 if((STp
->mt_status
)->mt_fileno
>=0) 317 (STp
->mt_status
)->mt_fileno
+=1; 318 (STp
->mt_status
)->mt_blkno
=0; 321 return(STp
->buffer
)->last_result_fatal
; 325 /* Flush the write buffer (never need to write if variable blocksize). */ 327 flush_write_buffer(Scsi_Tape
*STp
) 329 int offset
, transfer
, blks
; 331 unsigned char cmd
[10]; 334 if((STp
->buffer
)->writing
) { 335 write_behind_check(STp
); 336 if((STp
->buffer
)->last_result_fatal
) { 339 printk(ST_DEB_MSG
"st%d: Async write error (flush) %x.\n", 340 TAPE_NR(STp
->devt
), (STp
->buffer
)->last_result
); 342 if((STp
->buffer
)->last_result
== INT_MAX
) 348 if(STp
->block_size
==0) 354 offset
= (STp
->buffer
)->buffer_bytes
; 355 transfer
= ((offset
+ STp
->block_size
-1) / 356 STp
->block_size
) * STp
->block_size
; 359 printk(ST_DEB_MSG
"st%d: Flushing %d bytes.\n",TAPE_NR(STp
->devt
), transfer
); 361 memset((STp
->buffer
)->b_data
+ offset
,0, transfer
- offset
); 366 blks
= transfer
/ STp
->block_size
; 371 SCpnt
=st_do_scsi(NULL
, STp
, cmd
, transfer
, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 375 if((STp
->buffer
)->last_result_fatal
!=0) { 376 printk(KERN_ERR
"st%d: Error on flush.\n",TAPE_NR(STp
->devt
)); 377 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 378 (SCpnt
->sense_buffer
[2] &0x40) && 379 (SCpnt
->sense_buffer
[2] &0x0f) != VOLUME_OVERFLOW
) { 381 (STp
->buffer
)->buffer_bytes
=0; 386 STp
->drv_block
= (-1); 389 if(STp
->drv_block
>=0) 390 STp
->drv_block
+= blks
; 392 (STp
->buffer
)->buffer_bytes
=0; 394 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 400 /* Flush the tape buffer. The tape will be positioned correctly unless 401 seek_next is true. */ 403 flush_buffer(struct inode
* inode
,struct file
* filp
,int seek_next
) 405 int backspace
, result
; 407 ST_buffer
* STbuffer
; 408 int dev
=TAPE_NR(inode
->i_rdev
); 410 STp
= &(scsi_tapes
[dev
]); 411 STbuffer
= STp
->buffer
; 414 * If there was a bus reset, block further access 417 if( STp
->device
->was_reset
) 420 if(STp
->ready
!= ST_READY
) 423 if(STp
->rw
== ST_WRITING
)/* Writing */ 424 returnflush_write_buffer(STp
); 426 if(STp
->block_size
==0) 429 backspace
= ((STp
->buffer
)->buffer_bytes
+ 430 (STp
->buffer
)->read_pointer
) / STp
->block_size
- 431 ((STp
->buffer
)->read_pointer
+ STp
->block_size
-1) / 433 (STp
->buffer
)->buffer_bytes
=0; 434 (STp
->buffer
)->read_pointer
=0; 437 if((STp
->eof
== ST_FM
) && !STp
->eof_hit
) { 438 result
=back_over_eof(STp
);/* Back over the EOF hit */ 444 if(!result
&& backspace
>0) 445 result
=st_int_ioctl(inode
, filp
, MTBSR
, backspace
); 447 else if((STp
->eof
== ST_FM
) && !STp
->eof_hit
) { 448 (STp
->mt_status
)->mt_fileno
++; 457 /* Open the device */ 459 scsi_tape_open(struct inode
* inode
,struct file
* filp
) 461 unsigned short flags
; 462 int i
, need_dma_buffer
, new_session
= FALSE
, setting_failed
; 463 unsigned char cmd
[10]; 467 int dev
=TAPE_NR(inode
->i_rdev
); 468 int mode
=TAPE_MODE(inode
->i_rdev
); 470 if(dev
>= st_template
.dev_max
|| !scsi_tapes
[dev
].device
) 472 STp
= &(scsi_tapes
[dev
]); 475 printk(ST_DEB_MSG
"st%d: Device already in use.\n", dev
); 479 STp
->rew_at_close
= (MINOR(inode
->i_rdev
) &0x80) ==0; 481 if(mode
!= STp
->current_mode
) { 484 printk(ST_DEB_MSG
"st%d: Mode change from %d to %d.\n", 485 dev
, STp
->current_mode
, mode
); 487 /* if (!STp->modes[mode].defined) 490 STp
->current_mode
= mode
; 492 STm
= &(STp
->modes
[STp
->current_mode
]); 494 /* Allocate buffer for this user */ 495 need_dma_buffer
= STp
->restr_dma
; 496 for(i
=0; i
< st_nbr_buffers
; i
++) 497 if(!st_buffers
[i
]->in_use
&& 498 (!need_dma_buffer
|| st_buffers
[i
]->dma
)) 500 if(i
>= st_nbr_buffers
) { 501 STp
->buffer
=new_tape_buffer(FALSE
, need_dma_buffer
); 502 if(STp
->buffer
== NULL
) { 503 printk(KERN_WARNING
"st%d: Can't allocate tape buffer.\n", dev
); 508 STp
->buffer
= st_buffers
[i
]; 509 (STp
->buffer
)->in_use
=1; 510 (STp
->buffer
)->writing
=0; 513 flags
= filp
->f_flags
; 514 STp
->write_prot
= ((flags
& O_ACCMODE
) == O_RDONLY
); 518 STp
->ready
= ST_READY
; 519 if(STp
->eof
!= ST_EOD
)/* Save EOD across opens */ 522 STp
->recover_count
=0; 524 STp
->nbr_waits
= STp
->nbr_finished
=0; 527 memset((void*) &cmd
[0],0,10); 528 cmd
[0] = TEST_UNIT_READY
; 530 SCpnt
=st_do_scsi(NULL
, STp
, cmd
,0, ST_LONG_TIMEOUT
, MAX_READY_RETRIES
); 534 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 535 (SCpnt
->sense_buffer
[2] &0x0f) == UNIT_ATTENTION
) {/* New media? */ 536 (STp
->mt_status
)->mt_fileno
=0; 537 memset((void*) &cmd
[0],0,10); 538 cmd
[0] = TEST_UNIT_READY
; 540 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
,0, ST_LONG_TIMEOUT
, MAX_READY_RETRIES
); 542 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
=0; 544 (STp
->device
)->was_reset
=0; 548 if((STp
->buffer
)->last_result_fatal
!=0) { 549 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 550 (SCpnt
->sense_buffer
[2] &0x0f) == NO_TAPE
) { 551 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
=0; 552 printk(KERN_NOTICE
"st%d: No tape.\n", dev
); 553 STp
->ready
= ST_NO_TAPE
; 555 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
= (-1); 556 STp
->ready
= ST_NOT_READY
; 558 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 559 STp
->density
=0;/* Clear the erroneous "residue" */ 563 (STp
->mt_status
)->mt_fileno
= STp
->drv_block
=0; 564 STp
->door_locked
= ST_UNLOCKED
; 565 if(scsi_tapes
[dev
].device
->host
->hostt
->usage_count
) 566 (*scsi_tapes
[dev
].device
->host
->hostt
->usage_count
)++; 567 if(st_template
.usage_count
) (*st_template
.usage_count
)++; 571 memset((void*) &cmd
[0],0,10); 572 cmd
[0] = READ_BLOCK_LIMITS
; 574 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
,6, ST_TIMEOUT
, MAX_READY_RETRIES
); 576 if(!SCpnt
->result
&& !SCpnt
->sense_buffer
[0]) { 577 STp
->max_block
= ((STp
->buffer
)->b_data
[1] <<16) | 578 ((STp
->buffer
)->b_data
[2] <<8) | (STp
->buffer
)->b_data
[3]; 579 STp
->min_block
= ((STp
->buffer
)->b_data
[4] <<8) | 580 (STp
->buffer
)->b_data
[5]; 583 printk(ST_DEB_MSG
"st%d: Block limits %d - %d bytes.\n", dev
, STp
->min_block
, 588 STp
->min_block
= STp
->max_block
= (-1); 591 printk(ST_DEB_MSG
"st%d: Can't read block limits.\n", dev
); 595 memset((void*) &cmd
[0],0,10); 599 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
,12, ST_TIMEOUT
, MAX_READY_RETRIES
); 601 if((STp
->buffer
)->last_result_fatal
!=0) { 604 printk(ST_DEB_MSG
"st%d: No Mode Sense.\n", dev
); 606 STp
->block_size
= ST_DEFAULT_BLOCK
;/* Educated guess (?) */ 607 (STp
->buffer
)->last_result_fatal
=0;/* Prevent error propagation */ 608 STp
->drv_write_prot
=0; 614 printk(ST_DEB_MSG
"st%d: Mode sense. Length %d, medium %x, WBS %x, BLL %d\n", 616 (STp
->buffer
)->b_data
[0], (STp
->buffer
)->b_data
[1], 617 (STp
->buffer
)->b_data
[2], (STp
->buffer
)->b_data
[3]); 620 if((STp
->buffer
)->b_data
[3] >=8) { 621 STp
->drv_buffer
= ((STp
->buffer
)->b_data
[2] >>4) &7; 622 STp
->density
= (STp
->buffer
)->b_data
[4]; 623 STp
->block_size
= (STp
->buffer
)->b_data
[9] *65536+ 624 (STp
->buffer
)->b_data
[10] *256+ (STp
->buffer
)->b_data
[11]; 627 printk(ST_DEB_MSG
"st%d: Density %x, tape length: %x, drv buffer: %d\n", 628 dev
, STp
->density
, (STp
->buffer
)->b_data
[5] *65536+ 629 (STp
->buffer
)->b_data
[6] *256+ (STp
->buffer
)->b_data
[7], 634 if(STp
->block_size
> (STp
->buffer
)->buffer_size
&& 635 !enlarge_buffer(STp
->buffer
, STp
->block_size
, STp
->restr_dma
)) { 636 printk(KERN_NOTICE
"st%d: Blocksize %d too large for buffer.\n", dev
, 638 (STp
->buffer
)->in_use
=0; 642 STp
->drv_write_prot
= ((STp
->buffer
)->b_data
[2] &0x80) !=0; 644 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 646 if(STp
->block_size
>0) 647 (STp
->buffer
)->buffer_blocks
= st_buffer_size
/ STp
->block_size
; 649 (STp
->buffer
)->buffer_blocks
=1; 650 (STp
->buffer
)->buffer_bytes
= (STp
->buffer
)->read_pointer
=0; 654 printk(ST_DEB_MSG
"st%d: Block size: %d, buffer size: %d (%d blocks).\n", dev
, 655 STp
->block_size
, (STp
->buffer
)->buffer_size
, 656 (STp
->buffer
)->buffer_blocks
); 659 if(STp
->drv_write_prot
) { 663 printk(ST_DEB_MSG
"st%d: Write protected\n", dev
); 665 if((flags
& O_ACCMODE
) == O_WRONLY
|| (flags
& O_ACCMODE
) == O_RDWR
) { 666 (STp
->buffer
)->in_use
=0; 674 STp
->density_changed
= STp
->blksize_changed
= FALSE
; 675 STp
->compression_changed
= FALSE
; 676 if(!(STm
->defaults_for_writes
)) { 677 setting_failed
= FALSE
; 678 if(STm
->default_blksize
>=0&& 679 STm
->default_blksize
!= STp
->block_size
) { 680 if(STm
->default_density
>=0&& 681 STm
->default_density
!= STp
->density
) 682 STp
->density
= STm
->default_density
;/* Dirty trick! */ 683 if(st_int_ioctl(inode
, filp
, MTSETBLK
, STm
->default_blksize
)) { 684 printk(KERN_WARNING
"st%d: Can't set default block size to %d bytes.\n", 685 dev
, STm
->default_blksize
); 687 setting_failed
= TRUE
; 690 if(STm
->default_density
>=0&& 691 STm
->default_density
!= STp
->density
) { 692 if(st_int_ioctl(inode
, filp
, MTSETDENSITY
, STm
->default_density
)) { 693 printk(KERN_WARNING
"st%d: Can't set default density to %x.\n", 694 dev
, STm
->default_density
); 696 setting_failed
= TRUE
; 700 (STp
->buffer
)->in_use
=0; 706 if(STp
->default_drvbuffer
!=0xff) { 707 if(st_int_ioctl(inode
, filp
, MTSETDRVBUFFER
, STp
->default_drvbuffer
)) 708 printk(KERN_WARNING
"st%d: Can't set default drive buffering to %d.\n", 709 dev
, STp
->default_drvbuffer
); 713 if(scsi_tapes
[dev
].device
->host
->hostt
->usage_count
) 714 (*scsi_tapes
[dev
].device
->host
->hostt
->usage_count
)++; 715 if(st_template
.usage_count
) (*st_template
.usage_count
)++; 721 /* Close the device*/ 723 scsi_tape_close(struct inode
* inode
,struct file
* filp
) 726 static unsigned char cmd
[10]; 729 kdev_t devt
= inode
->i_rdev
; 733 STp
= &(scsi_tapes
[dev
]); 735 if( STp
->rw
== ST_WRITING
&& !(STp
->device
)->was_reset
) { 737 result
=flush_write_buffer(STp
); 741 printk(ST_DEB_MSG
"st%d: File length %ld bytes.\n", 742 dev
, (long)(filp
->f_pos
)); 743 printk(ST_DEB_MSG
"st%d: Async write waits %d, finished %d.\n", 744 dev
, STp
->nbr_waits
, STp
->nbr_finished
); 748 if(result
==0|| result
== (-ENOSPC
)) { 751 cmd
[0] = WRITE_FILEMARKS
; 752 cmd
[4] =1+ STp
->two_fm
; 754 SCpnt
=st_do_scsi(NULL
, STp
, cmd
,0, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 758 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 760 if((STp
->buffer
)->last_result_fatal
!=0) 761 printk(KERN_ERR
"st%d: Error on write filemark.\n", dev
); 763 if((STp
->mt_status
)->mt_fileno
>=0) 764 (STp
->mt_status
)->mt_fileno
++ ; 773 printk(ST_DEB_MSG
"st%d: Buffer flushed, %d EOF(s) written\n", 777 else if(!STp
->rew_at_close
) { 779 flush_buffer(inode
, filp
,0); 780 else if((STp
->eof
== ST_FM
) && !STp
->eof_hit
) 784 if(STp
->rew_at_close
) 785 st_int_ioctl(inode
, filp
, MTREW
,1); 787 if(STp
->door_locked
== ST_LOCKED_AUTO
) 788 st_int_ioctl(inode
, filp
, MTUNLOCK
,0); 790 if(STp
->buffer
!= NULL
) { 791 normalize_buffer(STp
->buffer
); 792 (STp
->buffer
)->in_use
=0; 796 if(scsi_tapes
[dev
].device
->host
->hostt
->usage_count
) 797 (*scsi_tapes
[dev
].device
->host
->hostt
->usage_count
)--; 798 if(st_template
.usage_count
) (*st_template
.usage_count
)--; 806 st_write(struct inode
* inode
,struct file
* filp
,const char* buf
,int count
) 808 int total
, do_count
, blks
, retval
, transfer
; 811 static unsigned char cmd
[10]; 813 Scsi_Cmnd
* SCpnt
= NULL
; 816 int dev
=TAPE_NR(inode
->i_rdev
); 818 STp
= &(scsi_tapes
[dev
]); 819 if(STp
->ready
!= ST_READY
) 821 STm
= &(STp
->modes
[STp
->current_mode
]); 826 * If there was a bus reset, block further access 829 if( STp
->device
->was_reset
) 834 printk(ST_DEB_MSG
"st%d: Incorrect device.\n", dev
); 842 if(STp
->block_size
==0&& 843 count
> (STp
->buffer
)->buffer_size
&& 844 !enlarge_buffer(STp
->buffer
, count
, STp
->restr_dma
)) 847 if(STp
->do_auto_lock
&& STp
->door_locked
== ST_UNLOCKED
&& 848 !st_int_ioctl(inode
, filp
, MTLOCK
,0)) 849 STp
->door_locked
= ST_LOCKED_AUTO
; 851 if(STp
->rw
== ST_READING
) { 852 retval
=flush_buffer(inode
, filp
,0); 855 STp
->rw
= ST_WRITING
; 857 else if(STp
->rw
!= ST_WRITING
) { 858 if(STm
->defaults_for_writes
&& 859 (STp
->mt_status
)->mt_fileno
==0&& STp
->drv_block
==0) { 860 /* Force unless explicitly changed by the user */ 861 if(!(STp
->blksize_changed
) && STm
->default_blksize
>=0&& 862 STp
->block_size
!= STm
->default_blksize
) { 863 if(STm
->default_density
>=0&& 864 STm
->default_density
!= STp
->density
) 865 STp
->density
= STm
->default_density
;/* Dirty trick! */ 866 if(st_int_ioctl(inode
, filp
, MTSETBLK
, STm
->default_blksize
)) { 867 printk(KERN_WARNING
"st%d: Can't set default block size to %d bytes.\n", 868 dev
, STm
->default_blksize
); 873 if(!(STp
->density_changed
) && STm
->default_density
>=0&& 874 STm
->default_density
!= STp
->density
) { 875 if(st_int_ioctl(inode
, filp
, MTSETDENSITY
, STm
->default_density
)) { 876 printk(KERN_WARNING
"st%d: Can't set default density %x.\n", 877 dev
, STm
->default_density
); 883 if(STm
->default_compression
!= ST_DONT_TOUCH
&& 884 !(STp
->compression_changed
)) { 885 if(st_compression(STp
, (STm
->default_compression
== ST_YES
))) { 886 printk(KERN_WARNING
"st%d: Can't set default compression.\n", 894 if(STp
->moves_after_eof
<255) 895 STp
->moves_after_eof
++; 897 if((STp
->buffer
)->writing
) { 898 write_behind_check(STp
); 899 if((STp
->buffer
)->last_result_fatal
) { 902 printk(ST_DEB_MSG
"st%d: Async write error (write) %x.\n", dev
, 903 (STp
->buffer
)->last_result
); 905 if((STp
->buffer
)->last_result
== INT_MAX
) { 906 retval
= (-ENOSPC
);/* All has been written */ 907 STp
->eof
= ST_EOM_OK
; 914 if(STp
->eof
== ST_EOM_OK
) 916 else if(STp
->eof
== ST_EOM_ERROR
) 919 if(!STm
->do_buffer_writes
) { 920 if(STp
->block_size
!=0&& (count
% STp
->block_size
) !=0) 921 return(-EIO
);/* Write must be integral number of blocks */ 925 write_threshold
= (STp
->buffer
)->buffer_blocks
* STp
->block_size
; 926 if(!STm
->do_async_writes
) 933 cmd
[1] = (STp
->block_size
!=0); 935 STp
->rw
= ST_WRITING
; 938 while((STp
->block_size
==0&& !STm
->do_async_writes
&& count
>0) || 939 (STp
->block_size
!=0&& 940 (STp
->buffer
)->buffer_bytes
+ count
> write_threshold
)) 943 if(STp
->block_size
==0) 946 do_count
= (STp
->buffer
)->buffer_blocks
* STp
->block_size
- 947 (STp
->buffer
)->buffer_bytes
; 951 memcpy_fromfs((STp
->buffer
)->b_data
+ 952 (STp
->buffer
)->buffer_bytes
, b_point
, do_count
); 954 if(STp
->block_size
==0) 955 blks
= transfer
= do_count
; 957 blks
= ((STp
->buffer
)->buffer_bytes
+ do_count
) / 959 transfer
= blks
* STp
->block_size
; 965 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
, transfer
, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 969 if((STp
->buffer
)->last_result_fatal
!=0) { 972 printk(ST_DEB_MSG
"st%d: Error on write:\n", dev
); 974 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70&& 975 (SCpnt
->sense_buffer
[2] &0x40)) { 976 if(STp
->block_size
!=0&& (SCpnt
->sense_buffer
[0] &0x80) !=0) 977 transfer
= (SCpnt
->sense_buffer
[3] <<24) | 978 (SCpnt
->sense_buffer
[4] <<16) | 979 (SCpnt
->sense_buffer
[5] <<8) | SCpnt
->sense_buffer
[6]; 980 else if(STp
->block_size
==0&& 981 (SCpnt
->sense_buffer
[2] &0x0f) == VOLUME_OVERFLOW
) 985 if(STp
->block_size
!=0) 986 transfer
*= STp
->block_size
; 987 if(transfer
<= do_count
) { 988 filp
->f_pos
+= do_count
- transfer
; 989 count
-= do_count
- transfer
; 990 if(STp
->drv_block
>=0) { 991 if(STp
->block_size
==0&& transfer
< do_count
) 993 else if(STp
->block_size
!=0) 994 STp
->drv_block
+= (do_count
- transfer
) / STp
->block_size
; 996 STp
->eof
= ST_EOM_OK
; 997 retval
= (-ENOSPC
);/* EOM within current request */ 1000 printk(ST_DEB_MSG
"st%d: EOM with %d bytes unwritten.\n", 1005 STp
->eof
= ST_EOM_ERROR
; 1006 STp
->drv_block
= (-1);/* Too cautious? */ 1007 retval
= (-EIO
);/* EOM for old data */ 1010 printk(ST_DEB_MSG
"st%d: EOM with lost data.\n", dev
); 1015 STp
->drv_block
= (-1);/* Too cautious? */ 1019 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1020 (STp
->buffer
)->buffer_bytes
=0; 1023 return total
- count
; 1027 filp
->f_pos
+= do_count
; 1028 b_point
+= do_count
; 1030 if(STp
->drv_block
>=0) { 1031 if(STp
->block_size
==0) 1034 STp
->drv_block
+= blks
; 1036 (STp
->buffer
)->buffer_bytes
=0; 1041 memcpy_fromfs((STp
->buffer
)->b_data
+ 1042 (STp
->buffer
)->buffer_bytes
,b_point
,count
); 1043 filp
->f_pos
+= count
; 1044 (STp
->buffer
)->buffer_bytes
+= count
; 1048 if(doing_write
&& (STp
->buffer
)->last_result_fatal
!=0) { 1049 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 1050 return(STp
->buffer
)->last_result_fatal
; 1053 if(STm
->do_async_writes
&& 1054 ((STp
->buffer
)->buffer_bytes
>= STp
->write_threshold
|| 1055 STp
->block_size
==0) ) { 1056 /* Schedule an asynchronous write */ 1058 SCpnt
=allocate_device(NULL
, STp
->device
,1); 1062 if(STp
->block_size
==0) 1063 (STp
->buffer
)->writing
= (STp
->buffer
)->buffer_bytes
; 1065 (STp
->buffer
)->writing
= ((STp
->buffer
)->buffer_bytes
/ 1066 STp
->block_size
) * STp
->block_size
; 1067 STp
->dirty
= !((STp
->buffer
)->writing
== 1068 (STp
->buffer
)->buffer_bytes
); 1070 if(STp
->block_size
==0) 1071 blks
= (STp
->buffer
)->writing
; 1073 blks
= (STp
->buffer
)->writing
/ STp
->block_size
; 1077 STp
->sem
= MUTEX_LOCKED
; 1078 SCpnt
->request
.sem
= &(STp
->sem
); 1079 SCpnt
->request
.rq_status
= RQ_SCSI_BUSY
; 1080 SCpnt
->request
.rq_dev
= STp
->devt
; 1082 STp
->write_pending
=1; 1086 (void*) cmd
, (STp
->buffer
)->b_data
, 1087 (STp
->buffer
)->writing
, 1088 st_sleep_done
, ST_TIMEOUT
, MAX_WRITE_RETRIES
); 1090 else if(SCpnt
!= NULL
) 1091 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1093 STp
->at_sm
&= (total
!=0); 1100 st_read(struct inode
* inode
,struct file
* filp
,char* buf
,int count
) 1103 int transfer
, blks
, bytes
; 1104 static unsigned char cmd
[10]; 1105 Scsi_Cmnd
* SCpnt
= NULL
; 1107 int dev
=TAPE_NR(inode
->i_rdev
); 1109 STp
= &(scsi_tapes
[dev
]); 1110 if(STp
->ready
!= ST_READY
) 1112 if(!STp
->modes
[STp
->current_mode
].defined
) 1116 printk(ST_DEB_MSG
"st%d: Incorrect device.\n", dev
); 1121 if(STp
->block_size
==0&& 1122 count
> (STp
->buffer
)->buffer_size
&& 1123 !enlarge_buffer(STp
->buffer
, count
, STp
->restr_dma
)) 1126 if(!(STp
->do_read_ahead
) && STp
->block_size
!=0&& 1127 (count
% STp
->block_size
) !=0) 1128 return(-EIO
);/* Read must be integral number of blocks */ 1130 if(STp
->do_auto_lock
&& STp
->door_locked
== ST_UNLOCKED
&& 1131 !st_int_ioctl(inode
, filp
, MTLOCK
,0)) 1132 STp
->door_locked
= ST_LOCKED_AUTO
; 1134 if(STp
->rw
== ST_WRITING
) { 1135 transfer
=flush_buffer(inode
, filp
,0); 1138 STp
->rw
= ST_READING
; 1140 if(STp
->moves_after_eof
<255) 1141 STp
->moves_after_eof
++; 1144 if(debugging
&& STp
->eof
!= ST_NOEOF
) 1145 printk(ST_DEB_MSG
"st%d: EOF flag up. Bytes %d\n", dev
, 1146 (STp
->buffer
)->buffer_bytes
); 1148 if(((STp
->buffer
)->buffer_bytes
==0) && 1149 (STp
->eof
== ST_EOM_OK
|| STp
->eof
== ST_EOD
)) 1150 return(-EIO
);/* EOM or Blank Check */ 1152 STp
->rw
= ST_READING
; 1154 for(total
=0; total
< count
; ) { 1156 if((STp
->buffer
)->buffer_bytes
==0&& 1157 STp
->eof
== ST_NOEOF
) { 1161 cmd
[1] = (STp
->block_size
!=0); 1162 if(STp
->block_size
==0) 1163 blks
= bytes
= count
; 1165 if(STp
->do_read_ahead
) { 1166 blks
= (STp
->buffer
)->buffer_blocks
; 1167 bytes
= blks
* STp
->block_size
; 1171 if(bytes
> (STp
->buffer
)->buffer_size
) 1172 bytes
= (STp
->buffer
)->buffer_size
; 1173 blks
= bytes
/ STp
->block_size
; 1174 bytes
= blks
* STp
->block_size
; 1181 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
, bytes
, ST_TIMEOUT
, MAX_RETRIES
); 1185 (STp
->buffer
)->read_pointer
=0; 1189 if((STp
->buffer
)->last_result_fatal
) { 1192 printk(ST_DEB_MSG
"st%d: Sense: %2x %2x %2x %2x %2x %2x %2x %2x\n", 1194 SCpnt
->sense_buffer
[0], SCpnt
->sense_buffer
[1], 1195 SCpnt
->sense_buffer
[2], SCpnt
->sense_buffer
[3], 1196 SCpnt
->sense_buffer
[4], SCpnt
->sense_buffer
[5], 1197 SCpnt
->sense_buffer
[6], SCpnt
->sense_buffer
[7]); 1199 if((SCpnt
->sense_buffer
[0] &0x70) ==0x70) {/* extended sense */ 1201 if((SCpnt
->sense_buffer
[2] &0xe0) !=0) {/* EOF, EOM, or ILI */ 1203 if((SCpnt
->sense_buffer
[0] &0x80) !=0) 1204 transfer
= (SCpnt
->sense_buffer
[3] <<24) | 1205 (SCpnt
->sense_buffer
[4] <<16) | 1206 (SCpnt
->sense_buffer
[5] <<8) | SCpnt
->sense_buffer
[6]; 1209 if(STp
->block_size
==0&& 1210 (SCpnt
->sense_buffer
[2] &0x0f) == MEDIUM_ERROR
) 1213 if(SCpnt
->sense_buffer
[2] &0x20) { 1214 if(STp
->block_size
==0) { 1217 (STp
->buffer
)->buffer_bytes
= bytes
- transfer
; 1220 printk(KERN_NOTICE
"st%d: Incorrect block size.\n", dev
); 1221 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1225 else if(SCpnt
->sense_buffer
[2] &0x40) { 1226 STp
->eof
= ST_EOM_OK
; 1227 if(STp
->block_size
==0) 1228 (STp
->buffer
)->buffer_bytes
= bytes
- transfer
; 1230 (STp
->buffer
)->buffer_bytes
= 1231 bytes
- transfer
* STp
->block_size
; 1234 printk(ST_DEB_MSG
"st%d: EOM detected (%d bytes read).\n", dev
, 1235 (STp
->buffer
)->buffer_bytes
); 1238 else if(SCpnt
->sense_buffer
[2] &0x80) { 1240 if(STp
->block_size
==0) 1241 (STp
->buffer
)->buffer_bytes
=0; 1243 (STp
->buffer
)->buffer_bytes
= 1244 bytes
- transfer
* STp
->block_size
; 1248 "st%d: EOF detected (%d bytes read, transferred %d bytes).\n", 1249 dev
, (STp
->buffer
)->buffer_bytes
, total
); 1252 }/* end of EOF, EOM, ILI test */ 1253 else{/* nonzero sense key */ 1256 printk(ST_DEB_MSG
"st%d: Tape error while reading.\n", dev
); 1258 SCpnt
->request
.rq_status
= RQ_INACTIVE
; 1259 STp
->drv_block
= (-1); 1262 else if(STp
->moves_after_eof
==1&& 1263 (SCpnt
->sense_buffer
[2] &0x0f) == BLANK_CHECK
) { 1267 "st%d: Zero returned for first BLANK CHECK after EOF.\n", 1271 return0;/* First BLANK_CHECK after EOF */ 1276 }/* End of extended sense test */ 1278 transfer
= (STp
->buffer
)->last_result_fatal
; 1279 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1282 }/* End of error handling */ 1283 else/* Read successful */ 1284 (STp
->buffer
)->buffer_bytes
= bytes
; 1286 if(STp
->drv_block
>=0) { 1287 if(STp
->block_size
==0) 1290 STp
->drv_block
+= (STp
->buffer
)->buffer_bytes
/ STp
->block_size
; 1293 }/* if ((STp->buffer)->buffer_bytes == 0 && 1294 STp->eof == ST_NOEOF) */ 1296 if((STp
->buffer
)->buffer_bytes
>0) { 1298 if(debugging
&& STp
->eof
!= ST_NOEOF
) 1299 printk(ST_DEB_MSG
"st%d: EOF up. Left %d, needed %d.\n", dev
, 1300 (STp
->buffer
)->buffer_bytes
, count
- total
); 1302 transfer
= (STp
->buffer
)->buffer_bytes
< count
- total
? 1303 (STp
->buffer
)->buffer_bytes
: count
- total
; 1304 memcpy_tofs(buf
, (STp
->buffer
)->b_data
+ 1305 (STp
->buffer
)->read_pointer
,transfer
); 1306 filp
->f_pos
+= transfer
; 1309 (STp
->buffer
)->buffer_bytes
-= transfer
; 1310 (STp
->buffer
)->read_pointer
+= transfer
; 1312 else if(STp
->eof
!= ST_NOEOF
) { 1315 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1316 if(total
==0&& STp
->eof
== ST_FM
) { 1317 STp
->eof
= ST_NOEOF
; 1319 if(STp
->moves_after_eof
>1) 1320 STp
->moves_after_eof
=0; 1321 if((STp
->mt_status
)->mt_fileno
>=0) 1322 (STp
->mt_status
)->mt_fileno
++; 1324 if(total
==0&& STp
->eof
== ST_EOM_OK
) 1325 return(-EIO
);/* ST_EOM_ERROR not used in read */ 1329 if(STp
->block_size
==0) 1330 count
= total
;/* Read only one variable length block */ 1332 }/* for (total = 0; total < count; ) */ 1335 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1342 /* Set the driver options */ 1344 st_log_options(Scsi_Tape
*STp
, ST_mode
*STm
,int dev
) 1347 "st%d: Mode %d options: buffer writes: %d, async writes: %d, read ahead: %d\n", 1348 dev
, STp
->current_mode
, STm
->do_buffer_writes
, STm
->do_async_writes
, 1349 STp
->do_read_ahead
); 1351 "st%d: can bsr: %d, two FMs: %d, fast mteom: %d, auto lock: %d, defs for wr: %d\n", 1352 dev
, STp
->can_bsr
, STp
->two_fm
, STp
->fast_mteom
, STp
->do_auto_lock
, 1353 STm
->defaults_for_writes
); 1356 "st%d: debugging: %d\n", 1363 st_set_options(struct inode
* inode
,long options
) 1369 int dev
=TAPE_NR(inode
->i_rdev
); 1371 STp
= &(scsi_tapes
[dev
]); 1372 STm
= &(STp
->modes
[STp
->current_mode
]); 1374 memcpy(STm
, &(STp
->modes
[0]),sizeof(ST_mode
)); 1375 modes_defined
= TRUE
; 1378 printk(ST_DEB_MSG
"st%d: Initialized mode %d definition from mode 0\n", 1379 dev
, STp
->current_mode
); 1383 code
= options
& MT_ST_OPTIONS
; 1384 if(code
== MT_ST_BOOLEANS
) { 1385 STm
->do_buffer_writes
= (options
& MT_ST_BUFFER_WRITES
) !=0; 1386 STm
->do_async_writes
= (options
& MT_ST_ASYNC_WRITES
) !=0; 1387 STm
->defaults_for_writes
= (options
& MT_ST_DEF_WRITES
) !=0; 1388 STp
->do_read_ahead
= (options
& MT_ST_READ_AHEAD
) !=0; 1389 STp
->two_fm
= (options
& MT_ST_TWO_FM
) !=0; 1390 STp
->fast_mteom
= (options
& MT_ST_FAST_MTEOM
) !=0; 1391 STp
->do_auto_lock
= (options
& MT_ST_AUTO_LOCK
) !=0; 1392 STp
->can_bsr
= (options
& MT_ST_CAN_BSR
) !=0; 1394 debugging
= (options
& MT_ST_DEBUGGING
) !=0; 1396 st_log_options(STp
, STm
, dev
); 1398 else if(code
== MT_ST_SETBOOLEANS
|| code
== MT_ST_CLEARBOOLEANS
) { 1399 value
= (code
== MT_ST_SETBOOLEANS
); 1400 if((options
& MT_ST_BUFFER_WRITES
) !=0) 1401 STm
->do_buffer_writes
= value
; 1402 if((options
& MT_ST_ASYNC_WRITES
) !=0) 1403 STm
->do_async_writes
= value
; 1404 if((options
& MT_ST_DEF_WRITES
) !=0) 1405 STm
->defaults_for_writes
= value
; 1406 if((options
& MT_ST_READ_AHEAD
) !=0) 1407 STp
->do_read_ahead
= value
; 1408 if((options
& MT_ST_TWO_FM
) !=0) 1409 STp
->two_fm
= value
; 1410 if((options
& MT_ST_FAST_MTEOM
) !=0) 1411 STp
->fast_mteom
= value
; 1412 if((options
& MT_ST_AUTO_LOCK
) !=0) 1413 STp
->do_auto_lock
= value
; 1414 if((options
& MT_ST_CAN_BSR
) !=0) 1415 STp
->can_bsr
= value
; 1417 if((options
& MT_ST_DEBUGGING
) !=0) 1420 st_log_options(STp
, STm
, dev
); 1422 else if(code
== MT_ST_WRITE_THRESHOLD
) { 1423 value
= (options
& ~MT_ST_OPTIONS
) * ST_BLOCK_SIZE
; 1424 if(value
<1|| value
> st_buffer_size
) { 1425 printk(KERN_WARNING
"st%d: Write threshold %d too small or too large.\n", 1429 STp
->write_threshold
= value
; 1430 printk(KERN_INFO
"st%d: Write threshold set to %d bytes.\n", 1433 else if(code
== MT_ST_DEF_BLKSIZE
) { 1434 value
= (options
& ~MT_ST_OPTIONS
); 1435 if(value
== ~MT_ST_OPTIONS
) { 1436 STm
->default_blksize
= (-1); 1437 printk(KERN_INFO
"st%d: Default block size disabled.\n", dev
); 1440 STm
->default_blksize
= value
; 1441 printk(KERN_INFO
"st%d: Default block size set to %d bytes.\n", 1442 dev
, STm
->default_blksize
); 1445 else if(code
== MT_ST_DEF_OPTIONS
) { 1446 code
= (options
& ~MT_ST_CLEAR_DEFAULT
); 1447 value
= (options
& MT_ST_CLEAR_DEFAULT
); 1448 if(code
== MT_ST_DEF_DENSITY
) { 1449 if(value
== MT_ST_CLEAR_DEFAULT
) { 1450 STm
->default_density
= (-1); 1451 printk(KERN_INFO
"st%d: Density default disabled.\n", dev
); 1454 STm
->default_density
= value
&0xff; 1455 printk(KERN_INFO
"st%d: Density default set to %x\n", 1456 dev
, STm
->default_density
); 1459 else if(code
== MT_ST_DEF_DRVBUFFER
) { 1460 if(value
== MT_ST_CLEAR_DEFAULT
) { 1461 STp
->default_drvbuffer
=0xff; 1462 printk(KERN_INFO
"st%d: Drive buffer default disabled.\n", dev
); 1465 STp
->default_drvbuffer
= value
&7; 1466 printk(KERN_INFO
"st%d: Drive buffer default set to %x\n", 1467 dev
, STp
->default_drvbuffer
); 1470 else if(code
== MT_ST_DEF_COMPRESSION
) { 1471 if(value
== MT_ST_CLEAR_DEFAULT
) { 1472 STm
->default_compression
= ST_DONT_TOUCH
; 1473 printk(KERN_INFO
"st%d: Compression default disabled.\n", dev
); 1476 STm
->default_compression
= (value
&1? ST_YES
: ST_NO
); 1477 printk(KERN_INFO
"st%d: Compression default set to %x\n", 1489 #define COMPRESSION_PAGE 0x0f 1490 #define COMPRESSION_PAGE_LENGTH 16 1492 #define MODE_HEADER_LENGTH 4 1494 #define DCE_MASK 0x80 1495 #define DCC_MASK 0x40 1496 #define RED_MASK 0x60 1499 /* Control the compression with mode page 15. Algorithm not changed if zero. */ 1501 st_compression(Scsi_Tape
* STp
,int state
) 1504 unsigned char cmd
[10]; 1505 Scsi_Cmnd
* SCpnt
= NULL
; 1507 /* Read the current page contents */ 1509 cmd
[0] = MODE_SENSE
; 1511 cmd
[2] = COMPRESSION_PAGE
; 1512 cmd
[4] = COMPRESSION_PAGE_LENGTH
+ MODE_HEADER_LENGTH
; 1514 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
, cmd
[4], ST_TIMEOUT
,0); 1515 dev
=TAPE_NR(SCpnt
->request
.rq_dev
); 1517 if((STp
->buffer
)->last_result_fatal
!=0) { 1520 printk(ST_DEB_MSG
"st%d: Compression mode page not supported.\n", dev
); 1522 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1527 printk(ST_DEB_MSG
"st%d: Compression state is %d.\n", dev
, 1528 ((STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+2] & DCE_MASK
?1:0)); 1531 /* Check if compression can be changed */ 1532 if(((STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+2] & DCC_MASK
) ==0) { 1535 printk(ST_DEB_MSG
"st%d: Compression not supported.\n", dev
); 1537 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1543 (STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+2] |= DCE_MASK
; 1545 (STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
+2] &= ~DCE_MASK
; 1548 cmd
[0] = MODE_SELECT
; 1550 cmd
[4] = COMPRESSION_PAGE_LENGTH
+ MODE_HEADER_LENGTH
; 1552 (STp
->buffer
)->b_data
[0] =0;/* Reserved data length */ 1553 (STp
->buffer
)->b_data
[1] =0;/* Reserved media type byte */ 1554 (STp
->buffer
)->b_data
[MODE_HEADER_LENGTH
] &=0x3f; 1555 SCpnt
=st_do_scsi(SCpnt
, STp
, cmd
, cmd
[4], ST_TIMEOUT
,0); 1557 if((STp
->buffer
)->last_result_fatal
!=0) { 1560 printk(ST_DEB_MSG
"st%d: Compression change failed.\n", dev
); 1562 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1568 printk(ST_DEB_MSG
"st%d: Compression state changed to %d.\n", 1572 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1573 STp
->compression_changed
= TRUE
; 1574 return0;/* Not implemented yet */ 1578 /* Internal ioctl function */ 1580 st_int_ioctl(struct inode
* inode
,struct file
* file
, 1581 unsigned int cmd_in
,unsigned long arg
) 1583 int timeout
= ST_LONG_TIMEOUT
; 1586 unsigned char cmd
[10]; 1589 int fileno
, blkno
, at_sm
, undone
, datalen
; 1590 int dev
=TAPE_NR(inode
->i_rdev
); 1592 STp
= &(scsi_tapes
[dev
]); 1593 if(STp
->ready
!= ST_READY
&& cmd_in
!= MTLOAD
) 1595 fileno
= (STp
->mt_status
)->mt_fileno
; 1596 blkno
= STp
->drv_block
; 1605 cmd
[1] =0x01;/* Space FileMarks */ 1606 cmd
[2] = (arg
>>16); 1611 printk(ST_DEB_MSG
"st%d: Spacing tape forward over %d filemarks.\n", 1612 dev
, cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1622 cmd
[1] =0x01;/* Space FileMarks */ 1624 cmd
[2] = (ltmp
>>16); 1625 cmd
[3] = (ltmp
>>8); 1631 ltmp
= ltmp
| (cmd
[2] <<16) | (cmd
[3] <<8) | cmd
[4]; 1632 printk(ST_DEB_MSG
"st%d: Spacing tape backward over %ld filemarks.\n", 1638 blkno
= (-1);/* We can't know the block number */ 1643 cmd
[1] =0x00;/* Space Blocks */ 1644 cmd
[2] = (arg
>>16); 1649 printk(ST_DEB_MSG
"st%d: Spacing tape forward %d blocks.\n", dev
, 1650 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1658 cmd
[1] =0x00;/* Space Blocks */ 1660 cmd
[2] = (ltmp
>>16); 1661 cmd
[3] = (ltmp
>>8); 1667 ltmp
= ltmp
| (cmd
[2] <<16) | (cmd
[3] <<8) | cmd
[4]; 1668 printk(ST_DEB_MSG
"st%d: Spacing tape backward %ld blocks.\n", dev
, (-ltmp
)); 1677 cmd
[1] =0x04;/* Space Setmarks */ 1678 cmd
[2] = (arg
>>16); 1683 printk(ST_DEB_MSG
"st%d: Spacing tape forward %d setmarks.\n", dev
, 1684 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1687 blkno
= fileno
= (-1); 1693 cmd
[1] =0x04;/* Space Setmarks */ 1695 cmd
[2] = (ltmp
>>16); 1696 cmd
[3] = (ltmp
>>8); 1702 ltmp
= ltmp
| (cmd
[2] <<16) | (cmd
[3] <<8) | cmd
[4]; 1703 printk(ST_DEB_MSG
"st%d: Spacing tape backward %ld setmarks.\n", 1708 blkno
= fileno
= (-1); 1716 cmd
[0] = WRITE_FILEMARKS
; 1719 cmd
[2] = (arg
>>16); 1722 timeout
= ST_TIMEOUT
; 1725 if(cmd_in
== MTWEOF
) 1726 printk(ST_DEB_MSG
"st%d: Writing %d filemarks.\n", dev
, 1727 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1729 printk(ST_DEB_MSG
"st%d: Writing %d setmarks.\n", dev
, 1730 cmd
[2] *65536+ cmd
[3] *256+ cmd
[4]); 1736 at_sm
= (cmd_in
== MTWSM
); 1739 cmd
[0] = REZERO_UNIT
; 1741 cmd
[1] =1;/* Don't wait for completion */ 1742 timeout
= ST_TIMEOUT
; 1746 printk(ST_DEB_MSG
"st%d: Rewinding tape.\n", dev
); 1748 fileno
= blkno
= at_sm
=0; 1753 cmd
[0] = START_STOP
; 1754 if(cmd_in
== MTLOAD
) 1757 cmd
[1] =1;/* Don't wait for completion */ 1758 timeout
= ST_TIMEOUT
; 1760 timeout
= ST_LONG_TIMEOUT
*8; 1764 if(cmd_in
!= MTLOAD
) 1765 printk(ST_DEB_MSG
"st%d: Unloading tape.\n", dev
); 1767 printk(ST_DEB_MSG
"st%d: Loading tape.\n", dev
); 1770 fileno
= blkno
= at_sm
=0; 1775 printk(ST_DEB_MSG
"st%d: No op on tape.\n", dev
); 1777 return0;/* Should do something ? */ 1780 cmd
[0] = START_STOP
; 1782 cmd
[1] =1;/* Don't wait for completion */ 1783 timeout
= ST_TIMEOUT
; 1788 printk(ST_DEB_MSG
"st%d: Retensioning tape.\n", dev
); 1790 fileno
= blkno
= at_sm
=0; 1793 if(!STp
->fast_mteom
) { 1794 /* space to the end of tape */ 1795 ioctl_result
=st_int_ioctl(inode
, file
, MTFSF
,0x3fff); 1796 fileno
= (STp
->mt_status
)->mt_fileno
; 1797 if(STp
->eof
== ST_EOD
|| STp
->eof
== ST_EOM_OK
) 1799 /* The next lines would hide the number of spaced FileMarks 1800 That's why I inserted the previous lines. I had no luck 1801 with detecting EOM with FSF, so we go now to EOM. 1810 printk(ST_DEB_MSG
"st%d: Spacing to end of recorded medium.\n", dev
); 1819 cmd
[1] =1;/* To the end of tape */ 1821 cmd
[1] |=2;/* Don't wait for completion */ 1822 timeout
= ST_TIMEOUT
; 1824 timeout
= ST_LONG_TIMEOUT
*8; 1828 printk(ST_DEB_MSG
"st%d: Erasing tape.\n", dev
); 1830 fileno
= blkno
= at_sm
=0; 1833 cmd
[0] = ALLOW_MEDIUM_REMOVAL
; 1834 cmd
[4] = SCSI_REMOVAL_PREVENT
; 1837 printk(ST_DEB_MSG
"st%d: Locking drive door.\n", dev
); 1841 cmd
[0] = ALLOW_MEDIUM_REMOVAL
; 1842 cmd
[4] = SCSI_REMOVAL_ALLOW
; 1845 printk(ST_DEB_MSG
"st%d: Unlocking drive door.\n", dev
); 1849 if((STp
->device
)->scsi_level
< SCSI_2
) { 1850 cmd
[0] = QFA_SEEK_BLOCK
; 1851 cmd
[2] = (arg
>>16); 1859 cmd
[3] = (arg
>>24); 1860 cmd
[4] = (arg
>>16); 1865 cmd
[1] |=1;/* Don't wait for completion */ 1866 timeout
= ST_TIMEOUT
; 1870 printk(ST_DEB_MSG
"st%d: Seeking tape to block %ld.\n", dev
, arg
); 1872 fileno
= blkno
= (-1); 1875 case MTSETBLK
:/* Set block length */ 1876 case MTSETDENSITY
:/* Set tape density */ 1877 case MTSETDRVBUFFER
:/* Set drive buffering */ 1878 if(STp
->dirty
|| (STp
->buffer
)->buffer_bytes
!=0) 1879 return(-EIO
);/* Not allowed if data in buffer */ 1880 if(cmd_in
== MTSETBLK
&& 1882 (arg
< STp
->min_block
|| arg
> STp
->max_block
|| 1883 arg
> st_buffer_size
)) { 1884 printk(KERN_WARNING
"st%d: Illegal block size.\n", dev
); 1887 cmd
[0] = MODE_SELECT
; 1888 cmd
[4] = datalen
=12; 1890 memset((STp
->buffer
)->b_data
,0,12); 1891 if(cmd_in
== MTSETDRVBUFFER
) 1892 (STp
->buffer
)->b_data
[2] = (arg
&7) <<4; 1894 (STp
->buffer
)->b_data
[2] = 1895 STp
->drv_buffer
<<4; 1896 (STp
->buffer
)->b_data
[3] =8;/* block descriptor length */ 1897 if(cmd_in
== MTSETDENSITY
) { 1898 (STp
->buffer
)->b_data
[4] = arg
; 1899 STp
->density_changed
= TRUE
;/* At least we tried ;-) */ 1902 (STp
->buffer
)->b_data
[4] = STp
->density
; 1903 if(cmd_in
== MTSETBLK
) { 1905 STp
->blksize_changed
= TRUE
;/* At least we tried ;-) */ 1908 ltmp
= STp
->block_size
; 1909 (STp
->buffer
)->b_data
[9] = (ltmp
>>16); 1910 (STp
->buffer
)->b_data
[10] = (ltmp
>>8); 1911 (STp
->buffer
)->b_data
[11] = ltmp
; 1912 timeout
= ST_TIMEOUT
; 1915 if(cmd_in
== MTSETBLK
) 1916 printk(ST_DEB_MSG
"st%d: Setting block size to %d bytes.\n", dev
, 1917 (STp
->buffer
)->b_data
[9] *65536+ 1918 (STp
->buffer
)->b_data
[10] *256+ 1919 (STp
->buffer
)->b_data
[11]); 1920 else if(cmd_in
== MTSETDENSITY
) 1921 printk(ST_DEB_MSG
"st%d: Setting density code to %x.\n", dev
, 1922 (STp
->buffer
)->b_data
[4]); 1924 printk(ST_DEB_MSG
"st%d: Setting drive buffer code to %d.\n", dev
, 1925 ((STp
->buffer
)->b_data
[2] >>4) &7); 1933 SCpnt
=st_do_scsi(NULL
, STp
, cmd
, datalen
, timeout
, MAX_RETRIES
); 1937 ioctl_result
= (STp
->buffer
)->last_result_fatal
; 1939 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 1942 STp
->moves_after_eof
=0; 1944 STp
->moves_after_eof
=1; 1945 if(!ioctl_result
) {/* SCSI command successful */ 1946 if(cmd_in
!= MTSEEK
) { 1947 STp
->drv_block
= blkno
; 1948 (STp
->mt_status
)->mt_fileno
= fileno
; 1952 STp
->drv_block
= (STp
->mt_status
)->mt_fileno
= (-1); 1955 if(cmd_in
== MTLOCK
) 1956 STp
->door_locked
= ST_LOCKED_EXPLICIT
; 1957 else if(cmd_in
== MTUNLOCK
) 1958 STp
->door_locked
= ST_UNLOCKED
; 1959 if(cmd_in
== MTBSFM
) 1960 ioctl_result
=st_int_ioctl(inode
, file
, MTFSF
,1); 1961 else if(cmd_in
== MTFSFM
) 1962 ioctl_result
=st_int_ioctl(inode
, file
, MTBSF
,1); 1963 else if(cmd_in
== MTSETBLK
) { 1964 STp
->block_size
= arg
; 1966 (STp
->buffer
)->buffer_blocks
= 1967 (STp
->buffer
)->buffer_size
/ STp
->block_size
; 1968 (STp
->buffer
)->buffer_bytes
= (STp
->buffer
)->read_pointer
=0; 1970 else if(cmd_in
== MTSETDRVBUFFER
) 1971 STp
->drv_buffer
= (arg
&7); 1972 else if(cmd_in
== MTSETDENSITY
) 1974 else if(cmd_in
== MTEOM
) { 1978 else if(cmd_in
!= MTSETBLK
&& cmd_in
!= MTNOP
) { 1979 STp
->eof
= ST_NOEOF
; 1982 if(cmd_in
== MTOFFL
|| cmd_in
== MTUNLOAD
) 1983 STp
->rew_at_close
=0; 1984 else if(cmd_in
== MTLOAD
) 1985 STp
->rew_at_close
= (MINOR(inode
->i_rdev
) &0x80) ==0; 1986 }else{/* SCSI command was not completely successful */ 1987 if(SCpnt
->sense_buffer
[2] &0x40) { 1988 if(cmd_in
!= MTBSF
&& cmd_in
!= MTBSFM
&& 1989 cmd_in
!= MTBSR
&& cmd_in
!= MTBSS
) 1990 STp
->eof
= ST_EOM_OK
; 1995 (SCpnt
->sense_buffer
[3] <<24) + 1996 (SCpnt
->sense_buffer
[4] <<16) + 1997 (SCpnt
->sense_buffer
[5] <<8) + 1998 SCpnt
->sense_buffer
[6] ); 1999 if( (cmd_in
== MTFSF
) || (cmd_in
== MTFSFM
) ) { 2001 (STp
->mt_status
)->mt_fileno
= fileno
- undone
; 2003 (STp
->mt_status
)->mt_fileno
= fileno
; 2006 else if( (cmd_in
== MTBSF
) || (cmd_in
== MTBSFM
) ) { 2007 (STp
->mt_status
)->mt_fileno
= fileno
+ undone
; 2010 else if(cmd_in
== MTFSR
) { 2011 if(SCpnt
->sense_buffer
[2] &0x80) {/* Hit filemark */ 2012 (STp
->mt_status
)->mt_fileno
++; 2017 STp
->drv_block
= blkno
- undone
; 2019 STp
->drv_block
= (-1); 2022 else if(cmd_in
== MTBSR
) { 2023 if(SCpnt
->sense_buffer
[2] &0x80) {/* Hit filemark */ 2024 (STp
->mt_status
)->mt_fileno
--; 2025 STp
->drv_block
= (-1); 2029 STp
->drv_block
= blkno
+ undone
; 2031 STp
->drv_block
= (-1); 2034 else if(cmd_in
== MTEOM
|| cmd_in
== MTSEEK
) { 2035 (STp
->mt_status
)->mt_fileno
= (-1); 2036 STp
->drv_block
= (-1); 2038 if(STp
->eof
== ST_NOEOF
&& 2039 (SCpnt
->sense_buffer
[2] &0x0f) == BLANK_CHECK
) 2041 if(cmd_in
== MTLOCK
) 2042 STp
->door_locked
= ST_LOCK_FAILS
; 2045 return ioctl_result
; 2050 /* The ioctl command */ 2052 st_ioctl(struct inode
* inode
,struct file
* file
, 2053 unsigned int cmd_in
,unsigned long arg
) 2055 int i
, cmd_nr
, cmd_type
, result
; 2057 struct mtpos mt_pos
; 2058 unsigned char scmd
[10]; 2062 int dev
=TAPE_NR(inode
->i_rdev
); 2064 STp
= &(scsi_tapes
[dev
]); 2066 if(debugging
&& !STp
->in_use
) { 2067 printk(ST_DEB_MSG
"st%d: Incorrect device.\n", dev
); 2071 STm
= &(STp
->modes
[STp
->current_mode
]); 2074 * If this is something intended for the lower layer, just pass it 2077 if( cmd_in
== SCSI_IOCTL_GET_IDLUN
|| cmd_in
== SCSI_IOCTL_PROBE_HOST
) 2079 returnscsi_ioctl(STp
->device
, cmd_in
, (void*) arg
); 2082 cmd_type
=_IOC_TYPE(cmd_in
); 2083 cmd_nr
=_IOC_NR(cmd_in
); 2084 if(cmd_type
==_IOC_TYPE(MTIOCTOP
) && cmd_nr
==_IOC_NR(MTIOCTOP
)) { 2085 if(_IOC_SIZE(cmd_in
) !=sizeof(mtc
)) 2088 i
=verify_area(VERIFY_READ
, (void*)arg
,sizeof(mtc
)); 2092 memcpy_fromfs((char*) &mtc
, (char*)arg
,sizeof(struct mtop
)); 2094 if(mtc
.mt_op
== MTSETDRVBUFFER
&& !suser()) { 2095 printk(KERN_WARNING
"st%d: MTSETDRVBUFFER only allowed for root.\n", dev
); 2099 (mtc
.mt_op
!= MTSETDRVBUFFER
&& (mtc
.mt_count
& MT_ST_OPTIONS
) ==0)) 2102 if(!(STp
->device
)->was_reset
) { 2105 if(mtc
.mt_op
== MTFSF
|| mtc
.mt_op
== MTEOM
) { 2107 (STp
->mt_status
)->mt_fileno
+=1; 2109 else if(mtc
.mt_op
== MTBSF
) { 2111 (STp
->mt_status
)->mt_fileno
+=1; 2115 i
=flush_buffer(inode
, file
, mtc
.mt_op
== MTSEEK
|| 2116 mtc
.mt_op
== MTREW
|| mtc
.mt_op
== MTOFFL
|| 2117 mtc
.mt_op
== MTRETEN
|| mtc
.mt_op
== MTEOM
|| 2118 mtc
.mt_op
== MTLOCK
|| mtc
.mt_op
== MTLOAD
|| 2119 mtc
.mt_op
== MTCOMPRESSION
); 2125 * If there was a bus reset, block further access 2126 * to this device. If the user wants to rewind the tape, 2127 * then reset the flag and allow access again. 2129 if(mtc
.mt_op
!= MTREW
&& 2130 mtc
.mt_op
!= MTOFFL
&& 2131 mtc
.mt_op
!= MTRETEN
&& 2132 mtc
.mt_op
!= MTERASE
&& 2133 mtc
.mt_op
!= MTSEEK
&& 2136 STp
->device
->was_reset
=0; 2137 if(STp
->door_locked
!= ST_UNLOCKED
&& 2138 STp
->door_locked
!= ST_LOCK_FAILS
) { 2139 if(st_int_ioctl(inode
, file
, MTLOCK
,0)) { 2140 printk(KERN_NOTICE
"st%d: Could not relock door after bus reset.\n", 2142 STp
->door_locked
= ST_UNLOCKED
; 2147 if(mtc
.mt_op
!= MTNOP
&& mtc
.mt_op
!= MTSETBLK
&& 2148 mtc
.mt_op
!= MTSETDENSITY
&& mtc
.mt_op
!= MTWSM
&& 2149 mtc
.mt_op
!= MTSETDRVBUFFER
) 2150 STp
->rw
= ST_IDLE
;/* Prevent automatic WEOF */ 2152 if(mtc
.mt_op
== MTOFFL
&& STp
->door_locked
!= ST_UNLOCKED
) 2153 st_int_ioctl(inode
, file
, MTUNLOCK
,0);/* Ignore result! */ 2155 if(mtc
.mt_op
== MTSETDRVBUFFER
&& 2156 (mtc
.mt_count
& MT_ST_OPTIONS
) !=0) 2157 returnst_set_options(inode
, mtc
.mt_count
); 2158 else if(mtc
.mt_op
== MTCOMPRESSION
) 2159 returnst_compression(STp
, (mtc
.mt_count
&1)); 2161 returnst_int_ioctl(inode
, file
, mtc
.mt_op
, mtc
.mt_count
); 2167 if(cmd_type
==_IOC_TYPE(MTIOCGET
) && cmd_nr
==_IOC_NR(MTIOCGET
)) { 2169 if(_IOC_SIZE(cmd_in
) !=sizeof(struct mtget
)) 2171 i
=verify_area(VERIFY_WRITE
, (void*)arg
,sizeof(struct mtget
)); 2175 i
=flush_buffer(inode
, file
, FALSE
); 2179 (STp
->mt_status
)->mt_dsreg
= 2180 ((STp
->block_size
<< MT_ST_BLKSIZE_SHIFT
) & MT_ST_BLKSIZE_MASK
) | 2181 ((STp
->density
<< MT_ST_DENSITY_SHIFT
) & MT_ST_DENSITY_MASK
); 2182 (STp
->mt_status
)->mt_blkno
= STp
->drv_block
; 2183 if(STp
->block_size
!=0) { 2184 if(STp
->rw
== ST_WRITING
) 2185 (STp
->mt_status
)->mt_blkno
+= 2186 (STp
->buffer
)->buffer_bytes
/ STp
->block_size
; 2187 else if(STp
->rw
== ST_READING
) 2188 (STp
->mt_status
)->mt_blkno
-= ((STp
->buffer
)->buffer_bytes
+ 2189 STp
->block_size
-1) / STp
->block_size
; 2192 (STp
->mt_status
)->mt_gstat
=0; 2193 if(STp
->drv_write_prot
) 2194 (STp
->mt_status
)->mt_gstat
|=GMT_WR_PROT(0xffffffff); 2195 if((STp
->mt_status
)->mt_blkno
==0) { 2196 if((STp
->mt_status
)->mt_fileno
==0) 2197 (STp
->mt_status
)->mt_gstat
|=GMT_BOT(0xffffffff); 2199 (STp
->mt_status
)->mt_gstat
|=GMT_EOF(0xffffffff); 2201 if(STp
->eof
== ST_EOM_OK
|| STp
->eof
== ST_EOM_ERROR
) 2202 (STp
->mt_status
)->mt_gstat
|=GMT_EOT(0xffffffff); 2203 else if(STp
->eof
== ST_EOD
) 2204 (STp
->mt_status
)->mt_gstat
|=GMT_EOD(0xffffffff); 2205 if(STp
->density
==1) 2206 (STp
->mt_status
)->mt_gstat
|=GMT_D_800(0xffffffff); 2207 else if(STp
->density
==2) 2208 (STp
->mt_status
)->mt_gstat
|=GMT_D_1600(0xffffffff); 2209 else if(STp
->density
==3) 2210 (STp
->mt_status
)->mt_gstat
|=GMT_D_6250(0xffffffff); 2211 if(STp
->ready
== ST_READY
) 2212 (STp
->mt_status
)->mt_gstat
|=GMT_ONLINE(0xffffffff); 2213 if(STp
->ready
== ST_NO_TAPE
) 2214 (STp
->mt_status
)->mt_gstat
|=GMT_DR_OPEN(0xffffffff); 2216 (STp
->mt_status
)->mt_gstat
|=GMT_SM(0xffffffff); 2218 memcpy_tofs((char*)arg
, (char*)(STp
->mt_status
), 2219 sizeof(struct mtget
)); 2221 (STp
->mt_status
)->mt_erreg
=0;/* Clear after read */ 2224 else if(cmd_type
==_IOC_TYPE(MTIOCPOS
) && cmd_nr
==_IOC_NR(MTIOCPOS
)) { 2225 if(STp
->ready
!= ST_READY
) 2229 printk(ST_DEB_MSG
"st%d: get tape position.\n", dev
); 2231 if(_IOC_SIZE(cmd_in
) !=sizeof(struct mtpos
)) 2234 i
=flush_buffer(inode
, file
,0); 2238 i
=verify_area(VERIFY_WRITE
, (void*)arg
,sizeof(struct mtpos
)); 2243 if((STp
->device
)->scsi_level
< SCSI_2
) { 2244 scmd
[0] = QFA_REQUEST_BLOCK
; 2248 scmd
[0] = READ_POSITION
; 2251 SCpnt
=st_do_scsi(NULL
, STp
, scmd
,20, ST_TIMEOUT
, MAX_READY_RETRIES
); 2255 if((STp
->buffer
)->last_result_fatal
!=0) { 2256 mt_pos
.mt_blkno
= (-1); 2259 printk(ST_DEB_MSG
"st%d: Can't read tape position.\n", dev
); 2265 if((STp
->device
)->scsi_level
< SCSI_2
) 2266 mt_pos
.mt_blkno
= ((STp
->buffer
)->b_data
[0] <<16) 2267 + ((STp
->buffer
)->b_data
[1] <<8) 2268 + (STp
->buffer
)->b_data
[2]; 2270 mt_pos
.mt_blkno
= ((STp
->buffer
)->b_data
[4] <<24) 2271 + ((STp
->buffer
)->b_data
[5] <<16) 2272 + ((STp
->buffer
)->b_data
[6] <<8) 2273 + (STp
->buffer
)->b_data
[7]; 2277 SCpnt
->request
.rq_status
= RQ_INACTIVE
;/* Mark as not busy */ 2279 memcpy_tofs((char*)arg
, (char*) (&mt_pos
),sizeof(struct mtpos
)); 2283 returnscsi_ioctl(STp
->device
, cmd_in
, (void*) arg
); 2287 /* Try to allocate a new tape buffer */ 2289 new_tape_buffer(int from_initialization
,int need_dma
) 2291 int priority
, a_size
; 2294 if(st_nbr_buffers
>= st_template
.dev_max
) 2295 return NULL
;/* Should never happen */ 2297 if(from_initialization
) { 2298 priority
= GFP_ATOMIC
; 2299 a_size
= st_buffer_size
; 2302 priority
= GFP_KERNEL
; 2303 for(a_size
= PAGE_SIZE
; a_size
< st_buffer_size
; a_size
<<=1) 2304 ;/* Make sure we allocate efficiently */ 2306 tb
= (ST_buffer
*)scsi_init_malloc(sizeof(ST_buffer
), priority
); 2309 priority
|= GFP_DMA
; 2310 tb
->b_data
= (unsigned char*)scsi_init_malloc(a_size
, priority
); 2312 scsi_init_free((char*)tb
,sizeof(ST_buffer
)); 2317 printk(KERN_NOTICE
"st: Can't allocate new tape buffer (nbr %d).\n", 2324 "st: Allocated tape buffer %d (%d bytes, dma: %d, a: %p).\n", 2325 st_nbr_buffers
, a_size
, need_dma
, tb
->b_data
); 2329 tb
->buffer_size
= a_size
; 2331 tb
->orig_b_data
= NULL
; 2332 st_buffers
[st_nbr_buffers
++] = tb
; 2337 /* Try to allocate a temporary enlarged tape buffer */ 2339 enlarge_buffer(ST_buffer
*STbuffer
,int new_size
,int need_dma
) 2341 int a_size
, priority
; 2344 normalize_buffer(STbuffer
); 2346 for(a_size
= PAGE_SIZE
; a_size
< new_size
; a_size
<<=1) 2347 ;/* Make sure that we allocate efficiently */ 2349 priority
= GFP_KERNEL
; 2351 priority
|= GFP_DMA
; 2352 tbd
= (unsigned char*)scsi_init_malloc(a_size
, priority
); 2358 "st: Buffer at %p enlarged to %d bytes (dma: %d, a: %p).\n", 2359 STbuffer
->b_data
, a_size
, need_dma
, tbd
); 2362 STbuffer
->orig_b_data
= STbuffer
->b_data
; 2363 STbuffer
->orig_size
= STbuffer
->buffer_size
; 2364 STbuffer
->b_data
= tbd
; 2365 STbuffer
->buffer_size
= a_size
; 2370 /* Release the extra buffer */ 2372 normalize_buffer(ST_buffer
*STbuffer
) 2374 if(STbuffer
->orig_b_data
== NULL
) 2377 scsi_init_free(STbuffer
->b_data
, STbuffer
->buffer_size
); 2378 STbuffer
->b_data
= STbuffer
->orig_b_data
; 2379 STbuffer
->orig_b_data
= NULL
; 2380 STbuffer
->buffer_size
= STbuffer
->orig_size
; 2384 printk(ST_DEB_MSG
"st: Buffer at %p normalized to %d bytes.\n", 2385 STbuffer
->b_data
, STbuffer
->buffer_size
); 2390 /* Set the boot options. Syntax: st=xxx,yyy 2391 where xxx is buffer size in 1024 byte blocks and yyy is write threshold 2392 in 1024 byte blocks. */ 2394 st_setup(char*str
,int*ints
) 2396 if(ints
[0] >0&& ints
[1] >0) 2397 st_buffer_size
= ints
[1] * ST_BLOCK_SIZE
; 2398 if(ints
[0] >1&& ints
[2] >0) { 2399 st_write_threshold
= ints
[2] * ST_BLOCK_SIZE
; 2400 if(st_write_threshold
> st_buffer_size
) 2401 st_write_threshold
= st_buffer_size
; 2403 if(ints
[0] >2&& ints
[3] >0) 2404 st_max_buffers
= ints
[3]; 2408 static struct file_operations st_fops
= { 2409 NULL
,/* lseek - default */ 2410 st_read
,/* read - general block-dev read */ 2411 st_write
,/* write - general block-dev write */ 2412 NULL
,/* readdir - bad */ 2414 st_ioctl
,/* ioctl */ 2416 scsi_tape_open
,/* open */ 2417 scsi_tape_close
,/* release */ 2421 static intst_attach(Scsi_Device
* SDp
){ 2425 if(SDp
->type
!= TYPE_TAPE
)return1; 2427 if(st_template
.nr_dev
>= st_template
.dev_max
) 2433 for(tpnt
= scsi_tapes
, i
=0; i
<st_template
.dev_max
; i
++, tpnt
++) 2434 if(!tpnt
->device
)break; 2436 if(i
>= st_template
.dev_max
)panic("scsi_devices corrupt (st)"); 2438 scsi_tapes
[i
].device
= SDp
; 2439 if(SDp
->scsi_level
<=2) 2440 scsi_tapes
[i
].mt_status
->mt_type
= MT_ISSCSI1
; 2442 scsi_tapes
[i
].mt_status
->mt_type
= MT_ISSCSI2
; 2444 tpnt
->devt
=MKDEV(SCSI_TAPE_MAJOR
, i
); 2447 tpnt
->eof
= ST_NOEOF
; 2448 tpnt
->waiting
= NULL
; 2450 tpnt
->drv_buffer
=1;/* Try buffering if no mode sense */ 2451 tpnt
->restr_dma
= (SDp
->host
)->unchecked_isa_dma
; 2453 tpnt
->do_read_ahead
= ST_READ_AHEAD
; 2454 tpnt
->do_auto_lock
= ST_AUTO_LOCK
; 2455 tpnt
->can_bsr
= ST_IN_FILE_POS
; 2456 tpnt
->two_fm
= ST_TWO_FM
; 2457 tpnt
->fast_mteom
= ST_FAST_MTEOM
; 2458 tpnt
->write_threshold
= st_write_threshold
; 2459 tpnt
->default_drvbuffer
=0xff;/* No forced buffering */ 2460 tpnt
->drv_block
= (-1); 2461 tpnt
->moves_after_eof
=1; 2463 (tpnt
->mt_status
)->mt_fileno
= (tpnt
->mt_status
)->mt_blkno
= (-1); 2465 for(i
=0; i
< ST_NBR_MODES
; i
++) { 2466 tpnt
->modes
[i
].defined
= FALSE
; 2467 tpnt
->modes
[i
].defaults_for_writes
=0; 2468 tpnt
->modes
[i
].do_async_writes
= ST_ASYNC_WRITES
; 2469 tpnt
->modes
[i
].do_buffer_writes
= ST_BUFFER_WRITES
; 2470 tpnt
->modes
[i
].default_compression
= ST_DONT_TOUCH
; 2471 tpnt
->modes
[i
].default_blksize
= (-1);/* No forced size */ 2472 tpnt
->modes
[i
].default_density
= (-1);/* No forced density */ 2474 tpnt
->current_mode
=0; 2475 tpnt
->modes
[0].defined
= TRUE
; 2477 tpnt
->density_changed
= tpnt
->compression_changed
= 2478 tpnt
->blksize_changed
= FALSE
; 2480 st_template
.nr_dev
++; 2484 static intst_detect(Scsi_Device
* SDp
) 2486 if(SDp
->type
!= TYPE_TAPE
)return0; 2488 printk("Detected scsi tape st%d at scsi%d, channel %d, id %d, lun %d\n", 2489 st_template
.dev_noticed
++, 2490 SDp
->host
->host_no
, SDp
->channel
, SDp
->id
, SDp
->lun
); 2495 static int st_registered
=0; 2497 /* Driver initialization */ 2502 #if !ST_RUNTIME_BUFFERS 2506 if(st_template
.dev_noticed
==0)return0; 2508 if(!st_registered
) { 2509 if(register_chrdev(SCSI_TAPE_MAJOR
,"st",&st_fops
)) { 2510 printk(KERN_ERR
"Unable to get major %d for SCSI tapes\n",MAJOR_NR
); 2516 if(scsi_tapes
)return0; 2517 st_template
.dev_max
= st_template
.dev_noticed
+ ST_EXTRA_DEVS
; 2518 if(st_template
.dev_max
< ST_MAX_TAPES
) 2519 st_template
.dev_max
= ST_MAX_TAPES
; 2520 if(st_template
.dev_max
>128/ ST_NBR_MODES
) 2521 printk(KERN_INFO
"st: Only %d tapes accessible.\n",128/ ST_NBR_MODES
); 2523 (Scsi_Tape
*)scsi_init_malloc(st_template
.dev_max
*sizeof(Scsi_Tape
), 2525 if(scsi_tapes
== NULL
) { 2526 printk(KERN_ERR
"Unable to allocate descriptors for SCSI tapes.\n"); 2527 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2532 printk(ST_DEB_MSG
"st: Buffer size %d bytes, write threshold %d bytes.\n", 2533 st_buffer_size
, st_write_threshold
); 2536 memset(scsi_tapes
,0, st_template
.dev_max
*sizeof(Scsi_Tape
)); 2537 for(i
=0; i
< st_template
.dev_max
; ++i
) { 2538 STp
= &(scsi_tapes
[i
]); 2539 STp
->capacity
=0xfffff; 2540 STp
->mt_status
= (struct mtget
*)scsi_init_malloc(sizeof(struct mtget
), 2542 /* Initialize status */ 2543 memset((void*) scsi_tapes
[i
].mt_status
,0,sizeof(struct mtget
)); 2546 /* Allocate the buffers */ 2548 (ST_buffer
**)scsi_init_malloc(st_template
.dev_max
*sizeof(ST_buffer
*), 2550 if(st_buffers
== NULL
) { 2551 printk(KERN_ERR
"Unable to allocate tape buffer pointers.\n"); 2552 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2553 scsi_init_free((char*) scsi_tapes
, 2554 st_template
.dev_max
*sizeof(Scsi_Tape
)); 2558 #if ST_RUNTIME_BUFFERS 2561 target_nbr
= st_template
.dev_noticed
; 2562 if(target_nbr
< ST_EXTRA_DEVS
) 2563 target_nbr
= ST_EXTRA_DEVS
; 2564 if(target_nbr
> st_max_buffers
) 2565 target_nbr
= st_max_buffers
; 2567 for(i
=st_nbr_buffers
=0; i
< target_nbr
; i
++) { 2568 if(!new_tape_buffer(TRUE
, TRUE
)) { 2571 printk(KERN_ERR
"Can't continue without at least one tape buffer.\n"); 2572 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2573 scsi_init_free((char*) st_buffers
, 2574 st_template
.dev_max
*sizeof(ST_buffer
*)); 2575 scsi_init_free((char*) scsi_tapes
, 2576 st_template
.dev_max
*sizeof(Scsi_Tape
)); 2579 printk(KERN_INFO
"No tape buffers allocated at initialization.\n"); 2583 printk(KERN_INFO
"Number of tape buffers adjusted.\n"); 2591 static voidst_detach(Scsi_Device
* SDp
) 2596 for(tpnt
= scsi_tapes
, i
=0; i
<st_template
.dev_max
; i
++, tpnt
++) 2597 if(tpnt
->device
== SDp
) { 2598 tpnt
->device
= NULL
; 2600 st_template
.nr_dev
--; 2601 st_template
.dev_noticed
--; 2610 intinit_module(void) { 2611 st_template
.usage_count
= &mod_use_count_
; 2612 returnscsi_register_module(MODULE_SCSI_DEV
, &st_template
); 2615 voidcleanup_module(void) 2619 scsi_unregister_module(MODULE_SCSI_DEV
, &st_template
); 2620 unregister_chrdev(SCSI_TAPE_MAJOR
,"st"); 2622 if(scsi_tapes
!= NULL
) { 2623 scsi_init_free((char*) scsi_tapes
, 2624 st_template
.dev_max
*sizeof(Scsi_Tape
)); 2626 if(st_buffers
!= NULL
) { 2627 for(i
=0; i
< st_nbr_buffers
; i
++) 2628 if(st_buffers
[i
] != NULL
) { 2629 scsi_init_free((char*) st_buffers
[i
]->b_data
, 2630 st_buffers
[i
]->buffer_size
); 2631 scsi_init_free((char*) st_buffers
[i
],sizeof(ST_buffer
)); 2634 scsi_init_free((char*) st_buffers
, 2635 st_template
.dev_max
*sizeof(ST_buffer
*)); 2638 st_template
.dev_max
=0;