From patchwork Fri Jan 30 23:31:36 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 2.6.29-rc3: tg3 dead after resume Date: Fri, 30 Jan 2009 13:31:36 -0000 From: "Rafael J. Wysocki" X-Patchwork-Id: 21288 Message-Id: <200901310031.37660.rjw@sisk.pl> To: Parag Warudkar Cc: Matt Carlson , Linus Torvalds , "netdev@vger.kernel.org" , Linux Kernel Mailing List , "David S. Miller" , Andrew Morton On Saturday 31 January 2009, Parag Warudkar wrote: > > On Fri, 30 Jan 2009, Rafael J. Wysocki wrote: > > > On Friday 30 January 2009, Parag Warudkar wrote: > > > > > > On Fri, 30 Jan 2009, Rafael J. Wysocki wrote: > > > > > > > > > > > I still am interested if it makes any difference for Parag. > > > > > > No difference - tg3 is still dead after resume. > > > > Thanks for testing. > > > > Well, I'm not sure if tg3 is at fault, really. > > > > What happens if you unload tg3 before suspend and load it back after the > > resume? > > This time it fails with different error on loading after suspend/resume > cycle - > > 1196.873608] tg3 0000:0e:00.0: PCI INT A -> GSI 16 (level, low) -> IRQ 16 > [ 1196.873620] tg3 0000:0e:00.0: setting latency timer to 64 > [ 1196.880017] tg3 0000:0e:00.0: PME# disabled > [ 1196.996270] tg3: (0000:0e:00.0) phy probe failed, err -19 > [ 1197.508033] tg3: Problem fetching invariants of chip, aborting. > [ 1197.508048] tg3 0000:0e:00.0: PCI INT A disabled It seems like something between the tg3 chip and the host CPU doesn't work correctly after resume, Linus is right. I wonder if this change makes any difference: Rafael --- 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 --- linux-2.6.orig/drivers/pci/pci-driver.c +++ linux-2.6/drivers/pci/pci-driver.c @@ -501,6 +501,9 @@ static int pci_pm_suspend(struct device if (pci_has_legacy_pm_support(pci_dev)) return pci_legacy_suspend(dev, PMSG_SUSPEND); + if (!drv || !drv->pm) + return 0; + if (drv && drv->pm && drv->pm->suspend) { error = drv->pm->suspend(dev); suspend_report_result(drv->pm->suspend, error);