diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/ide/ide-disk.c | 40 | ||||
| -rw-r--r-- | drivers/ide/ide-gd.c | 11 |
2 files changed, 20 insertions, 31 deletions
diff --git a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c index 3b128dce9c3a..33d65039cce9 100644 --- a/drivers/ide/ide-disk.c +++ b/drivers/ide/ide-disk.c | |||
| @@ -407,32 +407,24 @@ static int ide_disk_get_capacity(ide_drive_t *drive) | |||
| 407 | return 0; | 407 | return 0; |
| 408 | } | 408 | } |
| 409 | 409 | ||
| 410 | static u64 ide_disk_set_capacity(ide_drive_t *drive, u64 capacity) | 410 | static void ide_disk_unlock_native_capacity(ide_drive_t *drive) |
| 411 | { | 411 | { |
| 412 | u64 set = min(capacity, drive->probed_capacity); | ||
| 413 | u16 *id = drive->id; | 412 | u16 *id = drive->id; |
| 414 | int lba48 = ata_id_lba48_enabled(id); | 413 | int lba48 = ata_id_lba48_enabled(id); |
| 415 | 414 | ||
| 416 | if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 || | 415 | if ((drive->dev_flags & IDE_DFLAG_LBA) == 0 || |
| 417 | ata_id_hpa_enabled(id) == 0) | 416 | ata_id_hpa_enabled(id) == 0) |
| 418 | goto out; | 417 | return; |
| 419 | 418 | ||
| 420 | /* | 419 | /* |
| 421 | * according to the spec the SET MAX ADDRESS command shall be | 420 | * according to the spec the SET MAX ADDRESS command shall be |
| 422 | * immediately preceded by a READ NATIVE MAX ADDRESS command | 421 | * immediately preceded by a READ NATIVE MAX ADDRESS command |
| 423 | */ | 422 | */ |
| 424 | capacity = ide_disk_hpa_get_native_capacity(drive, lba48); | 423 | if (!ide_disk_hpa_get_native_capacity(drive, lba48)) |
| 425 | if (capacity == 0) | 424 | return; |
| 426 | goto out; | 425 | |
| 427 | 426 | if (ide_disk_hpa_set_capacity(drive, drive->probed_capacity, lba48)) | |
| 428 | set = ide_disk_hpa_set_capacity(drive, set, lba48); | 427 | drive->dev_flags |= IDE_DFLAG_NOHPA; /* disable HPA on resume */ |
| 429 | if (set) { | ||
| 430 | /* needed for ->resume to disable HPA */ | ||
| 431 | drive->dev_flags |= IDE_DFLAG_NOHPA; | ||
| 432 | return set; | ||
| 433 | } | ||
| 434 | out: | ||
| 435 | return drive->capacity64; | ||
| 436 | } | 428 | } |
| 437 | 429 | ||
| 438 | static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) | 430 | static void idedisk_prepare_flush(struct request_queue *q, struct request *rq) |
| @@ -783,13 +775,13 @@ static int ide_disk_set_doorlock(ide_drive_t *drive, struct gendisk *disk, | |||
| 783 | } | 775 | } |
| 784 | 776 | ||
| 785 | const struct ide_disk_ops ide_ata_disk_ops = { | 777 | const struct ide_disk_ops ide_ata_disk_ops = { |
| 786 | .check = ide_disk_check, | 778 | .check = ide_disk_check, |
| 787 | .set_capacity = ide_disk_set_capacity, | 779 | .unlock_native_capacity = ide_disk_unlock_native_capacity, |
| 788 | .get_capacity = ide_disk_get_capacity, | 780 | .get_capacity = ide_disk_get_capacity, |
| 789 | .setup = ide_disk_setup, | 781 | .setup = ide_disk_setup, |
| 790 | .flush = ide_disk_flush, | 782 | .flush = ide_disk_flush, |
| 791 | .init_media = ide_disk_init_media, | 783 | .init_media = ide_disk_init_media, |
| 792 | .set_doorlock = ide_disk_set_doorlock, | 784 | .set_doorlock = ide_disk_set_doorlock, |
| 793 | .do_request = ide_do_rw_disk, | 785 | .do_request = ide_do_rw_disk, |
| 794 | .ioctl = ide_disk_ioctl, | 786 | .ioctl = ide_disk_ioctl, |
| 795 | }; | 787 | }; |
diff --git a/drivers/ide/ide-gd.c b/drivers/ide/ide-gd.c index c32d83996ae1..c102d23d9b38 100644 --- a/drivers/ide/ide-gd.c +++ b/drivers/ide/ide-gd.c | |||
| @@ -288,17 +288,14 @@ static int ide_gd_media_changed(struct gendisk *disk) | |||
| 288 | return ret; | 288 | return ret; |
| 289 | } | 289 | } |
| 290 | 290 | ||
| 291 | static unsigned long long ide_gd_set_capacity(struct gendisk *disk, | 291 | static void ide_gd_unlock_native_capacity(struct gendisk *disk) |
| 292 | unsigned long long capacity) | ||
| 293 | { | 292 | { |
| 294 | struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); | 293 | struct ide_disk_obj *idkp = ide_drv_g(disk, ide_disk_obj); |
| 295 | ide_drive_t *drive = idkp->drive; | 294 | ide_drive_t *drive = idkp->drive; |
| 296 | const struct ide_disk_ops *disk_ops = drive->disk_ops; | 295 | const struct ide_disk_ops *disk_ops = drive->disk_ops; |
| 297 | 296 | ||
| 298 | if (disk_ops->set_capacity) | 297 | if (disk_ops->unlock_native_capacity) |
| 299 | return disk_ops->set_capacity(drive, capacity); | 298 | disk_ops->unlock_native_capacity(drive); |
| 300 | |||
| 301 | return drive->capacity64; | ||
| 302 | } | 299 | } |
| 303 | 300 | ||
| 304 | static int ide_gd_revalidate_disk(struct gendisk *disk) | 301 | static int ide_gd_revalidate_disk(struct gendisk *disk) |
| @@ -329,7 +326,7 @@ static const struct block_device_operations ide_gd_ops = { | |||
| 329 | .locked_ioctl = ide_gd_ioctl, | 326 | .locked_ioctl = ide_gd_ioctl, |
| 330 | .getgeo = ide_gd_getgeo, | 327 | .getgeo = ide_gd_getgeo, |
| 331 | .media_changed = ide_gd_media_changed, | 328 | .media_changed = ide_gd_media_changed, |
| 332 | .set_capacity = ide_gd_set_capacity, | 329 | .unlock_native_capacity = ide_gd_unlock_native_capacity, |
| 333 | .revalidate_disk = ide_gd_revalidate_disk | 330 | .revalidate_disk = ide_gd_revalidate_disk |
| 334 | }; | 331 | }; |
| 335 | 332 | ||
