ide-tape.c 108.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
#define IDETAPE_VERSION "1.20"
L
Linus Torvalds 已提交
19 20 21 22 23 24 25 26 27

#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>
28
#include <linux/jiffies.h>
L
Linus Torvalds 已提交
29 30 31 32 33 34 35 36 37
#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>
38
#include <linux/mutex.h>
39
#include <scsi/scsi.h>
L
Linus Torvalds 已提交
40 41

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

48 49 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),
	/* buffer alloc info (pc_stack & rq_stack) */
	DBG_PCRQ_STACK =	(1 << 4),
};

/* 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 76 77
/**************************** Tunable parameters *****************************/


/*
78
 * Pipelined mode parameters.
L
Linus Torvalds 已提交
79
 *
80 81 82
 * We try to use the minimum number of stages which is enough to keep the tape
 * constantly streaming. To accomplish that, we implement a feedback loop around
 * the maximum number of stages:
L
Linus Torvalds 已提交
83
 *
84 85 86
 * We start from MIN maximum stages (we will not even use MIN stages if we don't
 * need them), increment it by RATE*(MAX-MIN) whenever we sense that the
 * pipeline is empty, until we reach the optimum value or until we reach MAX.
L
Linus Torvalds 已提交
87
 *
88 89
 * Setting the following parameter to 0 is illegal: the pipelined mode cannot be
 * disabled (idetape_calculate_speeds() divides by tape->max_stages.)
L
Linus Torvalds 已提交
90 91 92 93 94 95
 */
#define IDETAPE_MIN_PIPELINE_STAGES	  1
#define IDETAPE_MAX_PIPELINE_STAGES	400
#define IDETAPE_INCREASE_STAGES_RATE	 20

/*
96 97
 * After each failed packet command we issue a request sense command and retry
 * the packet command IDETAPE_MAX_PC_RETRIES times.
L
Linus Torvalds 已提交
98
 *
99
 * Setting IDETAPE_MAX_PC_RETRIES to 0 will disable retries.
L
Linus Torvalds 已提交
100 101 102 103
 */
#define IDETAPE_MAX_PC_RETRIES		3

/*
104 105
 * With each packet command, we allocate a buffer of IDETAPE_PC_BUFFER_SIZE
 * bytes. This is used for several packet commands (Not for READ/WRITE commands)
L
Linus Torvalds 已提交
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
 */
#define IDETAPE_PC_BUFFER_SIZE		256

/*
 *	In various places in the driver, we need to allocate storage
 *	for packet commands and requests, which will remain valid while
 *	we leave the driver to wait for an interrupt or a timeout event.
 */
#define IDETAPE_PC_STACK		(10 + IDETAPE_MAX_PC_RETRIES)

/*
 * 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)

/*
124 125 126 127
 * 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 已提交
128
 */
129
#define IDETAPE_FIFO_THRESHOLD		2
L
Linus Torvalds 已提交
130 131

/*
132
 * DSC polling parameters.
L
Linus Torvalds 已提交
133
 *
134 135
 * 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 已提交
136
 *
137 138 139 140 141
 * 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 已提交
142
 *
143 144 145 146 147 148 149 150
 * 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 已提交
151
 *
152 153
 * 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 已提交
154
 */
155 156

/* DSC timings. */
L
Linus Torvalds 已提交
157 158 159 160 161 162 163 164 165 166
#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 ***********************/

167
/* Read/Write error simulation */
L
Linus Torvalds 已提交
168 169
#define SIMULATE_ERRORS			0

170 171 172 173 174 175
/* tape directions */
enum {
	IDETAPE_DIR_NONE  = (1 << 0),
	IDETAPE_DIR_READ  = (1 << 1),
	IDETAPE_DIR_WRITE = (1 << 2),
};
L
Linus Torvalds 已提交
176 177

struct idetape_bh {
178
	u32 b_size;
L
Linus Torvalds 已提交
179 180 181 182 183
	atomic_t b_count;
	struct idetape_bh *b_reqnext;
	char *b_data;
};

184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
/* 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

221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241
/* Tape flag bits values. */
enum {
	IDETAPE_FLAG_IGNORE_DSC		= (1 << 0),
	/* 0 When the tape position is unknown */
	IDETAPE_FLAG_ADDRESS_VALID	= (1 <<	1),
	/* Device already opened */
	IDETAPE_FLAG_BUSY			= (1 << 2),
	/* Error detected in a pipeline stage */
	IDETAPE_FLAG_PIPELINE_ERR	= (1 <<	3),
	/* Attempt to auto-detect the current user block size */
	IDETAPE_FLAG_DETECT_BS		= (1 << 4),
	/* Currently on a filemark */
	IDETAPE_FLAG_FILEMARK		= (1 << 5),
	/* DRQ interrupt device */
	IDETAPE_FLAG_DRQ_INTERRUPT	= (1 << 6),
	/* pipeline active */
	IDETAPE_FLAG_PIPELINE_ACTIVE	= (1 << 7),
	/* 0 = no tape is loaded, so we don't rewind after ejecting */
	IDETAPE_FLAG_MEDIUM_PRESENT	= (1 << 8),
};

242
/* A pipeline stage. */
L
Linus Torvalds 已提交
243 244 245 246 247 248 249
typedef struct idetape_stage_s {
	struct request rq;			/* The corresponding request */
	struct idetape_bh *bh;			/* The data buffers */
	struct idetape_stage_s *next;		/* Pointer to the next stage */
} idetape_stage_t;

/*
250 251
 * 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 已提交
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274
 */
typedef struct ide_tape_obj {
	ide_drive_t	*drive;
	ide_driver_t	*driver;
	struct gendisk	*disk;
	struct kref	kref;

	/*
	 *	Since a typical character device operation requires more
	 *	than one packet command, we provide here enough memory
	 *	for the maximum of interconnected packet commands.
	 *	The packet commands are stored in the circular array pc_stack.
	 *	pc_stack_index points to the last used entry, and warps around
	 *	to the start when we get to the last array entry.
	 *
	 *	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 */
275
	struct ide_atapi_pc *pc;
L
Linus Torvalds 已提交
276
	/* Last failed packet command */
277
	struct ide_atapi_pc *failed_pc;
L
Linus Torvalds 已提交
278
	/* Packet command stack */
279
	struct ide_atapi_pc pc_stack[IDETAPE_PC_STACK];
L
Linus Torvalds 已提交
280 281 282 283 284 285 286
	/* Next free packet command storage space */
	int pc_stack_index;
	struct request rq_stack[IDETAPE_PC_STACK];
	/* We implement a circular array */
	int rq_stack_index;

	/*
287
	 * DSC polling variables.
L
Linus Torvalds 已提交
288
	 *
289 290 291 292 293 294
	 * 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
	 * data transfer) request in the device request queue. Additional
	 * requests can be queued in our internal pipeline, but they will be
	 * visible to ide.c only one at a time.
L
Linus Torvalds 已提交
295 296 297 298 299 300 301
	 */
	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 */
302 303
	unsigned long best_dsc_rw_freq;
	unsigned long dsc_poll_freq;
L
Linus Torvalds 已提交
304 305
	unsigned long dsc_timeout;

306
	/* Read position information */
L
Linus Torvalds 已提交
307 308
	u8 partition;
	/* Current block */
309
	unsigned int first_frame;
L
Linus Torvalds 已提交
310

311
	/* Last error information */
L
Linus Torvalds 已提交
312 313
	u8 sense_key, asc, ascq;

314
	/* Character device operation */
L
Linus Torvalds 已提交
315 316 317 318
	unsigned int minor;
	/* device name */
	char name[4];
	/* Current character device data transfer direction */
319
	u8 chrdev_dir;
L
Linus Torvalds 已提交
320

321 322
	/* tape block size, usually 512 or 1024 bytes */
	unsigned short blk_size;
L
Linus Torvalds 已提交
323
	int user_bs_factor;
324

L
Linus Torvalds 已提交
325
	/* Copy of the tape's Capabilities and Mechanical Page */
326
	u8 caps[20];
L
Linus Torvalds 已提交
327 328

	/*
329
	 * Active data transfer request parameters.
L
Linus Torvalds 已提交
330
	 *
331 332 333 334 335 336
	 * 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.
	 * In the pipelined operation mode, we use our internal pipeline
	 * structure to hold more data requests. The data buffer size is chosen
	 * based on the tape's recommendation.
L
Linus Torvalds 已提交
337
	 */
338
	/* ptr to the request which is waiting in the device request queue */
339
	struct request *active_data_rq;
340
	/* Data buffer size chosen based on the tape's recommendation */
L
Linus Torvalds 已提交
341 342 343 344 345 346
	int stage_size;
	idetape_stage_t *merge_stage;
	int merge_stage_size;
	struct idetape_bh *bh;
	char *b_data;
	int b_count;
347

L
Linus Torvalds 已提交
348
	/*
349
	 * Pipeline parameters.
L
Linus Torvalds 已提交
350
	 *
351 352
	 * To accomplish non-pipelined mode, we simply set the following
	 * variables to zero (or NULL, where appropriate).
L
Linus Torvalds 已提交
353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
	 */
	/* Number of currently used stages */
	int nr_stages;
	/* Number of pending stages */
	int nr_pending_stages;
	/* We will not allocate more than this number of stages */
	int max_stages, min_pipeline, max_pipeline;
	/* The first stage which will be removed from the pipeline */
	idetape_stage_t *first_stage;
	/* The currently active stage */
	idetape_stage_t *active_stage;
	/* Will be serviced after the currently active request */
	idetape_stage_t *next_stage;
	/* New requests will be added to the pipeline here */
	idetape_stage_t *last_stage;
	/* Optional free stage which we can use */
	idetape_stage_t *cache_stage;
	int pages_per_stage;
	/* Wasted space in each stage */
	int excess_bh_size;

	/* Status/Action flags: long for set_bit */
	unsigned long flags;
	/* protects the ide-tape queue */
377
	spinlock_t lock;
L
Linus Torvalds 已提交
378

379
	/* Measures average tape speed */
L
Linus Torvalds 已提交
380 381 382 383 384 385 386 387 388 389 390 391
	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;

	/*
392 393
	 * Limit the number of times a request can be postponed, to avoid an
	 * infinite postpone deadlock.
L
Linus Torvalds 已提交
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408
	 */
	int postpone_cnt;

	/*
	 * Measures number of frames:
	 *
	 * 1. written/read to/from the driver pipeline (pipeline_head).
	 * 2. written/read to/from the tape buffers (idetape_bh).
	 * 3. written/read by the tape to/from the media (tape_head).
	 */
	int pipeline_head;
	int buffer_head;
	int tape_head;
	int last_tape_head;

409
	/* Speed control at the tape buffers input/output */
L
Linus Torvalds 已提交
410 411 412 413 414 415
	unsigned long insert_time;
	int insert_size;
	int insert_speed;
	int max_insert_speed;
	int measure_insert_time;

416
	/* Speed regulation negative feedback loop */
L
Linus Torvalds 已提交
417 418 419 420 421 422 423 424 425 426 427 428 429
	int speed_control;
	int pipeline_head_speed;
	int controlled_pipeline_head_speed;
	int uncontrolled_pipeline_head_speed;
	int controlled_last_pipeline_head;
	unsigned long uncontrolled_pipeline_head_time;
	unsigned long controlled_pipeline_head_time;
	int controlled_previous_pipeline_head;
	int uncontrolled_previous_pipeline_head;
	unsigned long controlled_previous_head_time;
	unsigned long uncontrolled_previous_head_time;
	int restart_speed_control_req;

430
	u32 debug_mask;
L
Linus Torvalds 已提交
431 432
} idetape_tape_t;

433
static DEFINE_MUTEX(idetape_ref_mutex);
L
Linus Torvalds 已提交
434

435 436
static struct class *idetape_sysfs_class;

L
Linus Torvalds 已提交
437 438 439 440 441 442 443 444 445
#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)

static struct ide_tape_obj *ide_tape_get(struct gendisk *disk)
{
	struct ide_tape_obj *tape = NULL;

446
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
447 448 449
	tape = ide_tape_g(disk);
	if (tape)
		kref_get(&tape->kref);
450
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
451 452 453 454 455 456 457
	return tape;
}

static void ide_tape_release(struct kref *);

static void ide_tape_put(struct ide_tape_obj *tape)
{
458
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
459
	kref_put(&tape->kref, ide_tape_release);
460
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
461 462 463
}

/*
464 465
 * The variables below are used for the character device interface. Additional
 * state variables are defined in our ide_drive_t structure.
L
Linus Torvalds 已提交
466
 */
467
static struct ide_tape_obj *idetape_devs[MAX_HWIFS * MAX_DRIVES];
L
Linus Torvalds 已提交
468 469 470 471 472 473 474

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

475
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
476 477 478
	tape = idetape_devs[i];
	if (tape)
		kref_get(&tape->kref);
479
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
480 481 482
	return tape;
}

483
static void idetape_input_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
484
				  unsigned int bcount)
L
Linus Torvalds 已提交
485 486 487 488 489 490 491 492
{
	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");
493
			ide_atapi_discard_data(drive, bcount);
L
Linus Torvalds 已提交
494 495
			return;
		}
496 497 498 499 500
		count = min(
			(unsigned int)(bh->b_size - atomic_read(&bh->b_count)),
			bcount);
		HWIF(drive)->atapi_input_bytes(drive, bh->b_data +
					atomic_read(&bh->b_count), count);
L
Linus Torvalds 已提交
501 502 503 504 505 506 507 508 509 510 511
		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;
}

512
static void idetape_output_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
513
				   unsigned int bcount)
L
Linus Torvalds 已提交
514 515 516 517 518 519
{
	struct idetape_bh *bh = pc->bh;
	int count;

	while (bcount) {
		if (bh == NULL) {
520 521
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
L
Linus Torvalds 已提交
522 523 524 525 526 527 528 529
			return;
		}
		count = min((unsigned int)pc->b_count, (unsigned int)bcount);
		HWIF(drive)->atapi_output_bytes(drive, pc->b_data, count);
		bcount -= count;
		pc->b_data += count;
		pc->b_count -= count;
		if (!pc->b_count) {
530 531
			bh = bh->b_reqnext;
			pc->bh = bh;
L
Linus Torvalds 已提交
532 533 534 535 536 537 538 539
			if (bh) {
				pc->b_data = bh->b_data;
				pc->b_count = atomic_read(&bh->b_count);
			}
		}
	}
}

