ide-tape.c 68.3 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
 */
#define IDETAPE_MAX_PC_RETRIES		3

/*
84 85 86 87
 * 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 已提交
88
 */
89
#define IDETAPE_FIFO_THRESHOLD		2
L
Linus Torvalds 已提交
90 91

/*
92
 * DSC polling parameters.
L
Linus Torvalds 已提交
93
 *
94 95
 * 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 已提交
96
 *
97 98 99 100 101
 * 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 已提交
102
 *
103 104 105 106 107 108 109 110
 * 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 已提交
111
 *
112 113
 * 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 已提交
114
 */
115 116

/* DSC timings. */
L
Linus Torvalds 已提交
117 118 119 120 121 122 123 124 125 126
#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 ***********************/

127 128 129 130 131 132
/* tape directions */
enum {
	IDETAPE_DIR_NONE  = (1 << 0),
	IDETAPE_DIR_READ  = (1 << 1),
	IDETAPE_DIR_WRITE = (1 << 2),
};
L
Linus Torvalds 已提交
133 134

struct idetape_bh {
135
	u32 b_size;
L
Linus Torvalds 已提交
136 137 138 139 140
	atomic_t b_count;
	struct idetape_bh *b_reqnext;
	char *b_data;
};

141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
/* 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

/* 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 已提交
164
/*
165 166
 * 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 已提交
167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182
 */
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 */
183
	struct ide_atapi_pc *pc;
L
Linus Torvalds 已提交
184
	/* Last failed packet command */
185
	struct ide_atapi_pc *failed_pc;
186 187
	/* used by REQ_IDETAPE_{READ,WRITE} requests */
	struct ide_atapi_pc queued_pc;
188

189
	struct ide_atapi_pc request_sense_pc;
190
	struct request request_sense_rq;
L
Linus Torvalds 已提交
191 192

	/*
193
	 * DSC polling variables.
L
Linus Torvalds 已提交
194
	 *
195 196 197
	 * 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
198
	 * data transfer) request in the device request queue.
L
Linus Torvalds 已提交
199 200 201 202 203 204 205
	 */
	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 */
206 207
	unsigned long best_dsc_rw_freq;
	unsigned long dsc_poll_freq;
L
Linus Torvalds 已提交
208 209
	unsigned long dsc_timeout;

210
	/* Read position information */
L
Linus Torvalds 已提交
211 212
	u8 partition;
	/* Current block */
213
	unsigned int first_frame;
L
Linus Torvalds 已提交
214

215
	/* Last error information */
L
Linus Torvalds 已提交
216 217
	u8 sense_key, asc, ascq;

218
	/* Character device operation */
L
Linus Torvalds 已提交
219 220 221 222
	unsigned int minor;
	/* device name */
	char name[4];
	/* Current character device data transfer direction */
223
	u8 chrdev_dir;
L
Linus Torvalds 已提交
224

225 226
	/* tape block size, usually 512 or 1024 bytes */
	unsigned short blk_size;
L
Linus Torvalds 已提交
227
	int user_bs_factor;
228

L
Linus Torvalds 已提交
229
	/* Copy of the tape's Capabilities and Mechanical Page */
230
	u8 caps[20];
L
Linus Torvalds 已提交
231 232

	/*
233
	 * Active data transfer request parameters.
L
Linus Torvalds 已提交
234
	 *
235 236 237
	 * 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 已提交
238
	 */
239

240
	/* Data buffer size chosen based on the tape's recommendation */
241
	int buffer_size;
242 243
	/* merge buffer */
	struct idetape_bh *merge_bh;
244 245
	/* size of the merge buffer */
	int merge_bh_size;
246
	/* pointer to current buffer head within the merge buffer */
L
Linus Torvalds 已提交
247 248 249
	struct idetape_bh *bh;
	char *b_data;
	int b_count;
250

251
	int pages_per_buffer;
L
Linus Torvalds 已提交
252 253 254 255
	/* Wasted space in each stage */
	int excess_bh_size;

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

258
	/* Measures average tape speed */
L
Linus Torvalds 已提交
259 260 261 262 263 264 265 266 267 268 269
	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;

270
	u32 debug_mask;
L
Linus Torvalds 已提交
271 272
} idetape_tape_t;

273
static DEFINE_MUTEX(idetape_ref_mutex);
L
Linus Torvalds 已提交
274

275 276
static struct class *idetape_sysfs_class;

L
Linus Torvalds 已提交
277 278 279 280 281
#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)

282 283
static void ide_tape_release(struct kref *);

L
Linus Torvalds 已提交
284 285 286 287
static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
{
	struct ide_tape_obj *tape = NULL;

288
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
289
	tape = ide_tape_g(disk);
290
	if (tape) {
291
		if (ide_device_get(tape->drive))
292
			tape = NULL;
293 294
		else
			kref_get(&tape->kref);
295
	}
296
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
297 298 299 300 301
	return tape;
}

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

304
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
305
	kref_put(&tape->kref, ide_tape_release);
306
	ide_device_put(drive);
307
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
308 309 310
}

/*
311 312
 * The variables below are used for the character device interface. Additional
 * state variables are defined in our ide_drive_t structure.
L
Linus Torvalds 已提交
313
 */
314
static struct ide_tape_obj *idetape_devs[MAX_HWIFS * MAX_DRIVES];
L
Linus Torvalds 已提交
315 316 317 318 319 320 321

#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;

322
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
323 324 325
	tape = idetape_devs[i];
	if (tape)
		kref_get(&tape->kref);
326
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
327 328 329
	return tape;
}

330
static void idetape_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
331
				  unsigned int bcount)
L
Linus Torvalds 已提交
332 333 334 335 336 337 338 339
{
	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");
340
			ide_pad_transfer(drive, 0, bcount);
L
Linus Torvalds 已提交
341 342
			return;
		}
343 344 345
		count = min(
			(unsigned int)(bh->b_size - atomic_read(&bh->b_count)),
			bcount);
346
		drive->hwif->tp_ops->input_data(drive, NULL, bh->b_data +
347
					atomic_read(&bh->b_count), count);
L
Linus Torvalds 已提交
348 349 350 351 352 353 354 355 356 357 358
		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;
}

359
static void idetape_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
360
				   unsigned int bcount)
L
Linus Torvalds 已提交
361 362 363 364 365 366
{
	struct idetape_bh *bh = pc->bh;
	int count;

	while (bcount) {
		if (bh == NULL) {
367 368
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
L
Linus Torvalds 已提交
369 370 371
			return;
		}
		count = min((unsigned int)pc->b_count, (unsigned int)bcount);
372
		drive->hwif->tp_ops->output_data(drive, NULL, pc->b_data, count);
L
Linus Torvalds 已提交
373 374 375 376
		bcount -= count;
		pc->b_data += count;
		pc->b_count -= count;
		if (!pc->b_count) {
377 378
			bh = bh->b_reqnext;
			pc->bh = bh;
L
Linus Torvalds 已提交
379 380 381 382 383 384 385 386
			if (bh) {
				pc->b_data = bh->b_data;
				pc->b_count = atomic_read(&bh->b_count);
			}
		}
	}
}

387
static void idetape_update_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
388 389 390
{
	struct idetape_bh *bh = pc->bh;
	int count;
391
	unsigned int bcount = pc->xferred;
L
Linus Torvalds 已提交
392

393
	if (pc->flags & PC_FLAG_WRITING)
L
Linus Torvalds 已提交
394 395 396
		return;
	while (bcount) {
		if (bh == NULL) {
397 398
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
L
Linus Torvalds 已提交
399 400 401 402 403 404 405 406 407 408 409 410
			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;
}

/*
411 412
 * called on each failed packet command retry to analyze the request sense. We
 * currently do not utilize this information.
L
Linus Torvalds 已提交
413
 */
414
static void idetape_analyze_error(ide_drive_t *drive, u8 *sense)
L
Linus Torvalds 已提交
415 416
{
	idetape_tape_t *tape = drive->driver_data;
417
	struct ide_atapi_pc *pc = tape->failed_pc;
L
Linus Torvalds 已提交
418

419 420 421
	tape->sense_key = sense[2] & 0xF;
	tape->asc       = sense[12];
	tape->ascq      = sense[13];
422 423 424

	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 已提交
425

426
	/* Correct pc->xferred by asking the tape.	 */
427
	if (pc->flags & PC_FLAG_DMA_ERROR) {
428
		pc->xferred = pc->req_xfer -
429
			tape->blk_size *
430
			get_unaligned_be32(&sense[3]);
431
		idetape_update_buffers(drive, pc);
L
Linus Torvalds 已提交
432 433 434 435 436 437 438
	}

	/*
	 * 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.
	 */
439
	if ((pc->c[0] == READ_6 || pc->c[0] == WRITE_6)
440 441 442
	    /* length == 0 */
	    && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) {
		if (tape->sense_key == 5) {
L
Linus Torvalds 已提交
443 444 445
			/* don't report an error, everything's ok */
			pc->error = 0;
			/* don't retry read/write */
446
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
447 448
		}
	}
449
	if (pc->c[0] == READ_6 && (sense[2] & 0x80)) {
L
Linus Torvalds 已提交
450
		pc->error = IDETAPE_ERROR_FILEMARK;
451
		pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
452
	}
453
	if (pc->c[0] == WRITE_6) {
454 455
		if ((sense[2] & 0x40) || (tape->sense_key == 0xd
		     && tape->asc == 0x0 && tape->ascq == 0x2)) {
L
Linus Torvalds 已提交
456
			pc->error = IDETAPE_ERROR_EOD;
457
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
458 459
		}
	}
460
	if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
461
		if (tape->sense_key == 8) {
L
Linus Torvalds 已提交
462
			pc->error = IDETAPE_ERROR_EOD;
463
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
464
		}
465
		if (!(pc->flags & PC_FLAG_ABORT) &&
466
		    pc->xferred)
L
Linus Torvalds 已提交
467 468 469 470
			pc->retries = IDETAPE_MAX_PC_RETRIES + 1;
	}
}

471
/* Free data buffers completely. */
472
static void ide_tape_kfree_buffer(idetape_tape_t *tape)
L
Linus Torvalds 已提交
473
{
474
	struct idetape_bh *prev_bh, *bh = tape->merge_bh;
475 476 477 478 479 480 481 482 483 484 485 486

	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 已提交
487 488 489 490 491 492 493 494 495 496 497 498 499 500
		}
		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;

501
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
502 503

	switch (uptodate) {
504 505 506
	case 0:	error = IDETAPE_ERROR_GENERAL; break;
	case 1: error = 0; break;
	default: error = uptodate;
L
Linus Torvalds 已提交
507 508 509 510 511
	}
	rq->errors = error;
	if (error)
		tape->failed_pc = NULL;

512 513 514 515 516
	if (!blk_special_request(rq)) {
		ide_end_request(drive, uptodate, nr_sects);
		return 0;
	}

517
	spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
518 519 520

	ide_end_drive_cmd(drive, 0, 0);

521
	spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
522 523 524
	return 0;
}

