ide-disk.c 24.0 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3 4 5 6
 *  Copyright (C) 1994-1998	   Linus Torvalds & authors (see below)
 *  Copyright (C) 1998-2002	   Linux ATA Development
 *				      Andre Hedrick <andre@linux-ide.org>
 *  Copyright (C) 2003		   Red Hat <alan@redhat.com>
 *  Copyright (C) 2003-2005, 2007  Bartlomiej Zolnierkiewicz
L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 */

/*
 *  Mostly written by Mark Lord <mlord@pobox.com>
 *                and Gadi Oxman <gadio@netvision.net.il>
 *                and Andre Hedrick <andre@linux-ide.org>
 *
 * This is the IDE/ATA disk driver, as evolved from hd.c and ide.c.
 */

#define IDEDISK_VERSION	"1.18"

#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>
31
#include <linux/mutex.h>
32
#include <linux/leds.h>
L
Linus Torvalds 已提交
33
#include <linux/ide.h>
34
#include <linux/hdreg.h>
L
Linus Torvalds 已提交
35 36 37 38 39 40 41

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

42
#if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT)
43
#define IDE_DISK_MINORS		(1 << PARTN_BITS)
44
#else
45
#define IDE_DISK_MINORS		0
46 47
#endif

48
#include "ide-disk.h"
L
Linus Torvalds 已提交
49

50
static DEFINE_MUTEX(idedisk_ref_mutex);
L
Linus Torvalds 已提交
51 52 53

#define to_ide_disk(obj) container_of(obj, struct ide_disk_obj, kref)

54 55
static void ide_disk_release(struct kref *);

L
Linus Torvalds 已提交
56 57 58 59
static struct ide_disk_obj *ide_disk_get(struct gendisk *disk)
{
	struct ide_disk_obj *idkp = NULL;

60
	mutex_lock(&idedisk_ref_mutex);
L
Linus Torvalds 已提交
61
	idkp = ide_disk_g(disk);
62
	if (idkp) {
63
		if (ide_device_get(idkp->drive))
64
			idkp = NULL;
65 66
		else
			kref_get(&idkp->kref);
67
	}
68
	mutex_unlock(&idedisk_ref_mutex);
L
Linus Torvalds 已提交
69 70 71 72 73
	return idkp;
}

static void ide_disk_put(struct ide_disk_obj *idkp)
{
74 75
	ide_drive_t *drive = idkp->drive;

76
	mutex_lock(&idedisk_ref_mutex);
L
Linus Torvalds 已提交
77
	kref_put(&idkp->kref, ide_disk_release);
78
	ide_device_put(drive);
79
	mutex_unlock(&idedisk_ref_mutex);
L
Linus Torvalds 已提交
80 81
}

82
static const u8 ide_rw_cmds[] = {
83 84 85 86 87 88 89 90 91 92 93 94
	ATA_CMD_READ_MULTI,
	ATA_CMD_WRITE_MULTI,
	ATA_CMD_READ_MULTI_EXT,
	ATA_CMD_WRITE_MULTI_EXT,
	ATA_CMD_PIO_READ,
	ATA_CMD_PIO_WRITE,
	ATA_CMD_PIO_READ_EXT,
	ATA_CMD_PIO_WRITE_EXT,
	ATA_CMD_READ,
	ATA_CMD_WRITE,
	ATA_CMD_READ_EXT,
	ATA_CMD_WRITE_EXT,
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
};

static const u8 ide_data_phases[] = {
	TASKFILE_MULTI_IN,
	TASKFILE_MULTI_OUT,
	TASKFILE_IN,
	TASKFILE_OUT,
	TASKFILE_IN_DMA,
	TASKFILE_OUT_DMA,
};

static void ide_tf_set_cmd(ide_drive_t *drive, ide_task_t *task, u8 dma)
{
	u8 index, lba48, write;

	lba48 = (task->tf_flags & IDE_TFLAG_LBA48) ? 2 : 0;
	write = (task->tf_flags & IDE_TFLAG_WRITE) ? 1 : 0;

	if (dma)
114
		index = 8;
115 116 117 118 119 120 121 122 123 124 125
	else
		index = drive->mult_count ? 0 : 4;

	task->tf.command = ide_rw_cmds[index + lba48 + write];

	if (dma)
		index = 8; /* fixup index */

	task->data_phase = ide_data_phases[index / 2 + write];
}

L
Linus Torvalds 已提交
126 127 128 129
/*
 * __ide_do_rw_disk() issues READ and WRITE commands to a disk,
 * using LBA if supported, or CHS otherwise, to address sectors.
 */
130 131
static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
					sector_t block)
L
Linus Torvalds 已提交
132 133
{
	ide_hwif_t *hwif	= HWIF(drive);
134
	u16 nsectors		= (u16)rq->nr_sectors;
B
Bartlomiej Zolnierkiewicz 已提交
135 136
	u8 lba48		= !!(drive->dev_flags & IDE_DFLAG_LBA48);
	u8 dma			= !!(drive->dev_flags & IDE_DFLAG_USING_DMA);
137 138
	ide_task_t		task;
	struct ide_taskfile	*tf = &task.tf;
139
	ide_startstop_t		rc;
L
Linus Torvalds 已提交
140

141
	if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && lba48 && dma) {
L
Linus Torvalds 已提交
142 143 144 145 146 147 148 149 150 151 152
		if (block + rq->nr_sectors > 1ULL << 28)
			dma = 0;
		else
			lba48 = 0;
	}

	if (!dma) {
		ide_init_sg_cmd(drive, rq);
		ide_map_sg(drive, rq);
	}

