aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_hpt366.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_hpt366.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_hpt366.c')
-rw-r--r--drivers/ata/pata_hpt366.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/ata/pata_hpt366.c b/drivers/ata/pata_hpt366.c
index a742efa0da2b..a82089048f58 100644
--- a/drivers/ata/pata_hpt366.c
+++ b/drivers/ata/pata_hpt366.c
@@ -402,6 +402,11 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
402 402
403 u32 class_rev; 403 u32 class_rev;
404 u32 reg1; 404 u32 reg1;
405 int rc;
406
407 rc = pcim_enable_device(dev);
408 if (rc)
409 return rc;
405 410
406 pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); 411 pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
407 class_rev &= 0xFF; 412 class_rev &= 0xFF;
@@ -435,8 +440,15 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
435#ifdef CONFIG_PM 440#ifdef CONFIG_PM
436static int hpt36x_reinit_one(struct pci_dev *dev) 441static int hpt36x_reinit_one(struct pci_dev *dev)
437{ 442{
443 struct ata_host *host = dev_get_drvdata(&dev->dev);
444 int rc;
445
446 rc = ata_pci_device_do_resume(dev);
447 if (rc)
448 return rc;
438 hpt36x_init_chipset(dev); 449 hpt36x_init_chipset(dev);
439 return ata_pci_device_resume(dev); 450 ata_host_resume(host);
451 return 0;
440} 452}
441#endif 453#endif
442 454