ide-io.c 25.2 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
/*
 *	IDE I/O functions
 *
 *	Basic PIO and command management functionality.
 *
 * This code was split off from ide.c. See ide.c for history and original
 * copyrights.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation; either version 2, or (at your option) any
 * later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
 *
 * For the avoidance of doubt the "preferred form" of this code is one which
 * is in an open non patent encumbered format. Where cryptographic key signing
 * forms part of the process of creating an executable the information
 * including keys needed to generate an equivalently functional executable
 * are deemed to be part of the source code.
 */
 
 
#include <linux/module.h>
#include <linux/types.h>
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/timer.h>
#include <linux/mm.h>
#include <linux/interrupt.h>
#include <linux/major.h>
#include <linux/errno.h>
#include <linux/genhd.h>
#include <linux/blkpg.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/pci.h>
#include <linux/delay.h>
#include <linux/ide.h>
43
#include <linux/hdreg.h>
L
Linus Torvalds 已提交
44 45 46 47 48 49 50
#include <linux/completion.h>
#include <linux/reboot.h>
#include <linux/cdrom.h>
#include <linux/seq_file.h>
#include <linux/device.h>
#include <linux/kmod.h>
#include <linux/scatterlist.h>
J
Jiri Slaby 已提交
51
#include <linux/bitops.h>
L
Linus Torvalds 已提交
52 53 54 55 56 57

#include <asm/byteorder.h>
#include <asm/irq.h>
#include <asm/uaccess.h>
#include <asm/io.h>

58
static int __ide_end_request(ide_drive_t *drive, struct request *rq,
59
			     int uptodate, unsigned int nr_bytes, int dequeue)
L
Linus Torvalds 已提交
60 61
{
	int ret = 1;
62 63 64 65
	int error = 0;

	if (uptodate <= 0)
		error = uptodate ? uptodate : -EIO;
L
Linus Torvalds 已提交
66 67 68 69 70

	/*
	 * if failfast is set on a request, override number of sectors and
	 * complete the whole request right now
	 */
71
	if (blk_noretry_request(rq) && error)
72
		nr_bytes = rq->hard_nr_sectors << 9;
L
Linus Torvalds 已提交
73

74
	if (!blk_fs_request(rq) && error && !rq->errors)
L
Linus Torvalds 已提交
75 76 77 78 79 80
		rq->errors = -EIO;

	/*
	 * decide whether to reenable DMA -- 3 is a random magic for now,
	 * if we DMA timeout more than 3 times, just stay in PIO
	 */
81 82 83
	if ((drive->dev_flags & IDE_DFLAG_DMA_PIO_RETRY) &&
	    drive->retry_pio <= 3) {
		drive->dev_flags &= ~IDE_DFLAG_DMA_PIO_RETRY;
84
		ide_dma_on(drive);
L
Linus Torvalds 已提交
85 86
	}

87
	if (!blk_end_request(rq, error, nr_bytes))
L
Linus Torvalds 已提交
88
		ret = 0;
89 90

	if (ret == 0 && dequeue)
91
		drive->hwif->rq = NULL;
92

L
Linus Torvalds 已提交
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
	return ret;
}

/**
 *	ide_end_request		-	complete an IDE I/O
 *	@drive: IDE device for the I/O
 *	@uptodate:
 *	@nr_sectors: number of sectors completed
 *
 *	This is our end_request wrapper function. We complete the I/O
 *	update random number input and dequeue the request, which if
 *	it was tagged may be out of order.
 */

int ide_end_request (ide_drive_t *drive, int uptodate, int nr_sectors)
{
109
	unsigned int nr_bytes = nr_sectors << 9;
110
	struct request *rq = drive->hwif->rq;
L
Linus Torvalds 已提交
111

112 113 114 115 116 117
	if (!nr_bytes) {
		if (blk_pc_request(rq))
			nr_bytes = rq->data_len;
		else
			nr_bytes = rq->hard_cur_sectors << 9;
	}
L
Linus Torvalds 已提交
118

119
	return __ide_end_request(drive, rq, uptodate, nr_bytes, 1);
L
Linus Torvalds 已提交
120 121 122
}
EXPORT_SYMBOL(ide_end_request);

A
Alan Cox 已提交
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
/**
 *	ide_end_dequeued_request	-	complete an IDE I/O
 *	@drive: IDE device for the I/O
 *	@uptodate:
 *	@nr_sectors: number of sectors completed
 *
 *	Complete an I/O that is no longer on the request queue. This
 *	typically occurs when we pull the request and issue a REQUEST_SENSE.
 *	We must still finish the old request but we must not tamper with the
 *	queue in the meantime.
 *
 *	NOTE: This path does not handle barrier, but barrier is not supported
 *	on ide-cd anyway.
 */

