diff options
Diffstat (limited to 'drivers/ide/ide-disk.c')
-rw-r--r-- | drivers/ide/ide-disk.c | 572 |
1 files changed, 180 insertions, 392 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 07ef88bd109b..3853bde8eedc 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
@@ -30,10 +30,8 @@ | |||
30 | #include <linux/delay.h> | 30 | #include <linux/delay.h> |
31 | #include <linux/mutex.h> | 31 | #include <linux/mutex.h> |
32 | #include <linux/leds.h> | 32 | #include <linux/leds.h> |
33 | |||
34 | #define _IDE_DISK | ||
35 | |||
36 | #include <linux/ide.h> | 33 | #include <linux/ide.h> |
34 | #include <linux/hdreg.h> | ||
37 | 35 | ||
38 | #include <asm/byteorder.h> | 36 | #include <asm/byteorder.h> |
39 | #include <asm/irq.h> | 37 | #include <asm/irq.h> |
@@ -41,21 +39,18 @@ | |||
41 | #include <asm/io.h> | 39 | #include <asm/io.h> |
42 | #include <asm/div64.h> | 40 | #include <asm/div64.h> |
43 | 41 | ||
44 | struct ide_disk_obj { | 42 | #if !defined(CONFIG_DEBUG_BLOCK_EXT_DEVT) |
45 | ide_drive_t *drive; | 43 | #define IDE_DISK_MINORS (1 << PARTN_BITS) |
46 | ide_driver_t *driver; | 44 | #else |
47 | struct gendisk *disk; | 45 | #define IDE_DISK_MINORS 0 |
48 | struct kref kref; | 46 | #endif |
49 | unsigned int openers; /* protected by BKL for now */ | 47 | |
50 | }; | 48 | #include "ide-disk.h" |
51 | 49 | ||
52 | static DEFINE_MUTEX(idedisk_ref_mutex); | 50 | static DEFINE_MUTEX(idedisk_ref_mutex); |
53 | 51 | ||
54 | #define to_ide_disk(obj) container_of(obj, struct ide_disk_obj, kref) | 52 | #define to_ide_disk(obj) container_of(obj, struct ide_disk_obj, kref) |
55 | 53 | ||
56 | #define ide_disk_g(disk) \ | ||
57 | container_of((disk)->private_data, struct ide_disk_obj, driver) | ||
58 | |||
59 | static void ide_disk_release(struct kref *); | 54 | static void ide_disk_release(struct kref *); |
60 | 55 | ||
61 | static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) | 56 | static struct ide_disk_obj *ide_disk_get(struct gendisk *disk) |
@@ -84,68 +79,19 @@ static void ide_disk_put(struct ide_disk_obj *idkp) | |||
84 | mutex_unlock(&idedisk_ref_mutex); | 79 | mutex_unlock(&idedisk_ref_mutex); |
85 | } | 80 | } |
86 | 81 | ||
87 | /* | ||
88 | * lba_capacity_is_ok() performs a sanity check on the claimed "lba_capacity" | ||
89 | * value for this drive (from its reported identification information). | ||
90 | * | ||
91 | * Returns: 1 if lba_capacity looks sensible | ||
92 | * 0 otherwise | ||
93 | * | ||
94 | * It is called only once for each drive. | ||
95 | */ | ||
96 | static int lba_capacity_is_ok(struct hd_driveid *id) | ||
97 | { | ||
98 | unsigned long lba_sects, chs_sects, head, tail; | ||
99 | |||
100 | /* No non-LBA info .. so valid! */ | ||
101 | if (id->cyls == 0) | ||
102 | return 1; | ||
103 | |||
104 | /* | ||
105 | * The ATA spec tells large drives to return | ||
106 | * C/H/S = 16383/16/63 independent of their size. | ||
107 | * Some drives can be jumpered to use 15 heads instead of 16. | ||
108 | * Some drives can be jumpered to use 4092 cyls instead of 16383. | ||
109 | */ | ||
110 | if ((id->cyls == 16383 | ||
111 | || (id->cyls == 4092 && id->cur_cyls == 16383)) && | ||
112 | id->sectors == 63 && | ||
113 | (id->heads == 15 || id->heads == 16) && | ||
114 | (id->lba_capacity >= 16383*63*id->heads)) | ||
115 | return 1; | ||
116 | |||
117 | lba_sects = id->lba_capacity; | ||
118 | chs_sects = id->cyls * id->heads * id->sectors; | ||
119 | |||
120 | /* perform a rough sanity check on lba_sects: within 10% is OK */ | ||
121 | if ((lba_sects - chs_sects) < chs_sects/10) | ||
122 | return 1; | ||
123 | |||
124 | /* some drives have the word order reversed */ | ||
125 | head = ((lba_sects >> 16) & 0xffff); | ||
126 | tail = (lba_sects & 0xffff); | ||
127 | lba_sects = (head | (tail << 16)); | ||
128 | if ((lba_sects - chs_sects) < chs_sects/10) { | ||
129 | id->lba_capacity = lba_sects; | ||
130 | return 1; /* lba_capacity is (now) good */ | ||
131 | } | ||
132 | |||
133 | return 0; /* lba_capacity value may be bad */ | ||
134 | } | ||
135 | |||
136 | static const u8 ide_rw_cmds[] = { | 82 | static const u8 ide_rw_cmds[] = { |
137 | WIN_MULTREAD, | 83 | ATA_CMD_READ_MULTI, |
138 | WIN_MULTWRITE, | 84 | ATA_CMD_WRITE_MULTI, |
139 | WIN_MULTREAD_EXT, | 85 | ATA_CMD_READ_MULTI_EXT, |
140 | WIN_MULTWRITE_EXT, | 86 | ATA_CMD_WRITE_MULTI_EXT, |
141 | WIN_READ, | 87 | ATA_CMD_PIO_READ, |
142 | WIN_WRITE, | 88 | ATA_CMD_PIO_WRITE, |
143 | WIN_READ_EXT, | 89 | ATA_CMD_PIO_READ_EXT, |
144 | WIN_WRITE_EXT, | 90 | ATA_CMD_PIO_WRITE_EXT, |
145 | WIN_READDMA, | 91 | ATA_CMD_READ, |
146 | WIN_WRITEDMA, | 92 | ATA_CMD_WRITE, |
147 | WIN_READDMA_EXT, | 93 | ATA_CMD_READ_EXT, |
148 | WIN_WRITEDMA_EXT, | 94 | ATA_CMD_WRITE_EXT, |
149 | }; | 95 | }; |
150 | 96 | ||
151 | static const u8 ide_data_phases[] = { | 97 | static const u8 ide_data_phases[] = { |
@@ -185,9 +131,9 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, | |||
185 | sector_t block) | 131 | sector_t block) |
186 | { | 132 | { |
187 | ide_hwif_t *hwif = HWIF(drive); | 133 | ide_hwif_t *hwif = HWIF(drive); |
188 | unsigned int dma = drive->using_dma; | ||
189 | u16 nsectors = (u16)rq->nr_sectors; | 134 | u16 nsectors = (u16)rq->nr_sectors; |
190 | u8 lba48 = (drive->addressing == 1) ? 1 : 0; | 135 | u8 lba48 = !!(drive->dev_flags & IDE_DFLAG_LBA48); |
136 | u8 dma = !!(drive->dev_flags & IDE_DFLAG_USING_DMA); | ||
191 | ide_task_t task; | 137 | ide_task_t task; |
192 | struct ide_taskfile *tf = &task.tf; | 138 | struct ide_taskfile *tf = &task.tf; |
193 | ide_startstop_t rc; | 139 | ide_startstop_t rc; |
@@ -207,7 +153,7 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, | |||
207 | memset(&task, 0, sizeof(task)); | 153 | memset(&task, 0, sizeof(task)); |
208 | task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 154 | task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; |
209 | 155 | ||
210 | if (drive->select.b.lba) { | 156 | if (drive->dev_flags & IDE_DFLAG_LBA) { |
211 | if (lba48) { | 157 | if (lba48) { |
212 | pr_debug("%s: LBA=0x%012llx\n", drive->name, | 158 | pr_debug("%s: LBA=0x%012llx\n", drive->name, |
213 | (unsigned long long)block); | 159 | (unsigned long long)block); |
@@ -232,6 +178,8 @@ static ide_startstop_t __ide_do_rw_disk(ide_drive_t *drive, struct request *rq, | |||
232 | tf->lbah = block >>= 8; | 178 | tf->lbah = block >>= 8; |
233 | tf->device = (block >> 8) & 0xf; | 179 | tf->device = (block >> 8) & 0xf; |
234 | } | 180 | } |
181 | |||
182 | tf->device |= ATA_LBA; | ||
235 | } else { | 183 | } else { |
236 | unsigned int sect, head, cyl, track; | 184 | unsigned int sect, head, cyl, track; |
237 | 185 | ||
@@ -282,7 +230,7 @@ static ide_startstop_t ide_do_rw_disk(ide_drive_t *drive, struct request *rq, | |||
282 | { | 230 | { |
283 | ide_hwif_t *hwif = HWIF(drive); | 231 | ide_hwif_t *hwif = HWIF(drive); |
284 | 232 | ||
285 | BUG_ON(drive->blocked); | 233 | BUG_ON(drive->dev_flags & IDE_DFLAG_BLOCKED); |
286 | 234 | ||
287 | if (!blk_fs_request(rq)) { | 235 | if (!blk_fs_request(rq)) { |
288 | blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command"); | 236 | blk_dump_rq_flags(rq, "ide_do_rw_disk - bad command"); |
@@ -316,9 +264,9 @@ static u64 idedisk_read_native_max_address(ide_drive_t *drive, int lba48) | |||
316 | /* Create IDE/ATA command request structure */ | 264 | /* Create IDE/ATA command request structure */ |
317 | memset(&args, 0, sizeof(ide_task_t)); | 265 | memset(&args, 0, sizeof(ide_task_t)); |
318 | if (lba48) | 266 | if (lba48) |
319 | tf->command = WIN_READ_NATIVE_MAX_EXT; | 267 | tf->command = ATA_CMD_READ_NATIVE_MAX_EXT; |
320 | else | 268 | else |
321 | tf->command = WIN_READ_NATIVE_MAX; | 269 | tf->command = ATA_CMD_READ_NATIVE_MAX; |
322 | tf->device = ATA_LBA; | 270 | tf->device = ATA_LBA; |
323 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 271 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; |
324 | if (lba48) | 272 | if (lba48) |
@@ -353,10 +301,10 @@ static u64 idedisk_set_max_address(ide_drive_t *drive, u64 addr_req, int lba48) | |||
353 | tf->hob_lbal = (addr_req >>= 8) & 0xff; | 301 | tf->hob_lbal = (addr_req >>= 8) & 0xff; |
354 | tf->hob_lbam = (addr_req >>= 8) & 0xff; | 302 | tf->hob_lbam = (addr_req >>= 8) & 0xff; |
355 | tf->hob_lbah = (addr_req >>= 8) & 0xff; | 303 | tf->hob_lbah = (addr_req >>= 8) & 0xff; |
356 | tf->command = WIN_SET_MAX_EXT; | 304 | tf->command = ATA_CMD_SET_MAX_EXT; |
357 | } else { | 305 | } else { |
358 | tf->device = (addr_req >>= 8) & 0x0f; | 306 | tf->device = (addr_req >>= 8) & 0x0f; |
359 | tf->command = WIN_SET_MAX; | 307 | tf->command = ATA_CMD_SET_MAX; |
360 | } | 308 | } |
361 | tf->device |= ATA_LBA; | 309 | tf->device |= ATA_LBA; |
362 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 310 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; |
@@ -379,25 +327,6 @@ static unsigned long long sectors_to_MB(unsigned long long n) | |||
379 | } | 327 | } |
380 | 328 | ||
381 | /* | 329 | /* |
382 | * Bits 10 of command_set_1 and cfs_enable_1 must be equal, | ||
383 | * so on non-buggy drives we need test only one. | ||
384 | * However, we should also check whether these fields are valid. | ||
385 | */ | ||
386 | static inline int idedisk_supports_hpa(const struct hd_driveid *id) | ||
387 | { | ||
388 | return (id->command_set_1 & 0x0400) && (id->cfs_enable_1 & 0x0400); | ||
389 | } | ||
390 | |||
391 | /* | ||
392 | * The same here. | ||
393 | */ | ||
394 | static inline int idedisk_supports_lba48(const struct hd_driveid *id) | ||
395 | { | ||
396 | return (id->command_set_2 & 0x0400) && (id->cfs_enable_2 & 0x0400) | ||
397 | && id->lba_capacity_2; | ||
398 | } | ||
399 | |||
400 | /* | ||
401 | * Some disks report total number of sectors instead of | 330 | * Some disks report total number of sectors instead of |
402 | * maximum sector address. We list them here. | 331 | * maximum sector address. We list them here. |
403 | */ | 332 | */ |
@@ -411,7 +340,7 @@ static const struct drive_list_entry hpa_list[] = { | |||
411 | static void idedisk_check_hpa(ide_drive_t *drive) | 340 | static void idedisk_check_hpa(ide_drive_t *drive) |
412 | { | 341 | { |
413 | unsigned long long capacity, set_max; | 342 | unsigned long long capacity, set_max; |
414 | int lba48 = idedisk_supports_lba48(drive->id); | 343 | int lba48 = ata_id_lba48_enabled(drive->id); |
415 | 344 | ||
416 | capacity = drive->capacity64; | 345 | capacity = drive->capacity64; |
417 | 346 | ||
@@ -447,139 +376,40 @@ static void idedisk_check_hpa(ide_drive_t *drive) | |||
447 | 376 | ||
448 | static void init_idedisk_capacity(ide_drive_t *drive) | 377 | static void init_idedisk_capacity(ide_drive_t *drive) |
449 | { | 378 | { |
450 | struct hd_driveid *id = drive->id; | 379 | u16 *id = drive->id; |
451 | /* | 380 | int lba; |
452 | * If this drive supports the Host Protected Area feature set, | ||
453 | * then we may need to change our opinion about the drive's capacity. | ||
454 | */ | ||
455 | int hpa = idedisk_supports_hpa(id); | ||
456 | 381 | ||
457 | if (idedisk_supports_lba48(id)) { | 382 | if (ata_id_lba48_enabled(id)) { |
458 | /* drive speaks 48-bit LBA */ | 383 | /* drive speaks 48-bit LBA */ |
459 | drive->select.b.lba = 1; | 384 | lba = 1; |
460 | drive->capacity64 = id->lba_capacity_2; | 385 | drive->capacity64 = ata_id_u64(id, ATA_ID_LBA_CAPACITY_2); |
461 | if (hpa) | 386 | } else if (ata_id_has_lba(id) && ata_id_is_lba_capacity_ok(id)) { |
462 | idedisk_check_hpa(drive); | ||
463 | } else if ((id->capability & 2) && lba_capacity_is_ok(id)) { | ||
464 | /* drive speaks 28-bit LBA */ | 387 | /* drive speaks 28-bit LBA */ |
465 | drive->select.b.lba = 1; | 388 | lba = 1; |
466 | drive->capacity64 = id->lba_capacity; | 389 | drive->capacity64 = ata_id_u32(id, ATA_ID_LBA_CAPACITY); |
467 | if (hpa) | ||
468 | idedisk_check_hpa(drive); | ||
469 | } else { | 390 | } else { |
470 | /* drive speaks boring old 28-bit CHS */ | 391 | /* drive speaks boring old 28-bit CHS */ |
392 | lba = 0; | ||
471 | drive->capacity64 = drive->cyl * drive->head * drive->sect; | 393 | drive->capacity64 = drive->cyl * drive->head * drive->sect; |
472 | } | 394 | } |
473 | } | ||
474 | |||
475 | static sector_t idedisk_capacity(ide_drive_t *drive) | ||
476 | { | ||
477 | return drive->capacity64 - drive->sect0; | ||
478 | } | ||
479 | |||
480 | #ifdef CONFIG_IDE_PROC_FS | ||
481 | static int smart_enable(ide_drive_t *drive) | ||
482 | { | ||
483 | ide_task_t args; | ||
484 | struct ide_taskfile *tf = &args.tf; | ||
485 | |||
486 | memset(&args, 0, sizeof(ide_task_t)); | ||
487 | tf->feature = SMART_ENABLE; | ||
488 | tf->lbam = SMART_LCYL_PASS; | ||
489 | tf->lbah = SMART_HCYL_PASS; | ||
490 | tf->command = WIN_SMART; | ||
491 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | ||
492 | return ide_no_data_taskfile(drive, &args); | ||
493 | } | ||
494 | 395 | ||
495 | static int get_smart_data(ide_drive_t *drive, u8 *buf, u8 sub_cmd) | 396 | if (lba) { |
496 | { | 397 | drive->dev_flags |= IDE_DFLAG_LBA; |
497 | ide_task_t args; | ||
498 | struct ide_taskfile *tf = &args.tf; | ||
499 | |||
500 | memset(&args, 0, sizeof(ide_task_t)); | ||
501 | tf->feature = sub_cmd; | ||
502 | tf->nsect = 0x01; | ||
503 | tf->lbam = SMART_LCYL_PASS; | ||
504 | tf->lbah = SMART_HCYL_PASS; | ||
505 | tf->command = WIN_SMART; | ||
506 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | ||
507 | args.data_phase = TASKFILE_IN; | ||
508 | (void) smart_enable(drive); | ||
509 | return ide_raw_taskfile(drive, &args, buf, 1); | ||
510 | } | ||
511 | |||
512 | static int proc_idedisk_read_cache | ||
513 | (char *page, char **start, off_t off, int count, int *eof, void *data) | ||
514 | { | ||
515 | ide_drive_t *drive = (ide_drive_t *) data; | ||
516 | char *out = page; | ||
517 | int len; | ||
518 | 398 | ||
519 | if (drive->id_read) | 399 | /* |
520 | len = sprintf(out, "%i\n", drive->id->buf_size / 2); | 400 | * If this device supports the Host Protected Area feature set, |
521 | else | 401 | * then we may need to change our opinion about its capacity. |
522 | len = sprintf(out, "(none)\n"); | 402 | */ |
523 | 403 | if (ata_id_hpa_enabled(id)) | |
524 | PROC_IDE_READ_RETURN(page, start, off, count, eof, len); | 404 | idedisk_check_hpa(drive); |
525 | } | ||
526 | |||
527 | static int proc_idedisk_read_capacity | ||
528 | (char *page, char **start, off_t off, int count, int *eof, void *data) | ||
529 | { | ||
530 | ide_drive_t*drive = (ide_drive_t *)data; | ||
531 | int len; | ||
532 | |||
533 | len = sprintf(page, "%llu\n", (long long)idedisk_capacity(drive)); | ||
534 | |||
535 | PROC_IDE_READ_RETURN(page, start, off, count, eof, len); | ||
536 | } | ||
537 | |||
538 | static int proc_idedisk_read_smart(char *page, char **start, off_t off, | ||
539 | int count, int *eof, void *data, u8 sub_cmd) | ||
540 | { | ||
541 | ide_drive_t *drive = (ide_drive_t *)data; | ||
542 | int len = 0, i = 0; | ||
543 | |||
544 | if (get_smart_data(drive, page, sub_cmd) == 0) { | ||
545 | unsigned short *val = (unsigned short *) page; | ||
546 | char *out = ((char *)val) + (SECTOR_WORDS * 4); | ||
547 | page = out; | ||
548 | do { | ||
549 | out += sprintf(out, "%04x%c", le16_to_cpu(*val), | ||
550 | (++i & 7) ? ' ' : '\n'); | ||
551 | val += 1; | ||
552 | } while (i < (SECTOR_WORDS * 2)); | ||
553 | len = out - page; | ||
554 | } | 405 | } |
555 | |||
556 | PROC_IDE_READ_RETURN(page, start, off, count, eof, len); | ||
557 | } | ||
558 | |||
559 | static int proc_idedisk_read_sv | ||
560 | (char *page, char **start, off_t off, int count, int *eof, void *data) | ||
561 | { | ||
562 | return proc_idedisk_read_smart(page, start, off, count, eof, data, | ||
563 | SMART_READ_VALUES); | ||
564 | } | 406 | } |
565 | 407 | ||
566 | static int proc_idedisk_read_st | 408 | sector_t ide_disk_capacity(ide_drive_t *drive) |
567 | (char *page, char **start, off_t off, int count, int *eof, void *data) | ||
568 | { | 409 | { |
569 | return proc_idedisk_read_smart(page, start, off, count, eof, data, | 410 | return drive->capacity64; |
570 | SMART_READ_THRESHOLDS); | ||
571 | } | 411 | } |
572 | 412 | ||
573 | static ide_proc_entry_t idedisk_proc[] = { | ||
574 | { "cache", S_IFREG|S_IRUGO, proc_idedisk_read_cache, NULL }, | ||
575 | { "capacity", S_IFREG|S_IRUGO, proc_idedisk_read_capacity, NULL }, | ||
576 | { "geometry", S_IFREG|S_IRUGO, proc_ide_read_geometry, NULL }, | ||
577 | { "smart_values", S_IFREG|S_IRUSR, proc_idedisk_read_sv, NULL }, | ||
578 | { "smart_thresholds", S_IFREG|S_IRUSR, proc_idedisk_read_st, NULL }, | ||
579 | { NULL, 0, NULL, NULL } | ||
580 | }; | ||
581 | #endif /* CONFIG_IDE_PROC_FS */ | ||
582 | |||
583 | static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) | 413 | static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) |
584 | { | 414 | { |
585 | ide_drive_t *drive = q->queuedata; | 415 | ide_drive_t *drive = q->queuedata; |
@@ -589,11 +419,11 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) | |||
589 | BUG_ON(task == NULL); | 419 | BUG_ON(task == NULL); |
590 | 420 | ||
591 | memset(task, 0, sizeof(*task)); | 421 | memset(task, 0, sizeof(*task)); |
592 | if (ide_id_has_flush_cache_ext(drive->id) && | 422 | if (ata_id_flush_ext_enabled(drive->id) && |
593 | (drive->capacity64 >= (1UL << 28))) | 423 | (drive->capacity64 >= (1UL << 28))) |
594 | task->tf.command = WIN_FLUSH_CACHE_EXT; | 424 | task->tf.command = ATA_CMD_FLUSH_EXT; |
595 | else | 425 | else |
596 | task->tf.command = WIN_FLUSH_CACHE; | 426 | task->tf.command = ATA_CMD_FLUSH; |
597 | task->tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE | | 427 | task->tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE | |
598 | IDE_TFLAG_DYN; | 428 | IDE_TFLAG_DYN; |
599 | task->data_phase = TASKFILE_NO_DATA; | 429 | task->data_phase = TASKFILE_NO_DATA; |
@@ -603,6 +433,8 @@ static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) | |||
603 | rq->special = task; | 433 | rq->special = task; |
604 | } | 434 | } |
605 | 435 | ||
436 | ide_devset_get(multcount, mult_count); | ||
437 | |||
606 | /* | 438 | /* |
607 | * This is tightly woven into the driver->do_special can not touch. | 439 | * This is tightly woven into the driver->do_special can not touch. |
608 | * DON'T do it again until a total personality rewrite is committed. | 440 | * DON'T do it again until a total personality rewrite is committed. |
@@ -612,7 +444,7 @@ static int set_multcount(ide_drive_t *drive, int arg) | |||
612 | struct request *rq; | 444 | struct request *rq; |
613 | int error; | 445 | int error; |
614 | 446 | ||
615 | if (arg < 0 || arg > drive->id->max_multsect) | 447 | if (arg < 0 || arg > (drive->id[ATA_ID_MAX_MULTSECT] & 0xff)) |
616 | return -EINVAL; | 448 | return -EINVAL; |
617 | 449 | ||
618 | if (drive->special.b.set_multmode) | 450 | if (drive->special.b.set_multmode) |
@@ -629,26 +461,43 @@ static int set_multcount(ide_drive_t *drive, int arg) | |||
629 | return (drive->mult_count == arg) ? 0 : -EIO; | 461 | return (drive->mult_count == arg) ? 0 : -EIO; |
630 | } | 462 | } |
631 | 463 | ||
464 | ide_devset_get_flag(nowerr, IDE_DFLAG_NOWERR); | ||
465 | |||
632 | static int set_nowerr(ide_drive_t *drive, int arg) | 466 | static int set_nowerr(ide_drive_t *drive, int arg) |
633 | { | 467 | { |
634 | if (arg < 0 || arg > 1) | 468 | if (arg < 0 || arg > 1) |
635 | return -EINVAL; | 469 | return -EINVAL; |
636 | 470 | ||
637 | if (ide_spin_wait_hwgroup(drive)) | 471 | if (arg) |
638 | return -EBUSY; | 472 | drive->dev_flags |= IDE_DFLAG_NOWERR; |
639 | drive->nowerr = arg; | 473 | else |
474 | drive->dev_flags &= ~IDE_DFLAG_NOWERR; | ||
475 | |||
640 | drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT; | 476 | drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT; |
641 | spin_unlock_irq(&ide_lock); | 477 | |
642 | return 0; | 478 | return 0; |
643 | } | 479 | } |
644 | 480 | ||
481 | static int ide_do_setfeature(ide_drive_t *drive, u8 feature, u8 nsect) | ||
482 | { | ||
483 | ide_task_t task; | ||
484 | |||
485 | memset(&task, 0, sizeof(task)); | ||
486 | task.tf.feature = feature; | ||
487 | task.tf.nsect = nsect; | ||
488 | task.tf.command = ATA_CMD_SET_FEATURES; | ||
489 | task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | ||
490 | |||
491 | return ide_no_data_taskfile(drive, &task); | ||
492 | } | ||
493 | |||
645 | static void update_ordered(ide_drive_t *drive) | 494 | static void update_ordered(ide_drive_t *drive) |
646 | { | 495 | { |
647 | struct hd_driveid *id = drive->id; | 496 | u16 *id = drive->id; |
648 | unsigned ordered = QUEUE_ORDERED_NONE; | 497 | unsigned ordered = QUEUE_ORDERED_NONE; |
649 | prepare_flush_fn *prep_fn = NULL; | 498 | prepare_flush_fn *prep_fn = NULL; |
650 | 499 | ||
651 | if (drive->wcache) { | 500 | if (drive->dev_flags & IDE_DFLAG_WCACHE) { |
652 | unsigned long long capacity; | 501 | unsigned long long capacity; |
653 | int barrier; | 502 | int barrier; |
654 | /* | 503 | /* |
@@ -659,10 +508,12 @@ static void update_ordered(ide_drive_t *drive) | |||
659 | * time we have trimmed the drive capacity if LBA48 is | 508 | * time we have trimmed the drive capacity if LBA48 is |
660 | * not available so we don't need to recheck that. | 509 | * not available so we don't need to recheck that. |
661 | */ | 510 | */ |
662 | capacity = idedisk_capacity(drive); | 511 | capacity = ide_disk_capacity(drive); |
663 | barrier = ide_id_has_flush_cache(id) && !drive->noflush && | 512 | barrier = ata_id_flush_enabled(id) && |
664 | (drive->addressing == 0 || capacity <= (1ULL << 28) || | 513 | (drive->dev_flags & IDE_DFLAG_NOFLUSH) == 0 && |
665 | ide_id_has_flush_cache_ext(id)); | 514 | ((drive->dev_flags & IDE_DFLAG_LBA48) == 0 || |
515 | capacity <= (1ULL << 28) || | ||
516 | ata_id_flush_ext_enabled(id)); | ||
666 | 517 | ||
667 | printk(KERN_INFO "%s: cache flushes %ssupported\n", | 518 | printk(KERN_INFO "%s: cache flushes %ssupported\n", |
668 | drive->name, barrier ? "" : "not "); | 519 | drive->name, barrier ? "" : "not "); |
@@ -677,23 +528,24 @@ static void update_ordered(ide_drive_t *drive) | |||
677 | blk_queue_ordered(drive->queue, ordered, prep_fn); | 528 | blk_queue_ordered(drive->queue, ordered, prep_fn); |
678 | } | 529 | } |
679 | 530 | ||
680 | static int write_cache(ide_drive_t *drive, int arg) | 531 | ide_devset_get_flag(wcache, IDE_DFLAG_WCACHE); |
532 | |||
533 | static int set_wcache(ide_drive_t *drive, int arg) | ||
681 | { | 534 | { |
682 | ide_task_t args; | ||
683 | int err = 1; | 535 | int err = 1; |
684 | 536 | ||
685 | if (arg < 0 || arg > 1) | 537 | if (arg < 0 || arg > 1) |
686 | return -EINVAL; | 538 | return -EINVAL; |
687 | 539 | ||
688 | if (ide_id_has_flush_cache(drive->id)) { | 540 | if (ata_id_flush_enabled(drive->id)) { |
689 | memset(&args, 0, sizeof(ide_task_t)); | 541 | err = ide_do_setfeature(drive, |
690 | args.tf.feature = arg ? | 542 | arg ? SETFEATURES_WC_ON : SETFEATURES_WC_OFF, 0); |
691 | SETFEATURES_EN_WCACHE : SETFEATURES_DIS_WCACHE; | 543 | if (err == 0) { |
692 | args.tf.command = WIN_SETFEATURES; | 544 | if (arg) |
693 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 545 | drive->dev_flags |= IDE_DFLAG_WCACHE; |
694 | err = ide_no_data_taskfile(drive, &args); | 546 | else |
695 | if (err == 0) | 547 | drive->dev_flags &= ~IDE_DFLAG_WCACHE; |
696 | drive->wcache = arg; | 548 | } |
697 | } | 549 | } |
698 | 550 | ||
699 | update_ordered(drive); | 551 | update_ordered(drive); |
@@ -706,108 +558,88 @@ static int do_idedisk_flushcache(ide_drive_t *drive) | |||
706 | ide_task_t args; | 558 | ide_task_t args; |
707 | 559 | ||
708 | memset(&args, 0, sizeof(ide_task_t)); | 560 | memset(&args, 0, sizeof(ide_task_t)); |
709 | if (ide_id_has_flush_cache_ext(drive->id)) | 561 | if (ata_id_flush_ext_enabled(drive->id)) |
710 | args.tf.command = WIN_FLUSH_CACHE_EXT; | 562 | args.tf.command = ATA_CMD_FLUSH_EXT; |
711 | else | 563 | else |
712 | args.tf.command = WIN_FLUSH_CACHE; | 564 | args.tf.command = ATA_CMD_FLUSH; |
713 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 565 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; |
714 | return ide_no_data_taskfile(drive, &args); | 566 | return ide_no_data_taskfile(drive, &args); |
715 | } | 567 | } |
716 | 568 | ||
569 | ide_devset_get(acoustic, acoustic); | ||
570 | |||
717 | static int set_acoustic(ide_drive_t *drive, int arg) | 571 | static int set_acoustic(ide_drive_t *drive, int arg) |
718 | { | 572 | { |
719 | ide_task_t args; | ||
720 | |||
721 | if (arg < 0 || arg > 254) | 573 | if (arg < 0 || arg > 254) |
722 | return -EINVAL; | 574 | return -EINVAL; |
723 | 575 | ||
724 | memset(&args, 0, sizeof(ide_task_t)); | 576 | ide_do_setfeature(drive, |
725 | args.tf.feature = arg ? SETFEATURES_EN_AAM : SETFEATURES_DIS_AAM; | 577 | arg ? SETFEATURES_AAM_ON : SETFEATURES_AAM_OFF, arg); |
726 | args.tf.nsect = arg; | 578 | |
727 | args.tf.command = WIN_SETFEATURES; | ||
728 | args.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | ||
729 | ide_no_data_taskfile(drive, &args); | ||
730 | drive->acoustic = arg; | 579 | drive->acoustic = arg; |
580 | |||
731 | return 0; | 581 | return 0; |
732 | } | 582 | } |
733 | 583 | ||
584 | ide_devset_get_flag(addressing, IDE_DFLAG_LBA48); | ||
585 | |||
734 | /* | 586 | /* |
735 | * drive->addressing: | 587 | * drive->addressing: |
736 | * 0: 28-bit | 588 | * 0: 28-bit |
737 | * 1: 48-bit | 589 | * 1: 48-bit |
738 | * 2: 48-bit capable doing 28-bit | 590 | * 2: 48-bit capable doing 28-bit |
739 | */ | 591 | */ |
740 | static int set_lba_addressing(ide_drive_t *drive, int arg) | 592 | static int set_addressing(ide_drive_t *drive, int arg) |
741 | { | 593 | { |
742 | if (arg < 0 || arg > 2) | 594 | if (arg < 0 || arg > 2) |
743 | return -EINVAL; | 595 | return -EINVAL; |
744 | 596 | ||
745 | drive->addressing = 0; | 597 | if (arg && ((drive->hwif->host_flags & IDE_HFLAG_NO_LBA48) || |
598 | ata_id_lba48_enabled(drive->id) == 0)) | ||
599 | return -EIO; | ||
746 | 600 | ||
747 | if (drive->hwif->host_flags & IDE_HFLAG_NO_LBA48) | 601 | if (arg == 2) |
748 | return 0; | 602 | arg = 0; |
603 | |||
604 | if (arg) | ||
605 | drive->dev_flags |= IDE_DFLAG_LBA48; | ||
606 | else | ||
607 | drive->dev_flags &= ~IDE_DFLAG_LBA48; | ||
749 | 608 | ||
750 | if (!idedisk_supports_lba48(drive->id)) | ||
751 | return -EIO; | ||
752 | drive->addressing = arg; | ||
753 | return 0; | 609 | return 0; |
754 | } | 610 | } |
755 | 611 | ||
756 | #ifdef CONFIG_IDE_PROC_FS | 612 | ide_ext_devset_rw(acoustic, acoustic); |
757 | static void idedisk_add_settings(ide_drive_t *drive) | 613 | ide_ext_devset_rw(address, addressing); |
758 | { | 614 | ide_ext_devset_rw(multcount, multcount); |
759 | struct hd_driveid *id = drive->id; | 615 | ide_ext_devset_rw(wcache, wcache); |
760 | 616 | ||
761 | ide_add_setting(drive, "bios_cyl", SETTING_RW, TYPE_INT, 0, 65535, 1, 1, | 617 | ide_ext_devset_rw_sync(nowerr, nowerr); |
762 | &drive->bios_cyl, NULL); | ||
763 | ide_add_setting(drive, "bios_head", SETTING_RW, TYPE_BYTE, 0, 255, 1, 1, | ||
764 | &drive->bios_head, NULL); | ||
765 | ide_add_setting(drive, "bios_sect", SETTING_RW, TYPE_BYTE, 0, 63, 1, 1, | ||
766 | &drive->bios_sect, NULL); | ||
767 | ide_add_setting(drive, "address", SETTING_RW, TYPE_BYTE, 0, 2, 1, 1, | ||
768 | &drive->addressing, set_lba_addressing); | ||
769 | ide_add_setting(drive, "multcount", SETTING_RW, TYPE_BYTE, 0, | ||
770 | id->max_multsect, 1, 1, &drive->mult_count, | ||
771 | set_multcount); | ||
772 | ide_add_setting(drive, "nowerr", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, | ||
773 | &drive->nowerr, set_nowerr); | ||
774 | ide_add_setting(drive, "lun", SETTING_RW, TYPE_INT, 0, 7, 1, 1, | ||
775 | &drive->lun, NULL); | ||
776 | ide_add_setting(drive, "wcache", SETTING_RW, TYPE_BYTE, 0, 1, 1, 1, | ||
777 | &drive->wcache, write_cache); | ||
778 | ide_add_setting(drive, "acoustic", SETTING_RW, TYPE_BYTE, 0, 254, 1, 1, | ||
779 | &drive->acoustic, set_acoustic); | ||
780 | ide_add_setting(drive, "failures", SETTING_RW, TYPE_INT, 0, 65535, 1, 1, | ||
781 | &drive->failures, NULL); | ||
782 | ide_add_setting(drive, "max_failures", SETTING_RW, TYPE_INT, 0, 65535, | ||
783 | 1, 1, &drive->max_failures, NULL); | ||
784 | } | ||
785 | #else | ||
786 | static inline void idedisk_add_settings(ide_drive_t *drive) { ; } | ||
787 | #endif | ||
788 | 618 | ||
789 | static void idedisk_setup(ide_drive_t *drive) | 619 | static void idedisk_setup(ide_drive_t *drive) |
790 | { | 620 | { |
621 | struct ide_disk_obj *idkp = drive->driver_data; | ||
791 | ide_hwif_t *hwif = drive->hwif; | 622 | ide_hwif_t *hwif = drive->hwif; |
792 | struct hd_driveid *id = drive->id; | 623 | u16 *id = drive->id; |
624 | char *m = (char *)&id[ATA_ID_PROD]; | ||
793 | unsigned long long capacity; | 625 | unsigned long long capacity; |
794 | 626 | ||
795 | idedisk_add_settings(drive); | 627 | ide_proc_register_driver(drive, idkp->driver); |
796 | 628 | ||
797 | if (drive->id_read == 0) | 629 | if ((drive->dev_flags & IDE_DFLAG_ID_READ) == 0) |
798 | return; | 630 | return; |
799 | 631 | ||
800 | if (drive->removable) { | 632 | if (drive->dev_flags & IDE_DFLAG_REMOVABLE) { |
801 | /* | 633 | /* |
802 | * Removable disks (eg. SYQUEST); ignore 'WD' drives | 634 | * Removable disks (eg. SYQUEST); ignore 'WD' drives |
803 | */ | 635 | */ |
804 | if (id->model[0] != 'W' || id->model[1] != 'D') | 636 | if (m[0] != 'W' || m[1] != 'D') |
805 | drive->doorlocking = 1; | 637 | drive->dev_flags |= IDE_DFLAG_DOORLOCKING; |
806 | } | 638 | } |
807 | 639 | ||
808 | (void)set_lba_addressing(drive, 1); | 640 | (void)set_addressing(drive, 1); |
809 | 641 | ||
810 | if (drive->addressing == 1) { | 642 | if (drive->dev_flags & IDE_DFLAG_LBA48) { |
811 | int max_s = 2048; | 643 | int max_s = 2048; |
812 | 644 | ||
813 | if (max_s > hwif->rqsize) | 645 | if (max_s > hwif->rqsize) |
@@ -823,7 +655,8 @@ static void idedisk_setup(ide_drive_t *drive) | |||
823 | init_idedisk_capacity(drive); | 655 | init_idedisk_capacity(drive); |
824 | 656 | ||
825 | /* limit drive capacity to 137GB if LBA48 cannot be used */ | 657 | /* limit drive capacity to 137GB if LBA48 cannot be used */ |
826 | if (drive->addressing == 0 && drive->capacity64 > 1ULL << 28) { | 658 | if ((drive->dev_flags & IDE_DFLAG_LBA48) == 0 && |
659 | drive->capacity64 > 1ULL << 28) { | ||
827 | printk(KERN_WARNING "%s: cannot use LBA48 - full capacity " | 660 | printk(KERN_WARNING "%s: cannot use LBA48 - full capacity " |
828 | "%llu sectors (%llu MB)\n", | 661 | "%llu sectors (%llu MB)\n", |
829 | drive->name, (unsigned long long)drive->capacity64, | 662 | drive->name, (unsigned long long)drive->capacity64, |
@@ -831,24 +664,24 @@ static void idedisk_setup(ide_drive_t *drive) | |||
831 | drive->capacity64 = 1ULL << 28; | 664 | drive->capacity64 = 1ULL << 28; |
832 | } | 665 | } |
833 | 666 | ||
834 | if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && drive->addressing) { | 667 | if ((hwif->host_flags & IDE_HFLAG_NO_LBA48_DMA) && |
668 | (drive->dev_flags & IDE_DFLAG_LBA48)) { | ||
835 | if (drive->capacity64 > 1ULL << 28) { | 669 | if (drive->capacity64 > 1ULL << 28) { |
836 | printk(KERN_INFO "%s: cannot use LBA48 DMA - PIO mode" | 670 | printk(KERN_INFO "%s: cannot use LBA48 DMA - PIO mode" |
837 | " will be used for accessing sectors " | 671 | " will be used for accessing sectors " |
838 | "> %u\n", drive->name, 1 << 28); | 672 | "> %u\n", drive->name, 1 << 28); |
839 | } else | 673 | } else |
840 | drive->addressing = 0; | 674 | drive->dev_flags &= ~IDE_DFLAG_LBA48; |
841 | } | 675 | } |
842 | 676 | ||
843 | /* | 677 | /* |
844 | * if possible, give fdisk access to more of the drive, | 678 | * if possible, give fdisk access to more of the drive, |
845 | * by correcting bios_cyls: | 679 | * by correcting bios_cyls: |
846 | */ | 680 | */ |
847 | capacity = idedisk_capacity(drive); | 681 | capacity = ide_disk_capacity(drive); |
848 | |||
849 | if (!drive->forced_geom) { | ||
850 | 682 | ||
851 | if (idedisk_supports_lba48(drive->id)) { | 683 | if ((drive->dev_flags & IDE_DFLAG_FORCED_GEOM) == 0) { |
684 | if (ata_id_lba48_enabled(drive->id)) { | ||
852 | /* compatibility */ | 685 | /* compatibility */ |
853 | drive->bios_sect = 63; | 686 | drive->bios_sect = 63; |
854 | drive->bios_head = 255; | 687 | drive->bios_head = 255; |
@@ -874,22 +707,23 @@ static void idedisk_setup(ide_drive_t *drive) | |||
874 | drive->name, capacity, sectors_to_MB(capacity)); | 707 | drive->name, capacity, sectors_to_MB(capacity)); |
875 | 708 | ||
876 | /* Only print cache size when it was specified */ | 709 | /* Only print cache size when it was specified */ |
877 | if (id->buf_size) | 710 | if (id[ATA_ID_BUF_SIZE]) |
878 | printk(KERN_CONT " w/%dKiB Cache", id->buf_size / 2); | 711 | printk(KERN_CONT " w/%dKiB Cache", id[ATA_ID_BUF_SIZE] / 2); |
879 | 712 | ||
880 | printk(KERN_CONT ", CHS=%d/%d/%d\n", | 713 | printk(KERN_CONT ", CHS=%d/%d/%d\n", |
881 | drive->bios_cyl, drive->bios_head, drive->bios_sect); | 714 | drive->bios_cyl, drive->bios_head, drive->bios_sect); |
882 | 715 | ||
883 | /* write cache enabled? */ | 716 | /* write cache enabled? */ |
884 | if ((id->csfo & 1) || (id->cfs_enable_1 & (1 << 5))) | 717 | if ((id[ATA_ID_CSFO] & 1) || ata_id_wcache_enabled(id)) |
885 | drive->wcache = 1; | 718 | drive->dev_flags |= IDE_DFLAG_WCACHE; |
886 | 719 | ||
887 | write_cache(drive, 1); | 720 | set_wcache(drive, 1); |
888 | } | 721 | } |
889 | 722 | ||
890 | static void ide_cacheflush_p(ide_drive_t *drive) | 723 | static void ide_cacheflush_p(ide_drive_t *drive) |
891 | { | 724 | { |
892 | if (!drive->wcache || !ide_id_has_flush_cache(drive->id)) | 725 | if (ata_id_flush_enabled(drive->id) == 0 || |
726 | (drive->dev_flags & IDE_DFLAG_WCACHE) == 0) | ||
893 | return; | 727 | return; |
894 | 728 | ||
895 | if (do_idedisk_flushcache(drive)) | 729 | if (do_idedisk_flushcache(drive)) |
@@ -931,7 +765,7 @@ static int ide_disk_probe(ide_drive_t *drive); | |||
931 | */ | 765 | */ |
932 | static void ide_disk_resume(ide_drive_t *drive) | 766 | static void ide_disk_resume(ide_drive_t *drive) |
933 | { | 767 | { |
934 | if (idedisk_supports_hpa(drive->id)) | 768 | if (ata_id_hpa_enabled(drive->id)) |
935 | init_idedisk_capacity(drive); | 769 | init_idedisk_capacity(drive); |
936 | } | 770 | } |
937 | 771 | ||
@@ -973,13 +807,12 @@ static ide_driver_t idedisk_driver = { | |||
973 | .resume = ide_disk_resume, | 807 | .resume = ide_disk_resume, |
974 | .shutdown = ide_device_shutdown, | 808 | .shutdown = ide_device_shutdown, |
975 | .version = IDEDISK_VERSION, | 809 | .version = IDEDISK_VERSION, |
976 | .media = ide_disk, | ||
977 | .supports_dsc_overlap = 0, | ||
978 | .do_request = ide_do_rw_disk, | 810 | .do_request = ide_do_rw_disk, |
979 | .end_request = ide_end_request, | 811 | .end_request = ide_end_request, |
980 | .error = __ide_error, | 812 | .error = __ide_error, |
981 | #ifdef CONFIG_IDE_PROC_FS | 813 | #ifdef CONFIG_IDE_PROC_FS |
982 | .proc = idedisk_proc, | 814 | .proc = ide_disk_proc, |
815 | .settings = ide_disk_settings, | ||
983 | #endif | 816 | #endif |
984 | }; | 817 | }; |
985 | 818 | ||
@@ -988,7 +821,7 @@ static int idedisk_set_doorlock(ide_drive_t *drive, int on) | |||
988 | ide_task_t task; | 821 | ide_task_t task; |
989 | 822 | ||
990 | memset(&task, 0, sizeof(task)); | 823 | memset(&task, 0, sizeof(task)); |
991 | task.tf.command = on ? WIN_DOORLOCK : WIN_DOORUNLOCK; | 824 | task.tf.command = on ? ATA_CMD_MEDIA_LOCK : ATA_CMD_MEDIA_UNLOCK; |
992 | task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; | 825 | task.tf_flags = IDE_TFLAG_TF | IDE_TFLAG_DEVICE; |
993 | 826 | ||
994 | return ide_no_data_taskfile(drive, &task); | 827 | return ide_no_data_taskfile(drive, &task); |
@@ -1008,15 +841,16 @@ static int idedisk_open(struct inode *inode, struct file *filp) | |||
1008 | 841 | ||
1009 | idkp->openers++; | 842 | idkp->openers++; |
1010 | 843 | ||
1011 | if (drive->removable && idkp->openers == 1) { | 844 | if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) { |
1012 | check_disk_change(inode->i_bdev); | 845 | check_disk_change(inode->i_bdev); |
1013 | /* | 846 | /* |
1014 | * Ignore the return code from door_lock, | 847 | * Ignore the return code from door_lock, |
1015 | * since the open() has already succeeded, | 848 | * since the open() has already succeeded, |
1016 | * and the door_lock is irrelevant at this point. | 849 | * and the door_lock is irrelevant at this point. |
1017 | */ | 850 | */ |
1018 | if (drive->doorlocking && idedisk_set_doorlock(drive, 1)) | 851 | if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) && |
1019 | drive->doorlocking = 0; | 852 | idedisk_set_doorlock(drive, 1)) |
853 | drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; | ||
1020 | } | 854 | } |
1021 | return 0; | 855 | return 0; |
1022 | } | 856 | } |
@@ -1030,9 +864,10 @@ static int idedisk_release(struct inode *inode, struct file *filp) | |||
1030 | if (idkp->openers == 1) | 864 | if (idkp->openers == 1) |
1031 | ide_cacheflush_p(drive); | 865 | ide_cacheflush_p(drive); |
1032 | 866 | ||
1033 | if (drive->removable && idkp->openers == 1) { | 867 | if ((drive->dev_flags & IDE_DFLAG_REMOVABLE) && idkp->openers == 1) { |
1034 | if (drive->doorlocking && idedisk_set_doorlock(drive, 0)) | 868 | if ((drive->dev_flags & IDE_DFLAG_DOORLOCKING) && |
1035 | drive->doorlocking = 0; | 869 | idedisk_set_doorlock(drive, 0)) |
870 | drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; | ||
1036 | } | 871 | } |
1037 | 872 | ||
1038 | idkp->openers--; | 873 | idkp->openers--; |
@@ -1053,72 +888,25 @@ static int idedisk_getgeo(struct block_device *bdev, struct hd_geometry *geo) | |||
1053 | return 0; | 888 | return 0; |
1054 | } | 889 | } |
1055 | 890 | ||
1056 | static int idedisk_ioctl(struct inode *inode, struct file *file, | ||
1057 | unsigned int cmd, unsigned long arg) | ||
1058 | { | ||
1059 | unsigned long flags; | ||
1060 | struct block_device *bdev = inode->i_bdev; | ||
1061 | struct ide_disk_obj *idkp = ide_disk_g(bdev->bd_disk); | ||
1062 | ide_drive_t *drive = idkp->drive; | ||
1063 | int err, (*setfunc)(ide_drive_t *, int); | ||
1064 | u8 *val; | ||
1065 | |||
1066 | switch (cmd) { | ||
1067 | case HDIO_GET_ADDRESS: val = &drive->addressing; goto read_val; | ||
1068 | case HDIO_GET_MULTCOUNT: val = &drive->mult_count; goto read_val; | ||
1069 | case HDIO_GET_NOWERR: val = &drive->nowerr; goto read_val; | ||
1070 | case HDIO_GET_WCACHE: val = &drive->wcache; goto read_val; | ||
1071 | case HDIO_GET_ACOUSTIC: val = &drive->acoustic; goto read_val; | ||
1072 | case HDIO_SET_ADDRESS: setfunc = set_lba_addressing; goto set_val; | ||
1073 | case HDIO_SET_MULTCOUNT: setfunc = set_multcount; goto set_val; | ||
1074 | case HDIO_SET_NOWERR: setfunc = set_nowerr; goto set_val; | ||
1075 | case HDIO_SET_WCACHE: setfunc = write_cache; goto set_val; | ||
1076 | case HDIO_SET_ACOUSTIC: setfunc = set_acoustic; goto set_val; | ||
1077 | } | ||
1078 | |||
1079 | return generic_ide_ioctl(drive, file, bdev, cmd, arg); | ||
1080 | |||
1081 | read_val: | ||
1082 | mutex_lock(&ide_setting_mtx); | ||
1083 | spin_lock_irqsave(&ide_lock, flags); | ||
1084 | err = *val; | ||
1085 | spin_unlock_irqrestore(&ide_lock, flags); | ||
1086 | mutex_unlock(&ide_setting_mtx); | ||
1087 | return err >= 0 ? put_user(err, (long __user *)arg) : err; | ||
1088 | |||
1089 | set_val: | ||
1090 | if (bdev != bdev->bd_contains) | ||
1091 | err = -EINVAL; | ||
1092 | else { | ||
1093 | if (!capable(CAP_SYS_ADMIN)) | ||
1094 | err = -EACCES; | ||
1095 | else { | ||
1096 | mutex_lock(&ide_setting_mtx); | ||
1097 | err = setfunc(drive, arg); | ||
1098 | mutex_unlock(&ide_setting_mtx); | ||
1099 | } | ||
1100 | } | ||
1101 | return err; | ||
1102 | } | ||
1103 | |||
1104 | static int idedisk_media_changed(struct gendisk *disk) | 891 | static int idedisk_media_changed(struct gendisk *disk) |
1105 | { | 892 | { |
1106 | struct ide_disk_obj *idkp = ide_disk_g(disk); | 893 | struct ide_disk_obj *idkp = ide_disk_g(disk); |
1107 | ide_drive_t *drive = idkp->drive; | 894 | ide_drive_t *drive = idkp->drive; |
1108 | 895 | ||
1109 | /* do not scan partitions twice if this is a removable device */ | 896 | /* do not scan partitions twice if this is a removable device */ |
1110 | if (drive->attach) { | 897 | if (drive->dev_flags & IDE_DFLAG_ATTACH) { |
1111 | drive->attach = 0; | 898 | drive->dev_flags &= ~IDE_DFLAG_ATTACH; |
1112 | return 0; | 899 | return 0; |
1113 | } | 900 | } |
901 | |||
1114 | /* if removable, always assume it was changed */ | 902 | /* if removable, always assume it was changed */ |
1115 | return drive->removable; | 903 | return !!(drive->dev_flags & IDE_DFLAG_REMOVABLE); |
1116 | } | 904 | } |
1117 | 905 | ||
1118 | static int idedisk_revalidate_disk(struct gendisk *disk) | 906 | static int idedisk_revalidate_disk(struct gendisk *disk) |
1119 | { | 907 | { |
1120 | struct ide_disk_obj *idkp = ide_disk_g(disk); | 908 | struct ide_disk_obj *idkp = ide_disk_g(disk); |
1121 | set_capacity(disk, idedisk_capacity(idkp->drive)); | 909 | set_capacity(disk, ide_disk_capacity(idkp->drive)); |
1122 | return 0; | 910 | return 0; |
1123 | } | 911 | } |
1124 | 912 | ||
@@ -1126,7 +914,7 @@ static struct block_device_operations idedisk_ops = { | |||
1126 | .owner = THIS_MODULE, | 914 | .owner = THIS_MODULE, |
1127 | .open = idedisk_open, | 915 | .open = idedisk_open, |
1128 | .release = idedisk_release, | 916 | .release = idedisk_release, |
1129 | .ioctl = idedisk_ioctl, | 917 | .ioctl = ide_disk_ioctl, |
1130 | .getgeo = idedisk_getgeo, | 918 | .getgeo = idedisk_getgeo, |
1131 | .media_changed = idedisk_media_changed, | 919 | .media_changed = idedisk_media_changed, |
1132 | .revalidate_disk = idedisk_revalidate_disk | 920 | .revalidate_disk = idedisk_revalidate_disk |
@@ -1142,8 +930,7 @@ static int ide_disk_probe(ide_drive_t *drive) | |||
1142 | /* strstr("foo", "") is non-NULL */ | 930 | /* strstr("foo", "") is non-NULL */ |
1143 | if (!strstr("ide-disk", drive->driver_req)) | 931 | if (!strstr("ide-disk", drive->driver_req)) |
1144 | goto failed; | 932 | goto failed; |
1145 | if (!drive->present) | 933 | |
1146 | goto failed; | ||
1147 | if (drive->media != ide_disk) | 934 | if (drive->media != ide_disk) |
1148 | goto failed; | 935 | goto failed; |
1149 | 936 | ||
@@ -1151,15 +938,12 @@ static int ide_disk_probe(ide_drive_t *drive) | |||
1151 | if (!idkp) | 938 | if (!idkp) |
1152 | goto failed; | 939 | goto failed; |
1153 | 940 | ||
1154 | g = alloc_disk_node(1 << PARTN_BITS, | 941 | g = alloc_disk_node(IDE_DISK_MINORS, hwif_to_node(drive->hwif)); |
1155 | hwif_to_node(drive->hwif)); | ||
1156 | if (!g) | 942 | if (!g) |
1157 | goto out_free_idkp; | 943 | goto out_free_idkp; |
1158 | 944 | ||
1159 | ide_init_disk(g, drive); | 945 | ide_init_disk(g, drive); |
1160 | 946 | ||
1161 | ide_proc_register_driver(drive, &idedisk_driver); | ||
1162 | |||
1163 | kref_init(&idkp->kref); | 947 | kref_init(&idkp->kref); |
1164 | 948 | ||
1165 | idkp->drive = drive; | 949 | idkp->drive = drive; |
@@ -1171,17 +955,20 @@ static int ide_disk_probe(ide_drive_t *drive) | |||
1171 | drive->driver_data = idkp; | 955 | drive->driver_data = idkp; |
1172 | 956 | ||
1173 | idedisk_setup(drive); | 957 | idedisk_setup(drive); |
1174 | if ((!drive->head || drive->head > 16) && !drive->select.b.lba) { | 958 | if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 && |
959 | (drive->head == 0 || drive->head > 16)) { | ||
1175 | printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", | 960 | printk(KERN_ERR "%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n", |
1176 | drive->name, drive->head); | 961 | drive->name, drive->head); |
1177 | drive->attach = 0; | 962 | drive->dev_flags &= ~IDE_DFLAG_ATTACH; |
1178 | } else | 963 | } else |
1179 | drive->attach = 1; | 964 | drive->dev_flags |= IDE_DFLAG_ATTACH; |
1180 | 965 | ||
1181 | g->minors = 1 << PARTN_BITS; | 966 | g->minors = IDE_DISK_MINORS; |
1182 | g->driverfs_dev = &drive->gendev; | 967 | g->driverfs_dev = &drive->gendev; |
1183 | g->flags = drive->removable ? GENHD_FL_REMOVABLE : 0; | 968 | g->flags |= GENHD_FL_EXT_DEVT; |
1184 | set_capacity(g, idedisk_capacity(drive)); | 969 | if (drive->dev_flags & IDE_DFLAG_REMOVABLE) |
970 | g->flags = GENHD_FL_REMOVABLE; | ||
971 | set_capacity(g, ide_disk_capacity(drive)); | ||
1185 | g->fops = &idedisk_ops; | 972 | g->fops = &idedisk_ops; |
1186 | add_disk(g); | 973 | add_disk(g); |
1187 | return 0; | 974 | return 0; |
@@ -1203,6 +990,7 @@ static int __init idedisk_init(void) | |||
1203 | } | 990 | } |
1204 | 991 | ||
1205 | MODULE_ALIAS("ide:*m-disk*"); | 992 | MODULE_ALIAS("ide:*m-disk*"); |
993 | MODULE_ALIAS("ide-disk"); | ||
1206 | module_init(idedisk_init); | 994 | module_init(idedisk_init); |
1207 | module_exit(idedisk_exit); | 995 | module_exit(idedisk_exit); |
1208 | MODULE_LICENSE("GPL"); | 996 | MODULE_LICENSE("GPL"); |