Remove the internal driver use_count in ds.c, as the reference counting is done in the module core anyways, and that reference count is available for cardmgr's usage by a call to module_refcount. And if !CONFIG_MODULE_UNLOAD, rmmod is useless anyways, so avoid that call by cardmgr at all. Signed-off-by: Dominik Brodowski Index: 2.6.10-rc3/drivers/pcmcia/ds.c =================================================================== --- 2.6.10-rc3.orig/drivers/pcmcia/ds.c 2004-12-13 15:57:55.263233940 +0100 +++ 2.6.10-rc3/drivers/pcmcia/ds.c 2004-12-13 15:59:07.844165082 +0100 @@ -285,7 +285,6 @@ if (!driver) return -EINVAL; - driver->use_count = 0; driver->drv.bus = &pcmcia_bus_type; return driver_register(&driver->drv); @@ -307,10 +306,16 @@ static int proc_read_drivers_callback(struct device_driver *driver, void *d) { char **p = d; - struct pcmcia_driver *p_dev = container_of(driver, + struct pcmcia_driver *p_drv = container_of(driver, struct pcmcia_driver, drv); - *p += sprintf(*p, "%-24.24s 1 %d\n", driver->name, p_dev->use_count); + *p += sprintf(*p, "%-24.24s 1 %d\n", p_drv->drv.name, +#ifdef CONFIG_MODULE_UNLOAD + (p_drv->owner) ? module_refcount(p_drv->owner) : 1 +#else + 1 +#endif + ); d = (void *) p; return 0; @@ -593,7 +598,6 @@ /* finally here the parent client is registered */ s->parent->clients = client; - p_drv->use_count++; if (p_drv->attach) { p_dev->instance = p_drv->attach(); if (!p_dev->instance) { @@ -727,7 +731,6 @@ /* detach the "instance" */ p_drv = to_pcmcia_drv(p_dev->dev.driver); if (p_drv) { - p_drv->use_count--; if ((p_drv->detach) && (p_dev->instance)) p_drv->detach(p_dev->instance); module_put(p_drv->owner); Index: 2.6.10-rc3/include/pcmcia/ds.h =================================================================== --- 2.6.10-rc3.orig/include/pcmcia/ds.h 2004-12-13 15:56:08.055133414 +0100 +++ 2.6.10-rc3/include/pcmcia/ds.h 2004-12-13 15:59:07.845164942 +0100 @@ -132,7 +132,6 @@ extern struct bus_type pcmcia_bus_type; struct pcmcia_driver { - int use_count; dev_link_t *(*attach)(void); void (*detach)(dev_link_t *); struct module *owner;