525 526 527
static void ide_tape_handle_dsc(ide_drive_t *);

static void ide_tape_callback(ide_drive_t *drive, int dsc)
L
Linus Torvalds 已提交
528 529
{
	idetape_tape_t *tape = drive->driver_data;
530 531
	struct ide_atapi_pc *pc = tape->pc;
	int uptodate = pc->error ? 0 : 1;
L
Linus Torvalds 已提交
532

533 534
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

535 536 537
	if (dsc)
		ide_tape_handle_dsc(drive);

538 539 540
	if (tape->failed_pc == pc)
		tape->failed_pc = NULL;

541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
	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");
576
			clear_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
577 578 579
			uptodate = 0;
		} else {
			debug_log(DBG_SENSE, "Block Location - %u\n",
580
					be32_to_cpup((__be32 *)&readpos[4]));
581 582

			tape->partition = readpos[1];
583
			tape->first_frame = be32_to_cpup((__be32 *)&readpos[4]);
584
			set_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags);
585
		}
L
Linus Torvalds 已提交
586
	}
587 588

	idetape_end_request(drive, uptodate, 0);
L
Linus Torvalds 已提交
589 590
}

591
static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
592
{
593
	ide_init_pc(pc);
594
	pc->c[0] = REQUEST_SENSE;
L
Linus Torvalds 已提交
595
	pc->c[4] = 20;
596
	pc->req_xfer = 20;
L
Linus Torvalds 已提交
597 598 599 600 601 602 603
}

/*
 *	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.
 */
604
static void idetape_retry_pc(ide_drive_t *drive)
L
Linus Torvalds 已提交
605
{
606 607
	struct ide_tape_obj *tape = drive->driver_data;
	struct request *rq = &tape->request_sense_rq;
608
	struct ide_atapi_pc *pc = &tape->request_sense_pc;
L
Linus Torvalds 已提交
609

610
	(void)ide_read_error(drive);
L
Linus Torvalds 已提交
611
	idetape_create_request_sense_cmd(pc);
612
	set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
613
	ide_queue_pc_head(drive, tape->disk, pc, rq);
L
Linus Torvalds 已提交
614 615 616
}

/*
617 618
 * 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 已提交
619
 */
620
static void idetape_postpone_request(ide_drive_t *drive)
L
Linus Torvalds 已提交
621 622 623
{
	idetape_tape_t *tape = drive->driver_data;

624 625
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
626
	tape->postponed_rq = HWGROUP(drive)->rq;
627
	ide_stall_queue(drive, tape->dsc_poll_freq);
L
Linus Torvalds 已提交
628 629
}

630 631 632 633 634 635 636 637 638 639 640 641
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);
}

642
static int ide_tape_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
643 644 645 646 647 648
				unsigned int bcount, int write)
{
	if (write)
		idetape_output_buffers(drive, pc, bcount);
	else
		idetape_input_buffers(drive, pc, bcount);
649 650

	return bcount;
651
}
652

L
Linus Torvalds 已提交
653
/*
654 655 656 657
 * 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
658
 * idetape_issue_pc.
L
Linus Torvalds 已提交
659
 */
660
static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
L
Linus Torvalds 已提交
661 662 663
{
	idetape_tape_t *tape = drive->driver_data;

664
	return ide_pc_intr(drive, tape->pc, idetape_pc_intr, WAIT_TAPE_CMD,
665
			   NULL, idetape_update_buffers, idetape_retry_pc,
666
			   ide_tape_io_buffers);
L
Linus Torvalds 已提交
667 668 669
}

/*
670
 * Packet Command Interface
L
Linus Torvalds 已提交
671
 *
672 673 674
 * 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 已提交
675
 *
676
 * The handling will be done in three stages:
L
Linus Torvalds 已提交
677
 *
678 679
 * 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 已提交
680
 *
681 682
 * 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 已提交
683
 *
684 685 686 687 688 689 690
 * 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 已提交
691
 *
692 693
 * 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 已提交
694
 *
695
 * 4. When the packet command is finished, it will be checked for errors.
L
Linus Torvalds 已提交
696
 *
697 698 699
 * 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 已提交
700
 *
701 702 703
 * 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 已提交
704 705 706 707
 */
static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive)
{
	idetape_tape_t *tape = drive->driver_data;
708

709
	return ide_transfer_pc(drive, tape->pc, idetape_pc_intr,
710
			       WAIT_TAPE_CMD, NULL);
L
Linus Torvalds 已提交
711 712
}

713 714
static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
		struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
715 716 717
{
	idetape_tape_t *tape = drive->driver_data;

718 719
	if (tape->pc->c[0] == REQUEST_SENSE &&
	    pc->c[0] == REQUEST_SENSE) {
L
Linus Torvalds 已提交
720 721 722 723
		printk(KERN_ERR "ide-tape: possible ide-tape.c bug - "
			"Two request sense in serial were issued\n");
	}

724
	if (tape->failed_pc == NULL && pc->c[0] != REQUEST_SENSE)
L
Linus Torvalds 已提交
725 726 727 728 729
		tape->failed_pc = pc;
	/* Set the current packet command */
	tape->pc = pc;

	if (pc->retries > IDETAPE_MAX_PC_RETRIES ||
730
		(pc->flags & PC_FLAG_ABORT)) {
L
Linus Torvalds 已提交
731
		/*
732 733 734
		 * 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 已提交
735
		 */
736
		if (!(pc->flags & PC_FLAG_ABORT)) {
737
			if (!(pc->c[0] == TEST_UNIT_READY &&
L
Linus Torvalds 已提交
738 739 740 741 742 743 744 745 746 747 748 749 750
			      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;
751
		drive->pc_callback(drive, 0);
752
		return ide_stopped;
L
Linus Torvalds 已提交
753
	}
754
	debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]);
L
Linus Torvalds 已提交
755 756 757

	pc->retries++;

758
	return ide_issue_pc(drive, pc, idetape_transfer_pc,
759
			    WAIT_TAPE_CMD, NULL);
L
Linus Torvalds 已提交
760 761
}

762
/* A mode sense command is used to "sense" tape parameters. */
763
static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
L
Linus Torvalds 已提交
764
{
765
	ide_init_pc(pc);
766
	pc->c[0] = MODE_SENSE;
L
Linus Torvalds 已提交
767
	if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
768 769
		/* DBD = 1 - Don't return block descriptors */
		pc->c[1] = 8;
L
Linus Torvalds 已提交
770 771 772 773 774 775 776 777 778
	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;
779 780
	/* We will just discard data in that case */
	pc->c[4] = 255;
L
Linus Torvalds 已提交
781
	if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
782
		pc->req_xfer = 12;
L
Linus Torvalds 已提交
783
	else if (page_code == IDETAPE_CAPABILITIES_PAGE)
784
		pc->req_xfer = 24;
L
Linus Torvalds 已提交
785
	else
786
		pc->req_xfer = 50;
L
Linus Torvalds 已提交
787 788
}

789
static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
L
Linus Torvalds 已提交
790
{
791
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
792
	idetape_tape_t *tape = drive->driver_data;
793
	struct ide_atapi_pc *pc = tape->pc;
794
	u8 stat;
L
Linus Torvalds 已提交
795

796
	stat = hwif->tp_ops->read_status(hwif);
797

798 799
	if (stat & ATA_DSC) {
		if (stat & ATA_ERR) {
L
Linus Torvalds 已提交
800
			/* Error detected */
801
			if (pc->c[0] != TEST_UNIT_READY)
L
Linus Torvalds 已提交
802 803 804
				printk(KERN_ERR "ide-tape: %s: I/O error, ",
						tape->name);
			/* Retry operation */
805 806
			idetape_retry_pc(drive);
			return ide_stopped;
L
Linus Torvalds 已提交
807 808 809 810 811 812
		}
		pc->error = 0;
	} else {
		pc->error = IDETAPE_ERROR_GENERAL;
		tape->failed_pc = NULL;
	}
813
	drive->pc_callback(drive, 0);
L
Linus Torvalds 已提交
814 815 816
	return ide_stopped;
}

817
static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
818 819
				   struct ide_atapi_pc *pc, struct request *rq,
				   u8 opcode)
L
Linus Torvalds 已提交
820
{
821 822 823
	struct idetape_bh *bh = (struct idetape_bh *)rq->special;
	unsigned int length = rq->current_nr_sectors;

824
	ide_init_pc(pc);
825
	put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
L
Linus Torvalds 已提交
826 827
	pc->c[1] = 1;
	pc->bh = bh;
828 829 830
	pc->buf = NULL;
	pc->buf_size = length * tape->blk_size;
	pc->req_xfer = pc->buf_size;
831
	if (pc->req_xfer == tape->buffer_size)
832
		pc->flags |= PC_FLAG_DMA_OK;
L
Linus Torvalds 已提交
833

834 835 836 837 838 839 840 841 842
	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);
	}
843 844

	memcpy(rq->cmd, pc->c, 12);
L
Linus Torvalds 已提交
845 846 847 848 849
}

