ide-iops.c 31.1 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
	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);

int drive_is_ready (ide_drive_t *drive)
{
443
	ide_hwif_t *hwif	= drive->hwif;
L
Linus Torvalds 已提交
444 445 446
	u8 stat			= 0;

	if (drive->waiting_for_dma)
447
		return hwif->dma_ops->dma_test_irq(drive);
L
Linus Torvalds 已提交
448

449 450
	if (hwif->io_ports.ctl_addr &&
	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0)
451
		stat = hwif->tp_ops->read_altstatus(hwif);
L
Linus Torvalds 已提交
452 453
	else
		/* Note: this may clear a pending IRQ!! */
454
		stat = hwif->tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
455

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

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

488
	if (stat & ATA_BUSY) {
489
		local_save_flags(flags);
490
		local_irq_enable_in_hardirq();
L
Linus Torvalds 已提交
491
		timeout += jiffies;
492
		while ((stat = tp_ops->read_status(hwif)) & ATA_BUSY) {
L
Linus Torvalds 已提交
493 494 495 496 497 498
			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..
				 */
499
				stat = tp_ops->read_status(hwif);
500
				if ((stat & ATA_BUSY) == 0)
L
Linus Torvalds 已提交
501 502 503
					break;

				local_irq_restore(flags);
504 505
				*rstat = stat;
				return -EBUSY;
L
Linus Torvalds 已提交
506 507 508 509 510 511 512 513 514 515 516 517 518
			}
		}
		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);
519
		stat = tp_ops->read_status(hwif);
520 521

		if (OK_STAT(stat, good, bad)) {
522
			*rstat = stat;
L
Linus Torvalds 已提交
523
			return 0;
524
		}
L
Linus Torvalds 已提交
525
	}
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553
	*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 已提交
554 555 556 557
}

EXPORT_SYMBOL(ide_wait_stat);

558 559 560
/**
 *	ide_in_drive_list	-	look for drive in black/white list
 *	@id: drive identifier
561
 *	@table: list to inspect
562 563 564 565 566
 *
 *	Look for a drive in the blacklist and the whitelist tables
 *	Returns 1 if the drive is found in the table.
 */

567
int ide_in_drive_list(u16 *id, const struct drive_list_entry *table)
568
{
569 570 571 572
	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)))
573 574 575 576
			return 1;
	return 0;
}

577 578
EXPORT_SYMBOL_GPL(ide_in_drive_list);

579 580 581
/*
 * 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.
582 583
 *
 * Some optical devices with the buggy firmwares have the same problem.
584 585 586
 */
static const struct drive_list_entry ivb_list[] = {
	{ "QUANTUM FIREBALLlct10 05"	, "A03.0900"	},
587
	{ "TSSTcorp CDDVDW SH-S202J"	, "SB00"	},
588 589 590
	{ "TSSTcorp CDDVDW SH-S202J"	, "SB01"	},
	{ "TSSTcorp CDDVDW SH-S202N"	, "SB00"	},
	{ "TSSTcorp CDDVDW SH-S202N"	, "SB01"	},
591 592
	{ "TSSTcorp CDDVDW SH-S202H"	, "SB00"	},
	{ "TSSTcorp CDDVDW SH-S202H"	, "SB01"	},
593
	{ "SAMSUNG SP0822N"		, "WA100-10"	},
594 595 596
	{ NULL				, NULL		}
};

L
Linus Torvalds 已提交
597 598 599 600 601 602
/*
 *  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)
{
603
	ide_hwif_t *hwif = drive->hwif;
604
	u16 *id = drive->id;
605
	int ivb = ide_in_drive_list(id, ivb_list);
606

607 608 609
	if (hwif->cbl == ATA_CBL_PATA40_SHORT)
		return 1;

610 611 612 613
	if (ivb)
		printk(KERN_DEBUG "%s: skipping word 93 validity check\n",
				  drive->name);

614
	if (ata_id_is_sata(id) && !ivb)
615 616
		return 1;

617
	if (hwif->cbl != ATA_CBL_PATA80 && !ivb)
618
		goto no_80w;
619

620 621
	/*
	 * FIXME:
622
	 * - change master/slave IDENTIFY order
623
	 * - force bit13 (80c cable present) check also for !ivb devices
624 625
	 *   (unless the slave device is pre-ATA3)
	 */
