Module Name: src
Committed By: dyoung
Date: Tue Apr 7 22:30:09 UTC 2009
Modified Files:
src/sys/dev/ic: attimer.c attimervar.h
src/sys/dev/isa: pcppi.c
Log Message:
Make pcppi(4) detach the "speaker" from attimer(4), so that the
corresponding attimer(4) resource is not perpetually busy: now it
is possible to detach and to reattach pcppi(4). Make attimer(4)'s
device-detachment hook return EBUSY if pcppi(4) is still attached, so
that pcppi(4) cannot end up with a dangling pointer to attimer(4).
To generate a diff of this commit:
cvs rdiff -u -r1.9 -r1.10 src/sys/dev/ic/attimer.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/ic/attimervar.h
cvs rdiff -u -r1.33 -r1.34 src/sys/dev/isa/pcppi.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/ic/attimer.c
diff -u src/sys/dev/ic/attimer.c:1.9 src/sys/dev/ic/attimer.c:1.10
--- src/sys/dev/ic/attimer.c:1.9 Thu Jun 12 22:30:30 2008
+++ src/sys/dev/ic/attimer.c Tue Apr 7 22:30:09 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: attimer.c,v 1.9 2008/06/12 22:30:30 cegger Exp $ */
+/* $NetBSD: attimer.c,v 1.10 2009/04/07 22:30:09 dyoung Exp $ */
/*
* Copyright (c) 2005 The NetBSD Foundation.
@@ -33,7 +33,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: attimer.c,v 1.9 2008/06/12 22:30:30 cegger Exp $");
+__KERNEL_RCSID(0, "$NetBSD: attimer.c,v 1.10 2009/04/07 22:30:09 dyoung Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -62,6 +62,9 @@
attimer_detach(device_t self, int flags)
{
struct attimer_softc *sc = device_private(self);
+
+ if ((sc->sc_flags & ATT_ATTACHED) != 0)
+ return EBUSY;
pmf_device_deregister(self);
sc->sc_flags &= ~ATT_CONFIGURED;
@@ -98,6 +101,14 @@
}
void
+attimer_detach_speaker(device_t dev)
+{
+ struct attimer_softc *sc = device_private(dev);
+
+ sc->sc_flags &= ~ATT_ATTACHED;
+}
+
+void
attimer_set_pitch(device_t dev, int pitch)
{
struct attimer_softc *sc = device_private(dev);
Index: src/sys/dev/ic/attimervar.h
diff -u src/sys/dev/ic/attimervar.h:1.6 src/sys/dev/ic/attimervar.h:1.7
--- src/sys/dev/ic/attimervar.h:1.6 Tue Apr 29 06:53:02 2008
+++ src/sys/dev/ic/attimervar.h Tue Apr 7 22:30:09 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: attimervar.h,v 1.6 2008/04/29 06:53:02 martin Exp $ */
+/* $NetBSD: attimervar.h,v 1.7 2009/04/07 22:30:09 dyoung Exp $ */
/*
* Copyright (c) 2005 The NetBSD Foundation.
@@ -39,4 +39,5 @@
void attimer_attach(struct attimer_softc *);
int attimer_detach(device_t, int);
device_t attimer_attach_speaker(void);
+void attimer_detach_speaker(device_t);
void attimer_set_pitch(device_t, int);
Index: src/sys/dev/isa/pcppi.c
diff -u src/sys/dev/isa/pcppi.c:1.33 src/sys/dev/isa/pcppi.c:1.34
--- src/sys/dev/isa/pcppi.c:1.33 Sat Mar 14 11:08:28 2009
+++ src/sys/dev/isa/pcppi.c Tue Apr 7 22:30:09 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pcppi.c,v 1.33 2009/03/14 11:08:28 ad Exp $ */
+/* $NetBSD: pcppi.c,v 1.34 2009/04/07 22:30:09 dyoung Exp $ */
/*
* Copyright (c) 1996 Carnegie-Mellon University.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pcppi.c,v 1.33 2009/03/14 11:08:28 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcppi.c,v 1.34 2009/04/07 22:30:09 dyoung Exp $");
#include "attimer.h"
@@ -68,6 +68,7 @@
#if NATTIMER > 0
static void pcppi_attach_speaker(device_t);
+static void pcppi_detach_speaker(struct pcppi_softc *);
#endif
#define PCPPIPRI (PZERO - 1)
@@ -180,6 +181,10 @@
int rc;
struct pcppi_softc *sc = device_private(self);
+#if NATTIMER > 0
+ pcppi_detach_speaker(sc);
+#endif
+
if ((rc = config_detach_children(sc->sc_dv, flags)) != 0)
return rc;
@@ -234,6 +239,15 @@
#if NATTIMER > 0
static void
+pcppi_detach_speaker(struct pcppi_softc *sc)
+{
+ if (sc->sc_timer != NULL) {
+ attimer_detach_speaker(sc->sc_timer);
+ sc->sc_timer = NULL;
+ }
+}
+
+static void
pcppi_attach_speaker(device_t self)
{
struct pcppi_softc *sc = device_private(self);