153
	memset(&task, 0, sizeof(task));
154
	task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
155

156
	if (drive->dev_flags & IDE_DFLAG_LBA) {
L
Linus Torvalds 已提交
157
		if (lba48) {
158 159
			pr_debug("%s: LBA=0x%012llx\n", drive->name,
					(unsigned long long)block);
L
Linus Torvalds 已提交
160

161
			tf->hob_nsect = (nsectors >> 8) & 0xff;
162 163 164 165
			tf->hob_lbal  = (u8)(block >> 24);
			if (sizeof(block) != 4) {
				tf->hob_lbam = (u8)((u64)block >> 32);
				tf->hob_lbah = (u8)((u64)block >> 40);
L
Linus Torvalds 已提交
166
			}
167

168
			tf->nsect  = nsectors & 0xff;
169 170 171
			tf->lbal   = (u8) block;
			tf->lbam   = (u8)(block >>  8);
			tf->lbah   = (u8)(block >> 16);
172

173
			task.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB);
L
Linus Torvalds 已提交
174
		} else {
175
			tf->nsect  = nsectors & 0xff;
176 177 178 179
			tf->lbal   = block;
			tf->lbam   = block >>= 8;
			tf->lbah   = block >>= 8;
			tf->device = (block >> 8) & 0xf;
L
Linus Torvalds 已提交
180
		}
181 182

		tf->device |= ATA_LBA;
L
Linus Torvalds 已提交
183
	} else {
184 185
		unsigned int sect, head, cyl, track;

L
Linus Torvalds 已提交
186 187 188 189 190 191 192
		track = (int)block / drive->sect;
		sect  = (int)block % drive->sect + 1;
		head  = track % drive->head;
		cyl   = track / drive->head;

		pr_debug("%s: CHS=%u/%u/%u\n", drive->name, cyl, head, sect);

193
		tf->nsect  = nsectors & 0xff;
194 195 196 197
		tf->lbal   = sect;
		tf->lbam   = cyl;
		tf->lbah   = cyl >> 8;
		tf->device = head;
L
Linus Torvalds 已提交
198 199
	}

200 201 202 203
	if (rq_data_dir(rq))
		task.tf_flags |= IDE_TFLAG_WRITE;

	ide_tf_set_cmd(drive, &task, dma);
204 205 206
	if (!dma)
		hwif->data_phase = task.data_phase;
	task.rq = rq;
207

208
	rc = do_rw_taskfile(drive, &task);
209

210
	if (rc == ide_stopped && dma) {
L
Linus Torvalds 已提交
211
		/* fallback to PIO */
212
		task.tf_flags |= IDE_TFLAG_DMA_PIO_FALLBACK;
213
		ide_tf_set_cmd(drive, &task, 0);
214
		hwif->data_phase = task.data_phase;
L
Linus Torvalds 已提交
215
		ide_init_sg_cmd(drive, rq);
216
		rc = do_rw_taskfile(drive, &task);
L
Linus Torvalds 已提交
217 218
	}

219
	return rc;
L
Linus Torvalds 已提交
220 221 222 223 224 225 226 227
}

/*
 * 268435455  == 137439 MB or 28bit limit
 * 320173056  == 163929 MB or 48bit addressing
 * 1073741822 == 549756 MB or 48bit addressing fake drive
 */

228 229
static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq,
				      sector_t block)
L
Linus Torvalds 已提交
230 231 232
{
	ide_hwif_t *hwif = HWIF(drive);

B
Bartlomiej Zolnierkiewicz 已提交
233
	BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED);
L
Linus Torvalds 已提交
234 235 236 237 238 239 240

	if (!blk_fs_request(rq)) {
		blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command");
		ide_end_request(drive, 0, 0);
		return ide_stopped;
	}

241 242
	ledtrig_ide_activity();

L
Linus Torvalds 已提交
243 244
	pr_debug("%s: %sing: block=%llu, sectors=%lu, buffer=0x%08lx\n",
		 drive->name, rq_data_dir(rq) == READ ? "read" : "writ",
245 246
		 (unsigned long long)block, rq->nr_sectors,
		 (unsigned long)rq->buffer);
L
Linus Torvalds 已提交
247 248 249 250 251 252 253 254 255 256 257

	if (hwif->rw_disk)
		hwif->rw_disk(drive, rq);

	return __ide_do_rw_disk(drive, rq, block);
}

/*
 * Queries for true maximum capacity of the drive.
 * Returns maximum LBA address (> 0) of the drive, 0 if failed.
 */
258
static u64 idedisk_read_native_max_address(ide_drive_t *drive, int lba48)
L
Linus Torvalds 已提交
259 260
{
	ide_task_t args;
261
	struct ide_taskfile *tf = &args.tf;
262
	u64 addr = 0;
L
Linus Torvalds 已提交
263 264 265

	/* Create IDE/ATA command request structure */
	memset(&args, 0, sizeof(ide_task_t));
266
	if (lba48)
267
		tf->command = ATA_CMD_READ_NATIVE_MAX_EXT;
268
	else
269
		tf->command = ATA_CMD_READ_NATIVE_MAX;
270
	tf->device  = ATA_LBA;
271
	args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
272
	if (lba48)
273
		args.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB);
