summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/isa
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2001-03-17 16:04:25 +0000
committercg <cg@FreeBSD.org>2001-03-17 16:04:25 +0000
commit9b5050ffec35ca106f7338164c59c0f672b60054 (patch)
tree2dcb9e8c29c0ef7466b1912fab74e0dd428486e1 /sys/dev/sound/isa
parentf5bc78ff8d13af415e80ce03c72ac0ef937f95b2 (diff)
downloadFreeBSD-src-9b5050ffec35ca106f7338164c59c0f672b60054.zip
FreeBSD-src-9b5050ffec35ca106f7338164c59c0f672b60054.tar.gz
destroy child devices on detach to prevent ever-increasing numbers of
pcm/midi devices trying to attach if the module is repeatedly loaded and unloaded.
Diffstat (limited to 'sys/dev/sound/isa')
-rw-r--r--sys/dev/sound/isa/sbc.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/sys/dev/sound/isa/sbc.c b/sys/dev/sound/isa/sbc.c
index 1fc485e..8629554 100644
--- a/sys/dev/sound/isa/sbc.c
+++ b/sys/dev/sound/isa/sbc.c
@@ -43,6 +43,7 @@ struct sbc_ihl {
/* Here is the parameter structure per a device. */
struct sbc_softc {
device_t dev; /* device */
+ device_t child_pcm, child_midi1, child_midi2;
int io_rid[IO_MAX]; /* io port rids */
struct resource *io[IO_MAX]; /* io port resources */
@@ -298,7 +299,6 @@ sbc_attach(device_t dev)
char *err = NULL;
struct sbc_softc *scp;
struct sndcard_func *func;
- device_t child;
u_int32_t logical_id = isa_get_logicalid(dev);
int flags = device_get_flags(dev);
int f, dh, dl, x, irq, i;
@@ -405,24 +405,24 @@ sbc_attach(device_t dev)
if (func == NULL) goto bad;
bzero(func, sizeof(*func));
func->func = SCF_PCM;
- child = device_add_child(dev, "pcm", -1);
- device_set_ivars(child, func);
+ scp->child_pcm = device_add_child(dev, "pcm", -1);
+ device_set_ivars(scp->child_pcm, func);
/* Midi Interface */
func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT);
if (func == NULL) goto bad;
bzero(func, sizeof(*func));
func->func = SCF_MIDI;
- child = device_add_child(dev, "midi", -1);
- device_set_ivars(child, func);
+ scp->child_midi1 = device_add_child(dev, "midi", -1);
+ device_set_ivars(scp->child_midi1, func);
/* OPL FM Synthesizer */
func = malloc(sizeof(struct sndcard_func), M_DEVBUF, M_NOWAIT);
if (func == NULL) goto bad;
bzero(func, sizeof(*func));
func->func = SCF_SYNTH;
- child = device_add_child(dev, "midi", -1);
- device_set_ivars(child, func);
+ scp->child_midi2 = device_add_child(dev, "midi", -1);
+ device_set_ivars(scp->child_midi2, func);
/* probe/attach kids */
bus_generic_attach(dev);
@@ -439,6 +439,9 @@ sbc_detach(device_t dev)
{
struct sbc_softc *scp = device_get_softc(dev);
+ device_delete_child(dev, scp->child_midi2);
+ device_delete_child(dev, scp->child_midi1);
+ device_delete_child(dev, scp->child_pcm);
release_resource(scp);
return bus_generic_detach(dev);
}
OpenPOWER on IntegriCloud