ide-probe.c 37.5 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3
 *  Copyright (C) 1994-1998   Linus Torvalds & authors (see below)
 *  Copyright (C) 2005, 2007  Bartlomiej Zolnierkiewicz
L
Linus Torvalds 已提交
4 5 6 7 8 9 10 11 12 13 14
 */

/*
 *  Mostly written by Mark Lord <mlord@pobox.com>
 *                and Gadi Oxman <gadio@netvision.net.il>
 *                and Andre Hedrick <andre@linux-ide.org>
 *
 *  See linux/MAINTAINERS for address of current maintainer.
 *
 * This is the IDE probe module, as evolved from hd.c and ide.c.
 *
15 16
 * -- increase WAIT_PIDENTIFY to avoid CD-ROM locking at boot
 *	 by Andrea Arcangeli
L
Linus Torvalds 已提交
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 */

#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/slab.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/spinlock.h>
#include <linux/kmod.h>
#include <linux/pci.h>
F
FUJITA Tomonori 已提交
35
#include <linux/scatterlist.h>
L
Linus Torvalds 已提交
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52

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

/**
 *	generic_id		-	add a generic drive id
 *	@drive:	drive to make an ID block for
 *	
 *	Add a fake id field to the drive we are passed. This allows
 *	use to skip a ton of NULL checks (which people always miss) 
 *	and make drive properties unconditional outside of this file
 */
 
static void generic_id(ide_drive_t *drive)
{
53 54 55 56 57
	u16 *id = drive->id;

	id[ATA_ID_CUR_CYLS]	= id[ATA_ID_CYLS]	= drive->cyl;
	id[ATA_ID_CUR_HEADS]	= id[ATA_ID_HEADS]	= drive->head;
	id[ATA_ID_CUR_SECTORS]	= id[ATA_ID_SECTORS]	= drive->sect;
L
Linus Torvalds 已提交
58 59 60 61
}

static void ide_disk_init_chs(ide_drive_t *drive)
{
62
	u16 *id = drive->id;
L
Linus Torvalds 已提交
63 64 65

	/* Extract geometry if we did not already have one for the drive */
	if (!drive->cyl || !drive->head || !drive->sect) {
66 67 68
		drive->cyl  = drive->bios_cyl  = id[ATA_ID_CYLS];
		drive->head = drive->bios_head = id[ATA_ID_HEADS];
		drive->sect = drive->bios_sect = id[ATA_ID_SECTORS];
L
Linus Torvalds 已提交
69 70 71
	}

	/* Handle logical geometry translation by the drive */
72
	if (ata_id_current_chs_valid(id)) {
73 74 75
		drive->cyl  = id[ATA_ID_CUR_CYLS];
		drive->head = id[ATA_ID_CUR_HEADS];
		drive->sect = id[ATA_ID_CUR_SECTORS];
L
Linus Torvalds 已提交
76 77 78
	}

	/* Use physical geometry if what we have still makes no sense */
79 80 81 82
	if (drive->head > 16 && id[ATA_ID_HEADS] && id[ATA_ID_HEADS] <= 16) {
		drive->cyl  = id[ATA_ID_CYLS];
		drive->head = id[ATA_ID_HEADS];
		drive->sect = id[ATA_ID_SECTORS];
L
Linus Torvalds 已提交
83 84 85 86 87
	}
}

static void ide_disk_init_mult_count(ide_drive_t *drive)
{
88 89
	u16 *id = drive->id;
	u8 max_multsect = id[ATA_ID_MAX_MULTSECT] & 0xff;
L
Linus Torvalds 已提交
90

91 92 93 94 95 96 97
	if (max_multsect) {
		if ((max_multsect / 2) > 1)
			id[ATA_ID_MULTSECT] = max_multsect | 0x100;
		else
			id[ATA_ID_MULTSECT] &= ~0x1ff;

		drive->mult_req = id[ATA_ID_MULTSECT] & 0xff;
98 99

		if (drive->mult_req)
100
			drive->special_flags |= IDE_SFLAG_SET_MULTMODE;
L
Linus Torvalds 已提交
101 102 103
	}
}

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
static void ide_classify_ata_dev(ide_drive_t *drive)
{
	u16 *id = drive->id;
	char *m = (char *)&id[ATA_ID_PROD];
	int is_cfa = ata_id_is_cfa(id);

	/* CF devices are *not* removable in Linux definition of the term */
	if (is_cfa == 0 && (id[ATA_ID_CONFIG] & (1 << 7)))
		drive->dev_flags |= IDE_DFLAG_REMOVABLE;

	drive->media = ide_disk;

	if (!ata_id_has_unload(drive->id))
		drive->dev_flags |= IDE_DFLAG_NO_UNLOAD;

	printk(KERN_INFO "%s: %s, %s DISK drive\n", drive->name, m,
		is_cfa ? "CFA" : "ATA");
}

static void ide_classify_atapi_dev(ide_drive_t *drive)
{
	u16 *id = drive->id;
	char *m = (char *)&id[ATA_ID_PROD];
	u8 type = (id[ATA_ID_CONFIG] >> 8) & 0x1f;

	printk(KERN_INFO "%s: %s, ATAPI ", drive->name, m);
	switch (type) {
	case ide_floppy:
		if (!strstr(m, "CD-ROM")) {
			if (!strstr(m, "oppy") &&
			    !strstr(m, "poyp") &&
			    !strstr(m, "ZIP"))
				printk(KERN_CONT "cdrom or floppy?, assuming ");
			if (drive->media != ide_cdrom) {
				printk(KERN_CONT "FLOPPY");
				drive->dev_flags |= IDE_DFLAG_REMOVABLE;
				break;
			}
		}
		/* Early cdrom models used zero */
		type = ide_cdrom;
	case ide_cdrom:
		drive->dev_flags |= IDE_DFLAG_REMOVABLE;
#ifdef CONFIG_PPC
		/* kludge for Apple PowerBook internal zip */
		if (!strstr(m, "CD-ROM") && strstr(m, "ZIP")) {
			printk(KERN_CONT "FLOPPY");
			type = ide_floppy;
			break;
		}
#endif
		printk(KERN_CONT "CD/DVD-ROM");
		break;
	case ide_tape:
		printk(KERN_CONT "TAPE");
		break;
	case ide_optical:
		printk(KERN_CONT "OPTICAL");
		drive->dev_flags |= IDE_DFLAG_REMOVABLE;
		break;
	default:
		printk(KERN_CONT "UNKNOWN (type %d)", type);
		break;
	}

	printk(KERN_CONT " drive\n");
	drive->media = type;
	/* an ATAPI device ignores DRDY */
	drive->ready_stat = 0;
	if (ata_id_cdb_intr(id))
		drive->atapi_flags |= IDE_AFLAG_DRQ_INTERRUPT;
	drive->dev_flags |= IDE_DFLAG_DOORLOCKING;
	/* we don't do head unloading on ATAPI devices */
	drive->dev_flags |= IDE_DFLAG_NO_UNLOAD;
}

L
Linus Torvalds 已提交
180 181 182 183
/**
 *	do_identify	-	identify a drive
 *	@drive: drive to identify 
 *	@cmd: command used
184
 *	@id: buffer for IDENTIFY data
L
Linus Torvalds 已提交
185 186 187 188 189
 *
 *	Called when we have issued a drive identify command to
 *	read and parse the results. This function is run with
 *	interrupts disabled. 
 */
190

