ide-tape.c 70.6 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3
 * IDE ATAPI streaming tape driver.
 *
4 5
 * Copyright (C) 1995-1999  Gadi Oxman <gadio@netvision.net.il>
 * Copyright (C) 2003-2005  Bartlomiej Zolnierkiewicz
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13
 *
 * This driver was constructed as a student project in the software laboratory
 * of the faculty of electrical engineering in the Technion - Israel's
 * Institute Of Technology, with the guide of Avner Lottem and Dr. Ilana David.
 *
 * It is hereby placed under the terms of the GNU general public license.
 * (See linux/COPYING).
 *
14 15
 * For a historical changelog see
 * Documentation/ide/ChangeLog.ide-tape.1995-2002
L
Linus Torvalds 已提交
16 17
 */

18 19
#define DRV_NAME "ide-tape"

20
#define IDETAPE_VERSION "1.20"
L
Linus Torvalds 已提交
21 22 23 24 25 26 27 28 29

#include <linux/module.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
30
#include <linux/jiffies.h>
L
Linus Torvalds 已提交
31 32 33 34 35 36 37 38 39
#include <linux/major.h>
#include <linux/errno.h>
#include <linux/genhd.h>
#include <linux/slab.h>
#include <linux/pci.h>
#include <linux/ide.h>
#include <linux/smp_lock.h>
#include <linux/completion.h>
#include <linux/bitops.h>
40
#include <linux/mutex.h>
41
#include <scsi/scsi.h>
L
Linus Torvalds 已提交
42 43

#include <asm/byteorder.h>
44 45 46
#include <linux/irq.h>
#include <linux/uaccess.h>
#include <linux/io.h>
L
Linus Torvalds 已提交
47 48 49
#include <asm/unaligned.h>
#include <linux/mtio.h>

50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
enum {
	/* output errors only */
	DBG_ERR =		(1 << 0),
	/* output all sense key/asc */
	DBG_SENSE =		(1 << 1),
	/* info regarding all chrdev-related procedures */
	DBG_CHRDEV =		(1 << 2),
	/* all remaining procedures */
	DBG_PROCS =		(1 << 3),
};

/* define to see debug info */
#define IDETAPE_DEBUG_LOG		0

#if IDETAPE_DEBUG_LOG
#define debug_log(lvl, fmt, args...)			\
{							\
	if (tape->debug_mask & lvl)			\
	printk(KERN_INFO "ide-tape: " fmt, ## args);	\
}
#else
#define debug_log(lvl, fmt, args...) do {} while (0)
#endif

L
Linus Torvalds 已提交
74 75
/**************************** Tunable parameters *****************************/
/*
76 77
 * After each failed packet command we issue a request sense command and retry
 * the packet command IDETAPE_MAX_PC_RETRIES times.
L
Linus Torvalds 已提交
78
 *
79
 * Setting IDETAPE_MAX_PC_RETRIES to 0 will disable retries.
L
Linus Torvalds 已提交
80 81 82 83 84 85 86 87 88 89 90
 */
#define IDETAPE_MAX_PC_RETRIES		3

/*
 * Some drives (for example, Seagate STT3401A Travan) require a very long
 * timeout, because they don't return an interrupt or clear their busy bit
 * until after the command completes (even retension commands).
 */
#define IDETAPE_WAIT_CMD		(900*HZ)

/*
91 92 93 94
 * The following parameter is used to select the point in the internal tape fifo
 * in which we will start to refill the buffer. Decreasing the following
 * parameter will improve the system's latency and interactive response, while
 * using a high value might improve system throughput.
L
Linus Torvalds 已提交
95
 */
96
#define IDETAPE_FIFO_THRESHOLD		2
L
Linus Torvalds 已提交
97 98

/*
99
 * DSC polling parameters.
L
Linus Torvalds 已提交
100
 *
101 102
 * Polling for DSC (a single bit in the status register) is a very important
 * function in ide-tape. There are two cases in which we poll for DSC:
L
Linus Torvalds 已提交
103
 *
104 105 106 107 108
 * 1. Before a read/write packet command, to ensure that we can transfer data
 * from/to the tape's data buffers, without causing an actual media access.
 * In case the tape is not ready yet, we take out our request from the device
 * request queue, so that ide.c could service requests from the other device
 * on the same interface in the meantime.
L
Linus Torvalds 已提交
109
 *
110 111 112 113 114 115 116 117
 * 2. After the successful initialization of a "media access packet command",
 * which is a command that can take a long time to complete (the interval can
 * range from several seconds to even an hour). Again, we postpone our request
 * in the middle to free the bus for the other device. The polling frequency
 * here should be lower than the read/write frequency since those media access
 * commands are slow. We start from a "fast" frequency - IDETAPE_DSC_MA_FAST
 * (1 second), and if we don't receive DSC after IDETAPE_DSC_MA_THRESHOLD
 * (5 min), we switch it to a lower frequency - IDETAPE_DSC_MA_SLOW (1 min).
L
Linus Torvalds 已提交
118
 *
119 120
 * We also set a timeout for the timer, in case something goes wrong. The
 * timeout should be longer then the maximum execution time of a tape operation.
L
Linus Torvalds 已提交
121
 */
122 123

/* DSC timings. */
L
Linus Torvalds 已提交
124 125 126 127 128 129 130 131 132 133
#define IDETAPE_DSC_RW_MIN		5*HZ/100	/* 50 msec */
#define IDETAPE_DSC_RW_MAX		40*HZ/100	/* 400 msec */
#define IDETAPE_DSC_RW_TIMEOUT		2*60*HZ		/* 2 minutes */
#define IDETAPE_DSC_MA_FAST		2*HZ		/* 2 seconds */
#define IDETAPE_DSC_MA_THRESHOLD	5*60*HZ		/* 5 minutes */
#define IDETAPE_DSC_MA_SLOW		30*HZ		/* 30 seconds */
#define IDETAPE_DSC_MA_TIMEOUT		2*60*60*HZ	/* 2 hours */

/*************************** End of tunable parameters ***********************/

134 135 136 137 138 139
/* tape directions */
enum {
	IDETAPE_DIR_NONE  = (1 << 0),
	IDETAPE_DIR_READ  = (1 << 1),
	IDETAPE_DIR_WRITE = (1 << 2),
};
L
Linus Torvalds 已提交
140 141

struct idetape_bh {
142
	u32 b_size;
L
Linus Torvalds 已提交
143 144 145 146 147
	atomic_t b_count;
	struct idetape_bh *b_reqnext;
	char *b_data;
};

148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
/* Tape door status */
#define DOOR_UNLOCKED			0
#define DOOR_LOCKED			1
#define DOOR_EXPLICITLY_LOCKED		2

/* Some defines for the SPACE command */
#define IDETAPE_SPACE_OVER_FILEMARK	1
#define IDETAPE_SPACE_TO_EOD		3

/* Some defines for the LOAD UNLOAD command */
#define IDETAPE_LU_LOAD_MASK		1
#define IDETAPE_LU_RETENSION_MASK	2
#define IDETAPE_LU_EOT_MASK		4

/*
 * Special requests for our block device strategy routine.
 *
 * In order to service a character device command, we add special requests to
 * the tail of our block device request queue and wait for their completion.
 */

enum {
	REQ_IDETAPE_PC1		= (1 << 0), /* packet command (first stage) */
	REQ_IDETAPE_PC2		= (1 << 1), /* packet command (second stage) */
	REQ_IDETAPE_READ	= (1 << 2),
	REQ_IDETAPE_WRITE	= (1 << 3),
};

/* Error codes returned in rq->errors to the higher part of the driver. */
#define IDETAPE_ERROR_GENERAL		101
#define IDETAPE_ERROR_FILEMARK		102
#define IDETAPE_ERROR_EOD		103

/* Structures related to the SELECT SENSE / MODE SENSE packet commands. */
#define IDETAPE_BLOCK_DESCRIPTOR	0
#define IDETAPE_CAPABILITIES_PAGE	0x2a

L
Linus Torvalds 已提交
185
/*
186 187
 * Most of our global data which we need to save even as we leave the driver due
 * to an interrupt or a timer event is stored in the struct defined below.
L
Linus Torvalds 已提交
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203
 */
typedef struct ide_tape_obj {
	ide_drive_t	*drive;
	ide_driver_t	*driver;
	struct gendisk	*disk;
	struct kref	kref;

	/*
	 *	pc points to the current processed packet command.
	 *
	 *	failed_pc points to the last failed packet command, or contains
	 *	NULL if we do not need to retry any packet command. This is
	 *	required since an additional packet command is needed before the
	 *	retry, to get detailed information on what went wrong.
	 */
	/* Current packet command */
204
	struct ide_atapi_pc *pc;
L
Linus Torvalds 已提交
205
	/* Last failed packet command */
206
	struct ide_atapi_pc *failed_pc;
207 208
	/* used by REQ_IDETAPE_{READ,WRITE} requests */
	struct ide_atapi_pc queued_pc;
209

210
	struct ide_atapi_pc request_sense_pc;
211
	struct request request_sense_rq;
L
Linus Torvalds 已提交
212 213

	/*
214
	 * DSC polling variables.
L
Linus Torvalds 已提交
215
	 *
216 217 218
	 * While polling for DSC we use postponed_rq to postpone the current
	 * request so that ide.c will be able to service pending requests on the
	 * other device. Note that at most we will have only one DSC (usually
219
	 * data transfer) request in the device request queue.
L
Linus Torvalds 已提交
220 221 222 223 224 225 226
	 */
	struct request *postponed_rq;
	/* The time in which we started polling for DSC */
	unsigned long dsc_polling_start;
	/* Timer used to poll for dsc */
	struct timer_list dsc_timer;
	/* Read/Write dsc polling frequency */
227 228
	unsigned long best_dsc_rw_freq;
	unsigned long dsc_poll_freq;
L
Linus Torvalds 已提交
229 230
	unsigned long dsc_timeout;

231
	/* Read position information */
L
Linus Torvalds 已提交
232 233
	u8 partition;
	/* Current block */
234
	unsigned int first_frame;
L
Linus Torvalds 已提交
235

236
	/* Last error information */
L
Linus Torvalds 已提交
237 238
	u8 sense_key, asc, ascq;

239
	/* Character device operation */
L
Linus Torvalds 已提交
240 241 242 243
	unsigned int minor;
	/* device name */
	char name[4];
	/* Current character device data transfer direction */
244
	u8 chrdev_dir;
L
Linus Torvalds 已提交
245

246 247
	/* tape block size, usually 512 or 1024 bytes */
	unsigned short blk_size;
L
Linus Torvalds 已提交
248
	int user_bs_factor;
249

L
Linus Torvalds 已提交
250
	/* Copy of the tape's Capabilities and Mechanical Page */
251
	u8 caps[20];
L
Linus Torvalds 已提交
252 253

	/*
254
	 * Active data transfer request parameters.
L
Linus Torvalds 已提交
255
	 *
256 257 258
	 * At most, there is only one ide-tape originated data transfer request
	 * in the device request queue. This allows ide.c to easily service
	 * requests from the other device when we postpone our active request.
L
Linus Torvalds 已提交
259
	 */
260

261
	/* Data buffer size chosen based on the tape's recommendation */
262
	int buffer_size;
263 264
	/* merge buffer */
	struct idetape_bh *merge_bh;
265 266
	/* size of the merge buffer */
	int merge_bh_size;
267
	/* pointer to current buffer head within the merge buffer */
L
Linus Torvalds 已提交
268 269 270
	struct idetape_bh *bh;
	char *b_data;
	int b_count;
271

272
	int pages_per_buffer;
L
Linus Torvalds 已提交
273 274 275 276
	/* Wasted space in each stage */
	int excess_bh_size;

	/* protects the ide-tape queue */
277
	spinlock_t lock;
L
Linus Torvalds 已提交
278

279
	/* Measures average tape speed */
L
Linus Torvalds 已提交
280 281 282 283 284 285 286 287 288 289 290
	unsigned long avg_time;
	int avg_size;
	int avg_speed;

	/* the door is currently locked */
	int door_locked;
	/* the tape hardware is write protected */
	char drv_write_prot;
	/* the tape is write protected (hardware or opened as read-only) */
	char write_prot;

291
	u32 debug_mask;
L
Linus Torvalds 已提交
292 293
} idetape_tape_t;

294
static DEFINE_MUTEX(idetape_ref_mutex);
L
Linus Torvalds 已提交
295

296 297
static struct class *idetape_sysfs_class;

L
Linus Torvalds 已提交
298 299 300 301 302
#define to_ide_tape(obj) container_of(obj, struct ide_tape_obj, kref)

#define ide_tape_g(disk) \
	container_of((disk)->private_data, struct ide_tape_obj, driver)

303 304
static void ide_tape_release(struct kref *);

L
Linus Torvalds 已提交
305 306 307 308
static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
{
	struct ide_tape_obj *tape = NULL;

309
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
310
	tape = ide_tape_g(disk);
311
	if (tape) {
312
		if (ide_device_get(tape->drive))
313
			tape = NULL;
314 315
		else
			kref_get(&tape->kref);
316
	}
317
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
318 319 320 321 322
	return tape;
}

static void ide_tape_put(struct ide_tape_obj *tape)
{
323 324
	ide_drive_t *drive = tape->drive;

325
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
326
	kref_put(&tape->kref, ide_tape_release);
327
	ide_device_put(drive);
328
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
329 330 331
}

/*
332 333
 * The variables below are used for the character device interface. Additional
 * state variables are defined in our ide_drive_t structure.
L
Linus Torvalds 已提交
334
 */
335
static struct ide_tape_obj *idetape_devs[MAX_HWIFS * MAX_DRIVES];
L
Linus Torvalds 已提交
336 337 338 339 340 341 342

#define ide_tape_f(file) ((file)->private_data)

static struct ide_tape_obj *ide_tape_chrdev_get(unsigned int i)
{
	struct ide_tape_obj *tape = NULL;

343
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
344 345 346
	tape = idetape_devs[i];
	if (tape)
		kref_get(&tape->kref);
347
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
348 349 350
	return tape;
}

351
static void idetape_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
352
				  unsigned int bcount)
