lkml.org 
[lkml]   [2008]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: 2.6.25 to 2.6.26-rc8 regression (related to ahci and acpi _GTF)
Mathieu Bérard wrote:
> Tejun Heo a écrit :
>> Rafael J. Wysocki wrote:
>>
>>> [Adding CCs.]
>>>
>>> On Tuesday, 1 of July 2008, Mathieu Bérard wrote:
>>>
>>>> Hi,
>>>> I have a laptop with an ICH6M SATA Controller and a Hitachi hard drive.
>>>> While it worked well using the ahci module and Linux 2.6.25,
>>>> it get randomly 'stuck' for several seconds to several minutes with 2.6.26-rc8.
>>>> Successive errors progressively reduce the ATA link speed.
>>>>
>>>> Passing the libata.noacpi parameter is an effective workaround.
>>>>
>>>> Please note that it's not the first time i have this kind of issue, see:
>>>> http://marc.info/?l=linux-ide&m=117305595312399&w=2
>>>> This was found to be a bad interaction between my _GTF taskfile, which enable the
>>>> "Enable Device-Initiated Interface Power State Transitions" feature, and NCQ.
>>>> The driver was later NCQ blacklisted to correct the problem.
>>>>
>> Can you please post the result of "hdparm -I /dev/sda" and full kernel
>> boot log? 0xca is not a NCQ command so the it's not related to NCQ at
>> all. It seems we'll need to filter out DIPM commands from _GTF.
>>
>>
> Hi,
> hdparm and dmesg output attached.
>
> I was not expecting anything related to NCQ as my drive is blacklisted,
> I was just mentioning previous issue with that hardware.
>
> Do you know what has changed in this version that is now causing failure
> with DIPM ? I could bisect to try to find out, but this will be painful
> as the
> device hang may only appears after several minutes of disk activity.

Can you please test the attached patch?

--
tejun
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
index 3ff8b14..abea74b 100644
--- a/drivers/ata/libata-acpi.c
+++ b/drivers/ata/libata-acpi.c
@@ -29,14 +29,16 @@
enum {
ATA_ACPI_FILTER_SETXFER = 1 << 0,
ATA_ACPI_FILTER_LOCK = 1 << 1,
+ ATA_ACPI_FILTER_DIPM = 1 << 2,

ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER |
- ATA_ACPI_FILTER_LOCK,
+ ATA_ACPI_FILTER_LOCK |
+ ATA_ACPI_FILTER_DIPM,
};

static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT;
module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644);
-MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock)");
+MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock, 0x4=DIPM)");

#define NO_PORT_MULT 0xffff
#define SATA_ADR(root, pmp) (((root) << 16) | (pmp))
@@ -690,6 +692,14 @@ static int ata_acpi_filter_tf(const struct ata_taskfile *tf,
return 1;
}

+ if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_DIPM) {
+ /* inhibit enabling DIPM */
+ if (tf->command == ATA_CMD_SET_FEATURES &&
+ tf->feature == SETFEATURES_SATA_ENABLE &&
+ tf->nsect == SATA_DIPM)
+ return 1;
+ }
+
return 0;
}
\
 
 \ /
  Last update: 2008-07-04 06:55    [W:0.046 / U:0.264 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site