191
static void do_identify(ide_drive_t *drive, u8 cmd, u16 *id)
L
Linus Torvalds 已提交
192
{
193
	ide_hwif_t *hwif = drive->hwif;
194
	char *m = (char *)&id[ATA_ID_PROD];
195
	unsigned long flags;
196
	int bswap = 1;
L
Linus Torvalds 已提交
197

198 199
	/* local CPU only; some systems need this */
	local_irq_save(flags);
L
Linus Torvalds 已提交
200
	/* read 512 bytes of id info */
201
	hwif->tp_ops->input_data(drive, NULL, id, SECTOR_SIZE);
202
	local_irq_restore(flags);
L
Linus Torvalds 已提交
203

B
Bartlomiej Zolnierkiewicz 已提交
204
	drive->dev_flags |= IDE_DFLAG_ID_READ;
205 206 207 208
#ifdef DEBUG
	printk(KERN_INFO "%s: dumping identify data\n", drive->name);
	ide_dump_identify((u8 *)id);
#endif
L
Linus Torvalds 已提交
209 210 211
	ide_fix_driveid(id);

	/*
212 213
	 *  ATA_CMD_ID_ATA returns little-endian info,
	 *  ATA_CMD_ID_ATAPI *usually* returns little-endian info.
L
Linus Torvalds 已提交
214
	 */
215
	if (cmd == ATA_CMD_ID_ATAPI) {
216 217 218
		if ((m[0] == 'N' && m[1] == 'E') ||  /* NEC */
		    (m[0] == 'F' && m[1] == 'X') ||  /* Mitsumi */
		    (m[0] == 'P' && m[1] == 'i'))    /* Pioneer */
L
Linus Torvalds 已提交
219
			/* Vertos drives may still be weird */
220
			bswap ^= 1;
L
Linus Torvalds 已提交
221
	}
222 223 224 225

	ide_fixstring(m, ATA_ID_PROD_LEN, bswap);
	ide_fixstring((char *)&id[ATA_ID_FW_REV], ATA_ID_FW_REV_LEN, bswap);
	ide_fixstring((char *)&id[ATA_ID_SERNO], ATA_ID_SERNO_LEN, bswap);
L
Linus Torvalds 已提交
226

227
	/* we depend on this a lot! */
228
	m[ATA_ID_PROD_LEN - 1] = '\0';
229

230
	if (strstr(m, "E X A B Y T E N E S T"))
231 232 233
		drive->dev_flags &= ~IDE_DFLAG_PRESENT;
	else
		drive->dev_flags |= IDE_DFLAG_PRESENT;
L
Linus Torvalds 已提交
234 235 236
}

/**
237
 *	ide_dev_read_id	-	send ATA/ATAPI IDENTIFY command
L
Linus Torvalds 已提交
238 239
 *	@drive: drive to identify
 *	@cmd: command to use
240
 *	@id: buffer for IDENTIFY data
241
 *	@irq_ctx: flag set when called from the IRQ context
L
Linus Torvalds 已提交
242
 *
243
 *	Sends an ATA(PI) IDENTIFY request to a drive and waits for a response.
L
Linus Torvalds 已提交
244 245 246 247 248 249
 *
 *	Returns:	0  device was identified
 *			1  device timed-out (no response to identify request)
 *			2  device aborted the command (refused to identify itself)
 */

