ide-iops.c 31.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/*
 *  Copyright (C) 2000-2002	Andre Hedrick <andre@linux-ide.org>
A
Alan Cox 已提交
3
 *  Copyright (C) 2003		Red Hat
L
Linus Torvalds 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
 *
 */

#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/pci.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/bitops.h>
23
#include <linux/nmi.h>
L
Linus Torvalds 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59

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

/*
 *	Conventional PIO operations for ATA devices
 */

static u8 ide_inb (unsigned long port)
{
	return (u8) inb(port);
}

static void ide_outb (u8 val, unsigned long port)
{
	outb(val, port);
}

/*
 *	MMIO operations, typically used for SATA controllers
 */

static u8 ide_mm_inb (unsigned long port)
{
	return (u8) readb((void __iomem *) port);
}

static void ide_mm_outb (u8 value, unsigned long port)
{
	writeb(value, (void __iomem *) port);
}

void SELECT_DRIVE (ide_drive_t *drive)
{
60
	ide_hwif_t *hwif = drive->hwif;
61
	const struct ide_port_ops *port_ops = hwif->port_ops;
62
	ide_task_t task;
63

64 65
	if (port_ops && port_ops->selectproc)
		port_ops->selectproc(drive);
66

67 68 69
	memset(&task, 0, sizeof(task));
	task.tf_flags = IDE_TFLAG_OUT_DEVICE;

70
	drive->hwif->tp_ops->tf_load(drive, &task);
L
Linus Torvalds 已提交
71 72
}

73
void SELECT_MASK(ide_drive_t *drive, int mask)
L
Linus Torvalds 已提交
74
{
75 76 77 78
	const struct ide_port_ops *port_ops = drive->hwif->port_ops;

	if (port_ops && port_ops->maskproc)
		port_ops->maskproc(drive, mask);
L
Linus Torvalds 已提交
79 80
}

81
void ide_exec_command(ide_hwif_t *hwif, u8 cmd)
82 83 84 85 86 87
{
	if (hwif->host_flags & IDE_HFLAG_MMIO)
		writeb(cmd, (void __iomem *)hwif->io_ports.command_addr);
	else
		outb(cmd, hwif->io_ports.command_addr);
}
88
EXPORT_SYMBOL_GPL(ide_exec_command);
89

90
u8 ide_read_status(ide_hwif_t *hwif)
91 92 93 94 95 96
{
	if (hwif->host_flags & IDE_HFLAG_MMIO)
		return readb((void __iomem *)hwif->io_ports.status_addr);
	else
		return inb(hwif->io_ports.status_addr);
}
97
EXPORT_SYMBOL_GPL(ide_read_status);
98

99
u8 ide_read_altstatus(ide_hwif_t *hwif)
100 101 102 103 104 105
{
	if (hwif->host_flags & IDE_HFLAG_MMIO)
		return readb((void __iomem *)hwif->io_ports.ctl_addr);
	else
		return inb(hwif->io_ports.ctl_addr);
}
106
EXPORT_SYMBOL_GPL(ide_read_altstatus);
107

108
void ide_set_irq(ide_hwif_t *hwif, int on)
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
{
	u8 ctl = ATA_DEVCTL_OBS;

	if (on == 4) { /* hack for SRST */
		ctl |= 4;
		on &= ~4;
	}

	ctl |= on ? 0 : 2;

	if (hwif->host_flags & IDE_HFLAG_MMIO)
		writeb(ctl, (void __iomem *)hwif->io_ports.ctl_addr);
	else
		outb(ctl, hwif->io_ports.ctl_addr);
}
124
EXPORT_SYMBOL_GPL(ide_set_irq);
125

126
void ide_tf_load(ide_drive_t *drive, ide_task_t *task)
127 128 129 130
{
	ide_hwif_t *hwif = drive->hwif;
	struct ide_io_ports *io_ports = &hwif->io_ports;
	struct ide_taskfile *tf = &task->tf;
131 132
	void (*tf_outb)(u8 addr, unsigned long port);
	u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
133 134
	u8 HIHI = (task->tf_flags & IDE_TFLAG_LBA48) ? 0xE0 : 0xEF;

135 136 137 138 139
	if (mmio)
		tf_outb = ide_mm_outb;
	else
		tf_outb = ide_outb;

140 141 142
	if (task->tf_flags & IDE_TFLAG_FLAGGED)
		HIHI = 0xFF;

143 144 145 146 147 148 149 150
	if (task->tf_flags & IDE_TFLAG_OUT_DATA) {
		u16 data = (tf->hob_data << 8) | tf->data;

		if (mmio)
			writew(data, (void __iomem *)io_ports->data_addr);
		else
			outw(data, io_ports->data_addr);
	}
151 152

	if (task->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
153
		tf_outb(tf->hob_feature, io_ports->feature_addr);
154
	if (task->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
155
		tf_outb(tf->hob_nsect, io_ports->nsect_addr);
156
	if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAL)
157
		tf_outb(tf->hob_lbal, io_ports->lbal_addr);
158
	if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAM)
159
		tf_outb(tf->hob_lbam, io_ports->lbam_addr);
160
	if (task->tf_flags & IDE_TFLAG_OUT_HOB_LBAH)
161
		tf_outb(tf->hob_lbah, io_ports->lbah_addr);
162 163

	if (task->tf_flags & IDE_TFLAG_OUT_FEATURE)
164
		tf_outb(tf->feature, io_ports->feature_addr);
165
	if (task->tf_flags & IDE_TFLAG_OUT_NSECT)
166
		tf_outb(tf->nsect, io_ports->nsect_addr);
167
	if (task->tf_flags & IDE_TFLAG_OUT_LBAL)
168
		tf_outb(tf->lbal, io_ports->lbal_addr);
169
	if (task->tf_flags & IDE_TFLAG_OUT_LBAM)
170
		tf_outb(tf->lbam, io_ports->lbam_addr);
171
	if (task->tf_flags & IDE_TFLAG_OUT_LBAH)
172
		tf_outb(tf->lbah, io_ports->lbah_addr);
173 174

	if (task->tf_flags & IDE_TFLAG_OUT_DEVICE)
175
		tf_outb((tf->device & HIHI) | drive->select,
176
			 io_ports->device_addr);
177
}
178
EXPORT_SYMBOL_GPL(ide_tf_load);
179

