From: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>

Please add this patch to -mm and remove modular-ide-is-broken.patch.

- IDE can be used as module again (compiles and works), this fixes
  bugzilla bugs #576 and #1700

- separate module for probing is no longer required

- generic/default host driver is available as ide_generic module



---

 /dev/null                   |    6 -----
 drivers/block/ll_rw_blk.c   |    2 +
 drivers/ide/Kconfig         |    6 +++++
 drivers/ide/Makefile        |   39 +++++++++++++++++++++++++----------
 drivers/ide/ide-generic.c   |   36 ++++++++++++++++++++++++++++++++
 drivers/ide/ide-probe.c     |   25 +---------------------
 drivers/ide/ide.c           |   49 +++++---------------------------------------
 drivers/ide/legacy/Makefile |    8 -------
 drivers/ide/pci/Makefile    |    1 
 include/linux/ide.h         |    1 
 10 files changed, 80 insertions(+), 93 deletions(-)

diff -puN drivers/block/ll_rw_blk.c~fix-improve-modular-ide drivers/block/ll_rw_blk.c
--- 25/drivers/block/ll_rw_blk.c~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/drivers/block/ll_rw_blk.c	2004-01-19 13:39:35.000000000 -0800
@@ -146,6 +146,8 @@ void blk_queue_activity_fn(request_queue
 	q->activity_data = data;
 }
 
+EXPORT_SYMBOL(blk_queue_activity_fn);
+
 /**
  * blk_queue_prep_rq - set a prepare_request function for queue
  * @q:		queue
diff -puN drivers/ide/ide.c~fix-improve-modular-ide drivers/ide/ide.c
--- 25/drivers/ide/ide.c~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/drivers/ide/ide.c	2004-01-19 13:39:35.000000000 -0800
@@ -153,7 +153,6 @@
 #include <linux/cdrom.h>
 #include <linux/seq_file.h>
 #include <linux/device.h>
-#include <linux/kmod.h>
 
 #include <asm/byteorder.h>
 #include <asm/irq.h>
@@ -191,8 +190,6 @@ int noautodma = 1;
 EXPORT_SYMBOL(noautodma);
 EXPORT_SYMBOL(ide_bus_type);
 
-int (*ide_probe)(void);
-
 /*
  * This is declared extern in ide.h, for access by other IDE modules:
  */