250
int ide_dev_read_id(ide_drive_t *drive, u8 cmd, u16 *id, int irq_ctx)
L
Linus Torvalds 已提交
251
{
252
	ide_hwif_t *hwif = drive->hwif;
253
	struct ide_io_ports *io_ports = &hwif->io_ports;
254
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
255
	int use_altstatus = 0, rc;
L
Linus Torvalds 已提交
256 257 258
	unsigned long timeout;
	u8 s = 0, a = 0;

259 260 261 262 263
	/*
	 * Disable device IRQ.  Otherwise we'll get spurious interrupts
	 * during the identify phase that the IRQ handler isn't expecting.
	 */
	if (io_ports->ctl_addr)
264
		tp_ops->write_devctl(hwif, ATA_NIEN | ATA_DEVCTL_OBS);
265

L
Linus Torvalds 已提交
266
	/* take a deep breath */
267 268 269 270
	if (irq_ctx)
		mdelay(50);
	else
		msleep(50);
L
Linus Torvalds 已提交
271

272 273
	if (io_ports->ctl_addr &&
	    (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0) {
274 275
		a = tp_ops->read_altstatus(hwif);
		s = tp_ops->read_status(hwif);
276
		if ((a ^ s) & ~ATA_IDX)
L
Linus Torvalds 已提交
277
			/* ancient Seagate drives, broken interfaces */
278 279 280 281
			printk(KERN_INFO "%s: probing with STATUS(0x%02x) "
					 "instead of ALTSTATUS(0x%02x)\n",
					 drive->name, s, a);
		else
L
Linus Torvalds 已提交
282
			/* use non-intrusive polling */
283 284
			use_altstatus = 1;
	}
L
Linus Torvalds 已提交
285 286 287 288

	/* set features register for atapi
	 * identify command to be sure of reply
	 */
289
	if (cmd == ATA_CMD_ID_ATAPI) {
S
Sergei Shtylyov 已提交
290
		struct ide_taskfile tf;
291

S
Sergei Shtylyov 已提交
292
		memset(&tf, 0, sizeof(tf));
293
		/* disable DMA & overlap */
S
Sergei Shtylyov 已提交
294
		tp_ops->tf_load(drive, &tf, IDE_VALID_FEATURE);
295
	}
L
Linus Torvalds 已提交
296 297

	/* ask drive for ID */
298
	tp_ops->exec_command(hwif, cmd);
L
Linus Torvalds 已提交
299

300
	timeout = ((cmd == ATA_CMD_ID_ATA) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2;
301

302
	/* wait for IRQ and ATA_DRQ */
303 304 305 306 307 308 309 310 311 312 313 314
	if (irq_ctx) {
		rc = __ide_wait_stat(drive, ATA_DRQ, BAD_R_STAT, timeout, &s);
		if (rc)
			return 1;
	} else {
		rc = ide_busy_sleep(drive, timeout, use_altstatus);
		if (rc)
			return 1;

		msleep(50);
		s = tp_ops->read_status(hwif);
	}
315

316
	if (OK_STAT(s, ATA_DRQ, BAD_R_STAT)) {
L
Linus Torvalds 已提交
317
		/* drive returned ID */
318
		do_identify(drive, cmd, id);
L
Linus Torvalds 已提交
319 320 321
		/* drive responded with ID */
		rc = 0;
		/* clear drive IRQ */
322
		(void)tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
323 324 325 326 327 328 329
	} else {
		/* drive refused ID */
		rc = 2;
	}
	return rc;
}

330
int ide_busy_sleep(ide_drive_t *drive, unsigned long timeout, int altstatus)
331
{
332
	ide_hwif_t *hwif = drive->hwif;
333 334
	u8 stat;

335 336
	timeout += jiffies;

337
	do {
338 339 340
		msleep(50);	/* give drive a breather */
		stat = altstatus ? hwif->tp_ops->read_altstatus(hwif)
				 : hwif->tp_ops->read_status(hwif);
341
		if ((stat & ATA_BUSY) == 0)
342 343 344
			return 0;
	} while (time_before(jiffies, timeout));

345 346
	printk(KERN_ERR "%s: timeout in %s\n", drive->name, __func__);

347
	return 1;	/* drive timed-out */
348
}
L
Linus Torvalds 已提交
349

350 351
static u8 ide_read_device(ide_drive_t *drive)
{
S
Sergei Shtylyov 已提交
352
	struct ide_taskfile tf;
353

S
Sergei Shtylyov 已提交
354
	drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_DEVICE);
355

S
Sergei Shtylyov 已提交
356
	return tf.device;
357 358
}

L
Linus Torvalds 已提交
359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
/**
 *	do_probe		-	probe an IDE device
 *	@drive: drive to probe
 *	@cmd: command to use
 *
 *	do_probe() has the difficult job of finding a drive if it exists,
 *	without getting hung up if it doesn't exist, without trampling on
 *	ethernet cards, and without leaving any IRQs dangling to haunt us later.
 *
 *	If a drive is "known" to exist (from CMOS or kernel parameters),
 *	but does not respond right away, the probe will "hang in there"
 *	for the maximum wait time (about 30 seconds), otherwise it will
 *	exit much more quickly.
 *
 * Returns:	0  device was identified
 *		1  device timed-out (no response to identify request)
 *		2  device aborted the command (refused to identify itself)
 *		3  bad status from device (possible for ATAPI drives)
 *		4  probe was not attempted because failure was obvious
 */

static int do_probe (ide_drive_t *drive, u8 cmd)
{
382
	ide_hwif_t *hwif = drive->hwif;
383
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
384
	u16 *id = drive->id;
385
	int rc;
B
Bartlomiej Zolnierkiewicz 已提交
386 387 388 389 390
	u8 present = !!(drive->dev_flags & IDE_DFLAG_PRESENT), stat;

	/* avoid waiting for inappropriate probes */
	if (present && drive->media != ide_disk && cmd == ATA_CMD_ID_ATA)
		return 4;
L
Linus Torvalds 已提交
391 392

#ifdef DEBUG
393
	printk(KERN_INFO "probing for %s: present=%d, media=%d, probetype=%s\n",
B
Bartlomiej Zolnierkiewicz 已提交
394
		drive->name, present, drive->media,
395
		(cmd == ATA_CMD_ID_ATA) ? "ATA" : "ATAPI");
L
Linus Torvalds 已提交
396 397 398 399 400 401
#endif

	/* needed for some systems
	 * (e.g. crw9624 as drive0 with disk as slave)
	 */
	msleep(50);
S
Sergei Shtylyov 已提交
402
	tp_ops->dev_select(drive);
L
Linus Torvalds 已提交
403
	msleep(50);
404

405
	if (ide_read_device(drive) != drive->select && present == 0) {
406
		if (drive->dn & 1) {
L
Linus Torvalds 已提交
407
			/* exit with drive0 selected */
S
Sergei Shtylyov 已提交
408
			tp_ops->dev_select(hwif->devices[0]);
409
			/* allow ATA_BUSY to assert & clear */
L
Linus Torvalds 已提交
410 411 412 413 414 415
			msleep(50);
		}
		/* no i/f present: mmm.. this should be a 4 -ml */
		return 3;
	}

416
	stat = tp_ops->read_status(hwif);
417

418
	if (OK_STAT(stat, ATA_DRDY, ATA_BUSY) ||
B
Bartlomiej Zolnierkiewicz 已提交
419
	    present || cmd == ATA_CMD_ID_ATAPI) {
420
		rc = ide_dev_read_id(drive, cmd, id, 0);
421
		if (rc)
L
Linus Torvalds 已提交
422
			/* failed: try again */
423
			rc = ide_dev_read_id(drive, cmd, id, 0);
424

425
		stat = tp_ops->read_status(hwif);
426

427
		if (stat == (ATA_BUSY | ATA_DRDY))
L
Linus Torvalds 已提交
428 429
			return 4;

430
		if (rc == 1 && cmd == ATA_CMD_ID_ATAPI) {
431 432
			printk(KERN_ERR "%s: no response (status = 0x%02x), "
					"resetting drive\n", drive->name, stat);
L
Linus Torvalds 已提交
433
			msleep(50);
S
Sergei Shtylyov 已提交
434
			tp_ops->dev_select(drive);
L
Linus Torvalds 已提交
435
			msleep(50);
436
			tp_ops->exec_command(hwif, ATA_CMD_DEV_RESET);
437
			(void)ide_busy_sleep(drive, WAIT_WORSTCASE, 0);
438
			rc = ide_dev_read_id(drive, cmd, id, 0);
L
Linus Torvalds 已提交
439
		}
440 441

		/* ensure drive IRQ is clear */
442
		stat = tp_ops->read_status(hwif);
443

L
Linus Torvalds 已提交
444
		if (rc == 1)
445 446
			printk(KERN_ERR "%s: no response (status = 0x%02x)\n",
					drive->name, stat);
L
Linus Torvalds 已提交
447 448 449 450
	} else {
		/* not present or maybe ATAPI */
		rc = 3;
	}
451
	if (drive->dn & 1) {
L
Linus Torvalds 已提交
452
		/* exit with drive0 selected */
S
Sergei Shtylyov 已提交
453
		tp_ops->dev_select(hwif->devices[0]);
L
Linus Torvalds 已提交
454 455
		msleep(50);
		/* ensure drive irq is clear */
456
		(void)tp_ops->read_status(hwif);
L
Linus Torvalds 已提交
457 458 459 460 461 462 463 464 465 466 467 468
	}
	return rc;
}

/**
 *	probe_for_drives	-	upper level drive probe
 *	@drive: drive to probe for
 *
 *	probe_for_drive() tests for existence of a given drive using do_probe()
 *	and presents things to the user as needed.
 *
 *	Returns:	0  no device was found
B
Bartlomiej Zolnierkiewicz 已提交
469 470
 *			1  device was found
 *			   (note: IDE_DFLAG_PRESENT might still be not set)
L
Linus Torvalds 已提交
471
 */
472 473

static u8 probe_for_drive(ide_drive_t *drive)
L
Linus Torvalds 已提交
474
{
475
	char *m;
476 477
	int rc;
	u8 cmd;
478

B
Bartlomiej Zolnierkiewicz 已提交
479 480
	drive->dev_flags &= ~IDE_DFLAG_ID_READ;

481 482 483
	m = (char *)&drive->id[ATA_ID_PROD];
	strcpy(m, "UNKNOWN");

L
Linus Torvalds 已提交
484
	/* skip probing? */
B
Bartlomiej Zolnierkiewicz 已提交
485
	if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0) {
L
Linus Torvalds 已提交
486
		/* if !(success||timed-out) */
487 488 489
		cmd = ATA_CMD_ID_ATA;
		rc = do_probe(drive, cmd);
		if (rc >= 2) {
L
Linus Torvalds 已提交
490
			/* look for ATAPI device */
491 492 493
			cmd = ATA_CMD_ID_ATAPI;
			rc = do_probe(drive, cmd);
		}
494

B
Bartlomiej Zolnierkiewicz 已提交
495
		if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
H
Hugh Dickins 已提交
496
			return 0;
497

L
Linus Torvalds 已提交
498
		/* identification failed? */
B
Bartlomiej Zolnierkiewicz 已提交
499
		if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
L
Linus Torvalds 已提交
500 501 502 503 504 505 506 507 508
			if (drive->media == ide_disk) {
				printk(KERN_INFO "%s: non-IDE drive, CHS=%d/%d/%d\n",
					drive->name, drive->cyl,
					drive->head, drive->sect);
			} else if (drive->media == ide_cdrom) {
				printk(KERN_INFO "%s: ATAPI cdrom (?)\n", drive->name);
			} else {
				/* nuke it */
				printk(KERN_WARNING "%s: Unknown device on bus refused identification. Ignoring.\n", drive->name);
B
Bartlomiej Zolnierkiewicz 已提交
509
				drive->dev_flags &= ~IDE_DFLAG_PRESENT;
L
Linus Torvalds 已提交
510
			}
511 512 513 514 515
		} else {
			if (cmd == ATA_CMD_ID_ATAPI)
				ide_classify_atapi_dev(drive);
			else
				ide_classify_ata_dev(drive);
L
Linus Torvalds 已提交
516 517
		}
	}
B
Bartlomiej Zolnierkiewicz 已提交
518 519

	if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
H
Hugh Dickins 已提交
520
		return 0;
B
Bartlomiej Zolnierkiewicz 已提交
521

L
Linus Torvalds 已提交
522
	/* The drive wasn't being helpful. Add generic info only */
B
Bartlomiej Zolnierkiewicz 已提交
523
	if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) {
L
Linus Torvalds 已提交
524 525 526 527 528 529 530 531 532
		generic_id(drive);
		return 1;
	}

	if (drive->media == ide_disk) {
		ide_disk_init_chs(drive);
		ide_disk_init_mult_count(drive);
	}

533
	return 1;
L
Linus Torvalds 已提交
534 535
}

P
Pavel Machek 已提交
536
static void hwif_release_dev(struct device *dev)
L
Linus Torvalds 已提交
537 538 539
{
	ide_hwif_t *hwif = container_of(dev, ide_hwif_t, gendev);

540
	complete(&hwif->gendev_rel_comp);
L
Linus Torvalds 已提交
541 542
}