180
void ide_tf_read(ide_drive_t *drive, ide_task_t *task)
181 182 183 184
{
	ide_hwif_t *hwif = drive->hwif;
	struct ide_io_ports *io_ports = &hwif->io_ports;
	struct ide_taskfile *tf = &task->tf;
185 186 187 188 189 190 191 192 193 194 195
	void (*tf_outb)(u8 addr, unsigned long port);
	u8 (*tf_inb)(unsigned long port);
	u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;

	if (mmio) {
		tf_outb = ide_mm_outb;
		tf_inb  = ide_mm_inb;
	} else {
		tf_outb = ide_outb;
		tf_inb  = ide_inb;
	}
196 197

	if (task->tf_flags & IDE_TFLAG_IN_DATA) {
198 199 200 201 202 203
		u16 data;

		if (mmio)
			data = readw((void __iomem *)io_ports->data_addr);
		else
			data = inw(io_ports->data_addr);
204 205 206 207 208 209

		tf->data = data & 0xff;
		tf->hob_data = (data >> 8) & 0xff;
	}

	/* be sure we're looking at the low order bits */
210
	tf_outb(ATA_DEVCTL_OBS & ~0x80, io_ports->ctl_addr);
211

212 213
	if (task->tf_flags & IDE_TFLAG_IN_FEATURE)
		tf->feature = tf_inb(io_ports->feature_addr);
214
	if (task->tf_flags & IDE_TFLAG_IN_NSECT)
215
		tf->nsect  = tf_inb(io_ports->nsect_addr);
216
	if (task->tf_flags & IDE_TFLAG_IN_LBAL)
217
		tf->lbal   = tf_inb(io_ports->lbal_addr);
218
	if (task->tf_flags & IDE_TFLAG_IN_LBAM)
219
		tf->lbam   = tf_inb(io_ports->lbam_addr);
220
	if (task->tf_flags & IDE_TFLAG_IN_LBAH)
221
		tf->lbah   = tf_inb(io_ports->lbah_addr);
222
	if (task->tf_flags & IDE_TFLAG_IN_DEVICE)
223
		tf->device = tf_inb(io_ports->device_addr);
224 225

	if (task->tf_flags & IDE_TFLAG_LBA48) {
226
		tf_outb(ATA_DEVCTL_OBS | 0x80, io_ports->ctl_addr);
227 228

		if (task->tf_flags & IDE_TFLAG_IN_HOB_FEATURE)
229
			tf->hob_feature = tf_inb(io_ports->feature_addr);
230
		if (task->tf_flags & IDE_TFLAG_IN_HOB_NSECT)
231
			tf->hob_nsect   = tf_inb(io_ports->nsect_addr);
232
		if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAL)
233
			tf->hob_lbal    = tf_inb(io_ports->lbal_addr);
234
		if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAM)
235
			tf->hob_lbam    = tf_inb(io_ports->lbam_addr);
236
		if (task->tf_flags & IDE_TFLAG_IN_HOB_LBAH)
237
			tf->hob_lbah    = tf_inb(io_ports->lbah_addr);
238 239
	}
}
240
EXPORT_SYMBOL_GPL(ide_tf_read);
241

L
Linus Torvalds 已提交
242 243 244 245 246 247 248
/*
 * Some localbus EIDE interfaces require a special access sequence
 * when using 32-bit I/O instructions to transfer data.  We call this
 * the "vlb_sync" sequence, which consists of three successive reads
 * of the sector count register location, with interrupts disabled
 * to ensure that the reads all happen together.
 */
249
static void ata_vlb_sync(unsigned long port)
L
Linus Torvalds 已提交
250
{
251 252 253
	(void)inb(port);
	(void)inb(port);
	(void)inb(port);
L
Linus Torvalds 已提交
254 255 256 257
}

/*
 * This is used for most PIO data transfers *from* the IDE interface
258 259 260 261
 *
 * These routines will round up any request for an odd number of bytes,
 * so if an odd len is specified, be sure that there's at least one
 * extra byte allocated for the buffer.
L
Linus Torvalds 已提交
262
 */
263 264
void ide_input_data(ide_drive_t *drive, struct request *rq, void *buf,
		    unsigned int len)
L
Linus Torvalds 已提交
265
{
266 267
	ide_hwif_t *hwif = drive->hwif;
	struct ide_io_ports *io_ports = &hwif->io_ports;
268
	unsigned long data_addr = io_ports->data_addr;
269
	u8 io_32bit = drive->io_32bit;
270
	u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
L
Linus Torvalds 已提交
271

272 273
	len++;

L
Linus Torvalds 已提交
274
	if (io_32bit) {
275
		unsigned long uninitialized_var(flags);
276

277
		if ((io_32bit & 2) && !mmio) {
L
Linus Torvalds 已提交
278
			local_irq_save(flags);
279
			ata_vlb_sync(io_ports->nsect_addr);
280 281 282 283 284 285 286
		}

		if (mmio)
			__ide_mm_insl((void __iomem *)data_addr, buf, len / 4);
		else
			insl(data_addr, buf, len / 4);

287
		if ((io_32bit & 2) && !mmio)
L
Linus Torvalds 已提交
288
			local_irq_restore(flags);
289

290 291 292 293 294 295 296 297 298 299 300 301 302
		if ((len & 3) >= 2) {
			if (mmio)
				__ide_mm_insw((void __iomem *)data_addr,
						(u8 *)buf + (len & ~3), 1);
			else
				insw(data_addr, (u8 *)buf + (len & ~3), 1);
		}
	} else {
		if (mmio)
			__ide_mm_insw((void __iomem *)data_addr, buf, len / 2);
		else
			insw(data_addr, buf, len / 2);
	}
L
Linus Torvalds 已提交
303
}
304
EXPORT_SYMBOL_GPL(ide_input_data);
L
Linus Torvalds 已提交
305 306 307 308

/*
 * This is used for most PIO data transfers *to* the IDE interface
 */
309 310
void ide_output_data(ide_drive_t *drive, struct request *rq, void *buf,
		     unsigned int len)
