Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 3 May 2018 15:33:18 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r333212 - head/sys/dev/amdsbwd
Message-ID:  <201805031533.w43FXIUr043509@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Thu May  3 15:33:18 2018
New Revision: 333212
URL: https://svnweb.freebsd.org/changeset/base/333212

Log:
  amdsbwd: add suspend and resume methods
  
  Without the suspend method the watchdog may fire in S1 state.  Without
  the resume method the watchdog is not re-enabled after returning from S3
  state.  I observe this on one of my systems.
  
  Not sure if watchdog(4) should participate in the suspend actions.
  Right now everything is up to individual drivers.
  
  MFC after:	2 weeks

Modified:
  head/sys/dev/amdsbwd/amdsbwd.c

Modified: head/sys/dev/amdsbwd/amdsbwd.c
==============================================================================
--- head/sys/dev/amdsbwd/amdsbwd.c	Thu May  3 15:01:27 2018	(r333211)
+++ head/sys/dev/amdsbwd/amdsbwd.c	Thu May  3 15:33:18 2018	(r333212)
@@ -104,12 +104,16 @@ static void	amdsbwd_identify(driver_t *driver, device_
 static int	amdsbwd_probe(device_t dev);
 static int	amdsbwd_attach(device_t dev);
 static int	amdsbwd_detach(device_t dev);
+static int	amdsbwd_suspend(device_t dev);
+static int	amdsbwd_resume(device_t dev);
 
 static device_method_t amdsbwd_methods[] = {
 	DEVMETHOD(device_identify,	amdsbwd_identify),
 	DEVMETHOD(device_probe,		amdsbwd_probe),
 	DEVMETHOD(device_attach,	amdsbwd_attach),
 	DEVMETHOD(device_detach,	amdsbwd_detach),
+	DEVMETHOD(device_suspend,	amdsbwd_suspend),
+	DEVMETHOD(device_resume,	amdsbwd_resume),
 #if 0
 	DEVMETHOD(device_shutdown,	amdsbwd_detach),
 #endif
@@ -553,3 +557,30 @@ amdsbwd_detach(device_t dev)
 	return (0);
 }
 
+static int
+amdsbwd_suspend(device_t dev)
+{
+	struct amdsbwd_softc *sc;
+	uint32_t val;
+
+	sc = device_get_softc(dev);
+	val = wdctrl_read(sc);
+	val &= ~AMDSB_WD_RUN;
+	wdctrl_write(sc, val);
+	return (0);
+}
+
+static int
+amdsbwd_resume(device_t dev)
+{
+	struct amdsbwd_softc *sc;
+
+	sc = device_get_softc(dev);
+	wdctrl_write(sc, AMDSB_WD_FIRED);
+	if (sc->active) {
+		amdsbwd_tmr_set(sc, sc->timeout);
+		amdsbwd_tmr_enable(sc);
+		amdsbwd_tmr_reload(sc);
+	}
+	return (0);
+}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201805031533.w43FXIUr043509>