<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;"># This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher.
# This patch includes the following deltas:
#	           ChangeSet	1.584   -&gt; 1.585  
#	drivers/usb/net/usbnet.c	1.31    -&gt; 1.32   
#	drivers/usb/net/cdc-ether.c	1.19    -&gt; 1.20   
#	drivers/usb/net/catc.c	1.15    -&gt; 1.16   
#	drivers/usb/net/rtl8150.c	1.11    -&gt; 1.12   
#	drivers/usb/net/kaweth.c	1.27    -&gt; 1.28   
#	drivers/usb/net/pegasus.c	1.31    -&gt; 1.32   
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/09/16	greg@kroah.com	1.585
# USB: convert the drivers/usb/net files to the new USB driver model.
# 
# Note the cdc-ether.c driver does NOT work properly now, someone who 
# understands the interface mess in that driver needs to fix it up.
# --------------------------------------------
#
diff -Nru a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c
--- a/drivers/usb/net/catc.c	Mon Sep 16 15:00:21 2002
+++ b/drivers/usb/net/catc.c	Mon Sep 16 15:00:21 2002
@@ -761,28 +761,29 @@
  * USB probe, disconnect.
  */
 
-static void *catc_probe(struct usb_device *usbdev, unsigned int ifnum, const struct usb_device_id *id)
+static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id)
 {
+	struct usb_device *usbdev = interface_to_usbdev(intf);
 	struct net_device *netdev;
 	struct catc *catc;
 	u8 broadcast[6];
 	int i, pktsz;
 
-	if (usb_set_interface(usbdev, ifnum, 1)) {
+	if (usb_set_interface(usbdev, intf-&gt;altsetting-&gt;bInterfaceNumber, 1)) {
                 err("Can't set altsetting 1.");
-		return NULL;
+		return -EIO;
 	}
 
 	catc = kmalloc(sizeof(struct catc), GFP_KERNEL);
 	if (!catc)
-		return NULL;
+		return -ENOMEM;
 
 	memset(catc, 0, sizeof(struct catc));
 
 	netdev = init_etherdev(0, 0);
 	if (!netdev) {
 		kfree(catc);
-		return NULL;
+		return -EIO;
 	}
 
 	netdev-&gt;open = catc_open;
@@ -818,7 +819,7 @@
 		if (catc-&gt;irq_urb)  usb_free_urb(catc-&gt;irq_urb);
 		kfree(netdev);
 		kfree(catc);
-		return NULL;
+		return -ENOMEM;
 	}
 
 	/* The F5U011 has the same vendor/product as the netmate but a device version of 0x130 */
@@ -907,24 +908,29 @@
 		f5u011_rxmode(catc, catc-&gt;rxmode);
 	}
 	dbg("Init done.");
-	printk(KERN_INFO "%s: %s USB Ethernet at usb-%s-%s/%d, ",
+	printk(KERN_INFO "%s: %s USB Ethernet at usb-%s-%s, ",
 	       netdev-&gt;name, (catc-&gt;is_f5u011) ? "Belkin F5U011" : "CATC EL1210A NetMate",
-	       usbdev-&gt;bus-&gt;bus_name, usbdev-&gt;devpath, ifnum);
+	       usbdev-&gt;bus-&gt;bus_name, usbdev-&gt;devpath);
 	for (i = 0; i &lt; 5; i++) printk("%2.2x:", netdev-&gt;dev_addr[i]);
 	printk("%2.2x.\n", netdev-&gt;dev_addr[i]);
-	return catc;
+	dev_set_drvdata (&amp;intf-&gt;dev, catc);
+	return 0;
 }
 
