diff options
| -rw-r--r-- | drivers/scsi/ata_piix.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/scsi/ata_piix.c b/drivers/scsi/ata_piix.c index 3b98f1813356..2d20caf377f5 100644 --- a/drivers/scsi/ata_piix.c +++ b/drivers/scsi/ata_piix.c | |||
| @@ -468,6 +468,11 @@ MODULE_LICENSE("GPL"); | |||
| 468 | MODULE_DEVICE_TABLE(pci, piix_pci_tbl); | 468 | MODULE_DEVICE_TABLE(pci, piix_pci_tbl); |
| 469 | MODULE_VERSION(DRV_VERSION); | 469 | MODULE_VERSION(DRV_VERSION); |
| 470 | 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 | |||
| 471 | /** | 476 | /** |
| 472 | * piix_pata_cbl_detect - Probe host controller cable detect info | 477 | * piix_pata_cbl_detect - Probe host controller cable detect info |
| 473 | * @ap: Port for which cable detect info is desired | 478 | * @ap: Port for which cable detect info is desired |
| @@ -812,6 +817,7 @@ static int __devinit piix_check_450nx_errata(struct pci_dev *ata_dev) | |||
| 812 | } | 817 | } |
| 813 | 818 | ||
| 814 | 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, | ||
| 815 | const struct piix_map_db *map_db) | 821 | const struct piix_map_db *map_db) |
| 816 | { | 822 | { |
| 817 | u16 pcs, new_pcs; | 823 | u16 pcs, new_pcs; |
| @@ -825,6 +831,18 @@ static void __devinit piix_init_pcs(struct pci_dev *pdev, | |||
| 825 | pci_write_config_word(pdev, ICH5_PCS, new_pcs); | 831 | pci_write_config_word(pdev, ICH5_PCS, new_pcs); |
| 826 | msleep(150); | 832 | msleep(150); |
| 827 | } | 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 | } | ||
| 828 | } | 846 | } |
| 829 | 847 | ||
| 830 | static void __devinit piix_init_sata_map(struct pci_dev *pdev, | 848 | static void __devinit piix_init_sata_map(struct pci_dev *pdev, |
| @@ -933,7 +951,8 @@ static int piix_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
| 933 | if (host_flags & ATA_FLAG_SATA) { | 951 | if (host_flags & ATA_FLAG_SATA) { |
| 934 | piix_init_sata_map(pdev, port_info, | 952 | piix_init_sata_map(pdev, port_info, |
| 935 | piix_map_db_table[ent->driver_data]); | 953 | piix_map_db_table[ent->driver_data]); |
| 936 | 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]); | ||
| 937 | } | 956 | } |
| 938 | 957 | ||
| 939 | /* On ICH5, some BIOSen disable the interrupt using the | 958 | /* On ICH5, some BIOSen disable the interrupt using the |