L
Linus Torvalds 已提交
311
{
312 313
	ide_hwif_t *hwif = drive->hwif;
	struct ide_io_ports *io_ports = &hwif->io_ports;
314
	unsigned long data_addr = io_ports->data_addr;
315
	u8 io_32bit = drive->io_32bit;
316
	u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
L
Linus Torvalds 已提交
317 318

	if (io_32bit) {
319
		unsigned long uninitialized_var(flags);
320

321
		if ((io_32bit & 2) && !mmio) {
L
Linus Torvalds 已提交
322
			local_irq_save(flags);
323
			ata_vlb_sync(io_ports->nsect_addr);
324 325 326 327 328 329 330
		}

		if (mmio)
			__ide_mm_outsl((void __iomem *)data_addr, buf, len / 4);
		else
			outsl(data_addr, buf, len / 4);

331
		if ((io_32bit & 2) && !mmio)
L
Linus Torvalds 已提交
332 333
			local_irq_restore(flags);

334 335 336 337 338 339 340 341 342 343 344 345 346
		if ((len & 3) >= 2) {
			if (mmio)
				__ide_mm_outsw((void __iomem *)data_addr,
						 (u8 *)buf + (len & ~3), 1);
			else
				outsw(data_addr, (u8 *)buf + (len & ~3), 1);
		}
	} else {
		if (mmio)
			__ide_mm_outsw((void __iomem *)data_addr, buf, len / 2);
		else
			outsw(data_addr, buf, len / 2);
	}
L
Linus Torvalds 已提交
347
}
348
EXPORT_SYMBOL_GPL(ide_output_data);
L
Linus Torvalds 已提交
349

350 351 352 353 354 355 356
u8 ide_read_error(ide_drive_t *drive)
{
	ide_task_t task;

	memset(&task, 0, sizeof(task));
	task.tf_flags = IDE_TFLAG_IN_FEATURE;

357
	drive->hwif->tp_ops->tf_read(drive, &task);
358 359 360 361 362

	return task.tf.error;
}
EXPORT_SYMBOL_GPL(ide_read_error);

363 364 365 366 367 368 369 370
void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason)
{
	ide_task_t task;

	memset(&task, 0, sizeof(task));
	task.tf_flags = IDE_TFLAG_IN_LBAH | IDE_TFLAG_IN_LBAM |
			IDE_TFLAG_IN_NSECT;

371
	drive->hwif->tp_ops->tf_read(drive, &task);
372 373 374 375 376 377

	*bcount = (task.tf.lbah << 8) | task.tf.lbam;
	*ireason = task.tf.nsect & 3;
}
EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason);

378 379 380 381 382 383 384 385 386 387 388 389 390 391
const struct ide_tp_ops default_tp_ops = {
	.exec_command		= ide_exec_command,
	.read_status		= ide_read_status,
	.read_altstatus		= ide_read_altstatus,

	.set_irq		= ide_set_irq,

	.tf_load		= ide_tf_load,
	.tf_read		= ide_tf_read,

	.input_data		= ide_input_data,
	.output_data		= ide_output_data,
};

392
void ide_fix_driveid(u16 *id)
L
Linus Torvalds 已提交
393 394 395 396
{
#ifndef __LITTLE_ENDIAN
# ifdef __BIG_ENDIAN
	int i;
397

398
	for (i = 0; i < 256; i++)
399
		id[i] = __le16_to_cpu(id[i]);
L
Linus Torvalds 已提交
400 401 402 403 404 405
# else
#  error "Please fix <asm/byteorder.h>"
# endif
#endif
}

406 407 408 409
/*
 * ide_fixstring() cleans up and (optionally) byte-swaps a text string,
 * removing leading/trailing blanks and compressing internal blanks.
 * It is primarily used to tidy up the model name/number fields as
410
 * returned by the ATA_CMD_ID_ATA[PI] commands.
411 412
 */

L
Linus Torvalds 已提交
413 414
void ide_fixstring (u8 *s, const int bytecount, const int byteswap)
{
415
	u8 *p, *end = &s[bytecount & ~1]; /* bytecount must be even */
L
Linus Torvalds 已提交
416 417 418

	if (byteswap) {
		/* convert from big-endian to host byte order */
419 420
		for (p = s ; p != end ; p += 2)
			be16_to_cpus((u16 *) p);
L
Linus Torvalds 已提交
421
	}
422

L
Linus Torvalds 已提交
423
	/* strip leading blanks */
424
	p = s;
L
Linus Torvalds 已提交
425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443
	while (s != end && *s == ' ')
		++s;
	/* compress internal blanks and strip trailing blanks */
	while (s != end && *s) {
		if (*s++ != ' ' || (s != end && *s && *s != ' '))
			*p++ = *(s-1);
	}
	/* wipe out trailing garbage */
	while (p != end)
		*p++ = '\0';
}

EXPORT_SYMBOL(ide_fixstring);

/*
 * Needed for PCI irq sharing
 */