-static void catc_disconnect(struct usb_device *usbdev, void *dev_ptr)
+static void catc_disconnect(struct usb_interface *intf)
 {
-	struct catc *catc = dev_ptr;
-	unregister_netdev(catc-&gt;netdev);
-	usb_free_urb(catc-&gt;ctrl_urb);
-	usb_free_urb(catc-&gt;tx_urb);
-	usb_free_urb(catc-&gt;rx_urb);
-	usb_free_urb(catc-&gt;irq_urb);
-	kfree(catc-&gt;netdev);
-	kfree(catc);
+	struct catc *catc = dev_get_drvdata (&amp;intf-&gt;dev);
+
+	dev_set_drvdata (&amp;intf-&gt;dev, NULL);
+	if (catc) {
+		unregister_netdev(catc-&gt;netdev);
+		usb_free_urb(catc-&gt;ctrl_urb);
+		usb_free_urb(catc-&gt;tx_urb);
+		usb_free_urb(catc-&gt;rx_urb);
+		usb_free_urb(catc-&gt;irq_urb);
+		kfree(catc-&gt;netdev);
+		kfree(catc);
+	}
 }
 
 /*
diff -Nru a/drivers/usb/net/cdc-ether.c b/drivers/usb/net/cdc-ether.c
--- a/drivers/usb/net/cdc-ether.c	Mon Sep 16 15:00:21 2002
+++ b/drivers/usb/net/cdc-ether.c	Mon Sep 16 15:00:21 2002
@@ -1123,9 +1123,10 @@
 // claims interfaces if they are for an Ethernet CDC /////////////////////////
 //////////////////////////////////////////////////////////////////////////////
 
-static void * CDCEther_probe( struct usb_device *usb, unsigned int ifnum,
-			     const struct usb_device_id *id)
+static int CDCEther_probe( struct usb_interface *intf,
+			   const struct usb_device_id *id)
 {
+	struct usb_device	*usb = interface_to_usbdev(intf);
 	struct net_device	*net;
 	ether_dev_t		*ether_dev;
 	int 			rc;
@@ -1135,7 +1136,7 @@
 	if ( check_for_claimed_interfaces( usb-&gt;actconfig ) ) {
 		// Someone has already put there grubby paws on this device.
 		// We don't want it now...
-		return NULL;
+		return -ENODEV;
 	}
 
 	// We might be finding a device we can use.
@@ -1144,7 +1145,7 @@
 	// we are going to need later.
 	if(!(ether_dev = kmalloc(sizeof(ether_dev_t), GFP_KERNEL))) {
 		err("out of memory allocating device structure");
-		return NULL;
+		return -ENOMEM;
 	}
 
 	// Zero everything out.
@@ -1153,20 +1154,20 @@
 	ether_dev-&gt;rx_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!ether_dev-&gt;rx_urb) {
 		kfree(ether_dev);
-		return NULL;
+		return -ENOMEM;
 	}
 	ether_dev-&gt;tx_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!ether_dev-&gt;tx_urb) {
 		usb_free_urb(ether_dev-&gt;rx_urb);
 		kfree(ether_dev);
-		return NULL;
+		return -ENOMEM;
 	}
 	ether_dev-&gt;intr_urb = usb_alloc_urb(0, GFP_KERNEL);
 	if (!ether_dev-&gt;intr_urb) {
 		usb_free_urb(ether_dev-&gt;tx_urb);
 		usb_free_urb(ether_dev-&gt;rx_urb);
 		kfree(ether_dev);
-		return NULL;
+		return -ENOMEM;
 	}
 
 	// Let's see if we can find a configuration we can use.
@@ -1261,8 +1262,12 @@
 	// TODO - last minute HACK
 	ether_dev-&gt;comm_ep_in = 5;
 
+/* FIXME!!! This driver needs to be fixed to work with the new USB interface logic
+ * this is not the correct thing to be doing here, we need to set the interface
+ * driver specific data field.
+ */
 	// Okay, we are finally done...
-	return NULL;
+	return 0;
 
 	// bailing out with our tail between our knees
 error_all:
@@ -1270,7 +1275,7 @@
 	usb_free_urb(ether_dev-&gt;rx_urb);
 	usb_free_urb(ether_dev-&gt;intr_urb);
 	kfree( ether_dev );
