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 319
	len++;

L
Linus Torvalds 已提交
320
	if (io_32bit) {
321
		unsigned long uninitialized_var(flags);
322

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

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

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

336 337 338 339 340 341 342 343 344 345 346 347 348
		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 已提交
349
}
350
EXPORT_SYMBOL_GPL(ide_output_data);
L
Linus Torvalds 已提交
351

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

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

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

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

365 366 367 368 369 370 371 372
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;

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

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

380 381 382 383 384 385 386 387 388 389 390 391 392 393
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,
};

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

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

408 409 410 411
/*
 * 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
412
 * returned by the ATA_CMD_ID_ATA[PI] commands.
413 414
 */

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

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

L
Linus Torvalds 已提交
425
	/* strip leading blanks */
426
	p = s;
L
Linus Torvalds 已提交
427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445
	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)
{
446
	ide_hwif_t *hwif	= drive->hwif;
L
Linus Torvalds 已提交
447 448 449
	u8 stat			= 0;

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

	/*
	 * 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.
	 */
458 459
	if (hwif->io_ports.ctl_addr &&
	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0)
460
		stat = hwif->tp_ops->read_altstatus(hwif);
L
Linus Torvalds 已提交
461 462
	else
		/* Note: this may clear a pending IRQ!! */
463
		stat = hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
464

465
	if (stat & ATA_BUSY)
L
Linus Torvalds 已提交
466 467 468 469 470 471 472 473 474 475 476 477 478
		/* 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
479
 * cases return error -- caller may then invoke ide_error().
L
Linus Torvalds 已提交
480 481 482 483 484 485
 *
 * 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.
 */
486
static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat)
L
Linus Torvalds 已提交
487
{
488
	ide_hwif_t *hwif = drive->hwif;
489
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
L
Linus Torvalds 已提交
490
	unsigned long flags;
491 492
	int i;
	u8 stat;
L
Linus Torvalds 已提交
493 494

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

497
	if (stat & ATA_BUSY) {
498
		local_save_flags(flags);
499
		local_irq_enable_in_hardirq();
L
Linus Torvalds 已提交
500
		timeout += jiffies;
501
		while ((stat = tp_ops->read_status(hwif)) & ATA_BUSY) {
L
Linus Torvalds 已提交
502 503 504 505 506 507
			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..
				 */
508
				stat = tp_ops->read_status(hwif);
509
				if ((stat & ATA_BUSY) == 0)
L
Linus Torvalds 已提交
510 511 512
					break;

				local_irq_restore(flags);
513 514
				*rstat = stat;
				return -EBUSY;
L
Linus Torvalds 已提交
515 516 517 518 519 520 521 522 523 524 525 526 527
			}
		}
		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);
528
		stat = tp_ops->read_status(hwif);
529 530

		if (OK_STAT(stat, good, bad)) {
531
			*rstat = stat;
L
Linus Torvalds 已提交
532
			return 0;
533
		}
L
Linus Torvalds 已提交
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 561 562
	*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 已提交
563 564 565 566
}

EXPORT_SYMBOL(ide_wait_stat);

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

576
int ide_in_drive_list(u16 *id, const struct drive_list_entry *table)
577
{
578 579 580 581
	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)))
582 583 584 585
			return 1;
	return 0;
}

586 587
EXPORT_SYMBOL_GPL(ide_in_drive_list);

588 589 590
/*
 * 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.
591 592
 *
 * Some optical devices with the buggy firmwares have the same problem.
593 594 595
 */
static const struct drive_list_entry ivb_list[] = {
	{ "QUANTUM FIREBALLlct10 05"	, "A03.0900"	},
596
	{ "TSSTcorp CDDVDW SH-S202J"	, "SB00"	},
597 598 599
	{ "TSSTcorp CDDVDW SH-S202J"	, "SB01"	},
	{ "TSSTcorp CDDVDW SH-S202N"	, "SB00"	},
	{ "TSSTcorp CDDVDW SH-S202N"	, "SB01"	},
600 601
	{ "TSSTcorp CDDVDW SH-S202H"	, "SB00"	},
	{ "TSSTcorp CDDVDW SH-S202H"	, "SB01"	},
602
	{ "SAMSUNG SP0822N"		, "WA100-10"	},
603 604 605
	{ NULL				, NULL		}
};

L
Linus Torvalds 已提交
606 607 608 609 610 611
/*
 *  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)
{
612
	ide_hwif_t *hwif = drive->hwif;
613
	u16 *id = drive->id;
614
	int ivb = ide_in_drive_list(id, ivb_list);
615

616 617 618
	if (hwif->cbl == ATA_CBL_PATA40_SHORT)
		return 1;

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

623
	if (ata_id_is_sata(id) && !ivb)
624 625
		return 1;

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

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

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

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

B
Bartlomiej Zolnierkiewicz 已提交
648
	drive->dev_flags |= IDE_DFLAG_UDMA33_WARNED;
649 650

	return 0;
L
Linus Torvalds 已提交
651 652
}

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

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

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

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

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

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

	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 已提交
704
	if ((drive->dev_flags & IDE_DFLAG_USING_DMA) && ide_id_dma_bug(drive))
705
		ide_dma_off(drive);
L
Linus Torvalds 已提交
706 707 708 709

	return 1;
}

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

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

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

L
Linus Torvalds 已提交
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747
	/*
	 * 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);
748
	SELECT_MASK(drive, 1);
L
Linus Torvalds 已提交
749
	udelay(1);
750
	tp_ops->set_irq(hwif, 0);
751 752 753 754 755 756

	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;

757
	tp_ops->tf_load(drive, &task);
758

759
	tp_ops->exec_command(hwif, ATA_CMD_SET_FEATURES);
760

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

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

	SELECT_MASK(drive, 0);

	enable_irq(hwif->irq);

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

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

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

789 790 791 792 793 794 795 796 797
	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 已提交
798
	}
799

L
Linus Torvalds 已提交
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817
	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)
{
818 819 820 821 822 823 824 825
	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 已提交
826 827 828 829 830
}

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

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

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.
 */