543
static int ide_register_port(ide_hwif_t *hwif)
L
Linus Torvalds 已提交
544
{
545 546
	int ret;

L
Linus Torvalds 已提交
547
	/* register with global device tree */
548
	dev_set_name(&hwif->gendev, hwif->name);
549
	dev_set_drvdata(&hwif->gendev, hwif);
A
Andreas Schwab 已提交
550 551
	if (hwif->gendev.parent == NULL)
		hwif->gendev.parent = hwif->dev;
L
Linus Torvalds 已提交
552
	hwif->gendev.release = hwif_release_dev;
553

554
	ret = device_register(&hwif->gendev);
555
	if (ret < 0) {
556
		printk(KERN_WARNING "IDE: %s: device_register error: %d\n",
557
			__func__, ret);
558 559 560
		goto out;
	}

561 562
	hwif->portdev = device_create(ide_port_class, &hwif->gendev,
				      MKDEV(0, 0), hwif, hwif->name);
563 564 565 566 567 568
	if (IS_ERR(hwif->portdev)) {
		ret = PTR_ERR(hwif->portdev);
		device_unregister(&hwif->gendev);
	}
out:
	return ret;
L
Linus Torvalds 已提交
569 570
}

571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597
/**
 *	ide_port_wait_ready	-	wait for port to become ready
 *	@hwif: IDE port
 *
 *	This is needed on some PPCs and a bunch of BIOS-less embedded
 *	platforms.  Typical cases are:
 *
 *	- The firmware hard reset the disk before booting the kernel,
 *	  the drive is still doing it's poweron-reset sequence, that
 *	  can take up to 30 seconds.
 *
 *	- The firmware does nothing (or no firmware), the device is
 *	  still in POST state (same as above actually).
 *
 *	- Some CD/DVD/Writer combo drives tend to drive the bus during
 *	  their reset sequence even when they are non-selected slave
 *	  devices, thus preventing discovery of the main HD.
 *
 *	Doing this wait-for-non-busy should not harm any existing
 *	configuration and fix some issues like the above.
 *
 *	BenH.
 *
 *	Returns 0 on success, error code (< 0) otherwise.
 */

static int ide_port_wait_ready(ide_hwif_t *hwif)
L
Linus Torvalds 已提交
598
{
S
Sergei Shtylyov 已提交
599
	const struct ide_tp_ops *tp_ops = hwif->tp_ops;
600 601
	ide_drive_t *drive;
	int i, rc;
L
Linus Torvalds 已提交
602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617

	printk(KERN_DEBUG "Probing IDE interface %s...\n", hwif->name);

	/* Let HW settle down a bit from whatever init state we
	 * come from */
	mdelay(2);

	/* Wait for BSY bit to go away, spec timeout is 30 seconds,
	 * I know of at least one disk who takes 31 seconds, I use 35
	 * here to be safe
	 */
	rc = ide_wait_not_busy(hwif, 35000);
	if (rc)
		return rc;

	/* Now make sure both master & slave are ready */
618
	ide_port_for_each_dev(i, drive, hwif) {
619
		/* Ignore disks that we will not probe for later. */
B
Bartlomiej Zolnierkiewicz 已提交
620 621
		if ((drive->dev_flags & IDE_DFLAG_NOPROBE) == 0 ||
		    (drive->dev_flags & IDE_DFLAG_PRESENT)) {
S
Sergei Shtylyov 已提交
622 623
			tp_ops->dev_select(drive);
			tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS);
624 625 626 627 628 629 630 631 632
			mdelay(2);
			rc = ide_wait_not_busy(hwif, 35000);
			if (rc)
				goto out;
		} else
			printk(KERN_DEBUG "%s: ide_wait_not_busy() skipped\n",
					  drive->name);
	}
out:
L
Linus Torvalds 已提交
633
	/* Exit function with master reselected (let's be sane) */
634
	if (i)
S
Sergei Shtylyov 已提交
635
		tp_ops->dev_select(hwif->devices[0]);
636

L
Linus Torvalds 已提交
637 638 639 640 641
	return rc;
}

/**
 *	ide_undecoded_slave	-	look for bad CF adapters
642
 *	@dev1: slave device
L
Linus Torvalds 已提交
643 644 645 646 647 648
 *
 *	Analyse the drives on the interface and attempt to decide if we
 *	have the same drive viewed twice. This occurs with crap CF adapters
 *	and PCMCIA sometimes.
 */

649
void ide_undecoded_slave(ide_drive_t *dev1)
L
Linus Torvalds 已提交
650
{
651
	ide_drive_t *dev0 = dev1->hwif->devices[0];
L
Linus Torvalds 已提交
652

B
Bartlomiej Zolnierkiewicz 已提交
653
	if ((dev1->dn & 1) == 0 || (dev0->dev_flags & IDE_DFLAG_PRESENT) == 0)
L
Linus Torvalds 已提交
654 655 656
		return;

	/* If the models don't match they are not the same product */
657 658
	if (strcmp((char *)&dev0->id[ATA_ID_PROD],
		   (char *)&dev1->id[ATA_ID_PROD]))
L
Linus Torvalds 已提交
659 660 661
		return;

	/* Serial numbers do not match */
662 663
	if (strncmp((char *)&dev0->id[ATA_ID_SERNO],
		    (char *)&dev1->id[ATA_ID_SERNO], ATA_ID_SERNO_LEN))
L
Linus Torvalds 已提交
664 665 666
		return;

	/* No serial number, thankfully very rare for CF */
667
	if (*(char *)&dev0->id[ATA_ID_SERNO] == 0)
L
Linus Torvalds 已提交
668 669 670 671 672
		return;

	/* Appears to be an IDE flash adapter with decode bugs */
	printk(KERN_WARNING "ide-probe: ignoring undecoded slave\n");

B
Bartlomiej Zolnierkiewicz 已提交
673
	dev1->dev_flags &= ~IDE_DFLAG_PRESENT;
L
Linus Torvalds 已提交
674 675 676 677
}

EXPORT_SYMBOL_GPL(ide_undecoded_slave);

678
static int ide_probe_port(ide_hwif_t *hwif)
L
Linus Torvalds 已提交
679
{
680
	ide_drive_t *drive;
L
Linus Torvalds 已提交
681
	unsigned int irqd;
682
	int i, rc = -ENODEV;
683 684

	BUG_ON(hwif->present);
L
Linus Torvalds 已提交
685

686 687
	if ((hwif->devices[0]->dev_flags & IDE_DFLAG_NOPROBE) &&
	    (hwif->devices[1]->dev_flags & IDE_DFLAG_NOPROBE))
688
		return -EACCES;
L
Linus Torvalds 已提交
689 690 691 692 693 694 695 696 697

	/*
	 * We must always disable IRQ, as probe_for_drive will assert IRQ, but
	 * we'll install our IRQ driver much later...
	 */
	irqd = hwif->irq;
	if (irqd)
		disable_irq(hwif->irq);

698 699
	if (ide_port_wait_ready(hwif) == -EBUSY)
		printk(KERN_DEBUG "%s: Wait for ready failed before probe !\n", hwif->name);
L
Linus Torvalds 已提交
700 701

	/*
702 703
	 * Second drive should only exist if first drive was found,
	 * but a lot of cdrom drives are configured as single slaves.
L
Linus Torvalds 已提交
704
	 */
705
	ide_port_for_each_dev(i, drive, hwif) {
L
Linus Torvalds 已提交
706
		(void) probe_for_drive(drive);
B
Bartlomiej Zolnierkiewicz 已提交
707
		if (drive->dev_flags & IDE_DFLAG_PRESENT)
708
			rc = 0;
L
Linus Torvalds 已提交
709
	}
710

L
Linus Torvalds 已提交
711 712 713 714 715 716 717
	/*
	 * Use cached IRQ number. It might be (and is...) changed by probe
	 * code above
	 */
	if (irqd)
		enable_irq(irqd);

718
	return rc;
719 720 721 722
}