L
Linus Torvalds 已提交
274
	/* submit command request */
275
	ide_no_data_taskfile(drive, &args);
L
Linus Torvalds 已提交
276 277

	/* if OK, compute maximum address value */
278 279
	if ((tf->status & 0x01) == 0)
		addr = ide_get_lba_addr(tf, lba48) + 1;
280

L
Linus Torvalds 已提交
281 282 283 284 285 286 287
	return addr;
}

/*
 * Sets maximum virtual LBA address of the drive.
 * Returns new maximum virtual LBA address (> 0) or 0 on failure.
 */
288
static u64 idedisk_set_max_address(ide_drive_t *drive, u64 addr_req, int lba48)
L
Linus Torvalds 已提交
289 290
{
	ide_task_t args;
291
	struct ide_taskfile *tf = &args.tf;
292
	u64 addr_set = 0;
L
Linus Torvalds 已提交
293 294 295 296

	addr_req--;
	/* Create IDE/ATA command request structure */
	memset(&args, 0, sizeof(ide_task_t));
297 298 299
	tf->lbal     = (addr_req >>  0) & 0xff;
	tf->lbam     = (addr_req >>= 8) & 0xff;
	tf->lbah     = (addr_req >>= 8) & 0xff;
300 301 302 303
	if (lba48) {
		tf->hob_lbal = (addr_req >>= 8) & 0xff;
		tf->hob_lbam = (addr_req >>= 8) & 0xff;
		tf->hob_lbah = (addr_req >>= 8) & 0xff;
304
		tf->command  = ATA_CMD_SET_MAX_EXT;
305 306
	} else {
		tf->device   = (addr_req >>= 8) & 0x0f;
307
		tf->command  = ATA_CMD_SET_MAX;
308 309
	}
	tf->device |= ATA_LBA;
310
	args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
311
	if (lba48)
312
		args.tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_HOB);
L
Linus Torvalds 已提交
313
	/* submit command request */
314
	ide_no_data_taskfile(drive, &args);
L
Linus Torvalds 已提交
315
	/* if OK, compute maximum address value */
316 317
	if ((tf->status & 0x01) == 0)
		addr_set = ide_get_lba_addr(tf, lba48) + 1;
318

L
Linus Torvalds 已提交
319 320 321 322 323 324 325 326 327 328
	return addr_set;
}

static unsigned long long sectors_to_MB(unsigned long long n)
{
	n <<= 9;		/* make it bytes */
	do_div(n, 1000000);	/* make it MB */
	return n;
}

329 330 331 332 333 334
/*
 * Some disks report total number of sectors instead of
 * maximum sector address.  We list them here.
 */
static const struct drive_list_entry hpa_list[] = {
	{ "ST340823A",	NULL },
335
	{ "ST320413A",	NULL },
336
	{ "ST310211A",	NULL },
337 338 339
	{ NULL,		NULL }
};

340
static void idedisk_check_hpa(ide_drive_t *drive)
L
Linus Torvalds 已提交
341 342
{
	unsigned long long capacity, set_max;
343
	int lba48 = ata_id_lba48_enabled(drive->id);
L
Linus Torvalds 已提交
344 345

	capacity = drive->capacity64;
346 347

	set_max = idedisk_read_native_max_address(drive, lba48);
L
Linus Torvalds 已提交
348

349 350 351 352 353 354 355 356 357
	if (ide_in_drive_list(drive->id, hpa_list)) {
		/*
		 * Since we are inclusive wrt to firmware revisions do this
		 * extra check and apply the workaround only when needed.
		 */
		if (set_max == capacity + 1)
			set_max--;
	}

L
Linus Torvalds 已提交
358 359 360 361 362 363 364 365 366 367
	if (set_max <= capacity)
		return;

	printk(KERN_INFO "%s: Host Protected Area detected.\n"
			 "\tcurrent capacity is %llu sectors (%llu MB)\n"
			 "\tnative  capacity is %llu sectors (%llu MB)\n",
			 drive->name,
			 capacity, sectors_to_MB(capacity),
			 set_max, sectors_to_MB(set_max));

368 369
	set_max = idedisk_set_max_address(drive, set_max, lba48);

L
Linus Torvalds 已提交
370 371 372 373 374 375 376
	if (set_max) {
		drive->capacity64 = set_max;
		printk(KERN_INFO "%s: Host Protected Area disabled.\n",
				 drive->name);
	}
}

377
static void init_idedisk_capacity(ide_drive_t *drive)
L
Linus Torvalds 已提交
378
{
379
	u16 *id = drive->id;
380
	int lba;
L
Linus Torvalds 已提交
381

382
	if (ata_id_lba48_enabled(id)) {
L
Linus Torvalds 已提交
383
		/* drive speaks 48-bit LBA */
384
		lba = 1;
385
		drive->capacity64 = ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);
386
	} else if (ata_id_has_lba(id) && ata_id_is_lba_capacity_ok(id)) {
L
Linus Torvalds 已提交
387
		/* drive speaks 28-bit LBA */
388
		lba = 1;
389
		drive->capacity64 = ata_id_u32(id, ATA_ID_LBA_CAPACITY);
L
Linus Torvalds 已提交
390 391
	} else {
		/* drive speaks boring old 28-bit CHS */
392
		lba = 0;
L
Linus Torvalds 已提交
393 394
		drive->capacity64 = drive->cyl * drive->head * drive->sect;
	}
