Hi, please let me know if there's anything missing for review. On Tue, Mar 16, 2021 at 5:11 PM Ryan O'Leary <ryanole...@google.com> wrote:
> This is the same ioctl the rest of the watchdogs support. GETTIMELEFT > returns the number of seconds in the countdown -- useful for testing > whether the watchdog is functioning. > > Signed-off-by: Ryan O'Leary <ryanole...@google.com> > --- > drivers/char/ipmi/ipmi_watchdog.c | 75 +++++++++++++++++++++++++++++++ > 1 file changed, 75 insertions(+) > > diff --git a/drivers/char/ipmi/ipmi_watchdog.c > b/drivers/char/ipmi/ipmi_watchdog.c > index 32c334e34d55..f253c8667395 100644 > --- a/drivers/char/ipmi/ipmi_watchdog.c > +++ b/drivers/char/ipmi/ipmi_watchdog.c > @@ -456,6 +456,71 @@ static int ipmi_set_timeout(int do_heartbeat) > return rv; > } > > +static unsigned int __ipmi_get_timeout(struct ipmi_smi_msg *smi_msg, > + struct ipmi_recv_msg *recv_msg, > + int *countdown) > +{ > + struct kernel_ipmi_msg msg; > + int rv = 0; > + struct ipmi_system_interface_addr addr; > + > + > + addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; > + addr.channel = IPMI_BMC_CHANNEL; > + addr.lun = 0; > + > + msg.netfn = 0x06; > + msg.cmd = IPMI_WDOG_GET_TIMER; > + msg.data = NULL; > + msg.data_len = 0; > + rv = ipmi_request_supply_msgs(watchdog_user, > + (struct ipmi_addr *) &addr, > + 0, > + &msg, > + NULL, > + smi_msg, > + recv_msg, > + 1); > + if (rv) { > + pr_warn("get timeout error: %d\n", rv); > + return rv; > + } > + > + wait_for_completion(&msg_wait); > + > + if (recv_msg->msg.data_len < 9) { > + pr_warn("get timeout response size: %d (expected 9)\n", > + recv_msg->msg.data_len); > + return -EIO; > + } > + > + if (recv_msg->msg.data[0] != 0) { > + pr_warn("get timeout completion code error: %d\n", > + recv_msg->msg.data[0]); > + return -EIO; > + } > + > + *countdown = WDOG_GET_TIMEOUT(recv_msg->msg.data[7], > recv_msg->msg.data[8]); > + > + return rv; > +} > + > +static int _ipmi_get_timeout(int *countdown) > +{ > + int rv; > + > + if (!watchdog_user) > + return -ENODEV; > + > + atomic_set(&msg_tofree, 2); > + > + rv = __ipmi_get_timeout(&smi_msg, > + &recv_msg, > + countdown); > + > + return rv; > +} > + > static atomic_t panic_done_count = ATOMIC_INIT(0); > > static void panic_smi_free(struct ipmi_smi_msg *msg) > @@ -729,6 +794,16 @@ static int ipmi_ioctl(struct file *file, > return -EFAULT; > return 0; > > + case WDIOC_GETTIMELEFT: > + val = 0; > + i = _ipmi_get_timeout(&val); > + if (i) > + return i; > + i = copy_to_user(argp, &val, sizeof(val)); > + if (i) > + return -EFAULT; > + return 0; > + > default: > return -ENOIOCTLCMD; > } > -- > 2.31.0.rc2.261.g7f71774620-goog > >
_______________________________________________ Openipmi-developer mailing list Openipmi-developer@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openipmi-developer