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