int drive_is_ready (ide_drive_t *drive)
{
444
	ide_hwif_t *hwif	= drive->hwif;
L
Linus Torvalds 已提交
445 446 447
	u8 stat			= 0;

	if (drive->waiting_for_dma)
448
		return hwif->dma_ops->dma_test_irq(drive);
L
Linus Torvalds 已提交
449 450 451 452 453 454 455

	/*
	 * We do a passive status test under shared PCI interrupts on
	 * cards that truly share the ATA side interrupt, but may also share
	 * an interrupt with another pci card/device.  We make no assumptions
	 * about possible isa-pnp and pci-pnp issues yet.
	 */
456 457
	if (hwif->io_ports.ctl_addr &&
	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0)
458
		stat = hwif->tp_ops->read_altstatus(hwif);
L
Linus Torvalds 已提交
459 460
	else
		/* Note: this may clear a pending IRQ!! */
461
		stat = hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
462

463
	if (stat & ATA_BUSY)
L
Linus Torvalds 已提交
464 465 466 467 468 469 470 471 472 473 474 475 476
		/* drive busy:  definitely not interrupting */
		return 0;

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

EXPORT_SYMBOL(drive_is_ready);

/*
 * This routine busy-waits for the drive status to be not "busy".
 * It then checks the status for all of the "good" bits and none
 * of the "bad" bits, and if all is okay it returns 0.  All other
477
 * cases return error -- caller may then invoke ide_error().
L
Linus Torvalds 已提交
478 479 480 481 482 483
 *
 * This routine should get fixed to not hog the cpu during extra long waits..
 * That could be done by busy-waiting for the first jiffy or two, and then
 * setting a timer to wake up at half second intervals thereafter,
 * until timeout is achieved, before timing out.
 */
484
static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat)
L
Linus Torvalds 已提交
485
{
486
	ide_hwif_t *hwif = drive->hwif;
487
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
L
Linus Torvalds 已提交
488
	unsigned long flags;
489 490
	int i;
	u8 stat;
L
Linus Torvalds 已提交
491 492

	udelay(1);	/* spec allows drive 400ns to assert "BUSY" */
493
	stat = tp_ops->read_status(hwif);
494

495
	if (stat & ATA_BUSY) {
496
		local_save_flags(flags);
497
		local_irq_enable_in_hardirq();
L
Linus Torvalds 已提交
498
		timeout += jiffies;
499
		while ((stat = tp_ops->read_status(hwif)) & ATA_BUSY) {
L
Linus Torvalds 已提交
500 501 502 503 504 505
			if (time_after(jiffies, timeout)) {
				/*
				 * One last read after the timeout in case
				 * heavy interrupt load made us not make any
				 * progress during the timeout..
				 */
506
				stat = tp_ops->read_status(hwif);
507
				if ((stat & ATA_BUSY) == 0)
L
Linus Torvalds 已提交
508 509 510
					break;

				local_irq_restore(flags);
511 512
				*rstat = stat;
				return -EBUSY;
L
Linus Torvalds 已提交
513 514 515 516 517 518 519 520 521 522 523 524 525
			}
		}
		local_irq_restore(flags);
	}
	/*
	 * Allow status to settle, then read it again.
	 * A few rare drives vastly violate the 400ns spec here,
	 * so we'll wait up to 10usec for a "good" status
	 * rather than expensively fail things immediately.
	 * This fix courtesy of Matthew Faupel & Niccolo Rigacci.
	 */
	for (i = 0; i < 10; i++) {
		udelay(1);
526
		stat = tp_ops->read_status(hwif);
527 528

		if (OK_STAT(stat, good, bad)) {
529
			*rstat = stat;
L
Linus Torvalds 已提交
530
			return 0;
531
		}
L
Linus Torvalds 已提交
532
	}
533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560
	*rstat = stat;
	return -EFAULT;
}

/*
 * In case of error returns error value after doing "*startstop = ide_error()".
 * The caller should return the updated value of "startstop" in this case,
 * "startstop" is unchanged when the function returns 0.
 */
int ide_wait_stat(ide_startstop_t *startstop, ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout)
{
	int err;
	u8 stat;

	/* bail early if we've exceeded max_failures */
	if (drive->max_failures && (drive->failures > drive->max_failures)) {
		*startstop = ide_stopped;
		return 1;
	}

	err = __ide_wait_stat(drive, good, bad, timeout, &stat);

	if (err) {
		char *s = (err == -EBUSY) ? "status timeout" : "status error";
		*startstop = ide_error(drive, s, stat);
	}

	return err;
L
Linus Torvalds 已提交
561 562 563 564
}

EXPORT_SYMBOL(ide_wait_stat);

565 566 567
/**
 *	ide_in_drive_list	-	look for drive in black/white list
 *	@id: drive identifier
568
 *	@table: list to inspect
569 570 571 572 573
 *
 *	Look for a drive in the blacklist and the whitelist tables
 *	Returns 1 if the drive is found in the table.
 */

574
int ide_in_drive_list(u16 *id, const struct drive_list_entry *table)
575
{
576 577 578 579
	for ( ; table->id_model; table++)
		if ((!strcmp(table->id_model, (char *)&id[ATA_ID_PROD])) &&
		    (!table->id_firmware ||
		     strstr((char *)&id[ATA_ID_FW_REV], table->id_firmware)))
580 581 582 583
			return 1;
	return 0;
}

584 585
EXPORT_SYMBOL_GPL(ide_in_drive_list);

586 587 588
/*
 * Early UDMA66 devices don't set bit14 to 1, only bit13 is valid.
 * We list them here and depend on the device side cable detection for them.
589 590
 *
 * Some optical devices with the buggy firmwares have the same problem.
591 592 593
 */
static const struct drive_list_entry ivb_list[] = {
	{ "QUANTUM FIREBALLlct10 05"	, "A03.0900"	},
594
	{ "TSSTcorp CDDVDW SH-S202J"	, "SB00"	},
595 596 597
	{ "TSSTcorp CDDVDW SH-S202J"	, "SB01"	},
	{ "TSSTcorp CDDVDW SH-S202N"	, "SB00"	},
	{ "TSSTcorp CDDVDW SH-S202N"	, "SB01"	},
598 599
	{ "TSSTcorp CDDVDW SH-S202H"	, "SB00"	},
	{ "TSSTcorp CDDVDW SH-S202H"	, "SB01"	},
600
	{ "SAMSUNG SP0822N"		, "WA100-10"	},
601 602 603
	{ NULL				, NULL		}
};

L
Linus Torvalds 已提交
604 605 606 607 608 609
/*
 *  All hosts that use the 80c ribbon must use!
 *  The name is derived from upper byte of word 93 and the 80c ribbon.
 */