static ide_startstop_t idetape_do_request(ide_drive_t *drive,
					  struct request *rq, sector_t block)
{
850
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
851
	idetape_tape_t *tape = drive->driver_data;
852
	struct ide_atapi_pc *pc = NULL;
L
Linus Torvalds 已提交
853
	struct request *postponed_rq = tape->postponed_rq;
854
	u8 stat;
L
Linus Torvalds 已提交
855

856 857 858 859
	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 已提交
860

861
	if (!blk_special_request(rq)) {
862
		/* We do not support buffer cache originated requests. */
L
Linus Torvalds 已提交
863
		printk(KERN_NOTICE "ide-tape: %s: Unsupported request in "
864
			"request queue (%d)\n", drive->name, rq->cmd_type);
L
Linus Torvalds 已提交
865 866 867 868
		ide_end_request(drive, 0, 0);
		return ide_stopped;
	}

869
	/* Retry a failed packet command */
870 871 872 873
	if (tape->failed_pc && tape->pc->c[0] == REQUEST_SENSE) {
		pc = tape->failed_pc;
		goto out;
	}
874

L
Linus Torvalds 已提交
875 876 877 878 879 880 881 882 883 884 885 886 887 888
	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.
	 */
889
	stat = hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
890

891
	if (!drive->dsc_overlap && !(rq->cmd[13] & REQ_IDETAPE_PC2))
892
		set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
L
Linus Torvalds 已提交
893 894

	if (drive->post_reset == 1) {
895
		set_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags);
L
Linus Torvalds 已提交
896 897 898
		drive->post_reset = 0;
	}

899
	if (!test_and_clear_bit(IDE_AFLAG_IGNORE_DSC, &drive->atapi_flags) &&
900
	    (stat & ATA_DSC) == 0) {
L
Linus Torvalds 已提交
901 902
		if (postponed_rq == NULL) {
			tape->dsc_polling_start = jiffies;
903
			tape->dsc_poll_freq = tape->best_dsc_rw_freq;
L
Linus Torvalds 已提交
904 905 906 907
			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);
908
			if (rq->cmd[13] & REQ_IDETAPE_PC2) {
L
Linus Torvalds 已提交
909 910 911 912 913
				idetape_media_access_finished(drive);
				return ide_stopped;
			} else {
				return ide_do_reset(drive);
			}
914 915 916
		} else if (time_after(jiffies,
					tape->dsc_polling_start +
					IDETAPE_DSC_MA_THRESHOLD))
917
			tape->dsc_poll_freq = IDETAPE_DSC_MA_SLOW;
L
Linus Torvalds 已提交
918 919 920
		idetape_postpone_request(drive);
		return ide_stopped;
	}
921
	if (rq->cmd[13] & REQ_IDETAPE_READ) {
922
		pc = &tape->queued_pc;
923
		ide_tape_create_rw_cmd(tape, pc, rq, READ_6);
L
Linus Torvalds 已提交
924 925
		goto out;
	}
926
	if (rq->cmd[13] & REQ_IDETAPE_WRITE) {
927
		pc = &tape->queued_pc;
928
		ide_tape_create_rw_cmd(tape, pc, rq, WRITE_6);
L
Linus Torvalds 已提交
929 930
		goto out;
	}
931
	if (rq->cmd[13] & REQ_IDETAPE_PC1) {
932
		pc = (struct ide_atapi_pc *) rq->buffer;
933 934
		rq->cmd[13] &= ~(REQ_IDETAPE_PC1);
		rq->cmd[13] |= REQ_IDETAPE_PC2;
L
Linus Torvalds 已提交
935 936
		goto out;
	}
937
	if (rq->cmd[13] & REQ_IDETAPE_PC2) {
L
Linus Torvalds 已提交
938 939 940 941
		idetape_media_access_finished(drive);
		return ide_stopped;
	}
	BUG();
942

943
out:
944
	return idetape_issue_pc(drive, pc);
L
Linus Torvalds 已提交
945 946 947
}

/*
948
 * The function below uses __get_free_pages to allocate a data buffer of size
949
 * tape->buffer_size (or a bit more). We attempt to combine sequential pages as
950
 * much as possible.
L
Linus Torvalds 已提交
951
 *
952 953
 * It returns a pointer to the newly allocated buffer, or NULL in case of
 * failure.
L
Linus Torvalds 已提交
954
 */
955 956
static struct idetape_bh *ide_tape_kmalloc_buffer(idetape_tape_t *tape,
						  int full, int clear)
L
Linus Torvalds 已提交
957
{
958
	struct idetape_bh *prev_bh, *bh, *merge_bh;
959
	int pages = tape->pages_per_buffer;
960
	unsigned int order, b_allocd;
L
Linus Torvalds 已提交
961 962
	char *b_data = NULL;

963 964
	merge_bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
	bh = merge_bh;
L
Linus Torvalds 已提交
965 966
	if (bh == NULL)
		goto abort;
967 968 969

	order = fls(pages) - 1;
	bh->b_data = (char *) __get_free_pages(GFP_KERNEL, order);
970
	if (!bh->b_data)
L
Linus Torvalds 已提交
971
		goto abort;
972 973 974
	b_allocd = (1 << order) * PAGE_SIZE;
	pages &= (order-1);

L
Linus Torvalds 已提交
975
	if (clear)
976 977 978
		memset(bh->b_data, 0, b_allocd);
	bh->b_reqnext = NULL;
	bh->b_size = b_allocd;
L
Linus Torvalds 已提交
979 980
	atomic_set(&bh->b_count, full ? bh->b_size : 0);

981 982 983
	while (pages) {
		order = fls(pages) - 1;
		b_data = (char *) __get_free_pages(GFP_KERNEL, order);
984
		if (!b_data)
L
Linus Torvalds 已提交
985
			goto abort;
986 987
		b_allocd = (1 << order) * PAGE_SIZE;

L
Linus Torvalds 已提交
988
		if (clear)
989 990 991 992 993 994
			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 已提交
995
			if (full)
996
				atomic_add(b_allocd, &bh->b_count);
L
Linus Torvalds 已提交
997 998
			continue;
		}
999
		/* they are above the header */
L
Linus Torvalds 已提交
1000
		if (b_data == bh->b_data + bh->b_size) {
1001
			bh->b_size += b_allocd;
L
Linus Torvalds 已提交
1002
			if (full)
1003
				atomic_add(b_allocd, &bh->b_count);
L
Linus Torvalds 已提交
1004 1005 1006
			continue;
		}
		prev_bh = bh;
1007 1008
		bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
		if (!bh) {
1009
			free_pages((unsigned long) b_data, order);
L
Linus Torvalds 已提交
1010 1011 1012 1013
			goto abort;
		}
		bh->b_reqnext = NULL;
		bh->b_data = b_data;
1014
		bh->b_size = b_allocd;
L
Linus Torvalds 已提交
1015 1016
		atomic_set(&bh->b_count, full ? bh->b_size : 0);
		prev_bh->b_reqnext = bh;
1017 1018

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

L
Linus Torvalds 已提交
1021 1022 1023
	bh->b_size -= tape->excess_bh_size;
	if (full)
		atomic_sub(tape->excess_bh_size, &bh->b_count);
1024
	return merge_bh;
L
Linus Torvalds 已提交
1025
abort:
1026
	ide_tape_kfree_buffer(tape);
L
Linus Torvalds 已提交
1027 1028 1029
	return NULL;
}

1030
static int idetape_copy_stage_from_user(idetape_tape_t *tape,
1031
					const char __user *buf, int n)
L
Linus Torvalds 已提交
1032 1033 1034
{
	struct idetape_bh *bh = tape->bh;
	int count;
1035
	int ret = 0;
L
Linus Torvalds 已提交
1036 1037 1038

	while (n) {
		if (bh == NULL) {
1039 1040
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
1041
			return 1;
L
Linus Torvalds 已提交
1042
		}
1043 1044 1045 1046 1047
		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))
1048
			ret = 1;
L
Linus Torvalds 已提交
1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
		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;
1059
	return ret;
L
Linus Torvalds 已提交
1060 1061
}

1062
static int idetape_copy_stage_to_user(idetape_tape_t *tape, char __user *buf,
1063
				      int n)
L
Linus Torvalds 已提交
1064 1065 1066
{
	struct idetape_bh *bh = tape->bh;
	int count;
1067
	int ret = 0;
L
Linus Torvalds 已提交
1068 1069 1070

	while (n) {
		if (bh == NULL) {
1071 1072
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
1073
			return 1;
L
Linus Torvalds 已提交
1074 1075
		}
		count = min(tape->b_count, n);
1076 1077
		if  (copy_to_user(buf, tape->b_data, count))
			ret = 1;
L
Linus Torvalds 已提交
1078 1079 1080 1081 1082
		n -= count;
		tape->b_data += count;
		tape->b_count -= count;
		buf += count;
		if (!tape->b_count) {
1083 1084
			bh = bh->b_reqnext;
			tape->bh = bh;
L
Linus Torvalds 已提交
1085 1086 1087 1088 1089 1090
			if (bh) {
				tape->b_data = bh->b_data;
				tape->b_count = atomic_read(&bh->b_count);
			}
		}
	}
1091
	return ret;
L
Linus Torvalds 已提交
1092 1093
}

1094
static void idetape_init_merge_buffer(idetape_tape_t *tape)
L
Linus Torvalds 已提交
1095
{
1096 1097
	struct idetape_bh *bh = tape->merge_bh;
	tape->bh = tape->merge_bh;
1098

1099
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
L
Linus Torvalds 已提交
1100 1101 1102 1103 1104 1105 1106 1107
		atomic_set(&bh->b_count, 0);
	else {
		tape->b_data = bh->b_data;
		tape->b_count = atomic_read(&bh->b_count);
	}
}

/*
1108 1109
 * Write a filemark if write_filemark=1. Flush the device buffers without
 * writing a filemark otherwise.
L
Linus Torvalds 已提交
1110
 */
1111
static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
1112
		struct ide_atapi_pc *pc, int write_filemark)