int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq,
			     int uptodate, int nr_sectors)
{
141
	BUG_ON(!blk_rq_started(rq));
142

143
	return __ide_end_request(drive, rq, uptodate, nr_sectors << 9, 0);
A
Alan Cox 已提交
144 145 146
}
EXPORT_SYMBOL_GPL(ide_end_dequeued_request);

L
Linus Torvalds 已提交
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
/**
 *	ide_end_drive_cmd	-	end an explicit drive command
 *	@drive: command 
 *	@stat: status bits
 *	@err: error bits
 *
 *	Clean up after success/failure of an explicit drive command.
 *	These get thrown onto the queue so they are synchronized with
 *	real I/O operations on the drive.
 *
 *	In LBA48 mode we have to read the register set twice to get
 *	all the extra information out.
 */
 
void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
{
163 164
	ide_hwif_t *hwif = drive->hwif;
	struct request *rq = hwif->rq;
L
Linus Torvalds 已提交
165

166
	if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
167 168 169 170
		ide_task_t *task = (ide_task_t *)rq->special;

		if (task) {
			struct ide_taskfile *tf = &task->tf;
171 172 173

			tf->error = err;
			tf->status = stat;
L
Linus Torvalds 已提交
174

175
			drive->hwif->tp_ops->tf_read(drive, task);
176 177 178

			if (task->tf_flags & IDE_TFLAG_DYN)
				kfree(task);
L
Linus Torvalds 已提交
179 180
		}
	} else if (blk_pm_request(rq)) {
181
		struct request_pm_state *pm = rq->data;
182 183

		ide_complete_power_step(drive, rq);
184
		if (pm->pm_step == IDE_PM_COMPLETED)
L
Linus Torvalds 已提交
185 186 187 188
			ide_complete_pm_request(drive, rq);
		return;
	}

189
	hwif->rq = NULL;
190

L
Linus Torvalds 已提交
191
	rq->errors = err;
192

193 194
	if (unlikely(blk_end_request(rq, (rq->errors ? -EIO : 0),
				     blk_rq_bytes(rq))))
195
		BUG();
L
Linus Torvalds 已提交
196 197 198
}
EXPORT_SYMBOL(ide_end_drive_cmd);

199
void ide_kill_rq(ide_drive_t *drive, struct request *rq)
L
Linus Torvalds 已提交
200 201
{
	if (rq->rq_disk) {
202
		struct ide_driver *drv;
L
Linus Torvalds 已提交
203

204
		drv = *(struct ide_driver **)rq->rq_disk->private_data;
L
Linus Torvalds 已提交
205 206 207 208 209
		drv->end_request(drive, 0, 0);
	} else
		ide_end_request(drive, 0, 0);
}

210
static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
L
Linus Torvalds 已提交
211
{
212 213 214 215
	tf->nsect   = drive->sect;
	tf->lbal    = drive->sect;
	tf->lbam    = drive->cyl;
	tf->lbah    = drive->cyl >> 8;
216
	tf->device  = (drive->head - 1) | drive->select;
217
	tf->command = ATA_CMD_INIT_DEV_PARAMS;
L
Linus Torvalds 已提交
218 219
}

220
static void ide_tf_set_restore_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
L
Linus Torvalds 已提交
221
{
222
	tf->nsect   = drive->sect;
223
	tf->command = ATA_CMD_RESTORE;
L
Linus Torvalds 已提交
224 225
}

226
static void ide_tf_set_setmult_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
L
Linus Torvalds 已提交
227
{
228
	tf->nsect   = drive->mult_req;
229
	tf->command = ATA_CMD_SET_MULTI;
L
Linus Torvalds 已提交
230 231 232 233 234 235 236 237
}

static ide_startstop_t ide_disk_special(ide_drive_t *drive)
{
	special_t *s = &drive->special;
	ide_task_t args;

	memset(&args, 0, sizeof(ide_task_t));
238
	args.data_phase = TASKFILE_NO_DATA;
L
Linus Torvalds 已提交
239 240 241

	if (s->b.set_geometry) {
		s->b.set_geometry = 0;
242
		ide_tf_set_specify_cmd(drive, &args.tf);
L
Linus Torvalds 已提交
243 244
	} else if (s->b.recalibrate) {
		s->b.recalibrate = 0;
245
		ide_tf_set_restore_cmd(drive, &args.tf);
L
Linus Torvalds 已提交
246 247
	} else if (s->b.set_multmode) {
		s->b.set_multmode = 0;
248
		ide_tf_set_setmult_cmd(drive, &args.tf);
L
Linus Torvalds 已提交
249 250 251 252 253 254 255
	} else if (s->all) {
		int special = s->all;
		s->all = 0;
		printk(KERN_ERR "%s: bad special flag: 0x%02x\n", drive->name, special);
		return ide_stopped;
	}

256
	args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE |
257
			IDE_TFLAG_CUSTOM_HANDLER;
258

L
Linus Torvalds 已提交
259 260 261 262 263 264 265 266 267
	do_rw_taskfile(drive, &args);

	return ide_started;
}

