From: Andrew Zabolotny ac97_unregister_driver() is nulling out the ->driver field for all codecs. It should only null the codecs which are using this driver. --- 25-akpm/sound/oss/ac97_codec.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) diff -puN sound/oss/ac97_codec.c~ac97-remove-fix sound/oss/ac97_codec.c --- 25/sound/oss/ac97_codec.c~ac97-remove-fix Tue Jan 27 16:15:24 2004 +++ 25-akpm/sound/oss/ac97_codec.c Tue Jan 27 16:17:18 2004 @@ -1428,9 +1428,8 @@ EXPORT_SYMBOL_GPL(ac97_register_driver); * ac97_unregister_driver - unregister a codec helper * @driver: Driver handler * - * Register a handler for codecs matching the codec id. The handler - * attach function is called for all present codecs and will be - * called when new codecs are discovered. + * Unregister a handler for codecs matching the codec id. The handler + * remove function is called for all matching codecs. */ void ac97_unregister_driver(struct ac97_driver *driver) @@ -1440,13 +1439,14 @@ void ac97_unregister_driver(struct ac97_ down(&codec_sem); list_del_init(&driver->list); - + list_for_each(l, &codecs) { c = list_entry(l, struct ac97_codec, list); - if(c->driver == driver) + if (c->driver == driver) { driver->remove(c, driver); - c->driver = NULL; + c->driver = NULL; + } } up(&codec_sem); _