Messages in this thread Patch in this message | | | Date | Sun, 18 Apr 2004 20:31:09 +1000 | Subject | Re: Bug#244207: kernel-source-2.6.5: mwave gives warning on suspend | From | Herbert Xu <> |
| |
On Sat, Apr 17, 2004 at 10:29:54PM +1000, herbert wrote: > > Please scrap that one, it just makes the module unloadable.
This patch resolves the problem of the module getting unloaded before the device is released by waiting in the module_exit function.
Cheers, -- Debian GNU/Linux 3.0 is out! ( http://www.debian.org/ ) Email: Herbert Xu ~{PmV>HI~} <herbert@gondor.apana.org.au> Home Page: http://gondor.apana.org.au/~herbert/ PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt Index: drivers/char/mwave/mwavedd.c =================================================================== RCS file: /home/gondolin/herbert/src/CVS/debian/kernel-source-2.5/drivers/char/mwave/mwavedd.c,v retrieving revision 1.1.1.7 diff -u -r1.1.1.7 mwavedd.c --- a/drivers/char/mwave/mwavedd.c 28 Sep 2003 04:44:12 -0000 1.1.1.7 +++ b/drivers/char/mwave/mwavedd.c 18 Apr 2004 10:26:41 -0000 @@ -57,6 +57,7 @@ #include <linux/sched.h> #include <linux/spinlock.h> #include <linux/delay.h> +#include <linux/completion.h> #include "smapi.h" #include "mwavedd.h" #include "3780i.h" @@ -470,7 +471,17 @@ * sysfs support <paulsch@us.ibm.com> */ -struct device mwave_device; +static DECLARE_COMPLETION(mwave_device_released); + +static void mwave_device_release(struct device *dev) +{ + complete(&mwave_device_released); +} + +static struct device mwave_device = { + .bus_id = "mwave", + .release = mwave_device_release, +}; /* Prevent code redundancy, create a macro for mwave_show_* functions. */ #define mwave_show_function(attr_name, format_string, field) \ @@ -518,7 +529,9 @@ pDrvData->nr_registered_attrs = 0; if (pDrvData->device_registered) { + INIT_COMPLETION(mwave_device_released); device_unregister(&mwave_device); + wait_for_completion(&mwave_device_released); pDrvData->device_registered = FALSE; } @@ -639,9 +652,6 @@ /* uart is registered */ /* sysfs */ - memset(&mwave_device, 0, sizeof (struct device)); - snprintf(mwave_device.bus_id, BUS_ID_SIZE, "mwave"); - if (device_register(&mwave_device)) goto cleanup_error; pDrvData->device_registered = TRUE; | |