/**
 *	do_special		-	issue some special commands
 *	@drive: drive the command is for
 *
268 269 270 271
 *	do_special() is used to issue ATA_CMD_INIT_DEV_PARAMS,
 *	ATA_CMD_RESTORE and ATA_CMD_SET_MULTI commands to a drive.
 *
 *	It used to do much more, but has been scaled back.
L
Linus Torvalds 已提交
272 273 274 275 276 277 278 279 280
 */

static ide_startstop_t do_special (ide_drive_t *drive)
{
	special_t *s = &drive->special;

#ifdef DEBUG
	printk("%s: do_special: 0x%02x\n", drive->name, s->all);
#endif
281 282
	if (drive->media == ide_disk)
		return ide_disk_special(drive);
L
Linus Torvalds 已提交
283

284 285 286
	s->all = 0;
	drive->mult_req = 0;
	return ide_stopped;
L
Linus Torvalds 已提交
287 288 289 290 291 292 293
}

void ide_map_sg(ide_drive_t *drive, struct request *rq)
{
	ide_hwif_t *hwif = drive->hwif;
	struct scatterlist *sg = hwif->sg_table;

294
	if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
L
Linus Torvalds 已提交
295 296
		sg_init_one(sg, rq->buffer, rq->nr_sectors * SECTOR_SIZE);
		hwif->sg_nents = 1;
297 298 299 300 301
	} else if (!rq->bio) {
		sg_init_one(sg, rq->data, rq->data_len);
		hwif->sg_nents = 1;
	} else {
		hwif->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
L
Linus Torvalds 已提交
302 303 304 305 306 307 308 309 310 311
	}
}

EXPORT_SYMBOL_GPL(ide_map_sg);

void ide_init_sg_cmd(ide_drive_t *drive, struct request *rq)
{
	ide_hwif_t *hwif = drive->hwif;

	hwif->nsect = hwif->nleft = rq->nr_sectors;
J
Jens Axboe 已提交
312 313
	hwif->cursg_ofs = 0;
	hwif->cursg = NULL;
L
Linus Torvalds 已提交
314 315 316 317 318 319
}

EXPORT_SYMBOL_GPL(ide_init_sg_cmd);

/**
 *	execute_drive_command	-	issue special drive command
320
 *	@drive: the drive to issue the command on
L
Linus Torvalds 已提交
321 322 323 324 325 326 327 328 329 330 331 332
 *	@rq: the request structure holding the command
 *
 *	execute_drive_cmd() issues a special drive command,  usually 
 *	initiated by ioctl() from the external hdparm program. The
 *	command can be a drive command, drive task or taskfile 
 *	operation. Weirdly you can call it with NULL to wait for
 *	all commands to finish. Don't do this as that is due to change
 */

static ide_startstop_t execute_drive_cmd (ide_drive_t *drive,
		struct request *rq)
{
333
	ide_hwif_t *hwif = drive->hwif;
334
	ide_task_t *task = rq->special;
L
Linus Torvalds 已提交
335

336
	if (task) {
337
		hwif->data_phase = task->data_phase;
L
Linus Torvalds 已提交
338 339 340 341 342 343 344 345 346 347 348

		switch (hwif->data_phase) {
		case TASKFILE_MULTI_OUT:
		case TASKFILE_OUT:
		case TASKFILE_MULTI_IN:
		case TASKFILE_IN:
			ide_init_sg_cmd(drive, rq);
			ide_map_sg(drive, rq);
		default:
			break;
		}
349

350 351 352
		return do_rw_taskfile(drive, task);
	}

L
Linus Torvalds 已提交
353 354 355 356 357 358 359
 	/*
 	 * NULL is actually a valid way of waiting for
 	 * all current requests to be flushed from the queue.
 	 */
#ifdef DEBUG
 	printk("%s: DRIVE_CMD (null)\n", drive->name);
#endif
360
	ide_end_drive_cmd(drive, hwif->tp_ops->read_status(hwif),
361
			  ide_read_error(drive));
362

L
Linus Torvalds 已提交
363
 	return ide_stopped;
364 365
}

366 367
static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq)
{
368 369 370
	u8 cmd = rq->cmd[0];

	switch (cmd) {
371 372 373
	case REQ_PARK_HEADS:
	case REQ_UNPARK_HEADS:
		return ide_do_park_unpark(drive, rq);
374
	case REQ_DEVSET_EXEC:
375
		return ide_do_devset(drive, rq);
376 377 378 379 380 381 382 383 384
	case REQ_DRIVE_RESET:
		return ide_do_reset(drive);
	default:
		blk_dump_rq_flags(rq, "ide_special_rq - bad request");
		ide_end_request(drive, 0, 0);
		return ide_stopped;
	}
}