u8 eighty_ninty_three (ide_drive_t *drive)
{
610
	ide_hwif_t *hwif = drive->hwif;
611
	u16 *id = drive->id;
612
	int ivb = ide_in_drive_list(id, ivb_list);
613

614 615 616
	if (hwif->cbl == ATA_CBL_PATA40_SHORT)
		return 1;

617 618 619 620
	if (ivb)
		printk(KERN_DEBUG "%s: skipping word 93 validity check\n",
				  drive->name);

621
	if (ata_id_is_sata(id) && !ivb)
622 623
		return 1;

624
	if (hwif->cbl != ATA_CBL_PATA80 && !ivb)
625
		goto no_80w;
626

627 628
	/*
	 * FIXME:
629
	 * - change master/slave IDENTIFY order
630
	 * - force bit13 (80c cable present) check also for !ivb devices
631 632
	 *   (unless the slave device is pre-ATA3)
	 */
633 634
	if ((id[ATA_ID_HW_CONFIG] & 0x4000) ||
	    (ivb && (id[ATA_ID_HW_CONFIG] & 0x2000)))
635 636 637
		return 1;

no_80w:
B
Bartlomiej Zolnierkiewicz 已提交
638
	if (drive->dev_flags & IDE_DFLAG_UDMA33_WARNED)
639 640 641 642
		return 0;

	printk(KERN_WARNING "%s: %s side 80-wire cable detection failed, "
			    "limiting max speed to UDMA33\n",
643 644
			    drive->name,
			    hwif->cbl == ATA_CBL_PATA80 ? "drive" : "host");
645

B
Bartlomiej Zolnierkiewicz 已提交
646
	drive->dev_flags |= IDE_DFLAG_UDMA33_WARNED;
647 648

	return 0;
L
Linus Torvalds 已提交
649 650
}

651
int ide_driveid_update(ide_drive_t *drive)
L
Linus Torvalds 已提交
652
{
653
	ide_hwif_t *hwif = drive->hwif;
654
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
655
	u16 *id;
656
	unsigned long flags;
657
	u8 stat;
L
Linus Torvalds 已提交
658 659 660 661 662 663 664

	/*
	 * Re-read drive->id for possible DMA mode
	 * change (copied from ide-probe.c)
	 */

	SELECT_MASK(drive, 1);
665
	tp_ops->set_irq(hwif, 0);
L
Linus Torvalds 已提交
666
	msleep(50);
667
	tp_ops->exec_command(hwif, ATA_CMD_ID_ATA);
668

669 670 671 672
	if (ide_busy_sleep(hwif, WAIT_WORSTCASE, 1)) {
		SELECT_MASK(drive, 0);
		return 0;
	}
673

674
	msleep(50);	/* wait for IRQ and ATA_DRQ */
675
	stat = tp_ops->read_status(hwif);
676

677
	if (!OK_STAT(stat, ATA_DRQ, BAD_R_STAT)) {
L
Linus Torvalds 已提交
678 679 680 681 682 683
		SELECT_MASK(drive, 0);
		printk("%s: CHECK for good STATUS\n", drive->name);
		return 0;
	}
	local_irq_save(flags);
	SELECT_MASK(drive, 0);
684
	id = kmalloc(SECTOR_SIZE, GFP_ATOMIC);
L
Linus Torvalds 已提交
685 686 687 688
	if (!id) {
		local_irq_restore(flags);
		return 0;
	}
689 690
	tp_ops->input_data(drive, NULL, id, SECTOR_SIZE);
	(void)tp_ops->read_status(hwif);	/* clear drive IRQ */
L
Linus Torvalds 已提交
691 692 693
	local_irq_enable();
	local_irq_restore(flags);
	ide_fix_driveid(id);
694 695 696 697 698 699 700 701

	drive->id[ATA_ID_UDMA_MODES]  = id[ATA_ID_UDMA_MODES];
	drive->id[ATA_ID_MWDMA_MODES] = id[ATA_ID_MWDMA_MODES];
	drive->id[ATA_ID_SWDMA_MODES] = id[ATA_ID_SWDMA_MODES];
	/* anything more ? */

	kfree(id);

B
Bartlomiej Zolnierkiewicz 已提交
702
	if ((drive->dev_flags & IDE_DFLAG_USING_DMA) && ide_id_dma_bug(drive))
703
		ide_dma_off(drive);
L
Linus Torvalds 已提交
704 705 706 707

	return 1;
}

708
int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
L
Linus Torvalds 已提交
709
{
710
	ide_hwif_t *hwif = drive->hwif;
711
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
712
	u16 *id = drive->id, i;
713
	int error = 0;
L
Linus Torvalds 已提交
714
	u8 stat;
715
	ide_task_t task;
L
Linus Torvalds 已提交
716 717

#ifdef CONFIG_BLK_DEV_IDEDMA
718 719
	if (hwif->dma_ops)	/* check if host supports DMA */
		hwif->dma_ops->dma_host_set(drive, 0);
L
Linus Torvalds 已提交
720 721
#endif

722
	/* Skip setting PIO flow-control modes on pre-EIDE drives */
723
	if ((speed & 0xf8) == XFER_PIO_0 && ata_id_has_iordy(drive->id) == 0)
724 725
		goto skip;

L
Linus Torvalds 已提交
726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745
	/*
	 * Don't use ide_wait_cmd here - it will
	 * attempt to set_geometry and recalibrate,
	 * but for some reason these don't work at
	 * this point (lost interrupt).
	 */
        /*
         * Select the drive, and issue the SETFEATURES command
         */
	disable_irq_nosync(hwif->irq);
	
	/*
	 *	FIXME: we race against the running IRQ here if
	 *	this is called from non IRQ context. If we use
	 *	disable_irq() we hang on the error path. Work
	 *	is needed.
	 */
	 
	udelay(1);
	SELECT_DRIVE(drive);
746
	SELECT_MASK(drive, 1);
L
Linus Torvalds 已提交
747
	udelay(1);
748
	tp_ops->set_irq(hwif, 0);
749 750 751 752 753 754

	memset(&task, 0, sizeof(task));
	task.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT;
	task.tf.feature = SETFEATURES_XFER;
	task.tf.nsect   = speed;

755
	tp_ops->tf_load(drive, &task);
756

757
	tp_ops->exec_command(hwif, ATA_CMD_SET_FEATURES);
758

759
	if (drive->quirk_list == 2)
760
		tp_ops->set_irq(hwif, 1);
L
Linus Torvalds 已提交
761

762
	error = __ide_wait_stat(drive, drive->ready_stat,
763
				ATA_BUSY | ATA_DRQ | ATA_ERR,
764
				WAIT_CMD, &stat);
L
Linus Torvalds 已提交
765 766 767 768 769 770 771 772 773 774

	SELECT_MASK(drive, 0);

	enable_irq(hwif->irq);

	if (error) {
		(void) ide_dump_status(drive, "set_drive_speed_status", stat);
		return error;
	}

775 776 777
	id[ATA_ID_UDMA_MODES]  &= ~0xFF00;
	id[ATA_ID_MWDMA_MODES] &= ~0x0F00;
	id[ATA_ID_SWDMA_MODES] &= ~0x0F00;
L
Linus Torvalds 已提交
778

779
 skip:
L
Linus Torvalds 已提交
780
#ifdef CONFIG_BLK_DEV_IDEDMA
B
Bartlomiej Zolnierkiewicz 已提交
781
	if (speed >= XFER_SW_DMA_0 && (drive->dev_flags & IDE_DFLAG_USING_DMA))
782 783
		hwif->dma_ops->dma_host_set(drive, 1);
	else if (hwif->dma_ops)	/* check if host supports DMA */
784
		ide_dma_off_quietly(drive);
L
Linus Torvalds 已提交
785 786
#endif

787 788 789 790 791 792 793 794 795
	if (speed >= XFER_UDMA_0) {
		i = 1 << (speed - XFER_UDMA_0);
		id[ATA_ID_UDMA_MODES] |= (i << 8 | i);
	} else if (speed >= XFER_MW_DMA_0) {
		i = 1 << (speed - XFER_MW_DMA_0);
		id[ATA_ID_MWDMA_MODES] |= (i << 8 | i);
	} else if (speed >= XFER_SW_DMA_0) {
		i = 1 << (speed - XFER_SW_DMA_0);
		id[ATA_ID_SWDMA_MODES] |= (i << 8 | i);
L
Linus Torvalds 已提交
796
	}
797

L
Linus Torvalds 已提交
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815
	if (!drive->init_speed)
		drive->init_speed = speed;
	drive->current_speed = speed;
	return error;
}

