aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_sil680.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2008-03-24 23:22:47 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-04-17 15:44:16 -0400
commitf08048e94564d009b19038cfbdd800aa83e79c7f (patch)
tree4afa7e4fff9ec716e9acbe746a464cda5daec063 /drivers/ata/pata_sil680.c
parentb558edddb1c42c70a30cfe494984d4be409f7b2b (diff)
libata: PCI device should be powered up before being accessed
PCI device should be powered up or powered up before its PCI regsiters are accessed. Although PCI configuration register access is allowed in D3hot, PCI device is free to reset its status when transiting from D3hot to D0 causing configuration data to change. Many libata SFF drivers which use ata_pci_init_one() read and update configuration registers before calling ata_pci_init_one() which enables the PCI device. Also, in resume paths, some drivers access registers without resuming the PCI device. This patch adds a call to pcim_enable_device() in init path if register is accessed before calling ata_pci_init_one() and make resume paths first resume PCI devices, access PCI configuration regiters then resume ATA host. While at it... * cmd640 was strange in that it set ->resume even when CONFIG_PM is not. This is by-product of minimal build fix. Updated. * In cs5530, Don't BUG() on reinit failure. Just whine and fail resume. Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers/ata/pata_sil680.c')
-rw-r--r--drivers/ata/pata_sil680.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/ata/pata_sil680.c b/drivers/ata/pata_sil680.c
index 7c5b2dd9a1a1..f4dc09718cab 100644
--- a/drivers/ata/pata_sil680.c
+++ b/drivers/ata/pata_sil680.c
@@ -346,6 +346,10 @@ static int __devinit sil680_init_one(struct pci_dev *pdev,
346 if (!printed_version++) 346 if (!printed_version++)
347 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); 347 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
348 348
349 rc = pcim_enable_device(pdev);
350 if (rc)
351 return rc;
352
349 switch (sil680_init_chip(pdev, &try_mmio)) { 353 switch (sil680_init_chip(pdev, &try_mmio)) {
350 case 0: 354 case 0:
351 ppi[0] = &info_slow; 355 ppi[0] = &info_slow;
@@ -406,10 +410,15 @@ use_ioports:
406#ifdef CONFIG_PM 410#ifdef CONFIG_PM
407static int sil680_reinit_one(struct pci_dev *pdev) 411static int sil680_reinit_one(struct pci_dev *pdev)
408{ 412{
409 int try_mmio; 413 struct ata_host *host = dev_get_drvdata(&pdev->dev);
414 int try_mmio, rc;
410 415
416 rc = ata_pci_device_do_resume(pdev);
417 if (rc)
418 return rc;
411 sil680_init_chip(pdev, &try_mmio); 419 sil680_init_chip(pdev, &try_mmio);
412 return ata_pci_device_resume(pdev); 420 ata_host_resume(host);
421 return 0;
413} 422}
414#endif 423#endif
415 424