1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18#define DRV_NAME "ide-tape"
19
20#define IDETAPE_VERSION "1.20"
21
22#include <linux/compat.h>
23#include <linux/module.h>
24#include <linux/types.h>
25#include <linux/string.h>
26#include <linux/kernel.h>
27#include <linux/delay.h>
28#include <linux/timer.h>
29#include <linux/mm.h>
30#include <linux/interrupt.h>
31#include <linux/jiffies.h>
32#include <linux/major.h>
33#include <linux/errno.h>
34#include <linux/genhd.h>
35#include <linux/seq_file.h>
36#include <linux/slab.h>
37#include <linux/pci.h>
38#include <linux/ide.h>
39#include <linux/completion.h>
40#include <linux/bitops.h>
41#include <linux/mutex.h>
42#include <scsi/scsi.h>
43
44#include <asm/byteorder.h>
45#include <linux/uaccess.h>
46#include <linux/io.h>
47#include <asm/unaligned.h>
48#include <linux/mtio.h>
49
50
51#undef IDETAPE_DEBUG_LOG
52
53#ifdef IDETAPE_DEBUG_LOG
54#define ide_debug_log(lvl, fmt, args...) __ide_debug_log(lvl, fmt, ## args)
55#else
56#define ide_debug_log(lvl, fmt, args...) do {} while (0)
57#endif
58
59
60
61
62
63
64
65
66#define IDETAPE_MAX_PC_RETRIES 3
67
68
69
70
71
72
73
74#define IDETAPE_FIFO_THRESHOLD 2
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102#define IDETAPE_DSC_RW_MIN 5*HZ/100
103#define IDETAPE_DSC_RW_MAX 40*HZ/100
104#define IDETAPE_DSC_RW_TIMEOUT 2*60*HZ
105#define IDETAPE_DSC_MA_FAST 2*HZ
106#define IDETAPE_DSC_MA_THRESHOLD 5*60*HZ
107#define IDETAPE_DSC_MA_SLOW 30*HZ
108#define IDETAPE_DSC_MA_TIMEOUT 2*60*60*HZ
109
110
111
112
113enum {
114 IDETAPE_DIR_NONE = (1 << 0),
115 IDETAPE_DIR_READ = (1 << 1),
116 IDETAPE_DIR_WRITE = (1 << 2),
117};
118
119
120#define DOOR_UNLOCKED 0
121#define DOOR_LOCKED 1
122#define DOOR_EXPLICITLY_LOCKED 2
123
124
125#define IDETAPE_SPACE_OVER_FILEMARK 1
126#define IDETAPE_SPACE_TO_EOD 3
127
128
129#define IDETAPE_LU_LOAD_MASK 1
130#define IDETAPE_LU_RETENSION_MASK 2
131#define IDETAPE_LU_EOT_MASK 4
132
133
134#define IDETAPE_BLOCK_DESCRIPTOR 0
135#define IDETAPE_CAPABILITIES_PAGE 0x2a
136
137
138
139
140
141typedef struct ide_tape_obj {
142 ide_drive_t *drive;
143 struct ide_driver *driver;
144 struct gendisk *disk;
145 struct device dev;
146
147
148 struct ide_atapi_pc queued_pc;
149
150
151
152
153
154
155
156
157
158 bool postponed_rq;
159
160
161 unsigned long dsc_polling_start;
162
163 struct timer_list dsc_timer;
164
165 unsigned long best_dsc_rw_freq;
166 unsigned long dsc_poll_freq;
167 unsigned long dsc_timeout;
168
169
170 u8 partition;
171
172 unsigned int first_frame;
173
174
175 u8 sense_key, asc, ascq;
176
177
178 unsigned int minor;
179
180 char name[4];
181
182 u8 chrdev_dir;
183
184
185 unsigned short blk_size;
186 int user_bs_factor;
187
188
189 u8 caps[20];
190
191
192
193
194
195
196
197
198
199
200 int buffer_size;
201
202 void *buf;
203
204 void *cur;
205
206 size_t valid;
207
208
209 unsigned long avg_time;
210 int avg_size;
211 int avg_speed;
212
213
214 int door_locked;
215
216 char drv_write_prot;
217
218 char write_prot;
219} idetape_tape_t;
220
221static DEFINE_MUTEX(ide_tape_mutex);
222static DEFINE_MUTEX(idetape_ref_mutex);
223
224static DEFINE_MUTEX(idetape_chrdev_mutex);
225
226static struct class *idetape_sysfs_class;
227
228static void ide_tape_release(struct device *);
229
230static struct ide_tape_obj *idetape_devs[MAX_HWIFS * MAX_DRIVES];
231
232static struct ide_tape_obj *ide_tape_get(struct gendisk *disk, bool cdev,
233 unsigned int i)
234{
235 struct ide_tape_obj *tape = NULL;
236
237 mutex_lock(&idetape_ref_mutex);
238
239 if (cdev)
240 tape = idetape_devs[i];
241 else
242 tape = ide_drv_g(disk, ide_tape_obj);
243
244 if (tape) {
245 if (ide_device_get(tape->drive))
246 tape = NULL;
247 else
248 get_device(&tape->dev);
249 }
250
251 mutex_unlock(&idetape_ref_mutex);
252 return tape;
253}
254
255static void ide_tape_put(struct ide_tape_obj *tape)
256{
257 ide_drive_t *drive = tape->drive;
258
259 mutex_lock(&idetape_ref_mutex);
260 put_device(&tape->dev);
261 ide_device_put(drive);
262 mutex_unlock(&idetape_ref_mutex);
263}
264
265
266
267
268
269static void idetape_analyze_error(ide_drive_t *drive)
270{
271 idetape_tape_t *tape = drive->driver_data;
272 struct ide_atapi_pc *pc = drive->failed_pc;
273 struct request *rq = drive->hwif->rq;
274 u8 *sense = bio_data(rq->bio);
275
276 tape->sense_key = sense[2] & 0xF;
277 tape->asc = sense[12];
278 tape->ascq = sense[13];
279
280 ide_debug_log(IDE_DBG_FUNC,
281 "cmd: 0x%x, sense key = %x, asc = %x, ascq = %x",
282 rq->cmd[0], tape->sense_key, tape->asc, tape->ascq);
283
284
285 if (pc->flags & PC_FLAG_DMA_ERROR)
286 scsi_req(rq)->resid_len = tape->blk_size * get_unaligned_be32(&sense[3]);
287
288
289
290
291
292
293 if ((pc->c[0] == READ_6 || pc->c[0] == WRITE_6)
294
295 && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) {
296 if (tape->sense_key == 5) {
297
298 pc->error = 0;
299
300 pc->flags |= PC_FLAG_ABORT;
301 }
302 }
303 if (pc->c[0] == READ_6 && (sense[2] & 0x80)) {
304 pc->error = IDE_DRV_ERROR_FILEMARK;
305 pc->flags |= PC_FLAG_ABORT;
306 }
307 if (pc->c[0] == WRITE_6) {
308 if ((sense[2] & 0x40) || (tape->sense_key == 0xd
309 && tape->asc == 0x0 && tape->ascq == 0x2)) {
310 pc->error = IDE_DRV_ERROR_EOD;
311 pc->flags |= PC_FLAG_ABORT;
312 }
313 }
314 if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
315 if (tape->sense_key == 8) {
316 pc->error = IDE_DRV_ERROR_EOD;
317 pc->flags |= PC_FLAG_ABORT;
318 }
319 if (!(pc->flags & PC_FLAG_ABORT) &&
320 (blk_rq_bytes(rq) - scsi_req(rq)->resid_len))
321 pc->retries = IDETAPE_MAX_PC_RETRIES + 1;
322 }
323}
324
325static void ide_tape_handle_dsc(ide_drive_t *);
326
327static int ide_tape_callback(ide_drive_t *drive, int dsc)
328{
329 idetape_tape_t *tape = drive->driver_data;
330 struct ide_atapi_pc *pc = drive->pc;
331 struct request *rq = drive->hwif->rq;
332 int uptodate = pc->error ? 0 : 1;
333 int err = uptodate ? 0 : IDE_DRV_ERROR_GENERAL;
334
335 ide_debug_log(IDE_DBG_FUNC, "cmd: 0x%x, dsc: %d, err: %d", rq->cmd[0],
336 dsc, err);
337
338 if (dsc)
339 ide_tape_handle_dsc(drive);
340
341 if (drive->failed_pc == pc)
342 drive->failed_pc = NULL;
343
344 if (pc->c[0] == REQUEST_SENSE) {
345 if (uptodate)
346 idetape_analyze_error(drive);
347 else
348 printk(KERN_ERR "ide-tape: Error in REQUEST SENSE "
349 "itself - Aborting request!\n");
350 } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
351 unsigned int blocks =
352 (blk_rq_bytes(rq) - scsi_req(rq)->resid_len) / tape->blk_size;
353
354 tape->avg_size += blocks * tape->blk_size;
355
356 if (time_after_eq(jiffies, tape->avg_time + HZ)) {
357 tape->avg_speed = tape->avg_size * HZ /
358 (jiffies - tape->avg_time) / 1024;
359 tape->avg_size = 0;
360 tape->avg_time = jiffies;
361 }
362
363 tape->first_frame += blocks;
364
365 if (pc->error) {
366 uptodate = 0;
367 err = pc->error;
368 }
369 }
370 scsi_req(rq)->result = err;
371
372 return uptodate;
373}
374
375
376
377
378
379static void ide_tape_stall_queue(ide_drive_t *drive)
380{
381 idetape_tape_t *tape = drive->driver_data;
382
383 ide_debug_log(IDE_DBG_FUNC, "cmd: 0x%x, dsc_poll_freq: %lu",
384 drive->hwif->rq->cmd[0], tape->dsc_poll_freq);
385
386 tape->postponed_rq = true;
387
388 ide_stall_queue(drive, tape->dsc_poll_freq);
389}
390
391static void ide_tape_handle_dsc(ide_drive_t *drive)
392{
393 idetape_tape_t *tape = drive->driver_data;
394
395
396 tape->dsc_polling_start = jiffies;
397 tape->dsc_poll_freq = IDETAPE_DSC_MA_FAST;
398 tape->dsc_timeout = jiffies + IDETAPE_DSC_MA_TIMEOUT;
399
400 ide_tape_stall_queue(drive);
401}
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440static ide_startstop_t ide_tape_issue_pc(ide_drive_t *drive,
441 struct ide_cmd *cmd,
442 struct ide_atapi_pc *pc)
443{
444 idetape_tape_t *tape = drive->driver_data;
445 struct request *rq = drive->hwif->rq;
446
447 if (drive->failed_pc == NULL && pc->c[0] != REQUEST_SENSE)
448 drive->failed_pc = pc;
449
450
451 drive->pc = pc;
452
453 if (pc->retries > IDETAPE_MAX_PC_RETRIES ||
454 (pc->flags & PC_FLAG_ABORT)) {
455
456
457
458
459
460
461 if (!(pc->flags & PC_FLAG_ABORT)) {
462 if (!(pc->c[0] == TEST_UNIT_READY &&
463 tape->sense_key == 2 && tape->asc == 4 &&
464 (tape->ascq == 1 || tape->ascq == 8))) {
465 printk(KERN_ERR "ide-tape: %s: I/O error, "
466 "pc = %2x, key = %2x, "
467 "asc = %2x, ascq = %2x\n",
468 tape->name, pc->c[0],
469 tape->sense_key, tape->asc,
470 tape->ascq);
471 }
472
473 pc->error = IDE_DRV_ERROR_GENERAL;
474 }
475
476 drive->failed_pc = NULL;
477 drive->pc_callback(drive, 0);
478 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(rq));
479 return ide_stopped;
480 }
481 ide_debug_log(IDE_DBG_SENSE, "retry #%d, cmd: 0x%02x", pc->retries,
482 pc->c[0]);
483
484 pc->retries++;
485
486 return ide_issue_pc(drive, cmd);
487}
488
489
490static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
491{
492 ide_init_pc(pc);
493 pc->c[0] = MODE_SENSE;
494 if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
495
496 pc->c[1] = 8;
497 pc->c[2] = page_code;
498
499
500
501
502
503
504
505 pc->c[3] = 0;
506
507 pc->c[4] = 255;
508 if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
509 pc->req_xfer = 12;
510 else if (page_code == IDETAPE_CAPABILITIES_PAGE)
511 pc->req_xfer = 24;
512 else
513 pc->req_xfer = 50;
514}
515
516static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
517{
518 ide_hwif_t *hwif = drive->hwif;
519 idetape_tape_t *tape = drive->driver_data;
520 struct ide_atapi_pc *pc = drive->pc;
521 u8 stat;
522
523 stat = hwif->tp_ops->read_status(hwif);
524
525 if (stat & ATA_DSC) {
526 if (stat & ATA_ERR) {
527
528 if (pc->c[0] != TEST_UNIT_READY)
529 printk(KERN_ERR "ide-tape: %s: I/O error, ",
530 tape->name);
531
532 ide_retry_pc(drive);
533 return ide_stopped;
534 }
535 pc->error = 0;
536 } else {
537 pc->error = IDE_DRV_ERROR_GENERAL;
538 drive->failed_pc = NULL;
539 }
540 drive->pc_callback(drive, 0);
541 return ide_stopped;
542}
543
544static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
545 struct ide_atapi_pc *pc, struct request *rq,
546 u8 opcode)
547{
548 unsigned int length = blk_rq_sectors(rq) / (tape->blk_size >> 9);
549
550 ide_init_pc(pc);
551 put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
552 pc->c[1] = 1;
553
554 if (blk_rq_bytes(rq) == tape->buffer_size)
555 pc->flags |= PC_FLAG_DMA_OK;
556
557 if (opcode == READ_6)
558 pc->c[0] = READ_6;
559 else if (opcode == WRITE_6) {
560 pc->c[0] = WRITE_6;
561 pc->flags |= PC_FLAG_WRITING;
562 }
563
564 memcpy(scsi_req(rq)->cmd, pc->c, 12);
565}
566
567static ide_startstop_t idetape_do_request(ide_drive_t *drive,
568 struct request *rq, sector_t block)
569{
570 ide_hwif_t *hwif = drive->hwif;
571 idetape_tape_t *tape = drive->driver_data;
572 struct ide_atapi_pc *pc = NULL;
573 struct ide_cmd cmd;
574 struct scsi_request *req = scsi_req(rq);
575 u8 stat;
576
577 ide_debug_log(IDE_DBG_RQ, "cmd: 0x%x, sector: %llu, nr_sectors: %u",
578 req->cmd[0], (unsigned long long)blk_rq_pos(rq),
579 blk_rq_sectors(rq));
580
581 BUG_ON(!blk_rq_is_private(rq));
582 BUG_ON(ide_req(rq)->type != ATA_PRIV_MISC &&
583 ide_req(rq)->type != ATA_PRIV_SENSE);
584
585
586 if (drive->failed_pc && drive->pc->c[0] == REQUEST_SENSE) {
587 pc = drive->failed_pc;
588 goto out;
589 }
590
591
592
593
594
595 stat = hwif->tp_ops->read_status(hwif);
596
597 if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 &&
598 (req->cmd[13] & REQ_IDETAPE_PC2) == 0)
599 drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC;
600
601 if (drive->dev_flags & IDE_DFLAG_POST_RESET) {
602 drive->atapi_flags |= IDE_AFLAG_IGNORE_DSC;
603 drive->dev_flags &= ~IDE_DFLAG_POST_RESET;
604 }
605
606 if (!(drive->atapi_flags & IDE_AFLAG_IGNORE_DSC) &&
607 !(stat & ATA_DSC)) {
608 if (!tape->postponed_rq) {
609 tape->dsc_polling_start = jiffies;
610 tape->dsc_poll_freq = tape->best_dsc_rw_freq;
611 tape->dsc_timeout = jiffies + IDETAPE_DSC_RW_TIMEOUT;
612 } else if (time_after(jiffies, tape->dsc_timeout)) {
613 printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
614 tape->name);
615 if (req->cmd[13] & REQ_IDETAPE_PC2) {
616 idetape_media_access_finished(drive);
617 return ide_stopped;
618 } else {
619 return ide_do_reset(drive);
620 }
621 } else if (time_after(jiffies,
622 tape->dsc_polling_start +
623 IDETAPE_DSC_MA_THRESHOLD))
624 tape->dsc_poll_freq = IDETAPE_DSC_MA_SLOW;
625 ide_tape_stall_queue(drive);
626 return ide_stopped;
627 } else {
628 drive->atapi_flags &= ~IDE_AFLAG_IGNORE_DSC;
629 tape->postponed_rq = false;
630 }
631
632 if (req->cmd[13] & REQ_IDETAPE_READ) {
633 pc = &tape->queued_pc;
634 ide_tape_create_rw_cmd(tape, pc, rq, READ_6);
635 goto out;
636 }
637 if (req->cmd[13] & REQ_IDETAPE_WRITE) {
638 pc = &tape->queued_pc;
639 ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6);
640 goto out;
641 }
642 if (req->cmd[13] & REQ_IDETAPE_PC1) {
643 pc = (struct ide_atapi_pc *)ide_req(rq)->special;
644 req->cmd[13] &= ~(REQ_IDETAPE_PC1);
645 req->cmd[13] |= REQ_IDETAPE_PC2;
646 goto out;
647 }
648 if (req->cmd[13] & REQ_IDETAPE_PC2) {
649 idetape_media_access_finished(drive);
650 return ide_stopped;
651 }
652 BUG();
653
654out:
655
656 ide_prep_sense(drive, rq);
657
658 memset(&cmd, 0, sizeof(cmd));
659
660 if (rq_data_dir(rq))
661 cmd.tf_flags |= IDE_TFLAG_WRITE;
662
663 cmd.rq = rq;
664
665 ide_init_sg_cmd(&cmd, blk_rq_bytes(rq));
666 ide_map_sg(drive, &cmd);
667
668 return ide_tape_issue_pc(drive, &cmd, pc);
669}
670
671
672
673
674
675static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
676 struct ide_atapi_pc *pc, int write_filemark)
677{
678 ide_init_pc(pc);
679 pc->c[0] = WRITE_FILEMARKS;
680 pc->c[4] = write_filemark;
681 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
682}
683
684static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout)
685{
686 idetape_tape_t *tape = drive->driver_data;
687 struct gendisk *disk = tape->disk;
688 int load_attempted = 0;
689
690
691 set_bit(ilog2(IDE_AFLAG_MEDIUM_PRESENT), &drive->atapi_flags);
692 timeout += jiffies;
693 while (time_before(jiffies, timeout)) {
694 if (ide_do_test_unit_ready(drive, disk) == 0)
695 return 0;
696 if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
697 || (tape->asc == 0x3A)) {
698
699 if (load_attempted)
700 return -ENOMEDIUM;
701 ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK);
702 load_attempted = 1;
703
704 } else if (!(tape->sense_key == 2 && tape->asc == 4 &&
705 (tape->ascq == 1 || tape->ascq == 8)))
706 return -EIO;
707 msleep(100);
708 }
709 return -EIO;
710}
711
712static int idetape_flush_tape_buffers(ide_drive_t *drive)
713{
714 struct ide_tape_obj *tape = drive->driver_data;
715 struct ide_atapi_pc pc;
716 int rc;
717
718 idetape_create_write_filemark_cmd(drive, &pc, 0);
719 rc = ide_queue_pc_tail(drive, tape->disk, &pc, NULL, 0);
720 if (rc)
721 return rc;
722 idetape_wait_ready(drive, 60 * 5 * HZ);
723 return 0;
724}
725
726static int ide_tape_read_position(ide_drive_t *drive)
727{
728 idetape_tape_t *tape = drive->driver_data;
729 struct ide_atapi_pc pc;
730 u8 buf[20];
731
732 ide_debug_log(IDE_DBG_FUNC, "enter");
733
734
735 ide_init_pc(&pc);
736 pc.c[0] = READ_POSITION;
737 pc.req_xfer = 20;
738
739 if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer))
740 return -1;
741
742 if (!pc.error) {
743 ide_debug_log(IDE_DBG_FUNC, "BOP - %s",
744 (buf[0] & 0x80) ? "Yes" : "No");
745 ide_debug_log(IDE_DBG_FUNC, "EOP - %s",
746 (buf[0] & 0x40) ? "Yes" : "No");
747
748 if (buf[0] & 0x4) {
749 printk(KERN_INFO "ide-tape: Block location is unknown"
750 "to the tape\n");
751 clear_bit(ilog2(IDE_AFLAG_ADDRESS_VALID),
752 &drive->atapi_flags);
753 return -1;
754 } else {
755 ide_debug_log(IDE_DBG_FUNC, "Block Location: %u",
756 be32_to_cpup((__be32 *)&buf[4]));
757
758 tape->partition = buf[1];
759 tape->first_frame = be32_to_cpup((__be32 *)&buf[4]);
760 set_bit(ilog2(IDE_AFLAG_ADDRESS_VALID),
761 &drive->atapi_flags);
762 }
763 }
764
765 return tape->first_frame;
766}
767
768static void idetape_create_locate_cmd(ide_drive_t *drive,
769 struct ide_atapi_pc *pc,
770 unsigned int block, u8 partition, int skip)
771{
772 ide_init_pc(pc);
773 pc->c[0] = POSITION_TO_ELEMENT;
774 pc->c[1] = 2;
775 put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[3]);
776 pc->c[8] = partition;
777 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
778}
779
780static void __ide_tape_discard_merge_buffer(ide_drive_t *drive)
781{
782 idetape_tape_t *tape = drive->driver_data;
783
784 if (tape->chrdev_dir != IDETAPE_DIR_READ)
785 return;
786
787 clear_bit(ilog2(IDE_AFLAG_FILEMARK), &drive->atapi_flags);
788 tape->valid = 0;
789 if (tape->buf != NULL) {
790 kfree(tape->buf);
791 tape->buf = NULL;
792 }
793
794 tape->chrdev_dir = IDETAPE_DIR_NONE;
795}
796
797
798
799
800
801
802
803static int idetape_position_tape(ide_drive_t *drive, unsigned int block,
804 u8 partition, int skip)
805{
806 idetape_tape_t *tape = drive->driver_data;
807 struct gendisk *disk = tape->disk;
808 int ret;
809 struct ide_atapi_pc pc;
810
811 if (tape->chrdev_dir == IDETAPE_DIR_READ)
812 __ide_tape_discard_merge_buffer(drive);
813 idetape_wait_ready(drive, 60 * 5 * HZ);
814 idetape_create_locate_cmd(drive, &pc, block, partition, skip);
815 ret = ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
816 if (ret)
817 return ret;
818
819 ret = ide_tape_read_position(drive);
820 if (ret < 0)
821 return ret;
822 return 0;
823}
824
825static void ide_tape_discard_merge_buffer(ide_drive_t *drive,
826 int restore_position)
827{
828 idetape_tape_t *tape = drive->driver_data;
829 int seek, position;
830
831 __ide_tape_discard_merge_buffer(drive);
832 if (restore_position) {
833 position = ide_tape_read_position(drive);
834 seek = position > 0 ? position : 0;
835 if (idetape_position_tape(drive, seek, 0, 0)) {
836 printk(KERN_INFO "ide-tape: %s: position_tape failed in"
837 " %s\n", tape->name, __func__);
838 return;
839 }
840 }
841}
842
843
844
845
846
847static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int size)
848{
849 idetape_tape_t *tape = drive->driver_data;
850 struct request *rq;
851 int ret;
852
853 ide_debug_log(IDE_DBG_FUNC, "cmd: 0x%x, size: %d", cmd, size);
854
855 BUG_ON(cmd != REQ_IDETAPE_READ && cmd != REQ_IDETAPE_WRITE);
856 BUG_ON(size < 0 || size % tape->blk_size);
857
858 rq = blk_get_request(drive->queue, REQ_OP_DRV_IN, 0);
859 ide_req(rq)->type = ATA_PRIV_MISC;
860 scsi_req(rq)->cmd[13] = cmd;
861 rq->rq_disk = tape->disk;
862 rq->__sector = tape->first_frame;
863
864 if (size) {
865 ret = blk_rq_map_kern(drive->queue, rq, tape->buf, size,
866 GFP_NOIO);
867 if (ret)
868 goto out_put;
869 }
870
871 blk_execute_rq(drive->queue, tape->disk, rq, 0);
872
873
874 size -= scsi_req(rq)->resid_len;
875 tape->cur = tape->buf;
876 if (cmd == REQ_IDETAPE_READ)
877 tape->valid = size;
878 else
879 tape->valid = 0;
880
881 ret = size;
882 if (scsi_req(rq)->result == IDE_DRV_ERROR_GENERAL)
883 ret = -EIO;
884out_put:
885 blk_put_request(rq);
886 return ret;
887}
888
889static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
890{
891 ide_init_pc(pc);
892 pc->c[0] = INQUIRY;
893 pc->c[4] = 254;
894 pc->req_xfer = 254;
895}
896
897static void idetape_create_rewind_cmd(ide_drive_t *drive,
898 struct ide_atapi_pc *pc)
899{
900 ide_init_pc(pc);
901 pc->c[0] = REZERO_UNIT;
902 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
903}
904
905static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
906{
907 ide_init_pc(pc);
908 pc->c[0] = ERASE;
909 pc->c[1] = 1;
910 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
911}
912
913static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
914{
915 ide_init_pc(pc);
916 pc->c[0] = SPACE;
917 put_unaligned(cpu_to_be32(count), (unsigned int *) &pc->c[1]);
918 pc->c[1] = cmd;
919 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
920}
921
922static void ide_tape_flush_merge_buffer(ide_drive_t *drive)
923{
924 idetape_tape_t *tape = drive->driver_data;
925
926 if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
927 printk(KERN_ERR "ide-tape: bug: Trying to empty merge buffer"
928 " but we are not writing.\n");
929 return;
930 }
931 if (tape->buf) {
932 size_t aligned = roundup(tape->valid, tape->blk_size);
933
934 memset(tape->cur, 0, aligned - tape->valid);
935 idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, aligned);
936 kfree(tape->buf);
937 tape->buf = NULL;
938 }
939 tape->chrdev_dir = IDETAPE_DIR_NONE;
940}
941
942static int idetape_init_rw(ide_drive_t *drive, int dir)
943{
944 idetape_tape_t *tape = drive->driver_data;
945 int rc;
946
947 BUG_ON(dir != IDETAPE_DIR_READ && dir != IDETAPE_DIR_WRITE);
948
949 if (tape->chrdev_dir == dir)
950 return 0;
951
952 if (tape->chrdev_dir == IDETAPE_DIR_READ)
953 ide_tape_discard_merge_buffer(drive, 1);
954 else if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
955 ide_tape_flush_merge_buffer(drive);
956 idetape_flush_tape_buffers(drive);
957 }
958
959 if (tape->buf || tape->valid) {
960 printk(KERN_ERR "ide-tape: valid should be 0 now\n");
961 tape->valid = 0;
962 }
963
964 tape->buf = kmalloc(tape->buffer_size, GFP_KERNEL);
965 if (!tape->buf)
966 return -ENOMEM;
967 tape->chrdev_dir = dir;
968 tape->cur = tape->buf;
969
970
971
972
973
974
975
976 if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) {
977 int cmd = dir == IDETAPE_DIR_READ ? REQ_IDETAPE_READ
978 : REQ_IDETAPE_WRITE;
979
980 rc = idetape_queue_rw_tail(drive, cmd, 0);
981 if (rc < 0) {
982 kfree(tape->buf);
983 tape->buf = NULL;
984 tape->chrdev_dir = IDETAPE_DIR_NONE;
985 return rc;
986 }
987 }
988
989 return 0;
990}
991
992static void idetape_pad_zeros(ide_drive_t *drive, int bcount)
993{
994 idetape_tape_t *tape = drive->driver_data;
995
996 memset(tape->buf, 0, tape->buffer_size);
997
998 while (bcount) {
999 unsigned int count = min(tape->buffer_size, bcount);
1000
1001 idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, count);
1002 bcount -= count;
1003 }
1004}
1005
1006
1007
1008
1009
1010static int idetape_rewind_tape(ide_drive_t *drive)
1011{
1012 struct ide_tape_obj *tape = drive->driver_data;
1013 struct gendisk *disk = tape->disk;
1014 struct ide_atapi_pc pc;
1015 int ret;
1016
1017 ide_debug_log(IDE_DBG_FUNC, "enter");
1018
1019 idetape_create_rewind_cmd(drive, &pc);
1020 ret = ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
1021 if (ret)
1022 return ret;
1023
1024 ret = ide_tape_read_position(drive);
1025 if (ret < 0)
1026 return ret;
1027 return 0;
1028}
1029
1030
1031static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
1032 unsigned long arg)
1033{
1034 idetape_tape_t *tape = drive->driver_data;
1035 void __user *argp = (void __user *)arg;
1036
1037 struct idetape_config {
1038 int dsc_rw_frequency;
1039 int dsc_media_access_frequency;
1040 int nr_stages;
1041 } config;
1042
1043 ide_debug_log(IDE_DBG_FUNC, "cmd: 0x%04x", cmd);
1044
1045 switch (cmd) {
1046 case 0x0340:
1047 if (copy_from_user(&config, argp, sizeof(config)))
1048 return -EFAULT;
1049 tape->best_dsc_rw_freq = config.dsc_rw_frequency;
1050 break;
1051 case 0x0350:
1052 memset(&config, 0, sizeof(config));
1053 config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
1054 config.nr_stages = 1;
1055 if (copy_to_user(argp, &config, sizeof(config)))
1056 return -EFAULT;
1057 break;
1058 default:
1059 return -EIO;
1060 }
1061 return 0;
1062}
1063
1064static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
1065 int mt_count)
1066{
1067 idetape_tape_t *tape = drive->driver_data;
1068 struct gendisk *disk = tape->disk;
1069 struct ide_atapi_pc pc;
1070 int retval, count = 0;
1071 int sprev = !!(tape->caps[4] & 0x20);
1072
1073
1074 ide_debug_log(IDE_DBG_FUNC, "mt_op: %d, mt_count: %d", mt_op, mt_count);
1075
1076 if (mt_count == 0)
1077 return 0;
1078 if (MTBSF == mt_op || MTBSFM == mt_op) {
1079 if (!sprev)
1080 return -EIO;
1081 mt_count = -mt_count;
1082 }
1083
1084 if (tape->chrdev_dir == IDETAPE_DIR_READ) {
1085 tape->valid = 0;
1086 if (test_and_clear_bit(ilog2(IDE_AFLAG_FILEMARK),
1087 &drive->atapi_flags))
1088 ++count;
1089 ide_tape_discard_merge_buffer(drive, 0);
1090 }
1091
1092 switch (mt_op) {
1093 case MTFSF:
1094 case MTBSF:
1095 idetape_create_space_cmd(&pc, mt_count - count,
1096 IDETAPE_SPACE_OVER_FILEMARK);
1097 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
1098 case MTFSFM:
1099 case MTBSFM:
1100 if (!sprev)
1101 return -EIO;
1102 retval = idetape_space_over_filemarks(drive, MTFSF,
1103 mt_count - count);
1104 if (retval)
1105 return retval;
1106 count = (MTBSFM == mt_op ? 1 : -1);
1107 return idetape_space_over_filemarks(drive, MTFSF, count);
1108 default:
1109 printk(KERN_ERR "ide-tape: MTIO operation %d not supported\n",
1110 mt_op);
1111 return -EIO;
1112 }
1113}
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,
1131 size_t count, loff_t *ppos)
1132{
1133 struct ide_tape_obj *tape = file->private_data;
1134 ide_drive_t *drive = tape->drive;
1135 size_t done = 0;
1136 ssize_t ret = 0;
1137 int rc;
1138
1139 ide_debug_log(IDE_DBG_FUNC, "count %zd", count);
1140
1141 if (tape->chrdev_dir != IDETAPE_DIR_READ) {
1142 if (test_bit(ilog2(IDE_AFLAG_DETECT_BS), &drive->atapi_flags))
1143 if (count > tape->blk_size &&
1144 (count % tape->blk_size) == 0)
1145 tape->user_bs_factor = count / tape->blk_size;
1146 }
1147
1148 rc = idetape_init_rw(drive, IDETAPE_DIR_READ);
1149 if (rc < 0)
1150 return rc;
1151
1152 while (done < count) {
1153 size_t todo;
1154
1155
1156 if (!tape->valid) {
1157
1158 if (test_bit(ilog2(IDE_AFLAG_FILEMARK),
1159 &drive->atapi_flags))
1160 break;
1161
1162 if (idetape_queue_rw_tail(drive, REQ_IDETAPE_READ,
1163 tape->buffer_size) <= 0)
1164 break;
1165 }
1166
1167
1168 todo = min_t(size_t, count - done, tape->valid);
1169 if (copy_to_user(buf + done, tape->cur, todo))
1170 ret = -EFAULT;
1171
1172 tape->cur += todo;
1173 tape->valid -= todo;
1174 done += todo;
1175 }
1176
1177 if (!done && test_bit(ilog2(IDE_AFLAG_FILEMARK), &drive->atapi_flags)) {
1178 idetape_space_over_filemarks(drive, MTFSF, 1);
1179 return 0;
1180 }
1181
1182 return ret ? ret : done;
1183}
1184
1185static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf,
1186 size_t count, loff_t *ppos)
1187{
1188 struct ide_tape_obj *tape = file->private_data;
1189 ide_drive_t *drive = tape->drive;
1190 size_t done = 0;
1191 ssize_t ret = 0;
1192 int rc;
1193
1194
1195 if (tape->write_prot)
1196 return -EACCES;
1197
1198 ide_debug_log(IDE_DBG_FUNC, "count %zd", count);
1199
1200
1201 rc = idetape_init_rw(drive, IDETAPE_DIR_WRITE);
1202 if (rc < 0)
1203 return rc;
1204
1205 while (done < count) {
1206 size_t todo;
1207
1208
1209 if (tape->valid == tape->buffer_size &&
1210 idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE,
1211 tape->buffer_size) <= 0)
1212 return rc;
1213
1214
1215 todo = min_t(size_t, count - done,
1216 tape->buffer_size - tape->valid);
1217 if (copy_from_user(tape->cur, buf + done, todo))
1218 ret = -EFAULT;
1219
1220 tape->cur += todo;
1221 tape->valid += todo;
1222 done += todo;
1223 }
1224
1225 return ret ? ret : done;
1226}
1227
1228static int idetape_write_filemark(ide_drive_t *drive)
1229{
1230 struct ide_tape_obj *tape = drive->driver_data;
1231 struct ide_atapi_pc pc;
1232
1233
1234 idetape_create_write_filemark_cmd(drive, &pc, 1);
1235 if (ide_queue_pc_tail(drive, tape->disk, &pc, NULL, 0)) {
1236 printk(KERN_ERR "ide-tape: Couldn't write a filemark\n");
1237 return -EIO;
1238 }
1239 return 0;
1240}
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count)
1256{
1257 idetape_tape_t *tape = drive->driver_data;
1258 struct gendisk *disk = tape->disk;
1259 struct ide_atapi_pc pc;
1260 int i, retval;
1261
1262 ide_debug_log(IDE_DBG_FUNC, "MTIOCTOP ioctl: mt_op: %d, mt_count: %d",
1263 mt_op, mt_count);
1264
1265 switch (mt_op) {
1266 case MTFSF:
1267 case MTFSFM:
1268 case MTBSF:
1269 case MTBSFM:
1270 if (!mt_count)
1271 return 0;
1272 return idetape_space_over_filemarks(drive, mt_op, mt_count);
1273 default:
1274 break;
1275 }
1276
1277 switch (mt_op) {
1278 case MTWEOF:
1279 if (tape->write_prot)
1280 return -EACCES;
1281 ide_tape_discard_merge_buffer(drive, 1);
1282 for (i = 0; i < mt_count; i++) {
1283 retval = idetape_write_filemark(drive);
1284 if (retval)
1285 return retval;
1286 }
1287 return 0;
1288 case MTREW:
1289 ide_tape_discard_merge_buffer(drive, 0);
1290 if (idetape_rewind_tape(drive))
1291 return -EIO;
1292 return 0;
1293 case MTLOAD:
1294 ide_tape_discard_merge_buffer(drive, 0);
1295 return ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK);
1296 case MTUNLOAD:
1297 case MTOFFL:
1298
1299
1300
1301
1302 if (tape->door_locked) {
1303 if (!ide_set_media_lock(drive, disk, 0))
1304 tape->door_locked = DOOR_UNLOCKED;
1305 }
1306 ide_tape_discard_merge_buffer(drive, 0);
1307 retval = ide_do_start_stop(drive, disk, !IDETAPE_LU_LOAD_MASK);
1308 if (!retval)
1309 clear_bit(ilog2(IDE_AFLAG_MEDIUM_PRESENT),
1310 &drive->atapi_flags);
1311 return retval;
1312 case MTNOP:
1313 ide_tape_discard_merge_buffer(drive, 0);
1314 return idetape_flush_tape_buffers(drive);
1315 case MTRETEN:
1316 ide_tape_discard_merge_buffer(drive, 0);
1317 return ide_do_start_stop(drive, disk,
1318 IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK);
1319 case MTEOM:
1320 idetape_create_space_cmd(&pc, 0, IDETAPE_SPACE_TO_EOD);
1321 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
1322 case MTERASE:
1323 (void)idetape_rewind_tape(drive);
1324 idetape_create_erase_cmd(&pc);
1325 return ide_queue_pc_tail(drive, disk, &pc, NULL, 0);
1326 case MTSETBLK:
1327 if (mt_count) {
1328 if (mt_count < tape->blk_size ||
1329 mt_count % tape->blk_size)
1330 return -EIO;
1331 tape->user_bs_factor = mt_count / tape->blk_size;
1332 clear_bit(ilog2(IDE_AFLAG_DETECT_BS),
1333 &drive->atapi_flags);
1334 } else
1335 set_bit(ilog2(IDE_AFLAG_DETECT_BS),
1336 &drive->atapi_flags);
1337 return 0;
1338 case MTSEEK:
1339 ide_tape_discard_merge_buffer(drive, 0);
1340 return idetape_position_tape(drive,
1341 mt_count * tape->user_bs_factor, tape->partition, 0);
1342 case MTSETPART:
1343 ide_tape_discard_merge_buffer(drive, 0);
1344 return idetape_position_tape(drive, 0, mt_count, 0);
1345 case MTFSR:
1346 case MTBSR:
1347 case MTLOCK:
1348 retval = ide_set_media_lock(drive, disk, 1);
1349 if (retval)
1350 return retval;
1351 tape->door_locked = DOOR_EXPLICITLY_LOCKED;
1352 return 0;
1353 case MTUNLOCK:
1354 retval = ide_set_media_lock(drive, disk, 0);
1355 if (retval)
1356 return retval;
1357 tape->door_locked = DOOR_UNLOCKED;
1358 return 0;
1359 default:
1360 printk(KERN_ERR "ide-tape: MTIO operation %d not supported\n",
1361 mt_op);
1362 return -EIO;
1363 }
1364}
1365
1366
1367
1368
1369
1370
1371static long do_idetape_chrdev_ioctl(struct file *file,
1372 unsigned int cmd, unsigned long arg)
1373{
1374 struct ide_tape_obj *tape = file->private_data;
1375 ide_drive_t *drive = tape->drive;
1376 struct mtop mtop;
1377 struct mtget mtget;
1378 struct mtpos mtpos;
1379 int block_offset = 0, position = tape->first_frame;
1380 void __user *argp = (void __user *)arg;
1381
1382 ide_debug_log(IDE_DBG_FUNC, "cmd: 0x%x", cmd);
1383
1384 if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
1385 ide_tape_flush_merge_buffer(drive);
1386 idetape_flush_tape_buffers(drive);
1387 }
1388 if (cmd == MTIOCGET || cmd == MTIOCPOS) {
1389 block_offset = tape->valid /
1390 (tape->blk_size * tape->user_bs_factor);
1391 position = ide_tape_read_position(drive);
1392 if (position < 0)
1393 return -EIO;
1394 }
1395 switch (cmd) {
1396 case MTIOCTOP:
1397 if (copy_from_user(&mtop, argp, sizeof(struct mtop)))
1398 return -EFAULT;
1399 return idetape_mtioctop(drive, mtop.mt_op, mtop.mt_count);
1400 case MTIOCGET:
1401 memset(&mtget, 0, sizeof(struct mtget));
1402 mtget.mt_type = MT_ISSCSI2;
1403 mtget.mt_blkno = position / tape->user_bs_factor - block_offset;
1404 mtget.mt_dsreg =
1405 ((tape->blk_size * tape->user_bs_factor)
1406 << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK;
1407
1408 if (tape->drv_write_prot)
1409 mtget.mt_gstat |= GMT_WR_PROT(0xffffffff);
1410
1411 return put_user_mtget(argp, &mtget);
1412 case MTIOCPOS:
1413 mtpos.mt_blkno = position / tape->user_bs_factor - block_offset;
1414 return put_user_mtpos(argp, &mtpos);
1415 default:
1416 if (tape->chrdev_dir == IDETAPE_DIR_READ)
1417 ide_tape_discard_merge_buffer(drive, 1);
1418 return idetape_blkdev_ioctl(drive, cmd, arg);
1419 }
1420}
1421
1422static long idetape_chrdev_ioctl(struct file *file,
1423 unsigned int cmd, unsigned long arg)
1424{
1425 long ret;
1426 mutex_lock(&ide_tape_mutex);
1427 ret = do_idetape_chrdev_ioctl(file, cmd, arg);
1428 mutex_unlock(&ide_tape_mutex);
1429 return ret;
1430}
1431
1432static long idetape_chrdev_compat_ioctl(struct file *file,
1433 unsigned int cmd, unsigned long arg)
1434{
1435 long ret;
1436
1437 if (cmd == MTIOCPOS32)
1438 cmd = MTIOCPOS;
1439 else if (cmd == MTIOCGET32)
1440 cmd = MTIOCGET;
1441
1442 mutex_lock(&ide_tape_mutex);
1443 ret = do_idetape_chrdev_ioctl(file, cmd, arg);
1444 mutex_unlock(&ide_tape_mutex);
1445 return ret;
1446}
1447
1448
1449
1450
1451
1452static void ide_tape_get_bsize_from_bdesc(ide_drive_t *drive)
1453{
1454 idetape_tape_t *tape = drive->driver_data;
1455 struct ide_atapi_pc pc;
1456 u8 buf[12];
1457
1458 idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_DESCRIPTOR);
1459 if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) {
1460 printk(KERN_ERR "ide-tape: Can't get block descriptor\n");
1461 if (tape->blk_size == 0) {
1462 printk(KERN_WARNING "ide-tape: Cannot deal with zero "
1463 "block size, assuming 32k\n");
1464 tape->blk_size = 32768;
1465 }
1466 return;
1467 }
1468 tape->blk_size = (buf[4 + 5] << 16) +
1469 (buf[4 + 6] << 8) +
1470 buf[4 + 7];
1471 tape->drv_write_prot = (buf[2] & 0x80) >> 7;
1472
1473 ide_debug_log(IDE_DBG_FUNC, "blk_size: %d, write_prot: %d",
1474 tape->blk_size, tape->drv_write_prot);
1475}
1476
1477static int idetape_chrdev_open(struct inode *inode, struct file *filp)
1478{
1479 unsigned int minor = iminor(inode), i = minor & ~0xc0;
1480 ide_drive_t *drive;
1481 idetape_tape_t *tape;
1482 int retval;
1483
1484 if (i >= MAX_HWIFS * MAX_DRIVES)
1485 return -ENXIO;
1486
1487 mutex_lock(&idetape_chrdev_mutex);
1488
1489 tape = ide_tape_get(NULL, true, i);
1490 if (!tape) {
1491 mutex_unlock(&idetape_chrdev_mutex);
1492 return -ENXIO;
1493 }
1494
1495 drive = tape->drive;
1496 filp->private_data = tape;
1497
1498 ide_debug_log(IDE_DBG_FUNC, "enter");
1499
1500
1501
1502
1503
1504
1505 filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
1506
1507
1508 if (test_and_set_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags)) {
1509 retval = -EBUSY;
1510 goto out_put_tape;
1511 }
1512
1513 retval = idetape_wait_ready(drive, 60 * HZ);
1514 if (retval) {
1515 clear_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags);
1516 printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
1517 goto out_put_tape;
1518 }
1519
1520 ide_tape_read_position(drive);
1521 if (!test_bit(ilog2(IDE_AFLAG_ADDRESS_VALID), &drive->atapi_flags))
1522 (void)idetape_rewind_tape(drive);
1523
1524
1525 ide_tape_get_bsize_from_bdesc(drive);
1526
1527
1528 if ((filp->f_flags & O_ACCMODE) == O_RDONLY)
1529 tape->write_prot = 1;
1530 else
1531 tape->write_prot = tape->drv_write_prot;
1532
1533
1534 if (tape->write_prot) {
1535 if ((filp->f_flags & O_ACCMODE) == O_WRONLY ||
1536 (filp->f_flags & O_ACCMODE) == O_RDWR) {
1537 clear_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags);
1538 retval = -EROFS;
1539 goto out_put_tape;
1540 }
1541 }
1542
1543
1544 if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
1545 if (!ide_set_media_lock(drive, tape->disk, 1)) {
1546 if (tape->door_locked != DOOR_EXPLICITLY_LOCKED)
1547 tape->door_locked = DOOR_LOCKED;
1548 }
1549 }
1550 mutex_unlock(&idetape_chrdev_mutex);
1551
1552 return 0;
1553
1554out_put_tape:
1555 ide_tape_put(tape);
1556
1557 mutex_unlock(&idetape_chrdev_mutex);
1558
1559 return retval;
1560}
1561
1562static void idetape_write_release(ide_drive_t *drive, unsigned int minor)
1563{
1564 idetape_tape_t *tape = drive->driver_data;
1565
1566 ide_tape_flush_merge_buffer(drive);
1567 tape->buf = kmalloc(tape->buffer_size, GFP_KERNEL);
1568 if (tape->buf != NULL) {
1569 idetape_pad_zeros(drive, tape->blk_size *
1570 (tape->user_bs_factor - 1));
1571 kfree(tape->buf);
1572 tape->buf = NULL;
1573 }
1574 idetape_write_filemark(drive);
1575 idetape_flush_tape_buffers(drive);
1576 idetape_flush_tape_buffers(drive);
1577}
1578
1579static int idetape_chrdev_release(struct inode *inode, struct file *filp)
1580{
1581 struct ide_tape_obj *tape = filp->private_data;
1582 ide_drive_t *drive = tape->drive;
1583 unsigned int minor = iminor(inode);
1584
1585 mutex_lock(&idetape_chrdev_mutex);
1586
1587 tape = drive->driver_data;
1588
1589 ide_debug_log(IDE_DBG_FUNC, "enter");
1590
1591 if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
1592 idetape_write_release(drive, minor);
1593 if (tape->chrdev_dir == IDETAPE_DIR_READ) {
1594 if (minor < 128)
1595 ide_tape_discard_merge_buffer(drive, 1);
1596 }
1597
1598 if (minor < 128 && test_bit(ilog2(IDE_AFLAG_MEDIUM_PRESENT),
1599 &drive->atapi_flags))
1600 (void) idetape_rewind_tape(drive);
1601
1602 if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
1603 if (tape->door_locked == DOOR_LOCKED) {
1604 if (!ide_set_media_lock(drive, tape->disk, 0))
1605 tape->door_locked = DOOR_UNLOCKED;
1606 }
1607 }
1608 clear_bit(ilog2(IDE_AFLAG_BUSY), &drive->atapi_flags);
1609 ide_tape_put(tape);
1610
1611 mutex_unlock(&idetape_chrdev_mutex);
1612
1613 return 0;
1614}
1615
1616static void idetape_get_inquiry_results(ide_drive_t *drive)
1617{
1618 idetape_tape_t *tape = drive->driver_data;
1619 struct ide_atapi_pc pc;
1620 u8 pc_buf[256];
1621 char fw_rev[4], vendor_id[8], product_id[16];
1622
1623 idetape_create_inquiry_cmd(&pc);
1624 if (ide_queue_pc_tail(drive, tape->disk, &pc, pc_buf, pc.req_xfer)) {
1625 printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n",
1626 tape->name);
1627 return;
1628 }
1629 memcpy(vendor_id, &pc_buf[8], 8);
1630 memcpy(product_id, &pc_buf[16], 16);
1631 memcpy(fw_rev, &pc_buf[32], 4);
1632
1633 ide_fixstring(vendor_id, 8, 0);
1634 ide_fixstring(product_id, 16, 0);
1635 ide_fixstring(fw_rev, 4, 0);
1636
1637 printk(KERN_INFO "ide-tape: %s <-> %s: %.8s %.16s rev %.4s\n",
1638 drive->name, tape->name, vendor_id, product_id, fw_rev);
1639}
1640
1641
1642
1643
1644
1645static void idetape_get_mode_sense_results(ide_drive_t *drive)
1646{
1647 idetape_tape_t *tape = drive->driver_data;
1648 struct ide_atapi_pc pc;
1649 u8 buf[24], *caps;
1650 u8 speed, max_speed;
1651
1652 idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE);
1653 if (ide_queue_pc_tail(drive, tape->disk, &pc, buf, pc.req_xfer)) {
1654 printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming"
1655 " some default values\n");
1656 tape->blk_size = 512;
1657 put_unaligned(52, (u16 *)&tape->caps[12]);
1658 put_unaligned(540, (u16 *)&tape->caps[14]);
1659 put_unaligned(6*52, (u16 *)&tape->caps[16]);
1660 return;
1661 }
1662 caps = buf + 4 + buf[3];
1663
1664
1665 speed = be16_to_cpup((__be16 *)&caps[14]);
1666 max_speed = be16_to_cpup((__be16 *)&caps[8]);
1667
1668 *(u16 *)&caps[8] = max_speed;
1669 *(u16 *)&caps[12] = be16_to_cpup((__be16 *)&caps[12]);
1670 *(u16 *)&caps[14] = speed;
1671 *(u16 *)&caps[16] = be16_to_cpup((__be16 *)&caps[16]);
1672
1673 if (!speed) {
1674 printk(KERN_INFO "ide-tape: %s: invalid tape speed "
1675 "(assuming 650KB/sec)\n", drive->name);
1676 *(u16 *)&caps[14] = 650;
1677 }
1678 if (!max_speed) {
1679 printk(KERN_INFO "ide-tape: %s: invalid max_speed "
1680 "(assuming 650KB/sec)\n", drive->name);
1681 *(u16 *)&caps[8] = 650;
1682 }
1683
1684 memcpy(&tape->caps, caps, 20);
1685
1686
1687 if ((caps[6] & 1) == 0)
1688 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
1689
1690 if (caps[7] & 0x02)
1691 tape->blk_size = 512;
1692 else if (caps[7] & 0x04)
1693 tape->blk_size = 1024;
1694}
1695
1696#ifdef CONFIG_IDE_PROC_FS
1697#define ide_tape_devset_get(name, field) \
1698static int get_##name(ide_drive_t *drive) \
1699{ \
1700 idetape_tape_t *tape = drive->driver_data; \
1701 return tape->field; \
1702}
1703
1704#define ide_tape_devset_set(name, field) \
1705static int set_##name(ide_drive_t *drive, int arg) \
1706{ \
1707 idetape_tape_t *tape = drive->driver_data; \
1708 tape->field = arg; \
1709 return 0; \
1710}
1711
1712#define ide_tape_devset_rw_field(_name, _field) \
1713ide_tape_devset_get(_name, _field) \
1714ide_tape_devset_set(_name, _field) \
1715IDE_DEVSET(_name, DS_SYNC, get_##_name, set_##_name)
1716
1717#define ide_tape_devset_r_field(_name, _field) \
1718ide_tape_devset_get(_name, _field) \
1719IDE_DEVSET(_name, 0, get_##_name, NULL)
1720
1721static int mulf_tdsc(ide_drive_t *drive) { return 1000; }
1722static int divf_tdsc(ide_drive_t *drive) { return HZ; }
1723static int divf_buffer(ide_drive_t *drive) { return 2; }
1724static int divf_buffer_size(ide_drive_t *drive) { return 1024; }
1725
1726ide_devset_rw_flag(dsc_overlap, IDE_DFLAG_DSC_OVERLAP);
1727
1728ide_tape_devset_rw_field(tdsc, best_dsc_rw_freq);
1729
1730ide_tape_devset_r_field(avg_speed, avg_speed);
1731ide_tape_devset_r_field(speed, caps[14]);
1732ide_tape_devset_r_field(buffer, caps[16]);
1733ide_tape_devset_r_field(buffer_size, buffer_size);
1734
1735static const struct ide_proc_devset idetape_settings[] = {
1736 __IDE_PROC_DEVSET(avg_speed, 0, 0xffff, NULL, NULL),
1737 __IDE_PROC_DEVSET(buffer, 0, 0xffff, NULL, divf_buffer),
1738 __IDE_PROC_DEVSET(buffer_size, 0, 0xffff, NULL, divf_buffer_size),
1739 __IDE_PROC_DEVSET(dsc_overlap, 0, 1, NULL, NULL),
1740 __IDE_PROC_DEVSET(speed, 0, 0xffff, NULL, NULL),
1741 __IDE_PROC_DEVSET(tdsc, IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX,
1742 mulf_tdsc, divf_tdsc),
1743 { NULL },
1744};
1745#endif
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
1759{
1760 unsigned long t;
1761 int speed;
1762 u16 *ctl = (u16 *)&tape->caps[12];
1763
1764 ide_debug_log(IDE_DBG_FUNC, "minor: %d", minor);
1765
1766 drive->pc_callback = ide_tape_callback;
1767
1768 drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP;
1769
1770 if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) {
1771 printk(KERN_INFO "ide-tape: %s: disabling DSC overlap\n",
1772 tape->name);
1773 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
1774 }
1775
1776
1777 if (strstr((char *)&drive->id[ATA_ID_PROD], "Seagate STT3401"))
1778 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
1779
1780 tape->minor = minor;
1781 tape->name[0] = 'h';
1782 tape->name[1] = 't';
1783 tape->name[2] = '0' + minor;
1784 tape->chrdev_dir = IDETAPE_DIR_NONE;
1785
1786 idetape_get_inquiry_results(drive);
1787 idetape_get_mode_sense_results(drive);
1788 ide_tape_get_bsize_from_bdesc(drive);
1789 tape->user_bs_factor = 1;
1790 tape->buffer_size = *ctl * tape->blk_size;
1791 while (tape->buffer_size > 0xffff) {
1792 printk(KERN_NOTICE "ide-tape: decreasing stage size\n");
1793 *ctl /= 2;
1794 tape->buffer_size = *ctl * tape->blk_size;
1795 }
1796
1797
1798 speed = max(*(u16 *)&tape->caps[14], *(u16 *)&tape->caps[8]);
1799
1800 t = (IDETAPE_FIFO_THRESHOLD * tape->buffer_size * HZ) / (speed * 1000);
1801
1802
1803
1804
1805
1806 tape->best_dsc_rw_freq = clamp_t(unsigned long, t, IDETAPE_DSC_RW_MIN,
1807 IDETAPE_DSC_RW_MAX);
1808 printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, "
1809 "%ums tDSC%s\n",
1810 drive->name, tape->name, *(u16 *)&tape->caps[14],
1811 (*(u16 *)&tape->caps[16] * 512) / tape->buffer_size,
1812 tape->buffer_size / 1024,
1813 jiffies_to_msecs(tape->best_dsc_rw_freq),
1814 (drive->dev_flags & IDE_DFLAG_USING_DMA) ? ", DMA" : "");
1815
1816 ide_proc_register_driver(drive, tape->driver);
1817}
1818
1819static void ide_tape_remove(ide_drive_t *drive)
1820{
1821 idetape_tape_t *tape = drive->driver_data;
1822
1823 ide_proc_unregister_driver(drive, tape->driver);
1824 device_del(&tape->dev);
1825 ide_unregister_region(tape->disk);
1826
1827 mutex_lock(&idetape_ref_mutex);
1828 put_device(&tape->dev);
1829 mutex_unlock(&idetape_ref_mutex);
1830}
1831
1832static void ide_tape_release(struct device *dev)
1833{
1834 struct ide_tape_obj *tape = to_ide_drv(dev, ide_tape_obj);
1835 ide_drive_t *drive = tape->drive;
1836 struct gendisk *g = tape->disk;
1837
1838 BUG_ON(tape->valid);
1839
1840 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
1841 drive->driver_data = NULL;
1842 device_destroy(idetape_sysfs_class, MKDEV(IDETAPE_MAJOR, tape->minor));
1843 device_destroy(idetape_sysfs_class,
1844 MKDEV(IDETAPE_MAJOR, tape->minor + 128));
1845 idetape_devs[tape->minor] = NULL;
1846 g->private_data = NULL;
1847 put_disk(g);
1848 kfree(tape);
1849}
1850
1851#ifdef CONFIG_IDE_PROC_FS
1852static int idetape_name_proc_show(struct seq_file *m, void *v)
1853{
1854 ide_drive_t *drive = (ide_drive_t *) m->private;
1855 idetape_tape_t *tape = drive->driver_data;
1856
1857 seq_printf(m, "%s\n", tape->name);
1858 return 0;
1859}
1860
1861static ide_proc_entry_t idetape_proc[] = {
1862 { "capacity", S_IFREG|S_IRUGO, ide_capacity_proc_show },
1863 { "name", S_IFREG|S_IRUGO, idetape_name_proc_show },
1864 {}
1865};
1866
1867static ide_proc_entry_t *ide_tape_proc_entries(ide_drive_t *drive)
1868{
1869 return idetape_proc;
1870}
1871
1872static const struct ide_proc_devset *ide_tape_proc_devsets(ide_drive_t *drive)
1873{
1874 return idetape_settings;
1875}
1876#endif
1877
1878static int ide_tape_probe(ide_drive_t *);
1879
1880static struct ide_driver idetape_driver = {
1881 .gen_driver = {
1882 .owner = THIS_MODULE,
1883 .name = "ide-tape",
1884 .bus = &ide_bus_type,
1885 },
1886 .probe = ide_tape_probe,
1887 .remove = ide_tape_remove,
1888 .version = IDETAPE_VERSION,
1889 .do_request = idetape_do_request,
1890#ifdef CONFIG_IDE_PROC_FS
1891 .proc_entries = ide_tape_proc_entries,
1892 .proc_devsets = ide_tape_proc_devsets,
1893#endif
1894};
1895
1896
1897static const struct file_operations idetape_fops = {
1898 .owner = THIS_MODULE,
1899 .read = idetape_chrdev_read,
1900 .write = idetape_chrdev_write,
1901 .unlocked_ioctl = idetape_chrdev_ioctl,
1902 .compat_ioctl = IS_ENABLED(CONFIG_COMPAT) ?
1903 idetape_chrdev_compat_ioctl : NULL,
1904 .open = idetape_chrdev_open,
1905 .release = idetape_chrdev_release,
1906 .llseek = noop_llseek,
1907};
1908
1909static int idetape_open(struct block_device *bdev, fmode_t mode)
1910{
1911 struct ide_tape_obj *tape;
1912
1913 mutex_lock(&ide_tape_mutex);
1914 tape = ide_tape_get(bdev->bd_disk, false, 0);
1915 mutex_unlock(&ide_tape_mutex);
1916
1917 if (!tape)
1918 return -ENXIO;
1919
1920 return 0;
1921}
1922
1923static void idetape_release(struct gendisk *disk, fmode_t mode)
1924{
1925 struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj);
1926
1927 mutex_lock(&ide_tape_mutex);
1928 ide_tape_put(tape);
1929 mutex_unlock(&ide_tape_mutex);
1930}
1931
1932static int idetape_ioctl(struct block_device *bdev, fmode_t mode,
1933 unsigned int cmd, unsigned long arg)
1934{
1935 struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj);
1936 ide_drive_t *drive = tape->drive;
1937 int err;
1938
1939 mutex_lock(&ide_tape_mutex);
1940 err = generic_ide_ioctl(drive, bdev, cmd, arg);
1941 if (err == -EINVAL)
1942 err = idetape_blkdev_ioctl(drive, cmd, arg);
1943 mutex_unlock(&ide_tape_mutex);
1944
1945 return err;
1946}
1947
1948static int idetape_compat_ioctl(struct block_device *bdev, fmode_t mode,
1949 unsigned int cmd, unsigned long arg)
1950{
1951 if (cmd == 0x0340 || cmd == 0x350)
1952 arg = (unsigned long)compat_ptr(arg);
1953
1954 return idetape_ioctl(bdev, mode, cmd, arg);
1955}
1956
1957static const struct block_device_operations idetape_block_ops = {
1958 .owner = THIS_MODULE,
1959 .open = idetape_open,
1960 .release = idetape_release,
1961 .ioctl = idetape_ioctl,
1962 .compat_ioctl = IS_ENABLED(CONFIG_COMPAT) ?
1963 idetape_compat_ioctl : NULL,
1964};
1965
1966static int ide_tape_probe(ide_drive_t *drive)
1967{
1968 idetape_tape_t *tape;
1969 struct gendisk *g;
1970 int minor;
1971
1972 ide_debug_log(IDE_DBG_FUNC, "enter");
1973
1974 if (!strstr(DRV_NAME, drive->driver_req))
1975 goto failed;
1976
1977 if (drive->media != ide_tape)
1978 goto failed;
1979
1980 if ((drive->dev_flags & IDE_DFLAG_ID_READ) &&
1981 ide_check_atapi_device(drive, DRV_NAME) == 0) {
1982 printk(KERN_ERR "ide-tape: %s: not supported by this version of"
1983 " the driver\n", drive->name);
1984 goto failed;
1985 }
1986 tape = kzalloc(sizeof(idetape_tape_t), GFP_KERNEL);
1987 if (tape == NULL) {
1988 printk(KERN_ERR "ide-tape: %s: Can't allocate a tape struct\n",
1989 drive->name);
1990 goto failed;
1991 }
1992
1993 g = alloc_disk(1 << PARTN_BITS);
1994 if (!g)
1995 goto out_free_tape;
1996
1997 ide_init_disk(g, drive);
1998
1999 tape->dev.parent = &drive->gendev;
2000 tape->dev.release = ide_tape_release;
2001 dev_set_name(&tape->dev, "%s", dev_name(&drive->gendev));
2002
2003 if (device_register(&tape->dev))
2004 goto out_free_disk;
2005
2006 tape->drive = drive;
2007 tape->driver = &idetape_driver;
2008 tape->disk = g;
2009
2010 g->private_data = &tape->driver;
2011
2012 drive->driver_data = tape;
2013
2014 mutex_lock(&idetape_ref_mutex);
2015 for (minor = 0; idetape_devs[minor]; minor++)
2016 ;
2017 idetape_devs[minor] = tape;
2018 mutex_unlock(&idetape_ref_mutex);
2019
2020 idetape_setup(drive, tape, minor);
2021
2022 device_create(idetape_sysfs_class, &drive->gendev,
2023 MKDEV(IDETAPE_MAJOR, minor), NULL, "%s", tape->name);
2024 device_create(idetape_sysfs_class, &drive->gendev,
2025 MKDEV(IDETAPE_MAJOR, minor + 128), NULL,
2026 "n%s", tape->name);
2027
2028 g->fops = &idetape_block_ops;
2029 ide_register_region(g);
2030
2031 return 0;
2032
2033out_free_disk:
2034 put_disk(g);
2035out_free_tape:
2036 kfree(tape);
2037failed:
2038 return -ENODEV;
2039}
2040
2041static void __exit idetape_exit(void)
2042{
2043 driver_unregister(&idetape_driver.gen_driver);
2044 class_destroy(idetape_sysfs_class);
2045 unregister_chrdev(IDETAPE_MAJOR, "ht");
2046}
2047
2048static int __init idetape_init(void)
2049{
2050 int error = 1;
2051 idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape");
2052 if (IS_ERR(idetape_sysfs_class)) {
2053 idetape_sysfs_class = NULL;
2054 printk(KERN_ERR "Unable to create sysfs class for ide tapes\n");
2055 error = -EBUSY;
2056 goto out;
2057 }
2058
2059 if (register_chrdev(IDETAPE_MAJOR, "ht", &idetape_fops)) {
2060 printk(KERN_ERR "ide-tape: Failed to register chrdev"
2061 " interface\n");
2062 error = -EBUSY;
2063 goto out_free_class;
2064 }
2065
2066 error = driver_register(&idetape_driver.gen_driver);
2067 if (error)
2068 goto out_free_chrdev;
2069
2070 return 0;
2071
2072out_free_chrdev:
2073 unregister_chrdev(IDETAPE_MAJOR, "ht");
2074out_free_class:
2075 class_destroy(idetape_sysfs_class);
2076out:
2077 return error;
2078}
2079
2080MODULE_ALIAS("ide:*m-tape*");
2081module_init(idetape_init);
2082module_exit(idetape_exit);
2083MODULE_ALIAS_CHARDEV_MAJOR(IDETAPE_MAJOR);
2084MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
2085MODULE_LICENSE("GPL");
2086