/*
 * This should get invoked any time we exit the driver to
 * wait for an interrupt response from a drive.  handler() points
 * at the appropriate code to handle the next interrupt, and a
 * timer is started to prevent us from waiting forever in case
 * something goes wrong (see the ide_timer_expiry() handler later on).
 *
 * See also ide_execute_command
 */
static void __ide_set_handler (ide_drive_t *drive, ide_handler_t *handler,
		      unsigned int timeout, ide_expiry_t *expiry)
{
816 817 818 819 820 821 822 823
	ide_hwif_t *hwif = drive->hwif;

	BUG_ON(hwif->handler);
	hwif->handler		= handler;
	hwif->expiry		= expiry;
	hwif->timer.expires	= jiffies + timeout;
	hwif->req_gen_timer	= hwif->req_gen;
	add_timer(&hwif->timer);
L
Linus Torvalds 已提交
824 825 826 827 828
}

void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler,
		      unsigned int timeout, ide_expiry_t *expiry)
{
829
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
830
	unsigned long flags;
831

832
	spin_lock_irqsave(&hwif->lock, flags);
L
Linus Torvalds 已提交
833
	__ide_set_handler(drive, handler, timeout, expiry);
834
	spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851
}

EXPORT_SYMBOL(ide_set_handler);
 
/**
 *	ide_execute_command	-	execute an IDE command
 *	@drive: IDE drive to issue the command against
 *	@command: command byte to write
 *	@handler: handler for next phase
 *	@timeout: timeout for command
 *	@expiry:  handler to run on timeout
 *
 *	Helper function to issue an IDE command. This handles the
 *	atomicity requirements, command timing and ensures that the 
 *	handler and IRQ setup do not race. All IDE command kick off
 *	should go via this function or do equivalent locking.
 */
852 853 854

void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler,
			 unsigned timeout, ide_expiry_t *expiry)
L
Linus Torvalds 已提交
855
{
856
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
857
	unsigned long flags;
858

859
	spin_lock_irqsave(&hwif->lock, flags);
860
	__ide_set_handler(drive, handler, timeout, expiry);
861
	hwif->tp_ops->exec_command(hwif, cmd);
862 863 864 865 866 867
	/*
	 * Drive takes 400nS to respond, we must avoid the IRQ being
	 * serviced before that.
	 *
	 * FIXME: we could skip this delay with care on non shared devices
	 */
L
Linus Torvalds 已提交
868
	ndelay(400);
869
	spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
870 871 872
}
EXPORT_SYMBOL(ide_execute_command);

873 874 875 876 877
void ide_execute_pkt_cmd(ide_drive_t *drive)
{
	ide_hwif_t *hwif = drive->hwif;
	unsigned long flags;

878
	spin_lock_irqsave(&hwif->lock, flags);
879
	hwif->tp_ops->exec_command(hwif, ATA_CMD_PACKET);
880
	ndelay(400);
881
	spin_unlock_irqrestore(&hwif->lock, flags);
882 883
}
EXPORT_SYMBOL_GPL(ide_execute_pkt_cmd);
L
Linus Torvalds 已提交
884

885
static inline void ide_complete_drive_reset(ide_drive_t *drive, int err)
886
{
887
	struct request *rq = drive->hwif->rq;
888 889

	if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET)
890
		ide_end_request(drive, err ? err : 1, 0);
891 892
}

L
Linus Torvalds 已提交
893 894 895 896 897 898 899 900 901 902 903
/* needed below */
static ide_startstop_t do_reset1 (ide_drive_t *, int);

/*
 * atapi_reset_pollfunc() gets invoked to poll the interface for completion every 50ms
 * during an atapi drive reset operation. If the drive has not yet responded,
 * and we have not yet hit our maximum waiting time, then the timer is restarted
 * for another 50ms.
 */
static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive)
{
904
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
905 906 907 908
	u8 stat;

	SELECT_DRIVE(drive);
	udelay (10);
909
	stat = hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
910

911
	if (OK_STAT(stat, 0, ATA_BUSY))
L
Linus Torvalds 已提交
912
		printk("%s: ATAPI reset complete\n", drive->name);
913
	else {
914
		if (time_before(jiffies, hwif->poll_timeout)) {
L
Linus Torvalds 已提交
915 916 917 918 919
			ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL);
			/* continue polling */
			return ide_started;
		}
		/* end of polling */
920
		hwif->polling = 0;
L
Linus Torvalds 已提交
921 922 923 924 925 926
		printk("%s: ATAPI reset timed-out, status=0x%02x\n",
				drive->name, stat);
		/* do it the old fashioned way */
		return do_reset1(drive, 1);
	}
	/* done polling */
927
	hwif->polling = 0;
