Hi! > > Pre-suspend can be nicely defined as event = ON, flags = > > PREPARE_FOR_SUSPEND. I am not sure what new event would be... probably > > some kinds of RUNTIME_SUSPEND would qualify (please enter low-power > > state but remain functional; that does not imply freeze, right?). If > > driver does not know what that's about, it should tell us. > > I dislike the whole even=ON thing... It will force driver to actually > look at the flags, which I intended to be only an exceptional thing. Ok, I see that. Reboot/shutdown probably wants freeze then, because that gives us better default behaviour. ... I'd still like to keep event=ON for things like prepare_for_supend. Pavel PS: Here is updated version... pm_message_t meaning pm_message_t has two fields. event ("major"), and flags. If driver does not know event code, it aborts the request, returning error. Some drivers may need to deal with special cases based on the actual type of suspend operation being done at the system level. This is why there are flags. Event codes are: ON -- no need to do anything except special cases like broken HW. FREEZE -- stop DMA and interrupts, and be prepared to reinit HW from scratch. That probably means stop accepting upstream requests, the actual policy of what to do with them beeing specific to a given driver. It's acceptable for a network driver to just drop packets while a block driver is expected to block the queue so no request is lost. (Use IDE as an example on how to do that). FREEZE requires no power state change, and it's expected for drivers to be able to quickly transition back to operating state. SUSPEND -- like FREEZE, but also put hardware into low-power state. If there's need to distinguish several levels of sleep, additional flag is probably best way to do that. All events are: Prepare for suspend -- userland is still running but we are going to enter suspend state. This gives drivers chance to load firmware from disk and store it in memory. event = ON, flags = PREPARE_TO_SUSPEND Apm standby -- prepare for APM event. Quiesce devices to make life easier for APM BIOS. event = FREEZE, flags = APM_STANDBY Apm suspend -- same as APM_STANDBY, but it we should probably avoid spinning down disks. event = FREEZE, flags = APM_SUSPEND System halt, reboot -- quiesce devices to make life easier for BIOS. event = FREEZE, flags = SYSTEM_HALT or SYSTEM_REBOOT System shutdown -- at least disks need to be spun down, or data may be lost. Quiesce devices, just to make life easier for BIOS. event = FREEZE, flags = SYSTEM_SHUTDOWN Kexec -- turn off DMAs and put hardware into some state where new kernel can take over. event = FREEZE, flags = KEXEC Powerdown at end of swsusp -- very similar to SYSTEM_SHUTDOWN, except wake may need to be enabled on some devices. This actually has at least 3 subtypes, system can reboot, enter S4 and enter S5 at the end of swsusp. event = FREEZE, flags = SWSUSP and one of SYSTEM_REBOOT, SYSTEM_SHUTDOWN, SYSTEM_S4 Suspend to ram -- put devices into low power state. event = SUSPEND, flags = SUSPEND_TO_RAM Freeze for swsusp snapshot -- stop DMA and interrupts. No need to put devices into low power mode, but you must be able to reinitialize device from scratch in resume method. This has two flavors, its done once on suspending kernel, once on resuming kernel. event = FREEZE, flags = DURING_SUSPEND or DURING_RESUME Device detach requested from /sys -- deinitialize device; proably same as SYSTEM_SHUTDOWN, I do not understand this one too much. probably event = FREEZE, flags = DEV_DETACH. System fully on -- device is working normally; this is probably never passed to suspend() method... event = ON, flags = 0 -- People were complaining that M$ turns users into beta-testers... ...jr ghea gurz vagb qrirybcref, naq gurl frrz gb yvxr vg gung jnl!