L
Linus Torvalds 已提交
385 386 387 388
/**
 *	start_request	-	start of I/O and command issuing for IDE
 *
 *	start_request() initiates handling of a new I/O request. It
389
 *	accepts commands and I/O (read/write) requests.
L
Linus Torvalds 已提交
390 391 392 393 394 395 396 397
 *
 *	FIXME: this function needs a rename
 */
 
static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq)
{
	ide_startstop_t startstop;

398
	BUG_ON(!blk_rq_started(rq));
L
Linus Torvalds 已提交
399 400 401

#ifdef DEBUG
	printk("%s: start_request: current=0x%08lx\n",
402
		drive->hwif->name, (unsigned long) rq);
L
Linus Torvalds 已提交
403 404 405 406
#endif

	/* bail early if we've exceeded max_failures */
	if (drive->max_failures && (drive->failures > drive->max_failures)) {
407
		rq->cmd_flags |= REQ_FAILED;
L
Linus Torvalds 已提交
408 409 410
		goto kill_rq;
	}

411 412
	if (blk_pm_request(rq))
		ide_check_pm_state(drive, rq);
L
Linus Torvalds 已提交
413 414

	SELECT_DRIVE(drive);
415 416
	if (ide_wait_stat(&startstop, drive, drive->ready_stat,
			  ATA_BUSY | ATA_DRQ, WAIT_READY)) {
L
Linus Torvalds 已提交
417 418 419 420
		printk(KERN_ERR "%s: drive not ready for command\n", drive->name);
		return startstop;
	}
	if (!drive->special.all) {
421
		struct ide_driver *drv;
L
Linus Torvalds 已提交
422

423 424 425 426 427 428 429
		/*
		 * We reset the drive so we need to issue a SETFEATURES.
		 * Do it _after_ do_special() restored device parameters.
		 */
		if (drive->current_speed == 0xff)
			ide_config_drive_speed(drive, drive->desired_speed);

430
		if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE)
L
Linus Torvalds 已提交
431 432
			return execute_drive_cmd(drive, rq);
		else if (blk_pm_request(rq)) {
433
			struct request_pm_state *pm = rq->data;
L
Linus Torvalds 已提交
434 435
#ifdef DEBUG_PM
			printk("%s: start_power_step(step: %d)\n",
436
				drive->name, pm->pm_step);
L
Linus Torvalds 已提交
437 438 439
#endif
			startstop = ide_start_power_step(drive, rq);
			if (startstop == ide_stopped &&
440
			    pm->pm_step == IDE_PM_COMPLETED)
L
Linus Torvalds 已提交
441 442
				ide_complete_pm_request(drive, rq);
			return startstop;
443 444 445 446 447 448 449 450 451 452
		} else if (!rq->rq_disk && blk_special_request(rq))
			/*
			 * TODO: Once all ULDs have been modified to
			 * check for specific op codes rather than
			 * blindly accepting any special request, the
			 * check for ->rq_disk above may be replaced
			 * by a more suitable mechanism or even
			 * dropped entirely.
			 */
			return ide_special_rq(drive, rq);
L
Linus Torvalds 已提交
453

454
		drv = *(struct ide_driver **)rq->rq_disk->private_data;
455 456

		return drv->do_request(drive, rq, rq->sector);
L
Linus Torvalds 已提交
457 458 459 460 461 462 463 464 465 466 467 468 469
	}
	return do_special(drive);
kill_rq:
	ide_kill_rq(drive, rq);
	return ide_stopped;
}

/**
 *	ide_stall_queue		-	pause an IDE device
 *	@drive: drive to stall
 *	@timeout: time to stall for (jiffies)
 *
 *	ide_stall_queue() can be used by a drive to give excess bandwidth back
470
 *	to the port by sleeping for timeout jiffies.
L
Linus Torvalds 已提交
471 472 473 474 475 476 477
 */
 
void ide_stall_queue (ide_drive_t *drive, unsigned long timeout)
{
	if (timeout > WAIT_WORSTCASE)
		timeout = WAIT_WORSTCASE;
	drive->sleep = timeout + jiffies;
B
Bartlomiej Zolnierkiewicz 已提交
478
	drive->dev_flags |= IDE_DFLAG_SLEEPING;
L
Linus Torvalds 已提交
479 480 481
}
EXPORT_SYMBOL(ide_stall_queue);

482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
static inline int ide_lock_port(ide_hwif_t *hwif)
{
	if (hwif->busy)
		return 1;

	hwif->busy = 1;

	return 0;
}

static inline void ide_unlock_port(ide_hwif_t *hwif)
{
	hwif->busy = 0;
}