L
Linus Torvalds 已提交
353 354 355 356 357 358 359 360
{
	struct idetape_bh *bh = pc->bh;
	int count;

	while (bcount) {
		if (bh == NULL) {
			printk(KERN_ERR "ide-tape: bh == NULL in "
				"idetape_input_buffers\n");
361
			ide_pad_transfer(drive, 0, bcount);
L
Linus Torvalds 已提交
362 363
			return;
		}
364 365 366
		count = min(
			(unsigned int)(bh->b_size - atomic_read(&bh->b_count)),
			bcount);
367
		drive->hwif->tp_ops->input_data(drive, NULL, bh->b_data +
368
					atomic_read(&bh->b_count), count);
L
Linus Torvalds 已提交
369 370 371 372 373 374 375 376 377 378 379
		bcount -= count;
		atomic_add(count, &bh->b_count);
		if (atomic_read(&bh->b_count) == bh->b_size) {
			bh = bh->b_reqnext;
			if (bh)
				atomic_set(&bh->b_count, 0);
		}
	}
	pc->bh = bh;
}

380
static void idetape_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
381
				   unsigned int bcount)
L
Linus Torvalds 已提交
382 383 384 385 386 387
{
	struct idetape_bh *bh = pc->bh;
	int count;

	while (bcount) {
		if (bh == NULL) {
388 389
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
L
Linus Torvalds 已提交
390 391 392
			return;
		}
		count = min((unsigned int)pc->b_count, (unsigned int)bcount);
393
		drive->hwif->tp_ops->output_data(drive, NULL, pc->b_data, count);
L
Linus Torvalds 已提交
394 395 396 397
		bcount -= count;
		pc->b_data += count;
		pc->b_count -= count;
		if (!pc->b_count) {
398 399
			bh = bh->b_reqnext;
			pc->bh = bh;
L
Linus Torvalds 已提交
400 401 402 403 404 405 406 407
			if (bh) {
				pc->b_data = bh->b_data;
				pc->b_count = atomic_read(&bh->b_count);
			}
		}
	}
}

408
static void idetape_update_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
409 410 411
{
	struct idetape_bh *bh = pc->bh;
	int count;
412
	unsigned int bcount = pc->xferred;
L
Linus Torvalds 已提交
413

414
	if (pc->flags & PC_FLAG_WRITING)
L
Linus Torvalds 已提交
415 416 417
		return;
	while (bcount) {
		if (bh == NULL) {
418 419
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
L
Linus Torvalds 已提交
420 421 422 423 424 425 426 427 428 429 430 431
			return;
		}
		count = min((unsigned int)bh->b_size, (unsigned int)bcount);
		atomic_set(&bh->b_count, count);
		if (atomic_read(&bh->b_count) == bh->b_size)
			bh = bh->b_reqnext;
		bcount -= count;
	}
	pc->bh = bh;
}

/*
432 433
 * called on each failed packet command retry to analyze the request sense. We
 * currently do not utilize this information.
L
Linus Torvalds 已提交
434
 */
435
static void idetape_analyze_error(ide_drive_t *drive, u8 *sense)
L
Linus Torvalds 已提交
436 437
{
	idetape_tape_t *tape = drive->driver_data;
438
	struct ide_atapi_pc *pc = tape->failed_pc;
L
Linus Torvalds 已提交
439

440 441 442
	tape->sense_key = sense[2] & 0xF;
	tape->asc       = sense[12];
	tape->ascq      = sense[13];
443 444 445

	debug_log(DBG_ERR, "pc = %x, sense key = %x, asc = %x, ascq = %x\n",
		 pc->c[0], tape->sense_key, tape->asc, tape->ascq);
L
Linus Torvalds 已提交
446

447
	/* Correct pc->xferred by asking the tape.	 */
448
	if (pc->flags & PC_FLAG_DMA_ERROR) {
449
		pc->xferred = pc->req_xfer -
450
			tape->blk_size *
451
			get_unaligned_be32(&sense[3]);
452
		idetape_update_buffers(drive, pc);
L
Linus Torvalds 已提交
453 454 455 456 457 458 459
	}

	/*
	 * If error was the result of a zero-length read or write command,
	 * with sense key=5, asc=0x22, ascq=0, let it slide.  Some drives
	 * (i.e. Seagate STT3401A Travan) don't support 0-length read/writes.
	 */
460
	if ((pc->c[0] == READ_6 || pc->c[0] == WRITE_6)
461 462 463
	    /* length == 0 */
	    && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) {
		if (tape->sense_key == 5) {
L
Linus Torvalds 已提交
464 465 466
			/* don't report an error, everything's ok */
			pc->error = 0;
			/* don't retry read/write */
467
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
468 469
		}
	}
470
	if (pc->c[0] == READ_6 && (sense[2] & 0x80)) {
L
Linus Torvalds 已提交
471
		pc->error = IDETAPE_ERROR_FILEMARK;
472
		pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
473
	}
474
	if (pc->c[0] == WRITE_6) {
475 476
		if ((sense[2] & 0x40) || (tape->sense_key == 0xd
		     && tape->asc == 0x0 && tape->ascq == 0x2)) {
L
Linus Torvalds 已提交
477
			pc->error = IDETAPE_ERROR_EOD;
478
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
479 480
		}
	}
481
	if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
482
		if (tape->sense_key == 8) {
L
Linus Torvalds 已提交
483
			pc->error = IDETAPE_ERROR_EOD;
484
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
485
		}
486
		if (!(pc->flags & PC_FLAG_ABORT) &&
487
		    pc->xferred)
L
Linus Torvalds 已提交
488 489 490 491
			pc->retries = IDETAPE_MAX_PC_RETRIES + 1;
	}
}

492
/* Free data buffers completely. */
493
static void ide_tape_kfree_buffer(idetape_tape_t *tape)
L
Linus Torvalds 已提交
494
{
495
	struct idetape_bh *prev_bh, *bh = tape->merge_bh;
496 497 498 499 500 501 502 503 504 505 506 507

	while (bh) {
		u32 size = bh->b_size;

		while (size) {
			unsigned int order = fls(size >> PAGE_SHIFT)-1;

			if (bh->b_data)
				free_pages((unsigned long)bh->b_data, order);

			size &= (order-1);
			bh->b_data += (1 << order) * PAGE_SIZE;
L
Linus Torvalds 已提交
508 509 510 511 512 513 514 515 516 517 518 519 520 521
		}
		prev_bh = bh;
		bh = bh->b_reqnext;
		kfree(prev_bh);
	}
}

static int idetape_end_request(ide_drive_t *drive, int uptodate, int nr_sects)
{
	struct request *rq = HWGROUP(drive)->rq;
	idetape_tape_t *tape = drive->driver_data;
	unsigned long flags;
	int error;

522
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
523 524

	switch (uptodate) {
525 526 527
	case 0:	error = IDETAPE_ERROR_GENERAL; break;
	case 1: error = 0; break;
	default: error = uptodate;
L
Linus Torvalds 已提交
528 529 530 531 532
	}
	rq->errors = error;
	if (error)
		tape->failed_pc = NULL;

533 534 535 536 537
	if (!blk_special_request(rq)) {
		ide_end_request(drive, uptodate, nr_sects);
		return 0;
	}

538
	spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
539 540 541

	ide_end_drive_cmd(drive, 0, 0);

542
	spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
543 544 545
	return 0;
}

546
static void ide_tape_callback(ide_drive_t *drive)
L
Linus Torvalds 已提交
547 548
{
	idetape_tape_t *tape = drive->driver_data;
549 550
	struct ide_atapi_pc *pc = tape->pc;
	int uptodate = pc->error ? 0 : 1;
L
Linus Torvalds 已提交
551

552 553
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

554 555 556
	if (tape->failed_pc == pc)
		tape->failed_pc = NULL;

557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
	if (pc->c[0] == REQUEST_SENSE) {
		if (uptodate)
			idetape_analyze_error(drive, pc->buf);
		else
			printk(KERN_ERR "ide-tape: Error in REQUEST SENSE "
					"itself - Aborting request!\n");
	} else if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
		struct request *rq = drive->hwif->hwgroup->rq;
		int blocks = pc->xferred / tape->blk_size;

		tape->avg_size += blocks * tape->blk_size;

		if (time_after_eq(jiffies, tape->avg_time + HZ)) {
			tape->avg_speed = tape->avg_size * HZ /
				(jiffies - tape->avg_time) / 1024;
			tape->avg_size = 0;
			tape->avg_time = jiffies;
		}

		tape->first_frame += blocks;
		rq->current_nr_sectors -= blocks;

		if (pc->error)
			uptodate = pc->error;
	} else if (pc->c[0] == READ_POSITION && uptodate) {
		u8 *readpos = tape->pc->buf;

		debug_log(DBG_SENSE, "BOP - %s\n",
				(readpos[0] & 0x80) ? "Yes" : "No");
		debug_log(DBG_SENSE, "EOP - %s\n",
				(readpos[0] & 0x40) ? "Yes" : "No");

		if (readpos[0] & 0x4) {
			printk(KERN_INFO "ide-tape: Block location is unknown"
					 "to the tape\n");
592
			clear_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
593 594 595
			uptodate = 0;
		} else {
			debug_log(DBG_SENSE, "Block Location - %u\n",
596
					be32_to_cpup((__be32 *)&readpos[4]));
597 598

			tape->partition = readpos[1];
599
			tape->first_frame = be32_to_cpup((__be32 *)&readpos[4]);
600
			set_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
601
		}
L
Linus Torvalds 已提交
602
	}
603 604

	idetape_end_request(drive, uptodate, 0);
L
Linus Torvalds 已提交
605 606
}

607
static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
608
{
609
	ide_init_pc(pc);
610
	pc->c[0] = REQUEST_SENSE;
L
Linus Torvalds 已提交
611
	pc->c[4] = 20;
612
	pc->req_xfer = 20;
L
Linus Torvalds 已提交
613 614 615
}

/*
616 617
 * Generate a new packet command request in front of the request queue, before
 * the current request, so that it will be processed immediately, on the next
618
 * pass through the driver.
L
Linus Torvalds 已提交
619
 */
620
static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc,
621
				  struct request *rq)
L
Linus Torvalds 已提交
622 623 624
{
	struct ide_tape_obj *tape = drive->driver_data;

625 626
	blk_rq_init(NULL, rq);
	rq->cmd_type = REQ_TYPE_SPECIAL;
627
	rq->cmd_flags |= REQ_PREEMPT;
L
Linus Torvalds 已提交
628 629
	rq->buffer = (char *) pc;
	rq->rq_disk = tape->disk;
630
	memcpy(rq->cmd, pc->c, 12);
631
	rq->cmd[13] = REQ_IDETAPE_PC1;
632
	ide_do_drive_cmd(drive, rq);
L
Linus Torvalds 已提交
633 634 635 636 637 638 639
}

/*
 *	idetape_retry_pc is called when an error was detected during the
 *	last packet command. We queue a request sense packet command in
 *	the head of the request list.
 */
640
static void idetape_retry_pc(ide_drive_t *drive)
L
Linus Torvalds 已提交
641
{
642 643
	struct ide_tape_obj *tape = drive->driver_data;
	struct request *rq = &tape->request_sense_rq;
644
	struct ide_atapi_pc *pc = &tape->request_sense_pc;
L
Linus Torvalds 已提交
645

646
	(void)ide_read_error(drive);
L
Linus Torvalds 已提交
647
	idetape_create_request_sense_cmd(pc);
648
	set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
L
Linus Torvalds 已提交
649 650 651 652
	idetape_queue_pc_head(drive, pc, rq);
}

/*
653 654
 * Postpone the current request so that ide.c will be able to service requests
 * from another device on the same hwgroup while we are polling for DSC.
L
Linus Torvalds 已提交
655
 */
656
static void idetape_postpone_request(ide_drive_t *drive)
L
Linus Torvalds 已提交
657 658 659
{
	idetape_tape_t *tape = drive->driver_data;

660 661
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
662
	tape->postponed_rq = HWGROUP(drive)->rq;
663
	ide_stall_queue(drive, tape->dsc_poll_freq);
L
Linus Torvalds 已提交
664 665
}

666 667 668 669 670 671 672 673 674 675 676 677
static void ide_tape_handle_dsc(ide_drive_t *drive)
{
	idetape_tape_t *tape = drive->driver_data;

	/* Media access command */
	tape->dsc_polling_start = jiffies;
	tape->dsc_poll_freq = IDETAPE_DSC_MA_FAST;
	tape->dsc_timeout = jiffies + IDETAPE_DSC_MA_TIMEOUT;
	/* Allow ide.c to handle other requests */
	idetape_postpone_request(drive);
}

678
static int ide_tape_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
679 680 681 682 683 684
				unsigned int bcount, int write)
{
	if (write)
		idetape_output_buffers(drive, pc, bcount);
	else
		idetape_input_buffers(drive, pc, bcount);
685 686

	return bcount;
687
}
688

L
Linus Torvalds 已提交
689
/*
690 691 692 693
 * This is the usual interrupt handler which will be called during a packet
 * command. We will transfer some of the data (as requested by the drive) and
 * will re-point interrupt handler to us. When data transfer is finished, we
 * will act according to the algorithm described before
694
 * idetape_issue_pc.
L
Linus Torvalds 已提交
695
 */
696
static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
L
Linus Torvalds 已提交
697 698 699
{
	idetape_tape_t *tape = drive->driver_data;

700 701 702
	return ide_pc_intr(drive, tape->pc, idetape_pc_intr, IDETAPE_WAIT_CMD,
			   NULL, idetape_update_buffers, idetape_retry_pc,
			   ide_tape_handle_dsc, ide_tape_io_buffers);
L
Linus Torvalds 已提交
703 704 705
}

