Re: 2.6.29-rc3: tg3 dead after resume

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Rafael J. Wysocki
Date: Friday, January 30, 2009 - 5:38 pm

On Saturday 31 January 2009, Parag Warudkar wrote:

Yes.


This gets more and more interesting.

Can you test the patch below, please?

Rafael

---
Subject: PCI PCIe portdrv: Implement pm object
From: Rafael J. Wysocki <rjw@sisk.pl>

Implement pm object for the PCI Express port driver in order to use
the new power management framework.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
---
 drivers/pci/hotplug/pciehp_core.c |    4 +--
 drivers/pci/pcie/aer/aerdrv.c     |    6 -----
 drivers/pci/pcie/portdrv.h        |    4 +--
 drivers/pci/pcie/portdrv_core.c   |   14 +++++-------
 drivers/pci/pcie/portdrv_pci.c    |   43 ++++++++++++--------------------------
 include/linux/pcieport_if.h       |    2 -
 6 files changed, 25 insertions(+), 48 deletions(-)

Index: linux-2.6/drivers/pci/pcie/portdrv_pci.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_pci.c
+++ linux-2.6/drivers/pci/pcie/portdrv_pci.c
@@ -49,33 +49,21 @@ static int pcie_portdrv_restore_config(s
 }
 
 #ifdef CONFIG_PM
-static int pcie_portdrv_suspend(struct pci_dev *dev, pm_message_t state)
-{
-	return pcie_port_device_suspend(dev, state);
-
-}
+static struct dev_pm_ops pcie_portdrv_pm_ops = {
+	.suspend = pcie_port_device_suspend,
+	.resume = pcie_port_device_resume,
+	.freeze = pcie_port_device_suspend,
+	.thaw = pcie_port_device_resume,
+	.poweroff = pcie_port_device_suspend,
+	.restore = pcie_port_device_resume,
+};
 
-static int pcie_portdrv_suspend_late(struct pci_dev *dev, pm_message_t state)
-{
-	return pci_save_state(dev);
-}
+#define PCIE_PORTDRV_PM_OPS	(&pcie_portdrv_pm_ops)
 
-static int pcie_portdrv_resume_early(struct pci_dev *dev)
-{
-	return pci_restore_state(dev);
-}
+#else /* !PM */
 
-static int pcie_portdrv_resume(struct pci_dev *dev)
-{
-	pcie_portdrv_restore_config(dev);
-	return pcie_port_device_resume(dev);
-}
-#else
-#define pcie_portdrv_suspend NULL
-#define pcie_portdrv_suspend_late NULL
-#define pcie_portdrv_resume_early NULL
-#define pcie_portdrv_resume NULL
-#endif
+#define PCIE_PORTDRV_PM_OPS	NULL
+#endif /* !PM */
 
 /*
  * pcie_portdrv_probe - Probe PCI-Express port devices
@@ -291,12 +279,9 @@ static struct pci_driver pcie_portdriver
 	.probe		= pcie_portdrv_probe,
 	.remove		= pcie_portdrv_remove,
 
-	.suspend	= pcie_portdrv_suspend,
-	.suspend_late	= pcie_portdrv_suspend_late,
-	.resume_early	= pcie_portdrv_resume_early,
-	.resume		= pcie_portdrv_resume,
-
 	.err_handler 	= &pcie_portdrv_err_handler,
+
+	.driver.pm 	= PCIE_PORTDRV_PM_OPS,
 };
 
 static int __init pcie_portdrv_init(void)
Index: linux-2.6/drivers/pci/pcie/portdrv.h
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv.h
+++ linux-2.6/drivers/pci/pcie/portdrv.h
@@ -36,8 +36,8 @@ extern struct bus_type pcie_port_bus_typ
 extern int pcie_port_device_probe(struct pci_dev *dev);
 extern int pcie_port_device_register(struct pci_dev *dev);
 #ifdef CONFIG_PM
-extern int pcie_port_device_suspend(struct pci_dev *dev, pm_message_t state);
-extern int pcie_port_device_resume(struct pci_dev *dev);
+extern int pcie_port_device_suspend(struct device *dev);
+extern int pcie_port_device_resume(struct device *dev);
 #endif
 extern void pcie_port_device_remove(struct pci_dev *dev);
 extern int __must_check pcie_port_bus_register(void);
Index: linux-2.6/drivers/pci/pcie/portdrv_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/portdrv_core.c
+++ linux-2.6/drivers/pci/pcie/portdrv_core.c
@@ -280,13 +280,12 @@ int pcie_port_device_register(struct pci
 static int suspend_iter(struct device *dev, void *data)
 {
 	struct pcie_port_service_driver *service_driver;
-	pm_message_t state = * (pm_message_t *) data;
 
  	if ((dev->bus == &pcie_port_bus_type) &&
  	    (dev->driver)) {
  		service_driver = to_service_driver(dev->driver);
  		if (service_driver->suspend)
- 			service_driver->suspend(to_pcie_device(dev), state);
+ 			service_driver->suspend(to_pcie_device(dev));
   	}
 	return 0;
 }
@@ -294,11 +293,10 @@ static int suspend_iter(struct device *d
 /**
  * pcie_port_device_suspend - suspend port services associated with a PCIe port
  * @dev: PCI Express port to handle
- * @state: Representation of system power management transition in progress
  */
