static ssize_t status_show(struct device *dev, struct device_attribute *attr, char *buf) { struct watchdog_device *wdd = dev_get_drvdata(dev); struct watchdog_core_data *wd_data = wdd->wd_data; unsigned int status; mutex_lock(&wd_data->lock); status = watchdog_get_status(wdd); mutex_unlock(&wd_data->lock); return sprintf(buf, "0x%x\n", status); }
static long watchdog_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct watchdog_device *wdd = file->private_data; void __user *argp = (void __user *)arg; int __user *p = argp; unsigned int val; int err; err = watchdog_ioctl_op(wdd, cmd, arg); if (err != -ENOIOCTLCMD) return err; switch (cmd) { case WDIOC_GETSUPPORT: return copy_to_user(argp, wdd->info, sizeof(struct watchdog_info)) ? -EFAULT : 0; case WDIOC_GETSTATUS: err = watchdog_get_status(wdd, &val); if (err) return err; return put_user(val, p); case WDIOC_GETBOOTSTATUS: return put_user(wdd->bootstatus, p); case WDIOC_SETOPTIONS: if (get_user(val, p)) return -EFAULT; if (val & WDIOS_DISABLECARD) { err = watchdog_stop(wdd); if (err < 0) return err; } if (val & WDIOS_ENABLECARD) { err = watchdog_start(wdd); if (err < 0) return err; } return 0; case WDIOC_KEEPALIVE: if (!(wdd->info->options & WDIOF_KEEPALIVEPING)) return -EOPNOTSUPP; watchdog_ping(wdd); return 0; case WDIOC_SETTIMEOUT: if (get_user(val, p)) return -EFAULT; err = watchdog_set_timeout(wdd, val); if (err < 0) return err; /* If the watchdog is active then we send a keepalive ping * to make sure that the watchdog keep's running (and if * possible that it takes the new timeout) */ watchdog_ping(wdd); /* Fall */ case WDIOC_GETTIMEOUT: /* timeout == 0 means that we don't know the timeout */ if (wdd->timeout == 0) return -EOPNOTSUPP; return put_user(wdd->timeout, p); case WDIOC_GETTIMELEFT: err = watchdog_get_timeleft(wdd, &val); if (err) return err; return put_user(val, p); default: return -ENOTTY; } }
static long watchdog_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct watchdog_core_data *wd_data = file->private_data; void __user *argp = (void __user *)arg; struct watchdog_device *wdd; int __user *p = argp; unsigned int val; int err; mutex_lock(&wd_data->lock); wdd = wd_data->wdd; if (!wdd) { err = -ENODEV; goto out_ioctl; } err = watchdog_ioctl_op(wdd, cmd, arg); if (err != -ENOIOCTLCMD) goto out_ioctl; switch (cmd) { case WDIOC_GETSUPPORT: err = copy_to_user(argp, wdd->info, sizeof(struct watchdog_info)) ? -EFAULT : 0; break; case WDIOC_GETSTATUS: val = watchdog_get_status(wdd); err = put_user(val, p); break; case WDIOC_GETBOOTSTATUS: err = put_user(wdd->bootstatus, p); break; case WDIOC_SETOPTIONS: if (get_user(val, p)) { err = -EFAULT; break; } if (val & WDIOS_DISABLECARD) { err = watchdog_stop(wdd); if (err < 0) break; } if (val & WDIOS_ENABLECARD) err = watchdog_start(wdd); break; case WDIOC_KEEPALIVE: if (!(wdd->info->options & WDIOF_KEEPALIVEPING)) { err = -EOPNOTSUPP; break; } err = watchdog_ping(wdd); break; case WDIOC_SETTIMEOUT: if (get_user(val, p)) { err = -EFAULT; break; } err = watchdog_set_timeout(wdd, val); if (err < 0) break; /* If the watchdog is active then we send a keepalive ping * to make sure that the watchdog keep's running (and if * possible that it takes the new timeout) */ err = watchdog_ping(wdd); if (err < 0) break; /* Fall */ case WDIOC_GETTIMEOUT: /* timeout == 0 means that we don't know the timeout */ if (wdd->timeout == 0) { err = -EOPNOTSUPP; break; } err = put_user(wdd->timeout, p); break; case WDIOC_GETTIMELEFT: err = watchdog_get_timeleft(wdd, &val); if (err < 0) break; err = put_user(val, p); break; case WDIOC_SETPRETIMEOUT: if (get_user(val, p)) { err = -EFAULT; break; } err = watchdog_set_pretimeout(wdd, val); break; case WDIOC_GETPRETIMEOUT: err = put_user(wdd->pretimeout, p); break; default: err = -ENOTTY; break; } out_ioctl: mutex_unlock(&wd_data->lock); return err; }