626 627
	if ((id[ATA_ID_HW_CONFIG] & 0x4000) ||
	    (ivb && (id[ATA_ID_HW_CONFIG] & 0x2000)))
628 629 630
		return 1;

no_80w:
B
Bartlomiej Zolnierkiewicz 已提交
631
	if (drive->dev_flags & IDE_DFLAG_UDMA33_WARNED)
632 633 634 635
		return 0;

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

B
Bartlomiej Zolnierkiewicz 已提交
639
	drive->dev_flags |= IDE_DFLAG_UDMA33_WARNED;
640 641

	return 0;
L
Linus Torvalds 已提交
642 643
}

644
int ide_driveid_update(ide_drive_t *drive)
L
Linus Torvalds 已提交
645
{
646
	ide_hwif_t *hwif = drive->hwif;
647
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
648
	u16 *id;
649
	unsigned long flags;
650
	u8 stat;
L
Linus Torvalds 已提交
651 652 653 654 655 656 657

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

	SELECT_MASK(drive, 1);
658
	tp_ops->set_irq(hwif, 0);
L
Linus Torvalds 已提交
659
	msleep(50);
660
	tp_ops->exec_command(hwif, ATA_CMD_ID_ATA);
661

662 663 664 665
	if (ide_busy_sleep(hwif, WAIT_WORSTCASE, 1)) {
		SELECT_MASK(drive, 0);
		return 0;
	}
666

667
	msleep(50);	/* wait for IRQ and ATA_DRQ */
668
	stat = tp_ops->read_status(hwif);
669

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

	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 已提交
695
	if ((drive->dev_flags & IDE_DFLAG_USING_DMA) && ide_id_dma_bug(drive))
696
		ide_dma_off(drive);
L
Linus Torvalds 已提交
697 698 699 700

	return 1;
}

701
int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
L
Linus Torvalds 已提交
702
{
703
	ide_hwif_t *hwif = drive->hwif;
704
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
705
	u16 *id = drive->id, i;
706
	int error = 0;
L
Linus Torvalds 已提交
707
	u8 stat;
708
	ide_task_t task;
L
Linus Torvalds 已提交
709 710

#ifdef CONFIG_BLK_DEV_IDEDMA
711 712
	if (hwif->dma_ops)	/* check if host supports DMA */
		hwif->dma_ops->dma_host_set(drive, 0);
L
Linus Torvalds 已提交
713 714
#endif

715
	/* Skip setting PIO flow-control modes on pre-EIDE drives */
716
	if ((speed & 0xf8) == XFER_PIO_0 && ata_id_has_iordy(drive->id) == 0)
717 718
		goto skip;

L
Linus Torvalds 已提交
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738
	/*
	 * 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);
739
	SELECT_MASK(drive, 1);
L
Linus Torvalds 已提交
740
	udelay(1);
741
	tp_ops->set_irq(hwif, 0);
742 743 744 745 746 747

	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;

748
	tp_ops->tf_load(drive, &task);
749

750
	tp_ops->exec_command(hwif, ATA_CMD_SET_FEATURES);
751

752
	if (drive->quirk_list == 2)
753
		tp_ops->set_irq(hwif, 1);
L
Linus Torvalds 已提交
754

755
	error = __ide_wait_stat(drive, drive->ready_stat,
756
				ATA_BUSY | ATA_DRQ | ATA_ERR,
757
				WAIT_CMD, &stat);
L
Linus Torvalds 已提交
758 759 760 761 762 763 764 765 766 767

	SELECT_MASK(drive, 0);

	enable_irq(hwif->irq);

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

768 769 770
	id[ATA_ID_UDMA_MODES]  &= ~0xFF00;
	id[ATA_ID_MWDMA_MODES] &= ~0x0F00;
	id[ATA_ID_SWDMA_MODES] &= ~0x0F00;
L
Linus Torvalds 已提交
771

772
 skip:
L
Linus Torvalds 已提交
773
#ifdef CONFIG_BLK_DEV_IDEDMA
B
Bartlomiej Zolnierkiewicz 已提交
774
	if (speed >= XFER_SW_DMA_0 && (drive->dev_flags & IDE_DFLAG_USING_DMA))
775 776
		hwif->dma_ops->dma_host_set(drive, 1);
	else if (hwif->dma_ops)	/* check if host supports DMA */
777
		ide_dma_off_quietly(drive);
L
Linus Torvalds 已提交
778 779
#endif

780 781 782 783 784 785 786 787 788
	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 已提交
789
	}