540
static void idetape_update_buffers(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
541 542 543
{
	struct idetape_bh *bh = pc->bh;
	int count;
544
	unsigned int bcount = pc->xferred;
L
Linus Torvalds 已提交
545

546
	if (pc->flags & PC_FLAG_WRITING)
L
Linus Torvalds 已提交
547 548 549
		return;
	while (bcount) {
		if (bh == NULL) {
550 551
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
L
Linus Torvalds 已提交
552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568
			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;
}

/*
 *	idetape_next_pc_storage returns a pointer to a place in which we can
 *	safely store a packet command, even though we intend to leave the
 *	driver. A storage space for a maximum of IDETAPE_PC_STACK packet
 *	commands is allocated at initialization time.
 */
569
static struct ide_atapi_pc *idetape_next_pc_storage(ide_drive_t *drive)
L
Linus Torvalds 已提交
570 571 572
{
	idetape_tape_t *tape = drive->driver_data;

573 574
	debug_log(DBG_PCRQ_STACK, "pc_stack_index=%d\n", tape->pc_stack_index);

L
Linus Torvalds 已提交
575
	if (tape->pc_stack_index == IDETAPE_PC_STACK)
576
		tape->pc_stack_index = 0;
L
Linus Torvalds 已提交
577 578 579 580 581 582 583 584
	return (&tape->pc_stack[tape->pc_stack_index++]);
}

/*
 *	idetape_next_rq_storage is used along with idetape_next_pc_storage.
 *	Since we queue packet commands in the request queue, we need to
 *	allocate a request, along with the allocation of a packet command.
 */
585

L
Linus Torvalds 已提交
586 587 588 589 590 591
/**************************************************************
 *                                                            *
 *  This should get fixed to use kmalloc(.., GFP_ATOMIC)      *
 *  followed later on by kfree().   -ml                       *
 *                                                            *
 **************************************************************/
592 593

static struct request *idetape_next_rq_storage(ide_drive_t *drive)
L
Linus Torvalds 已提交
594 595 596
{
	idetape_tape_t *tape = drive->driver_data;

597 598
	debug_log(DBG_PCRQ_STACK, "rq_stack_index=%d\n", tape->rq_stack_index);

L
Linus Torvalds 已提交
599
	if (tape->rq_stack_index == IDETAPE_PC_STACK)
600
		tape->rq_stack_index = 0;
L
Linus Torvalds 已提交
601 602 603
	return (&tape->rq_stack[tape->rq_stack_index++]);
}

604
static void idetape_init_pc(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
605 606 607 608
{
	memset(pc->c, 0, 12);
	pc->retries = 0;
	pc->flags = 0;
609 610 611
	pc->req_xfer = 0;
	pc->buf = pc->pc_buf;
	pc->buf_size = IDETAPE_PC_BUFFER_SIZE;
L
Linus Torvalds 已提交
612 613 614 615 616
	pc->bh = NULL;
	pc->b_data = NULL;
}

/*
617 618
 * called on each failed packet command retry to analyze the request sense. We
 * currently do not utilize this information.
L
Linus Torvalds 已提交
619
 */
620
static void idetape_analyze_error(ide_drive_t *drive, u8 *sense)
L
Linus Torvalds 已提交
621 622
{
	idetape_tape_t *tape = drive->driver_data;
623
	struct ide_atapi_pc *pc = tape->failed_pc;
L
Linus Torvalds 已提交
624

625 626 627
	tape->sense_key = sense[2] & 0xF;
	tape->asc       = sense[12];
	tape->ascq      = sense[13];
628 629 630

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

632
	/* Correct pc->xferred by asking the tape.	 */
633
	if (pc->flags & PC_FLAG_DMA_ERROR) {
634
		pc->xferred = pc->req_xfer -
635
			tape->blk_size *
636
			be32_to_cpu(get_unaligned((u32 *)&sense[3]));
L
Linus Torvalds 已提交
637 638 639 640 641 642 643 644
		idetape_update_buffers(pc);
	}

	/*
	 * 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.
	 */
645
	if ((pc->c[0] == READ_6 || pc->c[0] == WRITE_6)
646 647 648
	    /* length == 0 */
	    && pc->c[4] == 0 && pc->c[3] == 0 && pc->c[2] == 0) {
		if (tape->sense_key == 5) {
L
Linus Torvalds 已提交
649 650 651
			/* don't report an error, everything's ok */
			pc->error = 0;
			/* don't retry read/write */
652
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
653 654
		}
	}
655
	if (pc->c[0] == READ_6 && (sense[2] & 0x80)) {
L
Linus Torvalds 已提交
656
		pc->error = IDETAPE_ERROR_FILEMARK;
657
		pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
658
	}
659
	if (pc->c[0] == WRITE_6) {
660 661
		if ((sense[2] & 0x40) || (tape->sense_key == 0xd
		     && tape->asc == 0x0 && tape->ascq == 0x2)) {
L
Linus Torvalds 已提交
662
			pc->error = IDETAPE_ERROR_EOD;
663
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
664 665
		}
	}
666
	if (pc->c[0] == READ_6 || pc->c[0] == WRITE_6) {
667
		if (tape->sense_key == 8) {
L
Linus Torvalds 已提交
668
			pc->error = IDETAPE_ERROR_EOD;
669
			pc->flags |= PC_FLAG_ABORT;
L
Linus Torvalds 已提交
670
		}
671
		if (!(pc->flags & PC_FLAG_ABORT) &&
672
		    pc->xferred)
L
Linus Torvalds 已提交
673 674 675 676
			pc->retries = IDETAPE_MAX_PC_RETRIES + 1;
	}
}

677
static void idetape_activate_next_stage(ide_drive_t *drive)
L
Linus Torvalds 已提交
678 679 680 681 682
{
	idetape_tape_t *tape = drive->driver_data;
	idetape_stage_t *stage = tape->next_stage;
	struct request *rq = &stage->rq;

683 684
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
685
	if (stage == NULL) {
686 687
		printk(KERN_ERR "ide-tape: bug: Trying to activate a non"
				" existing stage\n");
L
Linus Torvalds 已提交
688 689 690 691 692 693
		return;
	}

	rq->rq_disk = tape->disk;
	rq->buffer = NULL;
	rq->special = (void *)stage->bh;
694
	tape->active_data_rq = rq;
L
Linus Torvalds 已提交
695 696 697 698
	tape->active_stage = stage;
	tape->next_stage = stage->next;
}

699
/* Free a stage along with its related buffers completely. */
700
static void __idetape_kfree_stage(idetape_stage_t *stage)
L
Linus Torvalds 已提交
701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
{
	struct idetape_bh *prev_bh, *bh = stage->bh;
	int size;

	while (bh != NULL) {
		if (bh->b_data != NULL) {
			size = (int) bh->b_size;
			while (size > 0) {
				free_page((unsigned long) bh->b_data);
				size -= PAGE_SIZE;
				bh->b_data += PAGE_SIZE;
			}
		}
		prev_bh = bh;
		bh = bh->b_reqnext;
		kfree(prev_bh);
	}
	kfree(stage);
}

721
static void idetape_kfree_stage(idetape_tape_t *tape, idetape_stage_t *stage)
L
Linus Torvalds 已提交
722 723 724 725 726
{
	__idetape_kfree_stage(stage);
}

/*
727 728
 * Remove tape->first_stage from the pipeline. The caller should avoid race
 * conditions.
L
Linus Torvalds 已提交
729
 */
730
static void idetape_remove_stage_head(ide_drive_t *drive)
L
Linus Torvalds 已提交
731 732 733
{
	idetape_tape_t *tape = drive->driver_data;
	idetape_stage_t *stage;
734 735 736

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

L
Linus Torvalds 已提交
737 738
	if (tape->first_stage == NULL) {
		printk(KERN_ERR "ide-tape: bug: tape->first_stage is NULL\n");
739
		return;
L
Linus Torvalds 已提交
740 741
	}
	if (tape->active_stage == tape->first_stage) {
742 743
		printk(KERN_ERR "ide-tape: bug: Trying to free our active "
				"pipeline stage\n");
L
Linus Torvalds 已提交
744 745 746 747 748 749 750 751 752
		return;
	}
	stage = tape->first_stage;
	tape->first_stage = stage->next;
	idetape_kfree_stage(tape, stage);
	tape->nr_stages--;
	if (tape->first_stage == NULL) {
		tape->last_stage = NULL;
		if (tape->next_stage != NULL)
753 754
			printk(KERN_ERR "ide-tape: bug: tape->next_stage !="
					" NULL\n");
L
Linus Torvalds 已提交
755
		if (tape->nr_stages)
756 757
			printk(KERN_ERR "ide-tape: bug: nr_stages should be 0 "
					"now\n");
L
Linus Torvalds 已提交
758 759 760 761 762 763 764 765 766 767 768 769 770 771
	}
}

/*
 * This will free all the pipeline stages starting from new_last_stage->next
 * to the end of the list, and point tape->last_stage to new_last_stage.
 */
static void idetape_abort_pipeline(ide_drive_t *drive,
				   idetape_stage_t *new_last_stage)
{
	idetape_tape_t *tape = drive->driver_data;
	idetape_stage_t *stage = new_last_stage->next;
	idetape_stage_t *nstage;

772 773
	debug_log(DBG_PROCS, "%s: Enter %s\n", tape->name, __func__);

L
Linus Torvalds 已提交
774 775 776 777 778 779 780 781 782 783 784 785 786 787
	while (stage) {
		nstage = stage->next;
		idetape_kfree_stage(tape, stage);
		--tape->nr_stages;
		--tape->nr_pending_stages;
		stage = nstage;
	}
	if (new_last_stage)
		new_last_stage->next = NULL;
	tape->last_stage = new_last_stage;
	tape->next_stage = NULL;
}

/*
788 789
 * Finish servicing a request and insert a pending pipeline request into the
 * main device queue.
L
Linus Torvalds 已提交
790 791 792 793 794 795 796 797 798 799
 */
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;
	int remove_stage = 0;
	idetape_stage_t *active_stage;

800
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
801 802

	switch (uptodate) {
803 804 805
	case 0:	error = IDETAPE_ERROR_GENERAL; break;
	case 1: error = 0; break;
	default: error = uptodate;
L
Linus Torvalds 已提交
806 807 808 809 810
	}
	rq->errors = error;
	if (error)
		tape->failed_pc = NULL;

811 812 813 814 815
	if (!blk_special_request(rq)) {
		ide_end_request(drive, uptodate, nr_sects);
		return 0;
	}

816
	spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
817 818

	/* The request was a pipelined data transfer request */
819
	if (tape->active_data_rq == rq) {
L
Linus Torvalds 已提交
820 821
		active_stage = tape->active_stage;
		tape->active_stage = NULL;
822
		tape->active_data_rq = NULL;
L
Linus Torvalds 已提交
823 824 825 826
		tape->nr_pending_stages--;
		if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
			remove_stage = 1;
			if (error) {
827 828
				set_bit(IDETAPE_FLAG_PIPELINE_ERR,
					&tape->flags);
L
Linus Torvalds 已提交
829
				if (error == IDETAPE_ERROR_EOD)
830 831
					idetape_abort_pipeline(drive,
								active_stage);
L
Linus Torvalds 已提交
832 833 834
			}
		} else if (rq->cmd[0] & REQ_IDETAPE_READ) {
			if (error == IDETAPE_ERROR_EOD) {
835 836
				set_bit(IDETAPE_FLAG_PIPELINE_ERR,
					&tape->flags);
L
Linus Torvalds 已提交
837 838 839 840
				idetape_abort_pipeline(drive, active_stage);
			}
		}
		if (tape->next_stage != NULL) {
841
			idetape_activate_next_stage(drive);
L
Linus Torvalds 已提交
842

843
			/* Insert the next request into the request queue. */
844 845
			(void)ide_do_drive_cmd(drive, tape->active_data_rq,
						ide_end);
L
Linus Torvalds 已提交
846
		} else if (!error) {
847 848 849 850 851 852 853 854 855 856 857 858 859 860 861
			/*
			 * This is a part of the feedback loop which tries to
			 * find the optimum number of stages. We are starting
			 * from a minimum maximum number of stages, and if we
			 * sense that the pipeline is empty, we try to increase
			 * it, until we reach the user compile time memory
			 * limit.
			 */
			int i = (tape->max_pipeline - tape->min_pipeline) / 10;

			tape->max_stages += max(i, 1);
			tape->max_stages = max(tape->max_stages,
						tape->min_pipeline);
			tape->max_stages = min(tape->max_stages,
						tape->max_pipeline);
L
Linus Torvalds 已提交
862 863 864 865 866 867
		}
	}
	ide_end_drive_cmd(drive, 0, 0);

	if (remove_stage)
		idetape_remove_stage_head(drive);
868
	if (tape->active_data_rq == NULL)
869
		clear_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags);
870
	spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
871 872 873
	return 0;
}

874
static ide_startstop_t idetape_request_sense_callback(ide_drive_t *drive)
L
Linus Torvalds 已提交
875 876 877
{
	idetape_tape_t *tape = drive->driver_data;

878 879
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
880
	if (!tape->pc->error) {
881
		idetape_analyze_error(drive, tape->pc->buf);
L
Linus Torvalds 已提交
882 883
		idetape_end_request(drive, 1, 0);
	} else {
884 885
		printk(KERN_ERR "ide-tape: Error in REQUEST SENSE itself - "
				"Aborting request!\n");
L
Linus Torvalds 已提交
886 887 888 889 890
		idetape_end_request(drive, 0, 0);
	}
	return ide_stopped;
}

891
static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
892
{
893
	idetape_init_pc(pc);
894
	pc->c[0] = REQUEST_SENSE;
L
Linus Torvalds 已提交
895
	pc->c[4] = 20;
896 897
	pc->req_xfer = 20;
	pc->idetape_callback = &idetape_request_sense_callback;
L
Linus Torvalds 已提交
898 899 900 901 902
}

static void idetape_init_rq(struct request *rq, u8 cmd)
{
	memset(rq, 0, sizeof(*rq));
903
	rq->cmd_type = REQ_TYPE_SPECIAL;
L
Linus Torvalds 已提交
904 905 906 907
	rq->cmd[0] = cmd;
}

/*
908 909 910 911 912
 * 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
 * pass through the driver. The function below is called from the request
 * handling part of the driver (the "bottom" part). Safe storage for the request
 * should be allocated with ide_tape_next_{pc,rq}_storage() prior to that.
L
Linus Torvalds 已提交
913
 *
914 915 916
 * Memory for those requests is pre-allocated at initialization time, and is
 * limited to IDETAPE_PC_STACK requests. We assume that we have enough space for
 * the maximum possible number of inter-dependent packet commands.
L
Linus Torvalds 已提交
917
 *
918 919 920
 * The higher level of the driver - The ioctl handler and the character device
 * handling functions should queue request to the lower level part and wait for
 * their completion using idetape_queue_pc_tail or idetape_queue_rw_tail.
L
Linus Torvalds 已提交
921
 */
922
static void idetape_queue_pc_head(ide_drive_t *drive, struct ide_atapi_pc *pc,
923
				  struct request *rq)
L
Linus Torvalds 已提交
924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940
{
	struct ide_tape_obj *tape = drive->driver_data;

	idetape_init_rq(rq, REQ_IDETAPE_PC1);
	rq->buffer = (char *) pc;
	rq->rq_disk = tape->disk;
	(void) ide_do_drive_cmd(drive, rq, ide_preempt);
}

/*
 *	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.
 */
static ide_startstop_t idetape_retry_pc (ide_drive_t *drive)
{
	idetape_tape_t *tape = drive->driver_data;
941
	struct ide_atapi_pc *pc;
L
Linus Torvalds 已提交
942 943
	struct request *rq;

944
	(void)ide_read_error(drive);
L
Linus Torvalds 已提交
945 946 947
	pc = idetape_next_pc_storage(drive);
	rq = idetape_next_rq_storage(drive);
	idetape_create_request_sense_cmd(pc);
948
	set_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags);
L
Linus Torvalds 已提交
949 950 951 952 953
	idetape_queue_pc_head(drive, pc, rq);
	return ide_stopped;
}

/*
954 955
 * 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 已提交
956
 */
957
static void idetape_postpone_request(ide_drive_t *drive)
L
Linus Torvalds 已提交
958 959 960
{
	idetape_tape_t *tape = drive->driver_data;

961 962
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
963
	tape->postponed_rq = HWGROUP(drive)->rq;
964
	ide_stall_queue(drive, tape->dsc_poll_freq);
L
Linus Torvalds 已提交
965 966
}

967
typedef void idetape_io_buf(ide_drive_t *, struct ide_atapi_pc *, unsigned int);
968

L
Linus Torvalds 已提交
969
/*
970 971 972 973
 * 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
974
 * idetape_issue_pc.
L
Linus Torvalds 已提交
975
 */
976
static ide_startstop_t idetape_pc_intr(ide_drive_t *drive)
L
Linus Torvalds 已提交
977 978 979
{
	ide_hwif_t *hwif = drive->hwif;
	idetape_tape_t *tape = drive->driver_data;
980
	struct ide_atapi_pc *pc = tape->pc;
981 982
	xfer_func_t *xferfunc;
	idetape_io_buf *iobuf;
L
Linus Torvalds 已提交
983 984
	unsigned int temp;
#if SIMULATE_ERRORS
985
	static int error_sim_count;
L
Linus Torvalds 已提交
986
#endif
987
	u16 bcount;
988
	u8 stat, ireason;
L
Linus Torvalds 已提交
989

990
	debug_log(DBG_PROCS, "Enter %s - interrupt handler\n", __func__);
L
Linus Torvalds 已提交
991 992

	/* Clear the interrupt */
993
	stat = ide_read_status(drive);
L
Linus Torvalds 已提交
994

995
	if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
996
		if (hwif->ide_dma_end(drive) || (stat & ERR_STAT)) {
L
Linus Torvalds 已提交
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
			/*
			 * A DMA error is sometimes expected. For example,
			 * if the tape is crossing a filemark during a
			 * READ command, it will issue an irq and position
			 * itself before the filemark, so that only a partial
			 * data transfer will occur (which causes the DMA
			 * error). In that case, we will later ask the tape
			 * how much bytes of the original request were
			 * actually transferred (we can't receive that
			 * information from the DMA engine on most chipsets).
			 */

			/*
			 * On the contrary, a DMA error is never expected;
			 * it usually indicates a hardware error or abort.
			 * If the tape crosses a filemark during a READ
			 * command, it will issue an irq and position itself
			 * after the filemark (not before). Only a partial
			 * data transfer will occur, but no DMA error.
			 * (AS, 19 Apr 2001)
			 */
1018
			pc->flags |= PC_FLAG_DMA_ERROR;
L
Linus Torvalds 已提交
1019
		} else {
1020
			pc->xferred = pc->req_xfer;
L
Linus Torvalds 已提交
1021 1022
			idetape_update_buffers(pc);
		}
1023 1024
		debug_log(DBG_PROCS, "DMA finished\n");

L
Linus Torvalds 已提交
1025 1026 1027
	}

	/* No more interrupts */
1028
	if ((stat & DRQ_STAT) == 0) {
1029
		debug_log(DBG_SENSE, "Packet command completed, %d bytes"
1030
				" transferred\n", pc->xferred);
L
Linus Torvalds 已提交
1031

1032
		pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
L
Linus Torvalds 已提交
1033 1034 1035
		local_irq_enable();

#if SIMULATE_ERRORS
1036
		if ((pc->c[0] == WRITE_6 || pc->c[0] == READ_6) &&
L
Linus Torvalds 已提交
1037 1038 1039
		    (++error_sim_count % 100) == 0) {
			printk(KERN_INFO "ide-tape: %s: simulating error\n",
				tape->name);
1040
			stat |= ERR_STAT;
L
Linus Torvalds 已提交
1041 1042
		}
#endif
1043
		if ((stat & ERR_STAT) && pc->c[0] == REQUEST_SENSE)
1044
			stat &= ~ERR_STAT;
1045
		if ((stat & ERR_STAT) || (pc->flags & PC_FLAG_DMA_ERROR)) {
1046
			/* Error detected */
1047 1048
			debug_log(DBG_ERR, "%s: I/O error\n", tape->name);

1049
			if (pc->c[0] == REQUEST_SENSE) {
1050 1051
				printk(KERN_ERR "ide-tape: I/O error in request"
						" sense command\n");
L
Linus Torvalds 已提交
1052 1053
				return ide_do_reset(drive);
			}
1054 1055 1056
			debug_log(DBG_ERR, "[cmd %x]: check condition\n",
					pc->c[0]);

L
Linus Torvalds 已提交
1057 1058 1059 1060
			/* Retry operation */
			return idetape_retry_pc(drive);
		}
		pc->error = 0;
1061
		if ((pc->flags & PC_FLAG_WAIT_FOR_DSC) &&
1062
		    (stat & SEEK_STAT) == 0) {
L
Linus Torvalds 已提交
1063 1064
			/* Media access command */
			tape->dsc_polling_start = jiffies;
1065
			tape->dsc_poll_freq = IDETAPE_DSC_MA_FAST;
L
Linus Torvalds 已提交
1066 1067 1068 1069 1070 1071 1072 1073
			tape->dsc_timeout = jiffies + IDETAPE_DSC_MA_TIMEOUT;
			/* Allow ide.c to handle other requests */
			idetape_postpone_request(drive);
			return ide_stopped;
		}
		if (tape->failed_pc == pc)
			tape->failed_pc = NULL;
		/* Command finished - Call the callback function */
1074
		return pc->idetape_callback(drive);
L
Linus Torvalds 已提交
1075
	}
1076 1077 1078

	if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) {
		pc->flags &= ~PC_FLAG_DMA_IN_PROGRESS;
L
Linus Torvalds 已提交
1079 1080 1081
		printk(KERN_ERR "ide-tape: The tape wants to issue more "
				"interrupts in DMA mode\n");
		printk(KERN_ERR "ide-tape: DMA disabled, reverting to PIO\n");
1082
		ide_dma_off(drive);
L
Linus Torvalds 已提交
1083 1084 1085
		return ide_do_reset(drive);
	}
	/* Get the number of bytes to transfer on this interrupt. */