static inline int ide_lock_host(struct ide_host *host, ide_hwif_t *hwif)
{
	int rc = 0;

	if (host->host_flags & IDE_HFLAG_SERIALIZE) {
		rc = test_and_set_bit_lock(IDE_HOST_BUSY, &host->host_busy);
		if (rc == 0) {
			/* for atari only */
			ide_get_lock(ide_intr, hwif);
		}
	}
	return rc;
}

static inline void ide_unlock_host(struct ide_host *host)
{
	if (host->host_flags & IDE_HFLAG_SERIALIZE) {
		/* for atari only */
		ide_release_lock();
		clear_bit_unlock(IDE_HOST_BUSY, &host->host_busy);
	}
}

L
Linus Torvalds 已提交
520
/*
521
 * Issue a new request to a device.
L
Linus Torvalds 已提交
522
 */
523
void do_ide_request(struct request_queue *q)
L
Linus Torvalds 已提交
524
{
525 526
	ide_drive_t	*drive = q->queuedata;
	ide_hwif_t	*hwif = drive->hwif;
527 528
	struct ide_host *host = hwif->host;
	struct request	*rq = NULL;
L
Linus Torvalds 已提交
529 530
	ide_startstop_t	startstop;

531 532 533 534 535 536
	/*
	 * drive is doing pre-flush, ordered write, post-flush sequence. even
	 * though that is 3 requests, it must be seen as a single transaction.
	 * we must not preempt this drive until that is complete
	 */
	if (blk_queue_flushing(q))
L
Linus Torvalds 已提交
537
		/*
538 539 540
		 * small race where queue could get replugged during
		 * the 3-request flush cycle, just yank the plug since
		 * we want it to finish asap
L
Linus Torvalds 已提交
541
		 */
542
		blk_remove_plug(q);
L
Linus Torvalds 已提交
543

544
	spin_unlock_irq(q->queue_lock);
545 546 547 548

	if (ide_lock_host(host, hwif))
		goto plug_device_2;

549
	spin_lock_irq(&hwif->lock);
550

551
	if (!ide_lock_port(hwif)) {
552
		ide_hwif_t *prev_port;
553
repeat:
554
		prev_port = hwif->host->cur_port;
555
		hwif->rq = NULL;
556

557 558
		if (drive->dev_flags & IDE_DFLAG_SLEEPING) {
			if (time_before(drive->sleep, jiffies)) {
559
				ide_unlock_port(hwif);
560 561 562
				goto plug_device;
			}
		}
563

564 565
		if ((hwif->host->host_flags & IDE_HFLAG_SERIALIZE) &&
		    hwif != prev_port) {
566
			/*
567
			 * set nIEN for previous port, drives in the
568 569
			 * quirk_list may not like intr setups/cleanups
			 */
570
			if (prev_port && prev_port->cur_dev->quirk_list == 0)
571
				prev_port->tp_ops->set_irq(prev_port, 0);
572 573

			hwif->host->cur_port = hwif;
L
Linus Torvalds 已提交
574
		}
575
		hwif->cur_dev = drive;
576
		drive->dev_flags &= ~(IDE_DFLAG_SLEEPING | IDE_DFLAG_PARKED);
L
Linus Torvalds 已提交
577

578
		spin_unlock_irq(&hwif->lock);
579
		spin_lock_irq(q->queue_lock);
L
Linus Torvalds 已提交
580 581 582 583 584
		/*
		 * we know that the queue isn't empty, but this can happen
		 * if the q->prep_rq_fn() decides to kill a request
		 */
		rq = elv_next_request(drive->queue);
585
		spin_unlock_irq(q->queue_lock);
586
		spin_lock_irq(&hwif->lock);
587

L
Linus Torvalds 已提交
588
		if (!rq) {
589
			ide_unlock_port(hwif);
590
			goto out;
L
Linus Torvalds 已提交
591 592 593 594 595 596 597 598 599 600 601 602 603 604 605
		}

		/*
		 * Sanity: don't accept a request that isn't a PM request
		 * if we are currently power managed. This is very important as
		 * blk_stop_queue() doesn't prevent the elv_next_request()
		 * above to return us whatever is in the queue. Since we call
		 * ide_do_request() ourselves, we end up taking requests while
		 * the queue is blocked...
		 * 
		 * We let requests forced at head of queue with ide-preempt
		 * though. I hope that doesn't happen too much, hopefully not
		 * unless the subdriver triggers such a thing in its own PM
		 * state machine.
		 */
B
Bartlomiej Zolnierkiewicz 已提交
606 607 608
		if ((drive->dev_flags & IDE_DFLAG_BLOCKED) &&
		    blk_pm_request(rq) == 0 &&
		    (rq->cmd_flags & REQ_PREEMPT) == 0) {
609
			/* there should be no pending command at this point */
610
			ide_unlock_port(hwif);
611
			goto plug_device;
L
Linus Torvalds 已提交
612 613
		}

614
		hwif->rq = rq;
L
Linus Torvalds 已提交
615

616
		spin_unlock_irq(&hwif->lock);
L
Linus Torvalds 已提交
617
		startstop = start_request(drive, rq);
618
		spin_lock_irq(&hwif->lock);
619

620 621 622 623 624
		if (startstop == ide_stopped)
			goto repeat;
	} else
		goto plug_device;
out:
625
	spin_unlock_irq(&hwif->lock);
626 627
	if (rq == NULL)
		ide_unlock_host(host);
628
	spin_lock_irq(q->queue_lock);
629
	return;
L
Linus Torvalds 已提交
630

631
plug_device:
632
	spin_unlock_irq(&hwif->lock);
633 634
	ide_unlock_host(host);
plug_device_2:
635 636 637 638
	spin_lock_irq(q->queue_lock);

	if (!elv_queue_empty(q))
		blk_plug_device(q);
L
Linus Torvalds 已提交
639 640
}

