aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_amd.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_amd.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_amd.c')
-rw-r--r--drivers/ata/pata_amd.c16
1 files changed, 15 insertions, 1 deletions
diff --git a/drivers/ata/pata_amd.c b/drivers/ata/pata_amd.c
index 4b8d9b592ca4..5e1bc13a756b 100644
--- a/drivers/ata/pata_amd.c
+++ b/drivers/ata/pata_amd.c
@@ -659,10 +659,15 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
659 static int printed_version; 659 static int printed_version;
660 int type = id->driver_data; 660 int type = id->driver_data;
661 u8 fifo; 661 u8 fifo;
662 int rc;
662 663
663 if (!printed_version++) 664 if (!printed_version++)
664 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n"); 665 dev_printk(KERN_DEBUG, &pdev->dev, "version " DRV_VERSION "\n");
665 666
667 rc = pcim_enable_device(pdev);
668 if (rc)
669 return rc;
670
666 pci_read_config_byte(pdev, 0x41, &fifo); 671 pci_read_config_byte(pdev, 0x41, &fifo);
667 672
668 /* Check for AMD7409 without swdma errata and if found adjust type */ 673 /* Check for AMD7409 without swdma errata and if found adjust type */
@@ -706,6 +711,13 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
706#ifdef CONFIG_PM 711#ifdef CONFIG_PM
707static int amd_reinit_one(struct pci_dev *pdev) 712static int amd_reinit_one(struct pci_dev *pdev)
708{ 713{
714 struct ata_host *host = dev_get_drvdata(&pdev->dev);
715 int rc;
716
717 rc = ata_pci_device_do_resume(pdev);
718 if (rc)
719 return rc;
720
709 if (pdev->vendor == PCI_VENDOR_ID_AMD) { 721 if (pdev->vendor == PCI_VENDOR_ID_AMD) {
710 u8 fifo; 722 u8 fifo;
711 pci_read_config_byte(pdev, 0x41, &fifo); 723 pci_read_config_byte(pdev, 0x41, &fifo);
@@ -718,7 +730,9 @@ static int amd_reinit_one(struct pci_dev *pdev)
718 pdev->device == PCI_DEVICE_ID_AMD_COBRA_7401) 730 pdev->device == PCI_DEVICE_ID_AMD_COBRA_7401)
719 ata_pci_clear_simplex(pdev); 731 ata_pci_clear_simplex(pdev);
720 } 732 }
721 return ata_pci_device_resume(pdev); 733
734 ata_host_resume(host);
735 return 0;
722} 736}
723#endif 737#endif
724 738