From: Benjamin Herrenschmidt The current "generic" implementation of IRQ probing isn't well suited for ppc in it's current form, and causes issues with yenta_socket (and possibly others) on pmac laptops. We didn't have a probe implementation in the past, we probably don't need one anyway, so for now, the fix is to make this optional and enable it on x86 and x86_64 but not ppc and ppc64 (the 4 archs to use the generic IRQ code). Signed-off-by: Benjamin Herrenschmidt Signed-off-by: Andrew Morton --- 25-akpm/arch/i386/Kconfig | 4 ++++ 25-akpm/arch/x86_64/Kconfig | 4 ++++ 25-akpm/include/linux/interrupt.h | 16 ++++++++++++++++ 25-akpm/kernel/irq/Makefile | 3 ++- 4 files changed, 26 insertions(+), 1 deletion(-) diff -puN arch/i386/Kconfig~ppc-disable-irq-probe-on-ppc arch/i386/Kconfig --- 25/arch/i386/Kconfig~ppc-disable-irq-probe-on-ppc 2004-10-21 20:52:25.478593808 -0700 +++ 25-akpm/arch/i386/Kconfig 2004-10-21 20:52:25.488592288 -0700 @@ -1207,6 +1207,10 @@ config GENERIC_HARDIRQS bool default y +config GENERIC_IRQ_PROBE + bool + default y + config X86_SMP bool depends on SMP && !X86_VOYAGER diff -puN arch/x86_64/Kconfig~ppc-disable-irq-probe-on-ppc arch/x86_64/Kconfig --- 25/arch/x86_64/Kconfig~ppc-disable-irq-probe-on-ppc 2004-10-21 20:52:25.479593656 -0700 +++ 25-akpm/arch/x86_64/Kconfig 2004-10-21 20:52:25.486592592 -0700 @@ -346,6 +346,10 @@ config GENERIC_HARDIRQS bool default y +config GENERIC_IRQ_PROBE + bool + default y + menu "Power management options" source kernel/power/Kconfig diff -puN include/linux/interrupt.h~ppc-disable-irq-probe-on-ppc include/linux/interrupt.h --- 25/include/linux/interrupt.h~ppc-disable-irq-probe-on-ppc 2004-10-21 20:52:25.481593352 -0700 +++ 25-akpm/include/linux/interrupt.h 2004-10-21 20:52:25.486592592 -0700 @@ -252,8 +252,24 @@ extern void tasklet_init(struct tasklet_ * or zero if none occurred, or a negative irq number * if more than one irq occurred. */ + +#if defined(CONFIG_GENERIC_HARDIRQS) && !defined(CONFIG_GENERIC_IRQ_PROBE) +static inline unsigned long probe_irq_on(void) +{ + return 0; +} +static inline int probe_irq_off(unsigned long val) +{ + return 0; +} +static inline unsigned int probe_irq_mask(unsigned long val) +{ + return 0; +} +#else extern unsigned long probe_irq_on(void); /* returns 0 on failure */ extern int probe_irq_off(unsigned long); /* returns 0 or negative on failure */ extern unsigned int probe_irq_mask(unsigned long); /* returns mask of ISA interrupts */ +#endif #endif diff -puN kernel/irq/Makefile~ppc-disable-irq-probe-on-ppc kernel/irq/Makefile --- 25/kernel/irq/Makefile~ppc-disable-irq-probe-on-ppc 2004-10-21 20:52:25.482593200 -0700 +++ 25-akpm/kernel/irq/Makefile 2004-10-21 20:52:25.485592744 -0700 @@ -1,4 +1,5 @@ -obj-y := autoprobe.o handle.o manage.o spurious.o +obj-y := handle.o manage.o spurious.o +obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o obj-$(CONFIG_PROC_FS) += proc.o _