#include <linux/vt_kern.h>
 #include <linux/device.h>
+#include <linux/kallsyms.h>
+#include <linux/pm.h>
 #include "../base.h"
 #include "power.h"
 
        if (dev->bus && dev->bus->suspend && !dev->power.power_state.event) {
                dev_dbg(dev, "suspending\n");
                error = dev->bus->suspend(dev, state);
+               suspend_report_result(dev->bus->suspend, error);
        }
        up(&dev->sem);
        return error;
 
 EXPORT_SYMBOL_GPL(device_power_down);
 
+void __suspend_report_result(const char *function, void *fn, int ret)
+{
+       if (ret) {
+               printk(KERN_ERR "%s(): ", function);
+               print_fn_descriptor_symbol("%s() returns ", (unsigned long)fn);
+               printk("%d\n", ret);
+       }
+}
+EXPORT_SYMBOL_GPL(__suspend_report_result);
 
        struct pci_driver * drv = pci_dev->driver;
        int i = 0;
 
-       if (drv && drv->suspend)
+       if (drv && drv->suspend) {
                i = drv->suspend(pci_dev, state);
-       else
+               suspend_report_result(drv->suspend, i);
+       } else {
                pci_save_state(pci_dev);
+       }
        return i;
 }
 
 
         * Can enter D0 from any state, but if we can only go deeper 
         * to sleep if we're already in a low power state
         */
-       if (state != PCI_D0 && dev->current_state > state)
+       if (state != PCI_D0 && dev->current_state > state) {
+               printk(KERN_ERR "%s(): %s: state=%d, current state=%d\n",
+                       __FUNCTION__, pci_name(dev), state, dev->current_state);
                return -EINVAL;
-       else if (dev->current_state == state) 
+       } else if (dev->current_state == state)
                return 0;        /* we're already there */
 
        /* find PCI PM capability in list */
 
 
        if (hcd->driver->suspend) {
                retval = hcd->driver->suspend(hcd, message);
-               if (retval) {
-                       dev_dbg (&dev->dev, "PCI pre-suspend fail, %d\n",
-                               retval);
+               suspend_report_result(hcd->driver->suspend, retval);
+               if (retval)
                        goto done;
-               }
        }
        synchronize_irq(dev->irq);
 
                 * some device state (e.g. as part of clock reinit).
                 */
                retval = pci_set_power_state (dev, PCI_D3hot);
+               suspend_report_result(pci_set_power_state, retval);
                if (retval == 0) {
                        int wake = device_can_wakeup(&hcd->self.root_hub->dev);
 
 
 
 extern int dpm_runtime_suspend(struct device *, pm_message_t);
 extern void dpm_runtime_resume(struct device *);
+extern void __suspend_report_result(const char *function, void *fn, int ret);
+
+#define suspend_report_result(fn, ret)                                 \
+       do {                                                            \
+               __suspend_report_result(__FUNCTION__, fn, ret);         \
+       } while (0)
 
 #else /* !CONFIG_PM */
 
 {
 }
 
+#define suspend_report_result(fn, ret) do { } while (0)
+
 #endif
 
 /* changes to device_may_wakeup take effect on the next pm state change.