395 396 397 398 399 400 401 402 403 404 405

	if (lba) {
		drive->dev_flags |= IDE_DFLAG_LBA;

		/*
		* If this device supports the Host Protected Area feature set,
		* then we may need to change our opinion about its capacity.
		*/
		if (ata_id_hpa_enabled(id))
			idedisk_check_hpa(drive);
	}
L
Linus Torvalds 已提交
406 407
}

408
sector_t ide_disk_capacity(ide_drive_t *drive)
L
Linus Torvalds 已提交
409
{
410
	return drive->capacity64;
L
Linus Torvalds 已提交
411 412
}

413
static void idedisk_prepare_flush(struct request_queue *q, struct request *rq)
L
Linus Torvalds 已提交
414 415
{
	ide_drive_t *drive = q->queuedata;
416
	ide_task_t *task = kmalloc(sizeof(*task), GFP_ATOMIC);
L
Linus Torvalds 已提交
417

418 419 420 421
	/* FIXME: map struct ide_taskfile on rq->cmd[] */
	BUG_ON(task == NULL);

	memset(task, 0, sizeof(*task));
422
	if (ata_id_flush_ext_enabled(drive->id) &&
L
Linus Torvalds 已提交
423
	    (drive->capacity64 >= (1UL << 28)))
424
		task->tf.command = ATA_CMD_FLUSH_EXT;
L
Linus Torvalds 已提交
425
	else
426
		task->tf.command = ATA_CMD_FLUSH;
427 428 429
	task->tf_flags	 = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE |
			   IDE_TFLAG_DYN;
	task->data_phase = TASKFILE_NO_DATA;
L
Linus Torvalds 已提交
430

431
	rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
432
	rq->cmd_flags |= REQ_SOFTBARRIER;
433
	rq->special = task;
L
Linus Torvalds 已提交
434 435
}

436 437
ide_devset_get(multcount, mult_count);

L
Linus Torvalds 已提交
438 439 440 441 442 443
/*
 * This is tightly woven into the driver->do_special can not touch.
 * DON'T do it again until a total personality rewrite is committed.
 */
static int set_multcount(ide_drive_t *drive, int arg)
{
444 445
	struct request *rq;
	int error;
L
Linus Torvalds 已提交
446

447
	if (arg < 0 || arg > (drive->id[ATA_ID_MAX_MULTSECT] & 0xff))
448 449
		return -EINVAL;

L
Linus Torvalds 已提交
450 451
	if (drive->special.b.set_multmode)
		return -EBUSY;
452

453 454
	rq = blk_get_request(drive->queue, READ, __GFP_WAIT);
	rq->cmd_type = REQ_TYPE_ATA_TASKFILE;
455

L
Linus Torvalds 已提交
456 457
	drive->mult_req = arg;
	drive->special.b.set_multmode = 1;
458 459
	error = blk_execute_rq(drive->queue, NULL, rq, 0);
	blk_put_request(rq);
460

L
Linus Torvalds 已提交
461 462 463
	return (drive->mult_count == arg) ? 0 : -EIO;
}

B
Bartlomiej Zolnierkiewicz 已提交
464
ide_devset_get_flag(nowerr, IDE_DFLAG_NOWERR);
465

L
Linus Torvalds 已提交
466 467
static int set_nowerr(ide_drive_t *drive, int arg)
{
468 469 470
	if (arg < 0 || arg > 1)
		return -EINVAL;

B
Bartlomiej Zolnierkiewicz 已提交
471 472 473 474 475
	if (arg)
		drive->dev_flags |= IDE_DFLAG_NOWERR;
	else
		drive->dev_flags &= ~IDE_DFLAG_NOWERR;

L
Linus Torvalds 已提交
476
	drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT;
B
Bartlomiej Zolnierkiewicz 已提交
477

L
Linus Torvalds 已提交
478 479 480
	return 0;
}

481 482 483 484 485 486 487 488 489 490 491 492 493
static int ide_do_setfeature(ide_drive_t *drive, u8 feature, u8 nsect)
{
	ide_task_t task;

	memset(&task, 0, sizeof(task));
	task.tf.feature = feature;
	task.tf.nsect   = nsect;
	task.tf.command = ATA_CMD_SET_FEATURES;
	task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;

	return ide_no_data_taskfile(drive, &task);
}

494 495
static void update_ordered(ide_drive_t *drive)
{
496
	u16 *id = drive->id;
497 498 499
	unsigned ordered = QUEUE_ORDERED_NONE;
	prepare_flush_fn *prep_fn = NULL;

B
Bartlomiej Zolnierkiewicz 已提交
500
	if (drive->dev_flags & IDE_DFLAG_WCACHE) {
501 502 503 504 505 506 507 508 509 510
		unsigned long long capacity;
		int barrier;
		/*
		 * We must avoid issuing commands a drive does not
		 * understand or we may crash it. We check flush cache
		 * is supported. We also check we have the LBA48 flush
		 * cache if the drive capacity is too large. By this
		 * time we have trimmed the drive capacity if LBA48 is
		 * not available so we don't need to recheck that.
		 */
511
		capacity = ide_disk_capacity(drive);
B
Bartlomiej Zolnierkiewicz 已提交
512 513 514 515
		barrier = ata_id_flush_enabled(id) &&
			(drive->dev_flags & IDE_DFLAG_NOFLUSH) == 0 &&
			((drive->dev_flags & IDE_DFLAG_LBA48) == 0 ||
			 capacity <= (1ULL << 28) ||
516
			 ata_id_flush_ext_enabled(id));
517 518

		printk(KERN_INFO "%s: cache flushes %ssupported\n",
519
		       drive->name, barrier ? "" : "not ");
520 521 522 523 524 525 526 527 528 529 530

		if (barrier) {
			ordered = QUEUE_ORDERED_DRAIN_FLUSH;
			prep_fn = idedisk_prepare_flush;
		}
	} else
		ordered = QUEUE_ORDERED_DRAIN;

	blk_queue_ordered(drive->queue, ordered, prep_fn);
}

