+// Physically disconnected device
+static void usbcan_disconnect(struct usb_interface *interface)
+{
+ struct usbcan_devs *usbdevs;
+ int j;
+
+ /* prevent more I/O from starting */
+ lock_kernel();
+
+ usbdevs = usb_get_intfdata(interface);
+ if (usbdevs==NULL){
+ CANMSG("USBCAN device seems to be already removed\n");
+ unlock_kernel();
+ return;
+ }
+ usb_set_intfdata(interface, NULL);
+ deregister_hotplug_dev(usbdevs->candev);
+
+ for (j=0;j<usbdevs->count;j++){
+ if (!usbdevs->devs[j]) continue;
+ mutex_lock(&usbdevs->devs[j]->io_mutex);
+ usbdevs->devs[j]->interface = NULL;
+ mutex_unlock(&usbdevs->devs[j]->io_mutex);
+ }
+
+ unlock_kernel();
+
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10))
+ kref_put(&usbdevs->candev->refcount,release_device);
+#else
+ release_device(&usbdevs->candev);
+#endif
+}
+