790

L
Linus Torvalds 已提交
791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808
	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)
{
809 810 811 812 813 814 815 816
	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 已提交
817 818 819 820 821
}

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

825
	spin_lock_irqsave(&hwif->lock, flags);
L
Linus Torvalds 已提交
826
	__ide_set_handler(drive, handler, timeout, expiry);
827
	spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844
}

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.
 */
845 846 847

void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler,
			 unsigned timeout, ide_expiry_t *expiry)
L
Linus Torvalds 已提交
848
{
849
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
850
	unsigned long flags;
851

852
	spin_lock_irqsave(&hwif->lock, flags);
853
	__ide_set_handler(drive, handler, timeout, expiry);
854
	hwif->tp_ops->exec_command(hwif, cmd);
855 856 857 858 859 860
	/*
	 * 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 已提交
861
	ndelay(400);
862
	spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
863 864 865
}
EXPORT_SYMBOL(ide_execute_command);

866 867 868 869 870
void ide_execute_pkt_cmd(ide_drive_t *drive)
{
	ide_hwif_t *hwif = drive->hwif;
	unsigned long flags;

871
	spin_lock_irqsave(&hwif->lock, flags);
872
	hwif->tp_ops->exec_command(hwif, ATA_CMD_PACKET);
873
	ndelay(400);
874
	spin_unlock_irqrestore(&hwif->lock, flags);
875 876
}
EXPORT_SYMBOL_GPL(ide_execute_pkt_cmd);
L
Linus Torvalds 已提交
877

878
static inline void ide_complete_drive_reset(ide_drive_t *drive, int err)
879
{
880
	struct request *rq = drive->hwif->rq;
881 882

	if (rq && blk_special_request(rq) && rq->cmd[0] == REQ_DRIVE_RESET)
883
		ide_end_request(drive, err ? err : 1, 0);
884 885
}

L
Linus Torvalds 已提交
886 887 888 889 890 891 892 893 894 895 896
/* 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)
{
897
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
898 899 900 901
	u8 stat;

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

904
	if (OK_STAT(stat, 0, ATA_BUSY))
L
Linus Torvalds 已提交
905
		printk("%s: ATAPI reset complete\n", drive->name);
906
	else {
907
		if (time_before(jiffies, hwif->poll_timeout)) {
L
Linus Torvalds 已提交
908 909 910 911 912
			ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL);
			/* continue polling */
			return ide_started;
		}
		/* end of polling */
913
		hwif->polling = 0;
L
Linus Torvalds 已提交
914 915 916 917 918 919
		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 */
920
	hwif->polling = 0;
921
	ide_complete_drive_reset(drive, 0);
L
Linus Torvalds 已提交
922 923 924
	return ide_stopped;
}

925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943
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 已提交
944 945 946 947 948 949 950 951
/*
 * 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)
{
952
	ide_hwif_t *hwif = drive->hwif;
953
	const struct ide_port_ops *port_ops = hwif->port_ops;
L
Linus Torvalds 已提交
954
	u8 tmp;
955
	int err = 0;
L
Linus Torvalds 已提交
956

957
	if (port_ops && port_ops->reset_poll) {
958 959
		err = port_ops->reset_poll(drive);
		if (err) {
L
Linus Torvalds 已提交
960 961
			printk(KERN_ERR "%s: host reset_poll failure for %s.\n",
				hwif->name, drive->name);
962
			goto out;
L
Linus Torvalds 已提交
963 964 965
		}
	}

966
	tmp = hwif->tp_ops->read_status(hwif);
967

968
	if (!OK_STAT(tmp, 0, ATA_BUSY)) {
969
		if (time_before(jiffies, hwif->poll_timeout)) {
L
Linus Torvalds 已提交
970 971 972 973 974 975
			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++;
976
		err = -EIO;
L
Linus Torvalds 已提交
977
	} else  {
978 979 980
		tmp = ide_read_error(drive);

		if (tmp == 1) {
981
			printk(KERN_INFO "%s: reset: success\n", hwif->name);
L
Linus Torvalds 已提交
982 983
			drive->failures = 0;
		} else {
984
			ide_reset_report_error(hwif, tmp);
L
Linus Torvalds 已提交
985
			drive->failures++;
986
			err = -EIO;
L
Linus Torvalds 已提交
987 988
		}
	}
989
out:
990
	hwif->polling = 0;	/* done polling */