641 642 643 644 645 646 647 648 649 650 651
static void ide_plug_device(ide_drive_t *drive)
{
	struct request_queue *q = drive->queue;
	unsigned long flags;

	spin_lock_irqsave(q->queue_lock, flags);
	if (!elv_queue_empty(q))
		blk_plug_device(q);
	spin_unlock_irqrestore(q->queue_lock, flags);
}

652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674
static int drive_is_ready(ide_drive_t *drive)
{
	ide_hwif_t *hwif = drive->hwif;
	u8 stat = 0;

	if (drive->waiting_for_dma)
		return hwif->dma_ops->dma_test_irq(drive);

	if (hwif->io_ports.ctl_addr &&
	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0)
		stat = hwif->tp_ops->read_altstatus(hwif);
	else
		/* Note: this may clear a pending IRQ!! */
		stat = hwif->tp_ops->read_status(hwif);

	if (stat & ATA_BUSY)
		/* drive busy: definitely not interrupting */
		return 0;

	/* drive ready: *might* be interrupting */
	return 1;
}

L
Linus Torvalds 已提交
675 676
/**
 *	ide_timer_expiry	-	handle lack of an IDE interrupt
677
 *	@data: timer callback magic (hwif)
L
Linus Torvalds 已提交
678 679 680 681 682 683 684 685 686 687 688 689 690
 *
 *	An IDE command has timed out before the expected drive return
 *	occurred. At this point we attempt to clean up the current
 *	mess. If the current handler includes an expiry handler then
 *	we invoke the expiry handler, and providing it is happy the
 *	work is done. If that fails we apply generic recovery rules
 *	invoking the handler and checking the drive DMA status. We
 *	have an excessively incestuous relationship with the DMA
 *	logic that wants cleaning up.
 */
 
void ide_timer_expiry (unsigned long data)
{
691
	ide_hwif_t	*hwif = (ide_hwif_t *)data;
692
	ide_drive_t	*uninitialized_var(drive);
L
Linus Torvalds 已提交
693 694
	ide_handler_t	*handler;
	unsigned long	flags;
695
	int		wait = -1;
696
	int		plug_device = 0;
L
Linus Torvalds 已提交
697

698 699 700
	spin_lock_irqsave(&hwif->lock, flags);

	handler = hwif->handler;
L
Linus Torvalds 已提交
701

702
	if (handler == NULL || hwif->req_gen != hwif->req_gen_timer) {
L
Linus Torvalds 已提交
703 704 705 706 707 708 709
		/*
		 * Either a marginal timeout occurred
		 * (got the interrupt just as timer expired),
		 * or we were "sleeping" to give other devices a chance.
		 * Either way, we don't really want to complain about anything.
		 */
	} else {
710 711 712
		ide_expiry_t *expiry = hwif->expiry;
		ide_startstop_t startstop = ide_stopped;

713
		drive = hwif->cur_dev;
714 715 716 717 718 719 720 721 722 723

		if (expiry) {
			wait = expiry(drive);
			if (wait > 0) { /* continue */
				/* reset timer */
				hwif->timer.expires = jiffies + wait;
				hwif->req_gen_timer = hwif->req_gen;
				add_timer(&hwif->timer);
				spin_unlock_irqrestore(&hwif->lock, flags);
				return;
724
			}
L
Linus Torvalds 已提交
725
		}
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741
		hwif->handler = NULL;
		/*
		 * We need to simulate a real interrupt when invoking
		 * the handler() function, which means we need to
		 * globally mask the specific IRQ:
		 */
		spin_unlock(&hwif->lock);
		/* disable_irq_nosync ?? */
		disable_irq(hwif->irq);
		/* local CPU only, as if we were handling an interrupt */
		local_irq_disable();
		if (hwif->polling) {
			startstop = handler(drive);
		} else if (drive_is_ready(drive)) {
			if (drive->waiting_for_dma)
				hwif->dma_ops->dma_lost_irq(drive);
742 743
			if (hwif->ack_intr)
				hwif->ack_intr(hwif);
744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759
			printk(KERN_WARNING "%s: lost interrupt\n",
				drive->name);
			startstop = handler(drive);
		} else {
			if (drive->waiting_for_dma)
				startstop = ide_dma_timeout_retry(drive, wait);
			else
				startstop = ide_error(drive, "irq timeout",
					hwif->tp_ops->read_status(hwif));
		}
		spin_lock_irq(&hwif->lock);
		enable_irq(hwif->irq);
		if (startstop == ide_stopped) {
			ide_unlock_port(hwif);
			plug_device = 1;
		}
L
Linus Torvalds 已提交
760
	}
761
	spin_unlock_irqrestore(&hwif->lock, flags);
762

763 764
	if (plug_device) {
		ide_unlock_host(hwif->host);
765
		ide_plug_device(drive);
766
	}
L
Linus Torvalds 已提交
767 768 769 770 771
}