B
Bartlomiej Zolnierkiewicz 已提交
531
ide_devset_get_flag(wcache, IDE_DFLAG_WCACHE);
532 533

static int set_wcache(ide_drive_t *drive, int arg)
L
Linus Torvalds 已提交
534
{
535
	int err = 1;
L
Linus Torvalds 已提交
536

537 538 539
	if (arg < 0 || arg > 1)
		return -EINVAL;

540
	if (ata_id_flush_enabled(drive->id)) {
541 542
		err = ide_do_setfeature(drive,
			arg ? SETFEATURES_WC_ON : SETFEATURES_WC_OFF, 0);
B
Bartlomiej Zolnierkiewicz 已提交
543 544 545 546 547 548
		if (err == 0) {
			if (arg)
				drive->dev_flags |= IDE_DFLAG_WCACHE;
			else
				drive->dev_flags &= ~IDE_DFLAG_WCACHE;
		}
549
	}
L
Linus Torvalds 已提交
550

551
	update_ordered(drive);
L
Linus Torvalds 已提交
552

553
	return err;
L
Linus Torvalds 已提交
554 555
}

556
static int do_idedisk_flushcache(ide_drive_t *drive)
L
Linus Torvalds 已提交
557 558 559 560
{
	ide_task_t args;

	memset(&args, 0, sizeof(ide_task_t));
561
	if (ata_id_flush_ext_enabled(drive->id))
562
		args.tf.command = ATA_CMD_FLUSH_EXT;
L
Linus Torvalds 已提交
563
	else
564
		args.tf.command = ATA_CMD_FLUSH;
565
	args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
566
	return ide_no_data_taskfile(drive, &args);
L
Linus Torvalds 已提交
567 568
}

569 570
ide_devset_get(acoustic, acoustic);

571
static int set_acoustic(ide_drive_t *drive, int arg)
L
Linus Torvalds 已提交
572
{
573 574 575
	if (arg < 0 || arg > 254)
		return -EINVAL;

576 577 578
	ide_do_setfeature(drive,
		arg ? SETFEATURES_AAM_ON : SETFEATURES_AAM_OFF, arg);

L
Linus Torvalds 已提交
579
	drive->acoustic = arg;
580

L
Linus Torvalds 已提交
581 582 583
	return 0;
}

B
Bartlomiej Zolnierkiewicz 已提交
584
ide_devset_get_flag(addressing, IDE_DFLAG_LBA48);
585

L
Linus Torvalds 已提交
586 587 588 589 590 591
/*
 * drive->addressing:
 *	0: 28-bit
 *	1: 48-bit
 *	2: 48-bit capable doing 28-bit
 */
592
static int set_addressing(ide_drive_t *drive, int arg)
L
Linus Torvalds 已提交
593
{
594 595 596
	if (arg < 0 || arg > 2)
		return -EINVAL;

597 598
	if (arg && ((drive->hwif->host_flags & IDE_HFLAG_NO_LBA48) ||
	    ata_id_lba48_enabled(drive->id) == 0))
599
		return -EIO;
600

601 602 603
	if (arg == 2)
		arg = 0;

B
Bartlomiej Zolnierkiewicz 已提交
604 605 606 607
	if (arg)
		drive->dev_flags |= IDE_DFLAG_LBA48;
	else
		drive->dev_flags &= ~IDE_DFLAG_LBA48;
608

L
Linus Torvalds 已提交
609 610 611
	return 0;
}

612 613 614 615
ide_ext_devset_rw(acoustic, acoustic);
ide_ext_devset_rw(address, addressing);
ide_ext_devset_rw(multcount, multcount);
ide_ext_devset_rw(wcache, wcache);
616

617
ide_ext_devset_rw_sync(nowerr, nowerr);
618

619
static void idedisk_setup(ide_drive_t *drive)
L
Linus Torvalds 已提交
620
{
621
	struct ide_disk_obj *idkp = drive->driver_data;
622
	ide_hwif_t *hwif = drive->hwif;
623 624
	u16 *id = drive->id;
	char *m = (char *)&id[ATA_ID_PROD];
L
Linus Torvalds 已提交
625 626
	unsigned long long capacity;

627
	ide_proc_register_driver(drive, idkp->driver);
L
Linus Torvalds 已提交
628

B
Bartlomiej Zolnierkiewicz 已提交
629
	if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0)
L
Linus Torvalds 已提交
630 631
		return;

B
Bartlomiej Zolnierkiewicz 已提交
632
	if (drive->dev_flags & IDE_DFLAG_REMOVABLE) {
L
Linus Torvalds 已提交
633
		/*
634
		 * Removable disks (eg. SYQUEST); ignore 'WD' drives
L
Linus Torvalds 已提交
635
		 */
636
		if (m[0] != 'W' || m[1] != 'D')
B
Bartlomiej Zolnierkiewicz 已提交
637
			drive->dev_flags |= IDE_DFLAG_DOORLOCKING;
L
Linus Torvalds 已提交
638 639
	}