/*
706
 * Packet Command Interface
L
Linus Torvalds 已提交
707
 *
708 709 710
 * The current Packet Command is available in tape->pc, and will not change
 * until we finish handling it. Each packet command is associated with a
 * callback function that will be called when the command is finished.
L
Linus Torvalds 已提交
711
 *
712
 * The handling will be done in three stages:
L
Linus Torvalds 已提交
713
 *
714 715
 * 1. idetape_issue_pc will send the packet command to the drive, and will set
 * the interrupt handler to idetape_pc_intr.
L
Linus Torvalds 已提交
716
 *
717 718
 * 2. On each interrupt, idetape_pc_intr will be called. This step will be
 * repeated until the device signals us that no more interrupts will be issued.
L
Linus Torvalds 已提交
719
 *
720 721 722 723 724 725 726
 * 3. ATAPI Tape media access commands have immediate status with a delayed
 * process. In case of a successful initiation of a media access packet command,
 * the DSC bit will be set when the actual execution of the command is finished.
 * Since the tape drive will not issue an interrupt, we have to poll for this
 * event. In this case, we define the request as "low priority request" by
 * setting rq_status to IDETAPE_RQ_POSTPONED, set a timer to poll for DSC and
 * exit the driver.
L
Linus Torvalds 已提交
727
 *
728 729
 * ide.c will then give higher priority to requests which originate from the
 * other device, until will change rq_status to RQ_ACTIVE.
L
Linus Torvalds 已提交
730
 *
731
 * 4. When the packet command is finished, it will be checked for errors.
L
Linus Torvalds 已提交
732
 *
733 734 735
 * 5. In case an error was found, we queue a request sense packet command in
 * front of the request queue and retry the operation up to
 * IDETAPE_MAX_PC_RETRIES times.
L
Linus Torvalds 已提交
736
 *
737 738 739
 * 6. In case no error was found, or we decided to give up and not to retry
 * again, the callback function will be called and then we will handle the next
 * request.
L
Linus Torvalds 已提交
740 741 742 743
 */
static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive)
{
	idetape_tape_t *tape = drive->driver_data;
744

745 746
	return ide_transfer_pc(drive, tape->pc, idetape_pc_intr,
			       IDETAPE_WAIT_CMD, NULL);
L
Linus Torvalds 已提交
747 748
}

749 750
static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
		struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
751 752 753
{
	idetape_tape_t *tape = drive->driver_data;

754 755
	if (tape->pc->c[0] == REQUEST_SENSE &&
	    pc->c[0] == REQUEST_SENSE) {
L
Linus Torvalds 已提交
756 757 758 759
		printk(KERN_ERR "ide-tape: possible ide-tape.c bug - "
			"Two request sense in serial were issued\n");
	}

760
	if (tape->failed_pc == NULL && pc->c[0] != REQUEST_SENSE)
L
Linus Torvalds 已提交
761 762 763 764 765
		tape->failed_pc = pc;
	/* Set the current packet command */
	tape->pc = pc;

	if (pc->retries > IDETAPE_MAX_PC_RETRIES ||
766
		(pc->flags & PC_FLAG_ABORT)) {
L
Linus Torvalds 已提交
767
		/*
768 769 770
		 * We will "abort" retrying a packet command in case legitimate
		 * error code was received (crossing a filemark, or end of the
		 * media, for example).
L
Linus Torvalds 已提交
771
		 */
772
		if (!(pc->flags & PC_FLAG_ABORT)) {
773
			if (!(pc->c[0] == TEST_UNIT_READY &&
L
Linus Torvalds 已提交
774 775 776 777 778 779 780 781 782 783 784 785 786
			      tape->sense_key == 2 && tape->asc == 4 &&
			     (tape->ascq == 1 || tape->ascq == 8))) {
				printk(KERN_ERR "ide-tape: %s: I/O error, "
						"pc = %2x, key = %2x, "
						"asc = %2x, ascq = %2x\n",
						tape->name, pc->c[0],
						tape->sense_key, tape->asc,
						tape->ascq);
			}
			/* Giving up */
			pc->error = IDETAPE_ERROR_GENERAL;
		}
		tape->failed_pc = NULL;
787
		drive->pc_callback(drive);
788
		return ide_stopped;
L
Linus Torvalds 已提交
789
	}
790
	debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]);
L
Linus Torvalds 已提交
791 792 793

	pc->retries++;

794 795
	return ide_issue_pc(drive, pc, idetape_transfer_pc,
			    IDETAPE_WAIT_CMD, NULL);
L
Linus Torvalds 已提交
796 797
}

798
/* A mode sense command is used to "sense" tape parameters. */
799
static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
L
Linus Torvalds 已提交
800
{
801
	ide_init_pc(pc);
802
	pc->c[0] = MODE_SENSE;
L
Linus Torvalds 已提交
803
	if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
804 805
		/* DBD = 1 - Don't return block descriptors */
		pc->c[1] = 8;
L
Linus Torvalds 已提交
806 807 808 809 810 811 812 813 814
	pc->c[2] = page_code;
	/*
	 * Changed pc->c[3] to 0 (255 will at best return unused info).
	 *
	 * For SCSI this byte is defined as subpage instead of high byte
	 * of length and some IDE drives seem to interpret it this way
	 * and return an error when 255 is used.
	 */
	pc->c[3] = 0;
815 816
	/* We will just discard data in that case */
	pc->c[4] = 255;
L
Linus Torvalds 已提交
817
	if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
818
		pc->req_xfer = 12;
L
Linus Torvalds 已提交
819
	else if (page_code == IDETAPE_CAPABILITIES_PAGE)
820
		pc->req_xfer = 24;
L
Linus Torvalds 已提交
821
	else
822
		pc->req_xfer = 50;
L
Linus Torvalds 已提交
823 824
}

825
static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
L
Linus Torvalds 已提交
826
{
827
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
828
	idetape_tape_t *tape = drive->driver_data;
829
	struct ide_atapi_pc *pc = tape->pc;
830
	u8 stat;
L
Linus Torvalds 已提交
831

832
	stat = hwif->tp_ops->read_status(hwif);
833

834 835
	if (stat & ATA_DSC) {
		if (stat & ATA_ERR) {
L
Linus Torvalds 已提交
836
			/* Error detected */
837
			if (pc->c[0] != TEST_UNIT_READY)
L
Linus Torvalds 已提交
838 839 840
				printk(KERN_ERR "ide-tape: %s: I/O error, ",
						tape->name);
			/* Retry operation */
841 842
			idetape_retry_pc(drive);
			return ide_stopped;
L
Linus Torvalds 已提交
843 844 845 846 847 848
		}
		pc->error = 0;
	} else {
		pc->error = IDETAPE_ERROR_GENERAL;
		tape->failed_pc = NULL;
	}
849
	drive->pc_callback(drive);
L
Linus Torvalds 已提交
850 851 852
	return ide_stopped;
}

853
static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
854 855
				   struct ide_atapi_pc *pc, struct request *rq,
				   u8 opcode)
L
Linus Torvalds 已提交
856
{
857 858 859
	struct idetape_bh *bh = (struct idetape_bh *)rq->special;
	unsigned int length = rq->current_nr_sectors;

860
	ide_init_pc(pc);
861
	put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
L
Linus Torvalds 已提交
862 863
	pc->c[1] = 1;
	pc->bh = bh;
864 865 866
	pc->buf = NULL;
	pc->buf_size = length * tape->blk_size;
	pc->req_xfer = pc->buf_size;
867
	if (pc->req_xfer == tape->buffer_size)
868
		pc->flags |= PC_FLAG_DMA_OK;
L
Linus Torvalds 已提交
869

870 871 872 873 874 875 876 877 878
	if (opcode == READ_6) {
		pc->c[0] = READ_6;
		atomic_set(&bh->b_count, 0);
	} else if (opcode == WRITE_6) {
		pc->c[0] = WRITE_6;
		pc->flags |= PC_FLAG_WRITING;
		pc->b_data = bh->b_data;
		pc->b_count = atomic_read(&bh->b_count);
	}
879 880

	memcpy(rq->cmd, pc->c, 12);
L
Linus Torvalds 已提交
881 882 883 884 885
}

static ide_startstop_t idetape_do_request(ide_drive_t *drive,
					  struct request *rq, sector_t block)
{
886
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
887
	idetape_tape_t *tape = drive->driver_data;
888
	struct ide_atapi_pc *pc = NULL;
L
Linus Torvalds 已提交
889
	struct request *postponed_rq = tape->postponed_rq;
890
	u8 stat;
L
Linus Torvalds 已提交
891

892 893 894 895
	debug_log(DBG_SENSE, "sector: %llu, nr_sectors: %lu,"
			" current_nr_sectors: %u\n",
			(unsigned long long)rq->sector, rq->nr_sectors,
			rq->current_nr_sectors);
L
Linus Torvalds 已提交
896

897
	if (!blk_special_request(rq)) {
898
		/* We do not support buffer cache originated requests. */
L
Linus Torvalds 已提交
899
		printk(KERN_NOTICE "ide-tape: %s: Unsupported request in "
900
			"request queue (%d)\n", drive->name, rq->cmd_type);
L
Linus Torvalds 已提交
901 902 903 904
		ide_end_request(drive, 0, 0);
		return ide_stopped;
	}

905
	/* Retry a failed packet command */
906 907 908 909
	if (tape->failed_pc && tape->pc->c[0] == REQUEST_SENSE) {
		pc = tape->failed_pc;
		goto out;
	}
910

L
Linus Torvalds 已提交
911 912 913 914 915 916 917 918 919 920 921 922 923 924
	if (postponed_rq != NULL)
		if (rq != postponed_rq) {
			printk(KERN_ERR "ide-tape: ide-tape.c bug - "
					"Two DSC requests were queued\n");
			idetape_end_request(drive, 0, 0);
			return ide_stopped;
		}

	tape->postponed_rq = NULL;

	/*
	 * If the tape is still busy, postpone our request and service
	 * the other device meanwhile.
	 */
925
	stat = hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
926

927
	if (!drive->dsc_overlap && !(rq->cmd[13] & REQ_IDETAPE_PC2))
928
		set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
L
Linus Torvalds 已提交
929 930

	if (drive->post_reset == 1) {
931
		set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
L
Linus Torvalds 已提交
932 933 934
		drive->post_reset = 0;
	}

935
	if (!test_and_clear_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags) &&
936
	    (stat & ATA_DSC) == 0) {
L
Linus Torvalds 已提交
937 938
		if (postponed_rq == NULL) {
			tape->dsc_polling_start = jiffies;
939
			tape->dsc_poll_freq = tape->best_dsc_rw_freq;
L
Linus Torvalds 已提交
940 941 942 943
			tape->dsc_timeout = jiffies + IDETAPE_DSC_RW_TIMEOUT;
		} else if (time_after(jiffies, tape->dsc_timeout)) {
			printk(KERN_ERR "ide-tape: %s: DSC timeout\n",
				tape->name);
944
			if (rq->cmd[13] & REQ_IDETAPE_PC2) {
L
Linus Torvalds 已提交
945 946 947 948 949
				idetape_media_access_finished(drive);
				return ide_stopped;
			} else {
				return ide_do_reset(drive);
			}
950 951 952
		} else if (time_after(jiffies,
					tape->dsc_polling_start +
					IDETAPE_DSC_MA_THRESHOLD))
953
			tape->dsc_poll_freq = IDETAPE_DSC_MA_SLOW;
L
Linus Torvalds 已提交
954 955 956
		idetape_postpone_request(drive);
		return ide_stopped;
	}
957
	if (rq->cmd[13] & REQ_IDETAPE_READ) {
958
		pc = &tape->queued_pc;
959
		ide_tape_create_rw_cmd(tape, pc, rq, READ_6);
L
Linus Torvalds 已提交
960 961
		goto out;
	}
962
	if (rq->cmd[13] & REQ_IDETAPE_WRITE) {
963
		pc = &tape->queued_pc;
964
		ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6);
L
Linus Torvalds 已提交
965 966
		goto out;
	}
967
	if (rq->cmd[13] & REQ_IDETAPE_PC1) {
968
		pc = (struct ide_atapi_pc *) rq->buffer;
969 970
		rq->cmd[13] &= ~(REQ_IDETAPE_PC1);
		rq->cmd[13] |= REQ_IDETAPE_PC2;
L
Linus Torvalds 已提交
971 972
		goto out;
	}
973
	if (rq->cmd[13] & REQ_IDETAPE_PC2) {
L
Linus Torvalds 已提交
974 975 976 977
		idetape_media_access_finished(drive);
		return ide_stopped;
	}
	BUG();
978

979
out:
980
	return idetape_issue_pc(drive, pc);
L
Linus Torvalds 已提交
981 982 983
}

/*
984
 * The function below uses __get_free_pages to allocate a data buffer of size
985
 * tape->buffer_size (or a bit more). We attempt to combine sequential pages as
986
 * much as possible.
L
Linus Torvalds 已提交
987
 *
988 989
 * It returns a pointer to the newly allocated buffer, or NULL in case of
 * failure.
L
Linus Torvalds 已提交
990
 */
991 992
static struct idetape_bh *ide_tape_kmalloc_buffer(idetape_tape_t *tape,
						  int full, int clear)
