I don't know if this is the correct place for 3c59x bugs. Couldn't find a maintainer entry for it. Please redirect as appropriate. pci_set_power_state() is a bit weird, causing a failure if a device doesn't support PM and the driver tries to 1) save it's power_state, 2) wake up and do something, and 3) then reset to the saved state. The 3c59x driver does this in it's ioctl function. pci_set_power_state() will never set current_state for such devices, causing them to remain in PCI_UNKNOWN (5) forever. But if you try to set the state to PCI_UNKNOWN, bounding will kick in, limiting the state to PCI_D3hot (3). Then pci_set_power_state() will complain because PCI_D3hot < current_state, printing useless messages like this: pci_set_power_state(): 0000:00:09.0: state=3, current state=5 pci_set_power_state(): 0000:00:09.0: state=3, current state=5 and returning -EINVAL. I believe this is wrong because pci_set_power_state() is supposed to return -EIO if device does not support PCI PM. But the drivers should probably also take care, not to call pci_set_power_state() requesting PCI_UNKNOWN as the new state. The attached patch against 2.6.21.1 fixes this for 3c905. Bjørn
--- linux-2.6.21.1/drivers/net/3c59x.c.orig 2007-04-27 14:18:23.000000000 +0200 +++ linux-2.6.21.1/drivers/net/3c59x.c 2007-05-05 00:00:41.000000000 +0200 @@ -2903,7 +2903,7 @@ unsigned long flags; int state = 0; - if(VORTEX_PCI(vp)) + if(VORTEX_PCI(vp) && pci_find_capability(VORTEX_PCI(vp), PCI_CAP_ID_PM)) state = VORTEX_PCI(vp)->current_state; /* The kernel core really should have pci_get_power_state() */