Skip to contentSkip to conversation

HPA resume fix

PATCH In review Lee Trager 3 participants 7 messages Aug 29, 2006 – Aug 30, 2006 libata

lore
Share & tools
lore

Lee Trager

author
#0 lore raw

PATCH 1/1 HPA resume fix

This patch fixes a problem with computers that have HPA on their hard drive and not being able to come out of resume from RAM or disk. This is my first patch to the kernel and third time submitting it, hopefully I got it right this time.

---

drivers/ide/ide-disk.c +12 -0
diff -uprN -X linux-2.6.18-rc5/Documentation/dontdiff linux-2.6.18-rc5-old/drivers/ide/ide-disk.c linux-2.6.18-rc5/drivers/ide/ide-disk.c
@@ -1024,6 +1024,17 @@ static void ide_disk_release(struct 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
@@ -1067,6 +1078,7 @@ static ide_driver_t idedisk_driver = {
 	.error			= __ide_error,
 	.abort			= __ide_abort,
 	.proc			= idedisk_proc,
+	.resume			= ide_disk_resume,
 };
 
 static int idedisk_open(struct inode *inode, struct file *filp)
drivers/ide/ide.c +8 -1
diff -uprN -X linux-2.6.18-rc5/Documentation/dontdiff linux-2.6.18-rc5-old/drivers/ide/ide.c linux-2.6.18-rc5/drivers/ide/ide.c
@@ -1229,9 +1229,11 @@ static int generic_ide_suspend(struct de
 static int generic_ide_resume(struct device *dev)
 {
 	ide_drive_t *drive = dev->driver_data;
+	ide_driver_t *drv = to_ide_driver(dev->driver);
 	struct request rq;
 	struct request_pm_state rqpm;
 	ide_task_t args;
+	int err;
 
 	memset(&rq, 0, sizeof(rq));
 	memset(&rqpm, 0, sizeof(rqpm));
@@ -1242,7 +1244,12 @@ static int generic_ide_resume(struct 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->resume)
+		drv->resume(drive);
+
+	return err;
 }
 
 int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev,
include/linux/ide.h +1 -0
diff -uprN -X linux-2.6.18-rc5/Documentation/dontdiff linux-2.6.18-rc5-old/include/linux/ide.h linux-2.6.18-rc5/include/linux/ide.h
@@ -987,6 +987,7 @@ typedef struct ide_driver_s {
 	int		(*probe)(ide_drive_t *);
 	void		(*remove)(ide_drive_t *);
 	void		(*shutdown)(ide_drive_t *);
+	void		(*resume)(ide_drive_t *);
 } ide_driver_t;
 
 #define to_ide_driver(drv) container_of(drv, ide_driver_t, gen_driver)
Acked-by on v1 1/1
#1 lore raw

Ar Maw, 2006-08-29 am 05:55 -0400, ysgrifennodd Lee Trager:

Quoted 6 lines

This patch fixes a problem with computers that have HPA on their hard drive and not being able to come out of resume from RAM or disk. This is my first patch to the kernel and third time submitting it, hopefully I got it right this time.

For -mm only to get more testing

#2 lore raw
Quoted 11 lines · Alan Cox

Ar Maw, 2006-08-29 am 05:55 -0400, ysgrifennodd Lee Trager:

Quoted 6 lines

This patch fixes a problem with computers that have HPA on their hard drive and not being able to come out of resume from RAM or disk. This is my first patch to the kernel and third time submitting it, hopefully I got it right this time.

For -mm only to get more testing

It should go into the state machine as described imho. Bart?

Signature · 1 line
Jens Axboe
#3 lore raw

Ar Maw, 2006-08-29 am 13:42 +0200, ysgrifennodd Jens Axboe:

Quoted 6 lines · Alan Cox
Quoted 3 lines

For -mm only to get more testing

It should go into the state machine as described imho. Bart?

If it works then yes it can become an explicit state. Firstly we need to find out if it works.

#4 lore raw
Quoted 10 lines · Alan Cox

Ar Maw, 2006-08-29 am 13:42 +0200, ysgrifennodd Jens Axboe:

Quoted 6 lines · Alan Cox
Quoted 3 lines

For -mm only to get more testing

It should go into the state machine as described imho. Bart?

If it works then yes it can become an explicit state. Firstly we need to find out if it works.

I think Lee tested and verified both this variant and the first one he had, so I hope that it works :-)

Signature · 1 line
Jens Axboe
author
#5 lore raw
Quoted 10 lines · Jens Axboe
Quoted 8 lines · Alan Cox

Ar Maw, 2006-08-29 am 13:42 +0200, ysgrifennodd Jens Axboe:

Quoted 6 lines · Alan Cox
Quoted 5 lines

For -mm only to get more testing

Quoted 10 lines
Quoted 5 lines
Quoted 2 lines

It should go into the state machine as described imho. Bart?

If it works then yes it can become an explicit state. Firstly we need to find out if it works.

I think Lee tested and verified both this variant and the first one he had, so I hope that it works :-)

It looks like we cross mailed. Anyway my patch is going into the mm sources for testing. For the record I've been using this for the past few weeks and its working great. I'll try to figure out how to create it's own resume step next and submit that.

#6 lore raw
Quoted 17 lines · Lee Trager
Quoted 16 lines · Jens Axboe
Quoted 13 lines · Alan Cox

Ar Maw, 2006-08-29 am 13:42 +0200, ysgrifennodd Jens Axboe:

Quoted 8 lines · Alan Cox
Quoted 5 lines

For -mm only to get more testing

It should go into the state machine as described imho. Bart?

If it works then yes it can become an explicit state. Firstly we need to find out if it works.

Quoted 8 lines
Quoted 4 lines

I think Lee tested and verified both this variant and the first one he had, so I hope that it works :-)

It looks like we cross mailed. Anyway my patch is going into the mm sources for testing. For the record I've been using this for the past few weeks and its working great. I'll try to figure out how to create it's own resume step next and submit that.

Thanks, it should not be a lot of work!

Signature · 1 line
Jens Axboe