Hi,
Please add this patch to -mm and remove modular-ide-is-broken.patch.
Thanks,
--bart
- 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
linux-2.6.1-root/drivers/block/ll_rw_blk.c | 2 +
linux-2.6.1-root/drivers/ide/Kconfig | 6 +++
linux-2.6.1-root/drivers/ide/Makefile | 39 +++++++++++++++------
linux-2.6.1-root/drivers/ide/ide-generic.c | 36 +++++++++++++++++++
linux-2.6.1-root/drivers/ide/ide-probe.c | 25 +------------
linux-2.6.1-root/drivers/ide/ide.c | 49 +++------------------------
linux-2.6.1-root/drivers/ide/legacy/Makefile | 8 ----
linux-2.6.1-root/drivers/ide/pci/Makefile | 1
linux-2.6.1-root/include/linux/ide.h | 1
linux-2.6.1/drivers/ide/ppc/Makefile | 6 ---
10 files changed, 80 insertions(+), 93 deletions(-)
diff -puN drivers/block/ll_rw_blk.c~modular-ide-fix drivers/block/ll_rw_blk.c
--- linux-2.6.1/drivers/block/ll_rw_blk.c~modular-ide-fix 2004-01-18 20:45:38.984746320 +0100
+++ linux-2.6.1-root/drivers/block/ll_rw_blk.c 2004-01-18 20:45:39.026739936 +0100
@@ -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/Makefile~modular-ide-fix drivers/ide/Makefile
--- linux-2.6.1/drivers/ide/Makefile~modular-ide-fix 2004-01-18 20:45:38.990745408 +0100
+++ linux-2.6.1-root/drivers/ide/Makefile 2004-01-18 20:50:48.661668272 +0100
@@ -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/legacy/Makefile~modular-ide-fix drivers/ide/legacy/Makefile
--- linux-2.6.1/drivers/ide/legacy/Makefile~modular-ide-fix 2004-01-18 20:45:38.993744952 +0100
+++ linux-2.6.1-root/drivers/ide/legacy/Makefile 2004-01-18 20:45:39.028739632 +0100
@@ -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/pci/Makefile~modular-ide-fix drivers/ide/pci/Makefile
--- linux-2.6.1/drivers/ide/pci/Makefile~modular-ide-fix 2004-01-18 20:45:38.997744344 +0100
+++ linux-2.6.1-root/drivers/ide/pci/Makefile 2004-01-18 20:45:39.029739480 +0100
@@ -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~modular-ide-fix /dev/null
--- linux-2.6.1/drivers/ide/ppc/Makefile
+++ /dev/null 2004-01-17 00:25:55.000000000 +0100
@@ -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 drivers/ide/Kconfig~modular-ide-fix drivers/ide/Kconfig
--- linux-2.6.1/drivers/ide/Kconfig~modular-ide-fix 2004-01-18 20:45:39.004743280 +0100
+++ linux-2.6.1-root/drivers/ide/Kconfig 2004-01-18 20:45:39.031739176 +0100
@@ -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/ide.c~modular-ide-fix drivers/ide/ide.c
--- linux-2.6.1/drivers/ide/ide.c~modular-ide-fix 2004-01-18 20:45:39.007742824 +0100
+++ linux-2.6.1-root/drivers/ide/ide.c 2004-01-18 21:01:11.762942480 +0100
@@ -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
@@ -2282,28 +2264,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.
@@ -2564,7 +2524,6 @@ EXPORT_SYMBOL(ide_fops);
*/
EXPORT_SYMBOL(ide_lock);
-EXPORT_SYMBOL(ide_probe);
struct bus_type ide_bus_type = {
.name = "ide",
@@ -2607,9 +2566,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 2004-01-17 00:25:55.000000000 +0100
+++ linux-2.6.1-root/drivers/ide/ide-generic.c 2004-01-18 21:20:33.301361800 +0100
@@ -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~modular-ide-fix drivers/ide/ide-probe.c
--- linux-2.6.1/drivers/ide/ide-probe.c~modular-ide-fix 2004-01-18 20:45:39.012742064 +0100
+++ linux-2.6.1-root/drivers/ide/ide-probe.c 2004-01-18 21:16:19.570934688 +0100
@@ -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 include/linux/ide.h~modular-ide-fix include/linux/ide.h
--- linux-2.6.1/include/linux/ide.h~modular-ide-fix 2004-01-18 20:45:39.019741000 +0100
+++ linux-2.6.1-root/include/linux/ide.h 2004-01-18 20:45:39.044737200 +0100
@@ -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;
_