--- linux-2.5.45/drivers/usb/media/vicam.c.orig	2002-10-31 07:29:07.000000000 -0800
+++ linux-2.5.45/drivers/usb/media/vicam.c	2002-10-31 07:30:13.000000000 -0800
@@ -761,23 +761,19 @@
 		return -EBUSY;
 	}
 
+	cam->raw_image = kmalloc(VICAM_MAX_READ_SIZE, GFP_KERNEL);
 	if (!cam->raw_image) {
-		cam->raw_image = kmalloc(VICAM_MAX_READ_SIZE, GFP_KERNEL);
-		if (!cam->raw_image) {
-			up(&cam->busy_lock);
-			return -ENOMEM;
-		}
+		up(&cam->busy_lock);
+		return -ENOMEM;
 	}
 
+	cam->framebuf = rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
 	if (!cam->framebuf) {
-		cam->framebuf =
-		    rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
-		if (!cam->framebuf) {
-			kfree(cam->raw_image);
-			up(&cam->busy_lock);
-			return -ENOMEM;
-		}
+		kfree(cam->raw_image);
+		up(&cam->busy_lock);
+		return -ENOMEM;
 	}
+
 	// First upload firmware, then turn the camera on
 
 	if (!cam->is_initialized) {
@@ -805,6 +801,9 @@
 	DBG("close\n");
 	set_camera_power(cam, 0);
 
+	kfree(cam->raw_image);
+	rvfree(cam->framebuf, VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
+
 	cam->open_count--;
 
 	return 0;
@@ -989,6 +988,7 @@
 
 	if (*ppos >= VICAM_MAX_FRAME_SIZE) {
 		*ppos = 0;
+		up(&cam->busy_lock);
 		return 0;
 	}
 
@@ -1038,15 +1038,6 @@
 	if (down_interruptible(&cam->busy_lock))
 		return -EINTR;
 
-	if (!cam->framebuf) {	/* we do lazy allocation */
-		cam->framebuf =
-		    rvmalloc(VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
-		if (!cam->framebuf) {
-			up(&cam->busy_lock);
-			return -ENOMEM;
-		}
-	}
-
 	pos = (unsigned long)cam->framebuf;
 	while (size > 0) {
 		page = kvirt_to_pa(pos);
@@ -1319,7 +1310,6 @@
 	struct vicam_camera *cam = dev_get_drvdata(&intf->dev);
 
 	dev_set_drvdata ( &intf->dev, NULL );
-	usb_put_dev(cam->udev);
 	
 	cam->udev = NULL;
 	
@@ -1329,12 +1319,6 @@
 	vicam_destroy_proc_entry(cam);
 #endif
 
-	if (cam->raw_image)
-		kfree(cam->raw_image);
-	if (cam->framebuf)
-		rvfree(cam->framebuf,
-		       VICAM_MAX_FRAME_SIZE * VICAM_FRAMES);
-
 	kfree(cam);
 
 	printk(KERN_DEBUG "ViCam-based WebCam disconnected\n");