L
Linus Torvalds 已提交
993
{
994
	struct idetape_bh *prev_bh, *bh, *merge_bh;
995
	int pages = tape->pages_per_buffer;
996
	unsigned int order, b_allocd;
L
Linus Torvalds 已提交
997 998
	char *b_data = NULL;

999 1000
	merge_bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
	bh = merge_bh;
L
Linus Torvalds 已提交
1001 1002
	if (bh == NULL)
		goto abort;
1003 1004 1005

	order = fls(pages) - 1;
	bh->b_data = (char *) __get_free_pages(GFP_KERNEL, order);
1006
	if (!bh->b_data)
L
Linus Torvalds 已提交
1007
		goto abort;
1008 1009 1010
	b_allocd = (1 << order) * PAGE_SIZE;
	pages &= (order-1);

L
Linus Torvalds 已提交
1011
	if (clear)
1012 1013 1014
		memset(bh->b_data, 0, b_allocd);
	bh->b_reqnext = NULL;
	bh->b_size = b_allocd;
L
Linus Torvalds 已提交
1015 1016
	atomic_set(&bh->b_count, full ? bh->b_size : 0);

1017 1018 1019
	while (pages) {
		order = fls(pages) - 1;
		b_data = (char *) __get_free_pages(GFP_KERNEL, order);
1020
		if (!b_data)
L
Linus Torvalds 已提交
1021
			goto abort;
1022 1023
		b_allocd = (1 << order) * PAGE_SIZE;

L
Linus Torvalds 已提交
1024
		if (clear)
1025 1026 1027 1028 1029 1030
			memset(b_data, 0, b_allocd);

		/* newly allocated page frames below buffer header or ...*/
		if (bh->b_data == b_data + b_allocd) {
			bh->b_size += b_allocd;
			bh->b_data -= b_allocd;
L
Linus Torvalds 已提交
1031
			if (full)
1032
				atomic_add(b_allocd, &bh->b_count);
L
Linus Torvalds 已提交
1033 1034
			continue;
		}
1035
		/* they are above the header */
L
Linus Torvalds 已提交
1036
		if (b_data == bh->b_data + bh->b_size) {
1037
			bh->b_size += b_allocd;
L
Linus Torvalds 已提交
1038
			if (full)
1039
				atomic_add(b_allocd, &bh->b_count);
L
Linus Torvalds 已提交
1040 1041 1042
			continue;
		}
		prev_bh = bh;
1043 1044
		bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
		if (!bh) {
1045
			free_pages((unsigned long) b_data, order);
L
Linus Torvalds 已提交
1046 1047 1048 1049
			goto abort;
		}
		bh->b_reqnext = NULL;
		bh->b_data = b_data;
1050
		bh->b_size = b_allocd;
L
Linus Torvalds 已提交
1051 1052
		atomic_set(&bh->b_count, full ? bh->b_size : 0);
		prev_bh->b_reqnext = bh;
1053 1054

		pages &= (order-1);
L
Linus Torvalds 已提交
1055
	}
1056

L
Linus Torvalds 已提交
1057 1058 1059
	bh->b_size -= tape->excess_bh_size;
	if (full)
		atomic_sub(tape->excess_bh_size, &bh->b_count);
1060
	return merge_bh;
L
Linus Torvalds 已提交
1061
abort:
1062
	ide_tape_kfree_buffer(tape);
L
Linus Torvalds 已提交
1063 1064 1065
	return NULL;
}

1066
static int idetape_copy_stage_from_user(idetape_tape_t *tape,
1067
					const char __user *buf, int n)
L
Linus Torvalds 已提交
1068 1069 1070
{
	struct idetape_bh *bh = tape->bh;
	int count;
1071
	int ret = 0;
L
Linus Torvalds 已提交
1072 1073 1074

	while (n) {
		if (bh == NULL) {
1075 1076
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
1077
			return 1;
L
Linus Torvalds 已提交
1078
		}
1079 1080 1081 1082 1083
		count = min((unsigned int)
				(bh->b_size - atomic_read(&bh->b_count)),
				(unsigned int)n);
		if (copy_from_user(bh->b_data + atomic_read(&bh->b_count), buf,
				count))
1084
			ret = 1;
L
Linus Torvalds 已提交
1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
		n -= count;
		atomic_add(count, &bh->b_count);
		buf += count;
		if (atomic_read(&bh->b_count) == bh->b_size) {
			bh = bh->b_reqnext;
			if (bh)
				atomic_set(&bh->b_count, 0);
		}
	}
	tape->bh = bh;
1095
	return ret;
L
Linus Torvalds 已提交
1096 1097
}

1098
static int idetape_copy_stage_to_user(idetape_tape_t *tape, char __user *buf,
1099
				      int n)
L
Linus Torvalds 已提交
1100 1101 1102
{
	struct idetape_bh *bh = tape->bh;
	int count;
1103
	int ret = 0;
L
Linus Torvalds 已提交
1104 1105 1106

	while (n) {
		if (bh == NULL) {
1107 1108
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
1109
			return 1;
L
Linus Torvalds 已提交
1110 1111
		}
		count = min(tape->b_count, n);
1112 1113
		if  (copy_to_user(buf, tape->b_data, count))
			ret = 1;
L
Linus Torvalds 已提交
1114 1115 1116 1117 1118
		n -= count;
		tape->b_data += count;
		tape->b_count -= count;
		buf += count;
		if (!tape->b_count) {
1119 1120
			bh = bh->b_reqnext;
			tape->bh = bh;
L
Linus Torvalds 已提交
1121 1122 1123 1124 1125 1126
			if (bh) {
				tape->b_data = bh->b_data;
				tape->b_count = atomic_read(&bh->b_count);
			}
		}
	}
1127
	return ret;
L
Linus Torvalds 已提交
1128 1129
}

1130
static void idetape_init_merge_buffer(idetape_tape_t *tape)
L
Linus Torvalds 已提交
1131
{
1132 1133
	struct idetape_bh *bh = tape->merge_bh;
	tape->bh = tape->merge_bh;
1134

1135
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
L
Linus Torvalds 已提交
1136 1137 1138 1139 1140 1141 1142 1143
		atomic_set(&bh->b_count, 0);
	else {
		tape->b_data = bh->b_data;
		tape->b_count = atomic_read(&bh->b_count);
	}
}

/*
1144 1145
 * Write a filemark if write_filemark=1. Flush the device buffers without
 * writing a filemark otherwise.
L
Linus Torvalds 已提交
1146
 */
1147
static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
1148
		struct ide_atapi_pc *pc, int write_filemark)
L
Linus Torvalds 已提交
1149
{
1150
	ide_init_pc(pc);
1151
	pc->c[0] = WRITE_FILEMARKS;
L
Linus Torvalds 已提交
1152
	pc->c[4] = write_filemark;
1153
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1154 1155
}

1156
static void idetape_create_test_unit_ready_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1157
{
1158
	ide_init_pc(pc);
1159
	pc->c[0] = TEST_UNIT_READY;
L
Linus Torvalds 已提交
1160 1161 1162
}

/*
1163
 * We add a special packet command request to the tail of the request queue, and
1164
 * wait for it to be serviced.
L
Linus Torvalds 已提交
1165
 */
1166
static int idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1167 1168
{
	struct ide_tape_obj *tape = drive->driver_data;
1169 1170
	struct request *rq;
	int error;
L
Linus Torvalds 已提交
1171

1172 1173
	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
	rq->cmd_type = REQ_TYPE_SPECIAL;
1174
	rq->cmd[13] = REQ_IDETAPE_PC1;
1175
	rq->buffer = (char *)pc;
1176
	memcpy(rq->cmd, pc->c, 12);
1177 1178 1179
	error = blk_execute_rq(drive->queue, tape->disk, rq, 0);
	blk_put_request(rq);
	return error;
L
Linus Torvalds 已提交
1180 1181
}

1182 1183
static void idetape_create_load_unload_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc, int cmd)
L
Linus Torvalds 已提交
1184
{
1185
	ide_init_pc(pc);
1186
	pc->c[0] = START_STOP;
L
Linus Torvalds 已提交
1187
	pc->c[4] = cmd;
1188
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1189 1190 1191 1192 1193
}

static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout)
{
	idetape_tape_t *tape = drive->driver_data;
1194
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1195 1196
	int load_attempted = 0;

1197
	/* Wait for the tape to become ready */
1198
	set_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
L
Linus Torvalds 已提交
1199 1200 1201
	timeout += jiffies;
	while (time_before(jiffies, timeout)) {
		idetape_create_test_unit_ready_cmd(&pc);
1202
		if (!idetape_queue_pc_tail(drive, &pc))
L
Linus Torvalds 已提交
1203 1204
			return 0;
		if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
1205 1206
		    || (tape->asc == 0x3A)) {
			/* no media */
L
Linus Torvalds 已提交
1207 1208
			if (load_attempted)
				return -ENOMEDIUM;
1209 1210
			idetape_create_load_unload_cmd(drive, &pc,
							IDETAPE_LU_LOAD_MASK);
1211
			idetape_queue_pc_tail(drive, &pc);
L
Linus Torvalds 已提交
1212 1213 1214 1215 1216
			load_attempted = 1;
		/* not about to be ready */
		} else if (!(tape->sense_key == 2 && tape->asc == 4 &&
			     (tape->ascq == 1 || tape->ascq == 8)))
			return -EIO;
1217
		msleep(100);
L
Linus Torvalds 已提交
1218 1219 1220 1221
	}
	return -EIO;
}

1222
static int idetape_flush_tape_buffers(ide_drive_t *drive)
L
Linus Torvalds 已提交
1223
{
1224
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1225 1226 1227
	int rc;

	idetape_create_write_filemark_cmd(drive, &pc, 0);
1228 1229
	rc = idetape_queue_pc_tail(drive, &pc);
	if (rc)
L
Linus Torvalds 已提交
1230 1231 1232 1233 1234
		return rc;
	idetape_wait_ready(drive, 60 * 5 * HZ);
	return 0;
}

1235
static void idetape_create_read_position_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1236
{
1237
	ide_init_pc(pc);
1238
	pc->c[0] = READ_POSITION;
1239
	pc->req_xfer = 20;
L
Linus Torvalds 已提交
1240 1241
}

1242
static int idetape_read_position(ide_drive_t *drive)
L
Linus Torvalds 已提交
1243 1244
{
	idetape_tape_t *tape = drive->driver_data;
1245
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1246 1247
	int position;

1248
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1249 1250 1251 1252

	idetape_create_read_position_cmd(&pc);
	if (idetape_queue_pc_tail(drive, &pc))
		return -1;
1253
	position = tape->first_frame;
L
Linus Torvalds 已提交
1254 1255 1256
	return position;
}

1257 1258
static void idetape_create_locate_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc,
1259
		unsigned int block, u8 partition, int skip)
L
Linus Torvalds 已提交
1260
{
1261
	ide_init_pc(pc);
1262
	pc->c[0] = POSITION_TO_ELEMENT;
L
Linus Torvalds 已提交
1263
	pc->c[1] = 2;
1264
	put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[3]);
L
Linus Torvalds 已提交
1265
	pc->c[8] = partition;
1266
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1267 1268
}

1269 1270
static int idetape_create_prevent_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc, int prevent)
L
Linus Torvalds 已提交
1271 1272 1273
{
	idetape_tape_t *tape = drive->driver_data;

1274 1275
	/* device supports locking according to capabilities page */
	if (!(tape->caps[6] & 0x01))
L
Linus Torvalds 已提交
1276 1277
		return 0;

1278
	ide_init_pc(pc);
1279
	pc->c[0] = ALLOW_MEDIUM_REMOVAL;
L
Linus Torvalds 已提交
1280 1281 1282 1283
	pc->c[4] = prevent;
	return 1;
}

1284 1285 1286 1287 1288 1289 1290 1291 1292 1293
static int ide_tape_set_media_lock(ide_drive_t *drive, int on)
{
	struct ide_atapi_pc pc;

	if (!idetape_create_prevent_cmd(drive, &pc, on))
		return 0;

	return idetape_queue_pc_tail(drive, &pc);
}

1294
static void __ide_tape_discard_merge_buffer(ide_drive_t *drive)
L
Linus Torvalds 已提交
1295 1296 1297
{
	idetape_tape_t *tape = drive->driver_data;

1298
	if (tape->chrdev_dir != IDETAPE_DIR_READ)
1299
		return;
L
Linus Torvalds 已提交
1300

1301
	clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags);
1302
	tape->merge_bh_size = 0;
1303 1304 1305
	if (tape->merge_bh != NULL) {
		ide_tape_kfree_buffer(tape);
		tape->merge_bh = NULL;
L
Linus Torvalds 已提交
1306 1307
	}

1308
	tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1309 1310 1311
}

/*
1312 1313 1314 1315
 * Position the tape to the requested block using the LOCATE packet command.
 * A READ POSITION command is then issued to check where we are positioned. Like
 * all higher level operations, we queue the commands at the tail of the request
 * queue and wait for their completion.
L
Linus Torvalds 已提交
1316
 */
1317 1318
static int idetape_position_tape(ide_drive_t *drive, unsigned int block,
		u8 partition, int skip)
L
Linus Torvalds 已提交
1319 1320 1321
{
	idetape_tape_t *tape = drive->driver_data;
	int retval;
1322
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1323

1324
	if (tape->chrdev_dir == IDETAPE_DIR_READ)
1325
		__ide_tape_discard_merge_buffer(drive);
L
Linus Torvalds 已提交
1326 1327 1328 1329 1330 1331 1332 1333 1334 1335
	idetape_wait_ready(drive, 60 * 5 * HZ);
	idetape_create_locate_cmd(drive, &pc, block, partition, skip);
	retval = idetape_queue_pc_tail(drive, &pc);
	if (retval)
		return (retval);

	idetape_create_read_position_cmd(&pc);
	return (idetape_queue_pc_tail(drive, &pc));
}

1336
static void ide_tape_discard_merge_buffer(ide_drive_t *drive,
1337
					  int restore_position)
L
Linus Torvalds 已提交
1338 1339 1340 1341
{
	idetape_tape_t *tape = drive->driver_data;
	int seek, position;

1342
	__ide_tape_discard_merge_buffer(drive);
L
Linus Torvalds 已提交
1343 1344
	if (restore_position) {
		position = idetape_read_position(drive);
1345
		seek = position > 0 ? position : 0;
L
Linus Torvalds 已提交
1346
		if (idetape_position_tape(drive, seek, 0, 0)) {
1347
			printk(KERN_INFO "ide-tape: %s: position_tape failed in"
1348
					 " %s\n", tape->name, __func__);
L
Linus Torvalds 已提交
1349 1350 1351 1352 1353 1354
			return;
		}
	}
}

