|  | Debugging suspend and resume | 
|  | (C) 2007 Rafael J. Wysocki <rjw@sisk.pl>, GPL | 
|  |  | 
|  | 1. Testing suspend to disk (STD) | 
|  |  | 
|  | To verify that the STD works, you can try to suspend in the "reboot" mode: | 
|  |  | 
|  | # echo reboot > /sys/power/disk | 
|  | # echo disk > /sys/power/state | 
|  |  | 
|  | and the system should suspend, reboot, resume and get back to the command prompt | 
|  | where you have started the transition.  If that happens, the STD is most likely | 
|  | to work correctly, but you need to repeat the test at least a couple of times in | 
|  | a row for confidence.  This is necessary, because some problems only show up on | 
|  | a second attempt at suspending and resuming the system.  You should also test | 
|  | the "platform" and "shutdown" modes of suspend: | 
|  |  | 
|  | # echo platform > /sys/power/disk | 
|  | # echo disk > /sys/power/state | 
|  |  | 
|  | or | 
|  |  | 
|  | # echo shutdown > /sys/power/disk | 
|  | # echo disk > /sys/power/state | 
|  |  | 
|  | in which cases you will have to press the power button to make the system | 
|  | resume.  If that does not work, you will need to identify what goes wrong. | 
|  |  | 
|  | a) Test mode of STD | 
|  |  | 
|  | To verify if there are any drivers that cause problems you can run the STD | 
|  | in the test mode: | 
|  |  | 
|  | # echo test > /sys/power/disk | 
|  | # echo disk > /sys/power/state | 
|  |  | 
|  | in which case the system should freeze tasks, suspend devices, disable nonboot | 
|  | CPUs (if any), wait for 5 seconds, enable nonboot CPUs, resume devices, thaw | 
|  | tasks and return to your command prompt.  If that fails, most likely there is | 
|  | a driver that fails to either suspend or resume (in the latter case the system | 
|  | may hang or be unstable after the test, so please take that into consideration). | 
|  | To find this driver, you can carry out a binary search according to the rules: | 
|  | - if the test fails, unload a half of the drivers currently loaded and repeat | 
|  | (that would probably involve rebooting the system, so always note what drivers | 
|  | have been loaded before the test), | 
|  | - if the test succeeds, load a half of the drivers you have unloaded most | 
|  | recently and repeat. | 
|  |  | 
|  | Once you have found the failing driver (there can be more than just one of | 
|  | them), you have to unload it every time before the STD transition.  In that case | 
|  | please make sure to report the problem with the driver. | 
|  |  | 
|  | It is also possible that a cycle can still fail after you have unloaded | 
|  | all modules. In that case, you would want to look in your kernel configuration | 
|  | for the drivers that can be compiled as modules (testing again with them as | 
|  | modules), and possibly also try boot time options such as "noapic" or "noacpi". | 
|  |  | 
|  | b) Testing minimal configuration | 
|  |  | 
|  | If the test mode of STD works, you can boot the system with "init=/bin/bash" | 
|  | and attempt to suspend in the "reboot", "shutdown" and "platform" modes.  If | 
|  | that does not work, there probably is a problem with a driver statically | 
|  | compiled into the kernel and you can try to compile more drivers as modules, | 
|  | so that they can be tested individually.  Otherwise, there is a problem with a | 
|  | modular driver and you can find it by loading a half of the modules you normally | 
|  | use and binary searching in accordance with the algorithm: | 
|  | - if there are n modules loaded and the attempt to suspend and resume fails, | 
|  | unload n/2 of the modules and try again (that would probably involve rebooting | 
|  | the system), | 
|  | - if there are n modules loaded and the attempt to suspend and resume succeeds, | 
|  | load n/2 modules more and try again. | 
|  |  | 
|  | Again, if you find the offending module(s), it(they) must be unloaded every time | 
|  | before the STD transition, and please report the problem with it(them). | 
|  |  | 
|  | c) Advanced debugging | 
|  |  | 
|  | In case the STD does not work on your system even in the minimal configuration | 
|  | and compiling more drivers as modules is not practical or some modules cannot | 
|  | be unloaded, you can use one of the more advanced debugging techniques to find | 
|  | the problem.  First, if there is a serial port in your box, you can boot the | 
|  | kernel with the 'no_console_suspend' parameter and try to log kernel | 
|  | messages using the serial console.  This may provide you with some information | 
|  | about the reasons of the suspend (resume) failure.  Alternatively, it may be | 
|  | possible to use a FireWire port for debugging with firescope | 
|  | (ftp://ftp.firstfloor.org/pub/ak/firescope/).  On i386 it is also possible to | 
|  | use the PM_TRACE mechanism documented in Documentation/s2ram.txt . | 
|  |  | 
|  | 2. Testing suspend to RAM (STR) | 
|  |  | 
|  | To verify that the STR works, it is generally more convenient to use the s2ram | 
|  | tool available from http://suspend.sf.net and documented at | 
|  | http://en.opensuse.org/s2ram .  However, before doing that it is recommended to | 
|  | carry out the procedure described in section 1. | 
|  |  | 
|  | Assume you have resolved the problems with the STD and you have found some | 
|  | failing drivers.  These drivers are also likely to fail during the STR or | 
|  | during the resume, so it is better to unload them every time before the STR | 
|  | transition.  Now, you can follow the instructions at | 
|  | http://en.opensuse.org/s2ram to test the system, but if it does not work | 
|  | "out of the box", you may need to boot it with "init=/bin/bash" and test | 
|  | s2ram in the minimal configuration.  In that case, you may be able to search | 
|  | for failing drivers by following the procedure analogous to the one described in | 
|  | 1b).  If you find some failing drivers, you will have to unload them every time | 
|  | before the STR transition (ie. before you run s2ram), and please report the | 
|  | problems with them. |