We currently assume that boot parameters which are handled by early_param() will not overlap boot parameters handled by __setup: if they do, behaviour is dependent on link order, usually meaning __setup will not get called. ACPI wants to use early_param("pci"), and pci uses __setup("pci="), so we modify the core to let them coexist: "pci=noacpi" will now get passed to both. Signed-off-by: Rusty Russell <rusty at rustcorp.com.au> diff -urpN --exclude TAGS -X /home/rusty/devel/kernel/kernel-patches/current-dontdiff --minimal linux-2.6.18-rc2-mm1/init/main.c working-2.6.18-rc2-mm1-i386-parse_early_param/init/main.c --- linux-2.6.18-rc2-mm1/init/main.c 2006-08-01 14:12:11.000000000 +1000 +++ working-2.6.18-rc2-mm1-i386-parse_early_param/init/main.c 2006-08-02 16:48:39.000000000 +1000 @@ -182,16 +182,19 @@ extern struct obs_kernel_param __setup_s static int __init obsolete_checksetup(char *line) { struct obs_kernel_param *p; + int had_early_param = 0; p = __setup_start; do { int n = strlen(p->str); if (!strncmp(line, p->str, n)) { if (p->early) { - /* Already done in parse_early_param? (Needs - * exact match on param part) */ + /* Already done in parse_early_param? + * (Needs exact match on param part). + * Keep iterating, as we can have early + * params and __setups of same names 8( */ if (line[n] == '\0' || line[n] == '=') - return 1; + had_early_param = 1; } else if (!p->setup_func) { printk(KERN_WARNING "Parameter %s is obsolete," " ignored\n", p->str); @@ -201,7 +204,8 @@ static int __init obsolete_checksetup(ch } p++; } while (p < __setup_end); - return 0; + + return had_early_param; } /* -- Help! Save Australia from the worst of the DMCA: http://linux.org.au/law