/*
1355 1356
 * Generate a read/write request for the block device interface and wait for it
 * to be serviced.
L
Linus Torvalds 已提交
1357
 */
1358 1359
static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
				 struct idetape_bh *bh)
L
Linus Torvalds 已提交
1360 1361
{
	idetape_tape_t *tape = drive->driver_data;
1362 1363
	struct request *rq;
	int ret, errors;
L
Linus Torvalds 已提交
1364

1365 1366
	debug_log(DBG_SENSE, "%s: cmd=%d\n", __func__, cmd);

1367 1368
	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
	rq->cmd_type = REQ_TYPE_SPECIAL;
1369
	rq->cmd[13] = cmd;
1370 1371 1372 1373 1374 1375 1376 1377 1378 1379
	rq->rq_disk = tape->disk;
	rq->special = (void *)bh;
	rq->sector = tape->first_frame;
	rq->nr_sectors = blocks;
	rq->current_nr_sectors = blocks;
	blk_execute_rq(drive->queue, tape->disk, rq, 0);

	errors = rq->errors;
	ret = tape->blk_size * (blocks - rq->current_nr_sectors);
	blk_put_request(rq);
L
Linus Torvalds 已提交
1380 1381 1382 1383

	if ((cmd & (REQ_IDETAPE_READ | REQ_IDETAPE_WRITE)) == 0)
		return 0;

1384 1385
	if (tape->merge_bh)
		idetape_init_merge_buffer(tape);
1386
	if (errors == IDETAPE_ERROR_GENERAL)
L
Linus Torvalds 已提交
1387
		return -EIO;
1388
	return ret;
L
Linus Torvalds 已提交
1389 1390
}

1391
static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1392
{
1393
	ide_init_pc(pc);
1394
	pc->c[0] = INQUIRY;
1395
	pc->c[4] = 254;
1396
	pc->req_xfer = 254;
L
Linus Torvalds 已提交
1397 1398
}

1399 1400
static void idetape_create_rewind_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1401
{
1402
	ide_init_pc(pc);
1403
	pc->c[0] = REZERO_UNIT;
1404
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1405 1406
}

1407
static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1408
{
1409
	ide_init_pc(pc);
1410
	pc->c[0] = ERASE;
L
Linus Torvalds 已提交
1411
	pc->c[1] = 1;
1412
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1413 1414
}

1415
static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
L
Linus Torvalds 已提交
1416
{
1417
	ide_init_pc(pc);
1418
	pc->c[0] = SPACE;
1419
	put_unaligned(cpu_to_be32(count), (unsigned int *) &pc->c[1]);
L
Linus Torvalds 已提交
1420
	pc->c[1] = cmd;
1421
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1422 1423
}

1424
/* Queue up a character device originated write request. */
1425
static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
L
Linus Torvalds 已提交
1426 1427 1428
{
	idetape_tape_t *tape = drive->driver_data;

1429
	debug_log(DBG_CHRDEV, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1430

1431
	return idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE,
1432
				     blocks, tape->merge_bh);
L
Linus Torvalds 已提交
1433 1434
}

1435
static void ide_tape_flush_merge_buffer(ide_drive_t *drive)
L
Linus Torvalds 已提交
1436 1437 1438 1439
{
	idetape_tape_t *tape = drive->driver_data;
	int blocks, min;
	struct idetape_bh *bh;
1440

1441
	if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
1442
		printk(KERN_ERR "ide-tape: bug: Trying to empty merge buffer"
1443
				" but we are not writing.\n");
L
Linus Torvalds 已提交
1444 1445
		return;
	}
1446
	if (tape->merge_bh_size > tape->buffer_size) {
L
Linus Torvalds 已提交
1447
		printk(KERN_ERR "ide-tape: bug: merge_buffer too big\n");
1448
		tape->merge_bh_size = tape->buffer_size;
L
Linus Torvalds 已提交
1449
	}
1450 1451 1452
	if (tape->merge_bh_size) {
		blocks = tape->merge_bh_size / tape->blk_size;
		if (tape->merge_bh_size % tape->blk_size) {
L
Linus Torvalds 已提交
1453 1454 1455
			unsigned int i;

			blocks++;
1456
			i = tape->blk_size - tape->merge_bh_size %
1457
				tape->blk_size;
L
Linus Torvalds 已提交
1458 1459 1460 1461 1462 1463 1464 1465
			bh = tape->bh->b_reqnext;
			while (bh) {
				atomic_set(&bh->b_count, 0);
				bh = bh->b_reqnext;
			}
			bh = tape->bh;
			while (i) {
				if (bh == NULL) {
1466 1467
					printk(KERN_INFO "ide-tape: bug,"
							 " bh NULL\n");
L
Linus Torvalds 已提交
1468 1469
					break;
				}
1470 1471 1472 1473
				min = min(i, (unsigned int)(bh->b_size -
						atomic_read(&bh->b_count)));
				memset(bh->b_data + atomic_read(&bh->b_count),
						0, min);
L
Linus Torvalds 已提交
1474 1475 1476 1477 1478 1479
				atomic_add(min, &bh->b_count);
				i -= min;
				bh = bh->b_reqnext;
			}
		}
		(void) idetape_add_chrdev_write_request(drive, blocks);
1480
		tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1481
	}
1482 1483 1484
	if (tape->merge_bh != NULL) {
		ide_tape_kfree_buffer(tape);
		tape->merge_bh = NULL;
L
Linus Torvalds 已提交
1485
	}
1486
	tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1487 1488
}

1489
static int idetape_init_read(ide_drive_t *drive)
L
Linus Torvalds 已提交
1490 1491 1492 1493 1494
{
	idetape_tape_t *tape = drive->driver_data;
	int bytes_read;

	/* Initialize read operation */
1495 1496
	if (tape->chrdev_dir != IDETAPE_DIR_READ) {
		if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
1497
			ide_tape_flush_merge_buffer(drive);
L
Linus Torvalds 已提交
1498 1499
			idetape_flush_tape_buffers(drive);
		}
1500
		if (tape->merge_bh || tape->merge_bh_size) {
1501
			printk(KERN_ERR "ide-tape: merge_bh_size should be"
1502
					 " 0 now\n");
1503
			tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1504
		}
1505 1506
		tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0);
		if (!tape->merge_bh)
L
Linus Torvalds 已提交
1507
			return -ENOMEM;
1508
		tape->chrdev_dir = IDETAPE_DIR_READ;
L
Linus Torvalds 已提交
1509 1510

		/*
1511 1512 1513 1514
		 * Issue a read 0 command to ensure that DSC handshake is
		 * switched from completion mode to buffer available mode.
		 * No point in issuing this if DSC overlap isn't supported, some
		 * drives (Seagate STT3401A) will return an error.
L
Linus Torvalds 已提交
1515 1516
		 */
		if (drive->dsc_overlap) {
1517 1518
			bytes_read = idetape_queue_rw_tail(drive,
							REQ_IDETAPE_READ, 0,
1519
							tape->merge_bh);
L
Linus Torvalds 已提交
1520
			if (bytes_read < 0) {
1521 1522
				ide_tape_kfree_buffer(tape);
				tape->merge_bh = NULL;
1523
				tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1524 1525 1526 1527
				return bytes_read;
			}
		}
	}
1528

L
Linus Torvalds 已提交
1529 1530 1531
	return 0;
}

1532
/* called from idetape_chrdev_read() to service a chrdev read request. */
1533
static int idetape_add_chrdev_read_request(ide_drive_t *drive, int blocks)
L
Linus Torvalds 已提交
1534 1535 1536
{
	idetape_tape_t *tape = drive->driver_data;

1537
	debug_log(DBG_PROCS, "Enter %s, %d blocks\n", __func__, blocks);
L
Linus Torvalds 已提交
1538

1539
	/* If we are at a filemark, return a read length of 0 */
1540
	if (test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
L
Linus Torvalds 已提交
1541 1542
		return 0;

1543
	idetape_init_read(drive);
1544 1545

	return idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, blocks,
1546
				     tape->merge_bh);
L
Linus Torvalds 已提交
1547 1548
}

1549
static void idetape_pad_zeros(ide_drive_t *drive, int bcount)
L
Linus Torvalds 已提交
1550 1551 1552 1553
{
	idetape_tape_t *tape = drive->driver_data;
	struct idetape_bh *bh;
	int blocks;
1554

L
Linus Torvalds 已提交
1555 1556 1557
	while (bcount) {
		unsigned int count;

1558
		bh = tape->merge_bh;
1559
		count = min(tape->buffer_size, bcount);
L
Linus Torvalds 已提交
1560
		bcount -= count;
1561
		blocks = count / tape->blk_size;
L
Linus Torvalds 已提交
1562
		while (count) {
1563 1564
			atomic_set(&bh->b_count,
				   min(count, (unsigned int)bh->b_size));
L
Linus Torvalds 已提交
1565 1566 1567 1568
			memset(bh->b_data, 0, atomic_read(&bh->b_count));
			count -= atomic_read(&bh->b_count);
			bh = bh->b_reqnext;
		}
1569
		idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, blocks,
1570
				      tape->merge_bh);
L
Linus Torvalds 已提交
1571 1572 1573 1574
	}
}

/*
1575 1576 1577
 * Rewinds the tape to the Beginning Of the current Partition (BOP). We
 * currently support only one partition.
 */
1578
static int idetape_rewind_tape(ide_drive_t *drive)
L
Linus Torvalds 已提交
1579 1580
{
	int retval;
1581
	struct ide_atapi_pc pc;
1582 1583 1584 1585 1586
	idetape_tape_t *tape;
	tape = drive->driver_data;

	debug_log(DBG_SENSE, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598
	idetape_create_rewind_cmd(drive, &pc);
	retval = idetape_queue_pc_tail(drive, &pc);
	if (retval)
		return retval;

	idetape_create_read_position_cmd(&pc);
	retval = idetape_queue_pc_tail(drive, &pc);
	if (retval)
		return retval;
	return 0;
}

1599
/* mtio.h compatible commands should be issued to the chrdev interface. */
1600 1601
static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
				unsigned long arg)
L
Linus Torvalds 已提交
1602 1603 1604 1605
{
	idetape_tape_t *tape = drive->driver_data;
	void __user *argp = (void __user *)arg;

1606 1607 1608 1609 1610 1611
	struct idetape_config {
		int dsc_rw_frequency;
		int dsc_media_access_frequency;
		int nr_stages;
	} config;

1612 1613
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
1614
	switch (cmd) {
1615 1616 1617 1618 1619 1620 1621
	case 0x0340:
		if (copy_from_user(&config, argp, sizeof(config)))
			return -EFAULT;
		tape->best_dsc_rw_freq = config.dsc_rw_frequency;
		break;
	case 0x0350:
		config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
1622
		config.nr_stages = 1;
1623 1624 1625 1626 1627
		if (copy_to_user(argp, &config, sizeof(config)))
			return -EFAULT;
		break;
	default:
		return -EIO;
L
Linus Torvalds 已提交
1628 1629 1630 1631
	}
	return 0;
}

1632 1633
static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
					int mt_count)
L
Linus Torvalds 已提交
1634 1635
{
	idetape_tape_t *tape = drive->driver_data;
1636
	struct ide_atapi_pc pc;
1637
	int retval, count = 0;
1638
	int sprev = !!(tape->caps[4] & 0x20);
L
Linus Torvalds 已提交
1639 1640 1641 1642

	if (mt_count == 0)
		return 0;
	if (MTBSF == mt_op || MTBSFM == mt_op) {
1643
		if (!sprev)
L
Linus Torvalds 已提交
1644
			return -EIO;
1645
		mt_count = -mt_count;
L
Linus Torvalds 已提交
1646 1647
	}

1648
	if (tape->chrdev_dir == IDETAPE_DIR_READ) {
1649
		tape->merge_bh_size = 0;
1650
		if (test_and_clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
L
Linus Torvalds 已提交
1651
			++count;
1652
		ide_tape_discard_merge_buffer(drive, 0);
L
Linus Torvalds 已提交
1653 1654 1655
	}

	switch (mt_op) {
1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674
	case MTFSF:
	case MTBSF:
		idetape_create_space_cmd(&pc, mt_count - count,
					 IDETAPE_SPACE_OVER_FILEMARK);
		return idetape_queue_pc_tail(drive, &pc);
	case MTFSFM:
	case MTBSFM:
		if (!sprev)
			return -EIO;
		retval = idetape_space_over_filemarks(drive, MTFSF,
						      mt_count - count);
		if (retval)
			return retval;
		count = (MTBSFM == mt_op ? 1 : -1);
		return idetape_space_over_filemarks(drive, MTFSF, count);
	default:
		printk(KERN_ERR "ide-tape: MTIO operation %d not supported\n",
				mt_op);
		return -EIO;
L
Linus Torvalds 已提交
1675 1676 1677 1678
	}
}

/*
1679
 * Our character device read / write functions.
L
Linus Torvalds 已提交
1680
 *
1681 1682 1683
 * The tape is optimized to maximize throughput when it is transferring an
 * integral number of the "continuous transfer limit", which is a parameter of
 * the specific tape (26kB on my particular tape, 32kB for Onstream).
L
Linus Torvalds 已提交
1684
 *
1685 1686 1687 1688 1689 1690 1691
 * As of version 1.3 of the driver, the character device provides an abstract
 * continuous view of the media - any mix of block sizes (even 1 byte) on the
 * same backup/restore procedure is supported. The driver will internally
 * convert the requests to the recommended transfer unit, so that an unmatch
 * between the user's block size to the recommended size will only result in a
 * (slightly) increased driver overhead, but will no longer hit performance.
 * This is not applicable to Onstream.
L
Linus Torvalds 已提交
1692
 */
1693 1694
static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,
				   size_t count, loff_t *ppos)
L
Linus Torvalds 已提交
1695 1696 1697
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
1698
	ssize_t bytes_read, temp, actually_read = 0, rc;
1699
	ssize_t ret = 0;