/**
 *	unexpected_intr		-	handle an unexpected IDE interrupt
 *	@irq: interrupt line
772
 *	@hwif: port being processed
L
Linus Torvalds 已提交
773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796
 *
 *	There's nothing really useful we can do with an unexpected interrupt,
 *	other than reading the status register (to clear it), and logging it.
 *	There should be no way that an irq can happen before we're ready for it,
 *	so we needn't worry much about losing an "important" interrupt here.
 *
 *	On laptops (and "green" PCs), an unexpected interrupt occurs whenever
 *	the drive enters "idle", "standby", or "sleep" mode, so if the status
 *	looks "good", we just ignore the interrupt completely.
 *
 *	This routine assumes __cli() is in effect when called.
 *
 *	If an unexpected interrupt happens on irq15 while we are handling irq14
 *	and if the two interfaces are "serialized" (CMD640), then it looks like
 *	we could screw up by interfering with a new request being set up for 
 *	irq15.
 *
 *	In reality, this is a non-issue.  The new command is not sent unless 
 *	the drive is ready to accept one, in which case we know the drive is
 *	not trying to interrupt us.  And ide_set_handler() is always invoked
 *	before completing the issuance of any new drive command, so we will not
 *	be accidentally invoked as a result of any valid command completion
 *	interrupt.
 */
797 798

static void unexpected_intr(int irq, ide_hwif_t *hwif)
L
Linus Torvalds 已提交
799
{
800 801 802 803 804 805 806 807 808 809 810 811
	u8 stat = hwif->tp_ops->read_status(hwif);

	if (!OK_STAT(stat, ATA_DRDY, BAD_STAT)) {
		/* Try to not flood the console with msgs */
		static unsigned long last_msgtime, count;
		++count;

		if (time_after(jiffies, last_msgtime + HZ)) {
			last_msgtime = jiffies;
			printk(KERN_ERR "%s: unexpected interrupt, "
				"status=0x%02x, count=%ld\n",
				hwif->name, stat, count);
L
Linus Torvalds 已提交
812
		}
813
	}
L
Linus Torvalds 已提交
814 815 816 817 818
}

/**
 *	ide_intr	-	default IDE interrupt handler
 *	@irq: interrupt number
819
 *	@dev_id: hwif
L
Linus Torvalds 已提交
820 821 822 823 824 825
 *	@regs: unused weirdness from the kernel irq layer
 *
 *	This is the default IRQ handler for the IDE layer. You should
 *	not need to override it. If you do be aware it is subtle in
 *	places
 *
826
 *	hwif is the interface in the group currently performing
827
 *	a command. hwif->cur_dev is the drive and hwif->handler is
L
Linus Torvalds 已提交
828 829 830 831 832 833 834 835 836 837
 *	the IRQ handler to call. As we issue a command the handlers
 *	step through multiple states, reassigning the handler to the
 *	next step in the process. Unlike a smart SCSI controller IDE
 *	expects the main processor to sequence the various transfer
 *	stages. We also manage a poll timer to catch up with most
 *	timeout situations. There are still a few where the handlers
 *	don't ever decide to give up.
 *
 *	The handler eventually returns ide_stopped to indicate the
 *	request completed. At this point we issue the next request
838
 *	on the port and the process begins again.
L
Linus Torvalds 已提交
839
 */
840

