ieee1394: restore config ROM when resuming
authorStefan Richter <stefanr@s5r6.in-berlin.de>
Sun, 7 Jan 2007 20:49:27 +0000 (21:49 +0100)
committerStefan Richter <stefanr@s5r6.in-berlin.de>
Thu, 8 Feb 2007 19:59:19 +0000 (20:59 +0100)
After PM suspend + resume, the local configuration ROM was not restored.
This prevented remote nodes from recognizing the resuming machine.

Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
drivers/ieee1394/hosts.c
drivers/ieee1394/hosts.h
drivers/ieee1394/ieee1394_core.c
drivers/ieee1394/ohci1394.c

index ee82a5320bf7b5c353db56485c2b1ab31f673b33..32a1309219384537a21b8f8a6f972affb5a7d33b 100644 (file)
@@ -190,14 +190,19 @@ int hpsb_add_host(struct hpsb_host *host)
 {
        if (hpsb_default_host_entry(host))
                return -ENOMEM;
-
        hpsb_add_extra_config_roms(host);
-
        highlevel_add_host(host);
-
        return 0;
 }
 
+void hpsb_resume_host(struct hpsb_host *host)
+{
+       if (host->driver->set_hw_config_rom)
+               host->driver->set_hw_config_rom(host,
+                                               host->csr.rom->bus_info_data);
+       host->driver->devctl(host, RESET_BUS, SHORT_RESET);
+}
+
 void hpsb_remove_host(struct hpsb_host *host)
 {
        host->is_shutdown = 1;
@@ -206,9 +211,7 @@ void hpsb_remove_host(struct hpsb_host *host)
        flush_scheduled_work();
 
        host->driver = &dummy_driver;
-
        highlevel_remove_host(host);
-
        hpsb_remove_extra_config_roms(host);
 
        class_device_unregister(&host->class_dev);
index d553e38c95432c95d593d764472626b4e22f6a30..3922f0e88526df052dcbe1c66cdfa49f545869c5 100644 (file)
@@ -200,7 +200,8 @@ struct hpsb_host_driver {
 struct hpsb_host *hpsb_alloc_host(struct hpsb_host_driver *drv, size_t extra,
                                  struct device *dev);
 int hpsb_add_host(struct hpsb_host *host);
-void hpsb_remove_host(struct hpsb_host *h);
+void hpsb_resume_host(struct hpsb_host *host);
+void hpsb_remove_host(struct hpsb_host *host);
 
 /* Updates the configuration rom image of a host.  rom_version must be the
  * current version, otherwise it will fail with return value -1. If this
index 35fbe4755a2bb6077ebc3cc677a6fc902cffe4bd..1521e57e124bb63119b705804f8ff81d41ed77ed 100644 (file)
@@ -1178,6 +1178,7 @@ module_exit(ieee1394_cleanup);
 /** hosts.c **/
 EXPORT_SYMBOL(hpsb_alloc_host);
 EXPORT_SYMBOL(hpsb_add_host);
+EXPORT_SYMBOL(hpsb_resume_host);
 EXPORT_SYMBOL(hpsb_remove_host);
 EXPORT_SYMBOL(hpsb_update_config_rom_image);
 
index b7e816683fb08a4cfd280fee167f55bb9a7b8fad..5729e412cc4aaeeb76621a0eb1848e5280eef4ab 100644 (file)
@@ -3536,9 +3536,6 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state)
        int err;
        struct ti_ohci *ohci = pci_get_drvdata(pdev);
 
-       printk(KERN_INFO "%s does not fully support suspend and resume yet\n",
-              OHCI1394_DRIVER_NAME);
-
        if (!ohci) {
                printk(KERN_ERR "%s: tried to suspend nonexisting host\n",
                       OHCI1394_DRIVER_NAME);
@@ -3625,6 +3622,7 @@ static int ohci1394_pci_resume(struct pci_dev *pdev)
        mdelay(50);
        ohci_initialize(ohci);
 
+       hpsb_resume_host(ohci->host);
        return 0;
 }
 #endif /* CONFIG_PM */