928
	ide_complete_drive_reset(drive, 0);
L
Linus Torvalds 已提交
929 930 931
	return ide_stopped;
}

932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950
static void ide_reset_report_error(ide_hwif_t *hwif, u8 err)
{
	static const char *err_master_vals[] =
		{ NULL, "passed", "formatter device error",
		  "sector buffer error", "ECC circuitry error",
		  "controlling MPU error" };

	u8 err_master = err & 0x7f;

	printk(KERN_ERR "%s: reset: master: ", hwif->name);
	if (err_master && err_master < 6)
		printk(KERN_CONT "%s", err_master_vals[err_master]);
	else
		printk(KERN_CONT "error (0x%02x?)", err);
	if (err & 0x80)
		printk(KERN_CONT "; slave: failed");
	printk(KERN_CONT "\n");
}

L
Linus Torvalds 已提交
951 952 953 954 955 956 957 958
/*
 * reset_pollfunc() gets invoked to poll the interface for completion every 50ms
 * during an ide reset operation. If the drives have not yet responded,
 * and we have not yet hit our maximum waiting time, then the timer is restarted
 * for another 50ms.
 */
static ide_startstop_t reset_pollfunc (ide_drive_t *drive)
{
959
	ide_hwif_t *hwif = drive->hwif;
960
	const struct ide_port_ops *port_ops = hwif->port_ops;
L
Linus Torvalds 已提交
961
	u8 tmp;
962
	int err = 0;
L
Linus Torvalds 已提交
963

964
	if (port_ops && port_ops->reset_poll) {
965 966
		err = port_ops->reset_poll(drive);
		if (err) {
L
Linus Torvalds 已提交
967 968
			printk(KERN_ERR "%s: host reset_poll failure for %s.\n",
				hwif->name, drive->name);
969
			goto out;
L
Linus Torvalds 已提交
970 971 972
		}
	}

973
	tmp = hwif->tp_ops->read_status(hwif);
974

975
	if (!OK_STAT(tmp, 0, ATA_BUSY)) {
976
		if (time_before(jiffies, hwif->poll_timeout)) {
L
Linus Torvalds 已提交
977 978 979 980 981 982
			ide_set_handler(drive, &reset_pollfunc, HZ/20, NULL);
			/* continue polling */
			return ide_started;
		}
		printk("%s: reset timed-out, status=0x%02x\n", hwif->name, tmp);
		drive->failures++;
983
		err = -EIO;
L
Linus Torvalds 已提交
984
	} else  {
985 986 987
		tmp = ide_read_error(drive);

		if (tmp == 1) {
988
			printk(KERN_INFO "%s: reset: success\n", hwif->name);
L
Linus Torvalds 已提交
989 990
			drive->failures = 0;
		} else {
991
			ide_reset_report_error(hwif, tmp);
L
Linus Torvalds 已提交
992
			drive->failures++;
993
			err = -EIO;
L
Linus Torvalds 已提交
994 995
		}
	}
996
out:
997
	hwif->polling = 0;	/* done polling */
998
	ide_complete_drive_reset(drive, err);
L
Linus Torvalds 已提交
999 1000 1001 1002 1003
	return ide_stopped;
}

static void ide_disk_pre_reset(ide_drive_t *drive)
{
1004
	int legacy = (drive->id[ATA_ID_CFS_ENABLE_2] & 0x0400) ? 0 : 1;
L
Linus Torvalds 已提交
1005 1006 1007 1008

	drive->special.all = 0;
	drive->special.b.set_geometry = legacy;
	drive->special.b.recalibrate  = legacy;
B
Bartlomiej Zolnierkiewicz 已提交
1009

1010
	drive->mult_count = 0;
1011
	drive->dev_flags &= ~IDE_DFLAG_PARKED;
B
Bartlomiej Zolnierkiewicz 已提交
1012 1013 1014

	if ((drive->dev_flags & IDE_DFLAG_KEEP_SETTINGS) == 0 &&
	    (drive->dev_flags & IDE_DFLAG_USING_DMA) == 0)
L
Linus Torvalds 已提交
1015
		drive->mult_req = 0;
B
Bartlomiej Zolnierkiewicz 已提交
1016

L
Linus Torvalds 已提交
1017 1018 1019 1020 1021 1022
	if (drive->mult_req != drive->mult_count)
		drive->special.b.set_multmode = 1;
}

static void pre_reset(ide_drive_t *drive)
{
1023 1024
	const struct ide_port_ops *port_ops = drive->hwif->port_ops;

L
Linus Torvalds 已提交
1025 1026 1027
	if (drive->media == ide_disk)
		ide_disk_pre_reset(drive);
	else
B
Bartlomiej Zolnierkiewicz 已提交
1028
		drive->dev_flags |= IDE_DFLAG_POST_RESET;
L
Linus Torvalds 已提交
1029

B
Bartlomiej Zolnierkiewicz 已提交
1030
	if (drive->dev_flags & IDE_DFLAG_USING_DMA) {
1031
		if (drive->crc_count)
1032
			ide_check_dma_crc(drive);
1033 1034 1035 1036
		else
			ide_dma_off(drive);
	}

B
Bartlomiej Zolnierkiewicz 已提交
1037 1038 1039
	if ((drive->dev_flags & IDE_DFLAG_KEEP_SETTINGS) == 0) {
		if ((drive->dev_flags & IDE_DFLAG_USING_DMA) == 0) {
			drive->dev_flags &= ~IDE_DFLAG_UNMASK;
L
Linus Torvalds 已提交
1040 1041 1042 1043 1044
			drive->io_32bit = 0;
		}
		return;
	}

1045 1046
	if (port_ops && port_ops->pre_reset)
		port_ops->pre_reset(drive);
L
Linus Torvalds 已提交
1047

1048 1049 1050
	if (drive->current_speed != 0xff)
		drive->desired_speed = drive->current_speed;
	drive->current_speed = 0xff;
L
Linus Torvalds 已提交
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
}

