36fffd8d02
and make suspension by self, by drvctl(8), and by ACPI system sleep play nice together. Start solidifying some temporary API changes. 1. Extract a new header file, <sys/device_if.h>, from <sys/device.h> and #include it from <sys/pmf.h> instead of <sys/device.h> to break the circular dependency between <sys/device.h> and <sys/pmf.h>. 2. Introduce pmf_qual_t, an aggregate of qualifications on a PMF suspend/resume call. Start to replace instances of PMF_FN_PROTO, PMF_FN_ARGS, et cetera, with a pmf_qual_t. 3. Introduce the notion of a "suspensor," an entity that holds a device in suspension. More than one suspensor may hold a device at once. A device stays suspended as long as at least one suspensor holds it. A device resumes when the last suspensor releases it. Currently, the kernel defines three suspensors, 3a the system-suspensor: for system suspension, initiated by 'sysctl -w machdep.sleep_state=3', by lid closure, by power-button press, et cetera, 3b the drvctl-suspensor: for device suspension by /dev/drvctl ioctl, e.g., drvctl -S sip0. 3c the system self-suspensor: for device drivers that suspend themselves and their children. Several drivers for network interfaces put the network device to sleep while it is not administratively up, that is, after the kernel calls if_stop(, 1). The self-suspensor should not be used directly. See the description of suspensor delegates, below. A suspensor can have one or more "delegates". A suspensor can release devices that its delegates hold suspended. Right now, only the system self-suspensor has delegates. For each device that a self-suspending driver attaches, it creates the device's self-suspensor, a delegate of the system self-suspensor. Suspensors stop a system-wide suspend/resume cycle from waking devices that the operator put to sleep with drvctl before the cycle. They also help self-suspension to work more simply, safely, and in accord with expectations. 4. Add the notion of device activation level, devact_level_t, and a routine for checking the current activation level, device_activation(). Current activation levels are DEVACT_LEVEL_BUS, DEVACT_LEVEL_DRIVER, and DEVACT_LEVEL_CLASS, which respectively indicate that the device's bus is active, that the bus and device are active, and that the bus, device, and the functions of the device's class (network, audio) are active. Suspend/resume calls can be qualified with a devact_level_t. The power-management framework treats a devact_level_t that qualifies a device suspension as the device's current activation level; it only runs hooks to reduce the activation level from the presumed current level to the fully suspended state. The framework treats a devact_level_t qualifying device resumption as the target activation level; it only runs hooks to raise the activation level to the target. 5. Use pmf_qual_t, devact_level_t, and self-suspensors in several drivers. 6. Temporarily add an unused power-management workqueue that I will remove or replace, soon. |
||
---|---|---|
.. | ||
adv_cardbus.c | ||
ahc_cardbus.c | ||
cardbus_exrom.c | ||
cardbus_exrom.h | ||
cardbus_map.c | ||
cardbus.c | ||
cardbusreg.h | ||
cardbusvar.h | ||
cardslot.c | ||
cardslotvar.h | ||
com_cardbus.c | ||
ehci_cardbus.c | ||
files.cardbus | ||
fwohci_cardbus.c | ||
if_ath_cardbus.c | ||
if_atw_cardbus.c | ||
if_ex_cardbus.c | ||
if_fxp_cardbus.c | ||
if_ral_cardbus.c | ||
if_re_cardbus.c | ||
if_rtk_cardbus.c | ||
if_rtw_cardbus.c | ||
if_tlp_cardbus.c | ||
njata_cardbus.c | ||
njs_cardbus.c | ||
ohci_cardbus.c | ||
rbus_ppb.c | ||
rbus.c | ||
rbus.h | ||
siisata_cardbus.c | ||
uhci_cardbus.c | ||
usb_cardbus.h |