1086 1087
	bcount = (hwif->INB(hwif->io_ports[IDE_BCOUNTH_OFFSET]) << 8) |
		  hwif->INB(hwif->io_ports[IDE_BCOUNTL_OFFSET]);
L
Linus Torvalds 已提交
1088

1089
	ireason = hwif->INB(hwif->io_ports[IDE_IREASON_OFFSET]);
L
Linus Torvalds 已提交
1090

1091
	if (ireason & CD) {
1092
		printk(KERN_ERR "ide-tape: CoD != 0 in %s\n", __func__);
L
Linus Torvalds 已提交
1093 1094
		return ide_do_reset(drive);
	}
1095
	if (((ireason & IO) == IO) == !!(pc->flags & PC_FLAG_WRITING)) {
L
Linus Torvalds 已提交
1096 1097
		/* Hopefully, we will never get here */
		printk(KERN_ERR "ide-tape: We wanted to %s, ",
1098
				(ireason & IO) ? "Write" : "Read");
L
Linus Torvalds 已提交
1099
		printk(KERN_ERR "ide-tape: but the tape wants us to %s !\n",
1100
				(ireason & IO) ? "Read" : "Write");
L
Linus Torvalds 已提交
1101 1102
		return ide_do_reset(drive);
	}
1103
	if (!(pc->flags & PC_FLAG_WRITING)) {
L
Linus Torvalds 已提交
1104
		/* Reading - Check that we have enough space */
1105 1106 1107
		temp = pc->xferred + bcount;
		if (temp > pc->req_xfer) {
			if (temp > pc->buf_size) {
1108 1109 1110
				printk(KERN_ERR "ide-tape: The tape wants to "
					"send us more data than expected "
					"- discarding data\n");
1111
				ide_atapi_discard_data(drive, bcount);
1112 1113
				ide_set_handler(drive, &idetape_pc_intr,
						IDETAPE_WAIT_CMD, NULL);
L
Linus Torvalds 已提交
1114 1115
				return ide_started;
			}
1116 1117
			debug_log(DBG_SENSE, "The tape wants to send us more "
				"data than expected - allowing transfer\n");
L
Linus Torvalds 已提交
1118
		}
1119 1120
		iobuf = &idetape_input_buffers;
		xferfunc = hwif->atapi_input_bytes;
L
Linus Torvalds 已提交
1121
	} else {
1122 1123
		iobuf = &idetape_output_buffers;
		xferfunc = hwif->atapi_output_bytes;
L
Linus Torvalds 已提交
1124
	}
1125 1126 1127 1128

	if (pc->bh)
		iobuf(drive, pc, bcount);
	else
1129
		xferfunc(drive, pc->cur_pos, bcount);
1130

L
Linus Torvalds 已提交
1131
	/* Update the current position */
1132 1133
	pc->xferred += bcount;
	pc->cur_pos += bcount;
1134 1135 1136 1137

	debug_log(DBG_SENSE, "[cmd %x] transferred %d bytes on that intr.\n",
			pc->c[0], bcount);

L
Linus Torvalds 已提交
1138 1139 1140 1141 1142 1143
	/* And set the interrupt handler again */
	ide_set_handler(drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL);
	return ide_started;
}

/*
1144
 * Packet Command Interface
L
Linus Torvalds 已提交
1145
 *
1146 1147 1148
 * 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 已提交
1149
 *
1150
 * The handling will be done in three stages:
L
Linus Torvalds 已提交
1151
 *
1152 1153
 * 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 已提交
1154
 *
1155 1156
 * 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 已提交
1157
 *
1158 1159 1160 1161 1162 1163 1164
 * 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 已提交
1165
 *
1166 1167
 * 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 已提交
1168
 *
1169
 * 4. When the packet command is finished, it will be checked for errors.
L
Linus Torvalds 已提交
1170
 *
1171 1172 1173
 * 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 已提交
1174
 *
1175 1176 1177
 * 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 已提交
1178 1179 1180 1181 1182
 */
static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive)
{
	ide_hwif_t *hwif = drive->hwif;
	idetape_tape_t *tape = drive->driver_data;
1183
	struct ide_atapi_pc *pc = tape->pc;
L
Linus Torvalds 已提交
1184 1185
	int retries = 100;
	ide_startstop_t startstop;
1186
	u8 ireason;
L
Linus Torvalds 已提交
1187

1188 1189 1190
	if (ide_wait_stat(&startstop, drive, DRQ_STAT, BUSY_STAT, WAIT_READY)) {
		printk(KERN_ERR "ide-tape: Strange, packet command initiated "
				"yet DRQ isn't asserted\n");
L
Linus Torvalds 已提交
1191 1192
		return startstop;
	}
1193
	ireason = hwif->INB(hwif->io_ports[IDE_IREASON_OFFSET]);
1194
	while (retries-- && ((ireason & CD) == 0 || (ireason & IO))) {
L
Linus Torvalds 已提交
1195 1196 1197
		printk(KERN_ERR "ide-tape: (IO,CoD != (0,1) while issuing "
				"a packet command, retrying\n");
		udelay(100);
1198
		ireason = hwif->INB(hwif->io_ports[IDE_IREASON_OFFSET]);
L
Linus Torvalds 已提交
1199 1200 1201
		if (retries == 0) {
			printk(KERN_ERR "ide-tape: (IO,CoD != (0,1) while "
					"issuing a packet command, ignoring\n");
1202 1203
			ireason |= CD;
			ireason &= ~IO;
L
Linus Torvalds 已提交
1204 1205
		}
	}
1206
	if ((ireason & CD) == 0 || (ireason & IO)) {
L
Linus Torvalds 已提交
1207 1208 1209 1210 1211 1212 1213 1214
		printk(KERN_ERR "ide-tape: (IO,CoD) != (0,1) while issuing "
				"a packet command\n");
		return ide_do_reset(drive);
	}
	/* Set the interrupt routine */
	ide_set_handler(drive, &idetape_pc_intr, IDETAPE_WAIT_CMD, NULL);
#ifdef CONFIG_BLK_DEV_IDEDMA
	/* Begin DMA, if necessary */
1215
	if (pc->flags & PC_FLAG_DMA_IN_PROGRESS)
L
Linus Torvalds 已提交
1216 1217 1218 1219 1220 1221 1222
		hwif->dma_start(drive);
#endif
	/* Send the actual packet */
	HWIF(drive)->atapi_output_bytes(drive, pc->c, 12);
	return ide_started;
}

1223 1224
static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
		struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1225 1226 1227 1228
{
	ide_hwif_t *hwif = drive->hwif;
	idetape_tape_t *tape = drive->driver_data;
	int dma_ok = 0;
1229
	u16 bcount;
L
Linus Torvalds 已提交
1230

1231 1232
	if (tape->pc->c[0] == REQUEST_SENSE &&
	    pc->c[0] == REQUEST_SENSE) {
L
Linus Torvalds 已提交
1233 1234 1235 1236
		printk(KERN_ERR "ide-tape: possible ide-tape.c bug - "
			"Two request sense in serial were issued\n");
	}

1237
	if (tape->failed_pc == NULL && pc->c[0] != REQUEST_SENSE)
L
Linus Torvalds 已提交
1238 1239 1240 1241 1242
		tape->failed_pc = pc;
	/* Set the current packet command */
	tape->pc = pc;

	if (pc->retries > IDETAPE_MAX_PC_RETRIES ||
1243
		(pc->flags & PC_FLAG_ABORT)) {
L
Linus Torvalds 已提交
1244
		/*
1245 1246 1247
		 * 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 已提交
1248
		 */
1249
		if (!(pc->flags & PC_FLAG_ABORT)) {
1250
			if (!(pc->c[0] == TEST_UNIT_READY &&
L
Linus Torvalds 已提交
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263
			      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;
1264
		return pc->idetape_callback(drive);
L
Linus Torvalds 已提交
1265
	}
1266
	debug_log(DBG_SENSE, "Retry #%d, cmd = %02X\n", pc->retries, pc->c[0]);
L
Linus Torvalds 已提交
1267 1268 1269

	pc->retries++;
	/* We haven't transferred any data yet */
1270 1271
	pc->xferred = 0;
	pc->cur_pos = pc->buf;
L
Linus Torvalds 已提交
1272
	/* Request to transfer the entire buffer at once */
1273
	bcount = pc->req_xfer;
L
Linus Torvalds 已提交
1274

1275 1276
	if (pc->flags & PC_FLAG_DMA_ERROR) {
		pc->flags &= ~PC_FLAG_DMA_ERROR;
L
Linus Torvalds 已提交
1277 1278
		printk(KERN_WARNING "ide-tape: DMA disabled, "
				"reverting to PIO\n");
1279
		ide_dma_off(drive);
L
Linus Torvalds 已提交
1280
	}
1281
	if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma)
L
Linus Torvalds 已提交
1282 1283
		dma_ok = !hwif->dma_setup(drive);

1284 1285 1286
	ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK |
			   IDE_TFLAG_OUT_DEVICE, bcount, dma_ok);

1287 1288 1289 1290
	if (dma_ok)
		/* Will begin DMA later */
		pc->flags |= PC_FLAG_DMA_IN_PROGRESS;
	if (test_bit(IDETAPE_FLAG_DRQ_INTERRUPT, &tape->flags)) {
1291 1292
		ide_execute_command(drive, WIN_PACKETCMD, &idetape_transfer_pc,
				    IDETAPE_WAIT_CMD, NULL);
L
Linus Torvalds 已提交
1293 1294
		return ide_started;
	} else {
1295
		hwif->OUTB(WIN_PACKETCMD, hwif->io_ports[IDE_COMMAND_OFFSET]);
L
Linus Torvalds 已提交
1296 1297 1298 1299
		return idetape_transfer_pc(drive);
	}
}

1300
static ide_startstop_t idetape_pc_callback(ide_drive_t *drive)
L
Linus Torvalds 已提交
1301 1302
{
	idetape_tape_t *tape = drive->driver_data;
1303 1304

	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1305 1306 1307 1308 1309

	idetape_end_request(drive, tape->pc->error ? 0 : 1, 0);
	return ide_stopped;
}

1310
/* A mode sense command is used to "sense" tape parameters. */
1311
static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
L
Linus Torvalds 已提交
1312 1313
{
	idetape_init_pc(pc);
1314
	pc->c[0] = MODE_SENSE;
L
Linus Torvalds 已提交
1315
	if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
1316 1317
		/* DBD = 1 - Don't return block descriptors */
		pc->c[1] = 8;
L
Linus Torvalds 已提交
1318 1319 1320 1321 1322 1323 1324 1325 1326
	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;
1327 1328
	/* We will just discard data in that case */
	pc->c[4] = 255;
L
Linus Torvalds 已提交
1329
	if (page_code == IDETAPE_BLOCK_DESCRIPTOR)
1330
		pc->req_xfer = 12;
L
Linus Torvalds 已提交
1331
	else if (page_code == IDETAPE_CAPABILITIES_PAGE)
1332
		pc->req_xfer = 24;
L
Linus Torvalds 已提交
1333
	else
1334 1335
		pc->req_xfer = 50;
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
1336 1337
}

1338
static void idetape_calculate_speeds(ide_drive_t *drive)
L
Linus Torvalds 已提交
1339 1340 1341
{
	idetape_tape_t *tape = drive->driver_data;

1342 1343 1344 1345 1346 1347
	if (time_after(jiffies,
			tape->controlled_pipeline_head_time + 120 * HZ)) {
		tape->controlled_previous_pipeline_head =
			tape->controlled_last_pipeline_head;
		tape->controlled_previous_head_time =
			tape->controlled_pipeline_head_time;
L
Linus Torvalds 已提交
1348 1349 1350 1351
		tape->controlled_last_pipeline_head = tape->pipeline_head;
		tape->controlled_pipeline_head_time = jiffies;
	}
	if (time_after(jiffies, tape->controlled_pipeline_head_time + 60 * HZ))
1352 1353 1354
		tape->controlled_pipeline_head_speed = (tape->pipeline_head -
				tape->controlled_last_pipeline_head) * 32 * HZ /
				(jiffies - tape->controlled_pipeline_head_time);
L
Linus Torvalds 已提交
1355
	else if (time_after(jiffies, tape->controlled_previous_head_time))
1356 1357 1358
		tape->controlled_pipeline_head_speed = (tape->pipeline_head -
				tape->controlled_previous_pipeline_head) * 32 *
			HZ / (jiffies - tape->controlled_previous_head_time);
L
Linus Torvalds 已提交
1359

1360
	if (tape->nr_pending_stages < tape->max_stages/*- 1 */) {
L
Linus Torvalds 已提交
1361
		/* -1 for read mode error recovery */
1362 1363
		if (time_after(jiffies, tape->uncontrolled_previous_head_time +
					10 * HZ)) {
L
Linus Torvalds 已提交
1364
			tape->uncontrolled_pipeline_head_time = jiffies;
1365 1366 1367 1368 1369
			tape->uncontrolled_pipeline_head_speed =
				(tape->pipeline_head -
				 tape->uncontrolled_previous_pipeline_head) *
				32 * HZ / (jiffies -
					tape->uncontrolled_previous_head_time);
L
Linus Torvalds 已提交
1370 1371 1372 1373
		}
	} else {
		tape->uncontrolled_previous_head_time = jiffies;
		tape->uncontrolled_previous_pipeline_head = tape->pipeline_head;
1374 1375
		if (time_after(jiffies, tape->uncontrolled_pipeline_head_time +
					30 * HZ))
L
Linus Torvalds 已提交
1376
			tape->uncontrolled_pipeline_head_time = jiffies;
1377

L
Linus Torvalds 已提交
1378
	}
1379 1380
	tape->pipeline_head_speed = max(tape->uncontrolled_pipeline_head_speed,
					tape->controlled_pipeline_head_speed);
1381 1382

	if (tape->speed_control == 1) {
L
Linus Torvalds 已提交
1383 1384
		if (tape->nr_pending_stages >= tape->max_stages / 2)
			tape->max_insert_speed = tape->pipeline_head_speed +
1385 1386 1387
				(1100 - tape->pipeline_head_speed) * 2 *
				(tape->nr_pending_stages - tape->max_stages / 2)
				/ tape->max_stages;
L
Linus Torvalds 已提交
1388 1389
		else
			tape->max_insert_speed = 500 +
1390 1391
				(tape->pipeline_head_speed - 500) * 2 *
				tape->nr_pending_stages / tape->max_stages;
1392

L
Linus Torvalds 已提交
1393 1394 1395 1396
		if (tape->nr_pending_stages >= tape->max_stages * 99 / 100)
			tape->max_insert_speed = 5000;
	} else
		tape->max_insert_speed = tape->speed_control;
1397

L
Linus Torvalds 已提交
1398 1399 1400
	tape->max_insert_speed = max(tape->max_insert_speed, 500);
}

1401
static ide_startstop_t idetape_media_access_finished(ide_drive_t *drive)
L
Linus Torvalds 已提交
1402 1403
{
	idetape_tape_t *tape = drive->driver_data;
1404
	struct ide_atapi_pc *pc = tape->pc;
1405
	u8 stat;
L
Linus Torvalds 已提交
1406

1407 1408
	stat = ide_read_status(drive);

1409 1410
	if (stat & SEEK_STAT) {
		if (stat & ERR_STAT) {
L
Linus Torvalds 已提交
1411
			/* Error detected */
1412
			if (pc->c[0] != TEST_UNIT_READY)
L
Linus Torvalds 已提交
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424
				printk(KERN_ERR "ide-tape: %s: I/O error, ",
						tape->name);
			/* Retry operation */
			return idetape_retry_pc(drive);
		}
		pc->error = 0;
		if (tape->failed_pc == pc)
			tape->failed_pc = NULL;
	} else {
		pc->error = IDETAPE_ERROR_GENERAL;
		tape->failed_pc = NULL;
	}
1425
	return pc->idetape_callback(drive);
L
Linus Torvalds 已提交
1426 1427
}

1428
static ide_startstop_t idetape_rw_callback(ide_drive_t *drive)
L
Linus Torvalds 已提交
1429 1430 1431
{
	idetape_tape_t *tape = drive->driver_data;
	struct request *rq = HWGROUP(drive)->rq;
1432
	int blocks = tape->pc->xferred / tape->blk_size;
L
Linus Torvalds 已提交
1433

1434 1435
	tape->avg_size += blocks * tape->blk_size;
	tape->insert_size += blocks * tape->blk_size;
L
Linus Torvalds 已提交
1436 1437 1438 1439 1440 1441 1442 1443
	if (tape->insert_size > 1024 * 1024)
		tape->measure_insert_time = 1;
	if (tape->measure_insert_time) {
		tape->measure_insert_time = 0;
		tape->insert_time = jiffies;
		tape->insert_size = 0;
	}
	if (time_after(jiffies, tape->insert_time))
1444 1445
		tape->insert_speed = tape->insert_size / 1024 * HZ /
					(jiffies - tape->insert_time);
1446
	if (time_after_eq(jiffies, tape->avg_time + HZ)) {
1447 1448
		tape->avg_speed = tape->avg_size * HZ /
				(jiffies - tape->avg_time) / 1024;
L
Linus Torvalds 已提交
1449 1450 1451
		tape->avg_size = 0;
		tape->avg_time = jiffies;
	}
1452
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1453

1454
	tape->first_frame += blocks;
L
Linus Torvalds 已提交
1455 1456 1457 1458 1459 1460 1461 1462 1463
	rq->current_nr_sectors -= blocks;

	if (!tape->pc->error)
		idetape_end_request(drive, 1, 0);
	else
		idetape_end_request(drive, tape->pc->error, 0);
	return ide_stopped;
}

1464 1465
static void idetape_create_read_cmd(idetape_tape_t *tape,
		struct ide_atapi_pc *pc,
1466
		unsigned int length, struct idetape_bh *bh)
L
Linus Torvalds 已提交
1467 1468
{
	idetape_init_pc(pc);
1469
	pc->c[0] = READ_6;
1470
	put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
L
Linus Torvalds 已提交
1471
	pc->c[1] = 1;
1472
	pc->idetape_callback = &idetape_rw_callback;
L
Linus Torvalds 已提交
1473 1474
	pc->bh = bh;
	atomic_set(&bh->b_count, 0);
1475 1476 1477 1478
	pc->buf = NULL;
	pc->buf_size = length * tape->blk_size;
	pc->req_xfer = pc->buf_size;
	if (pc->req_xfer == tape->stage_size)
1479
		pc->flags |= PC_FLAG_DMA_RECOMMENDED;
L
Linus Torvalds 已提交
1480 1481
}

1482 1483
static void idetape_create_write_cmd(idetape_tape_t *tape,
		struct ide_atapi_pc *pc,
1484
		unsigned int length, struct idetape_bh *bh)
L
Linus Torvalds 已提交
1485 1486
{
	idetape_init_pc(pc);
1487
	pc->c[0] = WRITE_6;
1488
	put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
L
Linus Torvalds 已提交
1489
	pc->c[1] = 1;
1490
	pc->idetape_callback = &idetape_rw_callback;
1491
	pc->flags |= PC_FLAG_WRITING;
L
Linus Torvalds 已提交
1492 1493 1494
	pc->bh = bh;
	pc->b_data = bh->b_data;
	pc->b_count = atomic_read(&bh->b_count);
1495 1496 1497 1498
	pc->buf = NULL;
	pc->buf_size = length * tape->blk_size;
	pc->req_xfer = pc->buf_size;
	if (pc->req_xfer == tape->stage_size)
1499
		pc->flags |= PC_FLAG_DMA_RECOMMENDED;
L
Linus Torvalds 已提交
1500 1501 1502 1503 1504 1505
}

static ide_startstop_t idetape_do_request(ide_drive_t *drive,
					  struct request *rq, sector_t block)
{
	idetape_tape_t *tape = drive->driver_data;
1506
	struct ide_atapi_pc *pc = NULL;
L
Linus Torvalds 已提交
1507
	struct request *postponed_rq = tape->postponed_rq;
1508
	u8 stat;
L
Linus Torvalds 已提交
1509

1510 1511
	debug_log(DBG_SENSE, "sector: %ld, nr_sectors: %ld,"
			" current_nr_sectors: %d\n",
L
Linus Torvalds 已提交
1512 1513
			rq->sector, rq->nr_sectors, rq->current_nr_sectors);

1514
	if (!blk_special_request(rq)) {
1515
		/* We do not support buffer cache originated requests. */
L
Linus Torvalds 已提交
1516
		printk(KERN_NOTICE "ide-tape: %s: Unsupported request in "
1517
			"request queue (%d)\n", drive->name, rq->cmd_type);
L
Linus Torvalds 已提交
1518 1519 1520 1521
		ide_end_request(drive, 0, 0);
		return ide_stopped;
	}

1522
	/* Retry a failed packet command */
1523
	if (tape->failed_pc && tape->pc->c[0] == REQUEST_SENSE)
1524
		return idetape_issue_pc(drive, tape->failed_pc);
1525

L
Linus Torvalds 已提交
1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
	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.
	 */
1540
	stat = ide_read_status(drive);
L
Linus Torvalds 已提交
1541 1542

	if (!drive->dsc_overlap && !(rq->cmd[0] & REQ_IDETAPE_PC2))
1543
		set_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags);
L
Linus Torvalds 已提交
1544 1545

	if (drive->post_reset == 1) {
1546
		set_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags);
L
Linus Torvalds 已提交
1547 1548 1549 1550
		drive->post_reset = 0;
	}

	if (time_after(jiffies, tape->insert_time))