/*
 * do_reset1() attempts to recover a confused drive by resetting it.
 * Unfortunately, resetting a disk drive actually resets all devices on
 * the same interface, so it can really be thought of as resetting the
 * interface rather than resetting the drive.
 *
 * ATAPI devices have their own reset mechanism which allows them to be
 * individually reset without clobbering other devices on the same interface.
 *
 * Unfortunately, the IDE interface does not generate an interrupt to let
 * us know when the reset operation has finished, so we must poll for this.
 * Equally poor, though, is the fact that this may a very long time to complete,
 * (up to 30 seconds worstcase).  So, instead of busy-waiting here for it,
 * we set a timer to poll at 50ms intervals.
 */
static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
{
1070 1071 1072
	ide_hwif_t *hwif = drive->hwif;
	struct ide_io_ports *io_ports = &hwif->io_ports;
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
1073
	const struct ide_port_ops *port_ops;
1074
	ide_drive_t *tdrive;
1075
	unsigned long flags, timeout;
1076
	int i;
1077
	DEFINE_WAIT(wait);
1078

1079
	spin_lock_irqsave(&hwif->lock, flags);
1080

L
Linus Torvalds 已提交
1081
	/* We must not reset with running handlers */
1082
	BUG_ON(hwif->handler != NULL);
L
Linus Torvalds 已提交
1083 1084 1085 1086 1087 1088

	/* For an ATAPI device, first try an ATAPI SRST. */
	if (drive->media != ide_disk && !do_not_try_atapi) {
		pre_reset(drive);
		SELECT_DRIVE(drive);
		udelay (20);
1089
		tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
1090
		ndelay(400);
1091 1092
		hwif->poll_timeout = jiffies + WAIT_WORSTCASE;
		hwif->polling = 1;
L
Linus Torvalds 已提交
1093
		__ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL);
1094
		spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
1095 1096 1097
		return ide_started;
	}

1098 1099 1100 1101 1102 1103
	/* We must not disturb devices in the IDE_DFLAG_PARKED state. */
	do {
		unsigned long now;

		prepare_to_wait(&ide_park_wq, &wait, TASK_UNINTERRUPTIBLE);
		timeout = jiffies;
1104
		ide_port_for_each_dev(i, tdrive, hwif) {
1105 1106 1107 1108 1109 1110 1111 1112 1113 1114
			if (tdrive->dev_flags & IDE_DFLAG_PRESENT &&
			    tdrive->dev_flags & IDE_DFLAG_PARKED &&
			    time_after(tdrive->sleep, timeout))
				timeout = tdrive->sleep;
		}

		now = jiffies;
		if (time_before_eq(timeout, now))
			break;

1115
		spin_unlock_irqrestore(&hwif->lock, flags);
1116
		timeout = schedule_timeout_uninterruptible(timeout - now);
1117
		spin_lock_irqsave(&hwif->lock, flags);
1118 1119 1120
	} while (timeout);
	finish_wait(&ide_park_wq, &wait);

L
Linus Torvalds 已提交
1121 1122 1123 1124
	/*
	 * First, reset any device state data we were maintaining
	 * for any of the drives on this interface.
	 */
1125 1126
	ide_port_for_each_dev(i, tdrive, hwif)
		pre_reset(tdrive);
L
Linus Torvalds 已提交
1127

1128
	if (io_ports->ctl_addr == 0) {
1129
		spin_unlock_irqrestore(&hwif->lock, flags);
1130
		ide_complete_drive_reset(drive, -ENXIO);
L
Linus Torvalds 已提交
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140
		return ide_stopped;
	}

	/*
	 * Note that we also set nIEN while resetting the device,
	 * to mask unwanted interrupts from the interface during the reset.
	 * However, due to the design of PC hardware, this will cause an
	 * immediate interrupt due to the edge transition it produces.
	 * This single interrupt gives us a "fast poll" for drives that
	 * recover from reset very quickly, saving us the first 50ms wait time.
1141 1142
	 *
	 * TODO: add ->softreset method and stop abusing ->set_irq
L
Linus Torvalds 已提交
1143 1144
	 */
	/* set SRST and nIEN */
1145
	tp_ops->set_irq(hwif, 4);
L
Linus Torvalds 已提交
1146 1147
	/* more than enough time */
	udelay(10);
1148
	/* clear SRST, leave nIEN (unless device is on the quirk list) */
1149
	tp_ops->set_irq(hwif, drive->quirk_list == 2);
L
Linus Torvalds 已提交
1150 1151
	/* more than enough time */
	udelay(10);
1152 1153
	hwif->poll_timeout = jiffies + WAIT_WORSTCASE;
	hwif->polling = 1;
L
Linus Torvalds 已提交
1154 1155 1156 1157 1158 1159 1160
	__ide_set_handler(drive, &reset_pollfunc, HZ/20, NULL);

	/*
	 * Some weird controller like resetting themselves to a strange
	 * state when the disks are reset this way. At least, the Winbond
	 * 553 documentation says that
	 */
1161 1162 1163
	port_ops = hwif->port_ops;
	if (port_ops && port_ops->resetproc)
		port_ops->resetproc(drive);
L
Linus Torvalds 已提交
1164

1165
	spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181
	return ide_started;
}

/*
 * ide_do_reset() is the entry point to the drive/interface reset code.
 */

ide_startstop_t ide_do_reset (ide_drive_t *drive)
{
	return do_reset1(drive, 0);
}

EXPORT_SYMBOL(ide_do_reset);

/*
 * ide_wait_not_busy() waits for the currently selected device on the hwif
1182
 * to report a non-busy status, see comments in ide_probe_port().
L
Linus Torvalds 已提交
1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193
 */
int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout)
{
	u8 stat = 0;

	while(timeout--) {
		/*
		 * Turn this into a schedule() sleep once I'm sure
		 * about locking issues (2.5 work ?).
		 */
		mdelay(1);
1194
		stat = hwif->tp_ops->read_status(hwif);
1195
		if ((stat & ATA_BUSY) == 0)
L
Linus Torvalds 已提交
1196 1197 1198 1199 1200 1201 1202 1203
			return 0;
		/*
		 * Assume a value of 0xff means nothing is connected to
		 * the interface and it doesn't implement the pull-down
		 * resistor on D7.
		 */
		if (stat == 0xff)
			return -ENODEV;
1204
		touch_softlockup_watchdog();
1205
		touch_nmi_watchdog();
L
Linus Torvalds 已提交
1206 1207 1208
	}
	return -EBUSY;
}