Cc: Matthew Garrett <mjg59@...>, Romano Giannetti <romanol@...>, Chris Wright <chrisw@...>, Chuck Ebbert <cebbert@...>, Linux Kernel Mailing List <linux-kernel@...>, <stable@...>, Justin Forbes <jmforbes@...>, Zwane Mwaikambo <zwane@...>, Theodore Ts'o <tytso@...>, Randy Dunlap <rdunlap@...>, Dave Jones <davej@...>, Chuck Wolber <chuckw@...>, Chris Wedgwood <reviews@...>, Michael Krufky <mkrufky@...>, <akpm@...>, <alan@...>, Rafael J. Wysocki <rjw@...>
Drivers really shouldn't do anythign at all.
The "subsystem" thing should have stopped the queues, and the device
should never even _see_ this.
Before we suspend a device, we call the subsystem that that device has
been registered with. Ie, we have code like this:
if (dev->class && dev->class->suspend)
error = dev->class->suspend(dev, state);
which was very much designed so that individual devices wouldn't have to
always know - if the upper layer devices for that class can handle these
things, they should.
Do people actually _do_ this, right now? No. But we do actually have the
infrastructure, and I think we have one or two classes that actually do
use it (at least the "rfkill_class" has a suspend member, dunno how well
this model actually works).
I think Greg had some patches to make network drivers use this, for
example. Network drivers right now all end up doing stuff that really
doesn't belong in the driver at all when they suspend, and the
infrastructure _should_ just do it for them (ie do all the _network_
related stuff, as opposed to the actual hardware-related stuff).
(Examples of things that we probably _should_ do for network devices on a
class level:
suspend:
netif_poll_disable()
if (netif_running(dev))
dev->stop(dev);
resume:
if (netif_running(dev))
dev->start(dev);
netif_poll_enable(dev);
or something similar).
Linus
-