From 0089895523e5aa060a81281c71e9ad68121f5ce9 Mon Sep 17 00:00:00 2001 From: Lee Trager Date: Fri, 8 Jun 2007 15:14:30 +0200 Subject: [PATCH] --- yaml --- r: 57527 b: refs/heads/master c: 0d2157f78d17fcee17791f54959e67cc0af0da74 h: refs/heads/master i: 57525: 7c3b0139848aed33e273fbfb4e8246f704d749cf 57523: e8f266d6cba46581b53122b91fc5329b604042f8 57519: 3056145e2fc053ded0406ce2f624c364904a24b0 v: v3 --- [refs] | 2 +- trunk/drivers/ide/ide-disk.c | 12 ++++++++++++ trunk/drivers/ide/ide.c | 9 ++++++++- trunk/include/linux/ide.h | 1 + 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index bdb9a457e15d..4c4d0829cef0 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0380dad45e4f5a606025cc4df2a2cd26af08796b +refs/heads/master: 0d2157f78d17fcee17791f54959e67cc0af0da74 diff --git a/trunk/drivers/ide/ide-disk.c b/trunk/drivers/ide/ide-disk.c index 7fff773f2df7..dc2175c81f5e 100644 --- a/trunk/drivers/ide/ide-disk.c +++ b/trunk/drivers/ide/ide-disk.c @@ -1037,6 +1037,17 @@ static void ide_disk_release(struct kref *kref) static int ide_disk_probe(ide_drive_t *drive); +/* + * 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) +{ + if (idedisk_supports_hpa(drive->id)) + init_idedisk_capacity(drive); +} + static void ide_device_shutdown(ide_drive_t *drive) { #ifdef CONFIG_ALPHA @@ -1071,6 +1082,7 @@ static ide_driver_t idedisk_driver = { }, .probe = ide_disk_probe, .remove = ide_disk_remove, + .resume = ide_disk_resume, .shutdown = ide_device_shutdown, .version = IDEDISK_VERSION, .media = ide_disk, diff --git a/trunk/drivers/ide/ide.c b/trunk/drivers/ide/ide.c index 6002713a20a1..0af0d1614f75 100644 --- a/trunk/drivers/ide/ide.c +++ b/trunk/drivers/ide/ide.c @@ -1010,9 +1010,11 @@ static int generic_ide_resume(struct device *dev) { ide_drive_t *drive = dev->driver_data; ide_hwif_t *hwif = HWIF(drive); + ide_driver_t *drv = to_ide_driver(dev->driver); struct request rq; struct request_pm_state rqpm; ide_task_t args; + int err; /* Call ACPI _STM only once */ if (!(drive->dn % 2)) @@ -1029,7 +1031,12 @@ static int generic_ide_resume(struct device *dev) rqpm.pm_step = ide_pm_state_start_resume; rqpm.pm_state = PM_EVENT_ON; - return ide_do_drive_cmd(drive, &rq, ide_head_wait); + err = ide_do_drive_cmd(drive, &rq, ide_head_wait); + + if (err == 0 && drv && drv->resume) + drv->resume(drive); + + return err; } int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev, diff --git a/trunk/include/linux/ide.h b/trunk/include/linux/ide.h index 07aba87d369d..1e365acdd369 100644 --- a/trunk/include/linux/ide.h +++ b/trunk/include/linux/ide.h @@ -1001,6 +1001,7 @@ struct ide_driver_s { struct device_driver gen_driver; int (*probe)(ide_drive_t *); void (*remove)(ide_drive_t *); + void (*resume)(ide_drive_t *); void (*shutdown)(ide_drive_t *); #ifdef CONFIG_IDE_PROC_FS ide_proc_entry_t *proc;