aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2009-09-15 15:17:02 -0400
committerJeff Garzik <jgarzik@redhat.com>2009-10-06 00:26:26 -0400
commitfa5b561c4ea170caf9759109acc2e961a7e83bea (patch)
tree55d872dc6bba8bce920f95d1a19bf441784c94ac
parentf1bce7f80e3b400cf29787b0afa9c3042b959017 (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.c19
-rw-r--r--include/linux/ata.h3
-rw-r--r--include/linux/libata.h2
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
23static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; 23static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT;
24module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644); 24module_param_named(acpi_gtf_filter, ata_acpi_gtf_filter, int, 0644);
25MODULE_PARM_DESC(acpi_gtf_filter, "filter mask for ACPI _GTF commands, set to filter out (0x1=set xfermode, 0x2=lock/freeze lock, 0x4=DIPM)"); 25MODULE_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 |