static void ide_port_tune_devices(ide_hwif_t *hwif)
{
723
	const struct ide_port_ops *port_ops = hwif->port_ops;
724 725
	ide_drive_t *drive;
	int i;
726

727
	ide_port_for_each_present_dev(i, drive, hwif) {
728 729
		ide_check_nien_quirk_list(drive);

730 731
		if (port_ops && port_ops->quirkproc)
			port_ops->quirkproc(drive);
732
	}
733

734 735
	ide_port_for_each_present_dev(i, drive, hwif) {
		ide_set_max_pio(drive);
L
Linus Torvalds 已提交
736

737
		drive->dev_flags |= IDE_DFLAG_NICE1;
L
Linus Torvalds 已提交
738

739 740
		if (hwif->dma_ops)
			ide_set_dma(drive);
L
Linus Torvalds 已提交
741 742 743 744 745 746 747 748
	}
}

/*
 * init request queue
 */
static int ide_init_queue(ide_drive_t *drive)
{
749
	struct request_queue *q;
750
	ide_hwif_t *hwif = drive->hwif;
L
Linus Torvalds 已提交
751 752 753 754 755 756 757 758 759 760
	int max_sectors = 256;
	int max_sg_entries = PRD_ENTRIES;

	/*
	 *	Our default set up assumes the normal IDE case,
	 *	that is 64K segmenting, standard PRD setup
	 *	and LBA28. Some drivers then impose their own
	 *	limits and LBA48 we could raise it but as yet
	 *	do not.
	 */
761

762
	q = blk_init_queue_node(do_ide_request, NULL, hwif_to_node(hwif));
L
Linus Torvalds 已提交
763 764 765 766 767 768 769 770
	if (!q)
		return 1;

	q->queuedata = drive;
	blk_queue_segment_boundary(q, 0xffff);

	if (hwif->rqsize < max_sectors)
		max_sectors = hwif->rqsize;
771
	blk_queue_max_hw_sectors(q, max_sectors);
L
Linus Torvalds 已提交
772 773 774 775 776 777 778 779 780 781 782 783 784 785 786

#ifdef CONFIG_PCI
	/* When we have an IOMMU, we may have a problem where pci_map_sg()
	 * creates segments that don't completely match our boundary
	 * requirements and thus need to be broken up again. Because it
	 * doesn't align properly either, we may actually have to break up
	 * to more segments than what was we got in the first place, a max
	 * worst case is twice as many.
	 * This will be fixed once we teach pci_map_sg() about our boundary
	 * requirements, hopefully soon. *FIXME*
	 */
	if (!PCI_DMA_BUS_IS_PHYS)
		max_sg_entries >>= 1;
#endif /* CONFIG_PCI */

787
	blk_queue_max_segments(q, max_sg_entries);
L
Linus Torvalds 已提交
788 789 790 791 792 793 794 795 796 797

	/* assign drive queue */
	drive->queue = q;

	/* needs drive->queue to be set */
	ide_toggle_bounce(drive, 1);

	return 0;
}

798 799
static DEFINE_MUTEX(ide_cfg_mtx);

800 801 802 803
/*
 * For any present drive:
 * - allocate the block device queue
 */
804
static int ide_port_setup_devices(ide_hwif_t *hwif)
805
{
806
	ide_drive_t *drive;
807
	int i, j = 0;
808

809
	mutex_lock(&ide_cfg_mtx);
810
	ide_port_for_each_present_dev(i, drive, hwif) {
811 812 813
		if (ide_init_queue(drive)) {
			printk(KERN_ERR "ide: failed to init %s\n",
					drive->name);
814
			drive->dev_flags &= ~IDE_DFLAG_PRESENT;
815 816 817
			continue;
		}

818
		j++;
819
	}
820
	mutex_unlock(&ide_cfg_mtx);
821 822

	return j;
823 824
}

825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842
static void ide_host_enable_irqs(struct ide_host *host)
{
	ide_hwif_t *hwif;
	int i;

	ide_host_for_each_port(i, hwif, host) {
		if (hwif == NULL)
			continue;

		/* clear any pending IRQs */
		hwif->tp_ops->read_status(hwif);

		/* unmask IRQs */
		if (hwif->io_ports.ctl_addr)
			hwif->tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS);
	}
}

L
Linus Torvalds 已提交
843
/*
844
 * This routine sets up the IRQ for an IDE interface.
L
Linus Torvalds 已提交
845 846 847
 */
static int init_irq (ide_hwif_t *hwif)
{
848
	struct ide_io_ports *io_ports = &hwif->io_ports;
849 850 851
	struct ide_host *host = hwif->host;
	irq_handler_t irq_handler = host->irq_handler;
	int sa = host->irq_flags;
L
Linus Torvalds 已提交
852

853 854 855 856
	if (irq_handler == NULL)
		irq_handler = ide_intr;

	if (request_irq(hwif->irq, irq_handler, sa, hwif->name, hwif))
857
		goto out_up;
L
Linus Torvalds 已提交
858

A
Adrian Bunk 已提交
859
#if !defined(__mc68000__)
860
	printk(KERN_INFO "%s at 0x%03lx-0x%03lx,0x%03lx on irq %d", hwif->name,
861 862
		io_ports->data_addr, io_ports->status_addr,
		io_ports->ctl_addr, hwif->irq);
L
Linus Torvalds 已提交
863
#else
864
	printk(KERN_INFO "%s at 0x%08lx on irq %d", hwif->name,
865
		io_ports->data_addr, hwif->irq);
A
Adrian Bunk 已提交
866
#endif /* __mc68000__ */
867 868
	if (hwif->host->host_flags & IDE_HFLAG_SERIALIZE)
		printk(KERN_CONT " (serialized)");
869
	printk(KERN_CONT "\n");
870

L
Linus Torvalds 已提交
871 872 873 874 875 876 877 878 879 880 881 882 883 884 885
	return 0;
out_up:
	return 1;
}

static int ata_lock(dev_t dev, void *data)
{
	/* FIXME: we want to pin hwif down */
	return 0;
}

static struct kobject *ata_probe(dev_t dev, int *part, void *data)
{
	ide_hwif_t *hwif = data;
	int unit = *part >> PARTN_BITS;
886
	ide_drive_t *drive = hwif->devices[unit];
B
Bartlomiej Zolnierkiewicz 已提交
887 888

	if ((drive->dev_flags & IDE_DFLAG_PRESENT) == 0)
L
Linus Torvalds 已提交
889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906
		return NULL;

	if (drive->media == ide_disk)
		request_module("ide-disk");
	if (drive->media == ide_cdrom || drive->media == ide_optical)
		request_module("ide-cd");
	if (drive->media == ide_tape)
		request_module("ide-tape");
	if (drive->media == ide_floppy)
		request_module("ide-floppy");

	return NULL;
}

static struct kobject *exact_match(dev_t dev, int *part, void *data)
{
	struct gendisk *p = data;
	*part &= (1 << PARTN_BITS) - 1;
907
	return &disk_to_dev(p)->kobj;
L
Linus Torvalds 已提交
908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937
}

static int exact_lock(dev_t dev, void *data)
{
	struct gendisk *p = data;

	if (!get_disk(p))
		return -1;
	return 0;
}

void ide_register_region(struct gendisk *disk)
{
	blk_register_region(MKDEV(disk->major, disk->first_minor),
			    disk->minors, NULL, exact_match, exact_lock, disk);
}

EXPORT_SYMBOL_GPL(ide_register_region);

void ide_unregister_region(struct gendisk *disk)
{
	blk_unregister_region(MKDEV(disk->major, disk->first_minor),
			      disk->minors);
}

EXPORT_SYMBOL_GPL(ide_unregister_region);

void ide_init_disk(struct gendisk *disk, ide_drive_t *drive)
{
	ide_hwif_t *hwif = drive->hwif;
938
	unsigned int unit = drive->dn & 1;
L
Linus Torvalds 已提交
939 940 941 942 943 944 945 946 947 948 949 950 951

	disk->major = hwif->major;
	disk->first_minor = unit << PARTN_BITS;
	sprintf(disk->disk_name, "hd%c", 'a' + hwif->index * MAX_DRIVES + unit);
	disk->queue = drive->queue;
}

EXPORT_SYMBOL_GPL(ide_init_disk);