1551 1552
		tape->insert_speed = tape->insert_size / 1024 * HZ /
					(jiffies - tape->insert_time);
1553
	idetape_calculate_speeds(drive);
1554
	if (!test_and_clear_bit(IDETAPE_FLAG_IGNORE_DSC, &tape->flags) &&
1555
	    (stat & SEEK_STAT) == 0) {
L
Linus Torvalds 已提交
1556 1557
		if (postponed_rq == NULL) {
			tape->dsc_polling_start = jiffies;
1558
			tape->dsc_poll_freq = tape->best_dsc_rw_freq;
L
Linus Torvalds 已提交
1559 1560 1561 1562 1563 1564 1565 1566 1567 1568
			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);
			if (rq->cmd[0] & REQ_IDETAPE_PC2) {
				idetape_media_access_finished(drive);
				return ide_stopped;
			} else {
				return ide_do_reset(drive);
			}
1569 1570 1571
		} else if (time_after(jiffies,
					tape->dsc_polling_start +
					IDETAPE_DSC_MA_THRESHOLD))
1572
			tape->dsc_poll_freq = IDETAPE_DSC_MA_SLOW;
L
Linus Torvalds 已提交
1573 1574 1575 1576 1577 1578 1579
		idetape_postpone_request(drive);
		return ide_stopped;
	}
	if (rq->cmd[0] & REQ_IDETAPE_READ) {
		tape->buffer_head++;
		tape->postpone_cnt = 0;
		pc = idetape_next_pc_storage(drive);
1580 1581
		idetape_create_read_cmd(tape, pc, rq->current_nr_sectors,
					(struct idetape_bh *)rq->special);
L
Linus Torvalds 已提交
1582 1583 1584 1585 1586 1587
		goto out;
	}
	if (rq->cmd[0] & REQ_IDETAPE_WRITE) {
		tape->buffer_head++;
		tape->postpone_cnt = 0;
		pc = idetape_next_pc_storage(drive);
1588 1589
		idetape_create_write_cmd(tape, pc, rq->current_nr_sectors,
					 (struct idetape_bh *)rq->special);
L
Linus Torvalds 已提交
1590 1591 1592
		goto out;
	}
	if (rq->cmd[0] & REQ_IDETAPE_PC1) {
1593
		pc = (struct ide_atapi_pc *) rq->buffer;
L
Linus Torvalds 已提交
1594 1595 1596 1597 1598 1599 1600 1601 1602 1603
		rq->cmd[0] &= ~(REQ_IDETAPE_PC1);
		rq->cmd[0] |= REQ_IDETAPE_PC2;
		goto out;
	}
	if (rq->cmd[0] & REQ_IDETAPE_PC2) {
		idetape_media_access_finished(drive);
		return ide_stopped;
	}
	BUG();
out:
1604
	return idetape_issue_pc(drive, pc);
L
Linus Torvalds 已提交
1605 1606
}

1607
/* Pipeline related functions */
1608
static inline int idetape_pipeline_active(idetape_tape_t *tape)
L
Linus Torvalds 已提交
1609 1610 1611
{
	int rc1, rc2;

1612
	rc1 = test_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags);
1613
	rc2 = (tape->active_data_rq != NULL);
L
Linus Torvalds 已提交
1614 1615 1616 1617
	return rc1;
}

/*
1618 1619 1620 1621
 * The function below uses __get_free_page to allocate a pipeline stage, along
 * with all the necessary small buffers which together make a buffer of size
 * tape->stage_size (or a bit more). We attempt to combine sequential pages as
 * much as possible.
L
Linus Torvalds 已提交
1622
 *
1623 1624
 * It returns a pointer to the new allocated stage, or NULL if we can't (or
 * don't want to) allocate a stage.
L
Linus Torvalds 已提交
1625
 *
1626 1627
 * Pipeline stages are optional and are used to increase performance. If we
 * can't allocate them, we'll manage without them.
L
Linus Torvalds 已提交
1628
 */
1629 1630
static idetape_stage_t *__idetape_kmalloc_stage(idetape_tape_t *tape, int full,
						int clear)
L
Linus Torvalds 已提交
1631 1632 1633 1634 1635 1636
{
	idetape_stage_t *stage;
	struct idetape_bh *prev_bh, *bh;
	int pages = tape->pages_per_stage;
	char *b_data = NULL;

1637 1638
	stage = kmalloc(sizeof(idetape_stage_t), GFP_KERNEL);
	if (!stage)
L
Linus Torvalds 已提交
1639 1640 1641
		return NULL;
	stage->next = NULL;

1642 1643
	stage->bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
	bh = stage->bh;
L
Linus Torvalds 已提交
1644 1645 1646
	if (bh == NULL)
		goto abort;
	bh->b_reqnext = NULL;
1647 1648
	bh->b_data = (char *) __get_free_page(GFP_KERNEL);
	if (!bh->b_data)
L
Linus Torvalds 已提交
1649 1650 1651 1652 1653 1654 1655
		goto abort;
	if (clear)
		memset(bh->b_data, 0, PAGE_SIZE);
	bh->b_size = PAGE_SIZE;
	atomic_set(&bh->b_count, full ? bh->b_size : 0);

	while (--pages) {
1656 1657
		b_data = (char *) __get_free_page(GFP_KERNEL);
		if (!b_data)
L
Linus Torvalds 已提交
1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674
			goto abort;
		if (clear)
			memset(b_data, 0, PAGE_SIZE);
		if (bh->b_data == b_data + PAGE_SIZE) {
			bh->b_size += PAGE_SIZE;
			bh->b_data -= PAGE_SIZE;
			if (full)
				atomic_add(PAGE_SIZE, &bh->b_count);
			continue;
		}
		if (b_data == bh->b_data + bh->b_size) {
			bh->b_size += PAGE_SIZE;
			if (full)
				atomic_add(PAGE_SIZE, &bh->b_count);
			continue;
		}
		prev_bh = bh;
1675 1676
		bh = kmalloc(sizeof(struct idetape_bh), GFP_KERNEL);
		if (!bh) {
L
Linus Torvalds 已提交
1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694
			free_page((unsigned long) b_data);
			goto abort;
		}
		bh->b_reqnext = NULL;
		bh->b_data = b_data;
		bh->b_size = PAGE_SIZE;
		atomic_set(&bh->b_count, full ? bh->b_size : 0);
		prev_bh->b_reqnext = bh;
	}
	bh->b_size -= tape->excess_bh_size;
	if (full)
		atomic_sub(tape->excess_bh_size, &bh->b_count);
	return stage;
abort:
	__idetape_kfree_stage(stage);
	return NULL;
}

1695
static idetape_stage_t *idetape_kmalloc_stage(idetape_tape_t *tape)
L
Linus Torvalds 已提交
1696 1697 1698
{
	idetape_stage_t *cache_stage = tape->cache_stage;

1699
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1700 1701 1702 1703 1704 1705 1706 1707 1708 1709

	if (tape->nr_stages >= tape->max_stages)
		return NULL;
	if (cache_stage != NULL) {
		tape->cache_stage = NULL;
		return cache_stage;
	}
	return __idetape_kmalloc_stage(tape, 0, 0);
}

1710 1711
static int idetape_copy_stage_from_user(idetape_tape_t *tape,
		idetape_stage_t *stage, const char __user *buf, int n)
L
Linus Torvalds 已提交
1712 1713 1714
{
	struct idetape_bh *bh = tape->bh;
	int count;
1715
	int ret = 0;
L
Linus Torvalds 已提交
1716 1717 1718

	while (n) {
		if (bh == NULL) {
1719 1720
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
1721
			return 1;
L
Linus Torvalds 已提交
1722
		}
1723 1724 1725 1726 1727
		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))
1728
			ret = 1;
L
Linus Torvalds 已提交
1729 1730 1731 1732 1733 1734 1735 1736 1737 1738
		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;
1739
	return ret;
L
Linus Torvalds 已提交
1740 1741
}

1742 1743
static int idetape_copy_stage_to_user(idetape_tape_t *tape, char __user *buf,
		idetape_stage_t *stage, int n)
L
Linus Torvalds 已提交
1744 1745 1746
{
	struct idetape_bh *bh = tape->bh;
	int count;
1747
	int ret = 0;
L
Linus Torvalds 已提交
1748 1749 1750

	while (n) {
		if (bh == NULL) {
1751 1752
			printk(KERN_ERR "ide-tape: bh == NULL in %s\n",
					__func__);
1753
			return 1;
L
Linus Torvalds 已提交
1754 1755
		}
		count = min(tape->b_count, n);
1756 1757
		if  (copy_to_user(buf, tape->b_data, count))
			ret = 1;
L
Linus Torvalds 已提交
1758 1759 1760 1761 1762
		n -= count;
		tape->b_data += count;
		tape->b_count -= count;
		buf += count;
		if (!tape->b_count) {
1763 1764
			bh = bh->b_reqnext;
			tape->bh = bh;
L
Linus Torvalds 已提交
1765 1766 1767 1768 1769 1770
			if (bh) {
				tape->b_data = bh->b_data;
				tape->b_count = atomic_read(&bh->b_count);
			}
		}
	}
1771
	return ret;
L
Linus Torvalds 已提交
1772 1773
}

1774
static void idetape_init_merge_stage(idetape_tape_t *tape)
L
Linus Torvalds 已提交
1775 1776
{
	struct idetape_bh *bh = tape->merge_stage->bh;
1777

L
Linus Torvalds 已提交
1778
	tape->bh = bh;
1779
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
L
Linus Torvalds 已提交
1780 1781 1782 1783 1784 1785 1786
		atomic_set(&bh->b_count, 0);
	else {
		tape->b_data = bh->b_data;
		tape->b_count = atomic_read(&bh->b_count);
	}
}

1787
static void idetape_switch_buffers(idetape_tape_t *tape, idetape_stage_t *stage)
L
Linus Torvalds 已提交
1788 1789 1790 1791 1792 1793 1794 1795 1796
{
	struct idetape_bh *tmp;

	tmp = stage->bh;
	stage->bh = tape->merge_stage->bh;
	tape->merge_stage->bh = tmp;
	idetape_init_merge_stage(tape);
}

1797
/* Add a new stage at the end of the pipeline. */
1798
static void idetape_add_stage_tail(ide_drive_t *drive, idetape_stage_t *stage)
L
Linus Torvalds 已提交
1799 1800 1801
{
	idetape_tape_t *tape = drive->driver_data;
	unsigned long flags;
1802 1803 1804

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

1805
	spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
1806 1807
	stage->next = NULL;
	if (tape->last_stage != NULL)
1808
		tape->last_stage->next = stage;
L
Linus Torvalds 已提交
1809
	else
1810 1811
		tape->first_stage = stage;
		tape->next_stage  = stage;
L
Linus Torvalds 已提交
1812 1813 1814 1815 1816
	tape->last_stage = stage;
	if (tape->next_stage == NULL)
		tape->next_stage = tape->last_stage;
	tape->nr_stages++;
	tape->nr_pending_stages++;
1817
	spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
1818 1819
}

1820 1821 1822
/* Install a completion in a pending request and sleep until it is serviced. The
 * caller should ensure that the request will not be serviced before we install
 * the completion (usually by disabling interrupts).
L
Linus Torvalds 已提交
1823
 */
1824
static void idetape_wait_for_request(ide_drive_t *drive, struct request *rq)
L
Linus Torvalds 已提交
1825
{
1826
	DECLARE_COMPLETION_ONSTACK(wait);
L
Linus Torvalds 已提交
1827 1828
	idetape_tape_t *tape = drive->driver_data;

1829
	if (rq == NULL || !blk_special_request(rq)) {
1830 1831
		printk(KERN_ERR "ide-tape: bug: Trying to sleep on non-valid"
				 " request\n");
L
Linus Torvalds 已提交
1832 1833
		return;
	}
1834
	rq->end_io_data = &wait;
L
Linus Torvalds 已提交
1835
	rq->end_io = blk_end_sync_rq;
1836
	spin_unlock_irq(&tape->lock);
L
Linus Torvalds 已提交
1837 1838
	wait_for_completion(&wait);
	/* The stage and its struct request have been deallocated */
1839
	spin_lock_irq(&tape->lock);
L
Linus Torvalds 已提交
1840 1841
}

1842
static ide_startstop_t idetape_read_position_callback(ide_drive_t *drive)
L
Linus Torvalds 已提交
1843 1844
{
	idetape_tape_t *tape = drive->driver_data;
1845
	u8 *readpos = tape->pc->buf;
1846 1847

	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1848 1849

	if (!tape->pc->error) {
1850 1851 1852 1853 1854 1855 1856 1857
		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");
1858
			clear_bit(IDETAPE_FLAG_ADDRESS_VALID, &tape->flags);
L
Linus Torvalds 已提交
1859 1860
			idetape_end_request(drive, 0, 0);
		} else {
1861
			debug_log(DBG_SENSE, "Block Location - %u\n",
1862 1863 1864
					be32_to_cpu(*(u32 *)&readpos[4]));

			tape->partition = readpos[1];
1865
			tape->first_frame =
1866
				be32_to_cpu(*(u32 *)&readpos[4]);
1867
			set_bit(IDETAPE_FLAG_ADDRESS_VALID, &tape->flags);
L
Linus Torvalds 已提交
1868 1869 1870 1871 1872 1873 1874 1875 1876
			idetape_end_request(drive, 1, 0);
		}
	} else {
		idetape_end_request(drive, 0, 0);
	}
	return ide_stopped;
}

/*
1877 1878
 * Write a filemark if write_filemark=1. Flush the device buffers without
 * writing a filemark otherwise.
L
Linus Torvalds 已提交
1879
 */
1880
static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
1881
		struct ide_atapi_pc *pc, int write_filemark)
L
Linus Torvalds 已提交
1882 1883
{
	idetape_init_pc(pc);
1884
	pc->c[0] = WRITE_FILEMARKS;
L
Linus Torvalds 已提交
1885
	pc->c[4] = write_filemark;
1886
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
1887
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
1888 1889
}

1890
static void idetape_create_test_unit_ready_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1891 1892
{
	idetape_init_pc(pc);
1893
	pc->c[0] = TEST_UNIT_READY;
1894
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
1895 1896 1897
}

/*
1898 1899 1900 1901 1902 1903
 * We add a special packet command request to the tail of the request queue, and
 * wait for it to be serviced. This is not to be called from within the request
 * handling part of the driver! We allocate here data on the stack and it is
 * valid until the request is finished. This is not the case for the bottom part
 * of the driver, where we are always leaving the functions to wait for an
 * interrupt or a timer event.
L
Linus Torvalds 已提交
1904
 *
1905 1906 1907 1908
 * From the bottom part of the driver, we should allocate safe memory using
 * idetape_next_pc_storage() and ide_tape_next_rq_storage(), and add the request
 * to the request list without waiting for it to be serviced! In that case, we
 * usually use idetape_queue_pc_head().
L
Linus Torvalds 已提交
1909
 */
1910
static int __idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1911 1912 1913 1914 1915 1916 1917 1918 1919 1920
{
	struct ide_tape_obj *tape = drive->driver_data;
	struct request rq;

	idetape_init_rq(&rq, REQ_IDETAPE_PC1);
	rq.buffer = (char *) pc;
	rq.rq_disk = tape->disk;
	return ide_do_drive_cmd(drive, &rq, ide_wait);
}

