diff options
Diffstat (limited to 'drivers/ata/ata_piix.c')
-rw-r--r-- | drivers/ata/ata_piix.c | 24 |
1 files changed, 22 insertions, 2 deletions
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index 6846b5629ed2..0ca4c3b78dc5 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
@@ -390,7 +390,8 @@ static struct ata_port_info piix_port_info[] = { | |||
390 | /* ich5_sata */ | 390 | /* ich5_sata */ |
391 | { | 391 | { |
392 | .sht = &piix_sht, | 392 | .sht = &piix_sht, |
393 | .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR, | 393 | .host_flags = ATA_FLAG_SATA | PIIX_FLAG_CHECKINTR | |
394 | PIIX_FLAG_IGNORE_PCS, | ||
394 | .pio_mask = 0x1f, /* pio0-4 */ | 395 | .pio_mask = 0x1f, /* pio0-4 */ |
395 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 396 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
396 | .udma_mask = 0x7f, /* udma0-6 */ | 397 | .udma_mask = 0x7f, /* udma0-6 */ |
@@ -467,6 +468,11 @@ MODULE_LICENSE("GPL"); | |||
467 | MODULE_DEVICE_TABLE(pci, piix_pci_tbl); | 468 | MODULE_DEVICE_TABLE(pci, piix_pci_tbl); |
468 | MODULE_VERSION(DRV_VERSION); | 469 | MODULE_VERSION(DRV_VERSION); |
469 | 470 | ||
471 | static int force_pcs = 0; | ||
472 | module_param(force_pcs, int, 0444); | ||
473 | MODULE_PARM_DESC(force_pcs, "force honoring or ignoring PCS to work around " | ||
474 | "device mis-detection (0=default, 1=ignore PCS, 2=honor PCS)"); | ||
475 | |||
470 | /** | 476 | /** |
471 | * piix_pata_cbl_detect - Probe host controller cable detect info | 477 | * piix_pata_cbl_detect - Probe host controller cable detect info |
472 | * @ap: Port for which cable detect info is desired | 478 | * @ap: Port for which cable detect info is desired |
@@ -811,6 +817,7 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev) | |||
811 | } | 817 | } |
812 | 818 | ||
813 | static void __devinit piix_init_pcs(struct pci_dev *pdev, | 819 | static void __devinit piix_init_pcs(struct pci_dev *pdev, |
820 | struct ata_port_info *pinfo, | ||
814 | const struct piix_map_db *map_db) | 821 | const struct piix_map_db *map_db) |
815 | { | 822 | { |
816 | u16 pcs, new_pcs; | 823 | u16 pcs, new_pcs; |
@@ -824,6 +831,18 @@ static void __devinit piix_init_pcs(struct pci_dev *pdev, | |||
824 | pci_write_config_word(pdev, ICH5_PCS, new_pcs); | 831 | pci_write_config_word(pdev, ICH5_PCS, new_pcs); |
825 | msleep(150); | 832 | msleep(150); |
826 | } | 833 | } |
834 | |||
835 | if (force_pcs == 1) { | ||
836 | dev_printk(KERN_INFO, &pdev->dev, | ||
837 | "force ignoring PCS (0x%x)\n", new_pcs); | ||
838 | pinfo[0].host_flags |= PIIX_FLAG_IGNORE_PCS; | ||
839 | pinfo[1].host_flags |= PIIX_FLAG_IGNORE_PCS; | ||
840 | } else if (force_pcs == 2) { | ||
841 | dev_printk(KERN_INFO, &pdev->dev, | ||
842 | "force honoring PCS (0x%x)\n", new_pcs); | ||
843 | pinfo[0].host_flags &= ~PIIX_FLAG_IGNORE_PCS; | ||
844 | pinfo[1].host_flags &= ~PIIX_FLAG_IGNORE_PCS; | ||
845 | } | ||
827 | } | 846 | } |
828 | 847 | ||
829 | static void __devinit piix_init_sata_map(struct pci_dev *pdev, | 848 | static void __devinit piix_init_sata_map(struct pci_dev *pdev, |
@@ -932,7 +951,8 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
932 | if (host_flags & ATA_FLAG_SATA) { | 951 | if (host_flags & ATA_FLAG_SATA) { |
933 | piix_init_sata_map(pdev, port_info, | 952 | piix_init_sata_map(pdev, port_info, |
934 | piix_map_db_table[ent->driver_data]); | 953 | piix_map_db_table[ent->driver_data]); |
935 | piix_init_pcs(pdev, piix_map_db_table[ent->driver_data]); | 954 | piix_init_pcs(pdev, port_info, |
955 | piix_map_db_table[ent->driver_data]); | ||
936 | } | 956 | } |
937 | 957 | ||
938 | /* On ICH5, some BIOSen disable the interrupt using the | 958 | /* On ICH5, some BIOSen disable the interrupt using the |