L
Linus Torvalds 已提交
1113
{
1114
	ide_init_pc(pc);
1115
	pc->c[0] = WRITE_FILEMARKS;
L
Linus Torvalds 已提交
1116
	pc->c[4] = write_filemark;
1117
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1118 1119 1120 1121 1122
}

static int idetape_wait_ready(ide_drive_t *drive, unsigned long timeout)
{
	idetape_tape_t *tape = drive->driver_data;
1123
	struct gendisk *disk = tape->disk;
L
Linus Torvalds 已提交
1124 1125
	int load_attempted = 0;

1126
	/* Wait for the tape to become ready */
1127
	set_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
L
Linus Torvalds 已提交
1128 1129
	timeout += jiffies;
	while (time_before(jiffies, timeout)) {
1130
		if (ide_do_test_unit_ready(drive, disk) == 0)
L
Linus Torvalds 已提交
1131 1132
			return 0;
		if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
1133 1134
		    || (tape->asc == 0x3A)) {
			/* no media */
L
Linus Torvalds 已提交
1135 1136
			if (load_attempted)
				return -ENOMEDIUM;
1137
			ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK);
L
Linus Torvalds 已提交
1138 1139 1140 1141 1142
			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;
1143
		msleep(100);
L
Linus Torvalds 已提交
1144 1145 1146 1147
	}
	return -EIO;
}

1148
static int idetape_flush_tape_buffers(ide_drive_t *drive)
L
Linus Torvalds 已提交
1149
{
1150
	struct ide_tape_obj *tape = drive->driver_data;
1151
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1152 1153 1154
	int rc;

	idetape_create_write_filemark_cmd(drive, &pc, 0);
1155
	rc = ide_queue_pc_tail(drive, tape->disk, &pc);
1156
	if (rc)
L
Linus Torvalds 已提交
1157 1158 1159 1160 1161
		return rc;
	idetape_wait_ready(drive, 60 * 5 * HZ);
	return 0;
}

1162
static void idetape_create_read_position_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1163
{
1164
	ide_init_pc(pc);
1165
	pc->c[0] = READ_POSITION;
1166
	pc->req_xfer = 20;
L
Linus Torvalds 已提交
1167 1168
}

1169
static int idetape_read_position(ide_drive_t *drive)
L
Linus Torvalds 已提交
1170 1171
{
	idetape_tape_t *tape = drive->driver_data;
1172
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1173 1174
	int position;

1175
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1176 1177

	idetape_create_read_position_cmd(&pc);
1178
	if (ide_queue_pc_tail(drive, tape->disk, &pc))
L
Linus Torvalds 已提交
1179
		return -1;
1180
	position = tape->first_frame;
L
Linus Torvalds 已提交
1181 1182 1183
	return position;
}

1184 1185
static void idetape_create_locate_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc,
1186
		unsigned int block, u8 partition, int skip)
L
Linus Torvalds 已提交
1187
{
1188
	ide_init_pc(pc);
1189
	pc->c[0] = POSITION_TO_ELEMENT;
L
Linus Torvalds 已提交
1190
	pc->c[1] = 2;
1191
	put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[3]);
L
Linus Torvalds 已提交
1192
	pc->c[8] = partition;
1193
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1194 1195
}

1196
static void __ide_tape_discard_merge_buffer(ide_drive_t *drive)
L
Linus Torvalds 已提交
1197 1198 1199
{
	idetape_tape_t *tape = drive->driver_data;

1200
	if (tape->chrdev_dir != IDETAPE_DIR_READ)
1201
		return;
L
Linus Torvalds 已提交
1202

1203
	clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags);
1204
	tape->merge_bh_size = 0;
1205 1206 1207
	if (tape->merge_bh != NULL) {
		ide_tape_kfree_buffer(tape);
		tape->merge_bh = NULL;
L
Linus Torvalds 已提交
1208 1209
	}

1210
	tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1211 1212 1213
}

/*
1214 1215 1216 1217
 * 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 已提交
1218
 */
1219 1220
static int idetape_position_tape(ide_drive_t *drive, unsigned int block,
		u8 partition, int skip)
L
Linus Torvalds 已提交
1221 1222
{
	idetape_tape_t *tape = drive->driver_data;
1223
	struct gendisk *disk = tape->disk;
L
Linus Torvalds 已提交
1224
	int retval;
1225
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1226

1227
	if (tape->chrdev_dir == IDETAPE_DIR_READ)
1228
		__ide_tape_discard_merge_buffer(drive);
L
Linus Torvalds 已提交
1229 1230
	idetape_wait_ready(drive, 60 * 5 * HZ);
	idetape_create_locate_cmd(drive, &pc, block, partition, skip);
1231
	retval = ide_queue_pc_tail(drive, disk, &pc);
L
Linus Torvalds 已提交
1232 1233 1234 1235
	if (retval)
		return (retval);

	idetape_create_read_position_cmd(&pc);
1236
	return ide_queue_pc_tail(drive, disk, &pc);
L
Linus Torvalds 已提交
1237 1238
}

1239
static void ide_tape_discard_merge_buffer(ide_drive_t *drive,
1240
					  int restore_position)
L
Linus Torvalds 已提交
1241 1242 1243 1244
{
	idetape_tape_t *tape = drive->driver_data;
	int seek, position;

1245
	__ide_tape_discard_merge_buffer(drive);
L
Linus Torvalds 已提交
1246 1247
	if (restore_position) {
		position = idetape_read_position(drive);
1248
		seek = position > 0 ? position : 0;
L
Linus Torvalds 已提交
1249
		if (idetape_position_tape(drive, seek, 0, 0)) {
1250
			printk(KERN_INFO "ide-tape: %s: position_tape failed in"
1251
					 " %s\n", tape->name, __func__);
L
Linus Torvalds 已提交
1252 1253 1254 1255 1256 1257
			return;
		}
	}
}

/*
1258 1259
 * Generate a read/write request for the block device interface and wait for it
 * to be serviced.
L
Linus Torvalds 已提交
1260
 */
1261 1262
static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
				 struct idetape_bh *bh)
L
Linus Torvalds 已提交
1263 1264
{
	idetape_tape_t *tape = drive->driver_data;
1265 1266
	struct request *rq;
	int ret, errors;
L
Linus Torvalds 已提交
1267

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

1270 1271
	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
	rq->cmd_type = REQ_TYPE_SPECIAL;
1272
	rq->cmd[13] = cmd;
1273 1274 1275 1276 1277 1278 1279 1280 1281 1282
	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 已提交
1283 1284 1285 1286

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

1287 1288
	if (tape->merge_bh)
		idetape_init_merge_buffer(tape);
1289
	if (errors == IDETAPE_ERROR_GENERAL)
L
Linus Torvalds 已提交
1290
		return -EIO;
1291
	return ret;
L
Linus Torvalds 已提交
1292 1293
}

1294
static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1295
{
1296
	ide_init_pc(pc);
1297
	pc->c[0] = INQUIRY;
1298
	pc->c[4] = 254;
1299
	pc->req_xfer = 254;
L
Linus Torvalds 已提交
1300 1301
}

1302 1303
static void idetape_create_rewind_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1304
{
1305
	ide_init_pc(pc);
1306
	pc->c[0] = REZERO_UNIT;
1307
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1308 1309
}

1310
static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1311
{
1312
	ide_init_pc(pc);
1313
	pc->c[0] = ERASE;
L
Linus Torvalds 已提交
1314
	pc->c[1] = 1;
1315
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1316 1317
}

1318
static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
L
Linus Torvalds 已提交
1319
{
1320
	ide_init_pc(pc);
1321
	pc->c[0] = SPACE;
1322
	put_unaligned(cpu_to_be32(count), (unsigned int *) &pc->c[1]);
L
Linus Torvalds 已提交
1323
	pc->c[1] = cmd;
1324
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
L
Linus Torvalds 已提交
1325 1326
}

1327
/* Queue up a character device originated write request. */
1328
static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
L
Linus Torvalds 已提交
1329 1330 1331
{
	idetape_tape_t *tape = drive->driver_data;

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

1334
	return idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE,
1335
				     blocks, tape->merge_bh);
L
Linus Torvalds 已提交
1336 1337
}

1338
static void ide_tape_flush_merge_buffer(ide_drive_t *drive)
L
Linus Torvalds 已提交
1339 1340 1341 1342
{
	idetape_tape_t *tape = drive->driver_data;
	int blocks, min;
	struct idetape_bh *bh;
1343

1344
	if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
1345
		printk(KERN_ERR "ide-tape: bug: Trying to empty merge buffer"
1346
				" but we are not writing.\n");
L
Linus Torvalds 已提交
1347 1348
		return;
	}
1349
	if (tape->merge_bh_size > tape->buffer_size) {
L
Linus Torvalds 已提交
1350
		printk(KERN_ERR "ide-tape: bug: merge_buffer too big\n");
1351
		tape->merge_bh_size = tape->buffer_size;
L
Linus Torvalds 已提交
1352
	}
1353 1354 1355
	if (tape->merge_bh_size) {
		blocks = tape->merge_bh_size / tape->blk_size;
		if (tape->merge_bh_size % tape->blk_size) {
L
Linus Torvalds 已提交
1356 1357 1358
			unsigned int i;

			blocks++;
1359
			i = tape->blk_size - tape->merge_bh_size %
1360
				tape->blk_size;
L
Linus Torvalds 已提交
1361 1362 1363 1364 1365 1366 1367 1368
			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) {
1369 1370
					printk(KERN_INFO "ide-tape: bug,"
							 " bh NULL\n");
L
Linus Torvalds 已提交
1371 1372
					break;
				}
1373 1374 1375 1376
				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 已提交
1377 1378 1379 1380 1381 1382
				atomic_add(min, &bh->b_count);
				i -= min;
				bh = bh->b_reqnext;
			}
		}
		(void) idetape_add_chrdev_write_request(drive, blocks);
1383
		tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1384
	}
1385 1386 1387
	if (tape->merge_bh != NULL) {
		ide_tape_kfree_buffer(tape);
		tape->merge_bh = NULL;
L
Linus Torvalds 已提交
1388
	}