1921 1922
static void idetape_create_load_unload_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc, int cmd)
L
Linus Torvalds 已提交
1923 1924
{
	idetape_init_pc(pc);
1925
	pc->c[0] = START_STOP;
L
Linus Torvalds 已提交
1926
	pc->c[4] = cmd;
1927
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
1928
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
1929 1930 1931 1932 1933
}

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

1937
	/* Wait for the tape to become ready */
1938
	set_bit(IDETAPE_FLAG_MEDIUM_PRESENT, &tape->flags);
L
Linus Torvalds 已提交
1939 1940 1941 1942 1943 1944
	timeout += jiffies;
	while (time_before(jiffies, timeout)) {
		idetape_create_test_unit_ready_cmd(&pc);
		if (!__idetape_queue_pc_tail(drive, &pc))
			return 0;
		if ((tape->sense_key == 2 && tape->asc == 4 && tape->ascq == 2)
1945 1946
		    || (tape->asc == 0x3A)) {
			/* no media */
L
Linus Torvalds 已提交
1947 1948
			if (load_attempted)
				return -ENOMEDIUM;
1949 1950
			idetape_create_load_unload_cmd(drive, &pc,
							IDETAPE_LU_LOAD_MASK);
L
Linus Torvalds 已提交
1951 1952 1953 1954 1955 1956
			__idetape_queue_pc_tail(drive, &pc);
			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;
1957
		msleep(100);
L
Linus Torvalds 已提交
1958 1959 1960 1961
	}
	return -EIO;
}

1962
static int idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1963 1964 1965 1966
{
	return __idetape_queue_pc_tail(drive, pc);
}

1967
static int idetape_flush_tape_buffers(ide_drive_t *drive)
L
Linus Torvalds 已提交
1968
{
1969
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1970 1971 1972
	int rc;

	idetape_create_write_filemark_cmd(drive, &pc, 0);
1973 1974
	rc = idetape_queue_pc_tail(drive, &pc);
	if (rc)
L
Linus Torvalds 已提交
1975 1976 1977 1978 1979
		return rc;
	idetape_wait_ready(drive, 60 * 5 * HZ);
	return 0;
}

1980
static void idetape_create_read_position_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
1981 1982
{
	idetape_init_pc(pc);
1983
	pc->c[0] = READ_POSITION;
1984 1985
	pc->req_xfer = 20;
	pc->idetape_callback = &idetape_read_position_callback;
L
Linus Torvalds 已提交
1986 1987
}

1988
static int idetape_read_position(ide_drive_t *drive)
L
Linus Torvalds 已提交
1989 1990
{
	idetape_tape_t *tape = drive->driver_data;
1991
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
1992 1993
	int position;

1994
	debug_log(DBG_PROCS, "Enter %s\n", __func__);
L
Linus Torvalds 已提交
1995 1996 1997 1998

	idetape_create_read_position_cmd(&pc);
	if (idetape_queue_pc_tail(drive, &pc))
		return -1;
1999
	position = tape->first_frame;
L
Linus Torvalds 已提交
2000 2001 2002
	return position;
}

2003 2004
static void idetape_create_locate_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc,
2005
		unsigned int block, u8 partition, int skip)
L
Linus Torvalds 已提交
2006 2007
{
	idetape_init_pc(pc);
2008
	pc->c[0] = POSITION_TO_ELEMENT;
L
Linus Torvalds 已提交
2009
	pc->c[1] = 2;
2010
	put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[3]);
L
Linus Torvalds 已提交
2011
	pc->c[8] = partition;
2012
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
2013
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
2014 2015
}

2016 2017
static int idetape_create_prevent_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc, int prevent)
L
Linus Torvalds 已提交
2018 2019 2020
{
	idetape_tape_t *tape = drive->driver_data;

2021 2022
	/* device supports locking according to capabilities page */
	if (!(tape->caps[6] & 0x01))
L
Linus Torvalds 已提交
2023 2024 2025
		return 0;

	idetape_init_pc(pc);
2026
	pc->c[0] = ALLOW_MEDIUM_REMOVAL;
L
Linus Torvalds 已提交
2027
	pc->c[4] = prevent;
2028
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
2029 2030 2031
	return 1;
}

2032
static int __idetape_discard_read_pipeline(ide_drive_t *drive)
L
Linus Torvalds 已提交
2033 2034 2035 2036 2037
{
	idetape_tape_t *tape = drive->driver_data;
	unsigned long flags;
	int cnt;

2038
	if (tape->chrdev_dir != IDETAPE_DIR_READ)
L
Linus Torvalds 已提交
2039 2040 2041
		return 0;

	/* Remove merge stage. */
2042
	cnt = tape->merge_stage_size / tape->blk_size;
2043
	if (test_and_clear_bit(IDETAPE_FLAG_FILEMARK, &tape->flags))
L
Linus Torvalds 已提交
2044 2045 2046 2047 2048 2049 2050 2051
		++cnt;		/* Filemarks count as 1 sector */
	tape->merge_stage_size = 0;
	if (tape->merge_stage != NULL) {
		__idetape_kfree_stage(tape->merge_stage);
		tape->merge_stage = NULL;
	}

	/* Clear pipeline flags. */
2052
	clear_bit(IDETAPE_FLAG_PIPELINE_ERR, &tape->flags);
2053
	tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
2054 2055 2056 2057 2058

	/* Remove pipeline stages. */
	if (tape->first_stage == NULL)
		return 0;

2059
	spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
2060 2061
	tape->next_stage = NULL;
	if (idetape_pipeline_active(tape))
2062 2063
		idetape_wait_for_request(drive, tape->active_data_rq);
	spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
2064 2065 2066 2067

	while (tape->first_stage != NULL) {
		struct request *rq_ptr = &tape->first_stage->rq;

2068
		cnt += rq_ptr->nr_sectors - rq_ptr->current_nr_sectors;
L
Linus Torvalds 已提交
2069 2070 2071 2072 2073 2074 2075 2076 2077 2078
		if (rq_ptr->errors == IDETAPE_ERROR_FILEMARK)
			++cnt;
		idetape_remove_stage_head(drive);
	}
	tape->nr_pending_stages = 0;
	tape->max_stages = tape->min_pipeline;
	return cnt;
}

/*
2079 2080 2081 2082
 * 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 已提交
2083
 */
2084 2085
static int idetape_position_tape(ide_drive_t *drive, unsigned int block,
		u8 partition, int skip)
L
Linus Torvalds 已提交
2086 2087 2088
{
	idetape_tape_t *tape = drive->driver_data;
	int retval;
2089
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
2090

2091
	if (tape->chrdev_dir == IDETAPE_DIR_READ)
L
Linus Torvalds 已提交
2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102
		__idetape_discard_read_pipeline(drive);
	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));
}

2103 2104
static void idetape_discard_read_pipeline(ide_drive_t *drive,
					  int restore_position)
L
Linus Torvalds 已提交
2105 2106 2107 2108 2109 2110 2111 2112 2113 2114
{
	idetape_tape_t *tape = drive->driver_data;
	int cnt;
	int seek, position;

	cnt = __idetape_discard_read_pipeline(drive);
	if (restore_position) {
		position = idetape_read_position(drive);
		seek = position > cnt ? position - cnt : 0;
		if (idetape_position_tape(drive, seek, 0, 0)) {
2115 2116
			printk(KERN_INFO "ide-tape: %s: position_tape failed in"
					 " discard_pipeline()\n", tape->name);
L
Linus Torvalds 已提交
2117 2118 2119 2120 2121 2122
			return;
		}
	}
}

/*
2123 2124
 * Generate a read/write request for the block device interface and wait for it
 * to be serviced.
L
Linus Torvalds 已提交
2125
 */
2126 2127
static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
				 struct idetape_bh *bh)
L
Linus Torvalds 已提交
2128 2129 2130 2131
{
	idetape_tape_t *tape = drive->driver_data;
	struct request rq;

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

L
Linus Torvalds 已提交
2134
	if (idetape_pipeline_active(tape)) {
2135 2136
		printk(KERN_ERR "ide-tape: bug: the pipeline is active in %s\n",
				__func__);
L
Linus Torvalds 已提交
2137 2138 2139 2140 2141 2142
		return (0);
	}

	idetape_init_rq(&rq, cmd);
	rq.rq_disk = tape->disk;
	rq.special = (void *)bh;
2143
	rq.sector = tape->first_frame;
2144 2145
	rq.nr_sectors		= blocks;
	rq.current_nr_sectors	= blocks;
L
Linus Torvalds 已提交
2146 2147 2148 2149 2150 2151 2152 2153 2154
	(void) ide_do_drive_cmd(drive, &rq, ide_wait);

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

	if (tape->merge_stage)
		idetape_init_merge_stage(tape);
	if (rq.errors == IDETAPE_ERROR_GENERAL)
		return -EIO;
2155
	return (tape->blk_size * (blocks-rq.current_nr_sectors));
L
Linus Torvalds 已提交
2156 2157
}

2158 2159
/* start servicing the pipeline stages, starting from tape->next_stage. */
static void idetape_plug_pipeline(ide_drive_t *drive)
L
Linus Torvalds 已提交
2160 2161 2162 2163 2164 2165
{
	idetape_tape_t *tape = drive->driver_data;

	if (tape->next_stage == NULL)
		return;
	if (!idetape_pipeline_active(tape)) {
2166
		set_bit(IDETAPE_FLAG_PIPELINE_ACTIVE, &tape->flags);
2167
		idetape_activate_next_stage(drive);
2168
		(void) ide_do_drive_cmd(drive, tape->active_data_rq, ide_end);
L
Linus Torvalds 已提交
2169 2170 2171
	}
}

2172
static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
2173 2174
{
	idetape_init_pc(pc);
2175
	pc->c[0] = INQUIRY;
2176
	pc->c[4] = 254;
2177 2178
	pc->req_xfer = 254;
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
2179 2180
}

2181 2182
static void idetape_create_rewind_cmd(ide_drive_t *drive,
		struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
2183 2184
{
	idetape_init_pc(pc);
2185
	pc->c[0] = REZERO_UNIT;
2186
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
2187
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
2188 2189
}

2190
static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
L
Linus Torvalds 已提交
2191 2192
{
	idetape_init_pc(pc);
2193
	pc->c[0] = ERASE;
L
Linus Torvalds 已提交
2194
	pc->c[1] = 1;
2195
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
2196
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
2197 2198
}

2199
static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
L
Linus Torvalds 已提交
2200 2201
{
	idetape_init_pc(pc);
2202
	pc->c[0] = SPACE;
2203
	put_unaligned(cpu_to_be32(count), (unsigned int *) &pc->c[1]);
L
Linus Torvalds 已提交
2204
	pc->c[1] = cmd;
2205
	pc->flags |= PC_FLAG_WAIT_FOR_DSC;
2206
	pc->idetape_callback = &idetape_pc_callback;
L
Linus Torvalds 已提交
2207 2208
}

2209
static void idetape_wait_first_stage(ide_drive_t *drive)
L
Linus Torvalds 已提交
2210 2211 2212 2213 2214 2215
{
	idetape_tape_t *tape = drive->driver_data;
	unsigned long flags;

	if (tape->first_stage == NULL)
		return;
2216
	spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
2217
	if (tape->active_stage == tape->first_stage)
2218 2219
		idetape_wait_for_request(drive, tape->active_data_rq);
	spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
2220 2221 2222
}

/*
2223 2224 2225
 * Try to add a character device originated write request to our pipeline. In
 * case we don't succeed, we revert to non-pipelined operation mode for this
 * request. In order to accomplish that, we
L
Linus Torvalds 已提交
2226
 *
2227 2228 2229 2230 2231
 * 1. Try to allocate a new pipeline stage.
 * 2. If we can't, wait for more and more requests to be serviced and try again
 * each time.
 * 3. If we still can't allocate a stage, fallback to non-pipelined operation
 * mode for this request.
L
Linus Torvalds 已提交
2232
 */
2233
static int idetape_add_chrdev_write_request(ide_drive_t *drive, int blocks)
L
Linus Torvalds 已提交
2234 2235 2236 2237 2238 2239
{
	idetape_tape_t *tape = drive->driver_data;
	idetape_stage_t *new_stage;
	unsigned long flags;
	struct request *rq;

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

2242
	/* Attempt to allocate a new stage. Beware possible race conditions. */
L
Linus Torvalds 已提交
2243
	while ((new_stage = idetape_kmalloc_stage(tape)) == NULL) {
2244
		spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
2245
		if (idetape_pipeline_active(tape)) {
2246 2247
			idetape_wait_for_request(drive, tape->active_data_rq);
			spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
2248
		} else {
2249
			spin_unlock_irqrestore(&tape->lock, flags);
2250
			idetape_plug_pipeline(drive);
L
Linus Torvalds 已提交
2251 2252 2253
			if (idetape_pipeline_active(tape))
				continue;
			/*
2254 2255
			 * The machine is short on memory. Fallback to non-
			 * pipelined operation mode for this request.
L
Linus Torvalds 已提交
2256
			 */
2257 2258
			return idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE,
						blocks, tape->merge_stage->bh);
L
Linus Torvalds 已提交
2259 2260 2261 2262 2263
		}
	}
	rq = &new_stage->rq;
	idetape_init_rq(rq, REQ_IDETAPE_WRITE);
	/* Doesn't actually matter - We always assume sequential access */
2264
	rq->sector = tape->first_frame;
2265 2266
	rq->current_nr_sectors = blocks;
	rq->nr_sectors = blocks;
L
Linus Torvalds 已提交
2267 2268 2269 2270

	idetape_switch_buffers(tape, new_stage);
	idetape_add_stage_tail(drive, new_stage);
	tape->pipeline_head++;
2271
	idetape_calculate_speeds(drive);
L
Linus Torvalds 已提交
2272 2273

	/*
2274 2275 2276 2277 2278
	 * Estimate whether the tape has stopped writing by checking if our
	 * write pipeline is currently empty. If we are not writing anymore,
	 * wait for the pipeline to be almost completely full (90%) before
	 * starting to service requests, so that we will be able to keep up with
	 * the higher speeds of the tape.
L
Linus Torvalds 已提交
2279 2280 2281
	 */
	if (!idetape_pipeline_active(tape)) {
		if (tape->nr_stages >= tape->max_stages * 9 / 10 ||
2282 2283 2284
			tape->nr_stages >= tape->max_stages -
			tape->uncontrolled_pipeline_head_speed * 3 * 1024 /
			tape->blk_size) {
L
Linus Torvalds 已提交
2285 2286 2287 2288
			tape->measure_insert_time = 1;
			tape->insert_time = jiffies;
			tape->insert_size = 0;
			tape->insert_speed = 0;
2289
			idetape_plug_pipeline(drive);
L
Linus Torvalds 已提交
2290 2291
		}
	}
2292
	if (test_and_clear_bit(IDETAPE_FLAG_PIPELINE_ERR, &tape->flags))
L
Linus Torvalds 已提交
2293 2294 2295 2296 2297 2298
		/* Return a deferred error */
		return -EIO;
	return blocks;
}

/*
2299 2300
 * Wait until all pending pipeline requests are serviced. Typically called on
 * device close.
L
Linus Torvalds 已提交
2301
 */
2302
static void idetape_wait_for_pipeline(ide_drive_t *drive)
L
Linus Torvalds 已提交
2303 2304 2305 2306 2307
{
	idetape_tape_t *tape = drive->driver_data;
	unsigned long flags;

	while (tape->next_stage || idetape_pipeline_active(tape)) {
2308
		idetape_plug_pipeline(drive);
2309
		spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
2310
		if (idetape_pipeline_active(tape))
2311 2312
			idetape_wait_for_request(drive, tape->active_data_rq);
		spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
2313 2314 2315
	}
}

2316
static void idetape_empty_write_pipeline(ide_drive_t *drive)
L
Linus Torvalds 已提交
2317 2318 2319 2320
{
	idetape_tape_t *tape = drive->driver_data;
	int blocks, min;
	struct idetape_bh *bh;
2321

2322
	if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
2323 2324
		printk(KERN_ERR "ide-tape: bug: Trying to empty write pipeline,"
				" but we are not writing.\n");
L
Linus Torvalds 已提交
2325 2326 2327 2328 2329 2330 2331
		return;
	}
	if (tape->merge_stage_size > tape->stage_size) {
		printk(KERN_ERR "ide-tape: bug: merge_buffer too big\n");
		tape->merge_stage_size = tape->stage_size;
	}
	if (tape->merge_stage_size) {
2332 2333
		blocks = tape->merge_stage_size / tape->blk_size;
		if (tape->merge_stage_size % tape->blk_size) {
L
Linus Torvalds 已提交
2334 2335 2336
			unsigned int i;

			blocks++;
2337 2338
			i = tape->blk_size - tape->merge_stage_size %
				tape->blk_size;
L
Linus Torvalds 已提交
2339 2340 2341 2342 2343 2344 2345 2346
			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) {
2347 2348
					printk(KERN_INFO "ide-tape: bug,"
							 " bh NULL\n");
L
Linus Torvalds 已提交
2349 2350
					break;
				}
2351 2352 2353 2354
				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 已提交
2355 2356 2357 2358 2359 2360 2361 2362 2363 2364 2365 2366 2367
				atomic_add(min, &bh->b_count);
				i -= min;
				bh = bh->b_reqnext;
			}
		}
		(void) idetape_add_chrdev_write_request(drive, blocks);
		tape->merge_stage_size = 0;
	}
	idetape_wait_for_pipeline(drive);
	if (tape->merge_stage != NULL) {
		__idetape_kfree_stage(tape->merge_stage);
		tape->merge_stage = NULL;
	}
2368
	clear_bit(IDETAPE_FLAG_PIPELINE_ERR, &tape->flags);
2369
	tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