1700
	u16 ctl = *(u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
1701

1702
	debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count);
L
Linus Torvalds 已提交
1703

1704
	if (tape->chrdev_dir != IDETAPE_DIR_READ) {
1705
		if (test_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags))
1706 1707 1708
			if (count > tape->blk_size &&
			    (count % tape->blk_size) == 0)
				tape->user_bs_factor = count / tape->blk_size;
L
Linus Torvalds 已提交
1709
	}
1710
	rc = idetape_init_read(drive);
1711
	if (rc < 0)
L
Linus Torvalds 已提交
1712 1713 1714
		return rc;
	if (count == 0)
		return (0);
1715 1716
	if (tape->merge_bh_size) {
		actually_read = min((unsigned int)(tape->merge_bh_size),
1717
				    (unsigned int)count);
1718
		if (idetape_copy_stage_to_user(tape, buf, actually_read))
1719
			ret = -EFAULT;
L
Linus Torvalds 已提交
1720
		buf += actually_read;
1721
		tape->merge_bh_size -= actually_read;
L
Linus Torvalds 已提交
1722 1723
		count -= actually_read;
	}
1724
	while (count >= tape->buffer_size) {
1725
		bytes_read = idetape_add_chrdev_read_request(drive, ctl);
L
Linus Torvalds 已提交
1726 1727
		if (bytes_read <= 0)
			goto finish;
1728
		if (idetape_copy_stage_to_user(tape, buf, bytes_read))
1729
			ret = -EFAULT;
L
Linus Torvalds 已提交
1730 1731 1732 1733 1734
		buf += bytes_read;
		count -= bytes_read;
		actually_read += bytes_read;
	}
	if (count) {
1735
		bytes_read = idetape_add_chrdev_read_request(drive, ctl);
L
Linus Torvalds 已提交
1736 1737 1738
		if (bytes_read <= 0)
			goto finish;
		temp = min((unsigned long)count, (unsigned long)bytes_read);
1739
		if (idetape_copy_stage_to_user(tape, buf, temp))
1740
			ret = -EFAULT;
L
Linus Torvalds 已提交
1741
		actually_read += temp;
1742
		tape->merge_bh_size = bytes_read-temp;
L
Linus Torvalds 已提交
1743 1744
	}
finish:
1745
	if (!actually_read && test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) {
1746 1747
		debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name);

L
Linus Torvalds 已提交
1748 1749 1750
		idetape_space_over_filemarks(drive, MTFSF, 1);
		return 0;
	}
1751

1752
	return ret ? ret : actually_read;
L
Linus Torvalds 已提交
1753 1754
}

1755
static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf,
L
Linus Torvalds 已提交
1756 1757 1758 1759
				     size_t count, loff_t *ppos)
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
1760 1761
	ssize_t actually_written = 0;
	ssize_t ret = 0;
1762
	u16 ctl = *(u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
1763 1764 1765 1766 1767

	/* The drive is write protected. */
	if (tape->write_prot)
		return -EACCES;

1768
	debug_log(DBG_CHRDEV, "Enter %s, count %Zd\n", __func__, count);
L
Linus Torvalds 已提交
1769 1770

	/* Initialize write operation */
1771 1772
	if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
		if (tape->chrdev_dir == IDETAPE_DIR_READ)
1773
			ide_tape_discard_merge_buffer(drive, 1);
1774
		if (tape->merge_bh || tape->merge_bh_size) {
1775
			printk(KERN_ERR "ide-tape: merge_bh_size "
L
Linus Torvalds 已提交
1776
				"should be 0 now\n");
1777
			tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1778
		}
1779 1780
		tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0);
		if (!tape->merge_bh)
L
Linus Torvalds 已提交
1781
			return -ENOMEM;
1782
		tape->chrdev_dir = IDETAPE_DIR_WRITE;
1783
		idetape_init_merge_buffer(tape);
L
Linus Torvalds 已提交
1784 1785

		/*
1786 1787 1788 1789
		 * Issue a write 0 command to ensure that DSC handshake is
		 * switched from completion mode to buffer available mode. No
		 * point in issuing this if DSC overlap isn't supported, some
		 * drives (Seagate STT3401A) will return an error.
L
Linus Torvalds 已提交
1790 1791
		 */
		if (drive->dsc_overlap) {
1792 1793
			ssize_t retval = idetape_queue_rw_tail(drive,
							REQ_IDETAPE_WRITE, 0,
1794
							tape->merge_bh);
L
Linus Torvalds 已提交
1795
			if (retval < 0) {
1796 1797
				ide_tape_kfree_buffer(tape);
				tape->merge_bh = NULL;
1798
				tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1799 1800 1801 1802 1803 1804
				return retval;
			}
		}
	}
	if (count == 0)
		return (0);
1805 1806
	if (tape->merge_bh_size) {
		if (tape->merge_bh_size >= tape->buffer_size) {
1807
			printk(KERN_ERR "ide-tape: bug: merge buf too big\n");
1808
			tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1809
		}
1810
		actually_written = min((unsigned int)
1811
				(tape->buffer_size - tape->merge_bh_size),
1812
				(unsigned int)count);
1813
		if (idetape_copy_stage_from_user(tape, buf, actually_written))
1814
				ret = -EFAULT;
L
Linus Torvalds 已提交
1815
		buf += actually_written;
1816
		tape->merge_bh_size += actually_written;
L
Linus Torvalds 已提交
1817 1818
		count -= actually_written;

1819
		if (tape->merge_bh_size == tape->buffer_size) {
1820
			ssize_t retval;
1821
			tape->merge_bh_size = 0;
1822
			retval = idetape_add_chrdev_write_request(drive, ctl);
L
Linus Torvalds 已提交
1823 1824 1825 1826
			if (retval <= 0)
				return (retval);
		}
	}
1827
	while (count >= tape->buffer_size) {
1828
		ssize_t retval;
1829
		if (idetape_copy_stage_from_user(tape, buf, tape->buffer_size))
1830
			ret = -EFAULT;
1831 1832
		buf += tape->buffer_size;
		count -= tape->buffer_size;
1833
		retval = idetape_add_chrdev_write_request(drive, ctl);
1834
		actually_written += tape->buffer_size;
L
Linus Torvalds 已提交
1835 1836 1837 1838 1839
		if (retval <= 0)
			return (retval);
	}
	if (count) {
		actually_written += count;
1840
		if (idetape_copy_stage_from_user(tape, buf, count))
1841
			ret = -EFAULT;
1842
		tape->merge_bh_size += count;
L
Linus Torvalds 已提交
1843
	}
1844
	return ret ? ret : actually_written;
L
Linus Torvalds 已提交
1845 1846
}

1847
static int idetape_write_filemark(ide_drive_t *drive)
L
Linus Torvalds 已提交
1848
{
1849
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 1860

	/* Write a filemark */
	idetape_create_write_filemark_cmd(drive, &pc, 1);
	if (idetape_queue_pc_tail(drive, &pc)) {
		printk(KERN_ERR "ide-tape: Couldn't write a filemark\n");
		return -EIO;
	}
	return 0;
}

/*
1861 1862
 * Called from idetape_chrdev_ioctl when the general mtio MTIOCTOP ioctl is
 * requested.
L
Linus Torvalds 已提交
1863
 *
1864 1865
 * Note: MTBSF and MTBSFM are not supported when the tape doesn't support
 * spacing over filemarks in the reverse direction. In this case, MTFSFM is also
1866
 * usually not supported.
L
Linus Torvalds 已提交
1867
 *
1868
 * The following commands are currently not supported:
L
Linus Torvalds 已提交
1869
 *
1870 1871
 * MTFSS, MTBSS, MTWSM, MTSETDENSITY, MTSETDRVBUFFER, MT_ST_BOOLEANS,
 * MT_ST_WRITE_THRESHOLD.
L
Linus Torvalds 已提交
1872
 */
1873
static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count)
L
Linus Torvalds 已提交
1874 1875
{
	idetape_tape_t *tape = drive->driver_data;
1876
	struct ide_atapi_pc pc;
1877
	int i, retval;
L
Linus Torvalds 已提交
1878

1879 1880
	debug_log(DBG_ERR, "Handling MTIOCTOP ioctl: mt_op=%d, mt_count=%d\n",
			mt_op, mt_count);
1881

L
Linus Torvalds 已提交
1882
	switch (mt_op) {
1883 1884 1885 1886 1887 1888 1889 1890 1891
	case MTFSF:
	case MTFSFM:
	case MTBSF:
	case MTBSFM:
		if (!mt_count)
			return 0;
		return idetape_space_over_filemarks(drive, mt_op, mt_count);
	default:
		break;
L
Linus Torvalds 已提交
1892
	}
1893

L
Linus Torvalds 已提交
1894
	switch (mt_op) {
1895 1896 1897
	case MTWEOF:
		if (tape->write_prot)
			return -EACCES;
1898
		ide_tape_discard_merge_buffer(drive, 1);
1899 1900 1901 1902 1903 1904 1905
		for (i = 0; i < mt_count; i++) {
			retval = idetape_write_filemark(drive);
			if (retval)
				return retval;
		}
		return 0;
	case MTREW:
1906
		ide_tape_discard_merge_buffer(drive, 0);
1907 1908 1909 1910
		if (idetape_rewind_tape(drive))
			return -EIO;
		return 0;
	case MTLOAD:
1911
		ide_tape_discard_merge_buffer(drive, 0);
1912 1913 1914 1915 1916 1917 1918 1919 1920 1921
		idetape_create_load_unload_cmd(drive, &pc,
					       IDETAPE_LU_LOAD_MASK);
		return idetape_queue_pc_tail(drive, &pc);
	case MTUNLOAD:
	case MTOFFL:
		/*
		 * If door is locked, attempt to unlock before
		 * attempting to eject.
		 */
		if (tape->door_locked) {
1922 1923
			if (!ide_tape_set_media_lock(drive, 0))
				tape->door_locked = DOOR_UNLOCKED;
1924
		}
1925
		ide_tape_discard_merge_buffer(drive, 0);
1926 1927 1928 1929
		idetape_create_load_unload_cmd(drive, &pc,
					      !IDETAPE_LU_LOAD_MASK);
		retval = idetape_queue_pc_tail(drive, &pc);
		if (!retval)
1930
			clear_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
1931 1932
		return retval;
	case MTNOP:
1933
		ide_tape_discard_merge_buffer(drive, 0);
1934 1935
		return idetape_flush_tape_buffers(drive);
	case MTRETEN:
1936
		ide_tape_discard_merge_buffer(drive, 0);
1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950
		idetape_create_load_unload_cmd(drive, &pc,
			IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK);
		return idetape_queue_pc_tail(drive, &pc);
	case MTEOM:
		idetape_create_space_cmd(&pc, 0, IDETAPE_SPACE_TO_EOD);
		return idetape_queue_pc_tail(drive, &pc);
	case MTERASE:
		(void)idetape_rewind_tape(drive);
		idetape_create_erase_cmd(&pc);
		return idetape_queue_pc_tail(drive, &pc);
	case MTSETBLK:
		if (mt_count) {
			if (mt_count < tape->blk_size ||
			    mt_count % tape->blk_size)
L
Linus Torvalds 已提交
1951
				return -EIO;
1952
			tape->user_bs_factor = mt_count / tape->blk_size;
1953
			clear_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
1954
		} else
1955
			set_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
1956 1957
		return 0;
	case MTSEEK:
1958
		ide_tape_discard_merge_buffer(drive, 0);
1959 1960 1961
		return idetape_position_tape(drive,
			mt_count * tape->user_bs_factor, tape->partition, 0);
	case MTSETPART:
1962
		ide_tape_discard_merge_buffer(drive, 0);
1963 1964 1965 1966
		return idetape_position_tape(drive, 0, mt_count, 0);
	case MTFSR:
	case MTBSR:
	case MTLOCK:
1967
		retval = ide_tape_set_media_lock(drive, 1);
1968
		if (retval)
L
Linus Torvalds 已提交
1969
			return retval;
1970 1971 1972
		tape->door_locked = DOOR_EXPLICITLY_LOCKED;
		return 0;
	case MTUNLOCK:
1973
		retval = ide_tape_set_media_lock(drive, 0);
1974 1975 1976 1977 1978 1979 1980 1981
		if (retval)
			return retval;
		tape->door_locked = DOOR_UNLOCKED;
		return 0;
	default:
		printk(KERN_ERR "ide-tape: MTIO operation %d not supported\n",
				mt_op);
		return -EIO;
L
Linus Torvalds 已提交
1982 1983 1984 1985
	}
}

/*
1986 1987 1988
 * Our character device ioctls. General mtio.h magnetic io commands are
 * supported here, and not in the corresponding block interface. Our own
 * ide-tape ioctls are supported on both interfaces.
L
Linus Torvalds 已提交
1989
 */