854 855 856

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

861
	spin_lock_irqsave(&hwif->lock, flags);
862
	__ide_set_handler(drive, handler, timeout, expiry);
863
	hwif->tp_ops->exec_command(hwif, cmd);
864 865 866 867 868 869
	/*
	 * 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 已提交
870
	ndelay(400);
871
	spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
872 873 874
}
EXPORT_SYMBOL(ide_execute_command);

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

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

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

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

L
Linus Torvalds 已提交
895 896 897 898 899 900 901 902 903 904 905
/* 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)
{
906
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
907 908 909 910
	u8 stat;

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

913
	if (OK_STAT(stat, 0, ATA_BUSY))
L
Linus Torvalds 已提交
914
		printk("%s: ATAPI reset complete\n", drive->name);
915
	else {
916
		if (time_before(jiffies, hwif->poll_timeout)) {
L
Linus Torvalds 已提交
917 918 919 920 921
			ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL);
			/* continue polling */
			return ide_started;
		}
		/* end of polling */
922
		hwif->polling = 0;
L
Linus Torvalds 已提交
923 924 925 926 927 928
		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 */
929
	hwif->polling = 0;
930
	ide_complete_drive_reset(drive, 0);
L
Linus Torvalds 已提交
931 932 933
	return ide_stopped;
}

934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952
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 已提交
953 954 955 956 957 958 959 960
/*
 * 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)
{
961
	ide_hwif_t *hwif = drive->hwif;
962
	const struct ide_port_ops *port_ops = hwif->port_ops;
L
Linus Torvalds 已提交
963
	u8 tmp;
964
	int err = 0;
L
Linus Torvalds 已提交
965

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

975
	tmp = hwif->tp_ops->read_status(hwif);
976

977
	if (!OK_STAT(tmp, 0, ATA_BUSY)) {
978
		if (time_before(jiffies, hwif->poll_timeout)) {
L
Linus Torvalds 已提交
979 980 981 982 983 984
			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++;
985
		err = -EIO;
L
Linus Torvalds 已提交
986
	} else  {
987 988 989
		tmp = ide_read_error(drive);

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

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

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

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

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

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

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

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

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

B
Bartlomiej Zolnierkiewicz 已提交
1039 1040 1041
	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 已提交
1042 1043 1044 1045 1046
			drive->io_32bit = 0;
		}
		return;
	}

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

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

/*
 * 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)
{
1072 1073 1074
	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;
1075
	const struct ide_port_ops *port_ops;
1076
	ide_drive_t *tdrive;
1077
	unsigned long flags, timeout;
1078
	int i;
1079
	DEFINE_WAIT(wait);
1080

1081
	spin_lock_irqsave(&hwif->lock, flags);
1082

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

	/* 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);
1091
		tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
1092
		ndelay(400);
1093 1094
		hwif->poll_timeout = jiffies + WAIT_WORSTCASE;
		hwif->polling = 1;
L
Linus Torvalds 已提交
1095
		__ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL);
1096
		spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
1097 1098 1099
		return ide_started;
	}

1100 1101 1102 1103 1104 1105
	/* 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;
1106
		ide_port_for_each_dev(i, tdrive, hwif) {
1107 1108 1109 1110 1111 1112 1113 1114 1115 1116
			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;

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

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

1130
	if (io_ports->ctl_addr == 0) {
1131
		spin_unlock_irqrestore(&hwif->lock, flags);
1132
		ide_complete_drive_reset(drive, -ENXIO);
L
Linus Torvalds 已提交
1133 1134 1135 1136 1137 1138 1139 1140 1141 1142
		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.
1143 1144
	 *
	 * TODO: add ->softreset method and stop abusing ->set_irq
L
Linus Torvalds 已提交
1145 1146
	 */
	/* set SRST and nIEN */
1147
	tp_ops->set_irq(hwif, 4);
L
Linus Torvalds 已提交
1148 1149
	/* more than enough time */
	udelay(10);
1150
	/* clear SRST, leave nIEN (unless device is on the quirk list) */
1151
	tp_ops->set_irq(hwif, drive->quirk_list == 2);
L
Linus Torvalds 已提交
1152 1153
	/* more than enough time */
	udelay(10);
1154 1155
	hwif->poll_timeout = jiffies + WAIT_WORSTCASE;
	hwif->polling = 1;
L
Linus Torvalds 已提交
1156 1157 1158 1159 1160 1161 1162
	__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
	 */
1163 1164 1165
	port_ops = hwif->port_ops;
	if (port_ops && port_ops->resetproc)
		port_ops->resetproc(drive);
L
Linus Torvalds 已提交
1166

1167
	spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183
	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
1184
 * to report a non-busy status, see comments in ide_probe_port().
L
Linus Torvalds 已提交
1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195
 */
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);
1196
		stat = hwif->tp_ops->read_status(hwif);
1197
		if ((stat & ATA_BUSY) == 0)
L
Linus Torvalds 已提交
1198 1199 1200 1201 1202 1203 1204 1205
			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;
1206
		touch_softlockup_watchdog();
1207
		touch_nmi_watchdog();
L
Linus Torvalds 已提交
1208 1209 1210
	}
	return -EBUSY;
}