991
	ide_complete_drive_reset(drive, err);
L
Linus Torvalds 已提交
992 993 994 995 996
	return ide_stopped;
}

static void ide_disk_pre_reset(ide_drive_t *drive)
{
997
	int legacy = (drive->id[ATA_ID_CFS_ENABLE_2] & 0x0400) ? 0 : 1;
L
Linus Torvalds 已提交
998 999 1000 1001

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

1003
	drive->mult_count = 0;
1004
	drive->dev_flags &= ~IDE_DFLAG_PARKED;
B
Bartlomiej Zolnierkiewicz 已提交
1005 1006 1007

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

L
Linus Torvalds 已提交
1010 1011 1012 1013 1014 1015
	if (drive->mult_req != drive->mult_count)
		drive->special.b.set_multmode = 1;
}

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

L
Linus Torvalds 已提交
1018 1019 1020
	if (drive->media == ide_disk)
		ide_disk_pre_reset(drive);
	else
B
Bartlomiej Zolnierkiewicz 已提交
1021
		drive->dev_flags |= IDE_DFLAG_POST_RESET;
L
Linus Torvalds 已提交
1022

B
Bartlomiej Zolnierkiewicz 已提交
1023
	if (drive->dev_flags & IDE_DFLAG_USING_DMA) {
1024
		if (drive->crc_count)
1025
			ide_check_dma_crc(drive);
1026 1027 1028 1029
		else
			ide_dma_off(drive);
	}

B
Bartlomiej Zolnierkiewicz 已提交
1030 1031 1032
	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 已提交
1033 1034 1035 1036 1037
			drive->io_32bit = 0;
		}
		return;
	}

1038 1039
	if (port_ops && port_ops->pre_reset)
		port_ops->pre_reset(drive);
L
Linus Torvalds 已提交
1040

1041 1042 1043
	if (drive->current_speed != 0xff)
		drive->desired_speed = drive->current_speed;
	drive->current_speed = 0xff;
L
Linus Torvalds 已提交
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
}

/*
 * 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)
{
1063 1064 1065
	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;
1066
	const struct ide_port_ops *port_ops;
1067
	ide_drive_t *tdrive;
1068
	unsigned long flags, timeout;
1069
	int i;
1070
	DEFINE_WAIT(wait);
1071

1072
	spin_lock_irqsave(&hwif->lock, flags);
1073

L
Linus Torvalds 已提交
1074
	/* We must not reset with running handlers */
1075
	BUG_ON(hwif->handler != NULL);
L
Linus Torvalds 已提交
1076 1077 1078 1079 1080 1081

	/* 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);
1082
		tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
1083
		ndelay(400);
1084 1085
		hwif->poll_timeout = jiffies + WAIT_WORSTCASE;
		hwif->polling = 1;
L
Linus Torvalds 已提交
1086
		__ide_set_handler(drive, &atapi_reset_pollfunc, HZ/20, NULL);
1087
		spin_unlock_irqrestore(&hwif->lock, flags);
L
Linus Torvalds 已提交
1088 1089 1090
		return ide_started;
	}

1091 1092 1093 1094 1095 1096
	/* 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;
1097 1098
		ide_port_for_each_present_dev(i, tdrive, hwif) {
			if ((tdrive->dev_flags & IDE_DFLAG_PARKED) &&
1099 1100 1101 1102 1103 1104 1105 1106
			    time_after(tdrive->sleep, timeout))
				timeout = tdrive->sleep;
		}

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

1107
		spin_unlock_irqrestore(&hwif->lock, flags);
1108
		timeout = schedule_timeout_uninterruptible(timeout - now);
1109
		spin_lock_irqsave(&hwif->lock, flags);
1110 1111 1112
	} while (timeout);
	finish_wait(&ide_park_wq, &wait);

L
Linus Torvalds 已提交
1113 1114 1115 1116
	/*
	 * First, reset any device state data we were maintaining
	 * for any of the drives on this interface.
	 */
1117 1118
	ide_port_for_each_dev(i, tdrive, hwif)
		pre_reset(tdrive);
L
Linus Torvalds 已提交
1119

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

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