Message ID | 20220824152448.7736-1-henning.schild@siemens.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [v2] watchdog: w83627hf_wdt: add bootstatus support | expand |
Diff to v1: - fixed typo in commit message - add Reviewed-by tag - make sure it still applies Henning Am Wed, 24 Aug 2022 17:24:48 +0200 schrieb Henning Schild <henning.schild@siemens.com>: > The status bit in the status and control register can tell us whether > the last reboot was caused by the watchdog. Make sure to take that > into the bootstatus before clearing it. > > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Henning Schild <henning.schild@siemens.com> > --- > drivers/watchdog/w83627hf_wdt.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/watchdog/w83627hf_wdt.c > b/drivers/watchdog/w83627hf_wdt.c index 56a4a4030ca9..bc33b63c5a5d > 100644 --- a/drivers/watchdog/w83627hf_wdt.c > +++ b/drivers/watchdog/w83627hf_wdt.c > @@ -113,6 +113,10 @@ MODULE_PARM_DESC(early_disable, "Disable > watchdog at boot time (default=0)"); #define W836X7HF_WDT_CSR > 0xf7 #define NCT6102D_WDT_CSR 0xf2 > > +#define WDT_CSR_STATUS 0x10 > +#define WDT_CSR_KBD 0x40 > +#define WDT_CSR_MOUSE 0x80 > + > static void superio_outb(int reg, int val) > { > outb(reg, WDT_EFER); > @@ -244,8 +248,12 @@ static int w83627hf_init(struct watchdog_device > *wdog, enum chips chip) t = superio_inb(cr_wdt_control) & ~0x0C; > superio_outb(cr_wdt_control, t); > > - /* reset trigger, disable keyboard & mouse turning off > watchdog */ > - t = superio_inb(cr_wdt_csr) & ~0xD0; > + t = superio_inb(cr_wdt_csr); > + if (t & WDT_CSR_STATUS) > + wdog->bootstatus |= WDIOF_CARDRESET; > + > + /* reset status, disable keyboard & mouse turning off > watchdog */ > + t &= ~(WDT_CSR_STATUS | WDT_CSR_KBD | WDT_CSR_MOUSE); > superio_outb(cr_wdt_csr, t); > > superio_exit();
Ping. Henning Am Wed, 24 Aug 2022 17:24:48 +0200 schrieb Henning Schild <henning.schild@siemens.com>: > The status bit in the status and control register can tell us whether > the last reboot was caused by the watchdog. Make sure to take that > into the bootstatus before clearing it. > > Reviewed-by: Guenter Roeck <linux@roeck-us.net> > Signed-off-by: Henning Schild <henning.schild@siemens.com> > --- > drivers/watchdog/w83627hf_wdt.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/watchdog/w83627hf_wdt.c > b/drivers/watchdog/w83627hf_wdt.c index 56a4a4030ca9..bc33b63c5a5d > 100644 --- a/drivers/watchdog/w83627hf_wdt.c > +++ b/drivers/watchdog/w83627hf_wdt.c > @@ -113,6 +113,10 @@ MODULE_PARM_DESC(early_disable, "Disable > watchdog at boot time (default=0)"); #define W836X7HF_WDT_CSR > 0xf7 #define NCT6102D_WDT_CSR 0xf2 > > +#define WDT_CSR_STATUS 0x10 > +#define WDT_CSR_KBD 0x40 > +#define WDT_CSR_MOUSE 0x80 > + > static void superio_outb(int reg, int val) > { > outb(reg, WDT_EFER); > @@ -244,8 +248,12 @@ static int w83627hf_init(struct watchdog_device > *wdog, enum chips chip) t = superio_inb(cr_wdt_control) & ~0x0C; > superio_outb(cr_wdt_control, t); > > - /* reset trigger, disable keyboard & mouse turning off > watchdog */ > - t = superio_inb(cr_wdt_csr) & ~0xD0; > + t = superio_inb(cr_wdt_csr); > + if (t & WDT_CSR_STATUS) > + wdog->bootstatus |= WDIOF_CARDRESET; > + > + /* reset status, disable keyboard & mouse turning off > watchdog */ > + t &= ~(WDT_CSR_STATUS | WDT_CSR_KBD | WDT_CSR_MOUSE); > superio_outb(cr_wdt_csr, t); > > superio_exit();
On 10/7/22 08:36, Henning Schild wrote: > Ping. > The patch is queued in my watchdog-next branch. We'll see if Wim will pick it up in his pull request for 6.1. If not, try again after the commit window closes. Guenter > Henning > > Am Wed, 24 Aug 2022 17:24:48 +0200 > schrieb Henning Schild <henning.schild@siemens.com>: > >> The status bit in the status and control register can tell us whether >> the last reboot was caused by the watchdog. Make sure to take that >> into the bootstatus before clearing it. >> >> Reviewed-by: Guenter Roeck <linux@roeck-us.net> >> Signed-off-by: Henning Schild <henning.schild@siemens.com> >> --- >> drivers/watchdog/w83627hf_wdt.c | 12 ++++++++++-- >> 1 file changed, 10 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/watchdog/w83627hf_wdt.c >> b/drivers/watchdog/w83627hf_wdt.c index 56a4a4030ca9..bc33b63c5a5d >> 100644 --- a/drivers/watchdog/w83627hf_wdt.c >> +++ b/drivers/watchdog/w83627hf_wdt.c >> @@ -113,6 +113,10 @@ MODULE_PARM_DESC(early_disable, "Disable >> watchdog at boot time (default=0)"); #define W836X7HF_WDT_CSR >> 0xf7 #define NCT6102D_WDT_CSR 0xf2 >> >> +#define WDT_CSR_STATUS 0x10 >> +#define WDT_CSR_KBD 0x40 >> +#define WDT_CSR_MOUSE 0x80 >> + >> static void superio_outb(int reg, int val) >> { >> outb(reg, WDT_EFER); >> @@ -244,8 +248,12 @@ static int w83627hf_init(struct watchdog_device >> *wdog, enum chips chip) t = superio_inb(cr_wdt_control) & ~0x0C; >> superio_outb(cr_wdt_control, t); >> >> - /* reset trigger, disable keyboard & mouse turning off >> watchdog */ >> - t = superio_inb(cr_wdt_csr) & ~0xD0; >> + t = superio_inb(cr_wdt_csr); >> + if (t & WDT_CSR_STATUS) >> + wdog->bootstatus |= WDIOF_CARDRESET; >> + >> + /* reset status, disable keyboard & mouse turning off >> watchdog */ >> + t &= ~(WDT_CSR_STATUS | WDT_CSR_KBD | WDT_CSR_MOUSE); >> superio_outb(cr_wdt_csr, t); >> >> superio_exit(); >
Am Fri, 7 Oct 2022 08:51:05 -0700 schrieb Guenter Roeck <linux@roeck-us.net>: > On 10/7/22 08:36, Henning Schild wrote: > > Ping. > > > > The patch is queued in my watchdog-next branch. We'll see > if Wim will pick it up in his pull request for 6.1. If not, > try again after the commit window closes. Thanks for the update. regards, Henning > Guenter > > > Henning > > > > Am Wed, 24 Aug 2022 17:24:48 +0200 > > schrieb Henning Schild <henning.schild@siemens.com>: > > > >> The status bit in the status and control register can tell us > >> whether the last reboot was caused by the watchdog. Make sure to > >> take that into the bootstatus before clearing it. > >> > >> Reviewed-by: Guenter Roeck <linux@roeck-us.net> > >> Signed-off-by: Henning Schild <henning.schild@siemens.com> > >> --- > >> drivers/watchdog/w83627hf_wdt.c | 12 ++++++++++-- > >> 1 file changed, 10 insertions(+), 2 deletions(-) > >> > >> diff --git a/drivers/watchdog/w83627hf_wdt.c > >> b/drivers/watchdog/w83627hf_wdt.c index 56a4a4030ca9..bc33b63c5a5d > >> 100644 --- a/drivers/watchdog/w83627hf_wdt.c > >> +++ b/drivers/watchdog/w83627hf_wdt.c > >> @@ -113,6 +113,10 @@ MODULE_PARM_DESC(early_disable, "Disable > >> watchdog at boot time (default=0)"); #define W836X7HF_WDT_CSR > >> 0xf7 #define NCT6102D_WDT_CSR 0xf2 > >> > >> +#define WDT_CSR_STATUS 0x10 > >> +#define WDT_CSR_KBD 0x40 > >> +#define WDT_CSR_MOUSE 0x80 > >> + > >> static void superio_outb(int reg, int val) > >> { > >> outb(reg, WDT_EFER); > >> @@ -244,8 +248,12 @@ static int w83627hf_init(struct > >> watchdog_device *wdog, enum chips chip) t = > >> superio_inb(cr_wdt_control) & ~0x0C; superio_outb(cr_wdt_control, > >> t); > >> - /* reset trigger, disable keyboard & mouse turning off > >> watchdog */ > >> - t = superio_inb(cr_wdt_csr) & ~0xD0; > >> + t = superio_inb(cr_wdt_csr); > >> + if (t & WDT_CSR_STATUS) > >> + wdog->bootstatus |= WDIOF_CARDRESET; > >> + > >> + /* reset status, disable keyboard & mouse turning off > >> watchdog */ > >> + t &= ~(WDT_CSR_STATUS | WDT_CSR_KBD | WDT_CSR_MOUSE); > >> superio_outb(cr_wdt_csr, t); > >> > >> superio_exit(); > > >
diff --git a/drivers/watchdog/w83627hf_wdt.c b/drivers/watchdog/w83627hf_wdt.c index 56a4a4030ca9..bc33b63c5a5d 100644 --- a/drivers/watchdog/w83627hf_wdt.c +++ b/drivers/watchdog/w83627hf_wdt.c @@ -113,6 +113,10 @@ MODULE_PARM_DESC(early_disable, "Disable watchdog at boot time (default=0)"); #define W836X7HF_WDT_CSR 0xf7 #define NCT6102D_WDT_CSR 0xf2 +#define WDT_CSR_STATUS 0x10 +#define WDT_CSR_KBD 0x40 +#define WDT_CSR_MOUSE 0x80 + static void superio_outb(int reg, int val) { outb(reg, WDT_EFER); @@ -244,8 +248,12 @@ static int w83627hf_init(struct watchdog_device *wdog, enum chips chip) t = superio_inb(cr_wdt_control) & ~0x0C; superio_outb(cr_wdt_control, t); - /* reset trigger, disable keyboard & mouse turning off watchdog */ - t = superio_inb(cr_wdt_csr) & ~0xD0; + t = superio_inb(cr_wdt_csr); + if (t & WDT_CSR_STATUS) + wdog->bootstatus |= WDIOF_CARDRESET; + + /* reset status, disable keyboard & mouse turning off watchdog */ + t &= ~(WDT_CSR_STATUS | WDT_CSR_KBD | WDT_CSR_MOUSE); superio_outb(cr_wdt_csr, t); superio_exit();