1cc2a2d19SMauro Carvalho Chehab=============================================== 2cc2a2d19SMauro Carvalho ChehabThe Linux WatchDog Timer Driver Core kernel API 3cc2a2d19SMauro Carvalho Chehab=============================================== 4cc2a2d19SMauro Carvalho Chehab 5cc2a2d19SMauro Carvalho ChehabLast reviewed: 12-Feb-2013 6cc2a2d19SMauro Carvalho Chehab 7cc2a2d19SMauro Carvalho ChehabWim Van Sebroeck <wim@iguana.be> 8cc2a2d19SMauro Carvalho Chehab 9cc2a2d19SMauro Carvalho ChehabIntroduction 10cc2a2d19SMauro Carvalho Chehab------------ 11cc2a2d19SMauro Carvalho ChehabThis document does not describe what a WatchDog Timer (WDT) Driver or Device is. 12cc2a2d19SMauro Carvalho ChehabIt also does not describe the API which can be used by user space to communicate 13cc2a2d19SMauro Carvalho Chehabwith a WatchDog Timer. If you want to know this then please read the following 14cc2a2d19SMauro Carvalho Chehabfile: Documentation/watchdog/watchdog-api.rst . 15cc2a2d19SMauro Carvalho Chehab 16cc2a2d19SMauro Carvalho ChehabSo what does this document describe? It describes the API that can be used by 17cc2a2d19SMauro Carvalho ChehabWatchDog Timer Drivers that want to use the WatchDog Timer Driver Core 18cc2a2d19SMauro Carvalho ChehabFramework. This framework provides all interfacing towards user space so that 19cc2a2d19SMauro Carvalho Chehabthe same code does not have to be reproduced each time. This also means that 20cc2a2d19SMauro Carvalho Chehaba watchdog timer driver then only needs to provide the different routines 21cc2a2d19SMauro Carvalho Chehab(operations) that control the watchdog timer (WDT). 22cc2a2d19SMauro Carvalho Chehab 23cc2a2d19SMauro Carvalho ChehabThe API 24cc2a2d19SMauro Carvalho Chehab------- 25cc2a2d19SMauro Carvalho ChehabEach watchdog timer driver that wants to use the WatchDog Timer Driver Core 26cc2a2d19SMauro Carvalho Chehabmust #include <linux/watchdog.h> (you would have to do this anyway when 27cc2a2d19SMauro Carvalho Chehabwriting a watchdog device driver). This include file contains following 28cc2a2d19SMauro Carvalho Chehabregister/unregister routines:: 29cc2a2d19SMauro Carvalho Chehab 30cc2a2d19SMauro Carvalho Chehab extern int watchdog_register_device(struct watchdog_device *); 31cc2a2d19SMauro Carvalho Chehab extern void watchdog_unregister_device(struct watchdog_device *); 32cc2a2d19SMauro Carvalho Chehab 33cc2a2d19SMauro Carvalho ChehabThe watchdog_register_device routine registers a watchdog timer device. 34cc2a2d19SMauro Carvalho ChehabThe parameter of this routine is a pointer to a watchdog_device structure. 35cc2a2d19SMauro Carvalho ChehabThis routine returns zero on success and a negative errno code for failure. 36cc2a2d19SMauro Carvalho Chehab 37cc2a2d19SMauro Carvalho ChehabThe watchdog_unregister_device routine deregisters a registered watchdog timer 38cc2a2d19SMauro Carvalho Chehabdevice. The parameter of this routine is the pointer to the registered 39cc2a2d19SMauro Carvalho Chehabwatchdog_device structure. 40cc2a2d19SMauro Carvalho Chehab 41cc2a2d19SMauro Carvalho ChehabThe watchdog subsystem includes an registration deferral mechanism, 42cc2a2d19SMauro Carvalho Chehabwhich allows you to register an watchdog as early as you wish during 43cc2a2d19SMauro Carvalho Chehabthe boot process. 44cc2a2d19SMauro Carvalho Chehab 45cc2a2d19SMauro Carvalho ChehabThe watchdog device structure looks like this:: 46cc2a2d19SMauro Carvalho Chehab 47cc2a2d19SMauro Carvalho Chehab struct watchdog_device { 48cc2a2d19SMauro Carvalho Chehab int id; 49cc2a2d19SMauro Carvalho Chehab struct device *parent; 50cc2a2d19SMauro Carvalho Chehab const struct attribute_group **groups; 51cc2a2d19SMauro Carvalho Chehab const struct watchdog_info *info; 52cc2a2d19SMauro Carvalho Chehab const struct watchdog_ops *ops; 53cc2a2d19SMauro Carvalho Chehab const struct watchdog_governor *gov; 54cc2a2d19SMauro Carvalho Chehab unsigned int bootstatus; 55cc2a2d19SMauro Carvalho Chehab unsigned int timeout; 56cc2a2d19SMauro Carvalho Chehab unsigned int pretimeout; 57cc2a2d19SMauro Carvalho Chehab unsigned int min_timeout; 58cc2a2d19SMauro Carvalho Chehab unsigned int max_timeout; 59cc2a2d19SMauro Carvalho Chehab unsigned int min_hw_heartbeat_ms; 60cc2a2d19SMauro Carvalho Chehab unsigned int max_hw_heartbeat_ms; 61cc2a2d19SMauro Carvalho Chehab struct notifier_block reboot_nb; 62cc2a2d19SMauro Carvalho Chehab struct notifier_block restart_nb; 63cc2a2d19SMauro Carvalho Chehab void *driver_data; 64cc2a2d19SMauro Carvalho Chehab struct watchdog_core_data *wd_data; 65cc2a2d19SMauro Carvalho Chehab unsigned long status; 66cc2a2d19SMauro Carvalho Chehab struct list_head deferred; 67cc2a2d19SMauro Carvalho Chehab }; 68cc2a2d19SMauro Carvalho Chehab 69cc2a2d19SMauro Carvalho ChehabIt contains following fields: 70cc2a2d19SMauro Carvalho Chehab 71cc2a2d19SMauro Carvalho Chehab* id: set by watchdog_register_device, id 0 is special. It has both a 72cc2a2d19SMauro Carvalho Chehab /dev/watchdog0 cdev (dynamic major, minor 0) as well as the old 73cc2a2d19SMauro Carvalho Chehab /dev/watchdog miscdev. The id is set automatically when calling 74cc2a2d19SMauro Carvalho Chehab watchdog_register_device. 75cc2a2d19SMauro Carvalho Chehab* parent: set this to the parent device (or NULL) before calling 76cc2a2d19SMauro Carvalho Chehab watchdog_register_device. 77cc2a2d19SMauro Carvalho Chehab* groups: List of sysfs attribute groups to create when creating the watchdog 78cc2a2d19SMauro Carvalho Chehab device. 79cc2a2d19SMauro Carvalho Chehab* info: a pointer to a watchdog_info structure. This structure gives some 80cc2a2d19SMauro Carvalho Chehab additional information about the watchdog timer itself. (Like it's unique name) 81cc2a2d19SMauro Carvalho Chehab* ops: a pointer to the list of watchdog operations that the watchdog supports. 82cc2a2d19SMauro Carvalho Chehab* gov: a pointer to the assigned watchdog device pretimeout governor or NULL. 83cc2a2d19SMauro Carvalho Chehab* timeout: the watchdog timer's timeout value (in seconds). 84cc2a2d19SMauro Carvalho Chehab This is the time after which the system will reboot if user space does 85cc2a2d19SMauro Carvalho Chehab not send a heartbeat request if WDOG_ACTIVE is set. 86cc2a2d19SMauro Carvalho Chehab* pretimeout: the watchdog timer's pretimeout value (in seconds). 87cc2a2d19SMauro Carvalho Chehab* min_timeout: the watchdog timer's minimum timeout value (in seconds). 88cc2a2d19SMauro Carvalho Chehab If set, the minimum configurable value for 'timeout'. 89cc2a2d19SMauro Carvalho Chehab* max_timeout: the watchdog timer's maximum timeout value (in seconds), 90cc2a2d19SMauro Carvalho Chehab as seen from userspace. If set, the maximum configurable value for 91cc2a2d19SMauro Carvalho Chehab 'timeout'. Not used if max_hw_heartbeat_ms is non-zero. 92cc2a2d19SMauro Carvalho Chehab* min_hw_heartbeat_ms: Hardware limit for minimum time between heartbeats, 93cc2a2d19SMauro Carvalho Chehab in milli-seconds. This value is normally 0; it should only be provided 94cc2a2d19SMauro Carvalho Chehab if the hardware can not tolerate lower intervals between heartbeats. 95cc2a2d19SMauro Carvalho Chehab* max_hw_heartbeat_ms: Maximum hardware heartbeat, in milli-seconds. 96cc2a2d19SMauro Carvalho Chehab If set, the infrastructure will send heartbeats to the watchdog driver 97cc2a2d19SMauro Carvalho Chehab if 'timeout' is larger than max_hw_heartbeat_ms, unless WDOG_ACTIVE 98cc2a2d19SMauro Carvalho Chehab is set and userspace failed to send a heartbeat for at least 'timeout' 99cc2a2d19SMauro Carvalho Chehab seconds. max_hw_heartbeat_ms must be set if a driver does not implement 100cc2a2d19SMauro Carvalho Chehab the stop function. 101cc2a2d19SMauro Carvalho Chehab* reboot_nb: notifier block that is registered for reboot notifications, for 102cc2a2d19SMauro Carvalho Chehab internal use only. If the driver calls watchdog_stop_on_reboot, watchdog core 103cc2a2d19SMauro Carvalho Chehab will stop the watchdog on such notifications. 104cc2a2d19SMauro Carvalho Chehab* restart_nb: notifier block that is registered for machine restart, for 105cc2a2d19SMauro Carvalho Chehab internal use only. If a watchdog is capable of restarting the machine, it 106cc2a2d19SMauro Carvalho Chehab should define ops->restart. Priority can be changed through 107cc2a2d19SMauro Carvalho Chehab watchdog_set_restart_priority. 108cc2a2d19SMauro Carvalho Chehab* bootstatus: status of the device after booting (reported with watchdog 109cc2a2d19SMauro Carvalho Chehab WDIOF_* status bits). 110cc2a2d19SMauro Carvalho Chehab* driver_data: a pointer to the drivers private data of a watchdog device. 111cc2a2d19SMauro Carvalho Chehab This data should only be accessed via the watchdog_set_drvdata and 112cc2a2d19SMauro Carvalho Chehab watchdog_get_drvdata routines. 113cc2a2d19SMauro Carvalho Chehab* wd_data: a pointer to watchdog core internal data. 114cc2a2d19SMauro Carvalho Chehab* status: this field contains a number of status bits that give extra 115cc2a2d19SMauro Carvalho Chehab information about the status of the device (Like: is the watchdog timer 116cc2a2d19SMauro Carvalho Chehab running/active, or is the nowayout bit set). 117cc2a2d19SMauro Carvalho Chehab* deferred: entry in wtd_deferred_reg_list which is used to 118cc2a2d19SMauro Carvalho Chehab register early initialized watchdogs. 119cc2a2d19SMauro Carvalho Chehab 120cc2a2d19SMauro Carvalho ChehabThe list of watchdog operations is defined as:: 121cc2a2d19SMauro Carvalho Chehab 122cc2a2d19SMauro Carvalho Chehab struct watchdog_ops { 123cc2a2d19SMauro Carvalho Chehab struct module *owner; 124cc2a2d19SMauro Carvalho Chehab /* mandatory operations */ 125cc2a2d19SMauro Carvalho Chehab int (*start)(struct watchdog_device *); 126cc2a2d19SMauro Carvalho Chehab /* optional operations */ 127*4951d27bSBumsik Kim int (*stop)(struct watchdog_device *); 128cc2a2d19SMauro Carvalho Chehab int (*ping)(struct watchdog_device *); 129cc2a2d19SMauro Carvalho Chehab unsigned int (*status)(struct watchdog_device *); 130cc2a2d19SMauro Carvalho Chehab int (*set_timeout)(struct watchdog_device *, unsigned int); 131cc2a2d19SMauro Carvalho Chehab int (*set_pretimeout)(struct watchdog_device *, unsigned int); 132cc2a2d19SMauro Carvalho Chehab unsigned int (*get_timeleft)(struct watchdog_device *); 133cc2a2d19SMauro Carvalho Chehab int (*restart)(struct watchdog_device *); 134cc2a2d19SMauro Carvalho Chehab long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long); 135cc2a2d19SMauro Carvalho Chehab }; 136cc2a2d19SMauro Carvalho Chehab 137cc2a2d19SMauro Carvalho ChehabIt is important that you first define the module owner of the watchdog timer 138cc2a2d19SMauro Carvalho Chehabdriver's operations. This module owner will be used to lock the module when 139cc2a2d19SMauro Carvalho Chehabthe watchdog is active. (This to avoid a system crash when you unload the 140cc2a2d19SMauro Carvalho Chehabmodule and /dev/watchdog is still open). 141cc2a2d19SMauro Carvalho Chehab 142cc2a2d19SMauro Carvalho ChehabSome operations are mandatory and some are optional. The mandatory operations 143cc2a2d19SMauro Carvalho Chehabare: 144cc2a2d19SMauro Carvalho Chehab 145cc2a2d19SMauro Carvalho Chehab* start: this is a pointer to the routine that starts the watchdog timer 146cc2a2d19SMauro Carvalho Chehab device. 147cc2a2d19SMauro Carvalho Chehab The routine needs a pointer to the watchdog timer device structure as a 148cc2a2d19SMauro Carvalho Chehab parameter. It returns zero on success or a negative errno code for failure. 149cc2a2d19SMauro Carvalho Chehab 150cc2a2d19SMauro Carvalho ChehabNot all watchdog timer hardware supports the same functionality. That's why 151cc2a2d19SMauro Carvalho Chehaball other routines/operations are optional. They only need to be provided if 152cc2a2d19SMauro Carvalho Chehabthey are supported. These optional routines/operations are: 153cc2a2d19SMauro Carvalho Chehab 154cc2a2d19SMauro Carvalho Chehab* stop: with this routine the watchdog timer device is being stopped. 155cc2a2d19SMauro Carvalho Chehab 156cc2a2d19SMauro Carvalho Chehab The routine needs a pointer to the watchdog timer device structure as a 157cc2a2d19SMauro Carvalho Chehab parameter. It returns zero on success or a negative errno code for failure. 158cc2a2d19SMauro Carvalho Chehab Some watchdog timer hardware can only be started and not be stopped. A 159cc2a2d19SMauro Carvalho Chehab driver supporting such hardware does not have to implement the stop routine. 160cc2a2d19SMauro Carvalho Chehab 161cc2a2d19SMauro Carvalho Chehab If a driver has no stop function, the watchdog core will set WDOG_HW_RUNNING 162cc2a2d19SMauro Carvalho Chehab and start calling the driver's keepalive pings function after the watchdog 163cc2a2d19SMauro Carvalho Chehab device is closed. 164cc2a2d19SMauro Carvalho Chehab 165cc2a2d19SMauro Carvalho Chehab If a watchdog driver does not implement the stop function, it must set 166cc2a2d19SMauro Carvalho Chehab max_hw_heartbeat_ms. 167cc2a2d19SMauro Carvalho Chehab* ping: this is the routine that sends a keepalive ping to the watchdog timer 168cc2a2d19SMauro Carvalho Chehab hardware. 169cc2a2d19SMauro Carvalho Chehab 170cc2a2d19SMauro Carvalho Chehab The routine needs a pointer to the watchdog timer device structure as a 171cc2a2d19SMauro Carvalho Chehab parameter. It returns zero on success or a negative errno code for failure. 172cc2a2d19SMauro Carvalho Chehab 173cc2a2d19SMauro Carvalho Chehab Most hardware that does not support this as a separate function uses the 174cc2a2d19SMauro Carvalho Chehab start function to restart the watchdog timer hardware. And that's also what 175cc2a2d19SMauro Carvalho Chehab the watchdog timer driver core does: to send a keepalive ping to the watchdog 176cc2a2d19SMauro Carvalho Chehab timer hardware it will either use the ping operation (when available) or the 177cc2a2d19SMauro Carvalho Chehab start operation (when the ping operation is not available). 178cc2a2d19SMauro Carvalho Chehab 179cc2a2d19SMauro Carvalho Chehab (Note: the WDIOC_KEEPALIVE ioctl call will only be active when the 180cc2a2d19SMauro Carvalho Chehab WDIOF_KEEPALIVEPING bit has been set in the option field on the watchdog's 181cc2a2d19SMauro Carvalho Chehab info structure). 182cc2a2d19SMauro Carvalho Chehab* status: this routine checks the status of the watchdog timer device. The 183cc2a2d19SMauro Carvalho Chehab status of the device is reported with watchdog WDIOF_* status flags/bits. 184cc2a2d19SMauro Carvalho Chehab 185cc2a2d19SMauro Carvalho Chehab WDIOF_MAGICCLOSE and WDIOF_KEEPALIVEPING are reported by the watchdog core; 186cc2a2d19SMauro Carvalho Chehab it is not necessary to report those bits from the driver. Also, if no status 187cc2a2d19SMauro Carvalho Chehab function is provided by the driver, the watchdog core reports the status bits 188cc2a2d19SMauro Carvalho Chehab provided in the bootstatus variable of struct watchdog_device. 189cc2a2d19SMauro Carvalho Chehab 190cc2a2d19SMauro Carvalho Chehab* set_timeout: this routine checks and changes the timeout of the watchdog 191cc2a2d19SMauro Carvalho Chehab timer device. It returns 0 on success, -EINVAL for "parameter out of range" 192cc2a2d19SMauro Carvalho Chehab and -EIO for "could not write value to the watchdog". On success this 193cc2a2d19SMauro Carvalho Chehab routine should set the timeout value of the watchdog_device to the 194cc2a2d19SMauro Carvalho Chehab achieved timeout value (which may be different from the requested one 195cc2a2d19SMauro Carvalho Chehab because the watchdog does not necessarily have a 1 second resolution). 196cc2a2d19SMauro Carvalho Chehab 197cc2a2d19SMauro Carvalho Chehab Drivers implementing max_hw_heartbeat_ms set the hardware watchdog heartbeat 198cc2a2d19SMauro Carvalho Chehab to the minimum of timeout and max_hw_heartbeat_ms. Those drivers set the 199cc2a2d19SMauro Carvalho Chehab timeout value of the watchdog_device either to the requested timeout value 200cc2a2d19SMauro Carvalho Chehab (if it is larger than max_hw_heartbeat_ms), or to the achieved timeout value. 201cc2a2d19SMauro Carvalho Chehab (Note: the WDIOF_SETTIMEOUT needs to be set in the options field of the 202cc2a2d19SMauro Carvalho Chehab watchdog's info structure). 203cc2a2d19SMauro Carvalho Chehab 204cc2a2d19SMauro Carvalho Chehab If the watchdog driver does not have to perform any action but setting the 205cc2a2d19SMauro Carvalho Chehab watchdog_device.timeout, this callback can be omitted. 206cc2a2d19SMauro Carvalho Chehab 207cc2a2d19SMauro Carvalho Chehab If set_timeout is not provided but, WDIOF_SETTIMEOUT is set, the watchdog 208cc2a2d19SMauro Carvalho Chehab infrastructure updates the timeout value of the watchdog_device internally 209cc2a2d19SMauro Carvalho Chehab to the requested value. 210cc2a2d19SMauro Carvalho Chehab 211cc2a2d19SMauro Carvalho Chehab If the pretimeout feature is used (WDIOF_PRETIMEOUT), then set_timeout must 212cc2a2d19SMauro Carvalho Chehab also take care of checking if pretimeout is still valid and set up the timer 213cc2a2d19SMauro Carvalho Chehab accordingly. This can't be done in the core without races, so it is the 214cc2a2d19SMauro Carvalho Chehab duty of the driver. 215cc2a2d19SMauro Carvalho Chehab* set_pretimeout: this routine checks and changes the pretimeout value of 216cc2a2d19SMauro Carvalho Chehab the watchdog. It is optional because not all watchdogs support pretimeout 217cc2a2d19SMauro Carvalho Chehab notification. The timeout value is not an absolute time, but the number of 218cc2a2d19SMauro Carvalho Chehab seconds before the actual timeout would happen. It returns 0 on success, 219cc2a2d19SMauro Carvalho Chehab -EINVAL for "parameter out of range" and -EIO for "could not write value to 220cc2a2d19SMauro Carvalho Chehab the watchdog". A value of 0 disables pretimeout notification. 221cc2a2d19SMauro Carvalho Chehab 222cc2a2d19SMauro Carvalho Chehab (Note: the WDIOF_PRETIMEOUT needs to be set in the options field of the 223cc2a2d19SMauro Carvalho Chehab watchdog's info structure). 224cc2a2d19SMauro Carvalho Chehab 225cc2a2d19SMauro Carvalho Chehab If the watchdog driver does not have to perform any action but setting the 226cc2a2d19SMauro Carvalho Chehab watchdog_device.pretimeout, this callback can be omitted. That means if 227cc2a2d19SMauro Carvalho Chehab set_pretimeout is not provided but WDIOF_PRETIMEOUT is set, the watchdog 228cc2a2d19SMauro Carvalho Chehab infrastructure updates the pretimeout value of the watchdog_device internally 229cc2a2d19SMauro Carvalho Chehab to the requested value. 230cc2a2d19SMauro Carvalho Chehab 231cc2a2d19SMauro Carvalho Chehab* get_timeleft: this routines returns the time that's left before a reset. 232cc2a2d19SMauro Carvalho Chehab* restart: this routine restarts the machine. It returns 0 on success or a 233cc2a2d19SMauro Carvalho Chehab negative errno code for failure. 234cc2a2d19SMauro Carvalho Chehab* ioctl: if this routine is present then it will be called first before we do 235cc2a2d19SMauro Carvalho Chehab our own internal ioctl call handling. This routine should return -ENOIOCTLCMD 236cc2a2d19SMauro Carvalho Chehab if a command is not supported. The parameters that are passed to the ioctl 237cc2a2d19SMauro Carvalho Chehab call are: watchdog_device, cmd and arg. 238cc2a2d19SMauro Carvalho Chehab 239cc2a2d19SMauro Carvalho ChehabThe status bits should (preferably) be set with the set_bit and clear_bit alike 240cc2a2d19SMauro Carvalho Chehabbit-operations. The status bits that are defined are: 241cc2a2d19SMauro Carvalho Chehab 242cc2a2d19SMauro Carvalho Chehab* WDOG_ACTIVE: this status bit indicates whether or not a watchdog timer device 243cc2a2d19SMauro Carvalho Chehab is active or not from user perspective. User space is expected to send 244cc2a2d19SMauro Carvalho Chehab heartbeat requests to the driver while this flag is set. 245cc2a2d19SMauro Carvalho Chehab* WDOG_NO_WAY_OUT: this bit stores the nowayout setting for the watchdog. 246cc2a2d19SMauro Carvalho Chehab If this bit is set then the watchdog timer will not be able to stop. 247cc2a2d19SMauro Carvalho Chehab* WDOG_HW_RUNNING: Set by the watchdog driver if the hardware watchdog is 248cc2a2d19SMauro Carvalho Chehab running. The bit must be set if the watchdog timer hardware can not be 249cc2a2d19SMauro Carvalho Chehab stopped. The bit may also be set if the watchdog timer is running after 250cc2a2d19SMauro Carvalho Chehab booting, before the watchdog device is opened. If set, the watchdog 251cc2a2d19SMauro Carvalho Chehab infrastructure will send keepalives to the watchdog hardware while 252cc2a2d19SMauro Carvalho Chehab WDOG_ACTIVE is not set. 253cc2a2d19SMauro Carvalho Chehab Note: when you register the watchdog timer device with this bit set, 254cc2a2d19SMauro Carvalho Chehab then opening /dev/watchdog will skip the start operation but send a keepalive 255cc2a2d19SMauro Carvalho Chehab request instead. 256cc2a2d19SMauro Carvalho Chehab 257cc2a2d19SMauro Carvalho Chehab To set the WDOG_NO_WAY_OUT status bit (before registering your watchdog 258cc2a2d19SMauro Carvalho Chehab timer device) you can either: 259cc2a2d19SMauro Carvalho Chehab 260cc2a2d19SMauro Carvalho Chehab * set it statically in your watchdog_device struct with 261cc2a2d19SMauro Carvalho Chehab 262cc2a2d19SMauro Carvalho Chehab .status = WATCHDOG_NOWAYOUT_INIT_STATUS, 263cc2a2d19SMauro Carvalho Chehab 264cc2a2d19SMauro Carvalho Chehab (this will set the value the same as CONFIG_WATCHDOG_NOWAYOUT) or 265cc2a2d19SMauro Carvalho Chehab * use the following helper function:: 266cc2a2d19SMauro Carvalho Chehab 267cc2a2d19SMauro Carvalho Chehab static inline void watchdog_set_nowayout(struct watchdog_device *wdd, 268cc2a2d19SMauro Carvalho Chehab int nowayout) 269cc2a2d19SMauro Carvalho Chehab 270cc2a2d19SMauro Carvalho ChehabNote: 271cc2a2d19SMauro Carvalho Chehab The WatchDog Timer Driver Core supports the magic close feature and 272cc2a2d19SMauro Carvalho Chehab the nowayout feature. To use the magic close feature you must set the 273cc2a2d19SMauro Carvalho Chehab WDIOF_MAGICCLOSE bit in the options field of the watchdog's info structure. 274cc2a2d19SMauro Carvalho Chehab 275cc2a2d19SMauro Carvalho ChehabThe nowayout feature will overrule the magic close feature. 276cc2a2d19SMauro Carvalho Chehab 277cc2a2d19SMauro Carvalho ChehabTo get or set driver specific data the following two helper functions should be 278cc2a2d19SMauro Carvalho Chehabused:: 279cc2a2d19SMauro Carvalho Chehab 280cc2a2d19SMauro Carvalho Chehab static inline void watchdog_set_drvdata(struct watchdog_device *wdd, 281cc2a2d19SMauro Carvalho Chehab void *data) 282cc2a2d19SMauro Carvalho Chehab static inline void *watchdog_get_drvdata(struct watchdog_device *wdd) 283cc2a2d19SMauro Carvalho Chehab 284cc2a2d19SMauro Carvalho ChehabThe watchdog_set_drvdata function allows you to add driver specific data. The 285cc2a2d19SMauro Carvalho Chehabarguments of this function are the watchdog device where you want to add the 286cc2a2d19SMauro Carvalho Chehabdriver specific data to and a pointer to the data itself. 287cc2a2d19SMauro Carvalho Chehab 288cc2a2d19SMauro Carvalho ChehabThe watchdog_get_drvdata function allows you to retrieve driver specific data. 289cc2a2d19SMauro Carvalho ChehabThe argument of this function is the watchdog device where you want to retrieve 290cc2a2d19SMauro Carvalho Chehabdata from. The function returns the pointer to the driver specific data. 291cc2a2d19SMauro Carvalho Chehab 292cc2a2d19SMauro Carvalho ChehabTo initialize the timeout field, the following function can be used:: 293cc2a2d19SMauro Carvalho Chehab 294cc2a2d19SMauro Carvalho Chehab extern int watchdog_init_timeout(struct watchdog_device *wdd, 295cc2a2d19SMauro Carvalho Chehab unsigned int timeout_parm, 296cc2a2d19SMauro Carvalho Chehab struct device *dev); 297cc2a2d19SMauro Carvalho Chehab 298cc2a2d19SMauro Carvalho ChehabThe watchdog_init_timeout function allows you to initialize the timeout field 299cc2a2d19SMauro Carvalho Chehabusing the module timeout parameter or by retrieving the timeout-sec property from 300cc2a2d19SMauro Carvalho Chehabthe device tree (if the module timeout parameter is invalid). Best practice is 301cc2a2d19SMauro Carvalho Chehabto set the default timeout value as timeout value in the watchdog_device and 302cc2a2d19SMauro Carvalho Chehabthen use this function to set the user "preferred" timeout value. 303cc2a2d19SMauro Carvalho ChehabThis routine returns zero on success and a negative errno code for failure. 304cc2a2d19SMauro Carvalho Chehab 305cc2a2d19SMauro Carvalho ChehabTo disable the watchdog on reboot, the user must call the following helper:: 306cc2a2d19SMauro Carvalho Chehab 307cc2a2d19SMauro Carvalho Chehab static inline void watchdog_stop_on_reboot(struct watchdog_device *wdd); 308cc2a2d19SMauro Carvalho Chehab 309cc2a2d19SMauro Carvalho ChehabTo disable the watchdog when unregistering the watchdog, the user must call 310cc2a2d19SMauro Carvalho Chehabthe following helper. Note that this will only stop the watchdog if the 311cc2a2d19SMauro Carvalho Chehabnowayout flag is not set. 312cc2a2d19SMauro Carvalho Chehab 313cc2a2d19SMauro Carvalho Chehab:: 314cc2a2d19SMauro Carvalho Chehab 315cc2a2d19SMauro Carvalho Chehab static inline void watchdog_stop_on_unregister(struct watchdog_device *wdd); 316cc2a2d19SMauro Carvalho Chehab 317cc2a2d19SMauro Carvalho ChehabTo change the priority of the restart handler the following helper should be 318cc2a2d19SMauro Carvalho Chehabused:: 319cc2a2d19SMauro Carvalho Chehab 320cc2a2d19SMauro Carvalho Chehab void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority); 321cc2a2d19SMauro Carvalho Chehab 322cc2a2d19SMauro Carvalho ChehabUser should follow the following guidelines for setting the priority: 323cc2a2d19SMauro Carvalho Chehab 324cc2a2d19SMauro Carvalho Chehab* 0: should be called in last resort, has limited restart capabilities 325cc2a2d19SMauro Carvalho Chehab* 128: default restart handler, use if no other handler is expected to be 326cc2a2d19SMauro Carvalho Chehab available, and/or if restart is sufficient to restart the entire system 327cc2a2d19SMauro Carvalho Chehab* 255: highest priority, will preempt all other restart handlers 328cc2a2d19SMauro Carvalho Chehab 329cc2a2d19SMauro Carvalho ChehabTo raise a pretimeout notification, the following function should be used:: 330cc2a2d19SMauro Carvalho Chehab 331cc2a2d19SMauro Carvalho Chehab void watchdog_notify_pretimeout(struct watchdog_device *wdd) 332cc2a2d19SMauro Carvalho Chehab 333cc2a2d19SMauro Carvalho ChehabThe function can be called in the interrupt context. If watchdog pretimeout 334cc2a2d19SMauro Carvalho Chehabgovernor framework (kbuild CONFIG_WATCHDOG_PRETIMEOUT_GOV symbol) is enabled, 335cc2a2d19SMauro Carvalho Chehaban action is taken by a preconfigured pretimeout governor preassigned to 336cc2a2d19SMauro Carvalho Chehabthe watchdog device. If watchdog pretimeout governor framework is not 337cc2a2d19SMauro Carvalho Chehabenabled, watchdog_notify_pretimeout() prints a notification message to 338cc2a2d19SMauro Carvalho Chehabthe kernel log buffer. 339