Skip to content

Commit 9dd9c16

Browse files
htejunJeff Garzik
authored andcommitted
[PATCH] ata_piix: implement force_pcs module parameter
This patch implements force_pcs module parameter for ata_piix. If 1, PCS is ignored, 2 honored. As there seem to be quite a few ICHs w/ impaired PCS, this option will be useful for cases where the default setting doesn't work. Signed-off-by: Tejun Heo <[email protected]> Signed-off-by: Jeff Garzik <[email protected]>
1 parent f3745a3 commit 9dd9c16

File tree

1 file changed

+20
-1
lines changed

1 file changed

+20
-1
lines changed

drivers/scsi/ata_piix.c

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,11 @@ MODULE_LICENSE("GPL");
468468
MODULE_DEVICE_TABLE(pci, piix_pci_tbl);
469469
MODULE_VERSION(DRV_VERSION);
470470

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+
471476
/**
472477
* piix_pata_cbl_detect - Probe host controller cable detect info
473478
* @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)
812817
}
813818

814819
static void __devinit piix_init_pcs(struct pci_dev *pdev,
820+
struct ata_port_info *pinfo,
815821
const struct piix_map_db *map_db)
816822
{
817823
u16 pcs, new_pcs;
@@ -825,6 +831,18 @@ static void __devinit piix_init_pcs(struct pci_dev *pdev,
825831
pci_write_config_word(pdev, ICH5_PCS, new_pcs);
826832
msleep(150);
827833
}
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+
}
828846
}
829847

830848
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)
933951
if (host_flags & ATA_FLAG_SATA) {
934952
piix_init_sata_map(pdev, port_info,
935953
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]);
937956
}
938957

939958
/* On ICH5, some BIOSen disable the interrupt using the

0 commit comments

Comments
 (0)