2370 2371

	/*
2372 2373 2374 2375
	 * On the next backup, perform the feedback loop again. (I don't want to
	 * keep sense information between backups, as some systems are
	 * constantly on, and the system load can be totally different on the
	 * next backup).
L
Linus Torvalds 已提交
2376 2377 2378 2379 2380 2381 2382 2383 2384 2385 2386 2387 2388 2389
	 */
	tape->max_stages = tape->min_pipeline;
	if (tape->first_stage != NULL ||
	    tape->next_stage != NULL ||
	    tape->last_stage != NULL ||
	    tape->nr_stages != 0) {
		printk(KERN_ERR "ide-tape: ide-tape pipeline bug, "
			"first_stage %p, next_stage %p, "
			"last_stage %p, nr_stages %d\n",
			tape->first_stage, tape->next_stage,
			tape->last_stage, tape->nr_stages);
	}
}

2390
static void idetape_restart_speed_control(ide_drive_t *drive)
L
Linus Torvalds 已提交
2391 2392 2393 2394 2395
{
	idetape_tape_t *tape = drive->driver_data;

	tape->restart_speed_control_req = 0;
	tape->pipeline_head = 0;
2396
	tape->controlled_last_pipeline_head = 0;
2397 2398 2399 2400
	tape->controlled_previous_pipeline_head = 0;
	tape->uncontrolled_previous_pipeline_head = 0;
	tape->controlled_pipeline_head_speed = 5000;
	tape->pipeline_head_speed = 5000;
L
Linus Torvalds 已提交
2401
	tape->uncontrolled_pipeline_head_speed = 0;
2402 2403 2404 2405
	tape->controlled_pipeline_head_time =
		tape->uncontrolled_pipeline_head_time = jiffies;
	tape->controlled_previous_head_time =
		tape->uncontrolled_previous_head_time = jiffies;
L
Linus Torvalds 已提交
2406 2407
}

2408
static int idetape_init_read(ide_drive_t *drive, int max_stages)
L
Linus Torvalds 已提交
2409 2410 2411 2412 2413
{
	idetape_tape_t *tape = drive->driver_data;
	idetape_stage_t *new_stage;
	struct request rq;
	int bytes_read;
2414
	u16 blocks = *(u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
2415 2416

	/* Initialize read operation */
2417 2418
	if (tape->chrdev_dir != IDETAPE_DIR_READ) {
		if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
L
Linus Torvalds 已提交
2419 2420 2421 2422
			idetape_empty_write_pipeline(drive);
			idetape_flush_tape_buffers(drive);
		}
		if (tape->merge_stage || tape->merge_stage_size) {
2423 2424
			printk(KERN_ERR "ide-tape: merge_stage_size should be"
					 " 0 now\n");
L
Linus Torvalds 已提交
2425 2426
			tape->merge_stage_size = 0;
		}
2427 2428
		tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0);
		if (!tape->merge_stage)
L
Linus Torvalds 已提交
2429
			return -ENOMEM;
2430
		tape->chrdev_dir = IDETAPE_DIR_READ;
L
Linus Torvalds 已提交
2431 2432

		/*
2433 2434 2435 2436
		 * 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 已提交
2437 2438
		 */
		if (drive->dsc_overlap) {
2439 2440 2441
			bytes_read = idetape_queue_rw_tail(drive,
							REQ_IDETAPE_READ, 0,
							tape->merge_stage->bh);
L
Linus Torvalds 已提交
2442 2443 2444
			if (bytes_read < 0) {
				__idetape_kfree_stage(tape->merge_stage);
				tape->merge_stage = NULL;
2445
				tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
2446 2447 2448 2449 2450 2451 2452
				return bytes_read;
			}
		}
	}
	if (tape->restart_speed_control_req)
		idetape_restart_speed_control(drive);
	idetape_init_rq(&rq, REQ_IDETAPE_READ);
2453
	rq.sector = tape->first_frame;
2454 2455
	rq.nr_sectors = blocks;
	rq.current_nr_sectors = blocks;
2456
	if (!test_bit(IDETAPE_FLAG_PIPELINE_ERR, &tape->flags) &&
L
Linus Torvalds 已提交
2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472
	    tape->nr_stages < max_stages) {
		new_stage = idetape_kmalloc_stage(tape);
		while (new_stage != NULL) {
			new_stage->rq = rq;
			idetape_add_stage_tail(drive, new_stage);
			if (tape->nr_stages >= max_stages)
				break;
			new_stage = idetape_kmalloc_stage(tape);
		}
	}
	if (!idetape_pipeline_active(tape)) {
		if (tape->nr_pending_stages >= 3 * max_stages / 4) {
			tape->measure_insert_time = 1;
			tape->insert_time = jiffies;
			tape->insert_size = 0;
			tape->insert_speed = 0;
2473
			idetape_plug_pipeline(drive);
L
Linus Torvalds 已提交
2474 2475 2476 2477 2478 2479
		}
	}
	return 0;
}

/*
2480 2481
 * Called from idetape_chrdev_read() to service a character device read request
 * and add read-ahead requests to our pipeline.
L
Linus Torvalds 已提交
2482
 */
2483
static int idetape_add_chrdev_read_request(ide_drive_t *drive, int blocks)
L
Linus Torvalds 已提交
2484 2485 2486 2487 2488 2489
{
	idetape_tape_t *tape = drive->driver_data;
	unsigned long flags;
	struct request *rq_ptr;
	int bytes_read;

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

2492
	/* If we are at a filemark, return a read length of 0 */
2493
	if (test_bit(IDETAPE_FLAG_FILEMARK, &tape->flags))
L
Linus Torvalds 已提交
2494 2495
		return 0;

2496
	/* Wait for the next block to reach the head of the pipeline. */
2497
	idetape_init_read(drive, tape->max_stages);
L
Linus Torvalds 已提交
2498
	if (tape->first_stage == NULL) {
2499
		if (test_bit(IDETAPE_FLAG_PIPELINE_ERR, &tape->flags))
L
Linus Torvalds 已提交
2500
			return 0;
2501 2502
		return idetape_queue_rw_tail(drive, REQ_IDETAPE_READ, blocks,
					tape->merge_stage->bh);
L
Linus Torvalds 已提交
2503 2504 2505
	}
	idetape_wait_first_stage(drive);
	rq_ptr = &tape->first_stage->rq;
2506 2507
	bytes_read = tape->blk_size * (rq_ptr->nr_sectors -
					rq_ptr->current_nr_sectors);
2508 2509
	rq_ptr->nr_sectors = 0;
	rq_ptr->current_nr_sectors = 0;
L
Linus Torvalds 已提交
2510 2511 2512 2513 2514 2515

	if (rq_ptr->errors == IDETAPE_ERROR_EOD)
		return 0;
	else {
		idetape_switch_buffers(tape, tape->first_stage);
		if (rq_ptr->errors == IDETAPE_ERROR_FILEMARK)
2516
			set_bit(IDETAPE_FLAG_FILEMARK, &tape->flags);
2517
		spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
2518
		idetape_remove_stage_head(drive);
2519
		spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
2520
		tape->pipeline_head++;
2521
		idetape_calculate_speeds(drive);
L
Linus Torvalds 已提交
2522
	}
2523
	if (bytes_read > blocks * tape->blk_size) {
2524 2525
		printk(KERN_ERR "ide-tape: bug: trying to return more bytes"
				" than requested\n");
2526
		bytes_read = blocks * tape->blk_size;
L
Linus Torvalds 已提交
2527 2528 2529 2530
	}
	return (bytes_read);
}

2531
static void idetape_pad_zeros(ide_drive_t *drive, int bcount)
L
Linus Torvalds 已提交
2532 2533 2534 2535
{
	idetape_tape_t *tape = drive->driver_data;
	struct idetape_bh *bh;
	int blocks;
2536

L
Linus Torvalds 已提交
2537 2538 2539 2540 2541 2542
	while (bcount) {
		unsigned int count;

		bh = tape->merge_stage->bh;
		count = min(tape->stage_size, bcount);
		bcount -= count;
2543
		blocks = count / tape->blk_size;
L
Linus Torvalds 已提交
2544
		while (count) {
2545 2546
			atomic_set(&bh->b_count,
				   min(count, (unsigned int)bh->b_size));
L
Linus Torvalds 已提交
2547 2548 2549 2550
			memset(bh->b_data, 0, atomic_read(&bh->b_count));
			count -= atomic_read(&bh->b_count);
			bh = bh->b_reqnext;
		}
2551 2552
		idetape_queue_rw_tail(drive, REQ_IDETAPE_WRITE, blocks,
				      tape->merge_stage->bh);
L
Linus Torvalds 已提交
2553 2554 2555
	}
}

2556
static int idetape_pipeline_size(ide_drive_t *drive)
L
Linus Torvalds 已提交
2557 2558 2559 2560 2561 2562 2563 2564 2565 2566
{
	idetape_tape_t *tape = drive->driver_data;
	idetape_stage_t *stage;
	struct request *rq;
	int size = 0;

	idetape_wait_for_pipeline(drive);
	stage = tape->first_stage;
	while (stage != NULL) {
		rq = &stage->rq;
2567 2568
		size += tape->blk_size * (rq->nr_sectors -
				rq->current_nr_sectors);
L
Linus Torvalds 已提交
2569
		if (rq->errors == IDETAPE_ERROR_FILEMARK)
2570
			size += tape->blk_size;
L
Linus Torvalds 已提交
2571 2572 2573 2574 2575 2576 2577
		stage = stage->next;
	}
	size += tape->merge_stage_size;
	return size;
}

/*
2578 2579 2580
 * Rewinds the tape to the Beginning Of the current Partition (BOP). We
 * currently support only one partition.
 */
2581
static int idetape_rewind_tape(ide_drive_t *drive)
L
Linus Torvalds 已提交
2582 2583
{
	int retval;
2584
	struct ide_atapi_pc pc;
2585 2586 2587 2588 2589
	idetape_tape_t *tape;
	tape = drive->driver_data;

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

L
Linus Torvalds 已提交
2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601
	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;
}

2602
/* mtio.h compatible commands should be issued to the chrdev interface. */
2603 2604
static int idetape_blkdev_ioctl(ide_drive_t *drive, unsigned int cmd,
				unsigned long arg)
L
Linus Torvalds 已提交
2605 2606 2607 2608
{
	idetape_tape_t *tape = drive->driver_data;
	void __user *argp = (void __user *)arg;

2609 2610 2611 2612 2613 2614
	struct idetape_config {
		int dsc_rw_frequency;
		int dsc_media_access_frequency;
		int nr_stages;
	} config;

2615 2616
	debug_log(DBG_PROCS, "Enter %s\n", __func__);

L
Linus Torvalds 已提交
2617
	switch (cmd) {
2618 2619 2620 2621 2622 2623 2624 2625 2626 2627 2628 2629 2630 2631
	case 0x0340:
		if (copy_from_user(&config, argp, sizeof(config)))
			return -EFAULT;
		tape->best_dsc_rw_freq = config.dsc_rw_frequency;
		tape->max_stages = config.nr_stages;
		break;
	case 0x0350:
		config.dsc_rw_frequency = (int) tape->best_dsc_rw_freq;
		config.nr_stages = tape->max_stages;
		if (copy_to_user(argp, &config, sizeof(config)))
			return -EFAULT;
		break;
	default:
		return -EIO;
L
Linus Torvalds 已提交
2632 2633 2634 2635 2636
	}
	return 0;
}

/*
2637 2638 2639 2640 2641
 * The function below is now a bit more complicated than just passing the
 * command to the tape since we may have crossed some filemarks during our
 * pipelined read-ahead mode. As a minor side effect, the pipeline enables us to
 * support MTFSFM when the filemark is in our internal pipeline even if the tape
 * doesn't support spacing over filemarks in the reverse direction.
L
Linus Torvalds 已提交
2642
 */
2643 2644
static int idetape_space_over_filemarks(ide_drive_t *drive, short mt_op,
					int mt_count)
L
Linus Torvalds 已提交
2645 2646
{
	idetape_tape_t *tape = drive->driver_data;
2647
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
2648
	unsigned long flags;
2649
	int retval, count = 0;
2650
	int sprev = !!(tape->caps[4] & 0x20);
L
Linus Torvalds 已提交
2651 2652 2653 2654

	if (mt_count == 0)
		return 0;
	if (MTBSF == mt_op || MTBSFM == mt_op) {
2655
		if (!sprev)
L
Linus Torvalds 已提交
2656
			return -EIO;
2657
		mt_count = -mt_count;
L
Linus Torvalds 已提交
2658 2659
	}

2660
	if (tape->chrdev_dir == IDETAPE_DIR_READ) {
2661
		/* its a read-ahead buffer, scan it for crossed filemarks. */
L
Linus Torvalds 已提交
2662
		tape->merge_stage_size = 0;
2663
		if (test_and_clear_bit(IDETAPE_FLAG_FILEMARK, &tape->flags))
L
Linus Torvalds 已提交
2664 2665 2666 2667
			++count;
		while (tape->first_stage != NULL) {
			if (count == mt_count) {
				if (mt_op == MTFSFM)
2668 2669
					set_bit(IDETAPE_FLAG_FILEMARK,
						&tape->flags);
L
Linus Torvalds 已提交
2670 2671
				return 0;
			}
2672
			spin_lock_irqsave(&tape->lock, flags);
L
Linus Torvalds 已提交
2673 2674
			if (tape->first_stage == tape->active_stage) {
				/*
2675 2676 2677 2678
				 * We have reached the active stage in the read
				 * pipeline. There is no point in allowing the
				 * drive to continue reading any farther, so we
				 * stop the pipeline.
L
Linus Torvalds 已提交
2679
				 *
2680 2681 2682 2683
				 * This section should be moved to a separate
				 * subroutine because similar operations are
				 * done in __idetape_discard_read_pipeline(),
				 * for example.
L
Linus Torvalds 已提交
2684 2685
				 */
				tape->next_stage = NULL;
2686
				spin_unlock_irqrestore(&tape->lock, flags);
L
Linus Torvalds 已提交
2687 2688 2689
				idetape_wait_first_stage(drive);
				tape->next_stage = tape->first_stage->next;
			} else
2690
				spin_unlock_irqrestore(&tape->lock, flags);
2691 2692
			if (tape->first_stage->rq.errors ==
					IDETAPE_ERROR_FILEMARK)
L
Linus Torvalds 已提交
2693 2694 2695 2696 2697 2698 2699
				++count;
			idetape_remove_stage_head(drive);
		}
		idetape_discard_read_pipeline(drive, 0);
	}

	/*
2700 2701
	 * The filemark was not found in our internal pipeline;	now we can issue
	 * the space command.
L
Linus Torvalds 已提交
2702 2703
	 */
	switch (mt_op) {
2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722
	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 已提交
2723 2724 2725 2726
	}
}

/*
2727
 * Our character device read / write functions.
L
Linus Torvalds 已提交
2728
 *
2729 2730 2731
 * 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 已提交
2732
 *
2733 2734 2735 2736 2737 2738 2739
 * 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 已提交
2740
 */
2741 2742
static ssize_t idetape_chrdev_read(struct file *file, char __user *buf,
				   size_t count, loff_t *ppos)
L
Linus Torvalds 已提交
2743 2744 2745
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
2746
	ssize_t bytes_read, temp, actually_read = 0, rc;
2747
	ssize_t ret = 0;
2748
	u16 ctl = *(u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
2749

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

2752
	if (tape->chrdev_dir != IDETAPE_DIR_READ) {
2753
		if (test_bit(IDETAPE_FLAG_DETECT_BS, &tape->flags))
2754 2755 2756
			if (count > tape->blk_size &&
			    (count % tape->blk_size) == 0)
				tape->user_bs_factor = count / tape->blk_size;
L
Linus Torvalds 已提交
2757
	}
2758 2759
	rc = idetape_init_read(drive, tape->max_stages);
	if (rc < 0)
L
Linus Torvalds 已提交
2760 2761 2762 2763
		return rc;
	if (count == 0)
		return (0);
	if (tape->merge_stage_size) {
2764 2765 2766 2767
		actually_read = min((unsigned int)(tape->merge_stage_size),
				    (unsigned int)count);
		if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage,
					       actually_read))
2768
			ret = -EFAULT;
L
Linus Torvalds 已提交
2769 2770 2771 2772 2773
		buf += actually_read;
		tape->merge_stage_size -= actually_read;
		count -= actually_read;
	}
	while (count >= tape->stage_size) {
2774
		bytes_read = idetape_add_chrdev_read_request(drive, ctl);
L
Linus Torvalds 已提交
2775 2776
		if (bytes_read <= 0)
			goto finish;
2777 2778
		if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage,
					       bytes_read))
2779
			ret = -EFAULT;
L
Linus Torvalds 已提交
2780 2781 2782 2783 2784
		buf += bytes_read;
		count -= bytes_read;
		actually_read += bytes_read;
	}
	if (count) {
2785
		bytes_read = idetape_add_chrdev_read_request(drive, ctl);
L
Linus Torvalds 已提交
2786 2787 2788
		if (bytes_read <= 0)
			goto finish;
		temp = min((unsigned long)count, (unsigned long)bytes_read);
2789 2790
		if (idetape_copy_stage_to_user(tape, buf, tape->merge_stage,
					       temp))
2791
			ret = -EFAULT;
L
Linus Torvalds 已提交
2792 2793 2794 2795
		actually_read += temp;
		tape->merge_stage_size = bytes_read-temp;
	}
finish:
2796
	if (!actually_read && test_bit(IDETAPE_FLAG_FILEMARK, &tape->flags)) {
2797 2798
		debug_log(DBG_SENSE, "%s: spacing over filemark\n", tape->name);

L
Linus Torvalds 已提交
2799 2800 2801
		idetape_space_over_filemarks(drive, MTFSF, 1);
		return 0;
	}
2802

2803
	return ret ? ret : actually_read;
L
Linus Torvalds 已提交
2804 2805
}

2806
static ssize_t idetape_chrdev_write(struct file *file, const char __user *buf,
L
Linus Torvalds 已提交
2807 2808 2809 2810
				     size_t count, loff_t *ppos)
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
2811 2812
	ssize_t actually_written = 0;
	ssize_t ret = 0;