-	return	NULL;
+	return -EIO;
 }
 
 
@@ -1280,9 +1285,12 @@
 // (Whichever happens first assuming the driver suceeded at its probe) ///////
 //////////////////////////////////////////////////////////////////////////////
 
-static void CDCEther_disconnect( struct usb_device *usb, void *ptr )
+static void CDCEther_disconnect( struct usb_interface *intf )
 {
-	ether_dev_t *ether_dev = ptr;
+	ether_dev_t *ether_dev = dev_get_drvdata (&amp;intf-&gt;dev);
+	struct usb_device *usb;
+
+	dev_set_drvdata (&amp;intf-&gt;dev, NULL);
 
 	// Sanity check!!!
 	if ( !ether_dev || !ether_dev-&gt;usb ) {
@@ -1294,6 +1302,8 @@
 	// Make sure we fail the sanity check if we try this again.
 	ether_dev-&gt;usb = NULL;
 	
+	usb = interface_to_usbdev(intf);
+
 	// It is possible that this function is called before
 	// the "close" function.
 	// This tells the close function we are already disconnected
diff -Nru a/drivers/usb/net/kaweth.c b/drivers/usb/net/kaweth.c
--- a/drivers/usb/net/kaweth.c	Mon Sep 16 15:00:21 2002
+++ b/drivers/usb/net/kaweth.c	Mon Sep 16 15:00:21 2002
@@ -114,12 +114,11 @@
 MODULE_DESCRIPTION("KL5USB101 USB Ethernet driver");
 MODULE_LICENSE("GPL");
 
-static void *kaweth_probe(
-            struct usb_device *dev,             /* the device */
-            unsigned ifnum,                     /* what interface */
-            const struct usb_device_id *id      /* from id_table */
+static int kaweth_probe(
+		struct usb_interface *intf,
+		const struct usb_device_id *id	/* from id_table */
 	);
-static void kaweth_disconnect(struct usb_device *dev, void *ptr);
+static void kaweth_disconnect(struct usb_interface *intf);
 int kaweth_internal_control_msg(struct usb_device *usb_dev, unsigned int pipe,
 				struct usb_ctrlrequest *cmd, void *data,
 				int len, int timeout);
@@ -847,12 +846,12 @@
 /****************************************************************
  *     kaweth_probe
  ****************************************************************/
-static void *kaweth_probe(
-            struct usb_device *dev,             /* the device */
-            unsigned ifnum,                      /* what interface */
-            const struct usb_device_id *id      /* from id_table */
+static int kaweth_probe(
+		struct usb_interface *intf,
+		const struct usb_device_id *id      /* from id_table */
 	)
 {
+	struct usb_device *dev = interface_to_usbdev(intf);
 	struct kaweth_device *kaweth;
 	struct net_device *netdev;
 	const eth_addr_t bcast_addr = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
@@ -871,7 +870,7 @@
 		 (int)dev-&gt;descriptor.bDescriptorType);
 
 	if(!(kaweth = kmalloc(sizeof(struct kaweth_device), GFP_KERNEL)))
-		return NULL;
+		return -ENOMEM;
 
 	memset(kaweth, 0, sizeof(struct kaweth_device));
 
@@ -902,7 +901,7 @@
 			kaweth_err("Error downloading firmware (%d)", result);
 			free_page((unsigned long)kaweth-&gt;firmware_buf);
 			kfree(kaweth);
-			return NULL;
+			return -EIO;
 		}
 
 		if ((result = kaweth_download_firmware(kaweth,
@@ -913,7 +912,7 @@
 			kaweth_err("Error downloading firmware fix (%d)", result);
 			free_page((unsigned long)kaweth-&gt;firmware_buf);
 			kfree(kaweth);
-			return NULL;
+			return -EIO;
 		}
 
 		if ((result = kaweth_download_firmware(kaweth,
@@ -924,7 +923,7 @@
 			kaweth_err("Error downloading trigger code (%d)", result);
 			free_page((unsigned long)kaweth-&gt;firmware_buf);
 			kfree(kaweth);
-			return NULL;
+			return -EIO;
 		}
 
 		if ((result = kaweth_download_firmware(kaweth,
@@ -935,7 +934,7 @@
 			kaweth_err("Error downloading trigger code fix (%d)", result);
 			free_page((unsigned long)kaweth-&gt;firmware_buf);
 			kfree(kaweth);
-			return NULL;
+			return -EIO;
 		}
 
 
@@ -943,14 +942,14 @@
 			kaweth_err("Error triggering firmware (%d)", result);
 			free_page((unsigned long)kaweth-&gt;firmware_buf);
 			kfree(kaweth);
-			return NULL;
+			return -EIO;
 		}
 
 		/* Device will now disappear for a moment...  */
 		kaweth_info("Firmware loaded.  I'll be back...");
 		free_page((unsigned long)kaweth-&gt;firmware_buf);
 		kfree(kaweth);
-		return NULL;
+		return -EIO;
 	}
 
 	result = kaweth_read_configuration(kaweth);
@@ -958,7 +957,7 @@
 	if(result &lt; 0) {
 		kaweth_err("Error reading configuration (%d), no net device created", result);
 		kfree(kaweth);
-		return NULL;
+		return -EIO;
 	}
 
 	kaweth_info("Statistics collection: %x", kaweth-&gt;configuration.statistics_mask);
@@ -977,17 +976,17 @@
 		   sizeof(bcast_addr))) {
 		kaweth_err("Firmware not functioning properly, no net device created");
 		kfree(kaweth);
-		return NULL;
+		return -EIO;
 	}
 
 	if(kaweth_set_urb_size(kaweth, KAWETH_BUF_SIZE) &lt; 0) {
 		kaweth_dbg("Error setting URB size");
-		return kaweth;
+		goto err_no_netdev;
 	}
 
 	if(kaweth_set_sofs_wait(kaweth, KAWETH_SOFS_TO_WAIT) &lt; 0) {
 		kaweth_err("Error setting SOFS wait");
-		return kaweth;
+		goto err_no_netdev;
 	}
 
 	result = kaweth_set_receive_filter(kaweth,
@@ -998,14 +997,14 @@
 	if(result &lt; 0) {
 		kaweth_err("Error setting receive filter");
 		kfree(kaweth);
-		return NULL;
+		return -EIO;
 	}
 
 	kaweth_dbg("Initializing net device.");
 
 	if(!(netdev = kmalloc(sizeof(struct net_device), GFP_KERNEL))) {
 		kfree(kaweth);
-		return NULL;
+		return -ENOMEM;
 	}
 
 	kaweth-&gt;tx_urb = usb_alloc_urb(0, GFP_KERNEL);
@@ -1050,27 +1049,30 @@
 
 	kaweth_dbg("Kaweth probe returning.");
 
-	return kaweth;
+	dev_set_drvdata (&amp;intf-&gt;dev, kaweth);
+	return 0;
 
 err_tx_and_rx:
 	usb_free_urb(kaweth-&gt;rx_urb);
 err_only_tx:
 	usb_free_urb(kaweth-&gt;tx_urb);
 err_no_urb:
-	kfree(kaweth);
 	kfree(netdev);
-	return NULL;
+err_no_netdev:
+	kfree(kaweth);
+	return -EIO;
 }
 
 /****************************************************************
  *     kaweth_disconnect
  ****************************************************************/
-static void kaweth_disconnect(struct usb_device *dev, void *ptr)
+static void kaweth_disconnect(struct usb_interface *intf)
 {
-	struct kaweth_device *kaweth = ptr;
+	struct kaweth_device *kaweth = dev_get_drvdata (&amp;intf-&gt;dev);
 
 	kaweth_info("Unregistering");
 
+	dev_set_drvdata (&amp;intf-&gt;dev, NULL);
 	if (!kaweth) {
 		kaweth_warn("unregistering non-existant device");
 		return;
diff -Nru a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c
--- a/drivers/usb/net/pegasus.c	Mon Sep 16 15:00:21 2002
+++ b/drivers/usb/net/pegasus.c	Mon Sep 16 15:00:21 2002
@@ -1045,20 +1045,21 @@
 		set_register(pegasus, Reg81, 2);
 }
 
-static void *pegasus_probe(struct usb_device *dev, unsigned int ifnum,
-			   const struct usb_device_id *id)
+static int pegasus_probe(struct usb_interface *intf,
+			 const struct usb_device_id *id)
 {
+	struct usb_device *dev = interface_to_usbdev(intf);
 	struct net_device *net;
 	pegasus_t *pegasus;
 	int dev_index = id - pegasus_ids;
 
 	if (usb_set_configuration(dev, dev-&gt;config[0].bConfigurationValue)) {
 		err("usb_set_configuration() failed");
-		return NULL;
+		return -ENODEV;
 	}
 	if (!(pegasus = kmalloc(sizeof(struct pegasus), GFP_KERNEL))) {
 		err("out of memory allocating device structure");
-		return NULL;
+		return -ENOMEM;
 	}
 
 	usb_get_dev(dev);
@@ -1068,14 +1069,14 @@
 
 	if (!alloc_urbs(pegasus)) {
 		kfree(pegasus);
-		return NULL;
+		return -ENOMEM;
 	}
 
 	net = init_etherdev(NULL, 0);
 	if (!net) {
 		free_all_urbs(pegasus);
 		kfree(pegasus);
-		return NULL;
+		return -ENODEV;
 	}
 
 	init_MUTEX(&amp;pegasus-&gt;sem);
@@ -1122,13 +1123,18 @@
 	}
 exit:
 	up(&amp;pegasus-&gt;sem);
-	return pegasus;
+	if (pegasus) {
+		dev_set_drvdata (&amp;intf-&gt;dev, pegasus);
+		return 0;
+	}
+	return -EIO;
 }
 
-static void pegasus_disconnect(struct usb_device *dev, void *ptr)
+static void pegasus_disconnect(struct usb_interface *intf)
 {
-	struct pegasus *pegasus = ptr;
+	struct pegasus *pegasus = dev_get_drvdata (&amp;intf-&gt;dev);
 
+	dev_set_drvdata (&amp;intf-&gt;dev, NULL);
 	if (!pegasus) {
 		warn("unregistering non-existant device");
 		return;
@@ -1136,7 +1142,7 @@
 
 	pegasus-&gt;flags |= PEGASUS_UNPLUG;
 	unregister_netdev(pegasus-&gt;net);
-	usb_put_dev(dev);
+	usb_put_dev(interface_to_usbdev(intf));
 	unlink_all_urbs(pegasus);
 	free_all_urbs(pegasus);
 	free_skb_pool(pegasus);
diff -Nru a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c
--- a/drivers/usb/net/rtl8150.c	Mon Sep 16 15:00:21 2002
+++ b/drivers/usb/net/rtl8150.c	Mon Sep 16 15:00:21 2002
@@ -109,9 +109,9 @@
 static void fill_skb_pool(rtl8150_t *);
 static void free_skb_pool(rtl8150_t *);
 static inline struct sk_buff *pull_skb(rtl8150_t *);
-static void rtl8150_disconnect(struct usb_device *dev, void *ptr);
-static void *rtl8150_probe(struct usb_device *dev, unsigned int ifnum,
-			   const struct usb_device_id *id);
+static void rtl8150_disconnect(struct usb_interface *intf);
+static int rtl8150_probe(struct usb_interface *intf,
+			 const struct usb_device_id *id);
 
 static struct usb_driver rtl8150_driver = {
 	.name =		"rtl8150",
@@ -723,20 +723,21 @@
 	return res;
 }
 
-static void *rtl8150_probe(struct usb_device *udev, unsigned int ifnum,
-			   const struct usb_device_id *id)
+static int rtl8150_probe(struct usb_interface *intf,
+			 const struct usb_device_id *id)
 {
+	struct usb_device *udev = interface_to_usbdev(intf);
 	rtl8150_t *dev;
 	struct net_device *netdev;
 
 	if (usb_set_configuration(udev, udev-&gt;config[0].bConfigurationValue)) {
 		err("usb_set_configuration() failed");
-		return NULL;
+		return -EIO;
 	}
 	dev = kmalloc(sizeof(rtl8150_t), GFP_KERNEL);
 	if (!dev) {
 		err("Out of memory");
-		return NULL;
+		return -ENOMEM;
 	} else
 		memset(dev, 0, sizeof(rtl8150_t));
 
@@ -744,7 +745,7 @@
 	if (!netdev) {
 		kfree(dev);
 		err("Oh boy, out of memory again?!?");
-		return NULL;
+		return -ENOMEM;
 	}
 
 	init_MUTEX(&amp;dev-&gt;sem);
@@ -781,31 +782,35 @@
 	info("%s: rtl8150 is detected", netdev-&gt;name);
 	
 	up(&amp;dev-&gt;sem);
-	return dev;
+	dev_set_drvdata (&amp;intf-&gt;dev, dev);
+	return 0;
 err:
 	unregister_netdev(dev-&gt;netdev);
 	up(&amp;dev-&gt;sem);
 	kfree(netdev);
 	kfree(dev);
-	return NULL;
+	return -EIO;
 }
 
-static void rtl8150_disconnect(struct usb_device *udev, void *ptr)
+static void rtl8150_disconnect(struct usb_interface *intf)
 {
-	rtl8150_t *dev;
+	rtl8150_t *dev = dev_get_drvdata (&amp;intf-&gt;dev);
 
-	dev = ptr;
-	set_bit(RTL8150_UNPLUG, &amp;dev-&gt;flags);
-	unregister_netdev(dev-&gt;netdev);
-	unlink_all_urbs(dev);
-	free_all_urbs(dev);
-	free_skb_pool(dev);
-	if (dev-&gt;rx_skb)
-		dev_kfree_skb(dev-&gt;rx_skb);
-	kfree(dev-&gt;netdev);
-	kfree(dev);
-	dev-&gt;netdev = NULL;
-	dev = NULL;
+	dev_set_drvdata (&amp;intf-&gt;dev, NULL);
+
+	if (dev) {
+		set_bit(RTL8150_UNPLUG, &amp;dev-&gt;flags);
+		unregister_netdev(dev-&gt;netdev);
+		unlink_all_urbs(dev);
+		free_all_urbs(dev);
+		free_skb_pool(dev);
+		if (dev-&gt;rx_skb)
+			dev_kfree_skb(dev-&gt;rx_skb);
+		kfree(dev-&gt;netdev);
+		kfree(dev);
+		dev-&gt;netdev = NULL;
+		dev = NULL;
+	}
 }
 
 int __init usb_rtl8150_init(void)
diff -Nru a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c
--- a/drivers/usb/net/usbnet.c	Mon Sep 16 15:00:21 2002
+++ b/drivers/usb/net/usbnet.c	Mon Sep 16 15:00:21 2002
@@ -1941,12 +1941,20 @@
  
 // precondition: never called in_interrupt
 
-static void usbnet_disconnect (struct usb_device *udev, void *ptr)
+static void usbnet_disconnect (struct usb_interface *intf)
 {
-	struct usbnet	*dev = (struct usbnet *) ptr;
+	struct usbnet		*dev;
+	struct usb_device	*xdev;
+
+	dev = dev_get_drvdata (&amp;intf-&gt;dev);
+	dev_set_drvdata (&amp;intf-&gt;dev, NULL);
+	if (!dev)
+		return;
+
+	xdev = interface_to_usbdev (intf);
 
 	devinfo (dev, "unregister usbnet usb-%s-%s, %s",
-		udev-&gt;bus-&gt;bus_name, udev-&gt;devpath,
+		xdev-&gt;bus-&gt;bus_name, xdev-&gt;devpath,
 		dev-&gt;driver_info-&gt;description);
 	
 	unregister_netdev (&amp;dev-&gt;net);
@@ -1960,7 +1968,7 @@
 	flush_scheduled_tasks ();
 
 	kfree (dev);
-	usb_put_dev (udev);
+	usb_put_dev (xdev);
 }
 
 
@@ -1968,46 +1976,38 @@
 
 // precondition: never called in_interrupt
 
-static void *
-usbnet_probe (struct usb_device *udev, unsigned ifnum,
-			const struct usb_device_id *prod)
+int
+usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
 {
 	struct usbnet			*dev;
 	struct net_device 		*net;
 	struct usb_interface_descriptor	*interface;
 	struct driver_info		*info;
-	int				altnum = 0;
+	struct usb_device		*xdev;
 
 	info = (struct driver_info *) prod-&gt;driver_info;
 
-	// sanity check; expect dedicated interface/devices for now.
-	interface = &amp;udev-&gt;actconfig-&gt;interface [ifnum].altsetting [altnum];
-	if (udev-&gt;descriptor.bNumConfigurations != 1
-			|| udev-&gt;config[0].bNumInterfaces != 1
-//			|| interface-&gt;bInterfaceClass != USB_CLASS_VENDOR_SPEC
-			) {
-		dbg ("Bogus config info");
-		return 0;
-	}
+	xdev = interface_to_usbdev (udev);
+	interface = &amp;udev-&gt;altsetting [udev-&gt;act_altsetting];
 
-	// more sanity (unless the device is broken)
 	if (!(info-&gt;flags &amp; FLAG_NO_SETINT)) {
-		if (usb_set_interface (udev, ifnum, altnum) &lt; 0) {
+		if (usb_set_interface (xdev, interface-&gt;bInterfaceNumber,
+				interface-&gt;bAlternateSetting) &lt; 0) {
 			err ("set_interface failed");
-			return 0;
+			return -EIO;
 		}
 	}
 
 	// set up our own records
 	if (!(dev = kmalloc (sizeof *dev, GFP_KERNEL))) {
 		dbg ("can't kmalloc dev");
-		return 0;
+		return -ENOMEM;
 	}
 	memset (dev, 0, sizeof *dev);
 
 	init_MUTEX_LOCKED (&amp;dev-&gt;mutex);
-	usb_get_dev (udev);
-	dev-&gt;udev = udev;
+	usb_get_dev (xdev);
+	dev-&gt;udev = xdev;
 	dev-&gt;driver_info = info;
 	dev-&gt;msg_level = msg_level;
 	INIT_LIST_HEAD (&amp;dev-&gt;dev_list);
@@ -2040,10 +2040,11 @@
 
 	register_netdev (&amp;dev-&gt;net);
 	devinfo (dev, "register usbnet usb-%s-%s, %s",
-		udev-&gt;bus-&gt;bus_name, udev-&gt;devpath,
+		xdev-&gt;bus-&gt;bus_name, xdev-&gt;devpath,
 		dev-&gt;driver_info-&gt;description);
 
 	// ok, it's ready to go.
+	dev_set_drvdata (&amp;udev-&gt;dev, net);
 	mutex_lock (&amp;usbnet_mutex);
 	list_add (&amp;dev-&gt;dev_list, &amp;usbnet_list);
 	mutex_unlock (&amp;dev-&gt;mutex);
@@ -2052,7 +2053,7 @@
 	netif_device_attach (&amp;dev-&gt;net);
 
 	mutex_unlock (&amp;usbnet_mutex);
-	return dev;
+	return 0;
 }
 
 
</pre></body></html>