1389
	tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1390 1391
}

1392
static int idetape_init_read(ide_drive_t *drive)
L
Linus Torvalds 已提交
1393 1394 1395 1396 1397
{
	idetape_tape_t *tape = drive->driver_data;
	int bytes_read;

	/* Initialize read operation */
1398 1399
	if (tape->chrdev_dir != IDETAPE_DIR_READ) {
		if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
1400
			ide_tape_flush_merge_buffer(drive);
L
Linus Torvalds 已提交
1401 1402
			idetape_flush_tape_buffers(drive);
		}
1403
		if (tape->merge_bh || tape->merge_bh_size) {
1404
			printk(KERN_ERR "ide-tape: merge_bh_size should be"
1405
					 " 0 now\n");
1406
			tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1407
		}
1408 1409
		tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0);
		if (!tape->merge_bh)
L
Linus Torvalds 已提交
1410
			return -ENOMEM;
1411
		tape->chrdev_dir = IDETAPE_DIR_READ;
L
Linus Torvalds 已提交
1412 1413

		/*
1414 1415 1416 1417
		 * 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 已提交
1418 1419
		 */
		if (drive->dsc_overlap) {
1420 1421
			bytes_read = idetape_queue_rw_tail(drive,
							REQ_IDETAPE_READ, 0,
1422
							tape->merge_bh);
L
Linus Torvalds 已提交
1423
			if (bytes_read < 0) {
1424 1425
				ide_tape_kfree_buffer(tape);
				tape->merge_bh = NULL;
1426
				tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1427 1428 1429 1430
				return bytes_read;
			}
		}
	}
1431

L
Linus Torvalds 已提交
1432 1433 1434
	return 0;
}

1435
/* called from idetape_chrdev_read() to service a chrdev read request. */
1436
static int idetape_add_chrdev_read_request(ide_drive_t *drive, int blocks)
L
Linus Torvalds 已提交
1437 1438 1439
{
	idetape_tape_t *tape = drive->driver_data;

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

1442
	/* If we are at a filemark, return a read length of 0 */
1443
	if (test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
L
Linus Torvalds 已提交
1444 1445
		return 0;

1446
	idetape_init_read(drive);
1447 1448

	return idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, blocks,
1449
				     tape->merge_bh);
L
Linus Torvalds 已提交
1450 1451
}

1452
static void idetape_pad_zeros(ide_drive_t *drive, int bcount)
L
Linus Torvalds 已提交
1453 1454 1455 1456
{
	idetape_tape_t *tape = drive->driver_data;
	struct idetape_bh *bh;
	int blocks;
1457

L
Linus Torvalds 已提交
1458 1459 1460
	while (bcount) {
		unsigned int count;

1461
		bh = tape->merge_bh;
1462
		count = min(tape->buffer_size, bcount);
L
Linus Torvalds 已提交
1463
		bcount -= count;
1464
		blocks = count / tape->blk_size;
L
Linus Torvalds 已提交
1465
		while (count) {
1466 1467
			atomic_set(&bh->b_count,
				   min(count, (unsigned int)bh->b_size));
L
Linus Torvalds 已提交
1468 1469 1470 1471
			memset(bh->b_data, 0, atomic_read(&bh->b_count));
			count -= atomic_read(&bh->b_count);
			bh = bh->b_reqnext;
		}
1472
		idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, blocks,
1473
				      tape->merge_bh);
L
Linus Torvalds 已提交
1474 1475 1476 1477
	}
}

/*
1478 1479 1480
 * Rewinds the tape to the Beginning Of the current Partition (BOP). We
 * currently support only one partition.
 */
1481
static int idetape_rewind_tape(ide_drive_t *drive)
L
Linus Torvalds 已提交
1482
{
1483 1484
	struct ide_tape_obj *tape = drive->driver_data;
	struct gendisk *disk = tape->disk;
L
Linus Torvalds 已提交
1485
	int retval;
1486
	struct ide_atapi_pc pc;
1487 1488 1489

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

L
Linus Torvalds 已提交
1490
	idetape_create_rewind_cmd(drive, &pc);
1491
	retval = ide_queue_pc_tail(drive, disk, &pc);
L
Linus Torvalds 已提交
1492 1493 1494 1495
	if (retval)
		return retval;

	idetape_create_read_position_cmd(&pc);
1496
	retval = ide_queue_pc_tail(drive, disk, &pc);
L
Linus Torvalds 已提交
1497 1498 1499 1500 1501
	if (retval)
		return retval;
	return 0;
}

1502
/* mtio.h compatible commands should be issued to the chrdev interface. */
1503 1504
static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
				unsigned long arg)
L
Linus Torvalds 已提交
1505 1506 1507 1508
{
	idetape_tape_t *tape = drive->driver_data;
	void __user *argp = (void __user *)arg;

1509 1510 1511 1512 1513 1514
	struct idetape_config {
		int dsc_rw_frequency;
		int dsc_media_access_frequency;
		int nr_stages;
	} config;

1515 1516
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
1517
	switch (cmd) {
1518 1519 1520 1521 1522 1523 1524
	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;
1525
		config.nr_stages = 1;
1526 1527 1528 1529 1530
		if (copy_to_user(argp, &config, sizeof(config)))
			return -EFAULT;
		break;
	default:
		return -EIO;
L
Linus Torvalds 已提交
1531 1532 1533 1534
	}
	return 0;
}

1535 1536
static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
					int mt_count)
L
Linus Torvalds 已提交
1537 1538
{
	idetape_tape_t *tape = drive->driver_data;
1539
	struct gendisk *disk = tape->disk;
1540
	struct ide_atapi_pc pc;
1541
	int retval, count = 0;
1542
	int sprev = !!(tape->caps[4] & 0x20);
L
Linus Torvalds 已提交
1543 1544 1545 1546

	if (mt_count == 0)
		return 0;
	if (MTBSF == mt_op || MTBSFM == mt_op) {
1547
		if (!sprev)
L
Linus Torvalds 已提交
1548
			return -EIO;
1549
		mt_count = -mt_count;
L
Linus Torvalds 已提交
1550 1551
	}

1552
	if (tape->chrdev_dir == IDETAPE_DIR_READ) {
1553
		tape->merge_bh_size = 0;
1554
		if (test_and_clear_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags))
L
Linus Torvalds 已提交
1555
			++count;
1556
		ide_tape_discard_merge_buffer(drive, 0);
L
Linus Torvalds 已提交
1557 1558 1559
	}

	switch (mt_op) {
1560 1561 1562 1563
	case MTFSF:
	case MTBSF:
		idetape_create_space_cmd(&pc, mt_count - count,
					 IDETAPE_SPACE_OVER_FILEMARK);
1564
		return ide_queue_pc_tail(drive, disk, &pc);
1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578
	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 已提交
1579 1580 1581 1582
	}
}

/*
1583
 * Our character device read / write functions.
L
Linus Torvalds 已提交
1584
 *
1585 1586 1587
 * 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 已提交
1588
 *
1589 1590 1591 1592 1593 1594 1595
 * 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 已提交
1596
 */
1597 1598
static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,
				   size_t count, loff_t *ppos)
L
Linus Torvalds 已提交
1599 1600 1601
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
1602
	ssize_t bytes_read, temp, actually_read = 0, rc;
1603
	ssize_t ret = 0;
1604
	u16 ctl = *(u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
1605

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

1608
	if (tape->chrdev_dir != IDETAPE_DIR_READ) {
1609
		if (test_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags))
1610 1611 1612
			if (count > tape->blk_size &&
			    (count % tape->blk_size) == 0)
				tape->user_bs_factor = count / tape->blk_size;
L
Linus Torvalds 已提交
1613
	}
1614
	rc = idetape_init_read(drive);
1615
	if (rc < 0)
L
Linus Torvalds 已提交
1616 1617 1618
		return rc;
	if (count == 0)
		return (0);
1619 1620
	if (tape->merge_bh_size) {
		actually_read = min((unsigned int)(tape->merge_bh_size),
1621
				    (unsigned int)count);
1622
		if (idetape_copy_stage_to_user(tape, buf, actually_read))
1623
			ret = -EFAULT;
L
Linus Torvalds 已提交
1624
		buf += actually_read;
1625
		tape->merge_bh_size -= actually_read;
L
Linus Torvalds 已提交
1626 1627
		count -= actually_read;
	}
1628
	while (count >= tape->buffer_size) {
1629
		bytes_read = idetape_add_chrdev_read_request(drive, ctl);
L
Linus Torvalds 已提交
1630 1631
		if (bytes_read <= 0)
			goto finish;
1632
		if (idetape_copy_stage_to_user(tape, buf, bytes_read))
1633
			ret = -EFAULT;
L
Linus Torvalds 已提交
1634 1635 1636 1637 1638
		buf += bytes_read;
		count -= bytes_read;
		actually_read += bytes_read;
	}
	if (count) {
1639
		bytes_read = idetape_add_chrdev_read_request(drive, ctl);
L
Linus Torvalds 已提交
1640 1641 1642
		if (bytes_read <= 0)
			goto finish;
		temp = min((unsigned long)count, (unsigned long)bytes_read);
1643
		if (idetape_copy_stage_to_user(tape, buf, temp))
1644
			ret = -EFAULT;
L
Linus Torvalds 已提交
1645
		actually_read += temp;
1646
		tape->merge_bh_size = bytes_read-temp;
L
Linus Torvalds 已提交
1647 1648
	}
finish:
1649
	if (!actually_read && test_bit(IDE_AFLAG_FILEMARK, &drive->atapi_flags)) {
1650 1651
		debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name);

L
Linus Torvalds 已提交
1652 1653 1654
		idetape_space_over_filemarks(drive, MTFSF, 1);
		return 0;
	}
1655

1656
	return ret ? ret : actually_read;
L
Linus Torvalds 已提交
1657 1658
}

1659
static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf,
L
Linus Torvalds 已提交
1660 1661 1662 1663
				     size_t count, loff_t *ppos)
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
1664 1665
	ssize_t actually_written = 0;
	ssize_t ret = 0;
