From: Bartlomiej Zolnierkiewicz From: Davin McCall Set hwif->chipset to ide_forced if it was forced by kernel parameters. Set hwif->chipset to ide_generic for hwifs controlled by generic IDE code, so they wont be taken by setup_pci.c:ide_match_hwif(). Patch also fixes /proc/ide/ideX/model to report "generic" instead of "(none)" for default hwifs. --- drivers/ide/ide-probe.c | 2 ++ drivers/ide/ide-proc.c | 4 +++- drivers/ide/ide.c | 2 +- drivers/ide/pci/cmd640.c | 2 +- drivers/ide/setup-pci.c | 2 +- include/linux/ide.h | 2 +- 6 files changed, 9 insertions(+), 5 deletions(-) diff -puN drivers/ide/ide.c~ide-pci-modules-fix drivers/ide/ide.c --- 25/drivers/ide/ide.c~ide-pci-modules-fix 2004-01-19 13:12:58.000000000 -0800 +++ 25-akpm/drivers/ide/ide.c 2004-01-19 13:12:58.000000000 -0800 @@ -2179,7 +2179,7 @@ int __init ide_setup (char *s) memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports)); hwif->irq = vals[2]; hwif->noprobe = 0; - hwif->chipset = ide_generic; + hwif->chipset = ide_forced; goto done; case 0: goto bad_option; diff -puN drivers/ide/ide-probe.c~ide-pci-modules-fix drivers/ide/ide-probe.c --- 25/drivers/ide/ide-probe.c~ide-pci-modules-fix 2004-01-19 13:12:58.000000000 -0800 +++ 25-akpm/drivers/ide/ide-probe.c 2004-01-19 13:12:58.000000000 -0800 @@ -1343,6 +1343,8 @@ int ideprobe_init (void) int unit; if (!hwif->present) continue; + if (hwif->chipset == ide_unknown || hwif->chipset == ide_forced) + hwif->chipset = ide_generic; for (unit = 0; unit < MAX_DRIVES; ++unit) if (hwif->drives[unit].present) ata_attach(&hwif->drives[unit]); diff -puN drivers/ide/ide-proc.c~ide-pci-modules-fix drivers/ide/ide-proc.c --- 25/drivers/ide/ide-proc.c~ide-pci-modules-fix 2004-01-19 13:12:58.000000000 -0800 +++ 25-akpm/drivers/ide/ide-proc.c 2004-01-19 13:12:58.000000000 -0800 @@ -348,8 +348,10 @@ static int proc_ide_read_imodel int len; const char *name; + /* + * Neither ide_unknown nor ide_forced should be set at this point. + */ switch (hwif->chipset) { - case ide_unknown: name = "(none)"; break; case ide_generic: name = "generic"; break; case ide_pci: name = "pci"; break; case ide_cmd640: name = "cmd640"; break; diff -puN drivers/ide/pci/cmd640.c~ide-pci-modules-fix drivers/ide/pci/cmd640.c --- 25/drivers/ide/pci/cmd640.c~ide-pci-modules-fix 2004-01-19 13:12:58.000000000 -0800 +++ 25-akpm/drivers/ide/pci/cmd640.c 2004-01-19 13:12:58.000000000 -0800 @@ -419,7 +419,7 @@ static void __init setup_device_ptrs (vo cmd_hwif1 = &ide_hwifs[1]; /* default, if not found below */ for (i = 0; i < MAX_HWIFS; i++) { ide_hwif_t *hwif = &ide_hwifs[i]; - if (hwif->chipset == ide_unknown || hwif->chipset == ide_generic) { + if (hwif->chipset == ide_unknown || hwif->chipset == ide_forced) { if (hwif->io_ports[IDE_DATA_OFFSET] == 0x1f0) cmd_hwif0 = hwif; else if (hwif->io_ports[IDE_DATA_OFFSET] == 0x170) diff -puN drivers/ide/setup-pci.c~ide-pci-modules-fix drivers/ide/setup-pci.c --- 25/drivers/ide/setup-pci.c~ide-pci-modules-fix 2004-01-19 13:12:58.000000000 -0800 +++ 25-akpm/drivers/ide/setup-pci.c 2004-01-19 13:12:58.000000000 -0800 @@ -59,7 +59,7 @@ static ide_hwif_t *ide_match_hwif(unsign for (h = 0; h < MAX_HWIFS; ++h) { hwif = &ide_hwifs[h]; if (hwif->io_ports[IDE_DATA_OFFSET] == io_base) { - if (hwif->chipset == ide_generic) + if (hwif->chipset == ide_forced) return hwif; /* a perfect match */ } } diff -puN include/linux/ide.h~ide-pci-modules-fix include/linux/ide.h --- 25/include/linux/ide.h~ide-pci-modules-fix 2004-01-19 13:12:58.000000000 -0800 +++ 25-akpm/include/linux/ide.h 2004-01-19 13:12:58.000000000 -0800 @@ -279,7 +279,7 @@ typedef enum { ide_unknown, ide_generic, ide_pdc4030, ide_rz1000, ide_trm290, ide_cmd646, ide_cy82c693, ide_4drives, ide_pmac, ide_etrax100, ide_acorn, - ide_pc9800 + ide_pc9800, ide_forced } hwif_chipset_t; /* _