841
irqreturn_t ide_intr (int irq, void *dev_id)
L
Linus Torvalds 已提交
842
{
843
	ide_hwif_t *hwif = (ide_hwif_t *)dev_id;
844
	ide_drive_t *uninitialized_var(drive);
L
Linus Torvalds 已提交
845
	ide_handler_t *handler;
846
	unsigned long flags;
L
Linus Torvalds 已提交
847
	ide_startstop_t startstop;
848
	irqreturn_t irq_ret = IRQ_NONE;
849
	int plug_device = 0;
L
Linus Torvalds 已提交
850

851 852 853 854
	if (hwif->host->host_flags & IDE_HFLAG_SERIALIZE) {
		if (hwif != hwif->host->cur_port)
			goto out_early;
	}
855

856
	spin_lock_irqsave(&hwif->lock, flags);
L
Linus Torvalds 已提交
857

858
	if (hwif->ack_intr && hwif->ack_intr(hwif) == 0)
859
		goto out;
L
Linus Torvalds 已提交
860

861 862 863
	handler = hwif->handler;

	if (handler == NULL || hwif->polling) {
L
Linus Torvalds 已提交
864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879
		/*
		 * Not expecting an interrupt from this drive.
		 * That means this could be:
		 *	(1) an interrupt from another PCI device
		 *	sharing the same PCI INT# as us.
		 * or	(2) a drive just entered sleep or standby mode,
		 *	and is interrupting to let us know.
		 * or	(3) a spurious interrupt of unknown origin.
		 *
		 * For PCI, we cannot tell the difference,
		 * so in that case we just ignore it and hope it goes away.
		 *
		 * FIXME: unexpected_intr should be hwif-> then we can
		 * remove all the ifdef PCI crap
		 */
#ifdef CONFIG_BLK_DEV_IDEPCI
880
		if (hwif->chipset != ide_pci)
L
Linus Torvalds 已提交
881 882 883 884 885 886
#endif	/* CONFIG_BLK_DEV_IDEPCI */
		{
			/*
			 * Probably not a shared PCI interrupt,
			 * so we can safely try to do something about it:
			 */
887
			unexpected_intr(irq, hwif);
L
Linus Torvalds 已提交
888 889 890 891 892 893
#ifdef CONFIG_BLK_DEV_IDEPCI
		} else {
			/*
			 * Whack the status register, just in case
			 * we have a leftover pending IRQ.
			 */
894
			(void)hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
895 896
#endif /* CONFIG_BLK_DEV_IDEPCI */
		}
897
		goto out;
L
Linus Torvalds 已提交
898
	}
899

900
	drive = hwif->cur_dev;
901 902

	if (!drive_is_ready(drive))
L
Linus Torvalds 已提交
903 904 905 906 907 908 909
		/*
		 * This happens regularly when we share a PCI IRQ with
		 * another device.  Unfortunately, it can also happen
		 * with some buggy drives that trigger the IRQ before
		 * their status register is up to date.  Hopefully we have
		 * enough advance overhead that the latter isn't a problem.
		 */
910 911
		goto out;

912 913 914 915
	hwif->handler = NULL;
	hwif->req_gen++;
	del_timer(&hwif->timer);
	spin_unlock(&hwif->lock);
L
Linus Torvalds 已提交
916

917 918
	if (hwif->port_ops && hwif->port_ops->clear_irq)
		hwif->port_ops->clear_irq(drive);
919

B
Bartlomiej Zolnierkiewicz 已提交
920
	if (drive->dev_flags & IDE_DFLAG_UNMASK)
921
		local_irq_enable_in_hardirq();
922

L
Linus Torvalds 已提交
923 924 925
	/* service this interrupt, may set handler for next interrupt */
	startstop = handler(drive);

926
	spin_lock_irq(&hwif->lock);
L
Linus Torvalds 已提交
927 928 929 930 931 932 933 934
	/*
	 * Note that handler() may have set things up for another
	 * interrupt to occur soon, but it cannot happen until
	 * we exit from this routine, because it will be the
	 * same irq as is currently being serviced here, and Linux
	 * won't allow another of the same (on any CPU) until we return.
	 */
	if (startstop == ide_stopped) {
935 936 937
		BUG_ON(hwif->handler);
		ide_unlock_port(hwif);
		plug_device = 1;
L
Linus Torvalds 已提交
938
	}
939 940
	irq_ret = IRQ_HANDLED;
out:
941
	spin_unlock_irqrestore(&hwif->lock, flags);
942
out_early:
943 944
	if (plug_device) {
		ide_unlock_host(hwif->host);
945
		ide_plug_device(drive);
946
	}
947

948
	return irq_ret;
L
Linus Torvalds 已提交
949
}
950
EXPORT_SYMBOL_GPL(ide_intr);
L
Linus Torvalds 已提交
951

952 953 954 955 956 957 958
void ide_pad_transfer(ide_drive_t *drive, int write, int len)
{
	ide_hwif_t *hwif = drive->hwif;
	u8 buf[4] = { 0 };

	while (len > 0) {
		if (write)
959
			hwif->tp_ops->output_data(drive, NULL, buf, min(4, len));
960
		else
961
			hwif->tp_ops->input_data(drive, NULL, buf, min(4, len));
962 963 964 965
		len -= 4;
	}
}
EXPORT_SYMBOL_GPL(ide_pad_transfer);