--- usb.c-dist	Tue May 14 09:44:40 2002
+++ usb.c	Tue May 14 09:56:24 2002
@@ -1004,10 +1004,7 @@
 void usb_free_dev(struct usb_device *dev)
 {
 	if (atomic_dec_and_test(&dev->refcnt)) {
-		if (dev->bus->op->deallocate)
-			dev->bus->op->deallocate(dev);
 		usb_destroy_configuration (dev);
-		usb_bus_put (dev->bus);
 		kfree (dev);
 	}
 }
@@ -1942,6 +1939,10 @@
 			usb_disconnect(child);
 	}
 
+	/* ...and all other hardware-coupled resources */
+	if (dev->bus->op->deallocate)
+		dev->bus->op->deallocate(dev);
+
 	/* Let policy agent unload modules etc */
 	call_policy ("remove", dev);
 
@@ -1951,6 +1952,8 @@
 		usbfs_remove_device(dev);
 		put_device(&dev->dev);
 	}
+	usb_bus_put (dev->bus);
+	dev->bus = 0;
 
 	/* Decrement the reference count, it'll auto free everything when */
 	/* it hits 0 which could very well be now */
