HPA Resume patch
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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel. If I made a mistake please be gentle and correct me ;)
Lee Trager
include/linux/ide.h +11 -0
@@ -1201,6 +1201,17 @@void ide_register_subdriver (ide_drive_t *,ide_driver_t *);void ide_unregister_subdriver (ide_drive_t *,ide_driver_t *); +/* Bits 10 of command_set_1 and cfs_enable_1 must be equal, +* so on non-buggy drives we need test only one. +* However, we should also check whether these fields are valid. +*/ +static inline int idedisk_supports_hpa (const struct hd_driveid *id) +{ +return (id->command_set_1 &0x0400 ) && (id->cfs_enable_1 &0x0400 ); +} + +extern void init_idedisk_capacity (ide_drive_t *drive); +#define ON_BOARD 1#define NEVER_BOARD 0
drivers/ide/ide-disk.c +3 -11
@@ -464,16 +464,6 @@ }/* -* Bits 10 of command_set_1 and cfs_enable_1 must be equal, -* so on non-buggy drives we need test only one. -* However, we should also check whether these fields are valid. -*/ -static inline int idedisk_supports_hpa (const struct hd_driveid *id) -{ -return (id->command_set_1 &0x0400 ) && (id->cfs_enable_1 &0x0400 ); -} - -/* * The same here. */ static inline int idedisk_supports_lba48 (const struct hd_driveid *id)
@@ -528,7 +518,7 @@* in above order (i.e., if value of higher priority is available, * reset will be ignored). */ -static void init_idedisk_capacity (ide_drive_t *drive) +void init_idedisk_capacity (ide_drive_t *drive) {struct hd_driveid *id = drive->id;/*
@@ -555,6 +545,8 @@ } } +EXPORT_SYMBOL (init_idedisk_capacity); +static sector_t idedisk_capacity (ide_drive_t *drive) {return drive->capacity64 - drive->sect0;
drivers/ide/ide.c +10 -1
@@ -1232,6 +1232,7 @@struct request rq;struct request_pm_state rqpm;ide_task_t args; +int ide_cmd;memset (&rq,0 ,sizeof (rq));memset (&rqpm,0 ,sizeof (rqpm));
@@ -1242,7 +1243,15 @@ rqpm.pm_step = ide_pm_state_start_resume; rqpm.pm_state =PM_EVENT_ON ; -return ide_do_drive_cmd (drive, &rq, ide_head_wait); + ide_cmd =ide_do_drive_cmd (drive, &rq, ide_head_wait); + +/* check to see if this is a hard drive +* if it is then checkhpa needs to be +* disabled */ +if (drive->media == ide_disk &&idedisk_supports_hpa (drive->id)) +init_idedisk_capacity (drive); + +return ide_cmd; } int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev,
Quoted 6 lines · On Sun, 27 Aug 2006 04:42:03 -0400 Lee Trager wrote:
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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel. If I made a mistake please be gentle and correct me ;)
The patch adds a call from ide.c to a function inside ide-disk.c - this won't work when IDE support is built as modules (it will cause a circular dependency between ide-core and ide-disk modules).
The proper way to do such calls is to add a new method to ide_driver_t and call it from generic_ide_resume(). Also, if the ide_do_drive_cmd() call failed, it is probably unsafe to reset HPA, so you need to check the result and call the resume method only if the low-level resume has succeeded.
And please and "-p" to diff options.
Hi!
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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel.
Congratulations for a first patch.
Quoted 1 line
If I made a mistake please be gentle and correct me ;)
We'll need signed-off-by: line next time.
Stefan, can we get this some testing? Or anyone else with thinkpad with host-protected area still enabled?
Pavel
Quoted 87 lines
diff -Naur
linux-2.6.18-rc4-old/include/linux/ide.hlinux-2.6.18-rc4/include/linux/ide.hinclude/linux/ide.h +11
-0@@ -1201,6 +1201,17 @@void ide_register_subdriver (ide_drive_t *,ide_driver_t *);void ide_unregister_subdriver (ide_drive_t *,ide_driver_t *); +/* Bits 10 of command_set_1 and cfs_enable_1 must be equal, +* so on non-buggy drives we need test only one. +* However, we should also check whether these fields are valid. +*/ +static inline int idedisk_supports_hpa (const struct hd_driveid *id) +{ +return (id->command_set_1 &0x0400 ) && (id->cfs_enable_1 &0x0400 ); +} + +extern void init_idedisk_capacity (ide_drive_t *drive); +#define ON_BOARD 1#define NEVER_BOARD 0diff -Naur
linux-2.6.18-rc4-old/drivers/ide/ide-disk.clinux-2.6.18-rc4/drivers/ide/ide-disk.cdrivers/ide/ide-disk.c +3
-11@@ -464,16 +464,6 @@ }/* -* Bits 10 of command_set_1 and cfs_enable_1 must be equal, -* so on non-buggy drives we need test only one. -* However, we should also check whether these fields are valid. -*/ -static inline int idedisk_supports_hpa (const struct hd_driveid *id) -{ -return (id->command_set_1 &0x0400 ) && (id->cfs_enable_1 &0x0400 ); -} - -/* * The same here. */ static inline int idedisk_supports_lba48 (const struct hd_driveid *id)@@ -528,7 +518,7 @@* in above order (i.e., if value of higher priority is available, * reset will be ignored). */ -static void init_idedisk_capacity (ide_drive_t *drive) +void init_idedisk_capacity (ide_drive_t *drive) {struct hd_driveid *id = drive->id;/* @@ -555,6 +545,8 @@ } } +EXPORT_SYMBOL (init_idedisk_capacity); +static sector_t idedisk_capacity (ide_drive_t *drive) {return drive->capacity64 - drive->sect0;diff -Naur
linux-2.6.18-rc4-old/drivers/ide/ide.clinux-2.6.18-rc4/drivers/ide/ide.cdrivers/ide/ide.c +10
-1@@ -1232,6 +1232,7 @@struct request rq;struct request_pm_state rqpm;ide_task_t args; +int ide_cmd;memset (&rq,0 ,sizeof (rq));memset (&rqpm,0 ,sizeof (rqpm));@@ -1242,7 +1243,15 @@ rqpm.pm_step = ide_pm_state_start_resume; rqpm.pm_state =PM_EVENT_ON ; -return ide_do_drive_cmd (drive, &rq, ide_head_wait); + ide_cmd =ide_do_drive_cmd (drive, &rq, ide_head_wait); + +/* check to see if this is a hard drive +* if it is then checkhpa needs to be +* disabled */ +if (drive->media == ide_disk &&idedisk_supports_hpa (drive->id)) +init_idedisk_capacity (drive); + +return ide_cmd; } int generic_ide_ioctl(ide_drive_t *drive, struct file *file, struct block_device *bdev,
Signature · 1 line
Thanks for all the (sleeping) penguins.
Quoted 9 lines · Pavel Machek
Hi!
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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel.
Quoted 8 lines
Congratulations for a first patch.
Quoted 1 line
If I made a mistake please be gentle and correct me ;)
We'll need signed-off-by: line next time.
Stefan, can we get this some testing? Or anyone else with thinkpad with host-protected area still enabled?
It has design issues, at someone else already noticed. hpa restore needs to be a driver private step, included in the resume state machine. The current patch is a gross layering violation.
But thanks to Lee for taking a stab at this, I hope he'll continue and get it polished :-)
Signature · 1 line
Jens Axboe
Quoted 23 lines · Jens Axboe
Quoted 13 lines · Pavel Machek
Hi!
Quoted 7 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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel.
Congratulations for a first patch.
Quoted 7 lines
Quoted 2 lines
If I made a mistake please be gentle and correct me ;)
We'll need signed-off-by: line next time.
Stefan, can we get this some testing? Or anyone else with thinkpad with host-protected area still enabled?
Quoted 8 lines
It has design issues, at someone else already noticed. hpa restore needs to be a driver private step, included in the resume state machine. The current patch is a gross layering violation.
But thanks to Lee for taking a stab at this, I hope he'll continue and get it polished :-)
Ok I redid the patch following exactly what Sergey and Randy said. This problem happens on any computer that has HPA on their drive when they come back from resume so I don't think you have to only test this with Thinkpad users. Anyway my only question is how to I get my patched signed off by someone?
Thanks for all your help!
include/linux/ide.h +1 -0
@@ -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)
drivers/ide/ide.c +8 -1
@@ -1229,9 +1229,11 @@ static int generic_ide_suspend(struct destatic 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,
drivers/ide/ide-disk.c +12 -0
@@ -1024,6 +1024,17 @@ static void ide_disk_release(struct krefstatic 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)
Quoted 32 lines · On Mon, 28 Aug 2006 22:14:34 -0400 Lee Trager wrote:
Quoted 23 lines · Jens Axboe
Quoted 13 lines · Pavel Machek
Hi!
Quoted 7 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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel.
Congratulations for a first patch.
Quoted 7 lines
Quoted 2 lines
If I made a mistake please be gentle and correct me ;)
We'll need signed-off-by: line next time.
Stefan, can we get this some testing? Or anyone else with thinkpad with host-protected area still enabled?
Quoted 8 lines
It has design issues, at someone else already noticed. hpa restore needs to be a driver private step, included in the resume state machine. The current patch is a gross layering violation.
But thanks to Lee for taking a stab at this, I hope he'll continue and get it polished :-)
Quoted 5 lines
Ok I redid the patch following exactly what Sergey and Randy said. This problem happens on any computer that has HPA on their drive when they come back from resume so I don't think you have to only test this with Thinkpad users. Anyway my only question is how to I get my patched signed off by someone?
You do that :) after you read Documentation/SubmittingPatches and can "sign off" on the patch.
Quoted 61 lines
Thanks for all your help!
include/linux/ide.h +1
-0@@ -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)drivers/ide/ide.c +8
-1@@ -1229,9 +1229,11 @@ static int generic_ide_suspend(struct destatic 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,drivers/ide/ide-disk.c +11
-0@@ -1024,6 +1024,17 @@ static void ide_disk_release(struct krefstatic 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
drivers/ide/ide-disk.c static ide_driver_t idedisk_driver = { · line 1084
Quoted 7 lines
drivers/ide/ide-disk.c +1
-0@@ -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)
---
~Randy
Quoted 121 lines · Randy.Dunlap
Quoted 39 lines · On Mon, 28 Aug 2006 22:14:34 -0400 Lee Trager wrote:
Quoted 28 lines · Jens Axboe
Quoted 16 lines · Pavel Machek
Hi!
Quoted 8 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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel.
Congratulations for a first patch.
Quoted 9 lines
Quoted 3 lines
If I made a mistake please be gentle and correct me ;)
We'll need signed-off-by: line next time.
Stefan, can we get this some testing? Or anyone else with thinkpad with host-protected area still enabled?
Quoted 9 lines
It has design issues, at someone else already noticed. hpa restore needs to be a driver private step, included in the resume state machine. The current patch is a gross layering violation.
But thanks to Lee for taking a stab at this, I hope he'll continue and get it polished :-)
Quoted 6 lines
Ok I redid the patch following exactly what Sergey and Randy said. This problem happens on any computer that has HPA on their drive when they come back from resume so I don't think you have to only test this with Thinkpad users. Anyway my only question is how to I get my patched signed off by someone?
You do that :) after you read
Documentation/SubmittingPatchesand can "sign off" on the patch.Quoted 67 lines
Thanks for all your help!
include/linux/ide.h +1
-0@@ -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)drivers/ide/ide.c +8
-1@@ -1229,9 +1229,11 @@ static int generic_ide_suspend(struct destatic 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,drivers/ide/ide-disk.c +12
-0@@ -1024,6 +1024,17 @@ static void ide_disk_release(struct krefstatic 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, };
Quoted 13 lines
drivers/ide/ide-disk.c static ide_driver_t idedisk_driver = { · line 1084
Quoted 2 lines
drivers/ide/ide-disk.c +0
-0static int idedisk_open (struct inode *inode,struct file *filp)---
~Randy
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Ok I read the docs on submitting patches and coding style, I'll resubmit.
Thanks!
Quoted 32 lines · Lee Trager
Quoted 23 lines · Jens Axboe
Quoted 13 lines · Pavel Machek
Hi!
Quoted 7 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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel.
Congratulations for a first patch.
Quoted 7 lines
Quoted 2 lines
If I made a mistake please be gentle and correct me ;)
We'll need signed-off-by: line next time.
Stefan, can we get this some testing? Or anyone else with thinkpad with host-protected area still enabled?
Quoted 8 lines
It has design issues, at someone else already noticed. hpa restore needs to be a driver private step, included in the resume state machine. The current patch is a gross layering violation.
But thanks to Lee for taking a stab at this, I hope he'll continue and get it polished :-)
Quoted 7 lines
Ok I redid the patch following exactly what Sergey and Randy said. This problem happens on any computer that has HPA on their drive when they come back from resume so I don't think you have to only test this with Thinkpad users. Anyway my only question is how to I get my patched signed off by someone?
Thanks for all your help!
While this is a _lot_ better than your previous patch, I don't think you quite understood my suggestion. Which is probably fault, so I'll try to be a little more verbose.
If you look at the suspend state machine, it goes through a (small) sequence of steps (see drivers/ide/ide-io.c:ide_complete_power_step()) and get the device suspended. Same thing for resume, just not that many steps there. My suggestion was to continue using this infrastructure and just add the HPA restore as a resume state. Right now it does:
ide_pm_state_start_resume (== idedisk_pm_idle)
complete that
ide_pm_restore_dma
complete thatand we are done. Your patch basically puts more actions into a single resume state switch, not ideal. What you want to do is have the HPA restore as an additional state.
Is that clearer? If not, let me know...
Signature · 1 line
Jens Axboe
Quoted 65 lines · Jens Axboe
Quoted 39 lines · Lee Trager
Quoted 28 lines · Jens Axboe
Quoted 16 lines · Pavel Machek
Hi!
Quoted 8 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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel.
Congratulations for a first patch.
Quoted 9 lines
Quoted 3 lines
If I made a mistake please be gentle and correct me ;)
We'll need signed-off-by: line next time.
Stefan, can we get this some testing? Or anyone else with thinkpad with host-protected area still enabled?
Quoted 9 lines
It has design issues, at someone else already noticed. hpa restore needs to be a driver private step, included in the resume state machine. The current patch is a gross layering violation.
But thanks to Lee for taking a stab at this, I hope he'll continue and get it polished :-)
Quoted 8 lines
Ok I redid the patch following exactly what Sergey and Randy said. This problem happens on any computer that has HPA on their drive when they come back from resume so I don't think you have to only test this with Thinkpad users. Anyway my only question is how to I get my patched signed off by someone?
Thanks for all your help!
While this is a _lot_ better than your previous patch, I don't think you quite understood my suggestion. Which is probably fault, so I'll try to be a little more verbose.
If you look at the suspend state machine, it goes through a (small) sequence of steps (see drivers/ide/ide-io.c:ide_complete_power_step()) and get the device suspended. Same thing for resume, just not that many steps there. My suggestion was to continue using this infrastructure and just add the HPA restore as a resume state. Right now it does:
ide_pm_state_start_resume (== idedisk_pm_idle) complete that ide_pm_restore_dma complete that
Quoted 7 lines
and we are done. Your patch basically puts more actions into a single resume state switch, not ideal. What you want to do is have the HPA restore as an additional state.
Is that clearer? If not, let me know...
Ok I've been looking through the source to see how to do this properly. I can't figure out where ide_generic_resume() is called from. It doesn't look like its called from ide_complete_power_step() I want to know because I want the HPA stuff to be done right after ide_generic_resume() is called. I'll do some testing to see if it works to get called before and after the DMA stuff.
Thanks,
Lee
Signature · 1 line
VGER BF report: U 0.5
Quoted 2 lines · Lee Trager
Thinkpad users. Anyway my only question is how to I get my patched signed off by someone?
You read Documentation/SubmittingPatches, and follow the directions there, and remember to merge in any comments people might have...
drivers/ide/ide.c static int generic_ide_resume(struct dev · line 1249
Quoted 3 lines
drivers/ide/ide.c +3
-0+ err =ide_do_drive_cmd (drive, &rq, ide_head_wait); + +if (err ==0 && drv->resume)
Often better written as:
if (!err && drv->resume)
Quoted 6 lines · On Sun, 27 Aug 2006 04:42:03 -0400 Lee Trager wrote:
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. I've tested this patch on 2.6.17.x and 2.6.18-rc4 and it works great on both of these. This patch also fixes the bug #6840. This is my first patch to the kernel and I was told to e-mail the above people to get my patch into the kernel. If I made a mistake please be gentle and correct me ;)
Please use inline patches if your mail system supports/allows it. Attachments make it difficult to review a patch.
(now do some cp-n-paste for comments)
+/* Bits 10 of command_set_1 and cfs_enable_1 must be equal,
+ * so on non-buggy drives we need test only one.
+ * However, we should also check whether these fields are valid. +*/
Long comment style in Linux is:
/*
* foo bar
* comments
*/
+static inline int idedisk_supports_hpa(const struct hd_driveid *id) +{
+ return (id->command_set_1 & 0x0400) && (id->cfs_enable_1 & 0x0400);
+}
Please use a #defined value for the 0x400.
(Yes, you just moved it from somewhere else.)
+ /* check to see if this is a hard drive
+ * if it is then checkhpa needs to be
+ * disabled */
Comment style again.
+ if(drive->media == ide_disk && idedisk_supports_hpa(drive->id))
space after "if".
+ init_idedisk_capacity(drive);
---
~Randy