1666
	u16 ctl = *(u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
1667 1668 1669 1670 1671

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

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

	/* Initialize write operation */
1675 1676
	if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
		if (tape->chrdev_dir == IDETAPE_DIR_READ)
1677
			ide_tape_discard_merge_buffer(drive, 1);
1678
		if (tape->merge_bh || tape->merge_bh_size) {
1679
			printk(KERN_ERR "ide-tape: merge_bh_size "
L
Linus Torvalds 已提交
1680
				"should be 0 now\n");
1681
			tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1682
		}
1683 1684
		tape->merge_bh = ide_tape_kmalloc_buffer(tape, 0, 0);
		if (!tape->merge_bh)
L
Linus Torvalds 已提交
1685
			return -ENOMEM;
1686
		tape->chrdev_dir = IDETAPE_DIR_WRITE;
1687
		idetape_init_merge_buffer(tape);
L
Linus Torvalds 已提交
1688 1689

		/*
1690 1691 1692 1693
		 * 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 已提交
1694 1695
		 */
		if (drive->dsc_overlap) {
1696 1697
			ssize_t retval = idetape_queue_rw_tail(drive,
							REQ_IDETAPE_WRITE, 0,
1698
							tape->merge_bh);
L
Linus Torvalds 已提交
1699
			if (retval < 0) {
1700 1701
				ide_tape_kfree_buffer(tape);
				tape->merge_bh = NULL;
1702
				tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
1703 1704 1705 1706 1707 1708
				return retval;
			}
		}
	}
	if (count == 0)
		return (0);
1709 1710
	if (tape->merge_bh_size) {
		if (tape->merge_bh_size >= tape->buffer_size) {
1711
			printk(KERN_ERR "ide-tape: bug: merge buf too big\n");
1712
			tape->merge_bh_size = 0;
L
Linus Torvalds 已提交
1713
		}
1714
		actually_written = min((unsigned int)
1715
				(tape->buffer_size - tape->merge_bh_size),
1716
				(unsigned int)count);
1717
		if (idetape_copy_stage_from_user(tape, buf, actually_written))
1718
				ret = -EFAULT;
L
Linus Torvalds 已提交
1719
		buf += actually_written;
1720
		tape->merge_bh_size += actually_written;
L
Linus Torvalds 已提交
1721 1722
		count -= actually_written;

1723
		if (tape->merge_bh_size == tape->buffer_size) {
1724
			ssize_t retval;
1725
			tape->merge_bh_size = 0;
1726
			retval = idetape_add_chrdev_write_request(drive, ctl);
L
Linus Torvalds 已提交
1727 1728 1729 1730
			if (retval <= 0)
				return (retval);
		}
	}
1731
	while (count >= tape->buffer_size) {
1732
		ssize_t retval;
1733
		if (idetape_copy_stage_from_user(tape, buf, tape->buffer_size))
1734
			ret = -EFAULT;
1735 1736
		buf += tape->buffer_size;
		count -= tape->buffer_size;
1737
		retval = idetape_add_chrdev_write_request(drive, ctl);
1738
		actually_written += tape->buffer_size;
L
Linus Torvalds 已提交
1739 1740 1741 1742 1743
		if (retval <= 0)
			return (retval);
	}
	if (count) {
		actually_written += count;
1744
		if (idetape_copy_stage_from_user(tape, buf, count))
1745
			ret = -EFAULT;
1746
		tape->merge_bh_size += count;
L
Linus Torvalds 已提交
1747
	}
1748
	return ret ? ret : actually_written;
L
Linus Torvalds 已提交
1749 1750
}

1751
static int idetape_write_filemark(ide_drive_t *drive)
L
Linus Torvalds 已提交
1752
{
1753
	struct ide_tape_obj *tape = drive->driver_data;
1754
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1755 1756 1757

	/* Write a filemark */
	idetape_create_write_filemark_cmd(drive, &pc, 1);
1758
	if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
L
Linus Torvalds 已提交
1759 1760 1761 1762 1763 1764 1765
		printk(KERN_ERR "ide-tape: Couldn't write a filemark\n");
		return -EIO;
	}
	return 0;
}

/*
1766 1767
 * Called from idetape_chrdev_ioctl when the general mtio MTIOCTOP ioctl is
 * requested.
L
Linus Torvalds 已提交
1768
 *
1769 1770
 * 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
1771
 * usually not supported.
L
Linus Torvalds 已提交
1772
 *
1773
 * The following commands are currently not supported:
L
Linus Torvalds 已提交
1774
 *
1775 1776
 * MTFSS, MTBSS, MTWSM, MTSETDENSITY, MTSETDRVBUFFER, MT_ST_BOOLEANS,
 * MT_ST_WRITE_THRESHOLD.
L
Linus Torvalds 已提交
1777
 */
1778
static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count)
L
Linus Torvalds 已提交
1779 1780
{
	idetape_tape_t *tape = drive->driver_data;
1781
	struct gendisk *disk = tape->disk;
1782
	struct ide_atapi_pc pc;
1783
	int i, retval;
L
Linus Torvalds 已提交
1784

1785 1786
	debug_log(DBG_ERR, "Handling MTIOCTOP ioctl: mt_op=%d, mt_count=%d\n",
			mt_op, mt_count);
1787

L
Linus Torvalds 已提交
1788
	switch (mt_op) {
1789 1790 1791 1792 1793 1794 1795 1796 1797
	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 已提交
1798
	}
1799

L
Linus Torvalds 已提交
1800
	switch (mt_op) {
1801 1802 1803
	case MTWEOF:
		if (tape->write_prot)
			return -EACCES;
1804
		ide_tape_discard_merge_buffer(drive, 1);
1805 1806 1807 1808 1809 1810 1811
		for (i = 0; i < mt_count; i++) {
			retval = idetape_write_filemark(drive);
			if (retval)
				return retval;
		}
		return 0;
	case MTREW:
1812
		ide_tape_discard_merge_buffer(drive, 0);
1813 1814 1815 1816
		if (idetape_rewind_tape(drive))
			return -EIO;
		return 0;
	case MTLOAD:
1817
		ide_tape_discard_merge_buffer(drive, 0);
1818
		return ide_do_start_stop(drive, disk, IDETAPE_LU_LOAD_MASK);
1819 1820 1821 1822 1823 1824 1825
	case MTUNLOAD:
	case MTOFFL:
		/*
		 * If door is locked, attempt to unlock before
		 * attempting to eject.
		 */
		if (tape->door_locked) {
1826
			if (!ide_set_media_lock(drive, disk, 0))
1827
				tape->door_locked = DOOR_UNLOCKED;
1828
		}
1829
		ide_tape_discard_merge_buffer(drive, 0);
1830
		retval = ide_do_start_stop(drive, disk, !IDETAPE_LU_LOAD_MASK);
1831
		if (!retval)
1832
			clear_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags);
1833 1834
		return retval;
	case MTNOP:
1835
		ide_tape_discard_merge_buffer(drive, 0);
1836 1837
		return idetape_flush_tape_buffers(drive);
	case MTRETEN:
1838
		ide_tape_discard_merge_buffer(drive, 0);
1839
		return ide_do_start_stop(drive, disk,
1840 1841 1842
			IDETAPE_LU_RETENSION_MASK | IDETAPE_LU_LOAD_MASK);
	case MTEOM:
		idetape_create_space_cmd(&pc, 0, IDETAPE_SPACE_TO_EOD);
1843
		return ide_queue_pc_tail(drive, disk, &pc);
1844 1845 1846
	case MTERASE:
		(void)idetape_rewind_tape(drive);
		idetape_create_erase_cmd(&pc);
1847
		return ide_queue_pc_tail(drive, disk, &pc);
1848 1849 1850 1851
	case MTSETBLK:
		if (mt_count) {
			if (mt_count < tape->blk_size ||
			    mt_count % tape->blk_size)
L
Linus Torvalds 已提交
1852
				return -EIO;
1853
			tape->user_bs_factor = mt_count / tape->blk_size;
1854
			clear_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
1855
		} else
1856
			set_bit(IDE_AFLAG_DETECT_BS, &drive->atapi_flags);
1857 1858
		return 0;
	case MTSEEK:
1859
		ide_tape_discard_merge_buffer(drive, 0);
1860 1861 1862
		return idetape_position_tape(drive,
			mt_count * tape->user_bs_factor, tape->partition, 0);
	case MTSETPART:
1863
		ide_tape_discard_merge_buffer(drive, 0);
1864 1865 1866 1867
		return idetape_position_tape(drive, 0, mt_count, 0);
	case MTFSR:
	case MTBSR:
	case MTLOCK:
1868
		retval = ide_set_media_lock(drive, disk, 1);
1869
		if (retval)
L
Linus Torvalds 已提交
1870
			return retval;
1871 1872 1873
		tape->door_locked = DOOR_EXPLICITLY_LOCKED;
		return 0;
	case MTUNLOCK:
1874
		retval = ide_set_media_lock(drive, disk, 0);
1875 1876 1877 1878 1879 1880 1881 1882
		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 已提交
1883 1884 1885 1886
	}
}

/*
1887 1888 1889
 * 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 已提交
1890
 */
1891 1892
static int idetape_chrdev_ioctl(struct inode *inode, struct file *file,
				unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
1893 1894 1895 1896 1897 1898
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
	struct mtop mtop;
	struct mtget mtget;
	struct mtpos mtpos;
1899
	int block_offset = 0, position = tape->first_frame;
L
Linus Torvalds 已提交
1900 1901
	void __user *argp = (void __user *)arg;

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

1904
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
1905
		ide_tape_flush_merge_buffer(drive);
L
Linus Torvalds 已提交
1906 1907 1908
		idetape_flush_tape_buffers(drive);
	}
	if (cmd == MTIOCGET || cmd == MTIOCPOS) {
1909
		block_offset = tape->merge_bh_size /
1910
			(tape->blk_size * tape->user_bs_factor);
1911 1912
		position = idetape_read_position(drive);
		if (position < 0)
L
Linus Torvalds 已提交
1913 1914 1915
			return -EIO;
	}
	switch (cmd) {
1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940
	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)