-int pcie_port_device_suspend(struct pci_dev *dev, pm_message_t state)
+int pcie_port_device_suspend(struct device *dev)
 {
-	return device_for_each_child(&dev->dev, &state, suspend_iter);
+	return device_for_each_child(dev, NULL, suspend_iter);
 }
 
 static int resume_iter(struct device *dev, void *data)
@@ -318,11 +316,11 @@ static int resume_iter(struct device *de
  * pcie_port_device_suspend - resume port services associated with a PCIe port
  * @dev: PCI Express port to handle
  */
-int pcie_port_device_resume(struct pci_dev *dev)
+int pcie_port_device_resume(struct device *dev)
 {
-	return device_for_each_child(&dev->dev, NULL, resume_iter);
+	return device_for_each_child(dev, NULL, resume_iter);
 }
-#endif
+#endif /* PM */
 
 static int remove_iter(struct device *dev, void *data)
 {
Index: linux-2.6/include/linux/pcieport_if.h
===================================================================
--- linux-2.6.orig/include/linux/pcieport_if.h
+++ linux-2.6/include/linux/pcieport_if.h
@@ -59,7 +59,7 @@ struct pcie_port_service_driver {
 	int (*probe) (struct pcie_device *dev, 
 		const struct pcie_port_service_id *id);
 	void (*remove) (struct pcie_device *dev);
-	int (*suspend) (struct pcie_device *dev, pm_message_t state);
+	int (*suspend) (struct pcie_device *dev);
 	int (*resume) (struct pcie_device *dev);
 
 	/* Service Error Recovery Handler */
Index: linux-2.6/drivers/pci/pcie/aer/aerdrv.c
===================================================================
--- linux-2.6.orig/drivers/pci/pcie/aer/aerdrv.c
+++ linux-2.6/drivers/pci/pcie/aer/aerdrv.c
@@ -41,9 +41,6 @@ MODULE_LICENSE("GPL");
 static int __devinit aer_probe (struct pcie_device *dev,
 	const struct pcie_port_service_id *id );
 static void aer_remove(struct pcie_device *dev);
-static int aer_suspend(struct pcie_device *dev, pm_message_t state)
-{return 0;}
-static int aer_resume(struct pcie_device *dev) {return 0;}
 static pci_ers_result_t aer_error_detected(struct pci_dev *dev,
 	enum pci_channel_state error);
 static void aer_error_resume(struct pci_dev *dev);
@@ -74,9 +71,6 @@ static struct pcie_port_service_driver a
 	.probe		= aer_probe,
 	.remove		= aer_remove,
 
-	.suspend	= aer_suspend,
-	.resume		= aer_resume,
-
 	.err_handler	= &aer_error_handlers,
 
 	.reset_link	= aer_root_reset,
Index: linux-2.6/drivers/pci/hotplug/pciehp_core.c
===================================================================
--- linux-2.6.orig/drivers/pci/hotplug/pciehp_core.c
+++ linux-2.6/drivers/pci/hotplug/pciehp_core.c
@@ -468,7 +468,7 @@ static void pciehp_remove (struct pcie_d
 }
 
 #ifdef CONFIG_PM
-static int pciehp_suspend (struct pcie_device *dev, pm_message_t state)
+static int pciehp_suspend (struct pcie_device *dev)
 {
 	dev_info(&dev->device, "%s ENTRY\n", __func__);
 	return 0;
@@ -496,7 +496,7 @@ static int pciehp_resume (struct pcie_de
 	}
 	return 0;
 }
-#endif
+#endif /* PM */
 
 static struct pcie_port_service_id port_pci_ids[] = { {
 	.vendor = PCI_ANY_ID,

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Wed Jan 28, 5:14 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Wed Jan 28, 6:09 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Wed Jan 28, 6:49 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Wed Jan 28, 7:10 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Matt Carlson, (Wed Jan 28, 7:19 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Matt Carlson, (Thu Jan 29, 11:42 am)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Thu Jan 29, 3:06 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Thu Jan 29, 3:22 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Matt Carlson, (Thu Jan 29, 3:22 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Thu Jan 29, 3:35 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Thu Jan 29, 4:03 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Thu Jan 29, 4:10 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Matt Carlson, (Thu Jan 29, 4:41 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Thu Jan 29, 5:10 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Matt Carlson, (Fri Jan 30, 11:40 am)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 3:31 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 3:36 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 3:50 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 3:54 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 4:06 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 4:07 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 4:13 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 4:31 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 4:33 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 4:45 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 4:51 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 4:57 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 4:59 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 5:07 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 5:28 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 5:34 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 5:38 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Ingo Molnar, (Fri Jan 30, 5:44 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 5:47 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 6:21 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Fri Jan 30, 6:37 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 6:41 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 6:42 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 6:46 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 6:54 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 7:19 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Jan 30, 7:25 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Fri Jan 30, 7:40 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Sat Jan 31, 11:51 am)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Sat Jan 31, 1:45 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Sat Jan 31, 2:08 pm)
What should PCI core do during suspend-resume? (was: Re: 2 ..., Rafael J. Wysocki, (Sat Jan 31, 2:42 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Sat Jan 31, 2:47 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Sat Jan 31, 3:46 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Sat Jan 31, 4:01 pm)
Re: What should PCI core do during suspend-resume? (was: R ..., Rafael J. Wysocki, (Sat Jan 31, 4:08 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Sat Jan 31, 5:11 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Sat Jan 31, 5:32 pm)
Re: What should PCI core do during suspend-resume? (was: R ..., Rafael J. Wysocki, (Sat Jan 31, 5:36 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Sat Jan 31, 5:41 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Sat Jan 31, 5:51 pm)
Re: What should PCI core do during suspend-resume? (was: R ..., Rafael J. Wysocki, (Sat Jan 31, 6:24 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Tue Feb 3, 2:29 am)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Tue Feb 3, 2:27 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Tue Feb 3, 3:15 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Parag Warudkar, (Tue Feb 3, 5:38 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Rafael J. Wysocki, (Tue Feb 3, 5:41 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Linus Torvalds, (Fri Feb 6, 8:00 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Benjamin Herrenschmidt, (Fri Feb 6, 8:26 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Benjamin Herrenschmidt, (Fri Feb 6, 8:27 pm)
Re: 2.6.29-rc3: tg3 dead after resume, Jesse Barnes, (Sat Feb 7, 11:03 am)