diff -ruN linux-2.4.12-orig/drivers/block/rd.c linux-2.4.12/drivers/block/rd.c
--- linux-2.4.12-orig/drivers/block/rd.c	Mon Oct  8 14:25:14 2001
+++ linux-2.4.12/drivers/block/rd.c	Thu Oct 11 13:10:10 2001
@@ -826,11 +826,29 @@
 int swim3_fd_eject(int devnum);
 #endif
 
+#ifdef CONFIG_USB_STORAGE
+static void __init wait_for_usb_root_floppy(void)
+{
+	extern int blkdev_ops_exist(unsigned int);
+	long t;
+
+	while (!blkdev_ops_exist(MAJOR(ROOT_DEV)))
+		schedule_timeout(HZ);
+	/* Extra timeout for remaining messages.  */
+	t = 5*HZ;
+	while (t > 0)
+		t = schedule_timeout(t);
+}
+#endif
+
 static void __init rd_load_disk(int n)
 {
 #ifdef CONFIG_BLK_DEV_INITRD
 	extern kdev_t real_root_dev;
 #endif
+#ifdef CONFIG_USB_STORAGE
+	extern int usb_root_floppy_p;
+#endif
 
 	if (rd_doload == 0)
 		return;
@@ -839,6 +857,9 @@
 #ifdef CONFIG_BLK_DEV_INITRD
 		&& MAJOR(real_root_dev) != FLOPPY_MAJOR
 #endif
+#ifdef CONFIG_USB_STORAGE
+		&& !usb_root_floppy_p
+#endif
 	)
 		return;
 
@@ -851,6 +872,10 @@
 			swim3_fd_eject(MINOR(ROOT_DEV));
 		else if(MAJOR(real_root_dev) == FLOPPY_MAJOR)
 			swim3_fd_eject(MINOR(real_root_dev));
+#endif
+#ifdef CONFIG_USB_STORAGE
+		if (usb_root_floppy_p)
+			wait_for_usb_root_floppy();
 #endif
 		printk(KERN_NOTICE
 		       "VFS: Insert root floppy disk to be loaded into RAM disk and press ENTER\n");
diff -ruN linux-2.4.12-orig/fs/block_dev.c linux-2.4.12/fs/block_dev.c
--- linux-2.4.12-orig/fs/block_dev.c	Wed Oct  3 12:16:42 2001
+++ linux-2.4.12/fs/block_dev.c	Thu Oct 11 13:10:10 2001
@@ -460,6 +460,14 @@
 	return ret;
 }
 
+int blkdev_ops_exist(unsigned int major)
+{
+	/* major 0 is used for non-device mounts */
+	if (major && major < MAX_BLKDEV)
+		return (blkdevs[major].bdops != 0);
+	return 0;
+}
+
 int register_blkdev(unsigned int major, const char * name, struct block_device_operations *bdops)
 {
 	if (major == 0) {
diff -ruN linux-2.4.12-orig/init/main.c linux-2.4.12/init/main.c
--- linux-2.4.12-orig/init/main.c	Sat Oct  6 11:49:16 2001
+++ linux-2.4.12/init/main.c	Thu Oct 11 13:10:10 2001
@@ -122,6 +122,10 @@
 kdev_t real_root_dev;
 #endif
 
+#ifdef CONFIG_USB_STORAGE
+int usb_root_floppy_p = 0;
+#endif
+
 int root_mountflags = MS_RDONLY;
 char *execute_command;
 char root_device_name[64];
@@ -307,6 +311,20 @@
 }
 
 __setup("root=", root_dev_setup);
+
+#ifdef CONFIG_USB_STORAGE
+
+static int __init usb_root_floppy_setup(char *line)
+{
+	extern int usb_root_floppy_p;
+	root_dev_setup (line);
+	usb_root_floppy_p = 1;
+	return 1;
+}
+
+__setup("usb_root_floppy=", usb_root_floppy_setup);
+
+#endif
 
 static int __init checksetup(char *line)
 {
