Lines Matching refs:wdd

68 	struct watchdog_device *wdd;  member
90 static inline bool watchdog_need_worker(struct watchdog_device *wdd) in watchdog_need_worker() argument
93 unsigned int hm = wdd->max_hw_heartbeat_ms; in watchdog_need_worker()
94 unsigned int t = wdd->timeout * 1000; in watchdog_need_worker()
109 return (hm && watchdog_active(wdd) && t > hm) || in watchdog_need_worker()
110 (t && !watchdog_active(wdd) && watchdog_hw_running(wdd)); in watchdog_need_worker()
113 static ktime_t watchdog_next_keepalive(struct watchdog_device *wdd) in watchdog_next_keepalive() argument
115 struct watchdog_core_data *wd_data = wdd->wd_data; in watchdog_next_keepalive()
116 unsigned int timeout_ms = wdd->timeout * 1000; in watchdog_next_keepalive()
124 hw_heartbeat_ms = min_not_zero(timeout_ms, wdd->max_hw_heartbeat_ms); in watchdog_next_keepalive()
127 if (!watchdog_active(wdd)) in watchdog_next_keepalive()
142 static inline void watchdog_update_worker(struct watchdog_device *wdd) in watchdog_update_worker() argument
144 struct watchdog_core_data *wd_data = wdd->wd_data; in watchdog_update_worker()
146 if (watchdog_need_worker(wdd)) { in watchdog_update_worker()
147 ktime_t t = watchdog_next_keepalive(wdd); in watchdog_update_worker()
156 static int __watchdog_ping(struct watchdog_device *wdd) in __watchdog_ping() argument
158 struct watchdog_core_data *wd_data = wdd->wd_data; in __watchdog_ping()
163 ms_to_ktime(wdd->min_hw_heartbeat_ms)); in __watchdog_ping()
175 if (wdd->ops->ping) in __watchdog_ping()
176 err = wdd->ops->ping(wdd); /* ping the watchdog */ in __watchdog_ping()
178 err = wdd->ops->start(wdd); /* restart watchdog */ in __watchdog_ping()
180 watchdog_update_worker(wdd); in __watchdog_ping()
197 static int watchdog_ping(struct watchdog_device *wdd) in watchdog_ping() argument
199 struct watchdog_core_data *wd_data = wdd->wd_data; in watchdog_ping()
201 if (!watchdog_active(wdd) && !watchdog_hw_running(wdd)) in watchdog_ping()
207 return __watchdog_ping(wdd); in watchdog_ping()
212 struct watchdog_device *wdd = wd_data->wdd; in watchdog_worker_should_ping() local
214 return wdd && (watchdog_active(wdd) || watchdog_hw_running(wdd)); in watchdog_worker_should_ping()
225 __watchdog_ping(wd_data->wdd); in watchdog_ping_work()
250 static int watchdog_start(struct watchdog_device *wdd) in watchdog_start() argument
252 struct watchdog_core_data *wd_data = wdd->wd_data; in watchdog_start()
256 if (watchdog_active(wdd)) in watchdog_start()
262 if (watchdog_hw_running(wdd) && wdd->ops->ping) in watchdog_start()
263 err = wdd->ops->ping(wdd); in watchdog_start()
265 err = wdd->ops->start(wdd); in watchdog_start()
267 set_bit(WDOG_ACTIVE, &wdd->status); in watchdog_start()
269 watchdog_update_worker(wdd); in watchdog_start()
287 static int watchdog_stop(struct watchdog_device *wdd) in watchdog_stop() argument
291 if (!watchdog_active(wdd)) in watchdog_stop()
294 if (test_bit(WDOG_NO_WAY_OUT, &wdd->status)) { in watchdog_stop()
296 wdd->id); in watchdog_stop()
300 if (wdd->ops->stop) { in watchdog_stop()
301 clear_bit(WDOG_HW_RUNNING, &wdd->status); in watchdog_stop()
302 err = wdd->ops->stop(wdd); in watchdog_stop()
304 set_bit(WDOG_HW_RUNNING, &wdd->status); in watchdog_stop()
308 clear_bit(WDOG_ACTIVE, &wdd->status); in watchdog_stop()
309 watchdog_update_worker(wdd); in watchdog_stop()
324 static unsigned int watchdog_get_status(struct watchdog_device *wdd) in watchdog_get_status() argument
326 struct watchdog_core_data *wd_data = wdd->wd_data; in watchdog_get_status()
329 if (wdd->ops->status) in watchdog_get_status()
330 status = wdd->ops->status(wdd); in watchdog_get_status()
332 status = wdd->bootstatus & (WDIOF_CARDRESET | in watchdog_get_status()
357 static int watchdog_set_timeout(struct watchdog_device *wdd, in watchdog_set_timeout() argument
362 if (!(wdd->info->options & WDIOF_SETTIMEOUT)) in watchdog_set_timeout()
365 if (watchdog_timeout_invalid(wdd, timeout)) in watchdog_set_timeout()
368 if (wdd->ops->set_timeout) { in watchdog_set_timeout()
369 err = wdd->ops->set_timeout(wdd, timeout); in watchdog_set_timeout()
371 wdd->timeout = timeout; in watchdog_set_timeout()
373 if (wdd->pretimeout >= wdd->timeout) in watchdog_set_timeout()
374 wdd->pretimeout = 0; in watchdog_set_timeout()
377 watchdog_update_worker(wdd); in watchdog_set_timeout()
388 static int watchdog_set_pretimeout(struct watchdog_device *wdd, in watchdog_set_pretimeout() argument
393 if (!(wdd->info->options & WDIOF_PRETIMEOUT)) in watchdog_set_pretimeout()
396 if (watchdog_pretimeout_invalid(wdd, timeout)) in watchdog_set_pretimeout()
399 if (wdd->ops->set_pretimeout) in watchdog_set_pretimeout()
400 err = wdd->ops->set_pretimeout(wdd, timeout); in watchdog_set_pretimeout()
402 wdd->pretimeout = timeout; in watchdog_set_pretimeout()
417 static int watchdog_get_timeleft(struct watchdog_device *wdd, in watchdog_get_timeleft() argument
422 if (!wdd->ops->get_timeleft) in watchdog_get_timeleft()
425 *timeleft = wdd->ops->get_timeleft(wdd); in watchdog_get_timeleft()
434 struct watchdog_device *wdd = dev_get_drvdata(dev); in nowayout_show() local
436 return sprintf(buf, "%d\n", !!test_bit(WDOG_NO_WAY_OUT, &wdd->status)); in nowayout_show()
443 struct watchdog_device *wdd = dev_get_drvdata(dev); in status_show() local
444 struct watchdog_core_data *wd_data = wdd->wd_data; in status_show()
448 status = watchdog_get_status(wdd); in status_show()
458 struct watchdog_device *wdd = dev_get_drvdata(dev); in bootstatus_show() local
460 return sprintf(buf, "%u\n", wdd->bootstatus); in bootstatus_show()
467 struct watchdog_device *wdd = dev_get_drvdata(dev); in timeleft_show() local
468 struct watchdog_core_data *wd_data = wdd->wd_data; in timeleft_show()
473 status = watchdog_get_timeleft(wdd, &val); in timeleft_show()
485 struct watchdog_device *wdd = dev_get_drvdata(dev); in timeout_show() local
487 return sprintf(buf, "%u\n", wdd->timeout); in timeout_show()
494 struct watchdog_device *wdd = dev_get_drvdata(dev); in pretimeout_show() local
496 return sprintf(buf, "%u\n", wdd->pretimeout); in pretimeout_show()
503 struct watchdog_device *wdd = dev_get_drvdata(dev); in identity_show() local
505 return sprintf(buf, "%s\n", wdd->info->identity); in identity_show()
512 struct watchdog_device *wdd = dev_get_drvdata(dev); in state_show() local
514 if (watchdog_active(wdd)) in state_show()
532 struct watchdog_device *wdd = dev_get_drvdata(dev); in pretimeout_governor_show() local
534 return watchdog_pretimeout_governor_get(wdd, buf); in pretimeout_governor_show()
541 struct watchdog_device *wdd = dev_get_drvdata(dev); in pretimeout_governor_store() local
542 int ret = watchdog_pretimeout_governor_set(wdd, buf); in pretimeout_governor_store()
555 struct watchdog_device *wdd = dev_get_drvdata(dev); in wdt_is_visible() local
558 if (attr == &dev_attr_timeleft.attr && !wdd->ops->get_timeleft) in wdt_is_visible()
561 !(wdd->info->options & WDIOF_PRETIMEOUT)) in wdt_is_visible()
565 (!(wdd->info->options & WDIOF_PRETIMEOUT) || in wdt_is_visible()
603 static int watchdog_ioctl_op(struct watchdog_device *wdd, unsigned int cmd, in watchdog_ioctl_op() argument
606 if (!wdd->ops->ioctl) in watchdog_ioctl_op()
609 return wdd->ops->ioctl(wdd, cmd, arg); in watchdog_ioctl_op()
628 struct watchdog_device *wdd; in watchdog_write() local
654 wdd = wd_data->wdd; in watchdog_write()
655 if (wdd) in watchdog_write()
656 err = watchdog_ping(wdd); in watchdog_write()
680 struct watchdog_device *wdd; in watchdog_ioctl() local
687 wdd = wd_data->wdd; in watchdog_ioctl()
688 if (!wdd) { in watchdog_ioctl()
693 err = watchdog_ioctl_op(wdd, cmd, arg); in watchdog_ioctl()
699 err = copy_to_user(argp, wdd->info, in watchdog_ioctl()
703 val = watchdog_get_status(wdd); in watchdog_ioctl()
707 err = put_user(wdd->bootstatus, p); in watchdog_ioctl()
715 err = watchdog_stop(wdd); in watchdog_ioctl()
720 err = watchdog_start(wdd); in watchdog_ioctl()
723 if (!(wdd->info->options & WDIOF_KEEPALIVEPING)) { in watchdog_ioctl()
727 err = watchdog_ping(wdd); in watchdog_ioctl()
734 err = watchdog_set_timeout(wdd, val); in watchdog_ioctl()
740 err = watchdog_ping(wdd); in watchdog_ioctl()
746 if (wdd->timeout == 0) { in watchdog_ioctl()
750 err = put_user(wdd->timeout, p); in watchdog_ioctl()
753 err = watchdog_get_timeleft(wdd, &val); in watchdog_ioctl()
763 err = watchdog_set_pretimeout(wdd, val); in watchdog_ioctl()
766 err = put_user(wdd->pretimeout, p); in watchdog_ioctl()
791 struct watchdog_device *wdd; in watchdog_open() local
806 wdd = wd_data->wdd; in watchdog_open()
812 hw_running = watchdog_hw_running(wdd); in watchdog_open()
813 if (!hw_running && !try_module_get(wdd->ops->owner)) { in watchdog_open()
818 err = watchdog_start(wdd); in watchdog_open()
831 module_put(wd_data->wdd->ops->owner); in watchdog_open()
859 struct watchdog_device *wdd; in watchdog_release() local
865 wdd = wd_data->wdd; in watchdog_release()
866 if (!wdd) in watchdog_release()
874 if (!test_bit(WDOG_ACTIVE, &wdd->status)) in watchdog_release()
877 !(wdd->info->options & WDIOF_MAGICCLOSE)) in watchdog_release()
878 err = watchdog_stop(wdd); in watchdog_release()
882 pr_crit("watchdog%d: watchdog did not stop!\n", wdd->id); in watchdog_release()
883 watchdog_ping(wdd); in watchdog_release()
886 watchdog_update_worker(wdd); in watchdog_release()
892 running = wdd && watchdog_hw_running(wdd); in watchdog_release()
930 static int watchdog_cdev_register(struct watchdog_device *wdd, dev_t devno) in watchdog_cdev_register() argument
941 wd_data->wdd = wdd; in watchdog_cdev_register()
942 wdd->wd_data = wd_data; in watchdog_cdev_register()
951 if (wdd->id == 0) { in watchdog_cdev_register()
953 watchdog_miscdev.parent = wdd->parent; in watchdog_cdev_register()
957 wdd->info->identity, WATCHDOG_MINOR, err); in watchdog_cdev_register()
960 wdd->info->identity); in watchdog_cdev_register()
969 wd_data->cdev.owner = wdd->ops->owner; in watchdog_cdev_register()
975 wdd->id, MAJOR(watchdog_devt), wdd->id); in watchdog_cdev_register()
976 if (wdd->id == 0) { in watchdog_cdev_register()
991 if (watchdog_hw_running(wdd)) { in watchdog_cdev_register()
992 __module_get(wdd->ops->owner); in watchdog_cdev_register()
998 wdd->id); in watchdog_cdev_register()
1012 static void watchdog_cdev_unregister(struct watchdog_device *wdd) in watchdog_cdev_unregister() argument
1014 struct watchdog_core_data *wd_data = wdd->wd_data; in watchdog_cdev_unregister()
1017 if (wdd->id == 0) { in watchdog_cdev_unregister()
1023 wd_data->wdd = NULL; in watchdog_cdev_unregister()
1024 wdd->wd_data = NULL; in watchdog_cdev_unregister()
1027 if (watchdog_active(wdd) && in watchdog_cdev_unregister()
1028 test_bit(WDOG_STOP_ON_UNREGISTER, &wdd->status)) { in watchdog_cdev_unregister()
1029 watchdog_stop(wdd); in watchdog_cdev_unregister()
1047 struct watchdog_device *wdd; in watchdog_reboot_notifier() local
1049 wdd = container_of(nb, struct watchdog_device, reboot_nb); in watchdog_reboot_notifier()
1051 if (watchdog_active(wdd)) { in watchdog_reboot_notifier()
1054 ret = wdd->ops->stop(wdd); in watchdog_reboot_notifier()
1072 int watchdog_dev_register(struct watchdog_device *wdd) in watchdog_dev_register() argument
1078 devno = MKDEV(MAJOR(watchdog_devt), wdd->id); in watchdog_dev_register()
1080 ret = watchdog_cdev_register(wdd, devno); in watchdog_dev_register()
1084 dev = device_create_with_groups(&watchdog_class, wdd->parent, in watchdog_dev_register()
1085 devno, wdd, wdd->groups, in watchdog_dev_register()
1086 "watchdog%d", wdd->id); in watchdog_dev_register()
1088 watchdog_cdev_unregister(wdd); in watchdog_dev_register()
1092 ret = watchdog_register_pretimeout(wdd); in watchdog_dev_register()
1095 watchdog_cdev_unregister(wdd); in watchdog_dev_register()
1099 if (test_bit(WDOG_STOP_ON_REBOOT, &wdd->status)) { in watchdog_dev_register()
1100 wdd->reboot_nb.notifier_call = watchdog_reboot_notifier; in watchdog_dev_register()
1102 ret = devm_register_reboot_notifier(dev, &wdd->reboot_nb); in watchdog_dev_register()
1105 wdd->id, ret); in watchdog_dev_register()
1106 watchdog_dev_unregister(wdd); in watchdog_dev_register()
1121 void watchdog_dev_unregister(struct watchdog_device *wdd) in watchdog_dev_unregister() argument
1123 watchdog_unregister_pretimeout(wdd); in watchdog_dev_unregister()
1124 device_destroy(&watchdog_class, wdd->wd_data->cdev.dev); in watchdog_dev_unregister()
1125 watchdog_cdev_unregister(wdd); in watchdog_dev_unregister()