static void drive_release_dev (struct device *dev)
{
	ide_drive_t *drive = container_of(dev, ide_drive_t, gendev);

952 953
	ide_proc_unregister_device(drive);

954 955 956
	blk_cleanup_queue(drive->queue);
	drive->queue = NULL;

B
Bartlomiej Zolnierkiewicz 已提交
957
	drive->dev_flags &= ~IDE_DFLAG_PRESENT;
958

959
	complete(&drive->gendev_rel_comp);
L
Linus Torvalds 已提交
960 961 962 963 964
}

static int hwif_init(ide_hwif_t *hwif)
{
	if (!hwif->irq) {
965 966
		printk(KERN_ERR "%s: disabled, no IRQ\n", hwif->name);
		return 0;
L
Linus Torvalds 已提交
967 968 969 970 971 972 973 974
	}

	if (register_blkdev(hwif->major, hwif->name))
		return 0;

	if (!hwif->sg_max_nents)
		hwif->sg_max_nents = PRD_ENTRIES;

J
Jens Axboe 已提交
975
	hwif->sg_table = kmalloc(sizeof(struct scatterlist)*hwif->sg_max_nents,
L
Linus Torvalds 已提交
976 977 978 979 980
				 GFP_KERNEL);
	if (!hwif->sg_table) {
		printk(KERN_ERR "%s: unable to allocate SG table.\n", hwif->name);
		goto out;
	}
J
Jens Axboe 已提交
981 982

	sg_init_table(hwif->sg_table, hwif->sg_max_nents);
L
Linus Torvalds 已提交
983 984
	
	if (init_irq(hwif)) {
985 986
		printk(KERN_ERR "%s: disabled, unable to get IRQ %d\n",
			hwif->name, hwif->irq);
L
Linus Torvalds 已提交
987 988 989
		goto out;
	}

990 991
	blk_register_region(MKDEV(hwif->major, 0), MAX_DRIVES << PARTN_BITS,
			    THIS_MODULE, ata_probe, ata_lock, hwif);
L
Linus Torvalds 已提交
992 993 994 995 996 997 998
	return 1;

out:
	unregister_blkdev(hwif->major, hwif->name);
	return 0;
}

999 1000
static void hwif_register_devices(ide_hwif_t *hwif)
{
1001
	ide_drive_t *drive;
1002 1003
	unsigned int i;

1004
	ide_port_for_each_present_dev(i, drive, hwif) {
1005 1006
		struct device *dev = &drive->gendev;
		int ret;
1007

1008
		dev_set_name(dev, "%u.%u", hwif->index, i);
1009
		dev_set_drvdata(dev, drive);
1010 1011 1012 1013 1014 1015 1016 1017
		dev->parent = &hwif->gendev;
		dev->bus = &ide_bus_type;
		dev->release = drive_release_dev;

		ret = device_register(dev);
		if (ret < 0)
			printk(KERN_WARNING "IDE: %s: device_register error: "
					    "%d\n", __func__, ret);
1018 1019 1020
	}
}

1021 1022
static void ide_port_init_devices(ide_hwif_t *hwif)
{
1023
	const struct ide_port_ops *port_ops = hwif->port_ops;
1024
	ide_drive_t *drive;
1025 1026
	int i;

1027
	ide_port_for_each_dev(i, drive, hwif) {
1028 1029
		drive->dn = i + hwif->channel * 2;

1030 1031
		if (hwif->host_flags & IDE_HFLAG_IO_32BIT)
			drive->io_32bit = 1;
1032 1033
		if (hwif->host_flags & IDE_HFLAG_NO_IO_32BIT)
			drive->dev_flags |= IDE_DFLAG_NO_IO_32BIT;
1034
		if (hwif->host_flags & IDE_HFLAG_UNMASK_IRQS)
B
Bartlomiej Zolnierkiewicz 已提交
1035
			drive->dev_flags |= IDE_DFLAG_UNMASK;
1036
		if (hwif->host_flags & IDE_HFLAG_NO_UNMASK_IRQS)
B
Bartlomiej Zolnierkiewicz 已提交
1037
			drive->dev_flags |= IDE_DFLAG_NO_UNMASK;
1038

1039 1040
		drive->pio_mode = XFER_PIO_0;

1041 1042 1043
		if (port_ops && port_ops->init_dev)
			port_ops->init_dev(drive);
	}
1044 1045
}

1046 1047
static void ide_init_port(ide_hwif_t *hwif, unsigned int port,
			  const struct ide_port_info *d)
1048
{
1049
	hwif->channel = port;
1050

1051
	hwif->chipset = d->chipset ? d->chipset : ide_pci;
1052 1053 1054 1055

	if (d->init_iops)
		d->init_iops(hwif);

1056 1057
	/* ->host_flags may be set by ->init_iops (or even earlier...) */
	hwif->host_flags |= d->host_flags;
1058 1059
	hwif->pio_mask = d->pio_mask;

1060 1061 1062
	if (d->tp_ops)
		hwif->tp_ops = d->tp_ops;

1063
	/* ->set_pio_mode for DTC2278 is currently limited to port 0 */
1064
	if ((hwif->host_flags & IDE_HFLAG_DTC2278) == 0 || hwif->channel == 0)
1065 1066
		hwif->port_ops = d->port_ops;

1067 1068 1069 1070
	hwif->swdma_mask = d->swdma_mask;
	hwif->mwdma_mask = d->mwdma_mask;
	hwif->ultra_mask = d->udma_mask;

1071 1072 1073
	if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0) {
		int rc;

1074 1075
		hwif->dma_ops = d->dma_ops;

1076 1077 1078 1079 1080 1081 1082
		if (d->init_dma)
			rc = d->init_dma(hwif, d);
		else
			rc = ide_hwif_setup_dma(hwif, d);

		if (rc < 0) {
			printk(KERN_INFO "%s: DMA disabled\n", hwif->name);
1083 1084

			hwif->dma_ops = NULL;
1085
			hwif->dma_base = 0;
1086 1087 1088
			hwif->swdma_mask = 0;
			hwif->mwdma_mask = 0;
			hwif->ultra_mask = 0;
1089
		}
1090
	}
1091

1092
	if ((d->host_flags & IDE_HFLAG_SERIALIZE) ||
1093 1094
	    ((d->host_flags & IDE_HFLAG_SERIALIZE_DMA) && hwif->dma_base))
		hwif->host->host_flags |= IDE_HFLAG_SERIALIZE;
1095

1096 1097
	if (d->max_sectors)
		hwif->rqsize = d->max_sectors;
1098 1099 1100 1101 1102 1103 1104
	else {
		if ((hwif->host_flags & IDE_HFLAG_NO_LBA48) ||
		    (hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA))
			hwif->rqsize = 256;
		else
			hwif->rqsize = 65536;
	}
1105 1106 1107 1108

	/* call chipset specific routine for each enabled port */
	if (d->init_hwif)
		d->init_hwif(hwif);
1109
}
1110

1111 1112
static void ide_port_cable_detect(ide_hwif_t *hwif)
{
1113 1114 1115
	const struct ide_port_ops *port_ops = hwif->port_ops;

	if (port_ops && port_ops->cable_detect && (hwif->ultra_mask & 0x78)) {
1116
		if (hwif->cbl != ATA_CBL_PATA40_SHORT)
1117
			hwif->cbl = port_ops->cable_detect(hwif);
1118
	}
1119 1120
}

1121 1122 1123 1124 1125 1126
static const u8 ide_hwif_to_major[] =
	{ IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR, IDE4_MAJOR,
	  IDE5_MAJOR, IDE6_MAJOR, IDE7_MAJOR, IDE8_MAJOR, IDE9_MAJOR };