2813
	u16 ctl = *(u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
2814 2815 2816 2817 2818

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

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

	/* Initialize write operation */
2822 2823
	if (tape->chrdev_dir != IDETAPE_DIR_WRITE) {
		if (tape->chrdev_dir == IDETAPE_DIR_READ)
L
Linus Torvalds 已提交
2824 2825 2826 2827 2828 2829
			idetape_discard_read_pipeline(drive, 1);
		if (tape->merge_stage || tape->merge_stage_size) {
			printk(KERN_ERR "ide-tape: merge_stage_size "
				"should be 0 now\n");
			tape->merge_stage_size = 0;
		}
2830 2831
		tape->merge_stage = __idetape_kmalloc_stage(tape, 0, 0);
		if (!tape->merge_stage)
L
Linus Torvalds 已提交
2832
			return -ENOMEM;
2833
		tape->chrdev_dir = IDETAPE_DIR_WRITE;
L
Linus Torvalds 已提交
2834 2835 2836
		idetape_init_merge_stage(tape);

		/*
2837 2838 2839 2840
		 * 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 已提交
2841 2842
		 */
		if (drive->dsc_overlap) {
2843 2844 2845
			ssize_t retval = idetape_queue_rw_tail(drive,
							REQ_IDETAPE_WRITE, 0,
							tape->merge_stage->bh);
L
Linus Torvalds 已提交
2846 2847 2848
			if (retval < 0) {
				__idetape_kfree_stage(tape->merge_stage);
				tape->merge_stage = NULL;
2849
				tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
2850 2851 2852 2853 2854 2855 2856 2857 2858 2859
				return retval;
			}
		}
	}
	if (count == 0)
		return (0);
	if (tape->restart_speed_control_req)
		idetape_restart_speed_control(drive);
	if (tape->merge_stage_size) {
		if (tape->merge_stage_size >= tape->stage_size) {
2860
			printk(KERN_ERR "ide-tape: bug: merge buf too big\n");
L
Linus Torvalds 已提交
2861 2862
			tape->merge_stage_size = 0;
		}
2863 2864 2865 2866 2867
		actually_written = min((unsigned int)
				(tape->stage_size - tape->merge_stage_size),
				(unsigned int)count);
		if (idetape_copy_stage_from_user(tape, tape->merge_stage, buf,
						 actually_written))
2868
				ret = -EFAULT;
L
Linus Torvalds 已提交
2869 2870 2871 2872 2873
		buf += actually_written;
		tape->merge_stage_size += actually_written;
		count -= actually_written;

		if (tape->merge_stage_size == tape->stage_size) {
2874
			ssize_t retval;
L
Linus Torvalds 已提交
2875
			tape->merge_stage_size = 0;
2876
			retval = idetape_add_chrdev_write_request(drive, ctl);
L
Linus Torvalds 已提交
2877 2878 2879 2880 2881
			if (retval <= 0)
				return (retval);
		}
	}
	while (count >= tape->stage_size) {
2882
		ssize_t retval;
2883 2884
		if (idetape_copy_stage_from_user(tape, tape->merge_stage, buf,
						 tape->stage_size))
2885
			ret = -EFAULT;
L
Linus Torvalds 已提交
2886 2887
		buf += tape->stage_size;
		count -= tape->stage_size;
2888
		retval = idetape_add_chrdev_write_request(drive, ctl);
L
Linus Torvalds 已提交
2889 2890 2891 2892 2893 2894
		actually_written += tape->stage_size;
		if (retval <= 0)
			return (retval);
	}
	if (count) {
		actually_written += count;
2895 2896
		if (idetape_copy_stage_from_user(tape, tape->merge_stage, buf,
						 count))
2897
			ret = -EFAULT;
L
Linus Torvalds 已提交
2898 2899
		tape->merge_stage_size += count;
	}
2900
	return ret ? ret : actually_written;
L
Linus Torvalds 已提交
2901 2902
}

2903
static int idetape_write_filemark(ide_drive_t *drive)
L
Linus Torvalds 已提交
2904
{
2905
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916

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

/*
2917 2918
 * Called from idetape_chrdev_ioctl when the general mtio MTIOCTOP ioctl is
 * requested.
L
Linus Torvalds 已提交
2919
 *
2920 2921 2922 2923
 * 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
 * usually not supported (it is supported in the rare case in which we crossed
 * the filemark during our read-ahead pipelined operation mode).
L
Linus Torvalds 已提交
2924
 *
2925
 * The following commands are currently not supported:
L
Linus Torvalds 已提交
2926
 *
2927 2928
 * MTFSS, MTBSS, MTWSM, MTSETDENSITY, MTSETDRVBUFFER, MT_ST_BOOLEANS,
 * MT_ST_WRITE_THRESHOLD.
L
Linus Torvalds 已提交
2929
 */
2930
static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count)
L
Linus Torvalds 已提交
2931 2932
{
	idetape_tape_t *tape = drive->driver_data;
2933
	struct ide_atapi_pc pc;
2934
	int i, retval;
L
Linus Torvalds 已提交
2935

2936 2937
	debug_log(DBG_ERR, "Handling MTIOCTOP ioctl: mt_op=%d, mt_count=%d\n",
			mt_op, mt_count);
2938

2939
	/* Commands which need our pipelined read-ahead stages. */
L
Linus Torvalds 已提交
2940
	switch (mt_op) {
2941 2942 2943 2944 2945 2946 2947 2948 2949
	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 已提交
2950
	}
2951

L
Linus Torvalds 已提交
2952
	switch (mt_op) {
2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978 2979 2980 2981 2982 2983 2984 2985 2986 2987 2988
	case MTWEOF:
		if (tape->write_prot)
			return -EACCES;
		idetape_discard_read_pipeline(drive, 1);
		for (i = 0; i < mt_count; i++) {
			retval = idetape_write_filemark(drive);
			if (retval)
				return retval;
		}
		return 0;
	case MTREW:
		idetape_discard_read_pipeline(drive, 0);
		if (idetape_rewind_tape(drive))
			return -EIO;
		return 0;
	case MTLOAD:
		idetape_discard_read_pipeline(drive, 0);
		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) {
			if (idetape_create_prevent_cmd(drive, &pc, 0))
				if (!idetape_queue_pc_tail(drive, &pc))
					tape->door_locked = DOOR_UNLOCKED;
		}
		idetape_discard_read_pipeline(drive, 0);
		idetape_create_load_unload_cmd(drive, &pc,
					      !IDETAPE_LU_LOAD_MASK);
		retval = idetape_queue_pc_tail(drive, &pc);
		if (!retval)
2989
			clear_bit(IDETAPE_FLAG_MEDIUM_PRESENT, &tape->flags);
2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009
		return retval;
	case MTNOP:
		idetape_discard_read_pipeline(drive, 0);
		return idetape_flush_tape_buffers(drive);
	case MTRETEN:
		idetape_discard_read_pipeline(drive, 0);
		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 已提交
3010
				return -EIO;
3011
			tape->user_bs_factor = mt_count / tape->blk_size;
3012
			clear_bit(IDETAPE_FLAG_DETECT_BS, &tape->flags);
3013
		} else
3014
			set_bit(IDETAPE_FLAG_DETECT_BS, &tape->flags);
3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026
		return 0;
	case MTSEEK:
		idetape_discard_read_pipeline(drive, 0);
		return idetape_position_tape(drive,
			mt_count * tape->user_bs_factor, tape->partition, 0);
	case MTSETPART:
		idetape_discard_read_pipeline(drive, 0);
		return idetape_position_tape(drive, 0, mt_count, 0);
	case MTFSR:
	case MTBSR:
	case MTLOCK:
		if (!idetape_create_prevent_cmd(drive, &pc, 1))
L
Linus Torvalds 已提交
3027
			return 0;
3028 3029
		retval = idetape_queue_pc_tail(drive, &pc);
		if (retval)
L
Linus Torvalds 已提交
3030
			return retval;
3031 3032 3033 3034
		tape->door_locked = DOOR_EXPLICITLY_LOCKED;
		return 0;
	case MTUNLOCK:
		if (!idetape_create_prevent_cmd(drive, &pc, 0))
L
Linus Torvalds 已提交
3035
			return 0;
3036 3037 3038 3039 3040 3041 3042 3043 3044
		retval = idetape_queue_pc_tail(drive, &pc);
		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 已提交
3045 3046 3047 3048
	}
}

/*
3049 3050 3051
 * 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 已提交
3052
 */
3053 3054
static int idetape_chrdev_ioctl(struct inode *inode, struct file *file,
				unsigned int cmd, unsigned long arg)
L
Linus Torvalds 已提交
3055 3056 3057 3058 3059 3060
{
	struct ide_tape_obj *tape = ide_tape_f(file);
	ide_drive_t *drive = tape->drive;
	struct mtop mtop;
	struct mtget mtget;
	struct mtpos mtpos;
3061
	int block_offset = 0, position = tape->first_frame;
L
Linus Torvalds 已提交
3062 3063
	void __user *argp = (void __user *)arg;

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

	tape->restart_speed_control_req = 1;
3067
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE) {
L
Linus Torvalds 已提交
3068 3069 3070 3071
		idetape_empty_write_pipeline(drive);
		idetape_flush_tape_buffers(drive);
	}
	if (cmd == MTIOCGET || cmd == MTIOCPOS) {
3072 3073
		block_offset = idetape_pipeline_size(drive) /
			(tape->blk_size * tape->user_bs_factor);
3074 3075
		position = idetape_read_position(drive);
		if (position < 0)
L
Linus Torvalds 已提交
3076 3077 3078
			return -EIO;
	}
	switch (cmd) {
3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105
	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)
			idetape_discard_read_pipeline(drive, 1);
		return idetape_blkdev_ioctl(drive, cmd, arg);
L
Linus Torvalds 已提交
3106 3107 3108
	}
}

3109 3110 3111 3112 3113 3114 3115
/*
 * 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;
3116
	struct ide_atapi_pc pc;
3117 3118 3119 3120

	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");
3121
		if (tape->blk_size == 0) {
3122 3123
			printk(KERN_WARNING "ide-tape: Cannot deal with zero "
					    "block size, assuming 32k\n");
3124
			tape->blk_size = 32768;
3125 3126 3127
		}
		return;
	}
3128 3129 3130 3131
	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;
3132
}
L
Linus Torvalds 已提交
3133

3134
static int idetape_chrdev_open(struct inode *inode, struct file *filp)
L
Linus Torvalds 已提交
3135 3136 3137 3138
{
	unsigned int minor = iminor(inode), i = minor & ~0xc0;
	ide_drive_t *drive;
	idetape_tape_t *tape;
3139
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
3140 3141
	int retval;

3142 3143 3144 3145 3146 3147 3148 3149 3150
	if (i >= MAX_HWIFS * MAX_DRIVES)
		return -ENXIO;

	tape = ide_tape_chrdev_get(i);
	if (!tape)
		return -ENXIO;

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

L
Linus Torvalds 已提交
3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161
	/*
	 * 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;

3162
	if (test_and_set_bit(IDETAPE_FLAG_BUSY, &tape->flags)) {
L
Linus Torvalds 已提交
3163 3164 3165 3166 3167 3168
		retval = -EBUSY;
		goto out_put_tape;
	}

	retval = idetape_wait_ready(drive, 60 * HZ);
	if (retval) {
3169
		clear_bit(IDETAPE_FLAG_BUSY, &tape->flags);
L
Linus Torvalds 已提交
3170 3171 3172 3173 3174
		printk(KERN_ERR "ide-tape: %s: drive not ready\n", tape->name);
		goto out_put_tape;
	}

	idetape_read_position(drive);
3175
	if (!test_bit(IDETAPE_FLAG_ADDRESS_VALID, &tape->flags))
L
Linus Torvalds 已提交
3176 3177
		(void)idetape_rewind_tape(drive);

3178
	if (tape->chrdev_dir != IDETAPE_DIR_READ)
3179
		clear_bit(IDETAPE_FLAG_PIPELINE_ERR, &tape->flags);
L
Linus Torvalds 已提交
3180 3181

	/* Read block size and write protect status from drive. */
3182
	ide_tape_get_bsize_from_bdesc(drive);
L
Linus Torvalds 已提交
3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193

	/* 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) {
3194
			clear_bit(IDETAPE_FLAG_BUSY, &tape->flags);
L
Linus Torvalds 已提交
3195 3196 3197 3198 3199
			retval = -EROFS;
			goto out_put_tape;
		}
	}

3200
	/* Lock the tape drive door so user can't eject. */
3201
	if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
L
Linus Torvalds 已提交
3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217
		if (idetape_create_prevent_cmd(drive, &pc, 1)) {
			if (!idetape_queue_pc_tail(drive, &pc)) {
				if (tape->door_locked != DOOR_EXPLICITLY_LOCKED)
					tape->door_locked = DOOR_LOCKED;
			}
		}
	}
	idetape_restart_speed_control(drive);
	tape->restart_speed_control_req = 0;
	return 0;

out_put_tape:
	ide_tape_put(tape);
	return retval;
}

3218
static void idetape_write_release(ide_drive_t *drive, unsigned int minor)
L
Linus Torvalds 已提交
3219 3220 3221 3222 3223 3224
{
	idetape_tape_t *tape = drive->driver_data;

	idetape_empty_write_pipeline(drive);
	tape->merge_stage = __idetape_kmalloc_stage(tape, 1, 0);
	if (tape->merge_stage != NULL) {
3225 3226
		idetape_pad_zeros(drive, tape->blk_size *
				(tape->user_bs_factor - 1));
L
Linus Torvalds 已提交
3227 3228 3229 3230 3231 3232 3233 3234
		__idetape_kfree_stage(tape->merge_stage);
		tape->merge_stage = NULL;
	}
	idetape_write_filemark(drive);
	idetape_flush_tape_buffers(drive);
	idetape_flush_tape_buffers(drive);
}

3235
static int idetape_chrdev_release(struct inode *inode, struct file *filp)
L
Linus Torvalds 已提交
3236 3237 3238
{
	struct ide_tape_obj *tape = ide_tape_f(filp);
	ide_drive_t *drive = tape->drive;
3239
	struct ide_atapi_pc pc;
L
Linus Torvalds 已提交
3240 3241 3242 3243
	unsigned int minor = iminor(inode);

	lock_kernel();
	tape = drive->driver_data;
3244 3245

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

3247
	if (tape->chrdev_dir == IDETAPE_DIR_WRITE)
L
Linus Torvalds 已提交
3248
		idetape_write_release(drive, minor);
3249
	if (tape->chrdev_dir == IDETAPE_DIR_READ) {
L
Linus Torvalds 已提交
3250 3251 3252 3253 3254 3255 3256 3257 3258
		if (minor < 128)
			idetape_discard_read_pipeline(drive, 1);
		else
			idetape_wait_for_pipeline(drive);
	}
	if (tape->cache_stage != NULL) {
		__idetape_kfree_stage(tape->cache_stage);
		tape->cache_stage = NULL;
	}
3259
	if (minor < 128 && test_bit(IDETAPE_FLAG_MEDIUM_PRESENT, &tape->flags))
L
Linus Torvalds 已提交
3260
		(void) idetape_rewind_tape(drive);
3261
	if (tape->chrdev_dir == IDETAPE_DIR_NONE) {
L
Linus Torvalds 已提交
3262 3263 3264 3265 3266 3267 3268
		if (tape->door_locked == DOOR_LOCKED) {
			if (idetape_create_prevent_cmd(drive, &pc, 0)) {
				if (!idetape_queue_pc_tail(drive, &pc))
					tape->door_locked = DOOR_UNLOCKED;
			}
		}
	}
3269
	clear_bit(IDETAPE_FLAG_BUSY, &tape->flags);
L
Linus Torvalds 已提交
3270 3271 3272 3273 3274 3275
	ide_tape_put(tape);
	unlock_kernel();
	return 0;
}

/*
3276
 * check the contents of the ATAPI IDENTIFY command results. We return:
L
Linus Torvalds 已提交
3277
 *
3278 3279
 * 1 - If the tape can be supported by us, based on the information we have so
 * far.
L
Linus Torvalds 已提交
3280
 *
3281
 * 0 - If this tape driver is not currently supported by us.
L
Linus Torvalds 已提交
3282
 */
3283
static int idetape_identify_device(ide_drive_t *drive)
L
Linus Torvalds 已提交
3284
{
3285
	u8 gcw[2], protocol, device_type, removable, packet_size;
L
Linus Torvalds 已提交
3286 3287 3288 3289

	if (drive->id_read == 0)
		return 1;

3290
	*((unsigned short *) &gcw) = drive->id->config;
L
Linus Torvalds 已提交
3291

3292 3293 3294 3295
	protocol	=   (gcw[1] & 0xC0) >> 6;
	device_type	=    gcw[1] & 0x1F;
	removable	= !!(gcw[0] & 0x80);
	packet_size	=    gcw[0] & 0x3;
L
Linus Torvalds 已提交
3296

3297 3298
	/* Check that we can support this device */
	if (protocol != 2)
3299
		printk(KERN_ERR "ide-tape: Protocol (0x%02x) is not ATAPI\n",
3300 3301
				protocol);
	else if (device_type != 1)
3302
		printk(KERN_ERR "ide-tape: Device type (0x%02x) is not set "
3303 3304
				"to tape\n", device_type);
	else if (!removable)
L
Linus Torvalds 已提交
3305
		printk(KERN_ERR "ide-tape: The removable flag is not set\n");
3306
	else if (packet_size != 0) {
3307 3308
		printk(KERN_ERR "ide-tape: Packet size (0x%02x) is not 12"
				" bytes\n", packet_size);
L
Linus Torvalds 已提交
3309 3310 3311 3312 3313
	} else
		return 1;
	return 0;
}

3314
static void idetape_get_inquiry_results(ide_drive_t *drive)
L
Linus Torvalds 已提交
3315 3316
{
	idetape_tape_t *tape = drive->driver_data;
3317
	struct ide_atapi_pc pc;
3318
	char fw_rev[6], vendor_id[10], product_id[18];
3319

L
Linus Torvalds 已提交
3320 3321
	idetape_create_inquiry_cmd(&pc);
	if (idetape_queue_pc_tail(drive, &pc)) {
3322 3323
		printk(KERN_ERR "ide-tape: %s: can't get INQUIRY results\n",
				tape->name);
L
Linus Torvalds 已提交
3324 3325
		return;
	}
3326 3327 3328
	memcpy(vendor_id, &pc.buf[8], 8);
	memcpy(product_id, &pc.buf[16], 16);
	memcpy(fw_rev, &pc.buf[32], 4);
3329 3330 3331 3332 3333

	ide_fixstring(vendor_id, 10, 0);
	ide_fixstring(product_id, 18, 0);
	ide_fixstring(fw_rev, 6, 0);

3334
	printk(KERN_INFO "ide-tape: %s <-> %s: %s %s rev %s\n",
3335
			drive->name, tape->name, vendor_id, product_id, fw_rev);
L
Linus Torvalds 已提交
3336 3337 3338
}