640
	(void)set_addressing(drive, 1);
L
Linus Torvalds 已提交
641

B
Bartlomiej Zolnierkiewicz 已提交
642
	if (drive->dev_flags & IDE_DFLAG_LBA48) {
L
Linus Torvalds 已提交
643 644 645 646 647 648 649 650
		int max_s = 2048;

		if (max_s > hwif->rqsize)
			max_s = hwif->rqsize;

		blk_queue_max_sectors(drive->queue, max_s);
	}

651 652
	printk(KERN_INFO "%s: max request size: %dKiB\n", drive->name,
			 drive->queue->max_sectors / 2);
L
Linus Torvalds 已提交
653 654

	/* calculate drive capacity, and select LBA if possible */
655
	init_idedisk_capacity(drive);
L
Linus Torvalds 已提交
656 657

	/* limit drive capacity to 137GB if LBA48 cannot be used */
B
Bartlomiej Zolnierkiewicz 已提交
658 659
	if ((drive->dev_flags & IDE_DFLAG_LBA48) == 0 &&
	    drive->capacity64 > 1ULL << 28) {
L
Linus Torvalds 已提交
660 661 662 663 664 665 666
		printk(KERN_WARNING "%s: cannot use LBA48 - full capacity "
		       "%llu sectors (%llu MB)\n",
		       drive->name, (unsigned long long)drive->capacity64,
		       sectors_to_MB(drive->capacity64));
		drive->capacity64 = 1ULL << 28;
	}

B
Bartlomiej Zolnierkiewicz 已提交
667 668
	if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) &&
	    (drive->dev_flags & IDE_DFLAG_LBA48)) {
L
Linus Torvalds 已提交
669
		if (drive->capacity64 > 1ULL << 28) {
670 671 672
			printk(KERN_INFO "%s: cannot use LBA48 DMA - PIO mode"
					 " will be used for accessing sectors "
					 "> %u\n", drive->name, 1 << 28);
L
Linus Torvalds 已提交
673
		} else
B
Bartlomiej Zolnierkiewicz 已提交
674
			drive->dev_flags &= ~IDE_DFLAG_LBA48;
L
Linus Torvalds 已提交
675 676 677 678 679 680
	}

	/*
	 * if possible, give fdisk access to more of the drive,
	 * by correcting bios_cyls:
	 */
681
	capacity = ide_disk_capacity(drive);
682

B
Bartlomiej Zolnierkiewicz 已提交
683
	if ((drive->dev_flags & IDE_DFLAG_FORCED_GEOM) == 0) {
684
		if (ata_id_lba48_enabled(drive->id)) {
L
Linus Torvalds 已提交
685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
			/* compatibility */
			drive->bios_sect = 63;
			drive->bios_head = 255;
		}

		if (drive->bios_sect && drive->bios_head) {
			unsigned int cap0 = capacity; /* truncate to 32 bits */
			unsigned int cylsz, cyl;

			if (cap0 != capacity)
				drive->bios_cyl = 65535;
			else {
				cylsz = drive->bios_sect * drive->bios_head;
				cyl = cap0 / cylsz;
				if (cyl > 65535)
					cyl = 65535;
				if (cyl > drive->bios_cyl)
					drive->bios_cyl = cyl;
			}
		}
	}
	printk(KERN_INFO "%s: %llu sectors (%llu MB)",
			 drive->name, capacity, sectors_to_MB(capacity));

	/* Only print cache size when it was specified */
710 711
	if (id[ATA_ID_BUF_SIZE])
		printk(KERN_CONT " w/%dKiB Cache", id[ATA_ID_BUF_SIZE] / 2);
L
Linus Torvalds 已提交
712

713 714
	printk(KERN_CONT ", CHS=%d/%d/%d\n",
			 drive->bios_cyl, drive->bios_head, drive->bios_sect);
L
Linus Torvalds 已提交
715 716

	/* write cache enabled? */
717
	if ((id[ATA_ID_CSFO] & 1) || ata_id_wcache_enabled(id))
B
Bartlomiej Zolnierkiewicz 已提交
718
		drive->dev_flags |= IDE_DFLAG_WCACHE;
L
Linus Torvalds 已提交
719

720
	set_wcache(drive, 1);
L
Linus Torvalds 已提交
721 722 723 724
}

static void ide_cacheflush_p(ide_drive_t *drive)
{
B
Bartlomiej Zolnierkiewicz 已提交
725 726
	if (ata_id_flush_enabled(drive->id) == 0 ||
	    (drive->dev_flags & IDE_DFLAG_WCACHE) == 0)
L
Linus Torvalds 已提交
727 728 729 730 731 732
		return;

	if (do_idedisk_flushcache(drive))
		printk(KERN_INFO "%s: wcache flush failed!\n", drive->name);
}

733
static void ide_disk_remove(ide_drive_t *drive)
L
Linus Torvalds 已提交
734 735 736 737
{
	struct ide_disk_obj *idkp = drive->driver_data;
	struct gendisk *g = idkp->disk;

738
	ide_proc_unregister_driver(drive, idkp->driver);
739

L
Linus Torvalds 已提交
740 741
	del_gendisk(g);

742 743
	ide_cacheflush_p(drive);

L
Linus Torvalds 已提交
744 745 746 747 748 749 750 751 752 753 754 755 756 757 758
	ide_disk_put(idkp);
}