@@ -443,21 +440,6 @@ u8 ide_dump_status (ide_drive_t *drive, 
 
 EXPORT_SYMBOL(ide_dump_status);
 
-
-
-void ide_probe_module (void)
-{
-	if (!ide_probe) {
-#if defined(CONFIG_KMOD) && defined(CONFIG_BLK_DEV_IDE_MODULE)
-		(void) request_module("ide-probe-mod");
-#endif /* (CONFIG_KMOD) && (CONFIG_BLK_DEV_IDE_MODULE) */
-	} else {
-		(void)ide_probe();
-	}
-}
-
-EXPORT_SYMBOL(ide_probe_module);
-
 static int ide_open (struct inode * inode, struct file * filp)
 {
 	return -ENXIO;
@@ -1033,7 +1015,7 @@ found:
 	hwif->chipset = hw->chipset;
 
 	if (!initializing) {
-		ide_probe_module();
+		probe_hwif_init(hwif);
 #ifdef CONFIG_PROC_FS
 		create_proc_ide_interfaces();
 #endif
@@ -2276,28 +2258,6 @@ static void __init probe_for_hwifs (void
 #endif /* CONFIG_BLK_DEV_IDEPNP */
 }
 
-void __init ide_init_builtin_drivers (void)
-{
-	/*
-	 * Probe for special PCI and other "known" interface chipsets
-	 */
-	probe_for_hwifs ();
-
-#ifdef CONFIG_BLK_DEV_IDE
-	if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
-		ide_get_lock(NULL, NULL); /* for atari only */
-
-	(void) ideprobe_init();
-
-	if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
-		ide_release_lock();	/* for atari only */
-#endif /* CONFIG_BLK_DEV_IDE */
-
-#ifdef CONFIG_PROC_FS
-	proc_ide_create();
-#endif
-}
-
 /*
  *	Actually unregister the subdriver. Called with the
  *	request lock dropped.
@@ -2558,7 +2518,6 @@ EXPORT_SYMBOL(ide_fops);
  */
 
 EXPORT_SYMBOL(ide_lock);
-EXPORT_SYMBOL(ide_probe);
 
 struct bus_type ide_bus_type = {
 	.name		= "ide",
@@ -2601,9 +2560,13 @@ int __init ide_init (void)
 #endif
 
 	initializing = 1;
-	ide_init_builtin_drivers();
+	/* Probe for special PCI and other "known" interface chipsets. */
+	probe_for_hwifs();
 	initializing = 0;
 
+#ifdef CONFIG_PROC_FS
+	proc_ide_create();
+#endif
 	return 0;
 }
 
diff -puN /dev/null drivers/ide/ide-generic.c
--- /dev/null	2002-08-30 16:31:37.000000000 -0700
+++ 25-akpm/drivers/ide/ide-generic.c	2004-01-19 13:39:35.000000000 -0800
@@ -0,0 +1,36 @@
+/*
+ * generic/default IDE host driver
+ *
+ * Copyright (C) 2004 Bartlomiej Zolnierkiewicz
+ */
+
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/ide.h>
+
+static int __init ide_generic_init(void)
+{
+	MOD_INC_USE_COUNT;
+	if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
+		ide_get_lock(NULL, NULL); /* for atari only */
+
+	(void)ideprobe_init();
+
+	if (ide_hwifs[0].io_ports[IDE_DATA_OFFSET])
+		ide_release_lock();	/* for atari only */
+
+#ifdef CONFIG_PROC_FS
+	create_proc_ide_interfaces();
+#endif
+	return 0;
+}
+
+static void __exit ide_generic_exit(void)
+{
+}
+
+module_init(ide_generic_init);
+module_exit(ide_generic_exit);
+
+MODULE_LICENSE("GPL");
diff -puN drivers/ide/ide-probe.c~fix-improve-modular-ide drivers/ide/ide-probe.c
--- 25/drivers/ide/ide-probe.c~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/drivers/ide/ide-probe.c	2004-01-19 13:39:35.000000000 -0800
@@ -1322,8 +1322,7 @@ int ideprobe_init (void)
 {
 	unsigned int index;
 	int probe[MAX_HWIFS];
-	
-	MOD_INC_USE_COUNT;
+
 	memset(probe, 0, MAX_HWIFS * sizeof(int));
 	for (index = 0; index < MAX_HWIFS; ++index)
 		probe[index] = !ide_hwifs[index].present;
@@ -1350,27 +1349,7 @@ int ideprobe_init (void)
 					ata_attach(&hwif->drives[unit]);
 		}
 	}
-	if (!ide_probe)
-		ide_probe = &ideprobe_init;
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
-#ifdef MODULE
-int init_module (void)
-{
-	unsigned int index;
-	
-	for (index = 0; index < MAX_HWIFS; ++index)
-		ide_unregister(index);
-	ideprobe_init();
-	create_proc_ide_interfaces();
-	return 0;
-}
-
-void cleanup_module (void)
-{
-	ide_probe = NULL;
-}
-MODULE_LICENSE("GPL");
-#endif /* MODULE */
+EXPORT_SYMBOL_GPL(ideprobe_init);
diff -puN drivers/ide/Kconfig~fix-improve-modular-ide drivers/ide/Kconfig
--- 25/drivers/ide/Kconfig~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/drivers/ide/Kconfig	2004-01-19 13:39:35.000000000 -0800
@@ -296,6 +296,12 @@ config IDE_TASKFILE_IO
 
 comment "IDE chipset support/bugfixes"
 
+config IDE_GENERIC
+	tristate "generic/default IDE chipset support"
+	default y
+	help
+	  If unsure, say Y.
+
 config BLK_DEV_CMD640
 	bool "CMD640 chipset bugfix/support"
 	depends on X86
diff -puN drivers/ide/legacy/Makefile~fix-improve-modular-ide drivers/ide/legacy/Makefile
--- 25/drivers/ide/legacy/Makefile~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/drivers/ide/legacy/Makefile	2004-01-19 13:39:35.000000000 -0800
@@ -2,17 +2,9 @@
 obj-$(CONFIG_BLK_DEV_ALI14XX)		+= ali14xx.o
 obj-$(CONFIG_BLK_DEV_DTC2278)		+= dtc2278.o
 obj-$(CONFIG_BLK_DEV_HT6560B)		+= ht6560b.o
-obj-$(CONFIG_BLK_DEV_IDE_PC9800)	+= pc9800.o
-obj-$(CONFIG_BLK_DEV_PDC4030)		+= pdc4030.o
 obj-$(CONFIG_BLK_DEV_QD65XX)		+= qd65xx.o
 obj-$(CONFIG_BLK_DEV_UMC8672)		+= umc8672.o
 
-obj-$(CONFIG_BLK_DEV_BUDDHA)		+= buddha.o
-obj-$(CONFIG_BLK_DEV_FALCON_IDE)	+= falconide.o
-obj-$(CONFIG_BLK_DEV_GAYLE)		+= gayle.o
-obj-$(CONFIG_BLK_DEV_MAC_IDE)		+= macide.o
-obj-$(CONFIG_BLK_DEV_Q40IDE)		+= q40ide.o
-
 obj-$(CONFIG_BLK_DEV_IDECS)		+= ide-cs.o
 
 # Last of all
diff -puN drivers/ide/Makefile~fix-improve-modular-ide drivers/ide/Makefile
--- 25/drivers/ide/Makefile~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/drivers/ide/Makefile	2004-01-19 13:39:35.000000000 -0800
@@ -10,22 +10,39 @@
 # First come modules that register themselves with the core
 obj-$(CONFIG_BLK_DEV_IDE)		+= pci/
 
+ide-core-y += ide.o ide-default.o ide-io.o ide-iops.o ide-lib.o ide-probe.o \
+	ide-taskfile.o
+
+ide-core-$(CONFIG_BLK_DEV_CMD640)	+= pci/cmd640.o
+
 # Core IDE code - must come before legacy
+ide-core-$(CONFIG_BLK_DEV_IDEPCI)	+= setup-pci.o
+ide-core-$(CONFIG_BLK_DEV_IDEDMA_PCI)	+= ide-dma.o
+ide-core-$(CONFIG_BLK_DEV_IDE_TCQ)	+= ide-tcq.o
+ide-core-$(CONFIG_PROC_FS)		+= ide-proc.o
+ide-core-$(CONFIG_BLK_DEV_IDEPNP)	+= ide-pnp.o
+
+# built-in only drivers from legacy/
+ide-core-$(CONFIG_BLK_DEV_IDE_PC9800)	+= pc9800.o
+ide-core-$(CONFIG_BLK_DEV_PDC4030)	+= pdc4030.o
+ide-core-$(CONFIG_BLK_DEV_BUDDHA)	+= buddha.o
+ide-core-$(CONFIG_BLK_DEV_FALCON_IDE)	+= falconide.o
+ide-core-$(CONFIG_BLK_DEV_GAYLE)	+= gayle.o
+ide-core-$(CONFIG_BLK_DEV_MAC_IDE)	+= macide.o
+ide-core-$(CONFIG_BLK_DEV_Q40IDE)	+= q40ide.o
+
+# built-in only drivers from ppc/
+ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE)	+= mpc8xx.o
+ide-core-$(CONFIG_BLK_DEV_IDE_PMAC)	+= pmac.o
+ide-core-$(CONFIG_BLK_DEV_IDE_SWARM)	+= swarm.o
+
+obj-$(CONFIG_BLK_DEV_IDE)		+= ide-core.o
+obj-$(CONFIG_IDE_GENERIC)		+= ide-generic.o
 
-obj-$(CONFIG_BLK_DEV_IDE)		+= ide-io.o ide-probe.o ide-iops.o ide-taskfile.o ide.o ide-lib.o ide-default.o
 obj-$(CONFIG_BLK_DEV_IDEDISK)		+= ide-disk.o
 obj-$(CONFIG_BLK_DEV_IDECD)		+= ide-cd.o
 obj-$(CONFIG_BLK_DEV_IDETAPE)		+= ide-tape.o
 obj-$(CONFIG_BLK_DEV_IDEFLOPPY)		+= ide-floppy.o
 
-obj-$(CONFIG_BLK_DEV_IDEPCI)		+= setup-pci.o
-obj-$(CONFIG_BLK_DEV_IDEDMA_PCI)	+= ide-dma.o
-obj-$(CONFIG_BLK_DEV_IDE_TCQ)		+= ide-tcq.o
-obj-$(CONFIG_BLK_DEV_IDEPNP)		+= ide-pnp.o
-
-ifeq ($(CONFIG_BLK_DEV_IDE),y)
-obj-$(CONFIG_PROC_FS)			+= ide-proc.o
-endif
-
-obj-$(CONFIG_BLK_DEV_IDE)		+= legacy/ ppc/ arm/
+obj-$(CONFIG_BLK_DEV_IDE)		+= legacy/ arm/
 obj-$(CONFIG_BLK_DEV_HD)		+= legacy/
diff -puN drivers/ide/pci/Makefile~fix-improve-modular-ide drivers/ide/pci/Makefile
--- 25/drivers/ide/pci/Makefile~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/drivers/ide/pci/Makefile	2004-01-19 13:39:35.000000000 -0800
@@ -3,7 +3,6 @@ obj-$(CONFIG_BLK_DEV_ADMA100)		+= adma10
 obj-$(CONFIG_BLK_DEV_AEC62XX)		+= aec62xx.o
 obj-$(CONFIG_BLK_DEV_ALI15X3)		+= alim15x3.o
 obj-$(CONFIG_BLK_DEV_AMD74XX)		+= amd74xx.o
-obj-$(CONFIG_BLK_DEV_CMD640)		+= cmd640.o
 obj-$(CONFIG_BLK_DEV_CMD64X)		+= cmd64x.o
 obj-$(CONFIG_BLK_DEV_CS5520)		+= cs5520.o
 obj-$(CONFIG_BLK_DEV_CS5530)		+= cs5530.o
diff -puN -L drivers/ide/ppc/Makefile drivers/ide/ppc/Makefile~fix-improve-modular-ide /dev/null
--- 25/drivers/ide/ppc/Makefile
+++ /dev/null	2002-08-30 16:31:37.000000000 -0700
@@ -1,6 +0,0 @@
-
-obj-$(CONFIG_BLK_DEV_MPC8xx_IDE)	+= mpc8xx.o
-obj-$(CONFIG_BLK_DEV_IDE_PMAC)		+= pmac.o
-obj-$(CONFIG_BLK_DEV_IDE_SWARM)		+= swarm.o
-
-EXTRA_CFLAGS	:= -Idrivers/ide
diff -puN include/linux/ide.h~fix-improve-modular-ide include/linux/ide.h
--- 25/include/linux/ide.h~fix-improve-modular-ide	2004-01-19 13:39:35.000000000 -0800
+++ 25-akpm/include/linux/ide.h	2004-01-19 13:39:35.000000000 -0800
@@ -1231,7 +1231,6 @@ typedef struct ide_devices_s {
  */
 #ifndef _IDE_C
 extern	ide_hwif_t	ide_hwifs[];		/* master data repository */
-extern int (*ide_probe)(void);
 
 extern ide_devices_t   *idedisk;
 extern ide_devices_t   *idecd;

_