1941
			ide_tape_discard_merge_buffer(drive, 1);
1942
		return idetape_blkdev_ioctl(drive, cmd, arg);
L
Linus Torvalds 已提交
1943 1944 1945
	}
}

1946 1947 1948 1949 1950 1951 1952
/*
 * 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;
1953
	struct ide_atapi_pc pc;
1954 1955

	idetape_create_mode_sense_cmd(&pc, IDETAPE_BLOCK_DESCRIPTOR);
1956
	if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
1957
		printk(KERN_ERR "ide-tape: Can't get block descriptor\n");
1958
		if (tape->blk_size == 0) {
1959 1960
			printk(KERN_WARNING "ide-tape: Cannot deal with zero "
					    "block size, assuming 32k\n");
1961
			tape->blk_size = 32768;
1962 1963 1964
		}
		return;
	}
1965 1966 1967 1968
	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;
1969
}
L
Linus Torvalds 已提交
1970

1971
static int idetape_chrdev_open(struct inode *inode, struct file *filp)
L
Linus Torvalds 已提交
1972 1973 1974 1975 1976 1977
{
	unsigned int minor = iminor(inode), i = minor & ~0xc0;
	ide_drive_t *drive;
	idetape_tape_t *tape;
	int retval;

1978 1979 1980
	if (i >= MAX_HWIFS * MAX_DRIVES)
		return -ENXIO;

1981
	lock_kernel();
1982
	tape = ide_tape_chrdev_get(i);
1983 1984
	if (!tape) {
		unlock_kernel();
1985
		return -ENXIO;
1986
	}
1987 1988 1989

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

L
Linus Torvalds 已提交
1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000
	/*
	 * 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;

2001
	if (test_and_set_bit(IDE_AFLAG_BUSY, &drive->atapi_flags)) {
L
Linus Torvalds 已提交
2002 2003 2004 2005 2006 2007
		retval = -EBUSY;
		goto out_put_tape;
	}

	retval = idetape_wait_ready(drive, 60 * HZ);
	if (retval) {
2008
		clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
L
Linus Torvalds 已提交
2009 2010 2011 2012 2013
		printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
		goto out_put_tape;
	}

	idetape_read_position(drive);
2014
	if (!test_bit(IDE_AFLAG_ADDRESS_VALID, &drive->atapi_flags))
L
Linus Torvalds 已提交
2015 2016 2017
		(void)idetape_rewind_tape(drive);

	/* Read block size and write protect status from drive. */
2018
	ide_tape_get_bsize_from_bdesc(drive);
L
Linus Torvalds 已提交
2019 2020 2021 2022 2023 2024 2025 2026 2027 2028 2029

	/* 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) {
2030
			clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
L
Linus Torvalds 已提交
2031 2032 2033 2034 2035
			retval = -EROFS;
			goto out_put_tape;
		}
	}

2036
	/* Lock the tape drive door so user can't eject. */
2037
	if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
2038
		if (!ide_set_media_lock(drive, tape->disk, 1)) {
2039 2040
			if (tape->door_locked != DOOR_EXPLICITLY_LOCKED)
				tape->door_locked = DOOR_LOCKED;
L
Linus Torvalds 已提交
2041 2042
		}
	}
2043
	unlock_kernel();
L
Linus Torvalds 已提交
2044 2045 2046 2047
	return 0;

out_put_tape:
	ide_tape_put(tape);
2048
	unlock_kernel();
L
Linus Torvalds 已提交
2049 2050 2051
	return retval;
}

2052
static void idetape_write_release(ide_drive_t *drive, unsigned int minor)
L
Linus Torvalds 已提交
2053 2054 2055
{
	idetape_tape_t *tape = drive->driver_data;

2056
	ide_tape_flush_merge_buffer(drive);
2057 2058
	tape->merge_bh = ide_tape_kmalloc_buffer(tape, 1, 0);
	if (tape->merge_bh != NULL) {
2059 2060
		idetape_pad_zeros(drive, tape->blk_size *
				(tape->user_bs_factor - 1));
2061 2062
		ide_tape_kfree_buffer(tape);
		tape->merge_bh = NULL;
L
Linus Torvalds 已提交
2063 2064 2065 2066 2067 2068
	}
	idetape_write_filemark(drive);
	idetape_flush_tape_buffers(drive);
	idetape_flush_tape_buffers(drive);
}

2069
static int idetape_chrdev_release(struct inode *inode, struct file *filp)
L
Linus Torvalds 已提交
2070 2071 2072 2073 2074 2075 2076
{
	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;
2077 2078

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

2080
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
L
Linus Torvalds 已提交
2081
		idetape_write_release(drive, minor);
2082
	if (tape->chrdev_dir == IDETAPE_DIR_READ) {
L
Linus Torvalds 已提交
2083
		if (minor < 128)
2084
			ide_tape_discard_merge_buffer(drive, 1);
L
Linus Torvalds 已提交
2085
	}
2086

2087
	if (minor < 128 && test_bit(IDE_AFLAG_MEDIUM_PRESENT, &drive->atapi_flags))
L
Linus Torvalds 已提交
2088
		(void) idetape_rewind_tape(drive);
2089
	if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
L
Linus Torvalds 已提交
2090
		if (tape->door_locked == DOOR_LOCKED) {
2091
			if (!ide_set_media_lock(drive, tape->disk, 0))
2092
				tape->door_locked = DOOR_UNLOCKED;
L
Linus Torvalds 已提交
2093 2094
		}
	}
2095
	clear_bit(IDE_AFLAG_BUSY, &drive->atapi_flags);
L
Linus Torvalds 已提交
2096 2097 2098 2099 2100
	ide_tape_put(tape);
	unlock_kernel();
	return 0;
}

2101
static void idetape_get_inquiry_results(ide_drive_t *drive)
L
Linus Torvalds 已提交
2102 2103
{
	idetape_tape_t *tape = drive->driver_data;
2104
	struct ide_atapi_pc pc;
B
Borislav Petkov 已提交
2105
	char fw_rev[4], vendor_id[8], product_id[16];
2106

L
Linus Torvalds 已提交
2107
	idetape_create_inquiry_cmd(&pc);
2108
	if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
2109 2110
		printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n",
				tape->name);
L
Linus Torvalds 已提交
2111 2112
		return;
	}
2113 2114 2115
	memcpy(vendor_id, &pc.buf[8], 8);
	memcpy(product_id, &pc.buf[16], 16);
	memcpy(fw_rev, &pc.buf[32], 4);
2116

B
Borislav Petkov 已提交
2117 2118 2119
	ide_fixstring(vendor_id, 8, 0);
	ide_fixstring(product_id, 16, 0);
	ide_fixstring(fw_rev, 4, 0);
2120

B
Borislav Petkov 已提交
2121
	printk(KERN_INFO "ide-tape: %s <-> %s: %.8s %.16s rev %.4s\n",
2122
			drive->name, tape->name, vendor_id, product_id, fw_rev);
L
Linus Torvalds 已提交
2123 2124 2125
}

/*
2126 2127
 * 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 已提交
2128
 */
2129
static void idetape_get_mode_sense_results(ide_drive_t *drive)
L
Linus Torvalds 已提交
2130 2131
{
	idetape_tape_t *tape = drive->driver_data;
2132
	struct ide_atapi_pc pc;
2133 2134
	u8 *caps;
	u8 speed, max_speed;
2135

L
Linus Torvalds 已提交
2136
	idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE);
2137
	if (ide_queue_pc_tail(drive, tape->disk, &pc)) {
2138 2139
		printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming"
				" some default values\n");
2140
		tape->blk_size = 512;
2141 2142 2143
		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 已提交
2144 2145
		return;
	}
2146
	caps = pc.buf + 4 + pc.buf[3];
2147 2148

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

2152 2153 2154 2155
	*(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 已提交
2156

2157 2158 2159
	if (!speed) {
		printk(KERN_INFO "ide-tape: %s: invalid tape speed "
				"(assuming 650KB/sec)\n", drive->name);
2160
		*(u16 *)&caps[14] = 650;
L
Linus Torvalds 已提交
2161
	}
2162 2163 2164
	if (!max_speed) {
		printk(KERN_INFO "ide-tape: %s: invalid max_speed "
				"(assuming 650KB/sec)\n", drive->name);
2165
		*(u16 *)&caps[8] = 650;
L
Linus Torvalds 已提交
2166 2167
	}

2168
	memcpy(&tape->caps, caps, 20);
2169 2170 2171 2172 2173

	/* device lacks locking support according to capabilities page */
	if ((caps[6] & 1) == 0)
		drive->atapi_flags |= IDE_AFLAG_NO_DOORLOCK;

2174
	if (caps[7] & 0x02)
2175
		tape->blk_size = 512;
2176
	else if (caps[7] & 0x04)
2177
		tape->blk_size = 1024;
L
Linus Torvalds 已提交
2178 2179
}

2180
#ifdef CONFIG_IDE_PROC_FS
2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195
#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; \
}