static void ide_disk_release(struct kref *kref)
{
	struct ide_disk_obj *idkp = to_ide_disk(kref);
	ide_drive_t *drive = idkp->drive;
	struct gendisk *g = idkp->disk;

	drive->driver_data = NULL;
	g->private_data = NULL;
	put_disk(g);
	kfree(idkp);
}

759
static int ide_disk_probe(ide_drive_t *drive);
L
Linus Torvalds 已提交
760

L
Lee Trager 已提交
761 762 763 764 765 766 767
/*
 * On HPA drives the capacity needs to be
 * reinitilized on resume otherwise the disk
 * can not be used and a hard reset is required
 */
static void ide_disk_resume(ide_drive_t *drive)
{
768
	if (ata_id_hpa_enabled(drive->id))
L
Lee Trager 已提交
769 770 771
		init_idedisk_capacity(drive);
}

772
static void ide_device_shutdown(ide_drive_t *drive)
L
Linus Torvalds 已提交
773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793
{
#ifdef	CONFIG_ALPHA
	/* On Alpha, halt(8) doesn't actually turn the machine off,
	   it puts you into the sort of firmware monitor. Typically,
	   it's used to boot another kernel image, so it's not much
	   different from reboot(8). Therefore, we don't need to
	   spin down the disk in this case, especially since Alpha
	   firmware doesn't handle disks in standby mode properly.
	   On the other hand, it's reasonably safe to turn the power
	   off when the shutdown process reaches the firmware prompt,
	   as the firmware initialization takes rather long time -
	   at least 10 seconds, which should be sufficient for
	   the disk to expire its write cache. */
	if (system_state != SYSTEM_POWER_OFF) {
#else
	if (system_state == SYSTEM_RESTART) {
#endif
		ide_cacheflush_p(drive);
		return;
	}

794 795
	printk(KERN_INFO "Shutdown: %s\n", drive->name);

796
	drive->gendev.bus->suspend(&drive->gendev, PMSG_SUSPEND);
L
Linus Torvalds 已提交
797 798 799 800
}

static ide_driver_t idedisk_driver = {
	.gen_driver = {
801
		.owner		= THIS_MODULE,
802 803
		.name		= "ide-disk",
		.bus		= &ide_bus_type,
L
Linus Torvalds 已提交
804
	},
805 806
	.probe			= ide_disk_probe,
	.remove			= ide_disk_remove,
L
Lee Trager 已提交
807
	.resume			= ide_disk_resume,
808
	.shutdown		= ide_device_shutdown,
L
Linus Torvalds 已提交
809 810 811 812
	.version		= IDEDISK_VERSION,
	.do_request		= ide_do_rw_disk,
	.end_request		= ide_end_request,
	.error			= __ide_error,
813
#ifdef CONFIG_IDE_PROC_FS
814 815
	.proc			= ide_disk_proc,
	.settings		= ide_disk_settings,
816
#endif
L
Linus Torvalds 已提交
817 818
};

819 820 821 822 823
static int idedisk_set_doorlock(ide_drive_t *drive, int on)
{
	ide_task_t task;

	memset(&task, 0, sizeof(task));
824
	task.tf.command = on ? ATA_CMD_MEDIA_LOCK : ATA_CMD_MEDIA_UNLOCK;
825
	task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE;
826 827 828 829

	return ide_no_data_taskfile(drive, &task);
}

L
Linus Torvalds 已提交
830 831 832 833 834 835
static int idedisk_open(struct inode *inode, struct file *filp)
{
	struct gendisk *disk = inode->i_bdev->bd_disk;
	struct ide_disk_obj *idkp;
	ide_drive_t *drive;

836 837
	idkp = ide_disk_get(disk);
	if (idkp == NULL)
L
Linus Torvalds 已提交
838 839 840 841
		return -ENXIO;

	drive = idkp->drive;

842 843
	idkp->openers++;

B
Bartlomiej Zolnierkiewicz 已提交
844
	if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) {
L
Linus Torvalds 已提交
845 846 847 848 849 850
		check_disk_change(inode->i_bdev);
		/*
		 * Ignore the return code from door_lock,
		 * since the open() has already succeeded,
		 * and the door_lock is irrelevant at this point.
		 */
B
Bartlomiej Zolnierkiewicz 已提交
851 852 853
		if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) &&
		    idedisk_set_doorlock(drive, 1))
			drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
L
Linus Torvalds 已提交
854 855 856 857 858 859 860 861 862 863
	}
	return 0;
}

static int idedisk_release(struct inode *inode, struct file *filp)
{
	struct gendisk *disk = inode->i_bdev->bd_disk;
	struct ide_disk_obj *idkp = ide_disk_g(disk);
	ide_drive_t *drive = idkp->drive;

864
	if (idkp->openers == 1)
L
Linus Torvalds 已提交
865
		ide_cacheflush_p(drive);
866

B
Bartlomiej Zolnierkiewicz 已提交
867 868 869 870
	if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) {
		if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) &&
		    idedisk_set_doorlock(drive, 0))
			drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING;
L
Linus Torvalds 已提交
871
	}
872 873

	idkp->openers--;
