]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - drivers/ide/ide-tape.c
ide: move ->failed_pc to ide_drive_t
[mirror_ubuntu-artful-kernel.git] / drivers / ide / ide-tape.c
CommitLineData
1da177e4 1/*
5ce78af4
BP
2 * IDE ATAPI streaming tape driver.
3 *
59bca8cc
BZ
4 * Copyright (C) 1995-1999 Gadi Oxman <gadio@netvision.net.il>
5 * Copyright (C) 2003-2005 Bartlomiej Zolnierkiewicz
1da177e4 6 *
1da177e4
LT
7 * This driver was constructed as a student project in the software laboratory
8 * of the faculty of electrical engineering in the Technion - Israel's
9 * Institute Of Technology, with the guide of Avner Lottem and Dr. Ilana David.
10 *
11 * It is hereby placed under the terms of the GNU general public license.
12 * (See linux/COPYING).
1da177e4 13 *
5ce78af4
BP
14 * For a historical changelog see
15 * Documentation/ide/ChangeLog.ide-tape.1995-2002
1da177e4
LT
16 */
17
51509eec
BZ
18#define DRV_NAME "ide-tape"
19
dfe79936 20#define IDETAPE_VERSION "1.20"
1da177e4 21
1da177e4
LT
22#include <linux/module.h>
23#include <linux/types.h>
24#include <linux/string.h>
25#include <linux/kernel.h>
26#include <linux/delay.h>
27#include <linux/timer.h>
28#include <linux/mm.h>
29#include <linux/interrupt.h>
9bae1ff3 30#include <linux/jiffies.h>
1da177e4 31#include <linux/major.h>
1da177e4
LT
32#include <linux/errno.h>
33#include <linux/genhd.h>
34#include <linux/slab.h>
35#include <linux/pci.h>
36#include <linux/ide.h>
37#include <linux/smp_lock.h>
38#include <linux/completion.h>
39#include <linux/bitops.h>
cf8b8975 40#include <linux/mutex.h>
90699ce2 41#include <scsi/scsi.h>
1da177e4
LT
42
43#include <asm/byteorder.h>
c837cfa5
BP
44#include <linux/irq.h>
45#include <linux/uaccess.h>
46#include <linux/io.h>
1da177e4 47#include <asm/unaligned.h>
1da177e4
LT
48#include <linux/mtio.h>
49
8004a8c9
BP
50enum {
51 /* output errors only */
52 DBG_ERR = (1 << 0),
53 /* output all sense key/asc */
54 DBG_SENSE = (1 << 1),
55 /* info regarding all chrdev-related procedures */
56 DBG_CHRDEV = (1 << 2),
57 /* all remaining procedures */
58 DBG_PROCS = (1 << 3),
8004a8c9
BP
59};
60
61/* define to see debug info */
62#define IDETAPE_DEBUG_LOG 0
63
64#if IDETAPE_DEBUG_LOG
65#define debug_log(lvl, fmt, args...) \
66{ \
67 if (tape->debug_mask & lvl) \
68 printk(KERN_INFO "ide-tape: " fmt, ## args); \
69}
70#else
71#define debug_log(lvl, fmt, args...) do {} while (0)
72#endif
73
1da177e4 74/**************************** Tunable parameters *****************************/
1da177e4 75/*
3c98bf34
BP
76 * After each failed packet command we issue a request sense command and retry
77 * the packet command IDETAPE_MAX_PC_RETRIES times.
1da177e4 78 *
3c98bf34 79 * Setting IDETAPE_MAX_PC_RETRIES to 0 will disable retries.
1da177e4
LT
80 */
81#define IDETAPE_MAX_PC_RETRIES 3
82
1da177e4 83/*
3c98bf34
BP
84 * The following parameter is used to select the point in the internal tape fifo
85 * in which we will start to refill the buffer. Decreasing the following
86 * parameter will improve the system's latency and interactive response, while
87 * using a high value might improve system throughput.
1da177e4 88 */
3c98bf34 89#define IDETAPE_FIFO_THRESHOLD 2
1da177e4
LT
90
91/*
3c98bf34 92 * DSC polling parameters.
1da177e4 93 *
3c98bf34
BP
94 * Polling for DSC (a single bit in the status register) is a very important
95 * function in ide-tape. There are two cases in which we poll for DSC:
1da177e4 96 *
3c98bf34
BP
97 * 1. Before a read/write packet command, to ensure that we can transfer data
98 * from/to the tape's data buffers, without causing an actual media access.
99 * In case the tape is not ready yet, we take out our request from the device
100 * request queue, so that ide.c could service requests from the other device
101 * on the same interface in the meantime.
1da177e4 102 *
3c98bf34
BP
103 * 2. After the successful initialization of a "media access packet command",
104 * which is a command that can take a long time to complete (the interval can
105 * range from several seconds to even an hour). Again, we postpone our request
106 * in the middle to free the bus for the other device. The polling frequency
107 * here should be lower than the read/write frequency since those media access
108 * commands are slow. We start from a "fast" frequency - IDETAPE_DSC_MA_FAST
109 * (1 second), and if we don't receive DSC after IDETAPE_DSC_MA_THRESHOLD
110 * (5 min), we switch it to a lower frequency - IDETAPE_DSC_MA_SLOW (1 min).
1da177e4 111 *
3c98bf34
BP
112 * We also set a timeout for the timer, in case something goes wrong. The
113 * timeout should be longer then the maximum execution time of a tape operation.
1da177e4 114 */
3c98bf34
BP
115
116/* DSC timings. */
1da177e4
LT
117#define IDETAPE_DSC_RW_MIN 5*HZ/100 /* 50 msec */
118#define IDETAPE_DSC_RW_MAX 40*HZ/100 /* 400 msec */
119#define IDETAPE_DSC_RW_TIMEOUT 2*60*HZ /* 2 minutes */
120#define IDETAPE_DSC_MA_FAST 2*HZ /* 2 seconds */
121#define IDETAPE_DSC_MA_THRESHOLD 5*60*HZ /* 5 minutes */
122#define IDETAPE_DSC_MA_SLOW 30*HZ /* 30 seconds */
123#define IDETAPE_DSC_MA_TIMEOUT 2*60*60*HZ /* 2 hours */
124
125/*************************** End of tunable parameters ***********************/
126
54abf37e
BP
127/* tape directions */
128enum {
129 IDETAPE_DIR_NONE = (1 << 0),
130 IDETAPE_DIR_READ = (1 << 1),
131 IDETAPE_DIR_WRITE = (1 << 2),
132};
1da177e4
LT
133
134struct idetape_bh {
ab057968 135 u32 b_size;
1da177e4
LT
136 atomic_t b_count;
137 struct idetape_bh *b_reqnext;
138 char *b_data;
139};
140
03056b90
BP
141/* Tape door status */
142#define DOOR_UNLOCKED 0
143#define DOOR_LOCKED 1
144#define DOOR_EXPLICITLY_LOCKED 2
145
146/* Some defines for the SPACE command */
147#define IDETAPE_SPACE_OVER_FILEMARK 1
148#define IDETAPE_SPACE_TO_EOD 3
149
150/* Some defines for the LOAD UNLOAD command */
151#define IDETAPE_LU_LOAD_MASK 1
152#define IDETAPE_LU_RETENSION_MASK 2
153#define IDETAPE_LU_EOT_MASK 4
154
03056b90
BP
155/* Error codes returned in rq->errors to the higher part of the driver. */
156#define IDETAPE_ERROR_GENERAL 101
157#define IDETAPE_ERROR_FILEMARK 102
158#define IDETAPE_ERROR_EOD 103
159
160/* Structures related to the SELECT SENSE / MODE SENSE packet commands. */
161#define IDETAPE_BLOCK_DESCRIPTOR 0
162#define IDETAPE_CAPABILITIES_PAGE 0x2a
163
1da177e4 164/*
3c98bf34
BP
165 * Most of our global data which we need to save even as we leave the driver due
166 * to an interrupt or a timer event is stored in the struct defined below.
1da177e4
LT
167 */
168typedef struct ide_tape_obj {
7f3c868b
BZ
169 ide_drive_t *drive;
170 struct ide_driver *driver;
171 struct gendisk *disk;
8fed4368 172 struct device dev;
1da177e4 173
2e8a6f89
BZ
174 /* used by REQ_IDETAPE_{READ,WRITE} requests */
175 struct ide_atapi_pc queued_pc;
394a4c21 176
1da177e4 177 /*
3c98bf34 178 * DSC polling variables.
1da177e4 179 *
3c98bf34
BP
180 * While polling for DSC we use postponed_rq to postpone the current
181 * request so that ide.c will be able to service pending requests on the
182 * other device. Note that at most we will have only one DSC (usually
5bd50dc6 183 * data transfer) request in the device request queue.
1da177e4
LT
184 */
185 struct request *postponed_rq;
186 /* The time in which we started polling for DSC */
187 unsigned long dsc_polling_start;
188 /* Timer used to poll for dsc */
189 struct timer_list dsc_timer;
190 /* Read/Write dsc polling frequency */
54bb2074
BP
191 unsigned long best_dsc_rw_freq;
192 unsigned long dsc_poll_freq;
1da177e4
LT
193 unsigned long dsc_timeout;
194
3c98bf34 195 /* Read position information */
1da177e4
LT
196 u8 partition;
197 /* Current block */
54bb2074 198 unsigned int first_frame;
1da177e4 199
3c98bf34 200 /* Last error information */
1da177e4
LT
201 u8 sense_key, asc, ascq;
202
3c98bf34 203 /* Character device operation */
1da177e4
LT
204 unsigned int minor;
205 /* device name */
206 char name[4];
207 /* Current character device data transfer direction */
54abf37e 208 u8 chrdev_dir;
1da177e4 209
54bb2074
BP
210 /* tape block size, usually 512 or 1024 bytes */
211 unsigned short blk_size;
1da177e4 212 int user_bs_factor;
b6422013 213
1da177e4 214 /* Copy of the tape's Capabilities and Mechanical Page */
b6422013 215 u8 caps[20];
1da177e4
LT
216
217 /*
3c98bf34 218 * Active data transfer request parameters.
1da177e4 219 *
3c98bf34
BP
220 * At most, there is only one ide-tape originated data transfer request
221 * in the device request queue. This allows ide.c to easily service
222 * requests from the other device when we postpone our active request.
1da177e4 223 */
83042b24 224
3c98bf34 225 /* Data buffer size chosen based on the tape's recommendation */
f73850a3 226 int buffer_size;
077e3bdb
BP
227 /* merge buffer */
228 struct idetape_bh *merge_bh;
01a63aeb
BP
229 /* size of the merge buffer */
230 int merge_bh_size;
077e3bdb 231 /* pointer to current buffer head within the merge buffer */
1da177e4
LT
232 struct idetape_bh *bh;
233 char *b_data;
234 int b_count;
3c98bf34 235
a997a435 236 int pages_per_buffer;
1da177e4
LT
237 /* Wasted space in each stage */
238 int excess_bh_size;
239
3c98bf34 240 /* Measures average tape speed */
1da177e4
LT
241 unsigned long avg_time;
242 int avg_size;
243 int avg_speed;
244
1da177e4
LT
245 /* the door is currently locked */
246 int door_locked;
247 /* the tape hardware is write protected */
248 char drv_write_prot;
249 /* the tape is write protected (hardware or opened as read-only) */
250 char write_prot;
251
8004a8c9 252 u32 debug_mask;
1da177e4
LT
253} idetape_tape_t;
254
cf8b8975 255static DEFINE_MUTEX(idetape_ref_mutex);
1da177e4 256
d5dee80a
WD
257static struct class *idetape_sysfs_class;
258
8fed4368 259static void ide_tape_release(struct device *);
08da591e 260
1da177e4
LT
261static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
262{
263 struct ide_tape_obj *tape = NULL;
264
cf8b8975 265 mutex_lock(&idetape_ref_mutex);
5aeddf90 266 tape = ide_drv_g(disk, ide_tape_obj);
08da591e 267 if (tape) {
d3e33ff5 268 if (ide_device_get(tape->drive))
08da591e 269 tape = NULL;
d3e33ff5 270 else
8fed4368 271 get_device(&tape->dev);
08da591e 272 }
cf8b8975 273 mutex_unlock(&idetape_ref_mutex);
1da177e4
LT
274 return tape;
275}
276
1da177e4
LT
277static void ide_tape_put(struct ide_tape_obj *tape)
278{
d3e33ff5
BZ
279 ide_drive_t *drive = tape->drive;
280
cf8b8975 281 mutex_lock(&idetape_ref_mutex);
8fed4368 282 put_device(&tape->dev);
d3e33ff5 283 ide_device_put(drive);
cf8b8975 284 mutex_unlock(&idetape_ref_mutex);
1da177e4
LT
285}
286
1da177e4 287/*
3c98bf34
BP
288 * The variables below are used for the character device interface. Additional
289 * state variables are defined in our ide_drive_t structure.
1da177e4 290 */
5a04cfa9 291static struct ide_tape_obj *idetape_devs[MAX_HWIFS * MAX_DRIVES];
1da177e4 292
1da177e4
LT
293static struct ide_tape_obj *ide_tape_chrdev_get(unsigned int i)
294{
295 struct ide_tape_obj *tape = NULL;
296
cf8b8975 297 mutex_lock(&idetape_ref_mutex);
1da177e4
LT
298 tape = idetape_devs[i];
299 if (tape)
8fed4368 300 get_device(&tape->dev);
cf8b8975 301 mutex_unlock(&idetape_ref_mutex);
1da177e4
LT
302 return tape;
303}
304
d236d74c 305static void idetape_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
5a04cfa9 306 unsigned int bcount)
1da177e4
LT
307{
308 struct idetape_bh *bh = pc->bh;
309 int count;
310
311 while (bcount) {
1da177e4
LT
312 if (bh == NULL) {
313 printk(KERN_ERR "ide-tape: bh == NULL in "
314 "idetape_input_buffers\n");
9f87abe8 315 ide_pad_transfer(drive, 0, bcount);
1da177e4
LT
316 return;
317 }
5a04cfa9
BP
318 count = min(
319 (unsigned int)(bh->b_size - atomic_read(&bh->b_count)),
320 bcount);
374e042c 321 drive->hwif->tp_ops->input_data(drive, NULL, bh->b_data +
5a04cfa9 322 atomic_read(&bh->b_count), count);
1da177e4
LT
323 bcount -= count;
324 atomic_add(count, &bh->b_count);
325 if (atomic_read(&bh->b_count) == bh->b_size) {
326 bh = bh->b_reqnext;
327 if (bh)
328 atomic_set(&bh->b_count, 0);
329 }
330 }
331 pc->bh = bh;
332}
333
d236d74c 334static void idetape_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
5a04cfa9 335 unsigned int bcount)
1da177e4
LT
336{
337 struct idetape_bh *bh = pc->bh;
338 int count;
339
340 while (bcount) {
1da177e4 341 if (bh == NULL) {
5a04cfa9
BP
342 printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
343 __func__);
1da177e4
LT
344 return;
345 }
1da177e4 346 count = min((unsigned int)pc->b_count, (unsigned int)bcount);
374e042c 347 drive->hwif->tp_ops->output_data(drive, NULL, pc->b_data, count);
1da177e4
LT
348 bcount -= count;
349 pc->b_data += count;
350 pc->b_count -= count;
351 if (!pc->b_count) {
5a04cfa9
BP
352 bh = bh->b_reqnext;
353 pc->bh = bh;
1da177e4
LT
354 if (bh) {
355 pc->b_data = bh->b_data;
356 pc->b_count = atomic_read(&bh->b_count);
357 }
358 }
359 }
360}
361
646c0cb6 362static void idetape_update_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc)
1da177e4
LT
363{
364 struct idetape_bh *bh = pc->bh;
365 int count;
d236d74c 366 unsigned int bcount = pc->xferred;
1da177e4 367
346331f8 368 if (pc->flags & PC_FLAG_WRITING)
1da177e4
LT
369 return;
370 while (bcount) {
1da177e4 371 if (bh == NULL) {
5a04cfa9
BP
372 printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
373 __func__);
1da177e4
LT
374 return;
375 }
1da177e4
LT
376 count = min((unsigned int)bh->b_size, (unsigned int)bcount);
377 atomic_set(&bh->b_count, count);
378 if (atomic_read(&bh->b_count) == bh->b_size)
379 bh = bh->b_reqnext;
380 bcount -= count;
381 }
382 pc->bh = bh;
383}
384
1da177e4 385/*
1b5db434
BP
386 * called on each failed packet command retry to analyze the request sense. We
387 * currently do not utilize this information.
1da177e4 388 */
1b5db434 389static void idetape_analyze_error(ide_drive_t *drive, u8 *sense)
1da177e4
LT
390{
391 idetape_tape_t *tape = drive->driver_data;
5e2040fd 392 struct ide_atapi_pc *pc = drive->failed_pc;
1da177e4 393
1b5db434
BP
394 tape->sense_key = sense[2] & 0xF;
395 tape->asc = sense[12];
396 tape->ascq = sense[13];
8004a8c9
BP
397
398 debug_log(DBG_ERR, "pc = %x, sense key = %x, asc = %x, ascq = %x\n",
399 pc->c[0], tape->sense_key, tape->asc, tape->ascq);
1da177e4 400
d236d74c 401 /* Correct pc->xferred by asking the tape. */
346331f8 402 if (pc->flags & PC_FLAG_DMA_ERROR) {
d236d74c 403 pc->xferred = pc->req_xfer -
54bb2074 404 tape->blk_size *
5d0cc8ae 405 get_unaligned_be32(&sense[3]);
646c0cb6 406 idetape_update_buffers(drive, pc);
1da177e4
LT
407 }
408
409 /*
410 * If error was the result of a zero-length read or write command,
411 * with sense key=5, asc=0x22, ascq=0, let it slide. Some drives
412 * (i.e. Seagate STT3401A Travan) don't support 0-length read/writes.
413 */
90699ce2 414 if ((pc->c[0] == READ_6 || pc->c[0] == WRITE_6)
1b5db434
BP
415 /* length == 0 */
416 && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) {
417 if (tape->sense_key == 5) {
1da177e4
LT
418 /* don't report an error, everything's ok */
419 pc->error = 0;
420 /* don't retry read/write */
346331f8 421 pc->flags |= PC_FLAG_ABORT;
1da177e4
LT
422 }
423 }
90699ce2 424 if (pc->c[0] == READ_6 && (sense[2] & 0x80)) {
1da177e4 425 pc->error = IDETAPE_ERROR_FILEMARK;
346331f8 426 pc->flags |= PC_FLAG_ABORT;
1da177e4 427 }
90699ce2 428 if (pc->c[0] == WRITE_6) {
1b5db434
BP
429 if ((sense[2] & 0x40) || (tape->sense_key == 0xd
430 && tape->asc == 0x0 && tape->ascq == 0x2)) {
1da177e4 431 pc->error = IDETAPE_ERROR_EOD;
346331f8 432 pc->flags |= PC_FLAG_ABORT;
1da177e4
LT
433 }
434 }
90699ce2 435 if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
1b5db434 436 if (tape->sense_key == 8) {
1da177e4 437 pc->error = IDETAPE_ERROR_EOD;
346331f8 438 pc->flags |= PC_FLAG_ABORT;
1da177e4 439 }
346331f8 440 if (!(pc->flags & PC_FLAG_ABORT) &&
d236d74c 441 pc->xferred)
1da177e4
LT
442 pc->retries = IDETAPE_MAX_PC_RETRIES + 1;
443 }
444}
445
d01dbc3b 446/* Free data buffers completely. */
077e3bdb 447static void ide_tape_kfree_buffer(idetape_tape_t *tape)
1da177e4 448{
077e3bdb 449 struct idetape_bh *prev_bh, *bh = tape->merge_bh;
d01dbc3b
BP
450
451 while (bh) {
452 u32 size = bh->b_size;
453
454 while (size) {
455 unsigned int order = fls(size >> PAGE_SHIFT)-1;
456
457 if (bh->b_data)
458 free_pages((unsigned long)bh->b_data, order);
459
460 size &= (order-1);
461 bh->b_data += (1 << order) * PAGE_SIZE;
1da177e4
LT
462 }
463 prev_bh = bh;
464 bh = bh->b_reqnext;
465 kfree(prev_bh);
466 }
1da177e4
LT
467}
468
1da177e4
LT
469static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects)
470{
b65fac32 471 struct request *rq = drive->hwif->rq;
1da177e4 472 int error;
1da177e4 473
8004a8c9 474 debug_log(DBG_PROCS, "Enter %s\n", __func__);
1da177e4
LT
475
476 switch (uptodate) {
5a04cfa9
BP
477 case 0: error = IDETAPE_ERROR_GENERAL; break;
478 case 1: error = 0; break;
479 default: error = uptodate;
1da177e4
LT
480 }
481 rq->errors = error;
482 if (error)
5e2040fd 483 drive->failed_pc = NULL;
1da177e4 484
3687221f
BZ
485 if (!blk_special_request(rq)) {
486 ide_end_request(drive, uptodate, nr_sects);
487 return 0;
488 }
489
a09485df 490 ide_complete_rq(drive, 0);
1da177e4 491
1da177e4
LT
492 return 0;
493}
494
b14c7212
BZ
495static void ide_tape_handle_dsc(ide_drive_t *);
496
497static void ide_tape_callback(ide_drive_t *drive, int dsc)
1da177e4
LT
498{
499 idetape_tape_t *tape = drive->driver_data;
2b9efba4 500 struct ide_atapi_pc *pc = drive->pc;
5985e6ab 501 int uptodate = pc->error ? 0 : 1;
1da177e4 502
8004a8c9
BP
503 debug_log(DBG_PROCS, "Enter %s\n", __func__);
504
b14c7212
BZ
505 if (dsc)
506 ide_tape_handle_dsc(drive);
507
5e2040fd
BZ
508 if (drive->failed_pc == pc)
509 drive->failed_pc = NULL;
dd2e9a03 510
5985e6ab
BZ
511 if (pc->c[0] == REQUEST_SENSE) {
512 if (uptodate)
513 idetape_analyze_error(drive, pc->buf);
514 else
515 printk(KERN_ERR "ide-tape: Error in REQUEST SENSE "
516 "itself - Aborting request!\n");
517 } else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
b65fac32 518 struct request *rq = drive->hwif->rq;
5985e6ab
BZ
519 int blocks = pc->xferred / tape->blk_size;
520
521 tape->avg_size += blocks * tape->blk_size;
522
523 if (time_after_eq(jiffies, tape->avg_time + HZ)) {
524 tape->avg_speed = tape->avg_size * HZ /
525 (jiffies - tape->avg_time) / 1024;
526 tape->avg_size = 0;
527 tape->avg_time = jiffies;
528 }
529
530 tape->first_frame += blocks;
531 rq->current_nr_sectors -= blocks;
532
533 if (pc->error)
534 uptodate = pc->error;
535 } else if (pc->c[0] == READ_POSITION && uptodate) {
2b9efba4 536 u8 *readpos = pc->buf;
5985e6ab
BZ
537
538 debug_log(DBG_SENSE, "BOP - %s\n",
539 (readpos[0] & 0x80) ? "Yes" : "No");
540 debug_log(DBG_SENSE, "EOP - %s\n",
541 (readpos[0] & 0x40) ? "Yes" : "No");
542
543 if (readpos[0] & 0x4) {
544 printk(KERN_INFO "ide-tape: Block location is unknown"
545 "to the tape\n");
f2e3ab52 546 clear_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
5985e6ab
BZ
547 uptodate = 0;
548 } else {
549 debug_log(DBG_SENSE, "Block Location - %u\n",
cd740ab0 550 be32_to_cpup((__be32 *)&readpos[4]));
5985e6ab
BZ
551
552 tape->partition = readpos[1];
cd740ab0 553 tape->first_frame = be32_to_cpup((__be32 *)&readpos[4]);
f2e3ab52 554 set_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
5985e6ab 555 }
1da177e4 556 }
5985e6ab
BZ
557
558 idetape_end_request(drive, uptodate, 0);
1da177e4
LT
559}
560
1da177e4 561/*
3c98bf34 562 * Postpone the current request so that ide.c will be able to service requests
b65fac32 563 * from another device on the same port while we are polling for DSC.
1da177e4 564 */
5a04cfa9 565static void idetape_postpone_request(ide_drive_t *drive)
1da177e4
LT
566{
567 idetape_tape_t *tape = drive->driver_data;
568
8004a8c9
BP
569 debug_log(DBG_PROCS, "Enter %s\n", __func__);
570
b65fac32
BZ
571 tape->postponed_rq = drive->hwif->rq;
572
54bb2074 573 ide_stall_queue(drive, tape->dsc_poll_freq);
1da177e4
LT
574}
575
74e63e74
BZ
576static void ide_tape_handle_dsc(ide_drive_t *drive)
577{
578 idetape_tape_t *tape = drive->driver_data;
579
580 /* Media access command */
581 tape->dsc_polling_start = jiffies;
582 tape->dsc_poll_freq = IDETAPE_DSC_MA_FAST;
583 tape->dsc_timeout = jiffies + IDETAPE_DSC_MA_TIMEOUT;
584 /* Allow ide.c to handle other requests */
585 idetape_postpone_request(drive);
586}
587
acaa0f5f 588static int ide_tape_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
08424ac2
BZ
589 unsigned int bcount, int write)
590{
591 if (write)
592 idetape_output_buffers(drive, pc, bcount);
593 else
594 idetape_input_buffers(drive, pc, bcount);
acaa0f5f
BZ
595
596 return bcount;
08424ac2 597}
a1efc85f 598
1da177e4 599/*
3c98bf34 600 * Packet Command Interface
1da177e4 601 *
2b9efba4 602 * The current Packet Command is available in drive->pc, and will not change
3c98bf34
BP
603 * until we finish handling it. Each packet command is associated with a
604 * callback function that will be called when the command is finished.
1da177e4 605 *
3c98bf34 606 * The handling will be done in three stages:
1da177e4 607 *
3c98bf34 608 * 1. idetape_issue_pc will send the packet command to the drive, and will set
aa5d2de7 609 * the interrupt handler to ide_pc_intr.
1da177e4 610 *
aa5d2de7 611 * 2. On each interrupt, ide_pc_intr will be called. This step will be
3c98bf34 612 * repeated until the device signals us that no more interrupts will be issued.
1da177e4 613 *
3c98bf34
BP
614 * 3. ATAPI Tape media access commands have immediate status with a delayed
615 * process. In case of a successful initiation of a media access packet command,
616 * the DSC bit will be set when the actual execution of the command is finished.
617 * Since the tape drive will not issue an interrupt, we have to poll for this
618 * event. In this case, we define the request as "low priority request" by
619 * setting rq_status to IDETAPE_RQ_POSTPONED, set a timer to poll for DSC and
620 * exit the driver.
1da177e4 621 *
3c98bf34
BP
622 * ide.c will then give higher priority to requests which originate from the
623 * other device, until will change rq_status to RQ_ACTIVE.
1da177e4 624 *
3c98bf34 625 * 4. When the packet command is finished, it will be checked for errors.
1da177e4 626 *
3c98bf34
BP
627 * 5. In case an error was found, we queue a request sense packet command in
628 * front of the request queue and retry the operation up to
629 * IDETAPE_MAX_PC_RETRIES times.
1da177e4 630 *
3c98bf34
BP
631 * 6. In case no error was found, or we decided to give up and not to retry
632 * again, the callback function will be called and then we will handle the next
633 * request.
1da177e4 634 */
1da177e4 635
d236d74c
BP
636static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
637 struct ide_atapi_pc *pc)
1da177e4 638{
1da177e4 639 idetape_tape_t *tape = drive->driver_data;
1da177e4 640
2b9efba4 641 if (drive->pc->c[0] == REQUEST_SENSE &&
90699ce2 642 pc->c[0] == REQUEST_SENSE) {
1da177e4
LT
643 printk(KERN_ERR "ide-tape: possible ide-tape.c bug - "
644 "Two request sense in serial were issued\n");
645 }
1da177e4 646
5e2040fd
BZ
647 if (drive->failed_pc == NULL && pc->c[0] != REQUEST_SENSE)
648 drive->failed_pc = pc;
2b9efba4 649
1da177e4 650 /* Set the current packet command */
2b9efba4 651 drive->pc = pc;
1da177e4
LT
652
653 if (pc->retries > IDETAPE_MAX_PC_RETRIES ||
346331f8 654 (pc->flags & PC_FLAG_ABORT)) {
1da177e4 655 /*
3c98bf34
BP
656 * We will "abort" retrying a packet command in case legitimate
657 * error code was received (crossing a filemark, or end of the
658 * media, for example).
1da177e4 659 */
346331f8 660 if (!(pc->flags & PC_FLAG_ABORT)) {
90699ce2 661 if (!(pc->c[0] == TEST_UNIT_READY &&
1da177e4
LT
662 tape->sense_key == 2 && tape->asc == 4 &&
663 (tape->ascq == 1 || tape->ascq == 8))) {
664 printk(KERN_ERR "ide-tape: %s: I/O error, "
665 "pc = %2x, key = %2x, "
666 "asc = %2x, ascq = %2x\n",
667 tape->name, pc->c[0],
668 tape->sense_key, tape->asc,
669 tape->ascq);
670 }
671 /* Giving up */
672 pc->error = IDETAPE_ERROR_GENERAL;
673 }
5e2040fd 674 drive->failed_pc = NULL;
b14c7212 675 drive->pc_callback(drive, 0);
92f5daff 676 return ide_stopped;
1da177e4 677 }
8004a8c9 678 debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]);
1da177e4
LT
679
680 pc->retries++;
1da177e4 681
28ad91db 682 return ide_issue_pc(drive);
1da177e4
LT
683}
684
3c98bf34 685/* A mode sense command is used to "sense" tape parameters. */
d236d74c 686static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
1da177e4 687{
7bf7420a 688 ide_init_pc(pc);
90699ce2 689 pc->c[0] = MODE_SENSE;
1da177e4 690 if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
3c98bf34
BP
691 /* DBD = 1 - Don't return block descriptors */
692 pc->c[1] = 8;
1da177e4
LT
693 pc->c[2] = page_code;
694 /*
695 * Changed pc->c[3] to 0 (255 will at best return unused info).
696 *
697 * For SCSI this byte is defined as subpage instead of high byte
698 * of length and some IDE drives seem to interpret it this way
699 * and return an error when 255 is used.
700 */
701 pc->c[3] = 0;
3c98bf34
BP
702 /* We will just discard data in that case */
703 pc->c[4] = 255;
1da177e4 704 if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
d236d74c 705 pc->req_xfer = 12;
1da177e4 706 else if (page_code == IDETAPE_CAPABILITIES_PAGE)
d236d74c 707 pc->req_xfer = 24;
1da177e4 708 else
d236d74c 709 pc->req_xfer = 50;
1da177e4
LT
710}
711
5a04cfa9 712static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
1da177e4 713{
b73c7ee2 714 ide_hwif_t *hwif = drive->hwif;
1da177e4 715 idetape_tape_t *tape = drive->driver_data;
2b9efba4 716 struct ide_atapi_pc *pc = drive->pc;
22c525b9 717 u8 stat;
1da177e4 718
374e042c 719 stat = hwif->tp_ops->read_status(hwif);
c47137a9 720
3a7d2484
BZ
721 if (stat & ATA_DSC) {
722 if (stat & ATA_ERR) {
1da177e4 723 /* Error detected */
90699ce2 724 if (pc->c[0] != TEST_UNIT_READY)
1da177e4
LT
725 printk(KERN_ERR "ide-tape: %s: I/O error, ",
726 tape->name);
727 /* Retry operation */
6b0da28b 728 ide_retry_pc(drive, tape->disk);
258ec411 729 return ide_stopped;
1da177e4
LT
730 }
731 pc->error = 0;
1da177e4
LT
732 } else {
733 pc->error = IDETAPE_ERROR_GENERAL;
5e2040fd 734 drive->failed_pc = NULL;
1da177e4 735 }
b14c7212 736 drive->pc_callback(drive, 0);
1da177e4
LT
737 return ide_stopped;
738}
739
cd2abbfe 740static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
0014c75b
BP
741 struct ide_atapi_pc *pc, struct request *rq,
742 u8 opcode)
1da177e4 743{
0014c75b
BP
744 struct idetape_bh *bh = (struct idetape_bh *)rq->special;
745 unsigned int length = rq->current_nr_sectors;
746
7bf7420a 747 ide_init_pc(pc);
860ff5ec 748 put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
1da177e4 749 pc->c[1] = 1;
1da177e4 750 pc->bh = bh;
d236d74c
BP
751 pc->buf = NULL;
752 pc->buf_size = length * tape->blk_size;
753 pc->req_xfer = pc->buf_size;
f73850a3 754 if (pc->req_xfer == tape->buffer_size)
5e331095 755 pc->flags |= PC_FLAG_DMA_OK;
1da177e4 756
cd2abbfe
BP
757 if (opcode == READ_6) {
758 pc->c[0] = READ_6;
759 atomic_set(&bh->b_count, 0);
760 } else if (opcode == WRITE_6) {
761 pc->c[0] = WRITE_6;
762 pc->flags |= PC_FLAG_WRITING;
763 pc->b_data = bh->b_data;
764 pc->b_count = atomic_read(&bh->b_count);
765 }
0014c75b
BP
766
767 memcpy(rq->cmd, pc->c, 12);
1da177e4
LT
768}
769
1da177e4
LT
770static ide_startstop_t idetape_do_request(ide_drive_t *drive,
771 struct request *rq, sector_t block)
772{
b73c7ee2 773 ide_hwif_t *hwif = drive->hwif;
1da177e4 774 idetape_tape_t *tape = drive->driver_data;
d236d74c 775 struct ide_atapi_pc *pc = NULL;
1da177e4 776 struct request *postponed_rq = tape->postponed_rq;
22c525b9 777 u8 stat;
1da177e4 778
730616b2
MW
779 debug_log(DBG_SENSE, "sector: %llu, nr_sectors: %lu,"
780 " current_nr_sectors: %u\n",
781 (unsigned long long)rq->sector, rq->nr_sectors,
782 rq->current_nr_sectors);
1da177e4 783
4aff5e23 784 if (!blk_special_request(rq)) {
3c98bf34 785 /* We do not support buffer cache originated requests. */
1da177e4 786 printk(KERN_NOTICE "ide-tape: %s: Unsupported request in "
4aff5e23 787 "request queue (%d)\n", drive->name, rq->cmd_type);
1da177e4
LT
788 ide_end_request(drive, 0, 0);
789 return ide_stopped;
790 }
791
3c98bf34 792 /* Retry a failed packet command */
5e2040fd
BZ
793 if (drive->failed_pc && drive->pc->c[0] == REQUEST_SENSE) {
794 pc = drive->failed_pc;
28c7214b
BZ
795 goto out;
796 }
5a04cfa9 797
1da177e4
LT
798 if (postponed_rq != NULL)
799 if (rq != postponed_rq) {
800 printk(KERN_ERR "ide-tape: ide-tape.c bug - "
801 "Two DSC requests were queued\n");
802 idetape_end_request(drive, 0, 0);
803 return ide_stopped;
804 }
1da177e4
LT
805
806 tape->postponed_rq = NULL;
807
808 /*
809 * If the tape is still busy, postpone our request and service
810 * the other device meanwhile.
811 */
374e042c 812 stat = hwif->tp_ops->read_status(hwif);
1da177e4 813
97100fc8
BZ
814 if ((drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) == 0 &&
815 (rq->cmd[13] & REQ_IDETAPE_PC2) == 0)
f2e3ab52 816 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
1da177e4 817
97100fc8 818 if (drive->dev_flags & IDE_DFLAG_POST_RESET) {
f2e3ab52 819 set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
97100fc8 820 drive->dev_flags &= ~IDE_DFLAG_POST_RESET;
1da177e4
LT
821 }
822
f2e3ab52 823 if (!test_and_clear_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags) &&
3a7d2484 824 (stat & ATA_DSC) == 0) {
1da177e4
LT
825 if (postponed_rq == NULL) {
826 tape->dsc_polling_start = jiffies;
54bb2074 827 tape->dsc_poll_freq = tape->best_dsc_rw_freq;
1da177e4
LT
828 tape->dsc_timeout = jiffies + IDETAPE_DSC_RW_TIMEOUT;
829 } else if (time_after(jiffies, tape->dsc_timeout)) {
830 printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
831 tape->name);
83dd5735 832 if (rq->cmd[13] & REQ_IDETAPE_PC2) {
1da177e4
LT
833 idetape_media_access_finished(drive);
834 return ide_stopped;
835 } else {
836 return ide_do_reset(drive);
837 }
5a04cfa9
BP
838 } else if (time_after(jiffies,
839 tape->dsc_polling_start +
840 IDETAPE_DSC_MA_THRESHOLD))
54bb2074 841 tape->dsc_poll_freq = IDETAPE_DSC_MA_SLOW;
1da177e4
LT
842 idetape_postpone_request(drive);
843 return ide_stopped;
844 }
83dd5735 845 if (rq->cmd[13] & REQ_IDETAPE_READ) {
2e8a6f89 846 pc = &tape->queued_pc;
0014c75b 847 ide_tape_create_rw_cmd(tape, pc, rq, READ_6);
1da177e4
LT
848 goto out;
849 }
83dd5735 850 if (rq->cmd[13] & REQ_IDETAPE_WRITE) {
2e8a6f89 851 pc = &tape->queued_pc;
0014c75b 852 ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6);
1da177e4
LT
853 goto out;
854 }
83dd5735 855 if (rq->cmd[13] & REQ_IDETAPE_PC1) {
d236d74c 856 pc = (struct ide_atapi_pc *) rq->buffer;
83dd5735
BP
857 rq->cmd[13] &= ~(REQ_IDETAPE_PC1);
858 rq->cmd[13] |= REQ_IDETAPE_PC2;
1da177e4
LT
859 goto out;
860 }
83dd5735 861 if (rq->cmd[13] & REQ_IDETAPE_PC2) {
1da177e4
LT
862 idetape_media_access_finished(drive);
863 return ide_stopped;
864 }
865 BUG();
28c7214b 866
f2e3ab52 867out:
8d06bfad 868 return idetape_issue_pc(drive, pc);
1da177e4
LT
869}
870
1da177e4 871/*
41aa1706 872 * The function below uses __get_free_pages to allocate a data buffer of size
f73850a3 873 * tape->buffer_size (or a bit more). We attempt to combine sequential pages as
3c98bf34 874 * much as possible.
1da177e4 875 *
41aa1706
BP
876 * It returns a pointer to the newly allocated buffer, or NULL in case of
877 * failure.
1da177e4 878 */
077e3bdb
BP
879static struct idetape_bh *ide_tape_kmalloc_buffer(idetape_tape_t *tape,
880 int full, int clear)
1da177e4 881{
077e3bdb 882 struct idetape_bh *prev_bh, *bh, *merge_bh;
a997a435 883 int pages = tape->pages_per_buffer;
41aa1706 884 unsigned int order, b_allocd;
1da177e4
LT
885 char *b_data = NULL;
886
077e3bdb
BP
887 merge_bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
888 bh = merge_bh;
1da177e4
LT
889 if (bh == NULL)
890 goto abort;
41aa1706
BP
891
892 order = fls(pages) - 1;
893 bh->b_data = (char *) __get_free_pages(GFP_KERNEL, order);
5a04cfa9 894 if (!bh->b_data)
1da177e4 895 goto abort;
41aa1706
BP
896 b_allocd = (1 << order) * PAGE_SIZE;
897 pages &= (order-1);
898
1da177e4 899 if (clear)
41aa1706
BP
900 memset(bh->b_data, 0, b_allocd);
901 bh->b_reqnext = NULL;
902 bh->b_size = b_allocd;
1da177e4
LT
903 atomic_set(&bh->b_count, full ? bh->b_size : 0);
904
41aa1706
BP
905 while (pages) {
906 order = fls(pages) - 1;
907 b_data = (char *) __get_free_pages(GFP_KERNEL, order);
5a04cfa9 908 if (!b_data)
1da177e4 909 goto abort;
41aa1706
BP
910 b_allocd = (1 << order) * PAGE_SIZE;
911
1da177e4 912 if (clear)
41aa1706
BP
913 memset(b_data, 0, b_allocd);
914
915 /* newly allocated page frames below buffer header or ...*/
916 if (bh->b_data == b_data + b_allocd) {
917 bh->b_size += b_allocd;
918 bh->b_data -= b_allocd;
1da177e4 919 if (full)
41aa1706 920 atomic_add(b_allocd, &bh->b_count);
1da177e4
LT
921 continue;
922 }
41aa1706 923 /* they are above the header */
1da177e4 924 if (b_data == bh->b_data + bh->b_size) {
41aa1706 925 bh->b_size += b_allocd;
1da177e4 926 if (full)
41aa1706 927 atomic_add(b_allocd, &bh->b_count);
1da177e4
LT
928 continue;
929 }
930 prev_bh = bh;
5a04cfa9
BP
931 bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
932 if (!bh) {
41aa1706 933 free_pages((unsigned long) b_data, order);
1da177e4
LT
934 goto abort;
935 }
936 bh->b_reqnext = NULL;
937 bh->b_data = b_data;
41aa1706 938 bh->b_size = b_allocd;
1da177e4
LT
939 atomic_set(&bh->b_count, full ? bh->b_size : 0);
940 prev_bh->b_reqnext = bh;
41aa1706
BP
941
942 pages &= (order-1);
1da177e4 943 }
41aa1706 944
1da177e4
LT
945 bh->b_size -= tape->excess_bh_size;
946 if (full)
947 atomic_sub(tape->excess_bh_size, &bh->b_count);
077e3bdb 948 return merge_bh;
1da177e4 949abort:
077e3bdb 950 ide_tape_kfree_buffer(tape);
1da177e4
LT
951 return NULL;
952}
953
5a04cfa9 954static int idetape_copy_stage_from_user(idetape_tape_t *tape,
8646c88f 955 const char __user *buf, int n)
1da177e4
LT
956{
957 struct idetape_bh *bh = tape->bh;
958 int count;
dcd96379 959 int ret = 0;
1da177e4
LT
960
961 while (n) {
1da177e4 962 if (bh == NULL) {
5a04cfa9
BP
963 printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
964 __func__);
dcd96379 965 return 1;
1da177e4 966 }
5a04cfa9
BP
967 count = min((unsigned int)
968 (bh->b_size - atomic_read(&bh->b_count)),
969 (unsigned int)n);
970 if (copy_from_user(bh->b_data + atomic_read(&bh->b_count), buf,
971 count))
dcd96379 972 ret = 1;
1da177e4
LT
973 n -= count;
974 atomic_add(count, &bh->b_count);
975 buf += count;
976 if (atomic_read(&bh->b_count) == bh->b_size) {
977 bh = bh->b_reqnext;
978 if (bh)
979 atomic_set(&bh->b_count, 0);
980 }
981 }
982 tape->bh = bh;
dcd96379 983 return ret;
1da177e4
LT
984}
985
5a04cfa9 986static int idetape_copy_stage_to_user(idetape_tape_t *tape, char __user *buf,
99d74e61 987 int n)
1da177e4
LT
988{
989 struct idetape_bh *bh = tape->bh;
990 int count;
dcd96379 991 int ret = 0;
1da177e4
LT
992
993 while (n) {
1da177e4 994 if (bh == NULL) {
5a04cfa9
BP
995 printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
996 __func__);
dcd96379 997 return 1;
1da177e4 998 }
1da177e4 999 count = min(tape->b_count, n);
dcd96379
DW
1000 if (copy_to_user(buf, tape->b_data, count))
1001 ret = 1;
1da177e4
LT
1002 n -= count;
1003 tape->b_data += count;
1004 tape->b_count -= count;
1005 buf += count;
1006 if (!tape->b_count) {
5a04cfa9
BP
1007 bh = bh->b_reqnext;
1008 tape->bh = bh;
1da177e4
LT
1009 if (bh) {
1010 tape->b_data = bh->b_data;
1011 tape->b_count = atomic_read(&bh->b_count);
1012 }
1013 }
1014 }
dcd96379 1015 return ret;
1da177e4
LT
1016}
1017
077e3bdb 1018static void idetape_init_merge_buffer(idetape_tape_t *tape)
1da177e4 1019{
077e3bdb
BP
1020 struct idetape_bh *bh = tape->merge_bh;
1021 tape->bh = tape->merge_bh;
5a04cfa9 1022
54abf37e 1023 if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
1da177e4
LT
1024 atomic_set(&bh->b_count, 0);
1025 else {
1026 tape->b_data = bh->b_data;
1027 tape->b_count = atomic_read(&bh->b_count);
1028 }
1029}
1030
1da177e4 1031/*
3c98bf34
BP
1032 * Write a filemark if write_filemark=1. Flush the device buffers without
1033 * writing a filemark otherwise.
1da177e4 1034 */
5a04cfa9 1035static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
d236d74c 1036 struct ide_atapi_pc *pc, int write_filemark)
1da177e4 1037{
7bf7420a 1038 ide_init_pc(pc);
90699ce2 1039 pc->c[0] = WRITE_FILEMARKS;
1da177e4 1040 pc->c[4] = write_filemark;
346331f8 1041 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
1da177e4
LT
1042}
1043
1da177e4
LT
1044static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout)
1045{
1046 idetape_tape_t *tape = drive->driver_data;
2ac07d92 1047 struct gendisk *disk = tape->disk;
1da177e4
LT
1048 int load_attempted = 0;
1049
3c98bf34 1050 /* Wait for the tape to become ready */
f2e3ab52 1051 set_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
1da177e4
LT
1052 timeout += jiffies;
1053 while (time_before(jiffies, timeout)) {
de699ad5 1054 if (ide_do_test_unit_ready(drive, disk) == 0)
1da177e4
LT
1055 return 0;
1056 if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
3c98bf34
BP
1057 || (tape->asc == 0x3A)) {
1058 /* no media */
1da177e4
LT
1059 if (load_attempted)
1060 return -ENOMEDIUM;
0c8a6c7a 1061 ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK);
1da177e4
LT
1062 load_attempted = 1;
1063 /* not about to be ready */
1064 } else if (!(tape->sense_key == 2 && tape->asc == 4 &&
1065 (tape->ascq == 1 || tape->ascq == 8)))
1066 return -EIO;
80ce45fd 1067 msleep(100);
1da177e4
LT
1068 }
1069 return -EIO;
1070}
1071
5a04cfa9 1072static int idetape_flush_tape_buffers(ide_drive_t *drive)
1da177e4 1073{
2ac07d92 1074 struct ide_tape_obj *tape = drive->driver_data;
d236d74c 1075 struct ide_atapi_pc pc;
1da177e4
LT
1076 int rc;
1077
1078 idetape_create_write_filemark_cmd(drive, &pc, 0);
2ac07d92 1079 rc = ide_queue_pc_tail(drive, tape->disk, &pc);
5a04cfa9 1080 if (rc)
1da177e4
LT
1081 return rc;
1082 idetape_wait_ready(drive, 60 * 5 * HZ);
1083 return 0;
1084}
1085
d236d74c 1086static void idetape_create_read_position_cmd(struct ide_atapi_pc *pc)
1da177e4 1087{
7bf7420a 1088 ide_init_pc(pc);
90699ce2 1089 pc->c[0] = READ_POSITION;
d236d74c 1090 pc->req_xfer = 20;
1da177e4
LT
1091}
1092
5a04cfa9 1093static int idetape_read_position(ide_drive_t *drive)
1da177e4
LT
1094{
1095 idetape_tape_t *tape = drive->driver_data;
d236d74c 1096 struct ide_atapi_pc pc;
1da177e4
LT
1097 int position;
1098
8004a8c9 1099 debug_log(DBG_PROCS, "Enter %s\n", __func__);
1da177e4
LT
1100
1101 idetape_create_read_position_cmd(&pc);
2ac07d92 1102 if (ide_queue_pc_tail(drive, tape->disk, &pc))
1da177e4 1103 return -1;
54bb2074 1104 position = tape->first_frame;
1da177e4
LT
1105 return position;
1106}
1107
d236d74c
BP
1108static void idetape_create_locate_cmd(ide_drive_t *drive,
1109 struct ide_atapi_pc *pc,
5a04cfa9 1110 unsigned int block, u8 partition, int skip)
1da177e4 1111{
7bf7420a 1112 ide_init_pc(pc);
90699ce2 1113 pc->c[0] = POSITION_TO_ELEMENT;
1da177e4 1114 pc->c[1] = 2;
860ff5ec 1115 put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[3]);
1da177e4 1116 pc->c[8] = partition;
346331f8 1117 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
1da177e4
LT
1118}
1119
ec0fdb01 1120static void __ide_tape_discard_merge_buffer(ide_drive_t *drive)
1da177e4
LT
1121{
1122 idetape_tape_t *tape = drive->driver_data;
1da177e4 1123
54abf37e 1124 if (tape->chrdev_dir != IDETAPE_DIR_READ)
9798630a 1125 return;
1da177e4 1126
f2e3ab52 1127 clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags);
01a63aeb 1128 tape->merge_bh_size = 0;
077e3bdb
BP
1129 if (tape->merge_bh != NULL) {
1130 ide_tape_kfree_buffer(tape);
1131 tape->merge_bh = NULL;
1da177e4
LT
1132 }
1133
54abf37e 1134 tape->chrdev_dir = IDETAPE_DIR_NONE;
1da177e4
LT
1135}
1136
1137/*
3c98bf34
BP
1138 * Position the tape to the requested block using the LOCATE packet command.
1139 * A READ POSITION command is then issued to check where we are positioned. Like
1140 * all higher level operations, we queue the commands at the tail of the request
1141 * queue and wait for their completion.
1da177e4 1142 */
5a04cfa9
BP
1143static int idetape_position_tape(ide_drive_t *drive, unsigned int block,
1144 u8 partition, int skip)
1da177e4
LT
1145{
1146 idetape_tape_t *tape = drive->driver_data;
2ac07d92 1147 struct gendisk *disk = tape->disk;
1da177e4 1148 int retval;
d236d74c 1149 struct ide_atapi_pc pc;
1da177e4 1150
54abf37e 1151 if (tape->chrdev_dir == IDETAPE_DIR_READ)
ec0fdb01 1152 __ide_tape_discard_merge_buffer(drive);
1da177e4
LT
1153 idetape_wait_ready(drive, 60 * 5 * HZ);
1154 idetape_create_locate_cmd(drive, &pc, block, partition, skip);
2ac07d92 1155 retval = ide_queue_pc_tail(drive, disk, &pc);
1da177e4
LT
1156 if (retval)
1157 return (retval);
1158
1159 idetape_create_read_position_cmd(&pc);
2ac07d92 1160 return ide_queue_pc_tail(drive, disk, &pc);
1da177e4
LT
1161}
1162
ec0fdb01 1163static void ide_tape_discard_merge_buffer(ide_drive_t *drive,
5a04cfa9 1164 int restore_position)
1da177e4
LT
1165{
1166 idetape_tape_t *tape = drive->driver_data;
1da177e4
LT
1167 int seek, position;
1168
ec0fdb01 1169 __ide_tape_discard_merge_buffer(drive);
1da177e4
LT
1170 if (restore_position) {
1171 position = idetape_read_position(drive);
9798630a 1172 seek = position > 0 ? position : 0;
1da177e4 1173 if (idetape_position_tape(drive, seek, 0, 0)) {
5a04cfa9 1174 printk(KERN_INFO "ide-tape: %s: position_tape failed in"
ec0fdb01 1175 " %s\n", tape->name, __func__);
1da177e4
LT
1176 return;
1177 }
1178 }
1179}
1180
1181/*
3c98bf34
BP
1182 * Generate a read/write request for the block device interface and wait for it
1183 * to be serviced.
1da177e4 1184 */
5a04cfa9
BP
1185static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
1186 struct idetape_bh *bh)
1da177e4
LT
1187{
1188 idetape_tape_t *tape = drive->driver_data;
64ea1b4a
FT
1189 struct request *rq;
1190 int ret, errors;
1da177e4 1191
8004a8c9
BP
1192 debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd);
1193
64ea1b4a
FT
1194 rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
1195 rq->cmd_type = REQ_TYPE_SPECIAL;
83dd5735 1196 rq->cmd[13] = cmd;
64ea1b4a
FT
1197 rq->rq_disk = tape->disk;
1198 rq->special = (void *)bh;
1199 rq->sector = tape->first_frame;
1200 rq->nr_sectors = blocks;
1201 rq->current_nr_sectors = blocks;
1202 blk_execute_rq(drive->queue, tape->disk, rq, 0);
1203
1204 errors = rq->errors;
1205 ret = tape->blk_size * (blocks - rq->current_nr_sectors);
1206 blk_put_request(rq);
1da177e4
LT
1207
1208 if ((cmd & (REQ_IDETAPE_READ | REQ_IDETAPE_WRITE)) == 0)
1209 return 0;
1210
077e3bdb
BP
1211 if (tape->merge_bh)
1212 idetape_init_merge_buffer(tape);
64ea1b4a 1213 if (errors == IDETAPE_ERROR_GENERAL)
1da177e4 1214 return -EIO;
64ea1b4a 1215 return ret;
1da177e4
LT
1216}
1217
d236d74c 1218static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
1da177e4 1219{
7bf7420a 1220 ide_init_pc(pc);
90699ce2 1221 pc->c[0] = INQUIRY;
5a04cfa9 1222 pc->c[4] = 254;
d236d74c 1223 pc->req_xfer = 254;
1da177e4
LT
1224}
1225
d236d74c
BP
1226static void idetape_create_rewind_cmd(ide_drive_t *drive,
1227 struct ide_atapi_pc *pc)
1da177e4 1228{
7bf7420a 1229 ide_init_pc(pc);
90699ce2 1230 pc->c[0] = REZERO_UNIT;
346331f8 1231 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
1da177e4
LT
1232}
1233
d236d74c 1234static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
1da177e4 1235{
7bf7420a 1236 ide_init_pc(pc);
90699ce2 1237 pc->c[0] = ERASE;
1da177e4 1238 pc->c[1] = 1;
346331f8 1239 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
1da177e4
LT
1240}
1241
d236d74c 1242static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
1da177e4 1243{
7bf7420a 1244 ide_init_pc(pc);
90699ce2 1245 pc->c[0] = SPACE;
860ff5ec 1246 put_unaligned(cpu_to_be32(count), (unsigned int *) &pc->c[1]);
1da177e4 1247 pc->c[1] = cmd;
346331f8 1248 pc->flags |= PC_FLAG_WAIT_FOR_DSC;
1da177e4
LT
1249}
1250
97c566ce 1251/* Queue up a character device originated write request. */
5a04cfa9 1252static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
1da177e4
LT
1253{
1254 idetape_tape_t *tape = drive->driver_data;
1da177e4 1255
8004a8c9 1256 debug_log(DBG_CHRDEV, "Enter %s\n", __func__);
1da177e4 1257
0aa4b01e 1258 return idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE,
077e3bdb 1259 blocks, tape->merge_bh);
1da177e4
LT
1260}
1261
d9df937a 1262static void ide_tape_flush_merge_buffer(ide_drive_t *drive)
1da177e4
LT
1263{
1264 idetape_tape_t *tape = drive->driver_data;
1265 int blocks, min;
1266 struct idetape_bh *bh;
55a5d291 1267
54abf37e 1268 if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
077e3bdb 1269 printk(KERN_ERR "ide-tape: bug: Trying to empty merge buffer"
5a04cfa9 1270 " but we are not writing.\n");
1da177e4
LT
1271 return;
1272 }
01a63aeb 1273 if (tape->merge_bh_size > tape->buffer_size) {
1da177e4 1274 printk(KERN_ERR "ide-tape: bug: merge_buffer too big\n");
01a63aeb 1275 tape->merge_bh_size = tape->buffer_size;
1da177e4 1276 }
01a63aeb
BP
1277 if (tape->merge_bh_size) {
1278 blocks = tape->merge_bh_size / tape->blk_size;
1279 if (tape->merge_bh_size % tape->blk_size) {
1da177e4
LT
1280 unsigned int i;
1281
1282 blocks++;
01a63aeb 1283 i = tape->blk_size - tape->merge_bh_size %
54bb2074 1284 tape->blk_size;
1da177e4
LT
1285 bh = tape->bh->b_reqnext;
1286 while (bh) {
1287 atomic_set(&bh->b_count, 0);
1288 bh = bh->b_reqnext;
1289 }
1290 bh = tape->bh;
1291 while (i) {
1292 if (bh == NULL) {
5a04cfa9
BP
1293 printk(KERN_INFO "ide-tape: bug,"
1294 " bh NULL\n");
1da177e4
LT
1295 break;
1296 }
5a04cfa9
BP
1297 min = min(i, (unsigned int)(bh->b_size -
1298 atomic_read(&bh->b_count)));
1299 memset(bh->b_data + atomic_read(&bh->b_count),
1300 0, min);
1da177e4
LT
1301 atomic_add(min, &bh->b_count);
1302 i -= min;
1303 bh = bh->b_reqnext;
1304 }
1305 }
1306 (void) idetape_add_chrdev_write_request(drive, blocks);
01a63aeb 1307 tape->merge_bh_size = 0;
1da177e4 1308 }
077e3bdb
BP
1309 if (tape->merge_bh != NULL) {
1310 ide_tape_kfree_buffer(tape);
1311 tape->merge_bh = NULL;
1da177e4 1312 }
54abf37e 1313 tape->chrdev_dir = IDETAPE_DIR_NONE;
1da177e4
LT
1314}
1315
83042b24 1316static int idetape_init_read(ide_drive_t *drive)
1da177e4
LT
1317{
1318 idetape_tape_t *tape = drive->driver_data;
1da177e4 1319 int bytes_read;
1da177e4
LT
1320
1321 /* Initialize read operation */
54abf37e
BP
1322 if (tape->chrdev_dir != IDETAPE_DIR_READ) {
1323 if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
d9df937a 1324 ide_tape_flush_merge_buffer(drive);
1da177e4
LT
1325 idetape_flush_tape_buffers(drive);
1326 }
077e3bdb 1327 if (tape->merge_bh || tape->merge_bh_size) {
01a63aeb 1328 printk(KERN_ERR "ide-tape: merge_bh_size should be"
5a04cfa9 1329 " 0 now\n");
01a63aeb 1330 tape->merge_bh_size = 0;
1da177e4 1331 }
077e3bdb
BP
1332 tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0);
1333 if (!tape->merge_bh)
1da177e4 1334 return -ENOMEM;
54abf37e 1335 tape->chrdev_dir = IDETAPE_DIR_READ;
1da177e4
LT
1336
1337 /*
3c98bf34
BP
1338 * Issue a read 0 command to ensure that DSC handshake is
1339 * switched from completion mode to buffer available mode.
1340 * No point in issuing this if DSC overlap isn't supported, some
1341 * drives (Seagate STT3401A) will return an error.
1da177e4 1342 */
97100fc8 1343 if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) {
5a04cfa9
BP
1344 bytes_read = idetape_queue_rw_tail(drive,
1345 REQ_IDETAPE_READ, 0,
077e3bdb 1346 tape->merge_bh);
1da177e4 1347 if (bytes_read < 0) {
077e3bdb
BP
1348 ide_tape_kfree_buffer(tape);
1349 tape->merge_bh = NULL;
54abf37e 1350 tape->chrdev_dir = IDETAPE_DIR_NONE;
1da177e4
LT
1351 return bytes_read;
1352 }
1353 }
1354 }
5e69bd95 1355
1da177e4
LT
1356 return 0;
1357}
1358
5bd50dc6 1359/* called from idetape_chrdev_read() to service a chrdev read request. */
5a04cfa9 1360static int idetape_add_chrdev_read_request(ide_drive_t *drive, int blocks)
1da177e4
LT
1361{
1362 idetape_tape_t *tape = drive->driver_data;
1da177e4 1363
8004a8c9 1364 debug_log(DBG_PROCS, "Enter %s, %d blocks\n", __func__, blocks);
1da177e4 1365
3c98bf34 1366 /* If we are at a filemark, return a read length of 0 */
f2e3ab52 1367 if (test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
1da177e4
LT
1368 return 0;
1369
83042b24 1370 idetape_init_read(drive);
5e69bd95 1371
5e69bd95 1372 return idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, blocks,
077e3bdb 1373 tape->merge_bh);
1da177e4
LT
1374}
1375
5a04cfa9 1376static void idetape_pad_zeros(ide_drive_t *drive, int bcount)
1da177e4
LT
1377{
1378 idetape_tape_t *tape = drive->driver_data;
1379 struct idetape_bh *bh;
1380 int blocks;
3c98bf34 1381
1da177e4
LT
1382 while (bcount) {
1383 unsigned int count;
1384
077e3bdb 1385 bh = tape->merge_bh;
f73850a3 1386 count = min(tape->buffer_size, bcount);
1da177e4 1387 bcount -= count;
54bb2074 1388 blocks = count / tape->blk_size;
1da177e4 1389 while (count) {
5a04cfa9
BP
1390 atomic_set(&bh->b_count,
1391 min(count, (unsigned int)bh->b_size));
1da177e4
LT
1392 memset(bh->b_data, 0, atomic_read(&bh->b_count));
1393 count -= atomic_read(&bh->b_count);
1394 bh = bh->b_reqnext;
1395 }
5a04cfa9 1396 idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, blocks,
077e3bdb 1397 tape->merge_bh);
1da177e4
LT
1398 }
1399}
1400
1da177e4 1401/*
3c98bf34
BP
1402 * Rewinds the tape to the Beginning Of the current Partition (BOP). We
1403 * currently support only one partition.
1404 */
5a04cfa9 1405static int idetape_rewind_tape(ide_drive_t *drive)
1da177e4 1406{
2ac07d92
BZ
1407 struct ide_tape_obj *tape = drive->driver_data;
1408 struct gendisk *disk = tape->disk;
1da177e4 1409 int retval;
d236d74c 1410 struct ide_atapi_pc pc;
8004a8c9
BP
1411
1412 debug_log(DBG_SENSE, "Enter %s\n", __func__);
1413
1da177e4 1414 idetape_create_rewind_cmd(drive, &pc);
2ac07d92 1415 retval = ide_queue_pc_tail(drive, disk, &pc);
1da177e4
LT
1416 if (retval)
1417 return retval;
1418
1419 idetape_create_read_position_cmd(&pc);
2ac07d92 1420 retval = ide_queue_pc_tail(drive, disk, &pc);
1da177e4
LT
1421 if (retval)
1422 return retval;
1423 return 0;
1424}
1425
3c98bf34 1426/* mtio.h compatible commands should be issued to the chrdev interface. */
5a04cfa9
BP
1427static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
1428 unsigned long arg)
1da177e4
LT
1429{
1430 idetape_tape_t *tape = drive->driver_data;
1da177e4
LT
1431 void __user *argp = (void __user *)arg;
1432
d59823fa
BP
1433 struct idetape_config {
1434 int dsc_rw_frequency;
1435 int dsc_media_access_frequency;
1436 int nr_stages;
1437 } config;
1438
8004a8c9
BP
1439 debug_log(DBG_PROCS, "Enter %s\n", __func__);
1440
1da177e4 1441 switch (cmd) {
5a04cfa9
BP
1442 case 0x0340:
1443 if (copy_from_user(&config, argp, sizeof(config)))
1444 return -EFAULT;
1445 tape->best_dsc_rw_freq = config.dsc_rw_frequency;
5a04cfa9
BP
1446 break;
1447 case 0x0350:
1448 config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
83042b24 1449 config.nr_stages = 1;
5a04cfa9
BP
1450 if (copy_to_user(argp, &config, sizeof(config)))
1451 return -EFAULT;
1452 break;
1453 default:
1454 return -EIO;
1da177e4
LT
1455 }
1456 return 0;
1457}
1458
5a04cfa9
BP
1459static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
1460 int mt_count)
1da177e4
LT
1461{
1462 idetape_tape_t *tape = drive->driver_data;
2ac07d92 1463 struct gendisk *disk = tape->disk;
d236d74c 1464 struct ide_atapi_pc pc;
5a04cfa9 1465 int retval, count = 0;
b6422013 1466 int sprev = !!(tape->caps[4] & 0x20);
1da177e4
LT
1467
1468 if (mt_count == 0)
1469 return 0;
1470 if (MTBSF == mt_op || MTBSFM == mt_op) {
b6422013 1471 if (!sprev)
1da177e4 1472 return -EIO;
5a04cfa9 1473 mt_count = -mt_count;
1da177e4
LT
1474 }
1475
54abf37e 1476 if (tape->chrdev_dir == IDETAPE_DIR_READ) {
01a63aeb 1477 tape->merge_bh_size = 0;
f2e3ab52 1478 if (test_and_clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
1da177e4 1479 ++count;
ec0fdb01 1480 ide_tape_discard_merge_buffer(drive, 0);
1da177e4
LT
1481 }
1482
1da177e4 1483 switch (mt_op) {
5a04cfa9
BP
1484 case MTFSF:
1485 case MTBSF:
1486 idetape_create_space_cmd(&pc, mt_count - count,
1487 IDETAPE_SPACE_OVER_FILEMARK);
2ac07d92 1488 return ide_queue_pc_tail(drive, disk, &pc);
5a04cfa9
BP
1489 case MTFSFM:
1490 case MTBSFM:
1491 if (!sprev)
1492 return -EIO;
1493 retval = idetape_space_over_filemarks(drive, MTFSF,
1494 mt_count - count);
1495 if (retval)
1496 return retval;
1497 count = (MTBSFM == mt_op ? 1 : -1);
1498 return idetape_space_over_filemarks(drive, MTFSF, count);
1499 default:
1500 printk(KERN_ERR "ide-tape: MTIO operation %d not supported\n",
1501 mt_op);
1502 return -EIO;
1da177e4
LT
1503 }
1504}
1505
1da177e4 1506/*
3c98bf34 1507 * Our character device read / write functions.
1da177e4 1508 *
3c98bf34
BP
1509 * The tape is optimized to maximize throughput when it is transferring an
1510 * integral number of the "continuous transfer limit", which is a parameter of
1511 * the specific tape (26kB on my particular tape, 32kB for Onstream).
1da177e4 1512 *
3c98bf34
BP
1513 * As of version 1.3 of the driver, the character device provides an abstract
1514 * continuous view of the media - any mix of block sizes (even 1 byte) on the
1515 * same backup/restore procedure is supported. The driver will internally
1516 * convert the requests to the recommended transfer unit, so that an unmatch
1517 * between the user's block size to the recommended size will only result in a
1518 * (slightly) increased driver overhead, but will no longer hit performance.
1519 * This is not applicable to Onstream.
1da177e4 1520 */
5a04cfa9
BP
1521static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,
1522 size_t count, loff_t *ppos)
1da177e4 1523{
5aeddf90 1524 struct ide_tape_obj *tape = file->private_data;
1da177e4 1525 ide_drive_t *drive = tape->drive;
5a04cfa9 1526 ssize_t bytes_read, temp, actually_read = 0, rc;
dcd96379 1527 ssize_t ret = 0;
b6422013 1528 u16 ctl = *(u16 *)&tape->caps[12];
1da177e4 1529
8004a8c9 1530 debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count);
1da177e4 1531
54abf37e 1532 if (tape->chrdev_dir != IDETAPE_DIR_READ) {
f2e3ab52 1533 if (test_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags))
54bb2074
BP
1534 if (count > tape->blk_size &&
1535 (count % tape->blk_size) == 0)
1536 tape->user_bs_factor = count / tape->blk_size;
1da177e4 1537 }
83042b24 1538 rc = idetape_init_read(drive);
8d06bfad 1539 if (rc < 0)
1da177e4
LT
1540 return rc;
1541 if (count == 0)
1542 return (0);
01a63aeb
BP
1543 if (tape->merge_bh_size) {
1544 actually_read = min((unsigned int)(tape->merge_bh_size),
5a04cfa9 1545 (unsigned int)count);
99d74e61 1546 if (idetape_copy_stage_to_user(tape, buf, actually_read))
dcd96379 1547 ret = -EFAULT;
1da177e4 1548 buf += actually_read;
01a63aeb 1549 tape->merge_bh_size -= actually_read;
1da177e4
LT
1550 count -= actually_read;
1551 }
f73850a3 1552 while (count >= tape->buffer_size) {
b6422013 1553 bytes_read = idetape_add_chrdev_read_request(drive, ctl);
1da177e4
LT
1554 if (bytes_read <= 0)
1555 goto finish;
99d74e61 1556 if (idetape_copy_stage_to_user(tape, buf, bytes_read))
dcd96379 1557 ret = -EFAULT;
1da177e4
LT
1558 buf += bytes_read;
1559 count -= bytes_read;
1560 actually_read += bytes_read;
1561 }
1562 if (count) {
b6422013 1563 bytes_read = idetape_add_chrdev_read_request(drive, ctl);
1da177e4
LT
1564 if (bytes_read <= 0)
1565 goto finish;
1566 temp = min((unsigned long)count, (unsigned long)bytes_read);
99d74e61 1567 if (idetape_copy_stage_to_user(tape, buf, temp))
dcd96379 1568 ret = -EFAULT;
1da177e4 1569 actually_read += temp;
01a63aeb 1570 tape->merge_bh_size = bytes_read-temp;
1da177e4
LT
1571 }
1572finish:
f2e3ab52 1573 if (!actually_read && test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) {
8004a8c9
BP
1574 debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name);
1575
1da177e4
LT
1576 idetape_space_over_filemarks(drive, MTFSF, 1);
1577 return 0;
1578 }
dcd96379 1579
5a04cfa9 1580 return ret ? ret : actually_read;
1da177e4
LT
1581}
1582
5a04cfa9 1583static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf,
1da177e4
LT
1584 size_t count, loff_t *ppos)
1585{
5aeddf90 1586 struct ide_tape_obj *tape = file->private_data;
1da177e4 1587 ide_drive_t *drive = tape->drive;
dcd96379
DW
1588 ssize_t actually_written = 0;
1589 ssize_t ret = 0;
b6422013 1590 u16 ctl = *(u16 *)&tape->caps[12];
1da177e4
LT
1591
1592 /* The drive is write protected. */
1593 if (tape->write_prot)
1594 return -EACCES;
1595
8004a8c9 1596 debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count);
1da177e4
LT
1597
1598 /* Initialize write operation */
54abf37e
BP
1599 if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
1600 if (tape->chrdev_dir == IDETAPE_DIR_READ)
ec0fdb01 1601 ide_tape_discard_merge_buffer(drive, 1);
077e3bdb 1602 if (tape->merge_bh || tape->merge_bh_size) {
01a63aeb 1603 printk(KERN_ERR "ide-tape: merge_bh_size "
1da177e4 1604 "should be 0 now\n");
01a63aeb 1605 tape->merge_bh_size = 0;
1da177e4 1606 }
077e3bdb
BP
1607 tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0);
1608 if (!tape->merge_bh)
1da177e4 1609 return -ENOMEM;
54abf37e 1610 tape->chrdev_dir = IDETAPE_DIR_WRITE;
077e3bdb 1611 idetape_init_merge_buffer(tape);
1da177e4
LT
1612
1613 /*
3c98bf34
BP
1614 * Issue a write 0 command to ensure that DSC handshake is
1615 * switched from completion mode to buffer available mode. No
1616 * point in issuing this if DSC overlap isn't supported, some
1617 * drives (Seagate STT3401A) will return an error.
1da177e4 1618 */
97100fc8 1619 if (drive->dev_flags & IDE_DFLAG_DSC_OVERLAP) {
5a04cfa9
BP
1620 ssize_t retval = idetape_queue_rw_tail(drive,
1621 REQ_IDETAPE_WRITE, 0,
077e3bdb 1622 tape->merge_bh);
1da177e4 1623 if (retval < 0) {
077e3bdb
BP
1624 ide_tape_kfree_buffer(tape);
1625 tape->merge_bh = NULL;
54abf37e 1626 tape->chrdev_dir = IDETAPE_DIR_NONE;
1da177e4
LT
1627 return retval;
1628 }
1629 }
1630 }
1631 if (count == 0)
1632 return (0);
01a63aeb
BP
1633 if (tape->merge_bh_size) {
1634 if (tape->merge_bh_size >= tape->buffer_size) {
5a04cfa9 1635 printk(KERN_ERR "ide-tape: bug: merge buf too big\n");
01a63aeb 1636 tape->merge_bh_size = 0;
1da177e4 1637 }
5a04cfa9 1638 actually_written = min((unsigned int)
01a63aeb 1639 (tape->buffer_size - tape->merge_bh_size),
5a04cfa9 1640 (unsigned int)count);
8646c88f 1641 if (idetape_copy_stage_from_user(tape, buf, actually_written))
dcd96379 1642 ret = -EFAULT;
1da177e4 1643 buf += actually_written;
01a63aeb 1644 tape->merge_bh_size += actually_written;
1da177e4
LT
1645 count -= actually_written;
1646
01a63aeb 1647 if (tape->merge_bh_size == tape->buffer_size) {
dcd96379 1648 ssize_t retval;
01a63aeb 1649 tape->merge_bh_size = 0;
b6422013 1650 retval = idetape_add_chrdev_write_request(drive, ctl);
1da177e4
LT
1651 if (retval <= 0)
1652 return (retval);
1653 }
1654 }
f73850a3 1655 while (count >= tape->buffer_size) {
dcd96379 1656 ssize_t retval;
f73850a3 1657 if (idetape_copy_stage_from_user(tape, buf, tape->buffer_size))
dcd96379 1658 ret = -EFAULT;
f73850a3
BP
1659 buf += tape->buffer_size;
1660 count -= tape->buffer_size;
b6422013 1661 retval = idetape_add_chrdev_write_request(drive, ctl);
f73850a3 1662 actually_written += tape->buffer_size;
1da177e4
LT
1663 if (retval <= 0)
1664 return (retval);
1665 }
1666 if (count) {
1667 actually_written += count;
8646c88f 1668 if (idetape_copy_stage_from_user(tape, buf, count))
dcd96379 1669 ret = -EFAULT;
01a63aeb 1670 tape->merge_bh_size += count;
1da177e4 1671 }
5a04cfa9 1672 return ret ? ret : actually_written;
1da177e4
LT
1673}
1674
5a04cfa9 1675static int idetape_write_filemark(ide_drive_t *drive)
1da177e4 1676{
2ac07d92 1677 struct ide_tape_obj *tape = drive->driver_data;
d236d74c 1678 struct ide_atapi_pc pc;
1da177e4
LT
1679
1680 /* Write a filemark */
1681 idetape_create_write_filemark_cmd(drive, &pc, 1);
2ac07d92 1682 if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
1da177e4
LT
1683 printk(KERN_ERR "ide-tape: Couldn't write a filemark\n");
1684 return -EIO;
1685 }
1686 return 0;
1687}
1688
1689/*
d99c9da2
BP
1690 * Called from idetape_chrdev_ioctl when the general mtio MTIOCTOP ioctl is
1691 * requested.
1da177e4 1692 *
d99c9da2
BP
1693 * Note: MTBSF and MTBSFM are not supported when the tape doesn't support
1694 * spacing over filemarks in the reverse direction. In this case, MTFSFM is also
5bd50dc6 1695 * usually not supported.
1da177e4 1696 *
d99c9da2 1697 * The following commands are currently not supported:
1da177e4 1698 *
d99c9da2
BP
1699 * MTFSS, MTBSS, MTWSM, MTSETDENSITY, MTSETDRVBUFFER, MT_ST_BOOLEANS,
1700 * MT_ST_WRITE_THRESHOLD.
1da177e4 1701 */
d99c9da2 1702static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count)
1da177e4
LT
1703{
1704 idetape_tape_t *tape = drive->driver_data;
2ac07d92 1705 struct gendisk *disk = tape->disk;
d236d74c 1706 struct ide_atapi_pc pc;
5a04cfa9 1707 int i, retval;
1da177e4 1708
8004a8c9
BP
1709 debug_log(DBG_ERR, "Handling MTIOCTOP ioctl: mt_op=%d, mt_count=%d\n",
1710 mt_op, mt_count);
5a04cfa9 1711
1da177e4 1712 switch (mt_op) {
5a04cfa9
BP
1713 case MTFSF:
1714 case MTFSFM:
1715 case MTBSF:
1716 case MTBSFM:
1717 if (!mt_count)
1718 return 0;
1719 return idetape_space_over_filemarks(drive, mt_op, mt_count);
1720 default:
1721 break;
1da177e4 1722 }
5a04cfa9 1723
1da177e4 1724 switch (mt_op) {
5a04cfa9
BP
1725 case MTWEOF:
1726 if (tape->write_prot)
1727 return -EACCES;
ec0fdb01 1728 ide_tape_discard_merge_buffer(drive, 1);
5a04cfa9
BP
1729 for (i = 0; i < mt_count; i++) {
1730 retval = idetape_write_filemark(drive);
1731 if (retval)
1732 return retval;
1733 }
1734 return 0;
1735 case MTREW:
ec0fdb01 1736 ide_tape_discard_merge_buffer(drive, 0);
5a04cfa9
BP
1737 if (idetape_rewind_tape(drive))
1738 return -EIO;
1739 return 0;
1740 case MTLOAD:
ec0fdb01 1741 ide_tape_discard_merge_buffer(drive, 0);
0c8a6c7a 1742 return ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK);
5a04cfa9
BP
1743 case MTUNLOAD:
1744 case MTOFFL:
1745 /*
1746 * If door is locked, attempt to unlock before
1747 * attempting to eject.
1748 */
1749 if (tape->door_locked) {
0578042d 1750 if (!ide_set_media_lock(drive, disk, 0))
385a4b87 1751 tape->door_locked = DOOR_UNLOCKED;
5a04cfa9 1752 }
ec0fdb01 1753 ide_tape_discard_merge_buffer(drive, 0);
0c8a6c7a 1754 retval = ide_do_start_stop(drive, disk, !IDETAPE_LU_LOAD_MASK);
5a04cfa9 1755 if (!retval)
f2e3ab52 1756 clear_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
5a04cfa9
BP
1757 return retval;
1758 case MTNOP:
ec0fdb01 1759 ide_tape_discard_merge_buffer(drive, 0);
5a04cfa9
BP
1760 return idetape_flush_tape_buffers(drive);
1761 case MTRETEN:
ec0fdb01 1762 ide_tape_discard_merge_buffer(drive, 0);
0c8a6c7a 1763 return ide_do_start_stop(drive, disk,
5a04cfa9 1764 IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK);
5a04cfa9
BP
1765 case MTEOM:
1766 idetape_create_space_cmd(&pc, 0, IDETAPE_SPACE_TO_EOD);
2ac07d92 1767 return ide_queue_pc_tail(drive, disk, &pc);
5a04cfa9
BP
1768 case MTERASE:
1769 (void)idetape_rewind_tape(drive);
1770 idetape_create_erase_cmd(&pc);
2ac07d92 1771 return ide_queue_pc_tail(drive, disk, &pc);
5a04cfa9
BP
1772 case MTSETBLK:
1773 if (mt_count) {
1774 if (mt_count < tape->blk_size ||
1775 mt_count % tape->blk_size)
1da177e4 1776 return -EIO;
5a04cfa9 1777 tape->user_bs_factor = mt_count / tape->blk_size;
f2e3ab52 1778 clear_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
5a04cfa9 1779 } else
f2e3ab52 1780 set_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
5a04cfa9
BP
1781 return 0;
1782 case MTSEEK:
ec0fdb01 1783 ide_tape_discard_merge_buffer(drive, 0);
5a04cfa9
BP
1784 return idetape_position_tape(drive,
1785 mt_count * tape->user_bs_factor, tape->partition, 0);
1786 case MTSETPART:
ec0fdb01 1787 ide_tape_discard_merge_buffer(drive, 0);
5a04cfa9
BP
1788 return idetape_position_tape(drive, 0, mt_count, 0);
1789 case MTFSR:
1790 case MTBSR:
1791 case MTLOCK:
0578042d 1792 retval = ide_set_media_lock(drive, disk, 1);
5a04cfa9 1793 if (retval)
1da177e4 1794 return retval;
5a04cfa9
BP
1795 tape->door_locked = DOOR_EXPLICITLY_LOCKED;
1796 return 0;
1797 case MTUNLOCK:
0578042d 1798 retval = ide_set_media_lock(drive, disk, 0);
5a04cfa9
BP
1799 if (retval)
1800 return retval;
1801 tape->door_locked = DOOR_UNLOCKED;
1802 return 0;
1803 default:
1804 printk(KERN_ERR "ide-tape: MTIO operation %d not supported\n",
1805 mt_op);
1806 return -EIO;
1da177e4
LT
1807 }
1808}
1809
1810/*
d99c9da2
BP
1811 * Our character device ioctls. General mtio.h magnetic io commands are
1812 * supported here, and not in the corresponding block interface. Our own
1813 * ide-tape ioctls are supported on both interfaces.
1da177e4 1814 */
d99c9da2
BP
1815static int idetape_chrdev_ioctl(struct inode *inode, struct file *file,
1816 unsigned int cmd, unsigned long arg)
1da177e4 1817{
5aeddf90 1818 struct ide_tape_obj *tape = file->private_data;
1da177e4
LT
1819 ide_drive_t *drive = tape->drive;
1820 struct mtop mtop;
1821 struct mtget mtget;
1822 struct mtpos mtpos;
54bb2074 1823 int block_offset = 0, position = tape->first_frame;
1da177e4
LT
1824 void __user *argp = (void __user *)arg;
1825
8004a8c9 1826 debug_log(DBG_CHRDEV, "Enter %s, cmd=%u\n", __func__, cmd);
1da177e4 1827
54abf37e 1828 if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
d9df937a 1829 ide_tape_flush_merge_buffer(drive);
1da177e4
LT
1830 idetape_flush_tape_buffers(drive);
1831 }
1832 if (cmd == MTIOCGET || cmd == MTIOCPOS) {
01a63aeb 1833 block_offset = tape->merge_bh_size /
54bb2074 1834 (tape->blk_size * tape->user_bs_factor);
5a04cfa9
BP
1835 position = idetape_read_position(drive);
1836 if (position < 0)
1da177e4
LT
1837 return -EIO;
1838 }
1839 switch (cmd) {
5a04cfa9
BP
1840 case MTIOCTOP:
1841 if (copy_from_user(&mtop, argp, sizeof(struct mtop)))
1842 return -EFAULT;
1843 return idetape_mtioctop(drive, mtop.mt_op, mtop.mt_count);
1844 case MTIOCGET:
1845 memset(&mtget, 0, sizeof(struct mtget));
1846 mtget.mt_type = MT_ISSCSI2;
1847 mtget.mt_blkno = position / tape->user_bs_factor - block_offset;
1848 mtget.mt_dsreg =
1849 ((tape->blk_size * tape->user_bs_factor)
1850 << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK;
1851
1852 if (tape->drv_write_prot)
1853 mtget.mt_gstat |= GMT_WR_PROT(0xffffffff);
1854
1855 if (copy_to_user(argp, &mtget, sizeof(struct mtget)))
1856 return -EFAULT;
1857 return 0;
1858 case MTIOCPOS:
1859 mtpos.mt_blkno = position / tape->user_bs_factor - block_offset;
1860 if (copy_to_user(argp, &mtpos, sizeof(struct mtpos)))
1861 return -EFAULT;
1862 return 0;
1863 default:
1864 if (tape->chrdev_dir == IDETAPE_DIR_READ)
ec0fdb01 1865 ide_tape_discard_merge_buffer(drive, 1);
5a04cfa9 1866 return idetape_blkdev_ioctl(drive, cmd, arg);
1da177e4
LT
1867 }
1868}
1869
3cffb9ce
BP
1870/*
1871 * Do a mode sense page 0 with block descriptor and if it succeeds set the tape
1872 * block size with the reported value.
1873 */
1874static void ide_tape_get_bsize_from_bdesc(ide_drive_t *drive)
1875{
1876 idetape_tape_t *tape = drive->driver_data;
d236d74c 1877 struct ide_atapi_pc pc;
3cffb9ce
BP
1878
1879 idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_DESCRIPTOR);
2ac07d92 1880 if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
3cffb9ce 1881 printk(KERN_ERR "ide-tape: Can't get block descriptor\n");
54bb2074 1882 if (tape->blk_size == 0) {
3cffb9ce
BP
1883 printk(KERN_WARNING "ide-tape: Cannot deal with zero "
1884 "block size, assuming 32k\n");
54bb2074 1885 tape->blk_size = 32768;
3cffb9ce
BP
1886 }
1887 return;
1888 }
d236d74c
BP
1889 tape->blk_size = (pc.buf[4 + 5] << 16) +
1890 (pc.buf[4 + 6] << 8) +
1891 pc.buf[4 + 7];
1892 tape->drv_write_prot = (pc.buf[2] & 0x80) >> 7;
3cffb9ce 1893}
1da177e4 1894
5a04cfa9 1895static int idetape_chrdev_open(struct inode *inode, struct file *filp)
1da177e4
LT
1896{
1897 unsigned int minor = iminor(inode), i = minor & ~0xc0;
1898 ide_drive_t *drive;
1899 idetape_tape_t *tape;
1da177e4
LT
1900 int retval;
1901
8004a8c9
BP
1902 if (i >= MAX_HWIFS * MAX_DRIVES)
1903 return -ENXIO;
1904
04f4ac9d 1905 lock_kernel();
8004a8c9 1906 tape = ide_tape_chrdev_get(i);
04f4ac9d
JC
1907 if (!tape) {
1908 unlock_kernel();
8004a8c9 1909 return -ENXIO;
04f4ac9d 1910 }
8004a8c9
BP
1911
1912 debug_log(DBG_CHRDEV, "Enter %s\n", __func__);
1913
1da177e4
LT
1914 /*
1915 * We really want to do nonseekable_open(inode, filp); here, but some
1916 * versions of tar incorrectly call lseek on tapes and bail out if that
1917 * fails. So we disallow pread() and pwrite(), but permit lseeks.
1918 */
1919 filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
1920
1da177e4
LT
1921 drive = tape->drive;
1922
1923 filp->private_data = tape;
1924
f2e3ab52 1925 if (test_and_set_bit(IDE_AFLAG_BUSY, &drive->atapi_flags)) {
1da177e4
LT
1926 retval = -EBUSY;
1927 goto out_put_tape;
1928 }
1929
1930 retval = idetape_wait_ready(drive, 60 * HZ);
1931 if (retval) {
f2e3ab52 1932 clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
1da177e4
LT
1933 printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
1934 goto out_put_tape;
1935 }
1936
1937 idetape_read_position(drive);
f2e3ab52 1938 if (!test_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags))
1da177e4
LT
1939 (void)idetape_rewind_tape(drive);
1940
1da177e4 1941 /* Read block size and write protect status from drive. */
3cffb9ce 1942 ide_tape_get_bsize_from_bdesc(drive);
1da177e4
LT
1943
1944 /* Set write protect flag if device is opened as read-only. */
1945 if ((filp->f_flags & O_ACCMODE) == O_RDONLY)
1946 tape->write_prot = 1;
1947 else
1948 tape->write_prot = tape->drv_write_prot;
1949
1950 /* Make sure drive isn't write protected if user wants to write. */
1951 if (tape->write_prot) {
1952 if ((filp->f_flags & O_ACCMODE) == O_WRONLY ||
1953 (filp->f_flags & O_ACCMODE) == O_RDWR) {
f2e3ab52 1954 clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
1da177e4
LT
1955 retval = -EROFS;
1956 goto out_put_tape;
1957 }
1958 }
1959
3c98bf34 1960 /* Lock the tape drive door so user can't eject. */
54abf37e 1961 if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
0578042d 1962 if (!ide_set_media_lock(drive, tape->disk, 1)) {
385a4b87
BZ
1963 if (tape->door_locked != DOOR_EXPLICITLY_LOCKED)
1964 tape->door_locked = DOOR_LOCKED;
1da177e4
LT
1965 }
1966 }
04f4ac9d 1967 unlock_kernel();
1da177e4
LT
1968 return 0;
1969
1970out_put_tape:
1971 ide_tape_put(tape);
04f4ac9d 1972 unlock_kernel();
1da177e4
LT
1973 return retval;
1974}
1975
5a04cfa9 1976static void idetape_write_release(ide_drive_t *drive, unsigned int minor)
1da177e4
LT
1977{
1978 idetape_tape_t *tape = drive->driver_data;
1979
d9df937a 1980 ide_tape_flush_merge_buffer(drive);
077e3bdb
BP
1981 tape->merge_bh = ide_tape_kmalloc_buffer(tape, 1, 0);
1982 if (tape->merge_bh != NULL) {
54bb2074
BP
1983 idetape_pad_zeros(drive, tape->blk_size *
1984 (tape->user_bs_factor - 1));
077e3bdb
BP
1985 ide_tape_kfree_buffer(tape);
1986 tape->merge_bh = NULL;
1da177e4
LT
1987 }
1988 idetape_write_filemark(drive);
1989 idetape_flush_tape_buffers(drive);
1990 idetape_flush_tape_buffers(drive);
1991}
1992
5a04cfa9 1993static int idetape_chrdev_release(struct inode *inode, struct file *filp)
1da177e4 1994{
5aeddf90 1995 struct ide_tape_obj *tape = filp->private_data;
1da177e4 1996 ide_drive_t *drive = tape->drive;
1da177e4
LT
1997 unsigned int minor = iminor(inode);
1998
1999 lock_kernel();
2000 tape = drive->driver_data;
8004a8c9
BP
2001
2002 debug_log(DBG_CHRDEV, "Enter %s\n", __func__);
1da177e4 2003
54abf37e 2004 if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
1da177e4 2005 idetape_write_release(drive, minor);
54abf37e 2006 if (tape->chrdev_dir == IDETAPE_DIR_READ) {
1da177e4 2007 if (minor < 128)
ec0fdb01 2008 ide_tape_discard_merge_buffer(drive, 1);
1da177e4 2009 }
f64eee7b 2010
f2e3ab52 2011 if (minor < 128 && test_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags))
1da177e4 2012 (void) idetape_rewind_tape(drive);
54abf37e 2013 if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
1da177e4 2014 if (tape->door_locked == DOOR_LOCKED) {
0578042d 2015 if (!ide_set_media_lock(drive, tape->disk, 0))
385a4b87 2016 tape->door_locked = DOOR_UNLOCKED;
1da177e4
LT
2017 }
2018 }
f2e3ab52 2019 clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
1da177e4
LT
2020 ide_tape_put(tape);
2021 unlock_kernel();
2022 return 0;
2023}
2024
6d29c8f0 2025static void idetape_get_inquiry_results(ide_drive_t *drive)
1da177e4 2026{
1da177e4 2027 idetape_tape_t *tape = drive->driver_data;
d236d74c 2028 struct ide_atapi_pc pc;
801bd32e 2029 char fw_rev[4], vendor_id[8], product_id[16];
6d29c8f0 2030
1da177e4 2031 idetape_create_inquiry_cmd(&pc);
2ac07d92 2032 if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
6d29c8f0
BP
2033 printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n",
2034 tape->name);
1da177e4
LT
2035 return;
2036 }
d236d74c
BP
2037 memcpy(vendor_id, &pc.buf[8], 8);
2038 memcpy(product_id, &pc.buf[16], 16);
2039 memcpy(fw_rev, &pc.buf[32], 4);
41f81d54 2040
801bd32e
BP
2041 ide_fixstring(vendor_id, 8, 0);
2042 ide_fixstring(product_id, 16, 0);
2043 ide_fixstring(fw_rev, 4, 0);
41f81d54 2044
801bd32e 2045 printk(KERN_INFO "ide-tape: %s <-> %s: %.8s %.16s rev %.4s\n",
41f81d54 2046 drive->name, tape->name, vendor_id, product_id, fw_rev);
1da177e4
LT
2047}
2048
2049/*
b6422013
BP
2050 * Ask the tape about its various parameters. In particular, we will adjust our
2051 * data transfer buffer size to the recommended value as returned by the tape.
1da177e4 2052 */
5a04cfa9 2053static void idetape_get_mode_sense_results(ide_drive_t *drive)
1da177e4
LT
2054{
2055 idetape_tape_t *tape = drive->driver_data;
d236d74c 2056 struct ide_atapi_pc pc;
b6422013
BP
2057 u8 *caps;
2058 u8 speed, max_speed;
47314fa4 2059
1da177e4 2060 idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE);
2ac07d92 2061 if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
b6422013
BP
2062 printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming"
2063 " some default values\n");
54bb2074 2064 tape->blk_size = 512;
b6422013
BP
2065 put_unaligned(52, (u16 *)&tape->caps[12]);
2066 put_unaligned(540, (u16 *)&tape->caps[14]);
2067 put_unaligned(6*52, (u16 *)&tape->caps[16]);
1da177e4
LT
2068 return;
2069 }
d236d74c 2070 caps = pc.buf + 4 + pc.buf[3];
b6422013
BP
2071
2072 /* convert to host order and save for later use */
cd740ab0
HH
2073 speed = be16_to_cpup((__be16 *)&caps[14]);
2074 max_speed = be16_to_cpup((__be16 *)&caps[8]);
1da177e4 2075
cd740ab0
HH
2076 *(u16 *)&caps[8] = max_speed;
2077 *(u16 *)&caps[12] = be16_to_cpup((__be16 *)&caps[12]);
2078 *(u16 *)&caps[14] = speed;
2079 *(u16 *)&caps[16] = be16_to_cpup((__be16 *)&caps[16]);
1da177e4 2080
b6422013
BP
2081 if (!speed) {
2082 printk(KERN_INFO "ide-tape: %s: invalid tape speed "
2083 "(assuming 650KB/sec)\n", drive->name);
cd740ab0 2084 *(u16 *)&caps[14] = 650;
1da177e4 2085 }
b6422013
BP
2086 if (!max_speed) {
2087 printk(KERN_INFO "ide-tape: %s: invalid max_speed "
2088 "(assuming 650KB/sec)\n", drive->name);
cd740ab0 2089 *(u16 *)&caps[8] = 650;
1da177e4
LT
2090 }
2091
b6422013 2092 memcpy(&tape->caps, caps, 20);
0578042d
BZ
2093
2094 /* device lacks locking support according to capabilities page */
2095 if ((caps[6] & 1) == 0)
42619d35 2096 drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
0578042d 2097
b6422013 2098 if (caps[7] & 0x02)
54bb2074 2099 tape->blk_size = 512;
b6422013 2100 else if (caps[7] & 0x04)
54bb2074 2101 tape->blk_size = 1024;
1da177e4
LT
2102}
2103
7662d046 2104#ifdef CONFIG_IDE_PROC_FS
8185d5aa
BZ
2105#define ide_tape_devset_get(name, field) \
2106static int get_##name(ide_drive_t *drive) \
2107{ \
2108 idetape_tape_t *tape = drive->driver_data; \
2109 return tape->field; \
2110}
2111
2112#define ide_tape_devset_set(name, field) \
2113static int set_##name(ide_drive_t *drive, int arg) \
2114{ \
2115 idetape_tape_t *tape = drive->driver_data; \
2116 tape->field = arg; \
2117 return 0; \
2118}
2119
92f1f8fd 2120#define ide_tape_devset_rw_field(_name, _field) \
8185d5aa
BZ
2121ide_tape_devset_get(_name, _field) \
2122ide_tape_devset_set(_name, _field) \
92f1f8fd 2123IDE_DEVSET(_name, DS_SYNC, get_##_name, set_##_name)
8185d5aa 2124
92f1f8fd 2125#define ide_tape_devset_r_field(_name, _field) \
8185d5aa 2126ide_tape_devset_get(_name, _field) \
92f1f8fd 2127IDE_DEVSET(_name, 0, get_##_name, NULL)
8185d5aa
BZ
2128
2129static int mulf_tdsc(ide_drive_t *drive) { return 1000; }
2130static int divf_tdsc(ide_drive_t *drive) { return HZ; }
2131static int divf_buffer(ide_drive_t *drive) { return 2; }
2132static int divf_buffer_size(ide_drive_t *drive) { return 1024; }
2133
97100fc8 2134ide_devset_rw_flag(dsc_overlap, IDE_DFLAG_DSC_OVERLAP);
92f1f8fd
EO
2135
2136ide_tape_devset_rw_field(debug_mask, debug_mask);
2137ide_tape_devset_rw_field(tdsc, best_dsc_rw_freq);
2138
2139ide_tape_devset_r_field(avg_speed, avg_speed);
2140ide_tape_devset_r_field(speed, caps[14]);
2141ide_tape_devset_r_field(buffer, caps[16]);
2142ide_tape_devset_r_field(buffer_size, buffer_size);
2143
2144static const struct ide_proc_devset idetape_settings[] = {
2145 __IDE_PROC_DEVSET(avg_speed, 0, 0xffff, NULL, NULL),
2146 __IDE_PROC_DEVSET(buffer, 0, 0xffff, NULL, divf_buffer),
2147 __IDE_PROC_DEVSET(buffer_size, 0, 0xffff, NULL, divf_buffer_size),
2148 __IDE_PROC_DEVSET(debug_mask, 0, 0xffff, NULL, NULL),
2149 __IDE_PROC_DEVSET(dsc_overlap, 0, 1, NULL, NULL),
2150 __IDE_PROC_DEVSET(speed, 0, 0xffff, NULL, NULL),
2151 __IDE_PROC_DEVSET(tdsc, IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX,
2152 mulf_tdsc, divf_tdsc),
71bfc7a7 2153 { NULL },
8185d5aa 2154};
7662d046 2155#endif
1da177e4
LT
2156
2157/*
3c98bf34 2158 * The function below is called to:
1da177e4 2159 *
3c98bf34
BP
2160 * 1. Initialize our various state variables.
2161 * 2. Ask the tape for its capabilities.
2162 * 3. Allocate a buffer which will be used for data transfer. The buffer size
2163 * is chosen based on the recommendation which we received in step 2.
1da177e4 2164 *
3c98bf34
BP
2165 * Note that at this point ide.c already assigned us an irq, so that we can
2166 * queue requests here and wait for their completion.
1da177e4 2167 */
5a04cfa9 2168static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
1da177e4 2169{
83042b24 2170 unsigned long t;
1da177e4 2171 int speed;
f73850a3 2172 int buffer_size;
b6422013 2173 u16 *ctl = (u16 *)&tape->caps[12];
1da177e4 2174
85e39035
BZ
2175 drive->pc_callback = ide_tape_callback;
2176 drive->pc_update_buffers = idetape_update_buffers;
2177 drive->pc_io_buffers = ide_tape_io_buffers;
776bb027 2178
97100fc8
BZ
2179 drive->dev_flags |= IDE_DFLAG_DSC_OVERLAP;
2180
4166c199
BZ
2181 if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) {
2182 printk(KERN_INFO "ide-tape: %s: disabling DSC overlap\n",
2183 tape->name);
97100fc8 2184 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
1da177e4 2185 }
97100fc8 2186
1da177e4 2187 /* Seagate Travan drives do not support DSC overlap. */
4dde4492 2188 if (strstr((char *)&drive->id[ATA_ID_PROD], "Seagate STT3401"))
97100fc8
BZ
2189 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
2190
1da177e4
LT
2191 tape->minor = minor;
2192 tape->name[0] = 'h';
2193 tape->name[1] = 't';
2194 tape->name[2] = '0' + minor;
54abf37e 2195 tape->chrdev_dir = IDETAPE_DIR_NONE;
4dde4492 2196
1da177e4
LT
2197 idetape_get_inquiry_results(drive);
2198 idetape_get_mode_sense_results(drive);
3cffb9ce 2199 ide_tape_get_bsize_from_bdesc(drive);
1da177e4 2200 tape->user_bs_factor = 1;
f73850a3
BP
2201 tape->buffer_size = *ctl * tape->blk_size;
2202 while (tape->buffer_size > 0xffff) {
1da177e4 2203 printk(KERN_NOTICE "ide-tape: decreasing stage size\n");
b6422013 2204 *ctl /= 2;
f73850a3 2205 tape->buffer_size = *ctl * tape->blk_size;
1da177e4 2206 }
f73850a3 2207 buffer_size = tape->buffer_size;
a997a435 2208 tape->pages_per_buffer = buffer_size / PAGE_SIZE;
f73850a3 2209 if (buffer_size % PAGE_SIZE) {
a997a435 2210 tape->pages_per_buffer++;
f73850a3 2211 tape->excess_bh_size = PAGE_SIZE - buffer_size % PAGE_SIZE;
1da177e4
LT
2212 }
2213
83042b24 2214 /* select the "best" DSC read/write polling freq */
b6422013 2215 speed = max(*(u16 *)&tape->caps[14], *(u16 *)&tape->caps[8]);
1da177e4 2216
f73850a3 2217 t = (IDETAPE_FIFO_THRESHOLD * tape->buffer_size * HZ) / (speed * 1000);
1da177e4
LT
2218
2219 /*
3c98bf34
BP
2220 * Ensure that the number we got makes sense; limit it within
2221 * IDETAPE_DSC_RW_MIN and IDETAPE_DSC_RW_MAX.
1da177e4 2222 */
a792bd5a
HH
2223 tape->best_dsc_rw_freq = clamp_t(unsigned long, t, IDETAPE_DSC_RW_MIN,
2224 IDETAPE_DSC_RW_MAX);
1da177e4 2225 printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, "
83042b24 2226 "%lums tDSC%s\n",
b6422013 2227 drive->name, tape->name, *(u16 *)&tape->caps[14],
f73850a3
BP
2228 (*(u16 *)&tape->caps[16] * 512) / tape->buffer_size,
2229 tape->buffer_size / 1024,
54bb2074 2230 tape->best_dsc_rw_freq * 1000 / HZ,
97100fc8 2231 (drive->dev_flags & IDE_DFLAG_USING_DMA) ? ", DMA" : "");
1da177e4 2232
1e874f44 2233 ide_proc_register_driver(drive, tape->driver);
1da177e4
LT
2234}
2235
4031bbe4 2236static void ide_tape_remove(ide_drive_t *drive)
1da177e4
LT
2237{
2238 idetape_tape_t *tape = drive->driver_data;
1da177e4 2239
7662d046 2240 ide_proc_unregister_driver(drive, tape->driver);
8fed4368 2241 device_del(&tape->dev);
1da177e4
LT
2242 ide_unregister_region(tape->disk);
2243
8fed4368
BZ
2244 mutex_lock(&idetape_ref_mutex);
2245 put_device(&tape->dev);
2246 mutex_unlock(&idetape_ref_mutex);
1da177e4
LT
2247}
2248
8fed4368 2249static void ide_tape_release(struct device *dev)
1da177e4 2250{
8fed4368 2251 struct ide_tape_obj *tape = to_ide_drv(dev, ide_tape_obj);
1da177e4
LT
2252 ide_drive_t *drive = tape->drive;
2253 struct gendisk *g = tape->disk;
2254
01a63aeb 2255 BUG_ON(tape->merge_bh_size);
8604affd 2256
97100fc8 2257 drive->dev_flags &= ~IDE_DFLAG_DSC_OVERLAP;
1da177e4 2258 drive->driver_data = NULL;
dbc1272e 2259 device_destroy(idetape_sysfs_class, MKDEV(IDETAPE_MAJOR, tape->minor));
5a04cfa9
BP
2260 device_destroy(idetape_sysfs_class,
2261 MKDEV(IDETAPE_MAJOR, tape->minor + 128));
1da177e4
LT
2262 idetape_devs[tape->minor] = NULL;
2263 g->private_data = NULL;
2264 put_disk(g);
2265 kfree(tape);
2266}
2267
ecfd80e4 2268#ifdef CONFIG_IDE_PROC_FS
1da177e4
LT
2269static int proc_idetape_read_name
2270 (char *page, char **start, off_t off, int count, int *eof, void *data)
2271{
2272 ide_drive_t *drive = (ide_drive_t *) data;
2273 idetape_tape_t *tape = drive->driver_data;
2274 char *out = page;
2275 int len;
2276
2277 len = sprintf(out, "%s\n", tape->name);
2278 PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
2279}
2280
2281static ide_proc_entry_t idetape_proc[] = {
2282 { "capacity", S_IFREG|S_IRUGO, proc_ide_read_capacity, NULL },
2283 { "name", S_IFREG|S_IRUGO, proc_idetape_read_name, NULL },
2284 { NULL, 0, NULL, NULL }
2285};
79cb3803
BZ
2286
2287static ide_proc_entry_t *ide_tape_proc_entries(ide_drive_t *drive)
2288{
2289 return idetape_proc;
2290}
2291
2292static const struct ide_proc_devset *ide_tape_proc_devsets(ide_drive_t *drive)
2293{
2294 return idetape_settings;
2295}
1da177e4
LT
2296#endif
2297
4031bbe4 2298static int ide_tape_probe(ide_drive_t *);
1da177e4 2299
7f3c868b 2300static struct ide_driver idetape_driver = {
8604affd 2301 .gen_driver = {
4ef3b8f4 2302 .owner = THIS_MODULE,
8604affd
BZ
2303 .name = "ide-tape",
2304 .bus = &ide_bus_type,
8604affd 2305 },
4031bbe4
RK
2306 .probe = ide_tape_probe,
2307 .remove = ide_tape_remove,
1da177e4 2308 .version = IDETAPE_VERSION,
1da177e4
LT
2309 .do_request = idetape_do_request,
2310 .end_request = idetape_end_request,
7662d046 2311#ifdef CONFIG_IDE_PROC_FS
79cb3803
BZ
2312 .proc_entries = ide_tape_proc_entries,
2313 .proc_devsets = ide_tape_proc_devsets,
7662d046 2314#endif
1da177e4
LT
2315};
2316
3c98bf34 2317/* Our character device supporting functions, passed to register_chrdev. */
2b8693c0 2318static const struct file_operations idetape_fops = {
1da177e4
LT
2319 .owner = THIS_MODULE,
2320 .read = idetape_chrdev_read,
2321 .write = idetape_chrdev_write,
2322 .ioctl = idetape_chrdev_ioctl,
2323 .open = idetape_chrdev_open,
2324 .release = idetape_chrdev_release,
2325};
2326
a4600f81 2327static int idetape_open(struct block_device *bdev, fmode_t mode)
1da177e4 2328{
a4600f81 2329 struct ide_tape_obj *tape = ide_tape_get(bdev->bd_disk);
1da177e4 2330
5a04cfa9 2331 if (!tape)
1da177e4
LT
2332 return -ENXIO;
2333
1da177e4
LT
2334 return 0;
2335}
2336
a4600f81 2337static int idetape_release(struct gendisk *disk, fmode_t mode)
1da177e4 2338{
5aeddf90 2339 struct ide_tape_obj *tape = ide_drv_g(disk, ide_tape_obj);
1da177e4
LT
2340
2341 ide_tape_put(tape);
1da177e4
LT
2342 return 0;
2343}
2344
a4600f81 2345static int idetape_ioctl(struct block_device *bdev, fmode_t mode,
1da177e4
LT
2346 unsigned int cmd, unsigned long arg)
2347{
5aeddf90 2348 struct ide_tape_obj *tape = ide_drv_g(bdev->bd_disk, ide_tape_obj);
1da177e4 2349 ide_drive_t *drive = tape->drive;
1bddd9e6 2350 int err = generic_ide_ioctl(drive, bdev, cmd, arg);
1da177e4
LT
2351 if (err == -EINVAL)
2352 err = idetape_blkdev_ioctl(drive, cmd, arg);
2353 return err;
2354}
2355
2356static struct block_device_operations idetape_block_ops = {
2357 .owner = THIS_MODULE,
a4600f81
AV
2358 .open = idetape_open,
2359 .release = idetape_release,
2360 .locked_ioctl = idetape_ioctl,
1da177e4
LT
2361};
2362
4031bbe4 2363static int ide_tape_probe(ide_drive_t *drive)
1da177e4
LT
2364{
2365 idetape_tape_t *tape;
2366 struct gendisk *g;
2367 int minor;
2368
2369 if (!strstr("ide-tape", drive->driver_req))
2370 goto failed;
2a924662 2371
1da177e4
LT
2372 if (drive->media != ide_tape)
2373 goto failed;
2a924662 2374
97100fc8
BZ
2375 if ((drive->dev_flags & IDE_DFLAG_ID_READ) &&
2376 ide_check_atapi_device(drive, DRV_NAME) == 0) {
5a04cfa9
BP
2377 printk(KERN_ERR "ide-tape: %s: not supported by this version of"
2378 " the driver\n", drive->name);
1da177e4
LT
2379 goto failed;
2380 }
5a04cfa9 2381 tape = kzalloc(sizeof(idetape_tape_t), GFP_KERNEL);
1da177e4 2382 if (tape == NULL) {
5a04cfa9
BP
2383 printk(KERN_ERR "ide-tape: %s: Can't allocate a tape struct\n",
2384 drive->name);
1da177e4
LT
2385 goto failed;
2386 }
2387
2388 g = alloc_disk(1 << PARTN_BITS);
2389 if (!g)
2390 goto out_free_tape;
2391
2392 ide_init_disk(g, drive);
2393
8fed4368
BZ
2394 tape->dev.parent = &drive->gendev;
2395 tape->dev.release = ide_tape_release;
2396 dev_set_name(&tape->dev, dev_name(&drive->gendev));
2397
2398 if (device_register(&tape->dev))
2399 goto out_free_disk;
1da177e4
LT
2400
2401 tape->drive = drive;
2402 tape->driver = &idetape_driver;
2403 tape->disk = g;
2404
2405 g->private_data = &tape->driver;
2406
2407 drive->driver_data = tape;
2408
cf8b8975 2409 mutex_lock(&idetape_ref_mutex);
1da177e4
LT
2410 for (minor = 0; idetape_devs[minor]; minor++)
2411 ;
2412 idetape_devs[minor] = tape;
cf8b8975 2413 mutex_unlock(&idetape_ref_mutex);
1da177e4
LT
2414
2415 idetape_setup(drive, tape, minor);
2416
3ee074bf
GKH
2417 device_create(idetape_sysfs_class, &drive->gendev,
2418 MKDEV(IDETAPE_MAJOR, minor), NULL, "%s", tape->name);
2419 device_create(idetape_sysfs_class, &drive->gendev,
2420 MKDEV(IDETAPE_MAJOR, minor + 128), NULL,
2421 "n%s", tape->name);
d5dee80a 2422
1da177e4
LT
2423 g->fops = &idetape_block_ops;
2424 ide_register_region(g);
2425
2426 return 0;
8604affd 2427
8fed4368
BZ
2428out_free_disk:
2429 put_disk(g);
1da177e4
LT
2430out_free_tape:
2431 kfree(tape);
2432failed:
8604affd 2433 return -ENODEV;
1da177e4
LT
2434}
2435
5a04cfa9 2436static void __exit idetape_exit(void)
1da177e4 2437{
8604affd 2438 driver_unregister(&idetape_driver.gen_driver);
d5dee80a 2439 class_destroy(idetape_sysfs_class);
1da177e4
LT
2440 unregister_chrdev(IDETAPE_MAJOR, "ht");
2441}
2442
17514e8a 2443static int __init idetape_init(void)
1da177e4 2444{
d5dee80a
WD
2445 int error = 1;
2446 idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape");
2447 if (IS_ERR(idetape_sysfs_class)) {
2448 idetape_sysfs_class = NULL;
2449 printk(KERN_ERR "Unable to create sysfs class for ide tapes\n");
2450 error = -EBUSY;
2451 goto out;
2452 }
2453
1da177e4 2454 if (register_chrdev(IDETAPE_MAJOR, "ht", &idetape_fops)) {
5a04cfa9
BP
2455 printk(KERN_ERR "ide-tape: Failed to register chrdev"
2456 " interface\n");
d5dee80a
WD
2457 error = -EBUSY;
2458 goto out_free_class;
1da177e4 2459 }
d5dee80a
WD
2460
2461 error = driver_register(&idetape_driver.gen_driver);
2462 if (error)
2463 goto out_free_driver;
2464
2465 return 0;
2466
2467out_free_driver:
2468 driver_unregister(&idetape_driver.gen_driver);
2469out_free_class:
2470 class_destroy(idetape_sysfs_class);
2471out:
2472 return error;
1da177e4
LT
2473}
2474
263756ec 2475MODULE_ALIAS("ide:*m-tape*");
1da177e4
LT
2476module_init(idetape_init);
2477module_exit(idetape_exit);
2478MODULE_ALIAS_CHARDEV_MAJOR(IDETAPE_MAJOR);
9c145768
BP
2479MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
2480MODULE_LICENSE("GPL");