aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_cs5520.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_cs5520.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_cs5520.c')
-rw-r--r--drivers/ata/pata_cs5520.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c
index 7ed279b0a12..dd6b2355fcd 100644
--- a/drivers/ata/pata_cs5520.c
+++ b/drivers/ata/pata_cs5520.c
@@ -203,6 +203,10 @@ static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_devi
203 struct ata_ioports *ioaddr; 203 struct ata_ioports *ioaddr;
204 int i, rc; 204 int i, rc;
205 205
206 rc = pcim_enable_device(pdev);
207 if (rc)
208 return rc;
209
206 /* IDE port enable bits */ 210 /* IDE port enable bits */
207 pci_read_config_byte(pdev, 0x60, &pcicfg); 211 pci_read_config_byte(pdev, 0x60, &pcicfg);
208 212
@@ -310,11 +314,20 @@ static int __devinit cs5520_init_one(struct pci_dev *pdev, const struct pci_devi
310 314
311static int cs5520_reinit_one(struct pci_dev *pdev) 315static int cs5520_reinit_one(struct pci_dev *pdev)
312{ 316{
317 struct ata_host *host = dev_get_drvdata(&pdev->dev);
313 u8 pcicfg; 318 u8 pcicfg;
319 int rc;
320
321 rc = ata_pci_device_do_resume(pdev);
322 if (rc)
323 return rc;
324
314 pci_read_config_byte(pdev, 0x60, &pcicfg); 325 pci_read_config_byte(pdev, 0x60, &pcicfg);
315 if ((pcicfg & 0x40) == 0) 326 if ((pcicfg & 0x40) == 0)
316 pci_write_config_byte(pdev, 0x60, pcicfg | 0x40); 327 pci_write_config_byte(pdev, 0x60, pcicfg | 0x40);
317 return ata_pci_device_resume(pdev); 328
329 ata_host_resume(host);
330 return 0;
318} 331}
319 332
320/** 333/**