/*
3339 3340
 * 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 已提交
3341
 */
3342
static void idetape_get_mode_sense_results(ide_drive_t *drive)
L
Linus Torvalds 已提交
3343 3344
{
	idetape_tape_t *tape = drive->driver_data;
3345
	struct ide_atapi_pc pc;
3346 3347
	u8 *caps;
	u8 speed, max_speed;
3348

L
Linus Torvalds 已提交
3349 3350
	idetape_create_mode_sense_cmd(&pc, IDETAPE_CAPABILITIES_PAGE);
	if (idetape_queue_pc_tail(drive, &pc)) {
3351 3352
		printk(KERN_ERR "ide-tape: Can't get tape parameters - assuming"
				" some default values\n");
3353
		tape->blk_size = 512;
3354 3355 3356
		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 已提交
3357 3358
		return;
	}
3359
	caps = pc.buf + 4 + pc.buf[3];
3360 3361 3362 3363

	/* convert to host order and save for later use */
	speed = be16_to_cpu(*(u16 *)&caps[14]);
	max_speed = be16_to_cpu(*(u16 *)&caps[8]);
L
Linus Torvalds 已提交
3364

3365 3366 3367 3368
	put_unaligned(max_speed, (u16 *)&caps[8]);
	put_unaligned(be16_to_cpu(*(u16 *)&caps[12]), (u16 *)&caps[12]);
	put_unaligned(speed, (u16 *)&caps[14]);
	put_unaligned(be16_to_cpu(*(u16 *)&caps[16]), (u16 *)&caps[16]);
L
Linus Torvalds 已提交
3369

3370 3371 3372 3373
	if (!speed) {
		printk(KERN_INFO "ide-tape: %s: invalid tape speed "
				"(assuming 650KB/sec)\n", drive->name);
		put_unaligned(650, (u16 *)&caps[14]);
L
Linus Torvalds 已提交
3374
	}
3375 3376 3377 3378
	if (!max_speed) {
		printk(KERN_INFO "ide-tape: %s: invalid max_speed "
				"(assuming 650KB/sec)\n", drive->name);
		put_unaligned(650, (u16 *)&caps[8]);
L
Linus Torvalds 已提交
3379 3380
	}

3381 3382
	memcpy(&tape->caps, caps, 20);
	if (caps[7] & 0x02)
3383
		tape->blk_size = 512;
3384
	else if (caps[7] & 0x04)
3385
		tape->blk_size = 1024;
L
Linus Torvalds 已提交
3386 3387
}

3388
#ifdef CONFIG_IDE_PROC_FS
3389
static void idetape_add_settings(ide_drive_t *drive)
L
Linus Torvalds 已提交
3390 3391 3392
{
	idetape_tape_t *tape = drive->driver_data;

3393 3394
	ide_add_setting(drive, "buffer", SETTING_READ, TYPE_SHORT, 0, 0xffff,
			1, 2, (u16 *)&tape->caps[16], NULL);
3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406
	ide_add_setting(drive, "pipeline_min", SETTING_RW, TYPE_INT, 1, 0xffff,
			tape->stage_size / 1024, 1, &tape->min_pipeline, NULL);
	ide_add_setting(drive, "pipeline", SETTING_RW, TYPE_INT, 1, 0xffff,
			tape->stage_size / 1024, 1, &tape->max_stages, NULL);
	ide_add_setting(drive, "pipeline_max", SETTING_RW, TYPE_INT, 1,	0xffff,
			tape->stage_size / 1024, 1, &tape->max_pipeline, NULL);
	ide_add_setting(drive, "pipeline_used",	SETTING_READ, TYPE_INT, 0,
			0xffff,	tape->stage_size / 1024, 1, &tape->nr_stages,
			NULL);
	ide_add_setting(drive, "pipeline_pending", SETTING_READ, TYPE_INT, 0,
			0xffff, tape->stage_size / 1024, 1,
			&tape->nr_pending_stages, NULL);
3407 3408
	ide_add_setting(drive, "speed", SETTING_READ, TYPE_SHORT, 0, 0xffff,
			1, 1, (u16 *)&tape->caps[14], NULL);
3409 3410 3411 3412 3413
	ide_add_setting(drive, "stage", SETTING_READ, TYPE_INT,	0, 0xffff, 1,
			1024, &tape->stage_size, NULL);
	ide_add_setting(drive, "tdsc", SETTING_RW, TYPE_INT, IDETAPE_DSC_RW_MIN,
			IDETAPE_DSC_RW_MAX, 1000, HZ, &tape->best_dsc_rw_freq,
			NULL);
3414 3415 3416 3417 3418 3419 3420 3421 3422 3423
	ide_add_setting(drive, "dsc_overlap", SETTING_RW, TYPE_BYTE, 0, 1, 1,
			1, &drive->dsc_overlap, NULL);
	ide_add_setting(drive, "pipeline_head_speed_c", SETTING_READ, TYPE_INT,
			0, 0xffff, 1, 1, &tape->controlled_pipeline_head_speed,
			NULL);
	ide_add_setting(drive, "pipeline_head_speed_u", SETTING_READ, TYPE_INT,
			0, 0xffff, 1, 1,
			&tape->uncontrolled_pipeline_head_speed, NULL);
	ide_add_setting(drive, "avg_speed", SETTING_READ, TYPE_INT, 0, 0xffff,
			1, 1, &tape->avg_speed, NULL);
3424 3425
	ide_add_setting(drive, "debug_mask", SETTING_RW, TYPE_INT, 0, 0xffff, 1,
			1, &tape->debug_mask, NULL);
L
Linus Torvalds 已提交
3426
}
3427 3428 3429
#else
static inline void idetape_add_settings(ide_drive_t *drive) { ; }
#endif
L
Linus Torvalds 已提交
3430 3431

/*
3432
 * The function below is called to:
L
Linus Torvalds 已提交
3433
 *
3434 3435 3436 3437
 * 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 已提交
3438
 *
3439 3440
 * 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 已提交
3441
 */
3442
static void idetape_setup(ide_drive_t *drive, idetape_tape_t *tape, int minor)
L
Linus Torvalds 已提交
3443 3444 3445 3446
{
	unsigned long t1, tmid, tn, t;
	int speed;
	int stage_size;
3447
	u8 gcw[2];
L
Linus Torvalds 已提交
3448
	struct sysinfo si;
3449
	u16 *ctl = (u16 *)&tape->caps[12];
L
Linus Torvalds 已提交
3450

3451
	spin_lock_init(&tape->lock);
L
Linus Torvalds 已提交
3452
	drive->dsc_overlap = 1;
3453 3454 3455 3456
	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 已提交
3457 3458 3459 3460 3461 3462 3463 3464
	}
	/* Seagate Travan drives do not support DSC overlap. */
	if (strstr(drive->id->model, "Seagate STT3401"))
		drive->dsc_overlap = 0;
	tape->minor = minor;
	tape->name[0] = 'h';
	tape->name[1] = 't';
	tape->name[2] = '0' + minor;
3465
	tape->chrdev_dir = IDETAPE_DIR_NONE;
L
Linus Torvalds 已提交
3466 3467 3468 3469
	tape->pc = tape->pc_stack;
	tape->max_insert_speed = 10000;
	tape->speed_control = 1;
	*((unsigned short *) &gcw) = drive->id->config;
3470 3471 3472

	/* Command packet DRQ type */
	if (((gcw[0] & 0x60) >> 5) == 1)
3473
		set_bit(IDETAPE_FLAG_DRQ_INTERRUPT, &tape->flags);
L
Linus Torvalds 已提交
3474

3475 3476 3477
	tape->min_pipeline = 10;
	tape->max_pipeline = 10;
	tape->max_stages   = 10;
3478

L
Linus Torvalds 已提交
3479 3480
	idetape_get_inquiry_results(drive);
	idetape_get_mode_sense_results(drive);
3481
	ide_tape_get_bsize_from_bdesc(drive);
L
Linus Torvalds 已提交
3482
	tape->user_bs_factor = 1;
3483
	tape->stage_size = *ctl * tape->blk_size;
L
Linus Torvalds 已提交
3484 3485
	while (tape->stage_size > 0xffff) {
		printk(KERN_NOTICE "ide-tape: decreasing stage size\n");
3486
		*ctl /= 2;
3487
		tape->stage_size = *ctl * tape->blk_size;
L
Linus Torvalds 已提交
3488 3489 3490 3491 3492 3493 3494 3495
	}
	stage_size = tape->stage_size;
	tape->pages_per_stage = stage_size / PAGE_SIZE;
	if (stage_size % PAGE_SIZE) {
		tape->pages_per_stage++;
		tape->excess_bh_size = PAGE_SIZE - stage_size % PAGE_SIZE;
	}

3496 3497
	/* Select the "best" DSC read/write polling freq and pipeline size. */
	speed = max(*(u16 *)&tape->caps[14], *(u16 *)&tape->caps[8]);
L
Linus Torvalds 已提交
3498 3499 3500

	tape->max_stages = speed * 1000 * 10 / tape->stage_size;

3501
	/* Limit memory use for pipeline to 10% of physical memory */
L
Linus Torvalds 已提交
3502
	si_meminfo(&si);
3503 3504 3505 3506 3507
	if (tape->max_stages * tape->stage_size >
			si.totalram * si.mem_unit / 10)
		tape->max_stages =
			si.totalram * si.mem_unit / (10 * tape->stage_size);

L
Linus Torvalds 已提交
3508 3509
	tape->max_stages   = min(tape->max_stages, IDETAPE_MAX_PIPELINE_STAGES);
	tape->min_pipeline = min(tape->max_stages, IDETAPE_MIN_PIPELINE_STAGES);
3510 3511 3512 3513 3514 3515 3516
	tape->max_pipeline =
		min(tape->max_stages * 2, IDETAPE_MAX_PIPELINE_STAGES);
	if (tape->max_stages == 0) {
		tape->max_stages   = 1;
		tape->min_pipeline = 1;
		tape->max_pipeline = 1;
	}
L
Linus Torvalds 已提交
3517 3518

	t1 = (tape->stage_size * HZ) / (speed * 1000);
3519
	tmid = (*(u16 *)&tape->caps[16] * 32 * HZ) / (speed * 125);
L
Linus Torvalds 已提交
3520 3521 3522 3523 3524 3525 3526 3527
	tn = (IDETAPE_FIFO_THRESHOLD * tape->stage_size * HZ) / (speed * 1000);

	if (tape->max_stages)
		t = tn;
	else
		t = t1;

	/*
3528 3529
	 * Ensure that the number we got makes sense; limit it within
	 * IDETAPE_DSC_RW_MIN and IDETAPE_DSC_RW_MAX.
L
Linus Torvalds 已提交
3530
	 */
3531 3532 3533
	tape->best_dsc_rw_freq = max_t(unsigned long,
				min_t(unsigned long, t, IDETAPE_DSC_RW_MAX),
				IDETAPE_DSC_RW_MIN);
L
Linus Torvalds 已提交
3534 3535
	printk(KERN_INFO "ide-tape: %s <-> %s: %dKBps, %d*%dkB buffer, "
		"%dkB pipeline, %lums tDSC%s\n",
3536 3537
		drive->name, tape->name, *(u16 *)&tape->caps[14],
		(*(u16 *)&tape->caps[16] * 512) / tape->stage_size,
L
Linus Torvalds 已提交
3538 3539
		tape->stage_size / 1024,
		tape->max_stages * tape->stage_size / 1024,
3540
		tape->best_dsc_rw_freq * 1000 / HZ,
L
Linus Torvalds 已提交
3541 3542 3543 3544 3545
		drive->using_dma ? ", DMA":"");

	idetape_add_settings(drive);
}

3546
static void ide_tape_remove(ide_drive_t *drive)
L
Linus Torvalds 已提交
3547 3548 3549
{
	idetape_tape_t *tape = drive->driver_data;

3550
	ide_proc_unregister_driver(drive, tape->driver);
L
Linus Torvalds 已提交
3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562

	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;

3563 3564
	BUG_ON(tape->first_stage != NULL || tape->merge_stage_size);

L
Linus Torvalds 已提交
3565 3566
	drive->dsc_overlap = 0;
	drive->driver_data = NULL;
3567
	device_destroy(idetape_sysfs_class, MKDEV(IDETAPE_MAJOR, tape->minor));
3568 3569
	device_destroy(idetape_sysfs_class,
			MKDEV(IDETAPE_MAJOR, tape->minor + 128));
L
Linus Torvalds 已提交
3570 3571 3572 3573 3574 3575
	idetape_devs[tape->minor] = NULL;
	g->private_data = NULL;
	put_disk(g);
	kfree(tape);
}

3576
#ifdef CONFIG_IDE_PROC_FS
L
Linus Torvalds 已提交
3577 3578 3579 3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595
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

3596
static int ide_tape_probe(ide_drive_t *);
L
Linus Torvalds 已提交
3597 3598

static ide_driver_t idetape_driver = {
3599
	.gen_driver = {
3600
		.owner		= THIS_MODULE,
3601 3602 3603
		.name		= "ide-tape",
		.bus		= &ide_bus_type,
	},
3604 3605
	.probe			= ide_tape_probe,
	.remove			= ide_tape_remove,
L
Linus Torvalds 已提交
3606 3607 3608 3609 3610 3611 3612
	.version		= IDETAPE_VERSION,
	.media			= ide_tape,
	.supports_dsc_overlap 	= 1,
	.do_request		= idetape_do_request,
	.end_request		= idetape_end_request,
	.error			= __ide_error,
	.abort			= __ide_abort,
3613
#ifdef CONFIG_IDE_PROC_FS
L
Linus Torvalds 已提交
3614
	.proc			= idetape_proc,
3615
#endif
L
Linus Torvalds 已提交
3616 3617
};

3618
/* Our character device supporting functions, passed to register_chrdev. */
3619
static const struct file_operations idetape_fops = {
L
Linus Torvalds 已提交
3620 3621 3622 3623 3624 3625 3626 3627 3628 3629 3630 3631 3632
	.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;

3633 3634
	tape = ide_tape_get(disk);
	if (!tape)
L
Linus Torvalds 已提交
3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665 3666 3667 3668
		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,
};

3669
static int ide_tape_probe(ide_drive_t *drive)
L
Linus Torvalds 已提交
3670 3671 3672 3673 3674 3675 3676 3677 3678 3679 3680
{
	idetape_tape_t *tape;
	struct gendisk *g;
	int minor;

	if (!strstr("ide-tape", drive->driver_req))
		goto failed;
	if (!drive->present)
		goto failed;
	if (drive->media != ide_tape)
		goto failed;
3681 3682 3683
	if (!idetape_identify_device(drive)) {
		printk(KERN_ERR "ide-tape: %s: not supported by this version of"
				" the driver\n", drive->name);
L
Linus Torvalds 已提交
3684 3685 3686
		goto failed;
	}
	if (drive->scsi) {
3687 3688
		printk(KERN_INFO "ide-tape: passing drive %s to ide-scsi"
				 " emulation.\n", drive->name);
L
Linus Torvalds 已提交
3689 3690
		goto failed;
	}
3691
	tape = kzalloc(sizeof(idetape_tape_t), GFP_KERNEL);
L
Linus Torvalds 已提交
3692
	if (tape == NULL) {
3693 3694
		printk(KERN_ERR "ide-tape: %s: Can't allocate a tape struct\n",
				drive->name);
L
Linus Torvalds 已提交
3695 3696 3697 3698 3699 3700 3701 3702 3703
		goto failed;
	}

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

	ide_init_disk(g, drive);

3704
	ide_proc_register_driver(drive, &idetape_driver);
L
Linus Torvalds 已提交
3705 3706 3707 3708 3709 3710 3711 3712 3713 3714 3715

	kref_init(&tape->kref);

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

	g->private_data = &tape->driver;

	drive->driver_data = tape;

3716
	mutex_lock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
3717 3718 3719
	for (minor = 0; idetape_devs[minor]; minor++)
		;
	idetape_devs[minor] = tape;
3720
	mutex_unlock(&idetape_ref_mutex);
L
Linus Torvalds 已提交
3721 3722 3723

	idetape_setup(drive, tape, minor);

3724 3725 3726 3727
	device_create(idetape_sysfs_class, &drive->gendev,
		      MKDEV(IDETAPE_MAJOR, minor), "%s", tape->name);
	device_create(idetape_sysfs_class, &drive->gendev,
			MKDEV(IDETAPE_MAJOR, minor + 128), "n%s", tape->name);
3728

L
Linus Torvalds 已提交
3729 3730 3731 3732
	g->fops = &idetape_block_ops;
	ide_register_region(g);

	return 0;
3733

L
Linus Torvalds 已提交
3734 3735 3736
out_free_tape:
	kfree(tape);
failed:
3737
	return -ENODEV;
L
Linus Torvalds 已提交
3738 3739
}

3740
static void __exit idetape_exit(void)
L
Linus Torvalds 已提交
3741
{
3742
	driver_unregister(&idetape_driver.gen_driver);
3743
	class_destroy(idetape_sysfs_class);
L
Linus Torvalds 已提交
3744 3745 3746
	unregister_chrdev(IDETAPE_MAJOR, "ht");
}

3747
static int __init idetape_init(void)
L
Linus Torvalds 已提交
3748
{
3749 3750 3751 3752 3753 3754 3755 3756 3757
	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 已提交
3758
	if (register_chrdev(IDETAPE_MAJOR, "ht", &idetape_fops)) {
3759 3760
		printk(KERN_ERR "ide-tape: Failed to register chrdev"
				" interface\n");
3761 3762
		error = -EBUSY;
		goto out_free_class;
L
Linus Torvalds 已提交
3763
	}
3764 3765 3766 3767 3768 3769 3770 3771 3772 3773 3774 3775 3776

	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 已提交
3777 3778
}

3779
MODULE_ALIAS("ide:*m-tape*");
L
Linus Torvalds 已提交
3780 3781 3782
module_init(idetape_init);
module_exit(idetape_exit);
MODULE_ALIAS_CHARDEV_MAJOR(IDETAPE_MAJOR);
3783 3784
MODULE_DESCRIPTION("ATAPI Streaming TAPE Driver");
MODULE_LICENSE("GPL");