--- include/linux/usbdevice_fs.h-dist	Mon Mar 18 08:49:48 2002
+++ include/linux/usbdevice_fs.h	Mon Mar 18 09:09:15 2002
@@ -124,6 +124,28 @@
 	char port [127];	/* e.g. port 3 connects to device 27 */
 };
 
+/* For mapping interfaces from /proc/bus/usb/BBB/NNN files to
+ * /dev/... and such, when kernel support is inescapable.
+ * Use with USBDEVFS_IOCTL. */ 
+enum usb_driver_type {
+    unknown = 0,
+    chardev, blockdev,		/* major/minor, perhaps many inodes */
+    netdev			/* no filesystem name */
+};
+struct usbdevfs_driverinfo {
+	enum usb_driver_type	type;
+	union {
+		struct {	/* for chardev or blockdev */
+			int	major;
+			int	minor;
+			char	devfs_name [64];	/* if devfs is used */
+		} dev;
+		struct {	/* for netdev */
+			char	ifname [16];		/* IFNAMSIZ */
+		} net;
+	} u;
+};
+
 #define USBDEVFS_CONTROL           _IOWR('U', 0, struct usbdevfs_ctrltransfer)
 #define USBDEVFS_BULK              _IOWR('U', 2, struct usbdevfs_bulktransfer)
 #define USBDEVFS_RESETEP           _IOR('U', 3, unsigned int)
@@ -142,6 +164,7 @@
 #define USBDEVFS_HUB_PORTINFO      _IOR('U', 19, struct usbdevfs_hub_portinfo)
 #define USBDEVFS_RESET             _IO('U', 20)
 #define USBDEVFS_CLEAR_HALT        _IOR('U', 21, unsigned int)
+#define USBDEVFS_DRIVERINFO        _IOR('U', 22, struct usbdevfs_driverinfo)
 
 /* --------------------------------------------------------------------- */
 
--- drivers/usb-dist/pwc-if.c	Wed Mar  6 09:36:16 2002
+++ drivers/usb/pwc-if.c	Mon Mar 18 09:49:09 2002
@@ -87,6 +87,7 @@
 
 static void *usb_pwc_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id);
 static void usb_pwc_disconnect(struct usb_device *udev, void *ptr);
+static int usb_pwc_ioctl(struct usb_device *udev, unsigned int code, void *user_data);
 
 static struct usb_driver pwc_driver =
 {
@@ -94,6 +95,7 @@
 	id_table:		pwc_device_table,
 	probe:			usb_pwc_probe,		/* probe() */
 	disconnect:		usb_pwc_disconnect,	/* disconnect() */
+	ioctl:			usb_pwc_ioctl,		/* /proc/bus/usb ioctl */
 };
 
 #define MAX_DEV_HINTS 10
@@ -1894,6 +1896,33 @@
 	kfree(pdev);
 }
 
+static int usb_pwc_ioctl (
+	struct usb_device *udev,
+	unsigned int code,
+	void *user_data
+) {
+	switch (code) {
+	case USBDEVFS_DRIVERINFO: {
+		struct usbdevfs_driverinfo	*info = user_data;
+		struct pwc_device		*pdev;
+
+		lock_kernel ();
+		// FIXME get pdev from from dev and ioctl info
+		pdev = 0;
+		info->type = chardev;
+		info->u.dev.major = VIDEO_MAJOR;
+		info->u.dev.minor = pdev->vdev->minor;
+		strncpy (info->u.dev.name, pdev->vdev->name,
+			sizeof info->u.dev.name);
+		unlock_kernel ();
+
+		return sizeof *info;
+		}
+
+	default:
+		return -ENOSYS;
+	}
+}
 
 /* *grunt* We have to do atoi ourselves :-( */
 static int pwc_atoi(char *s)
