[previously posted to linux-net@vger.kernel.org, but resent here after a
helpful hint that this is the proper list for such messages. Thanks]
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