1990 1991
static int idetape_chrdev_ioctl(struct inode *inode, struct file *file,
				unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
1992 1993 1994 1995 1996 1997
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
	struct mtop mtop;
	struct mtget mtget;
	struct mtpos mtpos;
1998
	int block_offset = 0, position = tape->first_frame;
L
Linus Torvalds 已提交
1999 2000
	void __user *argp = (void __user *)arg;

2001
	debug_log(DBG_CHRDEV, "Enter %s, cmd=%u\n", __func__, cmd);
L
Linus Torvalds 已提交
2002

2003
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
2004
		ide_tape_flush_merge_buffer(drive);
L
Linus Torvalds 已提交
2005 2006 2007
		idetape_flush_tape_buffers(drive);
	}
	if (cmd == MTIOCGET || cmd == MTIOCPOS) {
2008
		block_offset = tape->merge_bh_size /
2009
			(tape->blk_size * tape->user_bs_factor);
2010 2011
		position = idetape_read_position(drive);
		if (position < 0)
L
Linus Torvalds 已提交
2012 2013 2014
			return -EIO;
	}
	switch (cmd) {
2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039
	case MTIOCTOP:
		if (copy_from_user(&mtop, argp, sizeof(struct mtop)))
			return -EFAULT;
		return idetape_mtioctop(drive, mtop.mt_op, mtop.mt_count);
	case MTIOCGET:
		memset(&mtget, 0, sizeof(struct mtget));
		mtget.mt_type = MT_ISSCSI2;
		mtget.mt_blkno = position / tape->user_bs_factor - block_offset;
		mtget.mt_dsreg =
			((tape->blk_size * tape->user_bs_factor)
			 << MT_ST_BLKSIZE_SHIFT) & MT_ST_BLKSIZE_MASK;

		if (tape->drv_write_prot)
			mtget.mt_gstat |= GMT_WR_PROT(0xffffffff);

		if (copy_to_user(argp, &mtget, sizeof(struct mtget)))
			return -EFAULT;
		return 0;
	case MTIOCPOS:
		mtpos.mt_blkno = position / tape->user_bs_factor - block_offset;
		if (copy_to_user(argp, &mtpos, sizeof(struct mtpos)))
			return -EFAULT;
		return 0;
	default:
		if (tape->chrdev_dir == IDETAPE_DIR_READ)
2040
			ide_tape_discard_merge_buffer(drive, 1);
2041
		return idetape_blkdev_ioctl(drive, cmd, arg);
L
Linus Torvalds 已提交
2042 2043 2044
	}
}

2045 2046 2047 2048 2049 2050 2051
/*
 * Do a mode sense page 0 with block descriptor and if it succeeds set the tape
 * block size with the reported value.
 */
static void ide_tape_get_bsize_from_bdesc(ide_drive_t *drive)
{
	idetape_tape_t *tape = drive->driver_data;
2052
	struct ide_atapi_pc pc;
2053 2054 2055 2056

	idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_DESCRIPTOR);
	if (idetape_queue_pc_tail(drive, &pc)) {
		printk(KERN_ERR "ide-tape: Can't get block descriptor\n");
2057
		if (tape->blk_size == 0) {
2058 2059
			printk(KERN_WARNING "ide-tape: Cannot deal with zero "
					    "block size, assuming 32k\n");
2060
			tape->blk_size = 32768;
2061 2062 2063
		}
		return;
	}
2064 2065 2066 2067
	tape->blk_size = (pc.buf[4 + 5] << 16) +
				(pc.buf[4 + 6] << 8)  +
				 pc.buf[4 + 7];
	tape->drv_write_prot = (pc.buf[2] & 0x80) >> 7;
2068
}
L
Linus Torvalds 已提交
2069

2070
static int idetape_chrdev_open(struct inode *inode, struct file *filp)
L
Linus Torvalds 已提交
2071 2072 2073 2074 2075 2076
{
	unsigned int minor = iminor(inode), i = minor & ~0xc0;
	ide_drive_t *drive;
	idetape_tape_t *tape;
	int retval;

2077 2078 2079
	if (i >= MAX_HWIFS * MAX_DRIVES)
		return -ENXIO;

2080
	lock_kernel();
2081
	tape = ide_tape_chrdev_get(i);
2082 2083
	if (!tape) {
		unlock_kernel();
2084
		return -ENXIO;
2085
	}
2086 2087 2088

	debug_log(DBG_CHRDEV, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099
	/*
	 * We really want to do nonseekable_open(inode, filp); here, but some
	 * versions of tar incorrectly call lseek on tapes and bail out if that
	 * fails.  So we disallow pread() and pwrite(), but permit lseeks.
	 */
	filp->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);

	drive = tape->drive;

	filp->private_data = tape;

2100
	if (test_and_set_bit(IDE_AFLAG_BUSY, &drive->atapi_flags)) {
L
Linus Torvalds 已提交
2101 2102 2103 2104 2105 2106
		retval = -EBUSY;
		goto out_put_tape;
	}

	retval = idetape_wait_ready(drive, 60 * HZ);
	if (retval) {
2107
		clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
L
Linus Torvalds 已提交
2108 2109 2110 2111 2112
		printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
		goto out_put_tape;
	}

	idetape_read_position(drive);
2113
	if (!test_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags))
L
Linus Torvalds 已提交
2114 2115 2116
		(void)idetape_rewind_tape(drive);

	/* Read block size and write protect status from drive. */
2117
	ide_tape_get_bsize_from_bdesc(drive);
L
Linus Torvalds 已提交
2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128

	/* Set write protect flag if device is opened as read-only. */
	if ((filp->f_flags & O_ACCMODE) == O_RDONLY)
		tape->write_prot = 1;
	else
		tape->write_prot = tape->drv_write_prot;

	/* Make sure drive isn't write protected if user wants to write. */
	if (tape->write_prot) {
		if ((filp->f_flags & O_ACCMODE) == O_WRONLY ||
		    (filp->f_flags & O_ACCMODE) == O_RDWR) {
2129
			clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
L
Linus Torvalds 已提交
2130 2131 2132 2133 2134
			retval = -EROFS;
			goto out_put_tape;
		}
	}

2135
	/* Lock the tape drive door so user can't eject. */
2136
	if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
2137 2138 2139
		if (!ide_tape_set_media_lock(drive, 1)) {
			if (tape->door_locked != DOOR_EXPLICITLY_LOCKED)
				tape->door_locked = DOOR_LOCKED;
L
Linus Torvalds 已提交
2140 2141
		}
	}
2142
	unlock_kernel();
L
Linus Torvalds 已提交
2143 2144 2145 2146
	return 0;

out_put_tape:
	ide_tape_put(tape);
2147
	unlock_kernel();
L
Linus Torvalds 已提交
2148 2149 2150
	return retval;
}

2151
static void idetape_write_release(ide_drive_t *drive, unsigned int minor)
L
Linus Torvalds 已提交
2152 2153 2154
{
	idetape_tape_t *tape = drive->driver_data;

2155
	ide_tape_flush_merge_buffer(drive);
2156 2157
	tape->merge_bh = ide_tape_kmalloc_buffer(tape, 1, 0);
	if (tape->merge_bh != NULL) {
2158 2159
		idetape_pad_zeros(drive, tape->blk_size *
				(tape->user_bs_factor - 1));
2160 2161
		ide_tape_kfree_buffer(tape);
		tape->merge_bh = NULL;
L
Linus Torvalds 已提交
2162 2163 2164 2165 2166 2167
	}
	idetape_write_filemark(drive);
	idetape_flush_tape_buffers(drive);
	idetape_flush_tape_buffers(drive);
}

2168
static int idetape_chrdev_release(struct inode *inode, struct file *filp)
L
Linus Torvalds 已提交
2169 2170 2171 2172 2173 2174 2175
{
	struct ide_tape_obj *tape = ide_tape_f(filp);
	ide_drive_t *drive = tape->drive;
	unsigned int minor = iminor(inode);

	lock_kernel();
	tape = drive->driver_data;
2176 2177

	debug_log(DBG_CHRDEV, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
2178

2179
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
L
Linus Torvalds 已提交
2180
		idetape_write_release(drive, minor);
2181
	if (tape->chrdev_dir == IDETAPE_DIR_READ) {
L
Linus Torvalds 已提交
2182
		if (minor < 128)
2183
			ide_tape_discard_merge_buffer(drive, 1);
L
Linus Torvalds 已提交
2184
	}
2185

2186
	if (minor < 128 && test_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags))
L
Linus Torvalds 已提交
2187
		(void) idetape_rewind_tape(drive);
2188
	if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
L
Linus Torvalds 已提交
2189
		if (tape->door_locked == DOOR_LOCKED) {
2190 2191
			if (!ide_tape_set_media_lock(drive, 0))
				tape->door_locked = DOOR_UNLOCKED;
L
Linus Torvalds 已提交
2192 2193
		}
	}
2194
	clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
L
Linus Torvalds 已提交
2195 2196 2197 2198 2199
	ide_tape_put(tape);
	unlock_kernel();
	return 0;
}

2200
static void idetape_get_inquiry_results(ide_drive_t *drive)
L
Linus Torvalds 已提交
2201 2202
{
	idetape_tape_t *tape = drive->driver_data;
2203
	struct ide_atapi_pc pc;
B
Borislav Petkov 已提交
2204
	char fw_rev[4], vendor_id[8], product_id[16];
2205

L
Linus Torvalds 已提交
2206 2207
	idetape_create_inquiry_cmd(&pc);
	if (idetape_queue_pc_tail(drive, &pc)) {
2208 2209
		printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n",
				tape->name);
L
Linus Torvalds 已提交
2210 2211
		return;
	}
2212 2213 2214
	memcpy(vendor_id, &pc.buf[8], 8);
	memcpy(product_id, &pc.buf[16], 16);
	memcpy(fw_rev, &pc.buf[32], 4);
2215

B
Borislav Petkov 已提交
2216 2217 2218
	ide_fixstring(vendor_id, 8, 0);
	ide_fixstring(product_id, 16, 0);
	ide_fixstring(fw_rev, 4, 0);
2219

B
Borislav Petkov 已提交
2220
	printk(KERN_INFO "ide-tape: %s <-> %s: %.8s %.16s rev %.4s\n",
2221
			drive->name, tape->name, vendor_id, product_id, fw_rev);
L
Linus Torvalds 已提交
2222 2223 2224
}

/*
2225 2226
 * Ask the tape about its various parameters. In particular, we will adjust our
 * data transfer buffer	size to the recommended value as returned by the tape.
L
Linus Torvalds 已提交
2227
 */
2228
static void idetape_get_mode_sense_results(ide_drive_t *drive)
L
Linus Torvalds 已提交
2229 2230
{
	idetape_tape_t *tape = drive->driver_data;
2231
	struct ide_atapi_pc pc;
2232 2233
	u8 *caps;
	u8 speed, max_speed;
2234

L
Linus Torvalds 已提交
2235 2236
	idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE);
	if (idetape_queue_pc_tail(drive, &pc)) {
2237 2238
		printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming"
				" some default values\n");
2239
		tape->blk_size = 512;
2240 2241 2242
		put_unaligned(52,   (u16 *)&tape->caps[12]);
		put_unaligned(540,  (u16 *)&tape->caps[14]);
		put_unaligned(6*52, (u16 *)&tape->caps[16]);
L
Linus Torvalds 已提交
2243 2244
		return;
	}
2245
	caps = pc.buf + 4 + pc.buf[3];
2246 2247

	/* convert to host order and save for later use */
2248 2249
	speed = be16_to_cpup((__be16 *)&caps[14]);
	max_speed = be16_to_cpup((__be16 *)&caps[8]);
L
Linus Torvalds 已提交
2250

2251 2252 2253 2254
	*(u16 *)&caps[8] = max_speed;
	*(u16 *)&caps[12] = be16_to_cpup((__be16 *)&caps[12]);
	*(u16 *)&caps[14] = speed;
	*(u16 *)&caps[16] = be16_to_cpup((__be16 *)&caps[16]);
L
Linus Torvalds 已提交
2255

2256 2257 2258
	if (!speed) {
		printk(KERN_INFO "ide-tape: %s: invalid tape speed "
				"(assuming 650KB/sec)\n", drive->name);
2259
		*(u16 *)&caps[14] = 650;
L
Linus Torvalds 已提交
2260
	}
2261 2262 2263
	if (!max_speed) {
		printk(KERN_INFO "ide-tape: %s: invalid max_speed "
				"(assuming 650KB/sec)\n", drive->name);
2264
		*(u16 *)&caps[8] = 650;
L
Linus Torvalds 已提交
2265 2266
	}

2267 2268
	memcpy(&tape->caps, caps, 20);
	if (caps[7] & 0x02)
2269
		tape->blk_size = 512;
2270
	else if (caps[7] & 0x04)
2271
		tape->blk_size = 1024;
L
Linus Torvalds 已提交
2272 2273
}

2274
#ifdef CONFIG_IDE_PROC_FS
2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287 2288 2289 2290 2291 2292 2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318 2319 2320 2321 2322 2323 2324
#define ide_tape_devset_get(name, field) \
static int get_##name(ide_drive_t *drive) \
{ \
	idetape_tape_t *tape = drive->driver_data; \
	return tape->field; \
}

#define ide_tape_devset_set(name, field) \
static int set_##name(ide_drive_t *drive, int arg) \
{ \
	idetape_tape_t *tape = drive->driver_data; \
	tape->field = arg; \
	return 0; \
}

