usbatm : modprobe & rmmod
matthieu castet
castet.matthieu at free.fr
Wed Jan 26 08:28:48 EST 2005
Duncan Sands wrote:
> Hi Roman,
>
>
>>Please consider me convinced. Indeed the usbatm2 framework seems to
>>suffice for everything I can think of, and is much safer by vurtue of
>>making calls into the subdriver, and not vice versa.
>>
>>So I give up trying with usb_atm (this time for good).
>
>
> :)
>
>
>>However, I think Matthieu's desire to use .driver_data to handle the
>>chipset pecularities is a valid argument, so usbatm should provide some
>>other means to pass usbatm_driver to the core. It can be done either at
>>subdriver probe time or in usb-serial fashion, by maintaining a list of
>>subdrivers updated at subdriver register time, and choosing the
>>appropriate one using usb_match_id in the core probe routine.
>
>
> I agree, and will try to come up with something today.
>
Why don't you want separate usb_driver and usbatm_driver like in pci-ide ?
Another argument is for because speedtouch modem use interface 1, the
first probe will initialized all the data, then the bind will failed
because it is interface 0 and everything is deinit.
Cheers,
Matthieu
-------------- next part --------------
Index: usbatm.h
===================================================================
RCS file: /home/cvs/usbatm/usbatm.h,v
retrieving revision 1.3
diff -u -u -r1.3 usbatm.h
--- usbatm.h 25 Jan 2005 08:18:09 -0000 1.3
+++ usbatm.h 26 Jan 2005 13:26:58 -0000
@@ -90,10 +90,10 @@
unsigned tx_padding;
/* private */
- struct usb_driver usb;
+ struct usbatm_data *instance;
};
-int usbatm_register (struct usbatm_driver *driver);
+int usbatm_register (struct usb_interface *inf, struct usbatm_driver *driver);
void usbatm_deregister (struct usbatm_driver *driver);
Index: usbatm2.c
===================================================================
RCS file: /home/cvs/usbatm/usbatm2.c,v
retrieving revision 1.11
diff -u -u -r1.11 usbatm2.c
--- usbatm2.c 25 Jan 2005 08:18:09 -0000 1.11
+++ usbatm2.c 26 Jan 2005 13:26:58 -0000
@@ -1046,10 +1046,9 @@
return 0;
}
-static int usbatm_usb_probe (struct usb_interface *intf, const struct usb_device_id *id)
+int usbatm_register (struct usb_interface *intf, struct usbatm_driver *driver)
{
struct usb_device *dev = interface_to_usbdev(intf);
- struct usbatm_driver *driver = (struct usbatm_driver *) id->driver_info;
struct usbatm_data *instance;
char *buf;
int error = -ENOMEM;
@@ -1072,6 +1071,8 @@
memset(instance, 0, sizeof(*instance));
+ driver->instance = instance;
+
kref_init(&instance->refcount); /* one for USB */
init_MUTEX(&instance->serialize);
@@ -1198,7 +1199,6 @@
usb_get_dev(dev);
udsl_get_instance(instance); /* dropped in usbatm_disconnect */
- usb_set_intfdata(intf, instance);
return 0;
@@ -1219,10 +1219,11 @@
return error;
}
+EXPORT_SYMBOL_GPL(usbatm_register);
-static void usbatm_disconnect(struct usb_interface *intf)
+void usbatm_deregister (struct usbatm_driver *driver)
{
- struct usbatm_data *instance = usb_get_intfdata(intf);
+ struct usbatm_data *instance = driver->instance;
int i;
dbg("udsl_instance_disconnect entered");
@@ -1232,8 +1233,6 @@
return;
}
- usb_set_intfdata(intf, NULL);
-
down(&instance->serialize);
instance->bound = 0;
up(&instance->serialize);
@@ -1245,7 +1244,7 @@
kthread_stop(instance->kthread);
if (instance->driver->unbind)
- instance->driver->unbind(instance, intf);
+ instance->driver->unbind(instance, instance->usb_intf);
/* receive finalize */
tasklet_disable(&instance->receive_tasklet);
@@ -1290,32 +1289,12 @@
udsl_put_instance(instance); /* taken in usbatm_usb_probe */
}
+EXPORT_SYMBOL_GPL(usbatm_deregister);
/***********
** init **
***********/
-
-int usbatm_register (struct usbatm_driver *driver)
-{
- struct usb_driver *usb_driver = &driver->usb;
-
- usb_driver->owner = driver->owner;
- usb_driver->name = driver->driver_name;
- usb_driver->probe = usbatm_usb_probe;
- usb_driver->disconnect = usbatm_disconnect;
- usb_driver->id_table = driver->id_table;
-
- return usb_register(usb_driver);
-}
-EXPORT_SYMBOL_GPL(usbatm_register);
-
-void usbatm_deregister (struct usbatm_driver *driver)
-{
- usb_deregister(&driver->usb);
-}
-EXPORT_SYMBOL_GPL(usbatm_deregister);
-
static int __init udsl_usb_init(void)
{
dbg("udsl_usb_init: driver version " DRIVER_VERSION);
More information about the Usbatm
mailing list