diff options
author | Tejun Heo <tj@kernel.org> | 2009-09-15 15:17:28 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2009-10-06 00:26:27 -0400 |
commit | 110f66d25c33c2259b1125255fa7063ab07b8340 (patch) | |
tree | 2d524b3f27aa168eb01cbb007c2bfa195bea42f4 | |
parent | fa5b561c4ea170caf9759109acc2e961a7e83bea (diff) |
libata: make gtf_filter per-dev
Add ->gtf_filter to ata_device and set it to ata_acpi_gtf_filter when
initializing ata_link. This is to allow quirks which apply different
gtf filters.
Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
-rw-r--r-- | drivers/ata/libata-acpi.c | 17 | ||||
-rw-r--r-- | drivers/ata/libata-core.c | 3 | ||||
-rw-r--r-- | drivers/ata/libata.h | 2 | ||||
-rw-r--r-- | include/linux/libata.h | 1 |
4 files changed, 15 insertions, 8 deletions
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 960c6a7caa83..b0882cddfd4c 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
@@ -20,7 +20,7 @@ | |||
20 | 20 | ||
21 | #include <acpi/acpi_bus.h> | 21 | #include <acpi/acpi_bus.h> |
22 | 22 | ||
23 | static unsigned int ata_acpi_gtf_filter = ATA_ACPI_FILTER_DEFAULT; | 23 | 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, 0x8=FPDMA non-zero offset, 0x10=FPDMA DMA Setup FIS auto-activate)"); | 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 | ||
@@ -603,10 +603,11 @@ static void ata_acpi_gtf_to_tf(struct ata_device *dev, | |||
603 | tf->command = gtf->tf[6]; /* 0x1f7 */ | 603 | tf->command = gtf->tf[6]; /* 0x1f7 */ |
604 | } | 604 | } |
605 | 605 | ||
606 | static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | 606 | static int ata_acpi_filter_tf(struct ata_device *dev, |
607 | const struct ata_taskfile *tf, | ||
607 | const struct ata_taskfile *ptf) | 608 | const struct ata_taskfile *ptf) |
608 | { | 609 | { |
609 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_SETXFER) { | 610 | if (dev->gtf_filter & ATA_ACPI_FILTER_SETXFER) { |
610 | /* libata doesn't use ACPI to configure transfer mode. | 611 | /* libata doesn't use ACPI to configure transfer mode. |
611 | * It will only confuse device configuration. Skip. | 612 | * It will only confuse device configuration. Skip. |
612 | */ | 613 | */ |
@@ -615,7 +616,7 @@ static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | |||
615 | return 1; | 616 | return 1; |
616 | } | 617 | } |
617 | 618 | ||
618 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_LOCK) { | 619 | if (dev->gtf_filter & ATA_ACPI_FILTER_LOCK) { |
619 | /* BIOS writers, sorry but we don't wanna lock | 620 | /* BIOS writers, sorry but we don't wanna lock |
620 | * features unless the user explicitly said so. | 621 | * features unless the user explicitly said so. |
621 | */ | 622 | */ |
@@ -640,18 +641,18 @@ static int ata_acpi_filter_tf(const struct ata_taskfile *tf, | |||
640 | if (tf->command == ATA_CMD_SET_FEATURES && | 641 | if (tf->command == ATA_CMD_SET_FEATURES && |
641 | tf->feature == SETFEATURES_SATA_ENABLE) { | 642 | tf->feature == SETFEATURES_SATA_ENABLE) { |
642 | /* inhibit enabling DIPM */ | 643 | /* inhibit enabling DIPM */ |
643 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_DIPM && | 644 | if (dev->gtf_filter & ATA_ACPI_FILTER_DIPM && |
644 | tf->nsect == SATA_DIPM) | 645 | tf->nsect == SATA_DIPM) |
645 | return 1; | 646 | return 1; |
646 | 647 | ||
647 | /* inhibit FPDMA non-zero offset */ | 648 | /* inhibit FPDMA non-zero offset */ |
648 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_FPDMA_OFFSET && | 649 | if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_OFFSET && |
649 | (tf->nsect == SATA_FPDMA_OFFSET || | 650 | (tf->nsect == SATA_FPDMA_OFFSET || |
650 | tf->nsect == SATA_FPDMA_IN_ORDER)) | 651 | tf->nsect == SATA_FPDMA_IN_ORDER)) |
651 | return 1; | 652 | return 1; |
652 | 653 | ||
653 | /* inhibit FPDMA auto activation */ | 654 | /* inhibit FPDMA auto activation */ |
654 | if (ata_acpi_gtf_filter & ATA_ACPI_FILTER_FPDMA_AA && | 655 | if (dev->gtf_filter & ATA_ACPI_FILTER_FPDMA_AA && |
655 | tf->nsect == SATA_FPDMA_AA) | 656 | tf->nsect == SATA_FPDMA_AA) |
656 | return 1; | 657 | return 1; |
657 | } | 658 | } |
@@ -705,7 +706,7 @@ static int ata_acpi_run_tf(struct ata_device *dev, | |||
705 | pptf = &ptf; | 706 | pptf = &ptf; |
706 | } | 707 | } |
707 | 708 | ||
708 | if (!ata_acpi_filter_tf(&tf, pptf)) { | 709 | if (!ata_acpi_filter_tf(dev, &tf, pptf)) { |
709 | rtf = tf; | 710 | rtf = tf; |
710 | err_mask = ata_exec_internal(dev, &rtf, NULL, | 711 | err_mask = ata_exec_internal(dev, &rtf, NULL, |
711 | DMA_NONE, NULL, 0, 0); | 712 | DMA_NONE, NULL, 0, 0); |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 0ddaf43d68c6..b525a0981348 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -5591,6 +5591,9 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp) | |||
5591 | 5591 | ||
5592 | dev->link = link; | 5592 | dev->link = link; |
5593 | dev->devno = dev - link->device; | 5593 | dev->devno = dev - link->device; |
5594 | #ifdef CONFIG_ATA_ACPI | ||
5595 | dev->gtf_filter = ata_acpi_gtf_filter; | ||
5596 | #endif | ||
5594 | ata_dev_init(dev); | 5597 | ata_dev_init(dev); |
5595 | } | 5598 | } |
5596 | } | 5599 | } |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index be8e2628f82c..823e63096362 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -118,6 +118,8 @@ extern void ata_lpm_schedule(struct ata_port *ap, enum link_pm); | |||
118 | 118 | ||
119 | /* libata-acpi.c */ | 119 | /* libata-acpi.c */ |
120 | #ifdef CONFIG_ATA_ACPI | 120 | #ifdef CONFIG_ATA_ACPI |
121 | extern unsigned int ata_acpi_gtf_filter; | ||
122 | |||
121 | extern void ata_acpi_associate_sata_port(struct ata_port *ap); | 123 | extern void ata_acpi_associate_sata_port(struct ata_port *ap); |
122 | extern void ata_acpi_associate(struct ata_host *host); | 124 | extern void ata_acpi_associate(struct ata_host *host); |
123 | extern void ata_acpi_dissociate(struct ata_host *host); | 125 | extern void ata_acpi_dissociate(struct ata_host *host); |
diff --git a/include/linux/libata.h b/include/linux/libata.h index aa52794d2a03..87698640c091 100644 --- a/include/linux/libata.h +++ b/include/linux/libata.h | |||
@@ -598,6 +598,7 @@ struct ata_device { | |||
598 | #ifdef CONFIG_ATA_ACPI | 598 | #ifdef CONFIG_ATA_ACPI |
599 | acpi_handle acpi_handle; | 599 | acpi_handle acpi_handle; |
600 | union acpi_object *gtf_cache; | 600 | union acpi_object *gtf_cache; |
601 | unsigned int gtf_filter; | ||
601 | #endif | 602 | #endif |
602 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ | 603 | /* n_sector is CLEAR_BEGIN, read comment above CLEAR_BEGIN */ |
603 | u64 n_sectors; /* size of device, if ATA */ | 604 | u64 n_sectors; /* size of device, if ATA */ |