#define ide_tape_devset_rw(_name, _min, _max, _field, _mulf, _divf) \
ide_tape_devset_get(_name, _field) \
ide_tape_devset_set(_name, _field) \
__IDE_DEVSET(_name, S_RW, _min, _max, get_##_name, set_##_name, _mulf, _divf)

#define ide_tape_devset_r(_name, _min, _max, _field, _mulf, _divf) \
ide_tape_devset_get(_name, _field) \
__IDE_DEVSET(_name, S_READ, _min, _max, get_##_name, NULL, _mulf, _divf)

static int mulf_tdsc(ide_drive_t *drive)	{ return 1000; }
static int divf_tdsc(ide_drive_t *drive)	{ return   HZ; }
static int divf_buffer(ide_drive_t *drive)	{ return    2; }
static int divf_buffer_size(ide_drive_t *drive)	{ return 1024; }

ide_devset_rw(dsc_overlap,	0,	1, dsc_overlap);

ide_tape_devset_rw(debug_mask,	0, 0xffff, debug_mask,  NULL, NULL);
ide_tape_devset_rw(tdsc, IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX,
		   best_dsc_rw_freq, mulf_tdsc, divf_tdsc);

ide_tape_devset_r(avg_speed,	0, 0xffff, avg_speed,   NULL, NULL);
ide_tape_devset_r(speed,	0, 0xffff, caps[14],    NULL, NULL);
ide_tape_devset_r(buffer,	0, 0xffff, caps[16],    NULL, divf_buffer);
ide_tape_devset_r(buffer_size,	0, 0xffff, buffer_size, NULL, divf_buffer_size);

static const struct ide_devset *idetape_settings[] = {
	&ide_devset_avg_speed,
	&ide_devset_buffer,
	&ide_devset_buffer_size,
	&ide_devset_debug_mask,
	&ide_devset_dsc_overlap,
	&ide_devset_speed,
	&ide_devset_tdsc,
	NULL
};
2325
#endif
L
Linus Torvalds 已提交
2326 2327

/*
2328
 * The function below is called to:
L
Linus Torvalds 已提交
2329
 *
2330 2331 2332 2333
 * 1. Initialize our various state variables.
 * 2. Ask the tape for its capabilities.
 * 3. Allocate a buffer which will be used for data transfer. The buffer size
 * is chosen based on the recommendation which we received in step 2.
L
Linus Torvalds 已提交
2334
 *
2335 2336
 * Note that at this point ide.c already assigned us an irq, so that we can
 * queue requests here and wait for their completion.
L
Linus Torvalds 已提交
2337
 */
2338
static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
L
Linus Torvalds 已提交
2339
{
2340
	unsigned long t;
L
Linus Torvalds 已提交
2341
	int speed;
2342
	int buffer_size;
2343
	u8 gcw[2];
2344
	u16 *ctl = (u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
2345

2346 2347
	drive->pc_callback = ide_tape_callback;

2348
	spin_lock_init(&tape->lock);
L
Linus Torvalds 已提交
2349
	drive->dsc_overlap = 1;
2350 2351 2352 2353
	if (drive->hwif->host_flags & IDE_HFLAG_NO_DSC) {
		printk(KERN_INFO "ide-tape: %s: disabling DSC overlap\n",
				 tape->name);
		drive->dsc_overlap = 0;
L
Linus Torvalds 已提交
2354 2355
	}
	/* Seagate Travan drives do not support DSC overlap. */
2356
	if (strstr((char *)&drive->id[ATA_ID_PROD], "Seagate STT3401"))
L
Linus Torvalds 已提交
2357 2358 2359 2360 2361
		drive->dsc_overlap = 0;
	tape->minor = minor;
	tape->name[0] = 'h';
	tape->name[1] = 't';
	tape->name[2] = '0' + minor;
2362
	tape->chrdev_dir = IDETAPE_DIR_NONE;
2363 2364

	*((u16 *)&gcw) = drive->id[ATA_ID_CONFIG];
2365 2366 2367

	/* Command packet DRQ type */
	if (((gcw[0] & 0x60) >> 5) == 1)
2368
		set_bit(IDE_AFLAG_DRQ_INTERRUPT, &drive->atapi_flags);
L
Linus Torvalds 已提交
2369 2370 2371

	idetape_get_inquiry_results(drive);
	idetape_get_mode_sense_results(drive);
2372
	ide_tape_get_bsize_from_bdesc(drive);
L
Linus Torvalds 已提交
2373
	tape->user_bs_factor = 1;
2374 2375
	tape->buffer_size = *ctl * tape->blk_size;
	while (tape->buffer_size > 0xffff) {
L
Linus Torvalds 已提交
2376
		printk(KERN_NOTICE "ide-tape: decreasing stage size\n");
2377
		*ctl /= 2;
2378
		tape->buffer_size = *ctl * tape->blk_size;
L
Linus Torvalds 已提交
2379
	}
2380
	buffer_size = tape->buffer_size;
2381
	tape->pages_per_buffer = buffer_size / PAGE_SIZE;
2382
	if (buffer_size % PAGE_SIZE) {
2383
		tape->pages_per_buffer++;
2384
		tape->excess_bh_size = PAGE_SIZE - buffer_size % PAGE_SIZE;
L
Linus Torvalds 已提交
2385 2386
	}

2387
	/* select the "best" DSC read/write polling freq */
2388
	speed = max(*(u16 *)&tape->caps[14], *(u16 *)&tape->caps[8]);
L
Linus Torvalds 已提交
2389

2390
	t = (IDETAPE_FIFO_THRESHOLD * tape->buffer_size * HZ) / (speed * 1000);
L
Linus Torvalds 已提交
2391 2392

	/*
2393 2394
	 * Ensure that the number we got makes sense; limit it within
	 * IDETAPE_DSC_RW_MIN and IDETAPE_DSC_RW_MAX.
L
Linus Torvalds 已提交
2395
	 */
2396 2397
	tape->best_dsc_rw_freq = clamp_t(unsigned long, t, IDETAPE_DSC_RW_MIN,
					 IDETAPE_DSC_RW_MAX);
L
Linus Torvalds 已提交
2398
	printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, "
2399
		"%lums tDSC%s\n",
2400
		drive->name, tape->name, *(u16 *)&tape->caps[14],
2401 2402
		(*(u16 *)&tape->caps[16] * 512) / tape->buffer_size,
		tape->buffer_size / 1024,
2403
		tape->best_dsc_rw_freq * 1000 / HZ,
L
Linus Torvalds 已提交
2404 2405
		drive->using_dma ? ", DMA":"");

2406
	ide_proc_register_driver(drive, tape->driver);
L
Linus Torvalds 已提交
2407 2408
}

2409
static void ide_tape_remove(ide_drive_t *drive)
L
Linus Torvalds 已提交
2410 2411 2412
{
	idetape_tape_t *tape = drive->driver_data;

2413
	ide_proc_unregister_driver(drive, tape->driver);
L
Linus Torvalds 已提交
2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425

	ide_unregister_region(tape->disk);

	ide_tape_put(tape);
}

static void ide_tape_release(struct kref *kref)
{
	struct ide_tape_obj *tape = to_ide_tape(kref);
	ide_drive_t *drive = tape->drive;
	struct gendisk *g = tape->disk;

2426
	BUG_ON(tape->merge_bh_size);
2427

L
Linus Torvalds 已提交
2428 2429
	drive->dsc_overlap = 0;
	drive->driver_data = NULL;
2430
	device_destroy(idetape_sysfs_class, MKDEV(IDETAPE_MAJOR, tape->minor));
2431 2432
	device_destroy(idetape_sysfs_class,
			MKDEV(IDETAPE_MAJOR, tape->minor + 128));
L
Linus Torvalds 已提交
2433 2434 2435 2436 2437 2438
	idetape_devs[tape->minor] = NULL;
	g->private_data = NULL;
	put_disk(g);
	kfree(tape);
}

2439
#ifdef CONFIG_IDE_PROC_FS
L
Linus Torvalds 已提交
2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458
static int proc_idetape_read_name
	(char *page, char **start, off_t off, int count, int *eof, void *data)
{
	ide_drive_t	*drive = (ide_drive_t *) data;
	idetape_tape_t	*tape = drive->driver_data;
	char		*out = page;
	int		len;

	len = sprintf(out, "%s\n", tape->name);
	PROC_IDE_READ_RETURN(page, start, off, count, eof, len);
}

static ide_proc_entry_t idetape_proc[] = {
	{ "capacity",	S_IFREG|S_IRUGO,	proc_ide_read_capacity, NULL },
	{ "name",	S_IFREG|S_IRUGO,	proc_idetape_read_name,	NULL },
	{ NULL, 0, NULL, NULL }
};
#endif

2459
static int ide_tape_probe(ide_drive_t *);
L
Linus Torvalds 已提交
2460 2461

static ide_driver_t idetape_driver = {
2462
	.gen_driver = {
2463
		.owner		= THIS_MODULE,
2464 2465 2466
		.name		= "ide-tape",
		.bus		= &ide_bus_type,
	},
2467 2468
	.probe			= ide_tape_probe,
	.remove			= ide_tape_remove,
L
Linus Torvalds 已提交
2469 2470 2471 2472 2473
	.version		= IDETAPE_VERSION,
	.media			= ide_tape,
	.do_request		= idetape_do_request,
	.end_request		= idetape_end_request,
	.error			= __ide_error,
2474
#ifdef CONFIG_IDE_PROC_FS
L
Linus Torvalds 已提交
2475
	.proc			= idetape_proc,
2476
	.settings		= idetape_settings,
2477
#endif
L
Linus Torvalds 已提交
2478 2479
};

2480
/* Our character device supporting functions, passed to register_chrdev. */
2481
static const struct file_operations idetape_fops = {
L
Linus Torvalds 已提交
2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494
	.owner		= THIS_MODULE,
	.read		= idetape_chrdev_read,
	.write		= idetape_chrdev_write,
	.ioctl		= idetape_chrdev_ioctl,
	.open		= idetape_chrdev_open,
	.release	= idetape_chrdev_release,
};

static int idetape_open(struct inode *inode, struct file *filp)
{
	struct gendisk *disk = inode->i_bdev->bd_disk;
	struct ide_tape_obj *tape;

2495 2496
	tape = ide_tape_get(disk);
	if (!tape)
L
Linus Torvalds 已提交
2497 2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530
		return -ENXIO;

	return 0;
}

static int idetape_release(struct inode *inode, struct file *filp)
{
	struct gendisk *disk = inode->i_bdev->bd_disk;
	struct ide_tape_obj *tape = ide_tape_g(disk);

	ide_tape_put(tape);

	return 0;
}

static int idetape_ioctl(struct inode *inode, struct file *file,
			unsigned int cmd, unsigned long arg)
{
	struct block_device *bdev = inode->i_bdev;
	struct ide_tape_obj *tape = ide_tape_g(bdev->bd_disk);
	ide_drive_t *drive = tape->drive;
	int err = generic_ide_ioctl(drive, file, bdev, cmd, arg);
	if (err == -EINVAL)
		err = idetape_blkdev_ioctl(drive, cmd, arg);
	return err;
}

static struct block_device_operations idetape_block_ops = {
	.owner		= THIS_MODULE,
	.open		= idetape_open,
	.release	= idetape_release,
	.ioctl		= idetape_ioctl,
};

2531
static int ide_tape_probe(ide_drive_t *drive)
L
Linus Torvalds 已提交
2532 2533 2534 2535 2536 2537 2538
{
	idetape_tape_t *tape;
	struct gendisk *g;
	int minor;

	if (!strstr("ide-tape", drive->driver_req))
		goto failed;
2539

L
Linus Torvalds 已提交
2540 2541
	if (drive->media != ide_tape)
		goto failed;
2542

2543
	if (drive->id_read == 1 && !ide_check_atapi_device(drive, DRV_NAME)) {
2544 2545
		printk(KERN_ERR "ide-tape: %s: not supported by this version of"
				" the driver\n", drive->name);
L
Linus Torvalds 已提交
2546 2547
		goto failed;
	}
2548
	tape = kzalloc(sizeof(idetape_tape_t), GFP_KERNEL);
L
Linus Torvalds 已提交
2549
	if (tape == NULL) {
2550 2551
		printk(KERN_ERR "ide-tape: %s: Can't allocate a tape struct\n",
				drive->name);
L
Linus Torvalds 已提交
2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569 2570
		goto failed;
	}

	g = alloc_disk(1 << PARTN_BITS);
	if (!g)
		goto out_free_tape;

	ide_init_disk(g, drive);

	kref_init(&tape->kref);

	tape->drive = drive;
	tape->driver = &idetape_driver;
	tape->disk = g;

	g->private_data = &tape->driver;

	drive->driver_data = tape;

2571
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
2572 2573 2574
	for (minor = 0; idetape_devs[minor]; minor++)
		;
	idetape_devs[minor] = tape;
2575
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
2576 2577 2578

	idetape_setup(drive, tape, minor);

2579 2580 2581 2582 2583 2584
	device_create_drvdata(idetape_sysfs_class, &drive->gendev,
			      MKDEV(IDETAPE_MAJOR, minor), NULL,
			      "%s", tape->name);
	device_create_drvdata(idetape_sysfs_class, &drive->gendev,
			      MKDEV(IDETAPE_MAJOR, minor + 128), NULL,
			      "n%s", tape->name);
2585

L
Linus Torvalds 已提交
2586 2587 2588 2589
	g->fops = &idetape_block_ops;
	ide_register_region(g);

	return 0;
2590

L
Linus Torvalds 已提交
2591 2592 2593
out_free_tape:
	kfree(tape);
failed:
2594
	return -ENODEV;
L
Linus Torvalds 已提交
2595 2596
}

2597
static void __exit idetape_exit(void)
L
Linus Torvalds 已提交
2598
{
2599
	driver_unregister(&idetape_driver.gen_driver);
2600
	class_destroy(idetape_sysfs_class);
L
Linus Torvalds 已提交
2601 2602 2603
	unregister_chrdev(IDETAPE_MAJOR, "ht");
}

2604
static int __init idetape_init(void)
L
Linus Torvalds 已提交
2605
{
2606 2607 2608 2609 2610 2611 2612 2613 2614
	int error = 1;
	idetape_sysfs_class = class_create(THIS_MODULE, "ide_tape");
	if (IS_ERR(idetape_sysfs_class)) {
		idetape_sysfs_class = NULL;
		printk(KERN_ERR "Unable to create sysfs class for ide tapes\n");
		error = -EBUSY;
		goto out;
	}

L
Linus Torvalds 已提交
2615
	if (register_chrdev(IDETAPE_MAJOR, "ht", &idetape_fops)) {
2616 2617
		printk(KERN_ERR "ide-tape: Failed to register chrdev"
				" interface\n");
2618 2619
		error = -EBUSY;
		goto out_free_class;
L
Linus Torvalds 已提交
2620
	}
2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631 2632 2633

	error = driver_register(&idetape_driver.gen_driver);
	if (error)
		goto out_free_driver;

	return 0;

out_free_driver:
	driver_unregister(&idetape_driver.gen_driver);
out_free_class:
	class_destroy(idetape_sysfs_class);
out:
	return error;
L
Linus Torvalds 已提交
2634 2635
}

2636
MODULE_ALIAS("ide:*m-tape*");
L
Linus Torvalds 已提交
2637 2638 2639
module_init(idetape_init);
module_exit(idetape_exit);
MODULE_ALIAS_CHARDEV_MAJOR(IDETAPE_MAJOR);
2640 2641
MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
MODULE_LICENSE("GPL");