diff options
| author | Tejun Heo <tj@kernel.org> | 2009-09-15 15:17:02 -0400 |
|---|---|---|
| committer | Jeff Garzik <jgarzik@redhat.com> | 2009-10-06 00:26:26 -0400 |
| commit | fa5b561c4ea170caf9759109acc2e961a7e83bea (patch) | |
| tree | 55d872dc6bba8bce920f95d1a19bf441784c94ac | |
| parent | f1bce7f80e3b400cf29787b0afa9c3042b959017 (diff) | |
libata: implement more acpi filtering options
Currently libata-acpi can only filter DIPM among SATA feature enables
via _GTF. This patch adds the capability to filter out FPDMA non-zero
offset, in-order guarantee and auto-activation.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
| -rw-r--r-- | drivers/ata/libata-acpi.c | 19 | ||||
| -rw-r--r-- | include/linux/ata.h | 3 | ||||
| -rw-r--r-- | include/linux/libata.h | 2 |
3 files changed, 20 insertions, 4 deletions
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 719e7d237dc8..960c6a7caa83 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
| @@ -22,7 +22,7 @@ | |||
| 22 | 22 | ||
| 23 | static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; | 23 | static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; |
| 24 | module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644); | 24 | module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644); |
| 25 | 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)"); | 25 | 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, 0x8=FPDMA non-zero offset, 0x10=FPDMA DMA Setup FIS auto-activate)"); |
| 26 | 26 | ||
| 27 | #define NO_PORT_MULT 0xffff | 27 | #define NO_PORT_MULT 0xffff |
| 28 | #define SATA_ADR(root, pmp) (((root) << 16) | (pmp)) | 28 | #define SATA_ADR(root, pmp) (((root) << 16) | (pmp)) |
| @@ -637,12 +637,23 @@ static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | |||
| 637 | return 1; | 637 | return 1; |
| 638 | } | 638 | } |
| 639 | 639 | ||
| 640 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_DIPM) { | 640 | if (tf->command == ATA_CMD_SET_FEATURES && |
| 641 | tf->feature == SETFEATURES_SATA_ENABLE) { | ||
| 641 | /* inhibit enabling DIPM */ | 642 | /* inhibit enabling DIPM */ |
| 642 | if (tf->command == ATA_CMD_SET_FEATURES && | 643 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_DIPM && |
| 643 | tf->feature == SETFEATURES_SATA_ENABLE && | ||
| 644 | tf->nsect == SATA_DIPM) | 644 | tf->nsect == SATA_DIPM) |
| 645 | return 1; | 645 | return 1; |
| 646 | |||
| 647 | /* inhibit FPDMA non-zero offset */ | ||
| 648 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_FPDMA_OFFSET && | ||
| 649 | (tf->nsect == SATA_FPDMA_OFFSET || | ||
| 650 | tf->nsect == SATA_FPDMA_IN_ORDER)) | ||
| 651 | return 1; | ||
| 652 | |||
| 653 | /* inhibit FPDMA auto activation */ | ||
| 654 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_FPDMA_AA && | ||
| 655 | tf->nsect == SATA_FPDMA_AA) | ||
| 656 | return 1; | ||
| 646 | } | 657 | } |
| 647 | 658 | ||
| 648 | return 0; | 659 | return 0; |
diff --git a/include/linux/ata.h b/include/linux/ata.h index 7c5beafa972c..4fb357312b3b 100644 --- a/include/linux/ata.h +++ b/include/linux/ata.h | |||
| @@ -334,9 +334,12 @@ enum { | |||
| 334 | SETFEATURES_SATA_DISABLE = 0x90, /* Disable use of SATA feature */ | 334 | SETFEATURES_SATA_DISABLE = 0x90, /* Disable use of SATA feature */ |
| 335 | 335 | ||
| 336 | /* SETFEATURE Sector counts for SATA features */ | 336 | /* SETFEATURE Sector counts for SATA features */ |
| 337 | SATA_FPDMA_OFFSET = 0x01, /* FPDMA non-zero buffer offsets */ | ||
| 337 | SATA_FPDMA_AA = 0x02, /* FPDMA Setup FIS Auto-Activate */ | 338 | SATA_FPDMA_AA = 0x02, /* FPDMA Setup FIS Auto-Activate */ |
| 338 | SATA_DIPM = 0x03, /* Device Initiated Power Management */ | 339 | SATA_DIPM = 0x03, /* Device Initiated Power Management */ |
| 340 | SATA_FPDMA_IN_ORDER = 0x04, /* FPDMA in-order data delivery */ | ||
| 339 | SATA_AN = 0x05, /* Asynchronous Notification */ | 341 | SATA_AN = 0x05, /* Asynchronous Notification */ |
| 342 | SATA_SSP = 0x06, /* Software Settings Preservation */ | ||
| 340 | 343 | ||
| 341 | /* feature values for SET_MAX */ | 344 | /* feature values for SET_MAX */ |
| 342 | ATA_SET_MAX_ADDR = 0x00, | 345 | ATA_SET_MAX_ADDR = 0x00, |
diff --git a/include/linux/libata.h b/include/linux/libata.h index 5b2f7491fb26..aa52794d2a03 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
| @@ -423,6 +423,8 @@ enum { | |||
| 423 | ATA_ACPI_FILTER_SETXFER = 1 << 0, | 423 | ATA_ACPI_FILTER_SETXFER = 1 << 0, |
| 424 | ATA_ACPI_FILTER_LOCK = 1 << 1, | 424 | ATA_ACPI_FILTER_LOCK = 1 << 1, |
| 425 | ATA_ACPI_FILTER_DIPM = 1 << 2, | 425 | ATA_ACPI_FILTER_DIPM = 1 << 2, |
| 426 | ATA_ACPI_FILTER_FPDMA_OFFSET = 1 << 3, /* FPDMA non-zero offset */ | ||
| 427 | ATA_ACPI_FILTER_FPDMA_AA = 1 << 4, /* FPDMA auto activate */ | ||
| 426 | 428 | ||
| 427 | ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER | | 429 | ATA_ACPI_FILTER_DEFAULT = ATA_ACPI_FILTER_SETXFER | |
| 428 | ATA_ACPI_FILTER_LOCK | | 430 | ATA_ACPI_FILTER_LOCK | |
