[lkml]   [2009]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
Patch in this message
Subject[PATCH] Make e100 suspend handler support PCI cards lacking PM capability
Hi all,

after having added non-MII PHY card support to e100, I noticed that
the suspend handler rejects power-management non-capable PCI cards,
causing a S2R request to immediately get back up to the desktop,
losing network access in the process (rtnl mutex deadlock).

Support PCI cards which are lacking power management capability
in the e100 suspend handler.

Frankly I was unsure how to best add this to the driver in a clean way.
Usually drivers use pci_set_power_state(..., pci_choose_state(...))
in order to avoid the rejection of an open-coded
pci_set_power_state(..., PCI_D3hot) in case of a non-PM card,
however pci_choose_state() depends on the _pm-internal_ pm_message_t type,
which was doable in .suspend directly but not at the other e100
driver locations where it was used.

Next attempt was to extend __e100_power_off() with a pci_power_t parameter,
however since __e100_power_off() is called by two locations,
that meant that I'd have to use pci_choose_state() at _both_ call sites.

Thus I simply resorted to do a brute-force yet most simple
pci_find_capability() check in the __e100_power_off() function.

Tested on 2.6.30-rc8 and suspending/resuming fine,
Patch against 2.6.30-rc8 with my original non-MII support patch applied.
(should apply fine in any case, I'd think).
Intended for testing in -mmotm or so.


Signed-off-by: Andreas Mohr <>

--- linux-2.6.30-rc8.e100/drivers/net/e100.c.my_patch_orig 2009-06-13 18:47:53.000000000 +0200
+++ linux-2.6.30-rc8.e100/drivers/net/e100.c 2009-06-13 20:27:46.000000000 +0200
@@ -2897,6 +2897,13 @@ static void __e100_shutdown(struct pci_d

static int __e100_power_off(struct pci_dev *pdev, bool wake)
+ /* some older devices don't support PCI PM
+ * (e.g. mac_82557_D100_B combo card with 80c24 PHY)
+ * - skip those! (they most likely won't support WoL either)
+ */
+ if (!pci_find_capability(pdev, PCI_CAP_ID_PM))
+ return 0;
if (wake) {
return pci_prepare_to_sleep(pdev);
} else {

 \ /
  Last update: 2009-06-13 21:23    [W:0.041 / U:0.056 seconds]
©2003-2018 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site