static void ide_port_init_devices_data(ide_hwif_t *hwif)
{
1127 1128
	ide_drive_t *drive;
	int i;
1129

1130 1131
	ide_port_for_each_dev(i, drive, hwif) {
		u8 j = (hwif->index * MAX_DRIVES) + i;
H
Hugh Dickins 已提交
1132
		u16 *saved_id = drive->id;
1133 1134

		memset(drive, 0, sizeof(*drive));
H
Hugh Dickins 已提交
1135 1136
		memset(saved_id, 0, SECTOR_SIZE);
		drive->id = saved_id;
1137 1138

		drive->media			= ide_disk;
1139
		drive->select			= (i << 4) | ATA_DEVICE_OBS;
1140 1141 1142
		drive->hwif			= hwif;
		drive->ready_stat		= ATA_DRDY;
		drive->bad_wstat		= BAD_W_STAT;
1143 1144
		drive->special_flags		= IDE_SFLAG_RECALIBRATE |
						  IDE_SFLAG_SET_GEOMETRY;
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
		drive->name[0]			= 'h';
		drive->name[1]			= 'd';
		drive->name[2]			= 'a' + j;
		drive->max_failures		= IDE_DEFAULT_MAX_FAILURES;

		INIT_LIST_HEAD(&drive->list);
		init_completion(&drive->gendev_rel_comp);
	}
}

static void ide_init_port_data(ide_hwif_t *hwif, unsigned int index)
{
	/* fill in any non-zero initial values */
	hwif->index	= index;
	hwif->major	= ide_hwif_to_major[index];

	hwif->name[0]	= 'i';
	hwif->name[1]	= 'd';
	hwif->name[2]	= 'e';
	hwif->name[3]	= '0' + index;

1166 1167 1168 1169 1170 1171
	spin_lock_init(&hwif->lock);

	init_timer(&hwif->timer);
	hwif->timer.function = &ide_timer_expiry;
	hwif->timer.data = (unsigned long)hwif;

1172 1173 1174 1175 1176 1177 1178
	init_completion(&hwif->gendev_rel_comp);

	hwif->tp_ops = &default_tp_ops;

	ide_port_init_devices_data(hwif);
}

1179
static void ide_init_port_hw(ide_hwif_t *hwif, struct ide_hw *hw)
1180 1181 1182 1183 1184 1185 1186 1187
{
	memcpy(&hwif->io_ports, &hw->io_ports, sizeof(hwif->io_ports));
	hwif->irq = hw->irq;
	hwif->dev = hw->dev;
	hwif->gendev.parent = hw->parent ? hw->parent : hw->dev;
	hwif->config_data = hw->config;
}

1188 1189
static unsigned int ide_indexes;

1190
/**
1191
 *	ide_find_port_slot	-	find free port slot
1192 1193
 *	@d: IDE port info
 *
1194
 *	Return the new port slot index or -ENOENT if we are out of free slots.
1195 1196
 */

1197
static int ide_find_port_slot(const struct ide_port_info *d)
1198
{
1199
	int idx = -ENOENT;
1200
	u8 bootable = (d && (d->host_flags & IDE_HFLAG_NON_BOOTABLE)) ? 0 : 1;
1201
	u8 i = (d && (d->host_flags & IDE_HFLAG_QD_2ND_PORT)) ? 1 : 0;
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212

	/*
	 * Claim an unassigned slot.
	 *
	 * Give preference to claiming other slots before claiming ide0/ide1,
	 * just in case there's another interface yet-to-be-scanned
	 * which uses ports 0x1f0/0x170 (the ide0/ide1 defaults).
	 *
	 * Unless there is a bootable card that does not use the standard
	 * ports 0x1f0/0x170 (the ide0/ide1 defaults).
	 */
1213
	mutex_lock(&ide_cfg_mtx);
1214 1215 1216
	if (bootable) {
		if ((ide_indexes | i) != (1 << MAX_HWIFS) - 1)
			idx = ffz(ide_indexes | i);
1217
	} else {
1218 1219 1220 1221
		if ((ide_indexes | 3) != (1 << MAX_HWIFS) - 1)
			idx = ffz(ide_indexes | 3);
		else if ((ide_indexes & 3) != 3)
			idx = ffz(ide_indexes);
1222
	}
1223 1224 1225
	if (idx >= 0)
		ide_indexes |= (1 << idx);
	mutex_unlock(&ide_cfg_mtx);
1226

1227 1228
	return idx;
}
1229

1230 1231 1232 1233 1234
static void ide_free_port_slot(int idx)
{
	mutex_lock(&ide_cfg_mtx);
	ide_indexes &= ~(1 << idx);
	mutex_unlock(&ide_cfg_mtx);
1235 1236
}

1237 1238
static void ide_port_free_devices(ide_hwif_t *hwif)
{
1239
	ide_drive_t *drive;
1240 1241
	int i;

H
Hugh Dickins 已提交
1242 1243
	ide_port_for_each_dev(i, drive, hwif) {
		kfree(drive->id);
1244
		kfree(drive);
H
Hugh Dickins 已提交
1245
	}
1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258
}

static int ide_port_alloc_devices(ide_hwif_t *hwif, int node)
{
	int i;

	for (i = 0; i < MAX_DRIVES; i++) {
		ide_drive_t *drive;

		drive = kzalloc_node(sizeof(*drive), GFP_KERNEL, node);
		if (drive == NULL)
			goto out_nomem;

H
Hugh Dickins 已提交
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
		/*
		 * In order to keep things simple we have an id
		 * block for all drives at all times. If the device
		 * is pre ATA or refuses ATA/ATAPI identify we
		 * will add faked data to this.
		 *
		 * Also note that 0 everywhere means "can't do X"
		 */
		drive->id = kzalloc_node(SECTOR_SIZE, GFP_KERNEL, node);
		if (drive->id == NULL)
			goto out_nomem;

1271 1272 1273 1274 1275 1276 1277 1278 1279
		hwif->devices[i] = drive;
	}
	return 0;

out_nomem:
	ide_port_free_devices(hwif);
	return -ENOMEM;
}

1280 1281
struct ide_host *ide_host_alloc(const struct ide_port_info *d,
				struct ide_hw **hws, unsigned int n_ports)
1282 1283
{
	struct ide_host *host;
1284 1285
	struct device *dev = hws[0] ? hws[0]->dev : NULL;
	int node = dev ? dev_to_node(dev) : -1;
1286 1287
	int i;

1288
	host = kzalloc_node(sizeof(*host), GFP_KERNEL, node);
1289 1290 1291
	if (host == NULL)
		return NULL;

1292
	for (i = 0; i < n_ports; i++) {
1293
		ide_hwif_t *hwif;
1294
		int idx;
1295 1296 1297 1298

		if (hws[i] == NULL)
			continue;

1299
		hwif = kzalloc_node(sizeof(*hwif), GFP_KERNEL, node);
1300 1301 1302
		if (hwif == NULL)
			continue;

1303 1304 1305 1306 1307
		if (ide_port_alloc_devices(hwif, node) < 0) {
			kfree(hwif);
			continue;
		}

1308 1309 1310 1311
		idx = ide_find_port_slot(d);
		if (idx < 0) {
			printk(KERN_ERR "%s: no free slot for interface\n",
					d ? d->name : "ide");
H
Hugh Dickins 已提交
1312
			ide_port_free_devices(hwif);
1313
			kfree(hwif);
1314
			continue;
1315
		}
1316 1317 1318

		ide_init_port_data(hwif, idx);

1319 1320
		hwif->host = host;

1321 1322
		host->ports[i] = hwif;
		host->n_ports++;
1323 1324 1325 1326 1327 1328 1329
	}

	if (host->n_ports == 0) {
		kfree(host);
		return NULL;
	}

1330
	host->dev[0] = dev;
1331

1332 1333
	if (d) {
		host->init_chipset = d->init_chipset;
1334 1335
		host->get_lock     = d->get_lock;
		host->release_lock = d->release_lock;
1336
		host->host_flags = d->host_flags;
1337
		host->irq_flags = d->irq_flags;
1338
	}
1339

1340 1341 1342 1343
	return host;
}
EXPORT_SYMBOL_GPL(ide_host_alloc);

1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367
static void ide_port_free(ide_hwif_t *hwif)
{
	ide_port_free_devices(hwif);
	ide_free_port_slot(hwif->index);
	kfree(hwif);
}