L
Linus Torvalds 已提交
874 875 876 877 878 879

	ide_disk_put(idkp);

	return 0;
}

880 881 882 883 884 885 886 887 888 889 890
static int idedisk_getgeo(struct block_device *bdev, struct hd_geometry *geo)
{
	struct ide_disk_obj *idkp = ide_disk_g(bdev->bd_disk);
	ide_drive_t *drive = idkp->drive;

	geo->heads = drive->bios_head;
	geo->sectors = drive->bios_sect;
	geo->cylinders = (u16)drive->bios_cyl; /* truncate */
	return 0;
}

L
Linus Torvalds 已提交
891 892 893 894 895 896
static int idedisk_media_changed(struct gendisk *disk)
{
	struct ide_disk_obj *idkp = ide_disk_g(disk);
	ide_drive_t *drive = idkp->drive;

	/* do not scan partitions twice if this is a removable device */
B
Bartlomiej Zolnierkiewicz 已提交
897 898
	if (drive->dev_flags & IDE_DFLAG_ATTACH) {
		drive->dev_flags &= ~IDE_DFLAG_ATTACH;
L
Linus Torvalds 已提交
899 900
		return 0;
	}
B
Bartlomiej Zolnierkiewicz 已提交
901

L
Linus Torvalds 已提交
902
	/* if removable, always assume it was changed */
B
Bartlomiej Zolnierkiewicz 已提交
903
	return !!(drive->dev_flags & IDE_DFLAG_REMOVABLE);
L
Linus Torvalds 已提交
904 905 906 907 908
}

static int idedisk_revalidate_disk(struct gendisk *disk)
{
	struct ide_disk_obj *idkp = ide_disk_g(disk);
909
	set_capacity(disk, ide_disk_capacity(idkp->drive));
L
Linus Torvalds 已提交
910 911 912 913
	return 0;
}

static struct block_device_operations idedisk_ops = {
914 915 916
	.owner			= THIS_MODULE,
	.open			= idedisk_open,
	.release		= idedisk_release,
917
	.ioctl			= ide_disk_ioctl,
918 919 920
	.getgeo			= idedisk_getgeo,
	.media_changed		= idedisk_media_changed,
	.revalidate_disk	= idedisk_revalidate_disk
L
Linus Torvalds 已提交
921 922 923 924
};

MODULE_DESCRIPTION("ATA DISK Driver");

925
static int ide_disk_probe(ide_drive_t *drive)
L
Linus Torvalds 已提交
926 927 928 929 930 931 932
{
	struct ide_disk_obj *idkp;
	struct gendisk *g;

	/* strstr("foo", "") is non-NULL */
	if (!strstr("ide-disk", drive->driver_req))
		goto failed;
933

L
Linus Torvalds 已提交
934 935 936
	if (drive->media != ide_disk)
		goto failed;

937
	idkp = kzalloc(sizeof(*idkp), GFP_KERNEL);
L
Linus Torvalds 已提交
938 939 940
	if (!idkp)
		goto failed;

941
	g = alloc_disk_node(IDE_DISK_MINORS, hwif_to_node(drive->hwif));
L
Linus Torvalds 已提交
942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957
	if (!g)
		goto out_free_idkp;

	ide_init_disk(g, drive);

	kref_init(&idkp->kref);

	idkp->drive = drive;
	idkp->driver = &idedisk_driver;
	idkp->disk = g;

	g->private_data = &idkp->driver;

	drive->driver_data = idkp;

	idedisk_setup(drive);
958 959
	if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 &&
	    (drive->head == 0 || drive->head > 16)) {
L
Linus Torvalds 已提交
960 961
		printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n",
			drive->name, drive->head);
B
Bartlomiej Zolnierkiewicz 已提交
962
		drive->dev_flags &= ~IDE_DFLAG_ATTACH;
L
Linus Torvalds 已提交
963
	} else
B
Bartlomiej Zolnierkiewicz 已提交
964
		drive->dev_flags |= IDE_DFLAG_ATTACH;
965

966
	g->minors = IDE_DISK_MINORS;
L
Linus Torvalds 已提交
967
	g->driverfs_dev = &drive->gendev;
968
	g->flags |= GENHD_FL_EXT_DEVT;
B
Bartlomiej Zolnierkiewicz 已提交
969 970
	if (drive->dev_flags & IDE_DFLAG_REMOVABLE)
		g->flags = GENHD_FL_REMOVABLE;
971
	set_capacity(g, ide_disk_capacity(drive));
L
Linus Torvalds 已提交
972 973 974 975 976 977 978
	g->fops = &idedisk_ops;
	add_disk(g);
	return 0;

out_free_idkp:
	kfree(idkp);
failed:
979
	return -ENODEV;
L
Linus Torvalds 已提交
980 981
}

982
static void __exit idedisk_exit(void)
L
Linus Torvalds 已提交
983
{
984
	driver_unregister(&idedisk_driver.gen_driver);
L
Linus Torvalds 已提交
985 986
}

987
static int __init idedisk_init(void)
L
Linus Torvalds 已提交
988
{
989
	return driver_register(&idedisk_driver.gen_driver);
L
Linus Torvalds 已提交
990 991
}

992
MODULE_ALIAS("ide:*m-disk*");
993
MODULE_ALIAS("ide-disk");
L
Linus Torvalds 已提交
994 995 996
module_init(idedisk_init);
module_exit(idedisk_exit);
MODULE_LICENSE("GPL");