2196
#define ide_tape_devset_rw_field(_name, _field) \
2197 2198
ide_tape_devset_get(_name, _field) \
ide_tape_devset_set(_name, _field) \
2199
IDE_DEVSET(_name, DS_SYNC, get_##_name, set_##_name)
2200

2201
#define ide_tape_devset_r_field(_name, _field) \
2202
ide_tape_devset_get(_name, _field) \
2203
IDE_DEVSET(_name, 0, get_##_name, NULL)
2204 2205 2206 2207 2208 2209

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; }

2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229
ide_devset_rw_field(dsc_overlap, dsc_overlap);

ide_tape_devset_rw_field(debug_mask, debug_mask);
ide_tape_devset_rw_field(tdsc, best_dsc_rw_freq);

ide_tape_devset_r_field(avg_speed, avg_speed);
ide_tape_devset_r_field(speed, caps[14]);
ide_tape_devset_r_field(buffer, caps[16]);
ide_tape_devset_r_field(buffer_size, buffer_size);

static const struct ide_proc_devset idetape_settings[] = {
	__IDE_PROC_DEVSET(avg_speed,	0, 0xffff, NULL, NULL),
	__IDE_PROC_DEVSET(buffer,	0, 0xffff, NULL, divf_buffer),
	__IDE_PROC_DEVSET(buffer_size,	0, 0xffff, NULL, divf_buffer_size),
	__IDE_PROC_DEVSET(debug_mask,	0, 0xffff, NULL, NULL),
	__IDE_PROC_DEVSET(dsc_overlap,	0,      1, NULL, NULL),
	__IDE_PROC_DEVSET(speed,	0, 0xffff, NULL, NULL),
	__IDE_PROC_DEVSET(tdsc,		IDETAPE_DSC_RW_MIN, IDETAPE_DSC_RW_MAX,
					mulf_tdsc, divf_tdsc),
	{ 0 },
2230
};
2231
#endif
L
Linus Torvalds 已提交
2232 2233

/*
2234
 * The function below is called to:
L
Linus Torvalds 已提交
2235
 *
2236 2237 2238 2239
 * 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 已提交
2240
 *
2241 2242
 * 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 已提交
2243
 */
2244
static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
L
Linus Torvalds 已提交
2245
{
2246
	unsigned long t;
L
Linus Torvalds 已提交
2247
	int speed;
2248
	int buffer_size;
2249
	u8 gcw[2];
2250
	u16 *ctl = (u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
2251

2252 2253
	drive->pc_callback = ide_tape_callback;

2254
	spin_lock_init(&tape->lock);
L
Linus Torvalds 已提交
2255
	drive->dsc_overlap = 1;
2256 2257 2258 2259
	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 已提交
2260 2261
	}
	/* Seagate Travan drives do not support DSC overlap. */
2262
	if (strstr((char *)&drive->id[ATA_ID_PROD], "Seagate STT3401"))
L
Linus Torvalds 已提交
2263 2264 2265 2266 2267
		drive->dsc_overlap = 0;
	tape->minor = minor;
	tape->name[0] = 'h';
	tape->name[1] = 't';
	tape->name[2] = '0' + minor;
2268
	tape->chrdev_dir = IDETAPE_DIR_NONE;
2269 2270

	*((u16 *)&gcw) = drive->id[ATA_ID_CONFIG];
2271 2272 2273

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

	idetape_get_inquiry_results(drive);
	idetape_get_mode_sense_results(drive);
2278
	ide_tape_get_bsize_from_bdesc(drive);
L
Linus Torvalds 已提交
2279
	tape->user_bs_factor = 1;
2280 2281
	tape->buffer_size = *ctl * tape->blk_size;
	while (tape->buffer_size > 0xffff) {
L
Linus Torvalds 已提交
2282
		printk(KERN_NOTICE "ide-tape: decreasing stage size\n");
2283
		*ctl /= 2;
2284
		tape->buffer_size = *ctl * tape->blk_size;
L
Linus Torvalds 已提交
2285
	}
2286
	buffer_size = tape->buffer_size;
2287
	tape->pages_per_buffer = buffer_size / PAGE_SIZE;
2288
	if (buffer_size % PAGE_SIZE) {
2289
		tape->pages_per_buffer++;
2290
		tape->excess_bh_size = PAGE_SIZE - buffer_size % PAGE_SIZE;
L
Linus Torvalds 已提交
2291 2292
	}

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

2296
	t = (IDETAPE_FIFO_THRESHOLD * tape->buffer_size * HZ) / (speed * 1000);
L
Linus Torvalds 已提交
2297 2298

	/*
2299 2300
	 * Ensure that the number we got makes sense; limit it within
	 * IDETAPE_DSC_RW_MIN and IDETAPE_DSC_RW_MAX.
L
Linus Torvalds 已提交
2301
	 */
2302 2303
	tape->best_dsc_rw_freq = clamp_t(unsigned long, t, IDETAPE_DSC_RW_MIN,
					 IDETAPE_DSC_RW_MAX);
L
Linus Torvalds 已提交
2304
	printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, "
2305
		"%lums tDSC%s\n",
2306
		drive->name, tape->name, *(u16 *)&tape->caps[14],
2307 2308
		(*(u16 *)&tape->caps[16] * 512) / tape->buffer_size,
		tape->buffer_size / 1024,
2309
		tape->best_dsc_rw_freq * 1000 / HZ,
L
Linus Torvalds 已提交
2310 2311
		drive->using_dma ? ", DMA":"");

2312
	ide_proc_register_driver(drive, tape->driver);
L
Linus Torvalds 已提交
2313 2314
}

2315
static void ide_tape_remove(ide_drive_t *drive)
L
Linus Torvalds 已提交
2316 2317 2318
{
	idetape_tape_t *tape = drive->driver_data;

2319
	ide_proc_unregister_driver(drive, tape->driver);
L
Linus Torvalds 已提交
2320 2321 2322 2323 2324 2325 2326 2327 2328 2329 2330 2331

	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;

2332
	BUG_ON(tape->merge_bh_size);
2333

L
Linus Torvalds 已提交
2334 2335
	drive->dsc_overlap = 0;
	drive->driver_data = NULL;
2336
	device_destroy(idetape_sysfs_class, MKDEV(IDETAPE_MAJOR, tape->minor));
2337 2338
	device_destroy(idetape_sysfs_class,
			MKDEV(IDETAPE_MAJOR, tape->minor + 128));
L
Linus Torvalds 已提交
2339 2340 2341 2342 2343 2344
	idetape_devs[tape->minor] = NULL;
	g->private_data = NULL;
	put_disk(g);
	kfree(tape);
}

2345
#ifdef CONFIG_IDE_PROC_FS
L
Linus Torvalds 已提交
2346 2347 2348 2349 2350 2351 2352 2353 2354 2355 2356 2357 2358 2359 2360 2361 2362 2363 2364
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

2365
static int ide_tape_probe(ide_drive_t *);
L
Linus Torvalds 已提交
2366 2367

static ide_driver_t idetape_driver = {
2368
	.gen_driver = {
2369
		.owner		= THIS_MODULE,
2370 2371 2372
		.name		= "ide-tape",
		.bus		= &ide_bus_type,
	},
2373 2374
	.probe			= ide_tape_probe,
	.remove			= ide_tape_remove,
L
Linus Torvalds 已提交
2375 2376 2377 2378 2379
	.version		= IDETAPE_VERSION,
	.media			= ide_tape,
	.do_request		= idetape_do_request,
	.end_request		= idetape_end_request,
	.error			= __ide_error,
2380
#ifdef CONFIG_IDE_PROC_FS
L
Linus Torvalds 已提交
2381
	.proc			= idetape_proc,
2382
	.settings		= idetape_settings,
2383
#endif
L
Linus Torvalds 已提交
2384 2385
};

2386
/* Our character device supporting functions, passed to register_chrdev. */
2387
static const struct file_operations idetape_fops = {
L
Linus Torvalds 已提交
2388 2389 2390 2391 2392 2393 2394 2395 2396 2397 2398 2399 2400
	.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;

2401 2402
	tape = ide_tape_get(disk);
	if (!tape)
L
Linus Torvalds 已提交
2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430 2431 2432 2433 2434 2435 2436
		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,
};

2437
static int ide_tape_probe(ide_drive_t *drive)
L
Linus Torvalds 已提交
2438 2439 2440 2441 2442 2443 2444
{
	idetape_tape_t *tape;
	struct gendisk *g;
	int minor;

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

L
Linus Torvalds 已提交
2446 2447
	if (drive->media != ide_tape)
		goto failed;
2448

2449
	if (drive->id_read == 1 && !ide_check_atapi_device(drive, DRV_NAME)) {
2450 2451
		printk(KERN_ERR "ide-tape: %s: not supported by this version of"
				" the driver\n", drive->name);
L
Linus Torvalds 已提交
2452 2453
		goto failed;
	}
2454
	tape = kzalloc(sizeof(idetape_tape_t), GFP_KERNEL);
L
Linus Torvalds 已提交
2455
	if (tape == NULL) {
2456 2457
		printk(KERN_ERR "ide-tape: %s: Can't allocate a tape struct\n",
				drive->name);
L
Linus Torvalds 已提交
2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476
		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;

2477
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
2478 2479 2480
	for (minor = 0; idetape_devs[minor]; minor++)
		;
	idetape_devs[minor] = tape;
2481
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
2482 2483 2484

	idetape_setup(drive, tape, minor);

2485 2486 2487 2488 2489 2490
	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);
2491

L
Linus Torvalds 已提交
2492 2493 2494 2495
	g->fops = &idetape_block_ops;
	ide_register_region(g);

	return 0;
2496

L
Linus Torvalds 已提交
2497 2498 2499
out_free_tape:
	kfree(tape);
failed:
2500
	return -ENODEV;
L
Linus Torvalds 已提交
2501 2502
}

2503
static void __exit idetape_exit(void)
L
Linus Torvalds 已提交
2504
{
2505
	driver_unregister(&idetape_driver.gen_driver);
2506
	class_destroy(idetape_sysfs_class);
L
Linus Torvalds 已提交
2507 2508 2509
	unregister_chrdev(IDETAPE_MAJOR, "ht");
}

2510
static int __init idetape_init(void)
L
Linus Torvalds 已提交
2511
{
2512 2513 2514 2515 2516 2517 2518 2519 2520
	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 已提交
2521
	if (register_chrdev(IDETAPE_MAJOR, "ht", &idetape_fops)) {
2522 2523
		printk(KERN_ERR "ide-tape: Failed to register chrdev"
				" interface\n");
2524 2525
		error = -EBUSY;
		goto out_free_class;
L
Linus Torvalds 已提交
2526
	}
2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539

	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 已提交
2540 2541
}

2542
MODULE_ALIAS("ide:*m-tape*");
L
Linus Torvalds 已提交
2543 2544 2545
module_init(idetape_init);
module_exit(idetape_exit);
MODULE_ALIAS_CHARDEV_MAJOR(IDETAPE_MAJOR);
2546 2547
MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
MODULE_LICENSE("GPL");