static void ide_disable_port(ide_hwif_t *hwif)
{
	struct ide_host *host = hwif->host;
	int i;

	printk(KERN_INFO "%s: disabling port\n", hwif->name);

	for (i = 0; i < MAX_HOST_PORTS; i++) {
		if (host->ports[i] == hwif) {
			host->ports[i] = NULL;
			host->n_ports--;
		}
	}

	ide_port_free(hwif);
}

1368
int ide_host_register(struct ide_host *host, const struct ide_port_info *d,
1369
		      struct ide_hw **hws)
1370 1371
{
	ide_hwif_t *hwif, *mate = NULL;
1372
	int i, j = 0;
1373

1374
	ide_host_for_each_port(i, hwif, host) {
1375
		if (hwif == NULL) {
1376 1377 1378 1379
			mate = NULL;
			continue;
		}

1380
		ide_init_port_hw(hwif, hws[i]);
1381 1382
		ide_port_apply_params(hwif);

1383 1384 1385
		if ((i & 1) && mate) {
			hwif->mate = mate;
			mate->mate = hwif;
1386
		}
1387

1388 1389 1390 1391
		mate = (i & 1) ? NULL : hwif;

		ide_init_port(hwif, i & 1, d);
		ide_port_cable_detect(hwif);
1392 1393 1394

		hwif->port_flags |= IDE_PFLAG_PROBING;

1395
		ide_port_init_devices(hwif);
1396 1397
	}

1398
	ide_host_for_each_port(i, hwif, host) {
1399 1400
		if (hwif == NULL)
			continue;
1401

1402 1403
		if (ide_probe_port(hwif) == 0)
			hwif->present = 1;
1404

1405 1406
		hwif->port_flags &= ~IDE_PFLAG_PROBING;

1407 1408
		if ((hwif->host_flags & IDE_HFLAG_4DRIVES) == 0 ||
		    hwif->mate == NULL || hwif->mate->present == 0) {
1409 1410 1411 1412 1413
			if (ide_register_port(hwif)) {
				ide_disable_port(hwif);
				continue;
			}
		}
1414

1415 1416
		if (hwif->present)
			ide_port_tune_devices(hwif);
1417
	}
1418

1419 1420
	ide_host_enable_irqs(host);

1421
	ide_host_for_each_port(i, hwif, host) {
1422 1423
		if (hwif == NULL)
			continue;
1424 1425 1426 1427

		if (hwif_init(hwif) == 0) {
			printk(KERN_INFO "%s: failed to initialize IDE "
					 "interface\n", hwif->name);
1428 1429
			device_unregister(&hwif->gendev);
			ide_disable_port(hwif);
1430 1431
			continue;
		}
1432

1433
		if (hwif->present)
1434 1435 1436 1437 1438 1439
			if (ide_port_setup_devices(hwif) == 0) {
				hwif->present = 0;
				continue;
			}

		j++;
1440

1441
		ide_acpi_init_port(hwif);
1442 1443 1444

		if (hwif->present)
			ide_acpi_port_init_devices(hwif);
1445 1446
	}

1447
	ide_host_for_each_port(i, hwif, host) {
1448 1449
		if (hwif == NULL)
			continue;
1450

1451
		if (hwif->present)
1452
			hwif_register_devices(hwif);
1453 1454
	}

1455
	ide_host_for_each_port(i, hwif, host) {
1456 1457
		if (hwif == NULL)
			continue;
1458

1459 1460 1461 1462
		ide_sysfs_register_port(hwif);
		ide_proc_register_port(hwif);

		if (hwif->present)
1463
			ide_proc_port_register_devices(hwif);
1464 1465
	}

1466
	return j ? 0 : -1;
1467
}
1468
EXPORT_SYMBOL_GPL(ide_host_register);
1469

1470
int ide_host_add(const struct ide_port_info *d, struct ide_hw **hws,
1471
		 unsigned int n_ports, struct ide_host **hostp)
1472 1473
{
	struct ide_host *host;
1474
	int rc;
1475

1476
	host = ide_host_alloc(d, hws, n_ports);
1477 1478 1479
	if (host == NULL)
		return -ENOMEM;

1480 1481 1482 1483 1484
	rc = ide_host_register(host, d, hws);
	if (rc) {
		ide_host_free(host);
		return rc;
	}
1485 1486 1487 1488 1489 1490 1491 1492

	if (hostp)
		*hostp = host;

	return 0;
}
EXPORT_SYMBOL_GPL(ide_host_add);

1493 1494
static void __ide_port_unregister_devices(ide_hwif_t *hwif)
{
1495
	ide_drive_t *drive;
1496 1497
	int i;

1498 1499 1500
	ide_port_for_each_present_dev(i, drive, hwif) {
		device_unregister(&drive->gendev);
		wait_for_completion(&drive->gendev_rel_comp);
1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559
	}
}

void ide_port_unregister_devices(ide_hwif_t *hwif)
{
	mutex_lock(&ide_cfg_mtx);
	__ide_port_unregister_devices(hwif);
	hwif->present = 0;
	ide_port_init_devices_data(hwif);
	mutex_unlock(&ide_cfg_mtx);
}
EXPORT_SYMBOL_GPL(ide_port_unregister_devices);

/**
 *	ide_unregister		-	free an IDE interface
 *	@hwif: IDE interface
 *
 *	Perform the final unregister of an IDE interface.
 *
 *	Locking:
 *	The caller must not hold the IDE locks.
 *
 *	It is up to the caller to be sure there is no pending I/O here,
 *	and that the interface will not be reopened (present/vanishing
 *	locking isn't yet done BTW).
 */

static void ide_unregister(ide_hwif_t *hwif)
{
	BUG_ON(in_interrupt());
	BUG_ON(irqs_disabled());

	mutex_lock(&ide_cfg_mtx);

	if (hwif->present) {
		__ide_port_unregister_devices(hwif);
		hwif->present = 0;
	}

	ide_proc_unregister_port(hwif);

	free_irq(hwif->irq, hwif);

	device_unregister(hwif->portdev);
	device_unregister(&hwif->gendev);
	wait_for_completion(&hwif->gendev_rel_comp);

	/*
	 * Remove us from the kernel's knowledge
	 */
	blk_unregister_region(MKDEV(hwif->major, 0), MAX_DRIVES<<PARTN_BITS);
	kfree(hwif->sg_table);
	unregister_blkdev(hwif->major, hwif->name);

	ide_release_dma_engine(hwif);

	mutex_unlock(&ide_cfg_mtx);
}

1560
void ide_host_free(struct ide_host *host)
1561
{
1562
	ide_hwif_t *hwif;
1563
	int i;
1564

1565
	ide_host_for_each_port(i, hwif, host) {
1566 1567
		if (hwif)
			ide_port_free(hwif);
1568
	}
1569

1570
	kfree(host);
1571
}
1572 1573 1574 1575
EXPORT_SYMBOL_GPL(ide_host_free);

void ide_host_remove(struct ide_host *host)
{
1576
	ide_hwif_t *hwif;
1577 1578
	int i;

1579 1580 1581
	ide_host_for_each_port(i, hwif, host) {
		if (hwif)
			ide_unregister(hwif);
1582 1583 1584 1585
	}

	ide_host_free(host);
}
1586
EXPORT_SYMBOL_GPL(ide_host_remove);
1587 1588 1589

void ide_port_scan(ide_hwif_t *hwif)
{
1590 1591
	int rc;

1592
	ide_port_apply_params(hwif);
1593
	ide_port_cable_detect(hwif);
1594 1595 1596

	hwif->port_flags |= IDE_PFLAG_PROBING;

1597 1598
	ide_port_init_devices(hwif);

1599 1600 1601 1602 1603
	rc = ide_probe_port(hwif);

	hwif->port_flags &= ~IDE_PFLAG_PROBING;

	if (rc < 0)
1604 1605 1606 1607 1608 1609
		return;

	hwif->present = 1;

	ide_port_tune_devices(hwif);
	ide_port_setup_devices(hwif);
1610
	ide_acpi_port_init_devices(hwif);
1611 1612 1613 1614
	hwif_register_devices(hwif);
	ide_proc_port_register_devices(hwif);
}
EXPORT_SYMBOL_GPL(ide_port_scan);